<!--{{{-->
<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>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="72 648 70 70" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 77.59005 669.34003 C 71.532745 681.90424 73.714462 697.4441 84.135193 707.86475 
		C 97.315445 721.0451 118.684715 721.0451 131.8649 707.86475 
		C 145.04515 694.68457 145.04515 673.31537 131.8649 660.13513 
		C 121.4441 649.7141 105.90419 647.53253 93.339905 653.5899 L 102.047455 662.2976 
		C 109.58637 660.2373 117.987976 662.16803 123.90997 668.08997 
		C 132.69673 676.8767 132.69673 691.12317 123.90997 699.90985 
		C 115.12313 708.6966 100.87699 708.6966 92.09012 699.90985 
		C 86.168266 693.98804 84.23744 685.58643 86.297653 678.04755 Z M 72 648 L 72 668.25 L 78.75 661.49957 
		L 99.00019 681.7502 L 105.750175 675.00006 L 85.50013 654.75012 L 92.249985 648 Z" fill="black"
		class="glyph"/>
	</g>
</g>
</svg>
/***
TiddlySpace extensions for [[chrjs]]
***/
//{{{
(function($) {

tiddlyweb.routes.spaces = "{host}/spaces";
tiddlyweb.routes.space = "{host}/spaces/{name}";
tiddlyweb.routes.members = "{host}/spaces/{name}/members";
tiddlyweb.routes.member = "{host}/spaces/{name}/members/{username}";

tiddlyweb.Space = function(name, host) {
	tiddlyweb.Resource.apply(this, ["space", host]);
	this.name = name;
};
tiddlyweb.Space.prototype = new tiddlyweb.Resource();
$.extend(tiddlyweb.Space.prototype, {
	create: function(callback, errback) { // API wrapper
		this.put.apply(this, arguments);
	},
	members: function() {
		return new MemberCollection(this);
	}
});

var Member = function(username, space) {
	tiddlyweb.Resource.apply(this, ["member", space.host]);
	this.name = space.name;
	this.username = username;
};
Member.prototype = new tiddlyweb.Resource();

var MemberCollection = function(space) {
	tiddlyweb.Collection.apply(this, ["members", space.host, {
		name: space.name
	}]);
};
MemberCollection.prototype = new tiddlyweb.Collection();
$.extend(MemberCollection.prototype, {
	add: function(username, callback, errback) {
		var member = new Member(username, this);
		member.put(callback, errback);
	},
	remove: function(username, callback, errback) {
		var member = new Member(username, this);
		member["delete"](callback, errback);
	}
});

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="491 13 34 35" width="34pt" height="35pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-06-05 14:34Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.2 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 493.45312 28.112467 C 494.7151 20.143282 502.20773 14.699663 510.177 15.961652 C 518.1471 17.223583 523.5907 24.716248 522.32867 32.686314 C 521.06586 40.655617 513.57324 46.099178 505.60397 44.83719 C 497.63474 43.57523 492.19028 36.081776 493.45312 28.112467 Z" fill="white"/><path d="M 493.45312 28.112467 C 494.7151 20.143282 502.20773 14.699663 510.177 15.961652 C 518.1471 17.223583 523.5907 24.716248 522.32867 32.686314 C 521.06586 40.655617 513.57324 46.099178 505.60397 44.83719 C 497.63474 43.57523 492.19028 36.081776 493.45312 28.112467 Z" stroke="#bebebe" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/><path d="M 507.84293 35.927711 C 504.56314 35.927711 501.90082 33.265377 501.90082 29.98558 C 501.90082 26.704926 504.56314 24.043444 507.84293 24.043444 C 511.1227 24.043444 513.78503 26.704926 513.78503 29.98558 C 513.78503 33.265377 511.1227 35.927711 507.84293 35.927711 Z" fill="#f4c4e2"/><path d="M 507.84293 35.927711 C 504.56314 35.927711 501.90082 33.265377 501.90082 29.98558 C 501.90082 26.704926 504.56314 24.043444 507.84293 24.043444 C 511.1227 24.043444 513.78503 26.704926 513.78503 29.98558 C 513.78503 33.265377 511.1227 35.927711 507.84293 35.927711 Z" stroke="#ce81b0" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/></g></g></svg>
/***
|TiddlyFileImporter|
|Version|0.2|
|Author|Ben Gillies|
|Type|plugin|
|Description|Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.|
!Usage
Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.
!Requires
tiddlyweb
tiddlywebplugins.reflector
!Code
***/
//{{{
(function($){
if(!version.extensions.TiddlyFileImporter)
{ //# ensure that the plugin is only installed once
	version.extensions.TiddlyFileImporter = { installed: true }
};

config.macros.fileImport = {
	reflectorURI: '/reflector',
	incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
	uploadLabel: 'Upload',
	uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
	step1Text: 'Pick a TiddlyWiki file to Upload',
	step1Title: 'Step 1: Upload a TiddlyWiki file',
	step3Html: '<input type="hidden" name="markList" />'
		+ '<input type="hidden" checked="true" name="chkSync" />'
		+ '<input type="hidden" name="chkSave" />'
		+ '<input type="hidden" name="txtSaveTiddler" />',

	handler: function(place, macroName, params, wikifier, paramString) {
		var wizard = new Wizard();
		wizard.createWizard(place, 'Import a TiddlyWiki');
		this.restart(wizard);
	},

	restart: function(wizard) {
		var me = config.macros.fileImport;
		wizard.addStep(me.step1Title, '<input type="hidden" '
			+ 'name="markList" />');
		var markList = wizard.getElement('markList');
		var uploadWrapper = document.createElement('div');
		markList.parentNode.insertBefore(uploadWrapper, markList);
		uploadWrapper.setAttribute('refresh', 'macro');
		uploadWrapper.getAttribute('macroName', 'fileImport');
		$(uploadWrapper).append('<p>' + me.step1Text + '</p>');
		var iframeName = 'reflectorImporter' + Math.random().toString();
		me.createForm(uploadWrapper, wizard, iframeName);
		wizard.setValue('serverType', 'tiddlyweb');
		wizard.setValue('adaptor', new config.adaptors.file());
		wizard.setValue('host', config.defaultCustomFields['server.host']);
		wizard.setValue('context', {});
		wizard.setButtons([{
			caption: me.uploadLabel,
			tooltip: me.uploadLabelPrompt,
			onClick: function() {
				var iframe = $('<iframe name="' + iframeName + '" '
					+ 'style="display: none" />').appendTo(uploadWrapper);
				// set an onload ready to hijack the form
				me.setOnLoad(uploadWrapper, wizard, iframe[0]);
				wizard.formElem.submit();
			}
		}]);
	},

	createForm: function(place, wizard, iframeName) {
		var form = wizard.formElem;
		var me = config.macros.fileImport;
		form.action = me.reflectorURI;
		form.enctype = 'multipart/form-data';
		form.method = 'POST';
		form.target = iframeName;
		$(place).append('<input type="file" name="file" />');
	},

	setOnLoad: function(place, wizard, iframe) {
		var me = config.macros.fileImport
		var loadHandler = function() {
			me.importTiddlers.apply(this, [place, wizard, iframe]);
		};
		iframe.onload = loadHandler;
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStaeChanges) == 3) {
				loadHandler();
			}
		}
	},

	importTiddlers: function(place, wizard, iframe) {
		var tmpStore = new TiddlyWiki();
		try {
			var POSTedWiki= iframe.contentWindow
				.document.documentElement.innerHTML;
		} catch(e) {
			displayMessage(config.macros.fileImport.incorrectTypeError);
			config.macros.fileImport.restart(wizard);
			return;
		}
		// now we are done, so remove the iframe
		$(iframe).remove();

		tmpStore.importTiddlyWiki(POSTedWiki);
		var newTiddlers = tmpStore.getTiddlers();
		var workspace = config.defaultCustomFields['server.workspace']
			.split(/^[^\/]*\//)[1];
		var context = {
			status: true,
			statusText: 'OK',
			httpStatus: 200,
			adaptor: wizard.getValue('adaptor'),
			tiddlers: newTiddlers
		};
		context.adaptor.store = tmpStore;
		wizard.setValue('context', context);
		wizard.setValue('workspace', workspace);
		wizard.setValue('inFileImport', true);
		config.macros.importTiddlers.onGetTiddlerList(context, wizard);
	}
};

_onGetTiddler = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
	if (wizard.getValue('inFileImport')) {
		var me = config.macros.importTiddlers;
		if(!context.status)
			displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
		var tiddler = context.tiddler;
		var fields = tiddler.fields;
		merge(fields, config.defaultCustomFields);
		delete fields['server.permissions'];
		delete fields['server.bag'];
		delete fields['server.page.revision'];
		delete fields['server.recipe'];
		fields.changecount = 1;
		store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
			tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
			false, tiddler.created);
		var remainingImports = wizard.getValue("remainingImports")-1;
		wizard.setValue("remainingImports",remainingImports);
		if(remainingImports == 0) {
			if(context.isSynchronous) {
				store.notifyAll();
				refreshDisplay();
			}
			wizard.setButtons([
					{caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
				],me.statusDoneImport);
			autoSaveChanges();
		}
	} else {
		_onGetTiddler.apply(this, arguments);
	}
};

_onCancel = config.macros.importTiddlers.onCancel;
config.macros.importTiddlers.onCancel = function(e)
{
	var wizard = new Wizard(this);
	if (!wizard.getValue('inFileImport')) {
		return _onCancel.apply(this, arguments);
	}
	var place = wizard.clear();
	config.macros.fileImport.restart(wizard);
	return false;
};

_step3Html = config.macros.importTiddlers.step3Html;
_onGetTiddlerList = config.macros.importTiddlers.onGetTiddlerList;
config.macros.importTiddlers.onGetTiddlerList = function(context, wizard) {
	var fileImport = config.macros.fileImport;
	var importTiddlers = config.macros.importTiddlers;
	if (wizard.getValue('inFileImport')) {
		importTiddlers.step3Html = fileImport.step3Html;
	} else {
		importTiddlers.step3Html = _step3Html;
	}
	_onGetTiddlerList.apply(this, arguments);
}
})(jQuery);
//}}}
/*{{{*/
.headerForeground {
	position: relative;
	padding: 2em 0em 1em 0em;
	float: right;
	top: 0;
	margin-right: 5.3em;
	background-color: [[ColorPalette::PrimaryMid]];
	text-align: right;
}

.header {
	width: 100%; /* for ie */
}

.clearFloat {
	clear: both;
}

#contentWrapper {
	position: relative;
	padding-top: 1px;
	top: -1px;
}

.header {
	position: relative;
	background-color: [[ColorPalette::PrimaryMid]];
}

.siteTitle {
	clear: both;
	display: block;
}

#sidebarSearch {
	padding: 0.8em 1em 1em;
	width: 10.5em;
	margin: 0.6em 0.6em;
	float: right;
	position: relative;
}

#sidebarSearch .txtOptionInput {
	width: 100%;
	margin-top: 5px;
}

#sidebarSearch .searchButton {
	padding: 0.2em;
	color: [[ColorPalette::Background]];
}
/*}}}*/
<<familytreelist sex:F>>
[img[homer.png]]
Info about dad
Male:M
Female:F
/***
|''Name''|TiddlySpaceUserControls|
|''Version''|0.5.0|
|''Description''|registration and login UIs|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceUserControls.js|
|''Requires''|TiddlySpaceConfig|
!HTMLForm
<form action="#">
	<fieldset>
		<legend />
		<dl>
			<dt class="_basic">Username:</dt>
			<dd class="_basic"><input type="text" name="username" autocapitalize="off" autocorrect="off" /></dd>
			<dt class="_basic">Password:</dt>
			<dd class="_basic">
				<input type="password" name="password" />
				<input type="password" name="password_confirm" class="_register" />
			</dd>
			<dt class="_openid">OpenID:</dt>
			<dd class="_openid"><input type="text" name="openid" autocapitalize="off" autocorrect="off" /></dd>
			<dt class="_login">Method:</dt>
			<dd class="_login">
				<select>
					<option value="basic">username &amp; password</option>
					<option value="openid">OpenID</option>
				</select>
			</dd>
		</dl>
		<input type="hidden" name="tiddlyweb_redirect" class="_openid" />
		<p class="annotation" />
		<input type="submit" />
	</fieldset>
</form>
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var tsl = config.macros.TiddlySpaceLogin = {
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
	locale: {
		label: "Login",
		success: "logged in as %0",
		loginError: "error logging in %0: %1",
		forbiddenError: "login failed for <em>%0</em>: username and password do not match"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var type = params[0];
		this.name = macroName;
		var container = $("<div />", { className: this.name }).appendTo(place);
		this.refresh(container, type);
	},
	refresh: function(container, type) {
		var msg = this.locale;
		type = type || "basic";
		var selector = type == "openid" ? "._basic" : "._openid";
		var handler = function(ev) {
			var form = $(this).closest("form");
			return tsl[type + "Login"](form);
		};
		container.empty();
		tweb.getUserInfo(function(user) {
			if(user.anon) {
				$(tsl.formTemplate).submit(handler).
					find("legend").text(msg.label).end().
					find("select").change(tsl.onSelect).end().
					find("option[value=" + type + "]").
						attr("selected", "selected").end().
					find("._register, " + selector).remove().end().
					find(".annotation").hide().end().
					find("[type=submit]").val(msg.label).end().
					appendTo(container);
			}
		});
	},
	onSelect: function(ev) {
		var el = $(this);
		var type = el.val();
		var container = el.closest("." + tsl.name);
		tsl.refresh(container, type);
	},
	basicLogin: function(form) {
		var username = form.find("[name=username]").val();
		var password = form.find("[name=password]").val();
		this.login(username, password, tsl.redirect, function(xhr, error, exc) { // TODO: DRY (cf. displayMembers)
			var ctx = {
				msg: {
					401: tsl.locale.forbiddenError.format([username])
				},
				form: form,
				selector: "[name=username], [name=password]"
			};
			tsl.displayError(xhr, error, exc, ctx);
		});
		return false;
	},
	displayError: function(xhr, error, exc, ctx) {
		error = ctx.msg[xhr.status] || // XXX: lacks parameters
			"%0: %1".format([xhr.statusText, xhr.responseText]).htmlEncode();
		var el = $(ctx.selector, ctx.form).addClass("error").focus(function(ev) {
			el.removeClass("error").unbind(ev.originalEvent.type).
				closest("form").find(".annotation").slideUp();
		});
		$(".annotation", ctx.form).html(error).slideDown();
	},
	login: function(username, password, callback, errback) {
		var challenger = "cookie_form";
		var uri = "%0/challenge/%1".format([tweb.host, challenger]);
		$.ajax({
			url: uri,
			type: "POST",
			data: {
				user: username,
				password: password,
				tiddlyweb_redirect: tweb.serverPrefix + "/status" // workaround to marginalize automatic subsequent GET
			},
			success: callback,
			error: function(xhr, error, exc) {
				if(errback) {
					errback.apply(this, arguments);
				} else {
					displayMessage(tsl.locale.loginError.format([username, error]));
				}
			}
		});
	},
	openidLogin: function(form) {
		var openid = form.find("[name=openid]").val();
		var challenger = "tiddlywebplugins.tiddlyspace.openid";
		var uri = "%0/challenge/%1".format([tweb.host, challenger]);
		var redirect = tweb.serverPrefix || "/"; // must not be empty string
		form.attr("action", uri).attr("method", "POST").
			find("[name=tiddlyweb_redirect]").val(redirect);
		return true;
	},
	redirect: function() {
		window.location = tweb.host;
	}
};

config.macros.TiddlySpaceLogout = {
	locale: {
		label: "Log out"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var form = $('<form method="POST" />').addClass(macroName).
			attr("action", tweb.host + "/logout");
		$("<button />", { text: this.locale.label }).
			click(function(ev) { form.submit(); }).
			appendTo(form);
		form.appendTo(place);
	}
};

var tsr = config.macros.TiddlySpaceRegister = {
	locale: {
		label: "Sign Up",
		userSuccess: "created user %0",
		userError: "user <em>%0</em> already exists",
		spaceSuccess: "created space %0",
		spaceError: "space <em>%0</em> already exists",
		charError: "error: invalid username - must only contain lowercase " +
			"letters, digits or hyphens",
		passwordError: "error: passwords do not match"
	},
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		$(this.formTemplate).submit(this.onSubmit).
			find("._login, ._openid").remove().end().
			find("legend").text(this.locale.label).end().
			find(".annotation").hide().end().
			find("[type=submit]").val(this.locale.label).end().
			appendTo(place);
	},
	onSubmit: function(ev) {
		var form = $(this).closest("form");
		var username = form.find("[name=username]").val();
		var password = form.find("[name=password]").val();
		var passwordConfirm = form.find("[name=password_confirm]").val();
		var validName = config.extensions.tiddlyspace.isValidSpaceName(username);
		if(validName && password && password == passwordConfirm) { // TODO: check password length?
			tsr.register(username, password, form);
		} else {
			var xhr = { status: 409 }; // XXX: hacky
			var msg = validName ? "passwordError" : "charError";
			var ctx = {
				msg: { 409: tsr.locale[msg] },
				form: form,
				selector: validName ? "[type=password]" : "[name=username]"
			};
			tsl.displayError(xhr, null, null, ctx);
		}
		return false;
	},
	register: function(username, password, form) {
		var msg = tsr.locale;
		var ctx = {
			form: form,
			selector: "[name=username]"
		};
		var userCallback = function(resource, status, xhr) {
			displayMessage(msg.userSuccess.format([username])); // XXX: redundant?
			tsl.login(username, password, function(data, status, xhr) {
				var space = new tiddlyweb.Space(username, tweb.host);
				space.create(spaceCallback, spaceErrback);
			});
		};
		var userErrback = function(xhr, error, exc) {
			ctx.msg = { 409: msg.userError.format([username]) };
			tsl.displayError(xhr, error, exc, ctx);
		};
		var spaceCallback = function(resource, status, xhr) {
			displayMessage(msg.spaceSuccess.format([username]));
			tsl.redirect();
		};
		var spaceErrback = function(xhr, error, exc) {
			ctx.msg = { 409: msg.spaceError.format([username]) }; // XXX: 409 unlikely to occur at this point
			tsl.displayError(xhr, error, exc, ctx);
		};
		var user = new tiddlyweb.User(username, password, tweb.host);
		user.create(userCallback, userErrback);
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.5.4|
|''Description''|TiddlySpace configuration|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceConfig.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlyWebConfig ServerSideSavingPlugin|
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var recipe = config.defaultCustomFields["server.workspace"].split("recipes/")[1];

// hijack search macro to add custom attributes for mobile devices
var _search = config.macros.search.handler;
config.macros.search.handler = function(place, macroName, params) {
	_search.apply(this, arguments);
	$(".searchField:input", place).
		attr({ autocapitalize: "off", autocorrect: "off" });
};

// arg is either a container name or a tiddler object
// if fuzzy is truthy, space may be inferred from workspace (for new tiddlers)
// returns space object or false
var determineSpace = function(arg, fuzzy) {
	if(typeof arg == "string") { // container name
		var space = split(arg, "_", "r");
		return ["public", "private"].contains(space.type) ? space : false;
	} else if(arg) { // tiddler
		var container = determineContainer(arg, fuzzy);
		return container ? determineSpace(container.name, fuzzy) : false;
	} else {
		return false;
	}
};

// if fuzzy is truthy, container may be inferred from workspace for new tiddlers
// returns container object or false
var determineContainer = function(tiddler, fuzzy) { // TODO: expose?
	var bag = tiddler.fields["server.bag"];
	var recipe = tiddler.fields["server.recipe"]; // XXX: unused/irrelevant/redundant!?
	if(bag) {
		return { type: "bag", name: bag };
	} else if(recipe) {
		return { type: "recipe", name: recipe };
	} else if(fuzzy) { // new tiddler
		var workspace = tiddler.fields["server.workspace"];
		if(workspace) {
			var container = split(workspace, "/", "l");
			return ["bags", "recipes"].contains(container.type) ? container : false;
		} else {
			return false;
		}
	} else {
		return false;
	}
};

// hijack removeTiddlerCallback to restore tiddler from recipe cascade -- TODO: move into TiddlyWebWiki?
var sssp = config.extensions.ServerSideSavingPlugin;
var _removeTiddlerCallback = sssp.removeTiddlerCallback;
sssp.removeTiddlerCallback = function(context, userParams) {
	var title = context.tiddler.title;
	var recipe = context.tiddler.fields["server.recipe"];
	_removeTiddlerCallback.apply(this, arguments);
	if(recipe) {
		context.workspace = "recipes/" + recipe;
		var callback = function(context, userParams) {
			if(context.status) {
				store.saveTiddler(context.tiddler);
			} else {
				store.notify(title, true);
			}
		};
		context.adaptor.getTiddler(title, context, null, callback);
	}
};

// hijack getUserInfo to treat unknown users as anonymous
var _getUserInfo = tweb.getUserInfo;
tweb.getUserInfo = function(callback) {
	_getUserInfo.call(this, function(user) {
		if(!user.anon) { // double-check whether the user is real
			$.ajax({
				url: "%0/users/%1".format([tweb.host, user.name]),
				type: "GET",
				success: function(data, status, xhr) {
					user.anon = false;
				},
				error: function(xhr, error, exc) {
					user.anon = true;
				},
				complete: function(xhr, status) {
					callback(user);
				}
			});
		} else {
			callback(user);
		}
	});
};

// splits a string once using delimiter
// mode "l" splits at the first, "r" at the last occurrence
// returns an object with members type and name
var split = function(str, sep, mode) {
	mode = mode == "r" ? "pop" : "shift"; // TODO: use +/-1 instead of "l"/"r"?
	var arr = str.split(sep);
	var type = arr.length > 1 ? arr[mode]() : null;
	return { type: type, name: arr.join(sep) };
};

// hijack saveTiddler to accept Tiddler instance
var _saveTiddler = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title, newTitle, newBody, modifier,
		modified, tags, fields, clearChangeCount, created, creator) {
	if(title instanceof Tiddler) { // overloading first argument
		var t = $.extend(new Tiddler(title.title), title);
		t = _saveTiddler.apply(this, [t.title, t.title, t.text, t.modifier,
			t.modified, t.tags, t.fields, false, t.created, t.creator]);
		return t;
	} else {
		return _saveTiddler.apply(this, arguments);
	}
};

var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
	return "system-%0_public".format(item);
});

var plugin = config.extensions.tiddlyspace = {
	currentSpace: determineSpace(recipe),
	coreBags: coreBags.concat(systemSpaces),

	determineSpace: determineSpace,
	isValidSpaceName: function(name) {
		return name.match(/^[a-z][0-9a-z\-]*[0-9a-z]$/) ? true : false;
	},
	// returns the URL for a space's avatar (SiteIcon) based on a server_host
	// object and an optional space name
	// optional nocors argument prevents cross-domain URLs from being generated
	getAvatar: function(host, space, nocors) {
		if(space && typeof space != "string") { // backwards compatibility -- XXX: deprecated
			space = space.name;
		}
		var subdomain = nocors ? plugin.currentSpace.name : space;
		host = host ? this.getHost(host, subdomain) : "";
		var bag = space ? "%0_public".format([space]) : "tiddlyspace";
		return "%0/bags/%1/tiddlers/SiteIcon".format([host, bag]);
	},
	// returns the URL based on a server_host object (scheme, host, port) and an
	// optional subdomain
	getHost: function(host, subdomain) {
		subdomain = subdomain ? subdomain + "." : "";
		var url = "%0://%1%2".format([host.scheme, subdomain, host.host]);
		var port = host.port;
		if(port && !["80", "443"].contains(port)) {
			url += ":" + port;
		}
		return url;
	}
};

tweb.serverPrefix = tweb.host.split("/")[3] || ""; // XXX: assumes root handler
tweb.getStatus(function(status) {
	var url = plugin.getHost(status.server_host);
	tweb.status.server_host.url = url;
});

// set global read-only mode based on membership heuristics
var indicator = store.getTiddler("SiteTitle") || tiddler;
readOnly = !(recipe.split("_").pop() == "private" ||
	tweb.hasPermission("write", indicator));

// ensure backstage is always initialized
// required to circumvent TiddlyWiki's read-only based handling
config.macros.backstageInit = {
	init: function() {
		showBackstage = true;
	}
};

// register style sheet for backstage separately (important)
store.addNotification("StyleSheetBackstage", refreshStyles);

})(jQuery);
//}}}
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.3.8|
|''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 = config.adaptors.tiddlyweb = function() {};

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

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
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 ? "?" + 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, merge({ accept: adaptor.mimeType }, context.headers), 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); //# NB: 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 ? ";" + 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, merge({ accept: adaptor.mimeType }, context.headers), 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); //# NB: 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,
		merge({ accept: adaptor.mimeType }, context.headers), 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); //# NB: not an actual tiddler instance
		} catch(ex) {
			context.status = false;
			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,
			t.creator); // XXX: merge extended fields!?
		context.tiddler.fields["server.bag"] = t.bag;
		context.tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		if(t.recipe) {
			context.tiddler.fields["server.recipe"] = t.recipe;
		}
		context.tiddler.fields["server.workspace"] = "bags/" + t.bag;
		context.tiddler.fields["server.page.revision"] = t.revision;
		context.tiddler.fields["server.permissions"] = t.permissions.join(", ");
		if(t.type && t.type != "None") {
			context.tiddler.fields["server.content-type"] = t.type;
		}
	}
	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"]);
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		context.workspace = context.workspace || tiddler.fields["server.workspace"];
		var workspace = adaptor.resolveWorkspace(context.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 = {
		type: tiddler.fields["server.content-type"] || null,
		text: tiddler.text,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	$.each(payload.fields, function(key, value) {
		if(key.indexOf("server.") == 0) {
			delete payload.fields[key];
		}
	});
	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) {
		var bag = xhr.getResponseHeader("Location").
			split("/bags/").pop().split("/")[0];
		context.tiddler.fields["server.bag"] = bag;
		var etag = xhr.getResponseHeader("Etag");
		if(etag) {
			context.tiddler.fields["server.etag"] = etag;
			if(context.callback) {
				context.callback(context, context.userParams);
			}
		} else { // IE
			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 self = 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 self.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++) {
			delete revisions[i].revision;
			if(!revisions[i].fields.origin) { // NB: 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.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") { // NB: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userparams) {
			context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
		};
		return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		context.callback = null;
		return self.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/bags/%1/tiddlers/%2";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var bag = tiddler.fields["server.bag"];
	if(!bag) {
		return adaptor.noBagErrorMessage;
	}
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag({ type: "bag", name: bag }, 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;
	context.uri = uri;
	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 revision = tiddler.fields["server.page.revision"];
	var etag = revision == "false" ? null : tiddler.fields["server.etag"];
	if(!etag && workspace.type == "bag") {
		if(typeof revision == "undefined") {
			revision = "0";
		} else if(revision == "false") {
			return null;
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
		etag = '"' + etag + '"';
	}
	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);
//}}}
/***
|''Requires:''|AETPlugin|
***/
config.macros.aet.extensions.date ={
  createDatePicker: function(place,title,metaDataName,autosavechanges){
	        
    var tiddler = store.getTiddler(title);
    var params = [metaDataName];
  
    var div = document.createElement("div");
    div.className  = "datePicker";
    var input = document.createElement("input");
    input.className = "date-pick";
    input.setAttribute("name",metaDataName);
    jQuery(div).append(input);
    jQuery(div).append("<div class='clearboth'></div>");
    jQuery(place).append(div);
    jQuery(function()
    {
      var start =config.macros.AdvancedEditTemplate.getMetaData(title,metaDataName);
      if(!start)start="";
      else {
        var y="0000",m="00",d="00";
        if(start.length >= 4)y=start.substr(0,4);
        if(start.length >= 6)m = start.substr(4,2);
        if(start.length >= 8)d = start.substr(6,2)
        start = d+"/"+m+"/"+y;
      }
    	jQuery(input).datePicker({startDate: '01/01/1600'}).val(start).trigger('change');
    	jQuery(input).change(function(e){
    	    //console.log(this.value,"before");
  	   
    	    var dmy = this.value;
    	    var d="0",m="0",y="0";
    	    if(dmy.indexOf("/") > -1){
    	      dmy = dmy.split("/");
    	      if(dmy[0])d = dmy[0];
      	    if(dmy[1])m = dmy[1];
      	    if(dmy[2])y = dmy[2];
    	    }
    	    else{
    	      d = "00";
    	      m = "00";
    	      y = dmy;
    	    }
    	    if(d.length == 1) d= "0"+d;
    	    if(m.length == 1) m= "0"+m;
    	    //console.log(y,m,d,"togo");
    	    var val = y+m+d+"0000";
    	    //console.log("saving value " + val)
    	    config.macros.AdvancedEditTemplate.setMetaData(title,metaDataName,val,autosavechanges);
  	      
    	});
    	//jQuery("input").trigger('change');
    });
            
	        //config.macros.edit.handler(place,false,params,false,false,tiddler)
                      
	}
	
}
config.macros.aet.controlTypes.date = function(place,tiddler,fieldName,options){
  config.macros.aet.extensions.date.createDatePicker(place,tiddler.title,fieldName);
}


/*
 * Date prototype extensions. Doesn't depend on any
 * other code. Doens't overwrite existing methods.
 *
 * Adds dayNames, abbrDayNames, monthNames and abbrMonthNames static properties and isLeapYear,
 * isWeekend, isWeekDay, getDaysInMonth, getDayName, getMonthName, getDayOfYear, getWeekOfYear,
 * setDayOfYear, addYears, addMonths, addDays, addHours, addMinutes, addSeconds methods
 *
 * Copyright (c) 2006 Jörn Zaefferer and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 *
 * Additional methods and properties added by Kelvin Luck: firstDayOfWeek, dateFormat, zeroTime, asString, fromString -
 * I've added my name to these methods so you know who to blame if they are broken!
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 * An Array of day names starting with Sunday.
 * 
 * @example dayNames[0]
 * @result 'Sunday'
 *
 * @name dayNames
 * @type Array
 * @cat Plugins/Methods/Date
 */
Date.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

/**
 * An Array of abbreviated day names starting with Sun.
 * 
 * @example abbrDayNames[0]
 * @result 'Sun'
 *
 * @name abbrDayNames
 * @type Array
 * @cat Plugins/Methods/Date
 */
Date.abbrDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

/**
 * An Array of month names starting with Janurary.
 * 
 * @example monthNames[0]
 * @result 'January'
 *
 * @name monthNames
 * @type Array
 * @cat Plugins/Methods/Date
 */
Date.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

/**
 * An Array of abbreviated month names starting with Jan.
 * 
 * @example abbrMonthNames[0]
 * @result 'Jan'
 *
 * @name monthNames
 * @type Array
 * @cat Plugins/Methods/Date
 */
Date.abbrMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

/**
 * The first day of the week for this locale.
 *
 * @name firstDayOfWeek
 * @type Number
 * @cat Plugins/Methods/Date
 * @author Kelvin Luck
 */
Date.firstDayOfWeek = 1;

/**
 * The format that string dates should be represented as (e.g. 'dd/mm/yyyy' for UK, 'mm/dd/yyyy' for US, 'yyyy-mm-dd' for Unicode etc).
 *
 * @name format
 * @type String
 * @cat Plugins/Methods/Date
 * @author Kelvin Luck
 */
Date.format = 'dd/mm/yyyy';
//Date.format = 'mm/dd/yyyy';
//Date.format = 'yyyy-mm-dd';
//Date.format = 'dd mmm yy';

/**
 * The first two numbers in the century to be used when decoding a two digit year. Since a two digit year is ambiguous (and date.setYear
 * only works with numbers < 99 and so doesn't allow you to set years after 2000) we need to use this to disambiguate the two digit year codes.
 *
 * @name format
 * @type String
 * @cat Plugins/Methods/Date
 * @author Kelvin Luck
 */
Date.fullYearStart = '20';

(function() {

	/**
	 * Adds a given method under the given name 
	 * to the Date prototype if it doesn't
	 * currently exist.
	 *
	 * @private
	 */
	function add(name, method) {
		if( !Date.prototype[name] ) {
			Date.prototype[name] = method;
		}
	};
	
	/**
	 * Checks if the year is a leap year.
	 *
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.isLeapYear();
	 * @result true
	 *
	 * @name isLeapYear
	 * @type Boolean
	 * @cat Plugins/Methods/Date
	 */
	add("isLeapYear", function() {
		var y = this.getFullYear();
		return (y%4==0 && y%100!=0) || y%400==0;
	});
	
	/**
	 * Checks if the day is a weekend day (Sat or Sun).
	 *
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.isWeekend();
	 * @result false
	 *
	 * @name isWeekend
	 * @type Boolean
	 * @cat Plugins/Methods/Date
	 */
	add("isWeekend", function() {
		return this.getDay()==0 || this.getDay()==6;
	});
	
	/**
	 * Check if the day is a day of the week (Mon-Fri)
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.isWeekDay();
	 * @result false
	 * 
	 * @name isWeekDay
	 * @type Boolean
	 * @cat Plugins/Methods/Date
	 */
	add("isWeekDay", function() {
		return !this.isWeekend();
	});
	
	/**
	 * Gets the number of days in the month.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getDaysInMonth();
	 * @result 31
	 * 
	 * @name getDaysInMonth
	 * @type Number
	 * @cat Plugins/Methods/Date
	 */
	add("getDaysInMonth", function() {
		return [31,(this.isLeapYear() ? 29:28),31,30,31,30,31,31,30,31,30,31][this.getMonth()];
	});
	
	/**
	 * Gets the name of the day.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getDayName();
	 * @result 'Saturday'
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getDayName(true);
	 * @result 'Sat'
	 * 
	 * @param abbreviated Boolean When set to true the name will be abbreviated.
	 * @name getDayName
	 * @type String
	 * @cat Plugins/Methods/Date
	 */
	add("getDayName", function(abbreviated) {
		return abbreviated ? Date.abbrDayNames[this.getDay()] : Date.dayNames[this.getDay()];
	});

	/**
	 * Gets the name of the month.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getMonthName();
	 * @result 'Janurary'
	 *
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getMonthName(true);
	 * @result 'Jan'
	 * 
	 * @param abbreviated Boolean When set to true the name will be abbreviated.
	 * @name getDayName
	 * @type String
	 * @cat Plugins/Methods/Date
	 */
	add("getMonthName", function(abbreviated) {
		return abbreviated ? Date.abbrMonthNames[this.getMonth()] : Date.monthNames[this.getMonth()];
	});

	/**
	 * Get the number of the day of the year.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getDayOfYear();
	 * @result 11
	 * 
	 * @name getDayOfYear
	 * @type Number
	 * @cat Plugins/Methods/Date
	 */
	add("getDayOfYear", function() {
		var tmpdtm = new Date("1/1/" + this.getFullYear());
		return Math.floor((this.getTime() - tmpdtm.getTime()) / 86400000);
	});
	
	/**
	 * Get the number of the week of the year.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.getWeekOfYear();
	 * @result 2
	 * 
	 * @name getWeekOfYear
	 * @type Number
	 * @cat Plugins/Methods/Date
	 */
	add("getWeekOfYear", function() {
		return Math.ceil(this.getDayOfYear() / 7);
	});

	/**
	 * Set the day of the year.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.setDayOfYear(1);
	 * dtm.toString();
	 * @result 'Tue Jan 01 2008 00:00:00'
	 * 
	 * @name setDayOfYear
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("setDayOfYear", function(day) {
		this.setMonth(0);
		this.setDate(day);
		return this;
	});
	
	/**
	 * Add a number of years to the date object.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.addYears(1);
	 * dtm.toString();
	 * @result 'Mon Jan 12 2009 00:00:00'
	 * 
	 * @name addYears
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("addYears", function(num) {
		this.setFullYear(this.getFullYear() + num);
		return this;
	});
	
	/**
	 * Add a number of months to the date object.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.addMonths(1);
	 * dtm.toString();
	 * @result 'Tue Feb 12 2008 00:00:00'
	 * 
	 * @name addMonths
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("addMonths", function(num) {
		var tmpdtm = this.getDate();
		
		this.setMonth(this.getMonth() + num);
		
		if (tmpdtm > this.getDate())
			this.addDays(-this.getDate());
		
		return this;
	});
	
	/**
	 * Add a number of days to the date object.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.addDays(1);
	 * dtm.toString();
	 * @result 'Sun Jan 13 2008 00:00:00'
	 * 
	 * @name addDays
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("addDays", function(num) {
		//this.setDate(this.getDate() + num);
		this.setTime(this.getTime() + (num*86400000) );
		return this;
	});
	
	/**
	 * Add a number of hours to the date object.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.addHours(24);
	 * dtm.toString();
	 * @result 'Sun Jan 13 2008 00:00:00'
	 * 
	 * @name addHours
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("addHours", function(num) {
		this.setHours(this.getHours() + num);
		return this;
	});

	/**
	 * Add a number of minutes to the date object.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.addMinutes(60);
	 * dtm.toString();
	 * @result 'Sat Jan 12 2008 01:00:00'
	 * 
	 * @name addMinutes
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("addMinutes", function(num) {
		this.setMinutes(this.getMinutes() + num);
		return this;
	});
	
	/**
	 * Add a number of seconds to the date object.
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.addSeconds(60);
	 * dtm.toString();
	 * @result 'Sat Jan 12 2008 00:01:00'
	 * 
	 * @name addSeconds
	 * @type Date
	 * @cat Plugins/Methods/Date
	 */
	add("addSeconds", function(num) {
		this.setSeconds(this.getSeconds() + num);
		return this;
	});
	
	/**
	 * Sets the time component of this Date to zero for cleaner, easier comparison of dates where time is not relevant.
	 * 
	 * @example var dtm = new Date();
	 * dtm.zeroTime();
	 * dtm.toString();
	 * @result 'Sat Jan 12 2008 00:01:00'
	 * 
	 * @name zeroTime
	 * @type Date
	 * @cat Plugins/Methods/Date
	 * @author Kelvin Luck
	 */
	add("zeroTime", function() {
		this.setMilliseconds(0);
		this.setSeconds(0);
		this.setMinutes(0);
		this.setHours(0);
		return this;
	});
	
	/**
	 * Returns a string representation of the date object according to Date.format.
	 * (Date.toString may be used in other places so I purposefully didn't overwrite it)
	 * 
	 * @example var dtm = new Date("01/12/2008");
	 * dtm.asString();
	 * @result '12/01/2008' // (where Date.format == 'dd/mm/yyyy'
	 * 
	 * @name asString
	 * @type Date
	 * @cat Plugins/Methods/Date
	 * @author Kelvin Luck
	 */
	add("asString", function(format) {
		var r = format || Date.format;
		return r
			.split('yyyy').join(this.getFullYear())
			.split('yy').join((this.getFullYear() + '').substring(2))
			.split('mmmm').join(this.getMonthName(false))
			.split('mmm').join(this.getMonthName(true))
			.split('mm').join(_zeroPad(this.getMonth()+1))
			.split('dd').join(_zeroPad(this.getDate()));
	});
	
	/**
	 * Returns a new date object created from the passed String according to Date.format or false if the attempt to do this results in an invalid date object
	 * (We can't simple use Date.parse as it's not aware of locale and I chose not to overwrite it incase it's functionality is being relied on elsewhere)
	 *
	 * @example var dtm = Date.fromString("12/01/2008");
	 * dtm.toString();
	 * @result 'Sat Jan 12 2008 00:00:00' // (where Date.format == 'dd/mm/yyyy'
	 * 
	 * @name fromString
	 * @type Date
	 * @cat Plugins/Methods/Date
	 * @author Kelvin Luck
	 */
	Date.fromString = function(s)
	{
		var f = Date.format;
		var d = new Date('01/01/1977');
		
		var mLength = 0;

		var iM = f.indexOf('mmmm');
		if (iM > -1) {
			for (var i=0; i<Date.monthNames.length; i++) {
				var mStr = s.substr(iM, Date.monthNames[i].length);
				if (Date.monthNames[i] == mStr) {
					mLength = Date.monthNames[i].length - 4;
					break;
				}
			}
			d.setMonth(i);
		} else {
			iM = f.indexOf('mmm');
			if (iM > -1) {
				var mStr = s.substr(iM, 3);
				for (var i=0; i<Date.abbrMonthNames.length; i++) {
					if (Date.abbrMonthNames[i] == mStr) break;
				}
				d.setMonth(i);
			} else {
				d.setMonth(Number(s.substr(f.indexOf('mm'), 2)) - 1);
			}
		}
		
		var iY = f.indexOf('yyyy');

		if (iY > -1) {
			if (iM < iY)
			{
				iY += mLength;
			}
			d.setFullYear(Number(s.substr(iY, 4)));
		} else {
			if (iM < iY)
			{
				iY += mLength;
			}
			// TODO - this doesn't work very well - are there any rules for what is meant by a two digit year?
			d.setFullYear(Number(Date.fullYearStart + s.substr(f.indexOf('yy'), 2)));
		}
		var iD = f.indexOf('dd');
		if (iM < iD)
		{
			iD += mLength;
		}
		d.setDate(Number(s.substr(iD, 2)));
		if (isNaN(d.getTime())) {
			return false;
		}
		return d;
	};
	
	// utility method
	var _zeroPad = function(num) {
		var s = '0'+num;
		return s.substring(s.length-2)
		//return ('0'+num).substring(-2); // doesn't work on IE :(
	};
	
})();

/**
 * Copyright (c) 2008 Kelvin Luck (http://www.kelvinluck.com/)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * $Id: jquery.datePicker.js 70 2009-04-05 19:25:15Z kelvin.luck $
 **/

(function($){
    
	$.fn.extend({
/**
 * Render a calendar table into any matched elements.
 * 
 * @param Object s (optional) Customize your calendars.
 * @option Number month The month to render (NOTE that months are zero based). Default is today's month.
 * @option Number year The year to render. Default is today's year.
 * @option Function renderCallback A reference to a function that is called as each cell is rendered and which can add classes and event listeners to the created nodes. Default is no callback.
 * @option Number showHeader Whether or not to show the header row, possible values are: $.dpConst.SHOW_HEADER_NONE (no header), $.dpConst.SHOW_HEADER_SHORT (first letter of each day) and $.dpConst.SHOW_HEADER_LONG (full name of each day). Default is $.dpConst.SHOW_HEADER_SHORT.
 * @option String hoverClass The class to attach to each cell when you hover over it (to allow you to use hover effects in IE6 which doesn't support the :hover pseudo-class on elements other than links). Default is dp-hover. Pass false if you don't want a hover class.
 * @type jQuery
 * @name renderCalendar
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('#calendar-me').renderCalendar({month:0, year:2007});
 * @desc Renders a calendar displaying January 2007 into the element with an id of calendar-me.
 *
 * @example
 * var testCallback = function($td, thisDate, month, year)
 * {
 * if ($td.is('.current-month') && thisDate.getDay() == 4) {
 *		var d = thisDate.getDate();
 *		$td.bind(
 *			'click',
 *			function()
 *			{
 *				alert('You clicked on ' + d + '/' + (Number(month)+1) + '/' + year);
 *			}
 *		).addClass('thursday');
 *	} else if (thisDate.getDay() == 5) {
 *		$td.html('Friday the ' + $td.html() + 'th');
 *	}
 * }
 * $('#calendar-me').renderCalendar({month:0, year:2007, renderCallback:testCallback});
 * 
 * @desc Renders a calendar displaying January 2007 into the element with an id of calendar-me. Every Thursday in the current month has a class of "thursday" applied to it, is clickable and shows an alert when clicked. Every Friday on the calendar has the number inside replaced with text.
 **/
		renderCalendar  :   function(s)
		{
			var dc = function(a)
			{
				return document.createElement(a);
			};

			s = $.extend({}, $.fn.datePicker.defaults, s);
			
			if (s.showHeader != $.dpConst.SHOW_HEADER_NONE) {
				var headRow = $(dc('tr'));
				for (var i=Date.firstDayOfWeek; i<Date.firstDayOfWeek+7; i++) {
					var weekday = i%7;
					var day = Date.dayNames[weekday];
					headRow.append(
						jQuery(dc('th')).attr({'scope':'col', 'abbr':day, 'title':day, 'class':(weekday == 0 || weekday == 6 ? 'weekend' : 'weekday')}).html(s.showHeader == $.dpConst.SHOW_HEADER_SHORT ? day.substr(0, 1) : day)
					);
				}
			};
			
			var calendarTable = $(dc('table'))
									.attr(
										{
											'cellspacing':2
										}
									)
									.addClass('jCalendar')
									.append(
										(s.showHeader != $.dpConst.SHOW_HEADER_NONE ? 
											$(dc('thead'))
												.append(headRow)
											:
											dc('thead')
										)
									);
			var tbody = $(dc('tbody'));
			
			var today = (new Date()).zeroTime();
			
			var month = s.month == undefined ? today.getMonth() : s.month;
			var year = s.year || today.getFullYear();
			
			var currentDate = new Date(year, month, 1);
			
			
			var firstDayOffset = Date.firstDayOfWeek - currentDate.getDay() + 1;
			if (firstDayOffset > 1) firstDayOffset -= 7;
			var weeksToDraw = Math.ceil(( (-1*firstDayOffset+1) + currentDate.getDaysInMonth() ) /7);
			currentDate.addDays(firstDayOffset-1);
			
			var doHover = function(firstDayInBounds)
			{
				return function()
				{
					if (s.hoverClass) {
						var $this = $(this);
						if (!s.selectWeek) {
							$this.addClass(s.hoverClass);
						} else if (firstDayInBounds && !$this.is('.disabled')) {
							$this.parent().addClass('activeWeekHover');
						}
					}
				}
			};
			var unHover = function()
			{
				if (s.hoverClass) {
					var $this = $(this);
					$this.removeClass(s.hoverClass);
					$this.parent().removeClass('activeWeekHover');
				}
			};

			var w = 0;
			while (w++<weeksToDraw) {
				var r = jQuery(dc('tr'));
				var firstDayInBounds = s.dpController ? currentDate > s.dpController.startDate : false;
				for (var i=0; i<7; i++) {
					var thisMonth = currentDate.getMonth() == month;
					var d = $(dc('td'))
								.text(currentDate.getDate() + '')
								.addClass((thisMonth ? 'current-month ' : 'other-month ') +
													(currentDate.isWeekend() ? 'weekend ' : 'weekday ') +
													(thisMonth && currentDate.getTime() == today.getTime() ? 'today ' : '')
								)
								.data('datePickerDate', currentDate.asString())
								.hover(doHover(firstDayInBounds), unHover)
							;
					r.append(d);
					if (s.renderCallback) {
						s.renderCallback(d, currentDate, month, year);
					}
					// addDays(1) fails in some locales due to daylight savings. See issue 39.
					//currentDate.addDays(1);
					currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()+1);
				}
				tbody.append(r);
			}
			calendarTable.append(tbody);
			
			return this.each(
				function()
				{
					$(this).empty().append(calendarTable);
				}
			);
		},
/**
 * Create a datePicker associated with each of the matched elements.
 *
 * The matched element will receive a few custom events with the following signatures:
 *
 * dateSelected(event, date, $td, status)
 * Triggered when a date is selected. event is a reference to the event, date is the Date selected, $td is a jquery object wrapped around the TD that was clicked on and status is whether the date was selected (true) or deselected (false)
 * 
 * dpClosed(event, selected)
 * Triggered when the date picker is closed. event is a reference to the event and selected is an Array containing Date objects.
 *
 * dpMonthChanged(event, displayedMonth, displayedYear)
 * Triggered when the month of the popped up calendar is changed. event is a reference to the event, displayedMonth is the number of the month now displayed (zero based) and displayedYear is the year of the month.
 *
 * dpDisplayed(event, $datePickerDiv)
 * Triggered when the date picker is created. $datePickerDiv is the div containing the date picker. Use this event to add custom content/ listeners to the popped up date picker.
 *
 * @param Object s (optional) Customize your date pickers.
 * @option Number month The month to render when the date picker is opened (NOTE that months are zero based). Default is today's month.
 * @option Number year The year to render when the date picker is opened. Default is today's year.
 * @option String startDate The first date date can be selected.
 * @option String endDate The last date that can be selected.
 * @option Boolean inline Whether to create the datePicker as inline (e.g. always on the page) or as a model popup. Default is false (== modal popup)
 * @option Boolean createButton Whether to create a .dp-choose-date anchor directly after the matched element which when clicked will trigger the showing of the date picker. Default is true.
 * @option Boolean showYearNavigation Whether to display buttons which allow the user to navigate through the months a year at a time. Default is true.
 * @option Boolean closeOnSelect Whether to close the date picker when a date is selected. Default is true.
 * @option Boolean displayClose Whether to create a "Close" button within the date picker popup. Default is false.
 * @option Boolean selectMultiple Whether a user should be able to select multiple dates with this date picker. Default is false.
 * @option Number numSelectable The maximum number of dates that can be selected where selectMultiple is true. Default is a very high number.
 * @option Boolean clickInput If the matched element is an input type="text" and this option is true then clicking on the input will cause the date picker to appear.
 * @option Boolean rememberViewedMonth Whether the datePicker should remember the last viewed month and open on it. If false then the date picker will always open with the month for the first selected date visible.
 * @option Boolean selectWeek Whether to select a complete week at a time...
 * @option Number verticalPosition The vertical alignment of the popped up date picker to the matched element. One of $.dpConst.POS_TOP and $.dpConst.POS_BOTTOM. Default is $.dpConst.POS_TOP.
 * @option Number horizontalPosition The horizontal alignment of the popped up date picker to the matched element. One of $.dpConst.POS_LEFT and $.dpConst.POS_RIGHT.
 * @option Number verticalOffset The number of pixels offset from the defined verticalPosition of this date picker that it should pop up in. Default in 0.
 * @option Number horizontalOffset The number of pixels offset from the defined horizontalPosition of this date picker that it should pop up in. Default in 0.
 * @option (Function|Array) renderCallback A reference to a function (or an array of seperate functions) that is called as each cell is rendered and which can add classes and event listeners to the created nodes. Each callback function will receive four arguments; a jquery object wrapping the created TD, a Date object containing the date this TD represents, a number giving the currently rendered month and a number giving the currently rendered year. Default is no callback.
 * @option String hoverClass The class to attach to each cell when you hover over it (to allow you to use hover effects in IE6 which doesn't support the :hover pseudo-class on elements other than links). Default is dp-hover. Pass false if you don't want a hover class.
 * @type jQuery
 * @name datePicker
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('input.date-picker').datePicker();
 * @desc Creates a date picker button next to all matched input elements. When the button is clicked on the value of the selected date will be placed in the corresponding input (formatted according to Date.format).
 *
 * @example demo/index.html
 * @desc See the projects homepage for many more complex examples...
 **/
		datePicker : function(s)
		{			
			if (!$.event._dpCache) $.event._dpCache = [];
			
			// initialise the date picker controller with the relevant settings...
			s = $.extend({}, $.fn.datePicker.defaults, s);
			
			return this.each(
				function()
				{
					var $this = $(this);
					var alreadyExists = true;
					
					if (!this._dpId) {
						this._dpId = $.event.guid++;
						$.event._dpCache[this._dpId] = new DatePicker(this);
						alreadyExists = false;
					}
					
					if (s.inline) {
						s.createButton = false;
						s.displayClose = false;
						s.closeOnSelect = false;
						$this.empty();
					}
					
					var controller = $.event._dpCache[this._dpId];
					
					controller.init(s);
					
					if (!alreadyExists && s.createButton) {
						// create it!
						controller.button = $('<a href="#" class="dp-choose-date" title="' + $.dpText.TEXT_CHOOSE_DATE + '">' + $.dpText.TEXT_CHOOSE_DATE + '</a>')
								.bind(
									'click',
									function()
									{
										$this.dpDisplay(this);
										this.blur();
										return false;
									}
								);
						$this.after(controller.button);
					}
					
					if (!alreadyExists && $this.is(':text')) {
						$this
							.bind(
								'dateSelected',
								function(e, selectedDate, $td)
								{
									this.value = selectedDate.asString();
								}
							).bind(
								'change',
								function()
								{
									if (this.value == '') {
										controller.clearSelected();
									} else {
										var d = Date.fromString(this.value);
										if (d) {
											controller.setSelected(d, true, true);
										}
									}
								}
							);
						if (s.clickInput) {
							$this.bind(
								'click',
								function()
								{
									// The change event doesn't happen until the input loses focus so we need to manually trigger it...
									$this.trigger('change');
									$this.dpDisplay();
								}
							);
						}
						var d = Date.fromString(this.value);
						if (this.value != '' && d) {
							controller.setSelected(d, true, true);
						}
					}
					
					$this.addClass('dp-applied');
					
				}
			)
		},
/**
 * Disables or enables this date picker
 *
 * @param Boolean s Whether to disable (true) or enable (false) this datePicker
 * @type jQuery
 * @name dpSetDisabled
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-picker').datePicker();
 * $('.date-picker').dpSetDisabled(true);
 * @desc Prevents this date picker from displaying and adds a class of dp-disabled to it (and it's associated button if it has one) for styling purposes. If the matched element is an input field then it will also set the disabled attribute to stop people directly editing the field.
 **/
		dpSetDisabled : function(s)
		{
			return _w.call(this, 'setDisabled', s);
		},
/**
 * Updates the first selectable date for any date pickers on any matched elements.
 *
 * @param String d A string representing the first selectable date (formatted according to Date.format).
 * @type jQuery
 * @name dpSetStartDate
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-picker').datePicker();
 * $('.date-picker').dpSetStartDate('01/01/2000');
 * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the first selectable date for each of these to the first day of the millenium.
 **/
		dpSetStartDate : function(d)
		{
			return _w.call(this, 'setStartDate', d);
		},
/**
 * Updates the last selectable date for any date pickers on any matched elements.
 *
 * @param String d A string representing the last selectable date (formatted according to Date.format).
 * @type jQuery
 * @name dpSetEndDate
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-picker').datePicker();
 * $('.date-picker').dpSetEndDate('01/01/2010');
 * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the last selectable date for each of these to the first Janurary 2010.
 **/
		dpSetEndDate : function(d)
		{
			return _w.call(this, 'setEndDate', d);
		},
/**
 * Gets a list of Dates currently selected by this datePicker. This will be an empty array if no dates are currently selected or NULL if there is no datePicker associated with the matched element.
 *
 * @type Array
 * @name dpGetSelected
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-picker').datePicker();
 * alert($('.date-picker').dpGetSelected());
 * @desc Will alert an empty array (as nothing is selected yet)
 **/
		dpGetSelected : function()
		{
			var c = _getController(this[0]);
			if (c) {
				return c.getSelected();
			}
			return null;
		},
/**
 * Selects or deselects a date on any matched element's date pickers. Deselcting is only useful on date pickers where selectMultiple==true. Selecting will only work if the passed date is within the startDate and endDate boundries for a given date picker.
 *
 * @param String d A string representing the date you want to select (formatted according to Date.format).
 * @param Boolean v Whether you want to select (true) or deselect (false) this date. Optional - default = true.
 * @param Boolean m Whether you want the date picker to open up on the month of this date when it is next opened. Optional - default = true.
 * @param Boolean e Whether you want the date picker to dispatch events related to this change of selection. Optional - default = true.
 * @type jQuery
 * @name dpSetSelected
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-picker').datePicker();
 * $('.date-picker').dpSetSelected('01/01/2010');
 * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the selected date on these date pickers to the first Janurary 2010. When the date picker is next opened it will display Janurary 2010.
 **/
		dpSetSelected : function(d, v, m, e)
		{
			if (v == undefined) v=true;
			if (m == undefined) m=true;
			if (e == undefined) e=true;
			return _w.call(this, 'setSelected', Date.fromString(d), v, m, e);
		},
/**
 * Sets the month that will be displayed when the date picker is next opened. If the passed month is before startDate then the month containing startDate will be displayed instead. If the passed month is after endDate then the month containing the endDate will be displayed instead.
 *
 * @param Number m The month you want the date picker to display. Optional - defaults to the currently displayed month.
 * @param Number y The year you want the date picker to display. Optional - defaults to the currently displayed year.
 * @type jQuery
 * @name dpSetDisplayedMonth
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-picker').datePicker();
 * $('.date-picker').dpSetDisplayedMonth(10, 2008);
 * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the selected date on these date pickers to the first Janurary 2010. When the date picker is next opened it will display Janurary 2010.
 **/
		dpSetDisplayedMonth : function(m, y)
		{
			return _w.call(this, 'setDisplayedMonth', Number(m), Number(y), true);
		},
/**
 * Displays the date picker associated with the matched elements. Since only one date picker can be displayed at once then the date picker associated with the last matched element will be the one that is displayed.
 *
 * @param HTMLElement e An element that you want the date picker to pop up relative in position to. Optional - default behaviour is to pop up next to the element associated with this date picker.
 * @type jQuery
 * @name dpDisplay
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('#date-picker').datePicker();
 * $('#date-picker').dpDisplay();
 * @desc Creates a date picker associated with the element with an id of date-picker and then causes it to pop up.
 **/
		dpDisplay : function(e)
		{
			return _w.call(this, 'display', e);
		},
/**
 * Sets a function or array of functions that is called when each TD of the date picker popup is rendered to the page
 *
 * @param (Function|Array) a A function or an array of functions that are called when each td is rendered. Each function will receive four arguments; a jquery object wrapping the created TD, a Date object containing the date this TD represents, a number giving the currently rendered month and a number giving the currently rendered year.
 * @type jQuery
 * @name dpSetRenderCallback
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('#date-picker').datePicker();
 * $('#date-picker').dpSetRenderCallback(function($td, thisDate, month, year)
 * {
 * 	// do stuff as each td is rendered dependant on the date in the td and the displayed month and year
 * });
 * @desc Creates a date picker associated with the element with an id of date-picker and then creates a function which is called as each td is rendered when this date picker is displayed.
 **/
		dpSetRenderCallback : function(a)
		{
			return _w.call(this, 'setRenderCallback', a);
		},
/**
 * Sets the position that the datePicker will pop up (relative to it's associated element)
 *
 * @param Number v The vertical alignment of the created date picker to it's associated element. Possible values are $.dpConst.POS_TOP and $.dpConst.POS_BOTTOM
 * @param Number h The horizontal alignment of the created date picker to it's associated element. Possible values are $.dpConst.POS_LEFT and $.dpConst.POS_RIGHT
 * @type jQuery
 * @name dpSetPosition
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('#date-picker').datePicker();
 * $('#date-picker').dpSetPosition($.dpConst.POS_BOTTOM, $.dpConst.POS_RIGHT);
 * @desc Creates a date picker associated with the element with an id of date-picker and makes it so that when this date picker pops up it will be bottom and right aligned to the #date-picker element.
 **/
		dpSetPosition : function(v, h)
		{
			return _w.call(this, 'setPosition', v, h);
		},
/**
 * Sets the offset that the popped up date picker will have from it's default position relative to it's associated element (as set by dpSetPosition)
 *
 * @param Number v The vertical offset of the created date picker.
 * @param Number h The horizontal offset of the created date picker.
 * @type jQuery
 * @name dpSetOffset
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('#date-picker').datePicker();
 * $('#date-picker').dpSetOffset(-20, 200);
 * @desc Creates a date picker associated with the element with an id of date-picker and makes it so that when this date picker pops up it will be 20 pixels above and 200 pixels to the right of it's default position.
 **/
		dpSetOffset : function(v, h)
		{
			return _w.call(this, 'setOffset', v, h);
		},
/**
 * Closes the open date picker associated with this element.
 *
 * @type jQuery
 * @name dpClose
 * @cat plugins/datePicker
 * @author Kelvin Luck (http://www.kelvinluck.com/)
 *
 * @example $('.date-pick')
 *		.datePicker()
 *		.bind(
 *			'focus',
 *			function()
 *			{
 *				$(this).dpDisplay();
 *			}
 *		).bind(
 *			'blur',
 *			function()
 *			{
 *				$(this).dpClose();
 *			}
 *		);
 * @desc Creates a date picker and makes it appear when the relevant element is focused and disappear when it is blurred.
 **/
		dpClose : function()
		{
			return _w.call(this, '_closeCalendar', false, this[0]);
		},
		// private function called on unload to clean up any expandos etc and prevent memory links...
		_dpDestroy : function()
		{
			// TODO - implement this?
		}
	});
	
	// private internal function to cut down on the amount of code needed where we forward
	// dp* methods on the jQuery object on to the relevant DatePicker controllers...
	var _w = function(f, a1, a2, a3, a4)
	{
		return this.each(
			function()
			{
				var c = _getController(this);
				if (c) {
					c[f](a1, a2, a3, a4);
				}
			}
		);
	};
	
	function DatePicker(ele)
	{
		this.ele = ele;
		
		// initial values...
		this.displayedMonth		=	null;
		this.displayedYear		=	null;
		this.startDate			=	null;
		this.endDate			=	null;
		this.showYearNavigation	=	null;
		this.closeOnSelect		=	null;
		this.displayClose		=	null;
		this.rememberViewedMonth=	null;
		this.selectMultiple		=	null;
		this.numSelectable		=	null;
		this.numSelected		=	null;
		this.verticalPosition	=	null;
		this.horizontalPosition	=	null;
		this.verticalOffset		=	null;
		this.horizontalOffset	=	null;
		this.button				=	null;
		this.renderCallback		=	[];
		this.selectedDates		=	{};
		this.inline				=	null;
		this.context			=	'#dp-popup';
		this.settings			=	{};
	};
	$.extend(
		DatePicker.prototype,
		{	
			init : function(s)
			{
				this.setStartDate(s.startDate);
				this.setEndDate(s.endDate);
				this.setDisplayedMonth(Number(s.month), Number(s.year));
				this.setRenderCallback(s.renderCallback);
				this.showYearNavigation = s.showYearNavigation;
				this.closeOnSelect = s.closeOnSelect;
				this.displayClose = s.displayClose;
				this.rememberViewedMonth =	s.rememberViewedMonth;
				this.selectMultiple = s.selectMultiple;
				this.numSelectable = s.selectMultiple ? s.numSelectable : 1;
				this.numSelected = 0;
				this.verticalPosition = s.verticalPosition;
				this.horizontalPosition = s.horizontalPosition;
				this.hoverClass = s.hoverClass;
				this.setOffset(s.verticalOffset, s.horizontalOffset);
				this.inline = s.inline;
				this.settings = s;
				if (this.inline) {
					this.context = this.ele;
					this.display();
				}
			},
			setStartDate : function(d)
			{
				if (d) {
					this.startDate = Date.fromString(d);
				}
				if (!this.startDate) {
					this.startDate = (new Date()).zeroTime();
				}
				this.setDisplayedMonth(this.displayedMonth, this.displayedYear);
			},
			setEndDate : function(d)
			{
				if (d) {
					this.endDate = Date.fromString(d);
				}
				if (!this.endDate) {
					this.endDate = (new Date('12/31/2999')); // using the JS Date.parse function which expects mm/dd/yyyy
				}
				if (this.endDate.getTime() < this.startDate.getTime()) {
					this.endDate = this.startDate;
				}
				this.setDisplayedMonth(this.displayedMonth, this.displayedYear);
			},
			setPosition : function(v, h)
			{
				this.verticalPosition = v;
				this.horizontalPosition = h;
			},
			setOffset : function(v, h)
			{
				this.verticalOffset = parseInt(v) || 0;
				this.horizontalOffset = parseInt(h) || 0;
			},
			setDisabled : function(s)
			{
				$e = $(this.ele);
				$e[s ? 'addClass' : 'removeClass']('dp-disabled');
				if (this.button) {
					$but = $(this.button);
					$but[s ? 'addClass' : 'removeClass']('dp-disabled');
					$but.attr('title', s ? '' : $.dpText.TEXT_CHOOSE_DATE);
				}
				if ($e.is(':text')) {
					$e.attr('disabled', s ? 'disabled' : '');
				}
			},
			setDisplayedMonth : function(m, y, rerender)
			{
				if (this.startDate == undefined || this.endDate == undefined) {
					return;
				}
				var s = new Date(this.startDate.getTime());
				s.setDate(1);
				var e = new Date(this.endDate.getTime());
				e.setDate(1);
				
				var t;
				if ((!m && !y) || (isNaN(m) && isNaN(y))) {
					// no month or year passed - default to current month
					t = new Date().zeroTime();
					t.setDate(1);
				} else if (isNaN(m)) {
					// just year passed in - presume we want the displayedMonth
					t = new Date(y, this.displayedMonth, 1);
				} else if (isNaN(y)) {
					// just month passed in - presume we want the displayedYear
					t = new Date(this.displayedYear, m, 1);
				} else {
					// year and month passed in - that's the date we want!
					t = new Date(y, m, 1)
				}
				// check if the desired date is within the range of our defined startDate and endDate
				if (t.getTime() < s.getTime()) {
					t = s;
				} else if (t.getTime() > e.getTime()) {
					t = e;
				}
				var oldMonth = this.displayedMonth;
				var oldYear = this.displayedYear;
				this.displayedMonth = t.getMonth();
				this.displayedYear = t.getFullYear();

				if (rerender && (this.displayedMonth != oldMonth || this.displayedYear != oldYear))
				{
					this._rerenderCalendar();
					$(this.ele).trigger('dpMonthChanged', [this.displayedMonth, this.displayedYear]);
				}
			},
			setSelected : function(d, v, moveToMonth, dispatchEvents)
			{
				if (d < this.startDate || d > this.endDate) {
					// Don't allow people to select dates outside range...
					return;
				}
				var s = this.settings;
				if (s.selectWeek)
				{
					d = d.addDays(- (d.getDay() - Date.firstDayOfWeek + 7) % 7);
					if (d < this.startDate) // The first day of this week is before the start date so is unselectable...
					{
						return;
					}
				}
				if (v == this.isSelected(d)) // this date is already un/selected
				{
					return;
				}
				if (this.selectMultiple == false) {
					this.clearSelected();
				} else if (v && this.numSelected == this.numSelectable) {
					// can't select any more dates...
					return;
				}
				if (moveToMonth && (this.displayedMonth != d.getMonth() || this.displayedYear != d.getFullYear())) {
					this.setDisplayedMonth(d.getMonth(), d.getFullYear(), true);
				}
				this.selectedDates[d.toString()] = v;
				this.numSelected += v ? 1 : -1;
				var selectorString = 'td.' +( d.getMonth() == this.displayedMonth ? 'current-month' : 'other-month');
				var $td;
				$(selectorString, this.context).each(
					function()
					{
						if ($(this).data('datePickerDate') == d.asString()) {
							$td = $(this);
							if (s.selectWeek)
							{
								$td.parent()[v ? 'addClass' : 'removeClass']('selectedWeek');
							}
							$td[v ? 'addClass' : 'removeClass']('selected'); 
						}
					}
				);
				$('td', this.context).not('.selected')[this.selectMultiple &&  this.numSelected == this.numSelectable ? 'addClass' : 'removeClass']('unselectable');
				
				if (dispatchEvents)
				{
					var s = this.isSelected(d);
					$e = $(this.ele);
					var dClone = Date.fromString(d.asString());
					$e.trigger('dateSelected', [dClone, $td, s]);
					$e.trigger('change');
				}
			},
			isSelected : function(d)
			{
				return this.selectedDates[d.toString()];
			},
			getSelected : function()
			{
				var r = [];
				for(s in this.selectedDates) {
					if (this.selectedDates[s] == true) {
						r.push(Date.parse(s));
					}
				}
				return r;
			},
			clearSelected : function()
			{
				this.selectedDates = {};
				this.numSelected = 0;
				$('td.selected', this.context).removeClass('selected').parent().removeClass('selectedWeek');
			},
			display : function(eleAlignTo)
			{
				if ($(this.ele).is('.dp-disabled')) return;
				
				eleAlignTo = eleAlignTo || this.ele;
				var c = this;
				var $ele = $(eleAlignTo);
				var eleOffset = $ele.offset();
				
				var $createIn;
				var attrs;
				var attrsCalendarHolder;
				var cssRules;
				
				if (c.inline) {
					$createIn = $(this.ele);
					attrs = {
						'id'		:	'calendar-' + this.ele._dpId,
						'class'	:	'dp-popup dp-popup-inline'
					};

					$('.dp-popup', $createIn).remove();
					cssRules = {
					};
				} else {
					$createIn = $('body');
					attrs = {
						'id'		:	'dp-popup',
						'class'	:	'dp-popup'
					};
					cssRules = {
						'top'	:	eleOffset.top + c.verticalOffset,
						'left'	:	eleOffset.left + c.horizontalOffset
					};
					
					var _checkMouse = function(e)
					{
						var el = e.target;
						var cal = $('#dp-popup')[0];
						
						while (true){
							if (el == cal) {
								return true;
							} else if (el == document) {
								c._closeCalendar();
								return false;
							} else {
								el = $(el).parent()[0];
							}
						}
					};
					this._checkMouse = _checkMouse;
					
					c._closeCalendar(true);
					$(document).bind(
						'keydown.datepicker', 
						function(event)
						{
							if (event.keyCode == 27) {
								c._closeCalendar();
							}
						}
					);
				}
				
				if (!c.rememberViewedMonth)
				{
					var selectedDate = this.getSelected()[0];
					if (selectedDate) {
						selectedDate = new Date(selectedDate);
						this.setDisplayedMonth(selectedDate.getMonth(), selectedDate.getFullYear(), false);
					}
				}
				
				$createIn
					.append(
						$('<div></div>')
							.attr(attrs)
							.css(cssRules)
							.append(
//								$('<a href="#" class="selecteee">aaa</a>'),
								$('<h2></h2>'),
								$('<div class="dp-nav-prev"></div>')
									.append(
										$('<a class="dp-nav-prev-year" href="#" title="' + $.dpText.TEXT_PREV_YEAR + '">&lt;&lt;</a>')
											.bind(
												'click',
												function()
												{
													return c._displayNewMonth.call(c, this, 0, -1);
												}
											),
										$('<a class="dp-nav-prev-month" href="#" title="' + $.dpText.TEXT_PREV_MONTH + '">&lt;</a>')
											.bind(
												'click',
												function()
												{
													return c._displayNewMonth.call(c, this, -1, 0);
												}
											)
									),
								$('<div class="dp-nav-next"></div>')
									.append(
										$('<a class="dp-nav-next-year" href="#" title="' + $.dpText.TEXT_NEXT_YEAR + '">&gt;&gt;</a>')
											.bind(
												'click',
												function()
												{
													return c._displayNewMonth.call(c, this, 0, 1);
												}
											),
										$('<a class="dp-nav-next-month" href="#" title="' + $.dpText.TEXT_NEXT_MONTH + '">&gt;</a>')
											.bind(
												'click',
												function()
												{
													return c._displayNewMonth.call(c, this, 1, 0);
												}
											)
									),
								$('<div class="dp-calendar"></div>')
							)
							.bgIframe()
						);
					
				var $pop = this.inline ? $('.dp-popup', this.context) : $('#dp-popup');
				
				if (this.showYearNavigation == false) {
					$('.dp-nav-prev-year, .dp-nav-next-year', c.context).css('display', 'none');
				}
				if (this.displayClose) {
					$pop.append(
						$('<a href="#" id="dp-close">' + $.dpText.TEXT_CLOSE + '</a>')
							.bind(
								'click',
								function()
								{
									c._closeCalendar();
									return false;
								}
							)
					);
				}
				c._renderCalendar();

				$(this.ele).trigger('dpDisplayed', $pop);
				
				if (!c.inline) {
					if (this.verticalPosition == $.dpConst.POS_BOTTOM) {
						$pop.css('top', eleOffset.top + $ele.height() - $pop.height() + c.verticalOffset);
					}
					if (this.horizontalPosition == $.dpConst.POS_RIGHT) {
						$pop.css('left', eleOffset.left + $ele.width() - $pop.width() + c.horizontalOffset);
					}
//					$('.selectee', this.context).focus();
					$(document).bind('mousedown.datepicker', this._checkMouse);
				}
				
			},
			setRenderCallback : function(a)
			{
				if (a == null) return;
				if (a && typeof(a) == 'function') {
					a = [a];
				}
				this.renderCallback = this.renderCallback.concat(a);
			},
			cellRender : function ($td, thisDate, month, year) {
				var c = this.dpController;
				var d = new Date(thisDate.getTime());
				
				// add our click handlers to deal with it when the days are clicked...
				
				$td.bind(
					'click',
					function()
					{
						var $this = $(this);
						if (!$this.is('.disabled')) {
							c.setSelected(d, !$this.is('.selected') || !c.selectMultiple, false, true);
							if (c.closeOnSelect) {
								c._closeCalendar();
							}
							// TODO: Instead of this which doesn't work in IE anyway we should find the next focusable element in the document
							// and pass the focus onto that. That would allow the user to continue on the form as expected...
							if (!$.browser.msie)
							{
								$(c.ele).trigger('focus', [$.dpConst.DP_INTERNAL_FOCUS]);
							}
						}
					}
				);
				
				if (c.isSelected(d)) {
					$td.addClass('selected');
					if (c.settings.selectWeek)
					{
						$td.parent().addClass('selectedWeek');
					}
				} else  if (c.selectMultiple && c.numSelected == c.numSelectable) {
					$td.addClass('unselectable');
				}
				
			},
			_applyRenderCallbacks : function()
			{
				var c = this;
				$('td', this.context).each(
					function()
					{
						for (var i=0; i<c.renderCallback.length; i++) {
							$td = $(this);
							c.renderCallback[i].apply(this, [$td, Date.fromString($td.data('datePickerDate')), c.displayedMonth, c.displayedYear]);
						}
					}
				);
				return;
			},
			// ele is the clicked button - only proceed if it doesn't have the class disabled...
			// m and y are -1, 0 or 1 depending which direction we want to go in...
			_displayNewMonth : function(ele, m, y) 
			{
				if (!$(ele).is('.disabled')) {
					this.setDisplayedMonth(this.displayedMonth + m, this.displayedYear + y, true);
				}
				ele.blur();
				return false;
			},
			_rerenderCalendar : function()
			{
				this._clearCalendar();
				this._renderCalendar();
			},
			_renderCalendar : function()
			{
				// set the title...
				$('h2', this.context).html((new Date(this.displayedYear, this.displayedMonth, 1)).asString($.dpText.HEADER_FORMAT));
				
				// render the calendar...
				$('.dp-calendar', this.context).renderCalendar(
					$.extend(
						{},
						this.settings, 
						{
							month			: this.displayedMonth,
							year			: this.displayedYear,
							renderCallback	: this.cellRender,
							dpController	: this,
							hoverClass		: this.hoverClass
						})
				);
				
				// update the status of the control buttons and disable dates before startDate or after endDate...
				// TODO: When should the year buttons be disabled? When you can't go forward a whole year from where you are or is that annoying?
				if (this.displayedYear == this.startDate.getFullYear() && this.displayedMonth == this.startDate.getMonth()) {
					$('.dp-nav-prev-year', this.context).addClass('disabled');
					$('.dp-nav-prev-month', this.context).addClass('disabled');
					$('.dp-calendar td.other-month', this.context).each(
						function()
						{
							var $this = $(this);
							if (Number($this.text()) > 20) {
								$this.addClass('disabled');
							}
						}
					);
					var d = this.startDate.getDate();
					$('.dp-calendar td.current-month', this.context).each(
						function()
						{
							var $this = $(this);
							if (Number($this.text()) < d) {
								$this.addClass('disabled');
							}
						}
					);
				} else {
					$('.dp-nav-prev-year', this.context).removeClass('disabled');
					$('.dp-nav-prev-month', this.context).removeClass('disabled');
					var d = this.startDate.getDate();
					if (d > 20) {
						// check if the startDate is last month as we might need to add some disabled classes...
						var st = this.startDate.getTime();
						var sd = new Date(st);
						sd.addMonths(1);
						if (this.displayedYear == sd.getFullYear() && this.displayedMonth == sd.getMonth()) {
							$('.dp-calendar td.other-month', this.context).each(
								function()
								{
									var $this = $(this);
									if (Date.fromString($this.data('datePickerDate')).getTime() < st) {
										$this.addClass('disabled');
									}
								}
							);
						}
					}
				}
				if (this.displayedYear == this.endDate.getFullYear() && this.displayedMonth == this.endDate.getMonth()) {
					$('.dp-nav-next-year', this.context).addClass('disabled');
					$('.dp-nav-next-month', this.context).addClass('disabled');
					$('.dp-calendar td.other-month', this.context).each(
						function()
						{
							var $this = $(this);
							if (Number($this.text()) < 14) {
								$this.addClass('disabled');
							}
						}
					);
					var d = this.endDate.getDate();
					$('.dp-calendar td.current-month', this.context).each(
						function()
						{
							var $this = $(this);
							if (Number($this.text()) > d) {
								$this.addClass('disabled');
							}
						}
					);
				} else {
					$('.dp-nav-next-year', this.context).removeClass('disabled');
					$('.dp-nav-next-month', this.context).removeClass('disabled');
					var d = this.endDate.getDate();
					if (d < 13) {
						// check if the endDate is next month as we might need to add some disabled classes...
						var ed = new Date(this.endDate.getTime());
						ed.addMonths(-1);
						if (this.displayedYear == ed.getFullYear() && this.displayedMonth == ed.getMonth()) {
							$('.dp-calendar td.other-month', this.context).each(
								function()
								{
									var $this = $(this);
									if (Number($this.text()) > d) {
										$this.addClass('disabled');
									}
								}
							);
						}
					}
				}
				this._applyRenderCallbacks();
			},
			_closeCalendar : function(programatic, ele)
			{
				if (!ele || ele == this.ele)
				{
					$(document).unbind('mousedown.datepicker');
					$(document).unbind('keydown.datepicker');
					this._clearCalendar();
					$('#dp-popup a').unbind();
					$('#dp-popup').empty().remove();
					if (!programatic) {
						$(this.ele).trigger('dpClosed', [this.getSelected()]);
					}
				}
			},
			// empties the current dp-calendar div and makes sure that all events are unbound
			// and expandos removed to avoid memory leaks...
			_clearCalendar : function()
			{
				// TODO.
				$('.dp-calendar td', this.context).unbind();
				$('.dp-calendar', this.context).empty();
			}
		}
	);
	
	// static constants
	$.dpConst = {
		SHOW_HEADER_NONE	:	0,
		SHOW_HEADER_SHORT	:	1,
		SHOW_HEADER_LONG	:	2,
		POS_TOP				:	0,
		POS_BOTTOM			:	1,
		POS_LEFT			:	0,
		POS_RIGHT			:	1,
		DP_INTERNAL_FOCUS	:	'dpInternalFocusTrigger'
	};
	// localisable text
	$.dpText = {
		TEXT_PREV_YEAR		:	'Previous year',
		TEXT_PREV_MONTH		:	'Previous month',
		TEXT_NEXT_YEAR		:	'Next year',
		TEXT_NEXT_MONTH		:	'Next month',
		TEXT_CLOSE			:	'Close',
		TEXT_CHOOSE_DATE	:	'Choose date',
		HEADER_FORMAT		:	'mmmm yyyy'
	};
	// version
	$.dpVersion = '$Id: jquery.datePicker.js 70 2009-04-05 19:25:15Z kelvin.luck $';

	$.fn.datePicker.defaults = {
		month				: undefined,
		year				: undefined,
		showHeader			: $.dpConst.SHOW_HEADER_SHORT,
		startDate			: undefined,
		endDate				: undefined,
		inline				: false,
		renderCallback		: null,
		createButton		: true,
		showYearNavigation	: true,
		closeOnSelect		: true,
		displayClose		: false,
		selectMultiple		: false,
		numSelectable		: Number.MAX_VALUE,
		clickInput			: false,
		rememberViewedMonth	: true,
		selectWeek			: false,
		verticalPosition	: $.dpConst.POS_TOP,
		horizontalPosition	: $.dpConst.POS_LEFT,
		verticalOffset		: 0,
		horizontalOffset	: 0,
		hoverClass			: 'dp-hover'
	};

	function _getController(ele)
	{
		if (ele._dpId) return $.event._dpCache[ele._dpId];
		return false;
	};
	
	// make it so that no error is thrown if bgIframe plugin isn't included (allows you to use conditional
	// comments to only include bgIframe where it is needed in IE without breaking this plugin).
	if ($.fn.bgIframe == undefined) {
		$.fn.bgIframe = function() {return this; };
	};


	// clean-up
	$(window)
		.bind('unload', function() {
			var els = $.event._dpCache || [];
			for (var i in els) {
				$(els[i].ele)._dpDestroy();
			}
		});
		
	
})(jQuery);
/*{{{*/
.concertina {
	overflow: hidden;
	display: none;
	padding: 0.7em;
	background-color: white;
}

.concertinaOn .concertina {
	display: auto;
	padding: 10px;
	height: auto;
	border-bottom: 1px solid [[ColorPalette: :PrimaryDark]];
	overflow: auto;
}

.privateNotPublic .concertina,
.private .concertina {
	background: -webkit-gradient(linear, left bottom, left top, color-stop(0.29, rgb(222,133,179)), color-stop(1, rgb(245,208,229)), color-stop(0.71, rgb(255,224,241)));
		background: -moz-linear-gradient(center bottom, rgb(222,133,179) 29%, rgb(245,208,229) 100%, rgb(255,224,241) 71%);
	/* For Internet Explorer 5.5 - 7 */
	filter: "progid: DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ffDE85B3)";
	/* For Internet Explorer 8 */
	-ms-filter: "progid: DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ffDE85B3)";
}

.public .concertina,
.privateAndPublic .concertina {
	background: -webkit-gradient(linear, left bottom, left top, color-stop(0.55, rgb(187,231,253)), color-stop(1, rgb(197,233,252)), color-stop(0.74, rgb(220,238,250)));
	background: -moz-linear-gradient(center bottom, rgb(187,231,253) 55%, rgb(197,233,252) 100%, rgb(220,238,250) 74%);
	/* For Internet Explorer 5.5 - 7 */
	filter: "progid: DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ffBBE7FD)";
	/* For Internet Explorer 8 */
	-ms-filter: "progid: DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ffBBE7FD)";
}

.external .concertina {
	background-color: white;
	background: -webkit-gradient(linear, left bottom, left top, color-stop(0.25, rgb(139,214,158)), color-stop(1, rgb(175,230,187)), color-stop(0.74, rgb(204,240,213)));
	background: -moz-linear-gradient(center bottom, rgb(139,214,158) 25%, rgb(175,230,187) 100%, rgb(204,240,213) 74%);
	/* For Internet Explorer 5.5 - 7 */
	filter: "progid: DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ff8BD69E)";
	/* For Internet Explorer 8 */
	-ms-filter: "progid: DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ff8BD69E)";
}

.concertina .publishButton {
	border-radius: 1em;
	-webkit-border-radius: 1em;
	-moz-border-radius: 1em;
	background-color: white;
	border: 1px solid black;
	display: block;
	padding: 0.7em;
	text-align: center;
	width: 12em;
}

.content .calendar {
	margin-left: 2em;
	position: relative;
	width: 46px;
	float: right;
	margin-top: 2em;
	cursor: pointer;
}

.content .calendar:hover {
	opacity: 0.2;
}

.selected .tagging,
.selected .tagged,
.selected .tagging:hover,
.selected .tagged:hover {
	background: none;
	border: none;
}

.tagged {
	float: right;
	position: relative;
	right: -2.4em;
}

.tagging, .tagged {
	background: none;
	border: none;
}

.tagging {
	float: none;
}

.tagging li {
	display: inline;
	float: left;
}

.tagging .tiddlyLink {
-webkit-border-radius: 5px 5px 5px 5px;
	-moz-border-radius: 5px 5px 5px 5px;
	background-color: white;
	margin: 0 0.2em 0.2em;
	display: block;
	padding: 0.8em;
}

.tagged .button {
	-webkit-border-radius: 15px 0px 0px 15px;
	-moz-border-radius: 15px 0px 0px 15px;
	background-color: white;
	border-bottom: 2px solid #ccc;
	border-left: 2px solid #ccc;
	border-top: 2px solid #ccc;
	display: block;
	margin: 0 0 0.3em -1.1em;
	padding: 0.4em;
	font-size: 0.9em;
	width: 8em;
	word-wrap: break-word;
	color: [[ColorPalette: :Background]];
	background: [[ColorPalette: :TertiaryMid]];
}

/* for following */
#popup .siteIcon {
	float: left;
	height: 25px;
}

.content {
	position: relative;
	top: 0;
	left: 0;
	width: 100%; /* IE */
}

.content .info {
	float: right;
	position: relative;
	right: 1em;
	top: 0;
	width: 9em;
	z-index: 2;
}

.heading {
	left: 0;
	margin-bottom: 3em;
	position: relative;
	top: 3em;
	position: relative;
}

.followButton a:hover {
	background: none;
	color: black;
}

.followPlaceHolder {
	position: absolute;
	left: 5.8em;
	top: 0.5em;
}

.followButton {
	cursor: pointer;
	-webkit-border-radius: 0.3em;
	-moz-border-radius: 0.3em;
	background: none repeat scroll 0 0 #CCCCCC;
	color: red;
	min-width: 2em;
	height: 1em;
	padding: 0.4em;
	text-align: center;
}

.followButton:before {
	content: "\00a0";
	display: block; /* reduce the damage in FF3.0 */
	position: absolute;
	bottom: -0.2em;
	left: 0.1em;
	width: 0;
	height: 0;
	border-width: 0.5em 0.2em 0 0.6em;
	border-style: solid;
	border-color: #ccc transparent;
}

.calendar .month {
	padding: 2px;
	color: white;
	text-align: center;
	border-left: solid 1px black;
	border-right: solid 1px black;
	border-top: solid 1px black;
	background-color: #F09CA7;
}

.toolbar svg {
	height: 20px;
	width: 20px;
}

.toolbar svg .glyph{
	fill: #ccc;
}

.toolbar a:hover .glyph{
	fill: #111;
}

.calendar .date {
	background-color: white;
	color: #515151;
	font-weight: bold;
	text-align: center;
	font-size: 1.8em;
	border: solid 1px black;
}

.calendar .time {
	font-size: 0.7em;
	background-color: white;
	border-left: solid 1px black;
	border-right: solid 1px black;
	border-bottom: solid 1px black;
	text-align: center;
}

.originButton,
.modifierIcon .label {
	color: [[ColorPalette: :TertiaryDark]];
	font-size: 0.8em;
	text-align: center;
	display: block;
}

.modifierIcon {
	margin-right: 2em;
	position: relative;
	float: right;
}

.tiddler .viewer {
	margin: 0 12em 0 2em;
	padding-bottom: 4em;
	line-height: normal;
}

.viewer pre {
	margin-left: 0;
}

.tiddler .title {
	font-size: 1.7em;
	display: block;
	padding-bottom: 0.5em;
	margin-bottom: 0.4em;
	border-bottom: 0.05em solid [[ColorPalette: :PrimaryDark]];
	word-wrap: break-word;
}

.spaceIcon img {
	height: 40px;
}

.siteIcon .label {
	color: [[ColorPalette: :TertiaryDark]];
}

.siteIcon {
	text-align: center;
}

.tiddler .spaceSiteIcon {
	width: 7em;
	margin-top: -15px;
	position: relative;
	float: left;
	margin-top: 0em;
}

.followButton a {
	color: red;
}

.tiddler {
	position: relative;
	-moz-box-shadow: 2px 2px 8px black;
	-webkit-box-shadow: 2px 2px 8px black;
	filter: progid: DXImageTransform.Microsoft.Shadow(color='#000000', Direction=135, Strength=3);
	box-shadow: 2px 2px 8px black;
	background-color: white;
	margin-bottom: 2em;
	padding: 0;
}

.tiddler .editor {
	padding-left: 1em;
	padding-right: 1em;
}

.tiddler .heading .title {
	margin-left: 5em;
	margin-right: 7em;
	position: relative;
}

.tiddler .headingClear {
	clear: both;
}

.tiddler .subtitle {
	font-size: 0.8em;
	margin-top: 0.2em;
}

.external .spaceSiteIcon a:hover {
	background-color: #8BD69E;
}

.privateNotPublic .spaceSiteIcon a:hover,
.private .spaceSiteIcon a:hover {
	background-color: #DE85B3;
}

.privateAndPublic .spaceSiteIcon a:hover,
.public .spaceSiteIcon a:hover {
	background-color: #BBE7FD;
}

.toolbar {
	position: absolute;
	padding: 1em 1em 0 0;
	top: 0px;
	right: 0px;
}

.tiddler .toolbar .button {
	float: left;
	border: none;
	display: block;
}

.tiddler .toolbar a:hover {
	background-color: #ccc;
	border: solid 1px #000;
}

.tiddler .button.command_closeTiddler {
	float: right;
}

.tiddler .tagged .listTitle {
	display: none;
}

.revButton {
	float: right;
}

/*! EditTemplate specific*/
.tiddler .privacySettings {
	text-align: center;
}

.tiddler .privacySettings .originButton{
	display: inline;
}

.annotationsBox {
	margin-top: 4em;
}

.editorFooter {
	padding: 0.3em 1em;
}

.heading .editor input {
	width: 90%;
	font-size: 1.5em;
}
/*}}}*/
/***
|Name|BinaryUploadPlugin||
|Version|0.1|
|Author|Ben Gillies|
|Type|plugin|
|Description|Upload a binary file to TiddlyWeb|
!Usage
To use:

&lt;&lt;binaryUpload bag:bag_name edit:tags edit:title tags:default_tags&gt;&gt;

bag:bag_name is optional - The file will be saved to the current workspace if bag_name is left out
edit:tags - specifies that you want to tag the file being uploaded
edit:title - specifies that you want to set the title to something other than the filename
tags:default_tags - specifies a default set of tags to apply to the file. Note - require edit:tags to be set

!Requires 
TiddlyWeb
tiddlywebplugins.form

!Code
***/
//{{{
if(!version.extensions.BinaryUploadPlugin)
{ //# ensure that the plugin is only installed once
    version.extensions.BinaryUploadPlugin = { installed: true }
};

config.macros.binaryUpload ={
    fullURL: '',
    handler: function(place, macroName, params, wikifier, paramString, tiddler) {
        params = paramString.parseParams("list",null,true); //jon
        var uploadTo = params[0]['bag']? 'bags/' + params[0]['bag'] : config.defaultCustomFields['server.workspace'];
        var includeFields = {
            tags: params[0]['edit'] && params[0]['edit'].contains('tags') ? true : false,
            title: params[0]['edit'] && params[0]['edit'].contains('title') ? true : false,
            defaultTags: params[0]['tags'] ? params[0]['tags'] : ''
        };
        var baseURL = config.defaultCustomFields['server.host'];
        baseURL += (baseURL[baseURL.length - 1] !== '/') ? '/' : '';
        this.fullURL = baseURL + uploadTo + '/tiddlers';
        
        //create the upload form, complete with invisible iframe
        var iframeName = 'binaryUploadiframe' + Math.random().toString();
        jQuery('<form action="' + this.fullURL + '" method="POST" enctype="multipart/form-data" target="' + iframeName + '" />')
            .append(includeFields['title'] ? '<div class="binaryUploadTitle"><input type="text" name="title" value="Enter Title" /></div>' : '')
            .append('<div class="binaryUploadFile"><input type="file" name="file" /></div>')
            .append(includeFields['tags'] ? '<div class="binaryUploadTags">tags: <input type="text" name="tags" value="' + includeFields['defaultTags'] + '" /></div>' : '')
            .append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" /></div>')
            .submit(function() {
                var fileName = includeFields['title'] ? jQuery('[name=title]input:text', this).val() : jQuery('input:file', this).val();
                if ((!fileName)||(fileName === 'Enter Title')) {
                    fileName = jQuery('input:file', this).val();
                    jQuery('[name=title]input:text', this).val(fileName);
                }
                if (!fileName)
                    return false; //the user hasn't selected a file yet
                this.action += '?redirect=/bags/common/tiddlers.txt?select=title:'+fileName; //we need to go somewhere afterwards to ensure the onload event triggers
                jQuery(place).append(jQuery('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
                config.macros.binaryUpload.iFrameLoader(iframeName, fileName, place);
                return true;
            }).appendTo(place);
        
    },
    iFrameLoader: function(iframeName, fileName, place) {
        var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
        
        var finishedLoading = function() {
            displayMessage('File "' + fileName + '" successfully uploaded');
            jQuery.getJSON(config.macros.binaryUpload.fullURL + '/' + fileName + '.json', function(file) {
                config.macros.binaryUpload.displayFile(place, fileName, file);
                jQuery(iframe).remove();
            });
        }
        var iFrameLoadHandler = function() {
            finishedLoading.apply();
            return;
        }
        
        iframe.onload = iFrameLoadHandler;
        //IE
        completeReadyStateChanges = 0;
        iframe.onreadystatechange = function() {
            if (++(completeReadyStateChanges) == 3) {
                iFrameLoadHandler();
            }
        }
    },
    createMockTiddler: function(place, fileName, file) {
        var tiddler = store.getTiddler(fileName);
        if (!tiddler) {
            tiddler = new Tiddler(fileName);
        }
        
        var mimeType = file.type;
        
        if (/^image\//.test(mimeType)) {
            tiddler.text = '[img[' + config.macros.binaryUpload.fullURL + '/' + fileName + ']]';
        } else {
            tiddler.text = '[[' + fileName + '|' + config.macros.binaryUpload.fullURL + '/' + fileName + ']]';
        }
        
        tiddler.tags = file.tags;
        
        if (store.getTiddler(fileName)) {
            tiddler.modifier = config.options.txtUserName;
            tiddler.fields['server.page.revision'] = parseInt(tiddler.fields['server.page.revision']) + 1;
            tiddler.fields['server.permissions'] = 'read, delete';
        } else {
            tiddler.creator = config.options.txtUserName;
            tiddler.modifier = config.options.txtUserName;
            tiddler.fields = merge({}, config.defaultCustomFields);
            tiddler.fields.doNotSave = true;
            tiddler.fields['server.content-type'] = mimeType;
            tiddler.fields['server.page.revision'] = 1;
            tiddler.fields['server.bag'] = file.bag;
            tiddler.fields['server.workspace'] = 'bags/' + file.bag;
            if (file.recipe) tiddler.fields['server.recipe'] = file.recipe;
            tiddler.fields['server.title'] = file.title;
            tiddler.fields['server.permissions'] = 'read, delete';
            var dirty = store.isDirty();
            store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, null, tiddler.tags, tiddler.fields, true, null, tiddler.creator);
            story.setDirty(tiddler.title, false);
            if (!dirty) store.setDirty(false);
        }
        saveChanges();
    },
    displayFile: function(place, fileName, file) {
        this.createMockTiddler(place, fileName, file);
        story.displayTiddler(place, fileName);
    }
}
//}}}
/***
|''Name''|TiddlySpaceChangePassword|
|''Version''|0.2.0|
|''Author''|Osmosoft|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceChangePassword.js|
|''Requires''|TiddlyWebConfig TiddlySpaceUserControls|
!HTMLForm
<form action="#">
	<fieldset>
		<legend />
		<dl>
			<dt>Current password:</dt>
			<dd>
				<input type="password" name="password" />
			</dd>
			<dd>
				<dt>New password:</dt>
				<input type="password" name="new_password" />
				<dt>Confirm new password:</dt>
				<input type="password" name="new_password_confirm" />
			</dd>
		</dl>
		<p class="annotation" />
		<input type="submit" />
	</fieldset>
</form>
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;
var displayError = config.macros.TiddlySpaceLogin.displayError;

var macro = config.macros.TiddlySpaceChangePassword = {
	locale: {
		label: "Change password",
		cpwSuccess: "Password changed",
		noPasswordError: "Please enter password",
		passwordMatchError: "Error: passwords do not match",
		passwordShortError: "Error: password must be at least %0 characters",
		passwordAuthError: "Error: old password is incorrect",
		passwordMinLength: 6
	},
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		$(macro.formTemplate).submit(macro.onSubmit).
			find("legend").text(macro.locale.label).end().
			find(".annotation").hide().end().
			find("[type=submit]").val(macro.locale.label).end().
			appendTo(place);
	},

	onSubmit: function(ev) {
		var msg = macro.locale;
		var form = $(this).closest("form");
		form.find(".annotation").hide();
		var password = form.find("[name=password]").val();
		var npassword = form.find("[name=new_password]").val();
		var npasswordConfirm = form.find("[name=new_password_confirm]").val();
		var xhr, ctx;
		if(npassword != npasswordConfirm) {
			xhr = { status: 409 }; // XXX: hacky
			ctx = {
				msg: {
					409: msg.passwordMatchError
				},
				form: form,
				selector: "[name=new_password], [name=new_password_confirm]"
			};
			displayError(xhr, null, null, ctx);
		} else if(npassword.length < msg.passwordMinLength) {
			xhr = { status: 409 }; // XXX: hacky
			ctx = {
				msg: {
					409: msg.passwordShortError.format([msg.passwordMinLength])
				},
				form: form,
				selector: "[name=new_password]"
			};
			displayError(xhr, null, null, ctx);
		} else {
			macro.changePassword(tweb.username, password, npassword);
		}
		return false;
	},

	changePassword: function(username, password, npassword, form) {
		var pwCallback = function(resource, status, xhr) {
			displayMessage(macro.locale.cpwSuccess);
		};
		var pwErrback = function(xhr, error, exc) {
			var ctx = {
				msg: {
					400: macro.locale.passwordAuthError
				},
				form: form,
				selector: "[name=password]"
			};
			displayError(xhr, null, null, ctx);
		};
		var user = new tiddlyweb.User(username, password, tweb.host);
		user.setPassword(npassword, pwCallback, pwErrback);
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceSpaces|
|''Version''|0.5.1|
|''Description''|TiddlySpace spaces management|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceSpaces.js|
|''Requires''|TiddlyWebConfig TiddlySpaceInclusion TiddlySpaceUserControls|
!HTMLForm
<form action="#">
	<fieldset>
		<legend />
		<dl>
			<dt>Name:</dt>
			<dd><input type="text" name="space" /></dd>
		</dl>
		<p>
			<input type="checkbox" name="subscribe" />
			Include the current space in the new space.
		</p>
		<p class="annotation" />
		<input type="submit" />
	</fieldset>
</form>
!Code
***/
//{{{
(function($) {

var host = config.extensions.tiddlyweb.host;
var macro = config.macros.TiddlySpaceSpaces = { // TODO: rename
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
	locale: {
		listError: "error listing spaces: %0",
		addLabel: "Create space",
		addSuccess: "created space %0",
		conflictError: "space <em>%0</em> already exists",
		charError: "error: invalid space name - must only contain lowercase " +
			"letters, digits or hyphens",
		noSpaces: "you have no spaces"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").appendTo(place);
		var mode = params[0] || "list";
		if(mode == "add") {
			container.append(this.generateForm());
		} else {
			this.refresh(container);
		}
	},
	refresh: function(container) {
		container.empty().append("<ul />");
		$.ajax({ // XXX: DRY; cf. TiddlySpaceInclusion
			url: host + "/spaces?mine=1",
			type: "GET",
			success: function(data, status, xhr) {
				var spaces = $.map(data, function(item, i) {
					var link = $("<a />", {
						href: item.uri,
						text: item.name
					});
					return $("<li />").append(link)[0];
				});
				var el = $("ul", container);
				if(data.length > 0) {
					el.append(spaces);
				} else { // XXX: should never occur!?
					$('<p class="annotation" />').text(macro.locale.noSpaces).
						replaceAll(el);
				}
			},
			error: function(xhr, error, exc) {
				displayMessage(macro.locale.listError.format([error]));
			}
		});
	},
	generateForm: function() {
		return $(this.formTemplate).submit(this.onSubmit).
			find("legend").text(this.locale.addLabel).end().
			find(".annotation").hide().end().
			find("[type=submit]").val(this.locale.addLabel).end();
	},
	onSubmit: function(ev) {
		var form = $(this).closest("form");
		var container = form.closest("div");
		var space = form.find("[name=space]").val();
		var subscribe = form.find("[name=subscribe]").attr("checked");
		space = new tiddlyweb.Space(space, host);
		var displayError = config.macros.TiddlySpaceLogin.displayError;
		var ns = config.extensions.tiddlyspace;
		var callback = function(resource, status, xhr) {
			if(subscribe) {
				config.macros.TiddlySpaceInclusion.inclusion(
					ns.currentSpace.name, space.name);
			}
			var link = $('<a href="javascript:;" />').text(space.name); // TODO: calculate URL
			var el = $("ul", container);
			$("<li />").append(link).hide().appendTo(el).
				slideDown(function() {
					$(this).css("display", ""); // required to neutralize animation remnants
					macro.refresh(container); // XXX: hack to add URL (see above)
				});
		};
		var errback = function(xhr, error, exc) { // TODO: DRY (cf. TiddlySpaceLogin)
			var ctx = {
				msg: { 409: macro.locale.conflictError.format([space.name]) },
				form: form,
				selector: "[name=space]"
			};
			displayError(xhr, error, exc, ctx);
		};
		if(ns.isValidSpaceName(space.name)) {
			space.create(callback, errback);
		} else {
			xhr = { status: 409 }; // XXX: hacky
			var ctx = {
				msg: { 409: macro.locale.charError },
				form: form,
				selector: "[name=space]"
			};
			displayError(xhr, null, null, ctx);
		}
		return false;
	}
};

})(jQuery);
//}}}
<<bootUpFamilyTree>>
<!--{{{-->
<div macro='slideRevision'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes more:popup'></div>
<div class="followPlaceHolder" macro="followTiddlers"></div>
<div class='heading'>
	<div class='spaceSiteIcon' macro='tiddlerOrigin label:yes height:48 width:48'></div>
	<div class='modifierIcon'
		macro="view modifier SiteIcon label:yes height:48 width:48 labelPrefix:'modified by '">
	</div>
	<div class='title' macro='view title'></div>
	<div class='tagClear'></div>
</div>
<div class='tagClear'></div>
<div class='concertina' ></div>
<div class='content'>
	<div class='info'>
		<div class='calendar'>
			<div class='month' macro='view modified date mmm'></div>
			<div class='date' macro='view modified date 0DD'></div>
			<div class='time' macro='view modified date 0hh:0mm'></div>
		</div>
		<div class='tagClear'></div>
		<div class='tagged' macro='tags'></div>
	</div>
	<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagClear'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagClear'></div>
<!--}}}-->
<<TiddlySpaceSpaces add>>
You are currently a member of the following spaces.
{{inlineList{
<<TiddlySpaceSpaces list>>
}}}
{{backstageClear{}}}
<<tabs txtSpaceTab
	members Members BackstageSpaceMembers
	includes "include spaces" BackstageSpaceInclusions
	tiddlers "tiddlers control panel" BackstageTiddlers
	plugins "Manage installed plugins" PluginManager
	options "TiddlyWiki options" BackstageOptions
	tweaks "Tweak the appearance and behaviour of TiddlyWiki" AdvancedOptions
	"import" "Import tiddlers from a TiddlyWiki" BackstageFileImport
>>
Welcome to your brand new TiddlySpace.

To get started with this blank [[TiddlySpace]], you'll need to modify the following tiddlers:
* If you don't like the color scheme click <<RandomColorPaletteButton>> to generate a new random color scheme.
* Upload a SiteIcon. A SiteIcon gives your space an identity to make it recognisable to others. A good site icon will be square and at least 48*48 pixels size.
<<binaryUploadPublic title:SiteIcon>>
* [[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 TiddlySpace is opened
* Many features of TiddlySpace are accessed via the backstage bar located at the top of the page. You can toggle it on or off using the button in the top right corner of the screen.
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.7.1|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''Requires''|TiddlySpaceConfig|
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

var cmd = config.commands.publishTiddler = {
	text: "publish",
	tooltip: "Change the public/private state of this tiddler",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		if(readOnly || !store.tiddlerExists(tiddler.title)) {
			return false;
		}
		var space = tiddlyspace.determineSpace(tiddler, true);
		return space && space.name == tiddlyspace.currentSpace.name &&
			space.type == "private";
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			var newBag = cmd.toggleBag(tiddler.fields["server.bag"]);
			this.moveTiddler(tiddler, {
				title: tiddler.title,
				fields: { "server.bag": newBag }
			});
		}
	},
	toggleBag: function(bag, to) {
		var newBag;
		if(typeof bag != typeof "") {
			var tiddler = bag;
			bag = tiddler.fields["server.bag"];
		}
		if(bag.indexOf("_private") > -1) { // should make use of endsWith
			to = to ? to : "public";
			newBag = bag.replace("_private", "_" + to);
		} else {
			to = to ? to : "private";
			newBag = bag.replace("_public", "_" + to);
		}
		return newBag;
	},
	toggleWorkspace: function(workspace, to) {
		if(typeof workspace != typeof "") {
			var tiddler = workspace;
			var bag = tiddler.fields["server.bag"];
			workspace = bag ? "bags/%0".format([bag]) : tiddler.fields["server.workspace"];
		}
		var newWorkspace;
		if(workspace.indexOf("_private") > -1) { // should make use of endsWith
			to = to ? to : "public";
			newWorkspace = workspace.replace("_private", "_" + to);
		} else {
			to = to ? to : "private";
			newWorkspace = workspace.replace("_public", "_" + to);
		}
		return newWorkspace;
	},
	copyTiddler: function(title, newBag, callback) {
		var original = store.getTiddler(title);
		var adaptor = original.getAdaptor();
		var publish = function(original, callback) {
			var tiddler = $.extend(new Tiddler(original.title), original);
			tiddler.fields = $.extend({}, original.fields, {
				"server.bag": newBag,
				"server.workspace": "bags/%0".format([newBag]),
				"server.page.revision": "false"
			});
			adaptor.putTiddler(tiddler, null, null, callback);
		};
		publish(original, callback);
	},
	moveTiddler: function(tiddler, newTiddler, withRevisions, callback) {
		if(withRevisions) {
			this.moveTiddlerWithRevisions(tiddler, newTiddler, callback);
		} else {
			var info = {
				copyContext: {},
				deleteContext: {}
			};
			var _dirty = store.isDirty();
			var adaptor = tiddler.getAdaptor();
			var newTitle = newTiddler.title;
			var oldTitle = tiddler.title;
			delete tiddler.fields["server.workspace"];
			var oldBag = tiddler.fields["server.bag"];
			var newBag = newTiddler.fields["server.bag"];
			var newWorkspace = "bags/%0".format([newBag]);
			cmd.copyTiddler(oldTitle, newBag, function(ctx) {
					info.copyContext = ctx;
					var context = {
						tiddler: tiddler,
						workspace: newWorkspace
					};
					tiddler.title = oldTitle; // for cases where a rename occurs
					if(ctx.status) { // only do if a success
						if(oldBag != newBag) {
							adaptor.deleteTiddler(tiddler, context, {}, function(ctx) {
								info.deleteContext = ctx;
								var el;
								if(tiddler) {
									tiddler.fields["server.workspace"] = newWorkspace;
									tiddler.fields["server.bag"] = newBag;
									store.addTiddler(tiddler);
								}
								if(oldTitle != newTitle) {
									store.removeTiddler(oldTitle);
									el = story.closeTiddler(oldTitle);
								}
								el = el ? el : story.refreshTiddler(newTitle, true);
								if(el) {
									story.displayTiddler(el, newTitle);
								}
								if(callback) {
									callback(info);
								}
								store.setDirty(_dirty);
							});
						} else {
							if(callback) {
								callback(info);
							}
							story.refreshTiddler(newTitle, true);
						}
					}
			});
		}
	},
	moveTiddlerWithRevisions: function(tiddler, newTiddler, callback) {
		var adaptor = tiddler.getAdaptor();
		var oldBag = tiddler.fields["server.bag"];
		var oldTitle = tiddler.title;
		var newTitle = newTiddler.title;
		var newBag = newTiddler.fields["server.bag"];
		delete tiddler.fields["server.workspace"];
		delete newTiddler.fields["server.workspace"];
		var oldWorkspace = "bags/%0".format([oldBag]);
		var newWorkspace = "bags/%0".format([newBag]);
		var info = {};
		if(oldBag == newBag) { // we are in a dangerous error state
			return callback ? callback(info) : false;
		}
		// we first must delete any existing public revisions
		tiddler.title = newTitle;
		tiddler.fields["server.bag"] = newBag;
		tiddler.fields["server.workspace"] = newWorkspace;
		tiddler.fields["server.page.revision"] = "false"; // force this action
		adaptor.deleteTiddler(tiddler, {}, {},
			function(ctx) {
				info.deleteContext = ctx;
				tiddler.fields["server.workspace"] = oldWorkspace;
				tiddler.fields["server.bag"] = oldBag; // rectify above change to workspace
				adaptor.moveTiddler(
					{ title: oldTitle, workspace: oldWorkspace },
					{ title: newTitle, workspace: newWorkspace },
					{}, {},
					function(context) {
						info.moveContext = context;
						if(context.status) {
							var newTiddler = context.tiddler;
							newTiddler.fields["server.workspace"] = newWorkspace;
							// some some reason the old tiddler is not being removed from the store (hence next 3 lines)
							var oldDirty = store.isDirty();
							store.removeTiddler(oldTitle);
							store.setDirty(oldDirty);
							store.addTiddler(newTiddler); // note the tiddler may have changed name
							var old = story.refreshTiddler(oldTitle, true);
							if(old) {
								story.displayTiddler(old, newTitle);
							}
						}
						if(callback) {
							callback(info);
						}
					}
				);
		});
	}
};

config.commands.changeToPrivate = {
	text: "make private",
	tooltip: "turn this public tiddler into a private tiddler",
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var newBag = cmd.toggleBag(tiddler, "private");
		var newTiddler = { title: title, fields: { "server.bag": newBag }};
		cmd.moveTiddler(tiddler, newTiddler, true);
	}
};
config.commands.changeToPublic = {
	text: "make public",
	tooltip: "turn this private tiddler into a public tiddler",
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var newBag = cmd.toggleBag(tiddler, "public");
		var newTiddler = { title: title, fields: { "server.workspace": newBag }};
		cmd.moveTiddler(tiddler, newTiddler, true);
	}
};

config.commands.deleteTiddler.deleteResource = function(tiddler, bag, userCallback) {
	var workspace = "bags/%0".format([bag]);
	var oldDirty = store.isDirty();
	var originalBag = tiddler.fields["server.bag"];
	var originalWorkspace = "bags/%0".format([originalBag]);
	var deleteLocal = originalWorkspace == workspace;
	var context = {
		tiddler: tiddler,
		workspace: workspace
	};
	tiddler.fields["server.bag"] = bag;
	tiddler.fields["server.workspace"] = context.workspace;
	tiddler.fields["server.page.revision"] = "false";
	var defaultWorkspace = config.defaultCustomFields["server.workspace"];
	delete tiddler.fields["server.etag"];
	var callback;
	if(deleteLocal) {
		var _dirty = store.isDirty();
		callback = function(context, userParams) {
			var title = tiddler.title;
			store.removeTiddler(title);
			context.adaptor.getTiddler(title, { workspace: defaultWorkspace }, null, function(context) {
				if(context.status) {
					store.addTiddler(context.tiddler);
					story.refreshTiddler(title, null, true);
					userCallback(context);
				}
				store.setDirty(_dirty);
			});
		};
	} else {
		callback = function(context, userParams) {
			if(context.status) {
				tiddler.fields["server.workspace"] = originalWorkspace;
				tiddler.fields["server.bag"] = originalBag;
				story.refreshTiddler(tiddler.title, null, true);
				store.setDirty(oldDirty); // will fail to delete locally and throw an error
			}
			if(userCallback) {
				userCallback(context);
			}
		};
	}
	tiddler.getAdaptor().deleteTiddler(tiddler, context, {}, callback);
};

config.commands.deletePublicTiddler = {
	text: "delete public",
	tooltip: "Delete any public versions of this tiddler",
	isEnabled: function(tiddler) {
		return tiddler.fields["server.workspace"];
	},
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var bag = cmd.toggleBag(tiddler, "public");
		config.commands.deleteTiddler.deleteResource(tiddler, bag);
	}
};

config.commands.deletePrivateTiddler = {
	text: "delete private",
	tooltip: "delete any private versions of this tiddler",
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var bag = cmd.toggleBag(tiddler, "private");
		config.commands.deleteTiddler.deleteResource(tiddler, bag);
	}
};
/* Save as draft command */
config.commands.saveDraft = {
	text: "save draft",
	tooltip: "Save as a private draft",
	isEnabled: function(tiddler) {
		if(tiddler) {
			var workspace = tiddler.fields["server.workspace"];
			if(workspace && workspace.indexOf("_public") > -1) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	},
	handler: function(ev, src, title) {
		// TODO: when creating a draft also copy over revisions from the public version
		var tiddler = store.getTiddler(title); // original tiddler
		var tidEl = story.getTiddler(title);
		var fields = {};
		story.gatherSaveFields(tidEl, fields);
		var extendedFields = merge({}, config.defaultCustomFields);
		var currentSpace = tiddlyspace.currentSpace.name;
		var privateWorkspace = "recipes/%0_private".format([currentSpace]);
		var draftTitle;
		var draftNum = "";
		while(!draftTitle) {
			var suggestedTitle = "%0 [draft%1]".format([title, draftNum]);
			if(store.getTiddler(suggestedTitle)) {
				draftNum = !draftNum ? 2 : draftNum + 1;
			} else {
				draftTitle = suggestedTitle;
			}
		}

		extendedFields["server.publish.name"] = title;
		extendedFields["server.workspace"] = privateWorkspace;
		var newDate = new Date();
		for(var n in fields) {
			if(!TiddlyWiki.isStandardField(n)) {
				extendedFields[n] = fields[n];
			}
		}
		tiddler = store.saveTiddler(draftTitle, draftTitle, fields.text, config.options.txtUserName,
			newDate, fields.tags, extendedFields);
		autoSaveChanges(null, [tiddler]);
		story.closeTiddler(title);
		story.displayTiddler(src, draftTitle);
		return draftTitle;
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.5.4|
|''Description''|Provides a TiddlySpace version of the backstage|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin|
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var imageMacro = config.macros.image;

if(config.options.chkBackstage === undefined) {
	config.options.chkBackstage = true;
}

config.backstageTasks = [];

config.tasks.login = {
	text: "login",
	tooltip: "TiddlySpace login",
	content: "<<tiddler BackstageLogin>>"
};
config.backstageTasks.push("login");

config.tasks.user = {
	text: "user:&nbsp;",
	tooltip: "user control panel",
	content: "<<tiddler BackstageUser>>"
};
config.backstageTasks.push("user");

config.tasks.space = {
	text: "space:&nbsp;",
	tooltip: "space control panel",
	content: "<<tiddler BackstageSpace>>",
	className: "right"
};
config.backstageTasks.push("space");

config.messages.backstage.prompt = "";
// initialize state
var _show = backstage.show;
backstage.show = function() {
	// selectively hide backstage tasks based on user status
	var tasks = $("#backstageToolbar .backstageTask").show();
	tweb.getUserInfo(function(user) {
		if(user.anon) {
			tasks.slice(1, 2).hide();
		} else {
			tasks.eq(0).hide();
		}
	});
	// display backstage
	return _show.apply(this, arguments);
};

var _init = backstage.init;
backstage.init = function(){
	_init.apply(this, arguments);

	var backstageArea = $("#backstageArea");

	// override user button (logged in) to show username
	var userBtn = $(".backstageTask[task=user]").
		html('<span>%0<span class="txtUserName" /></span>'.format([
			config.tasks.user.text]));
	config.macros.option.handler($(".txtUserName", userBtn)[0], null, ["txtUserName"]);

	// override show button with an svg image
	var showBtn = $("#backstageShow")[0];
	var altText = $(showBtn).text();
	$(showBtn).empty();
	imageMacro.renderImage(showBtn, "backstage.svg",
		{ alt: altText, width: 60, height: 60 });

	// override hide button
	var hideBtn = $("#backstageHide")[0];
	altText = $(hideBtn).text();
	$(hideBtn).empty();
	imageMacro.renderImage(hideBtn, "close.svg",
		{ alt: altText, width: 24, height: 24 });

	var backstageToolbar = $("#backstageToolbar")[0];
	var backstageLogo = $('<div id="backstageLogo" />').
		prependTo(backstageToolbar)[0];
	var iconName = readOnly ? "publicIcon" : "privateAndPublicIcon";
	imageMacro.renderImage(backstageLogo, iconName, { width: 24, height: 24 });
	// construct the tiddlyspace logo
	$('<span class="logoText"><span class="privateLightText">tiddly</span>' +
			'<span class="publicLightText">space</span></span>').
		appendTo(backstageLogo);

	// override space button to show SiteIcon
	var siteIcon = store.getTiddler("SiteIcon");
	if(siteIcon) {
		var spaceName = tiddlyspace.currentSpace.name;
		var btn = $("[task=space]", backstageArea);
		btn.empty();
		var uri = "/bags/%0_public/tiddlers/SiteIcon".format([spaceName]);
		imageMacro.renderImage(btn[0], uri,
			{ imageClass:"spaceSiteIcon", height: 24, width: 24 });
		$("<span />").html(config.tasks.space.text).appendTo(btn);
		$('<span class="spaceName" />').text(spaceName).appendTo(btn);
	}

	tweb.getUserInfo(function(user) {
		if(!user.anon) {
			var src = tiddlyspace.getAvatar(tweb.status.server_host, user.name);
			var container = $("<span />").appendTo("[task=user]", backstageArea)[0];
			imageMacro.renderImage(container, src,
				{ imageClass:"userSiteIcon", height: 24, width: 24 });
		}

		// override login button to show default avatar
		var loginBtn = $("[task=login]", backstageArea);
		loginBtn.html("<span>%0</span>".format([config.tasks.login.text]));
		imageMacro.renderImage(loginBtn[0], "/bags/common/tiddlers/defaultUserIcon",
			{ imageClass:"userSiteIcon", height: 24, width: 24 });

		var tasks = $(".backstageTask");
		for(var i = 0; i < tasks.length; i++) {
			var btn = $(tasks[i]);
			var taskName = btn.attr("task");
			btn.addClass("task_%0".format([taskName]));
		}
	});
};

})(jQuery);
//}}}
<!--{{{-->
<div macro='tiddlerGender'>
	<div class='tiddlerContainer'>
		<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
		<div>
			<span class='title' macro='view title'></span>&nbsp;<span macro='makeRootLink'></span>
		</div>
<div class="tiddlerOrigin" macro="tiddlerOrigin"></div>
<div class="modifier" macro="view modifier SiteIcon width:48 height:48"></div>
<div class='concertina'></div>
		<span class='ftdob' macro='aet if:dob|dod'>
			(<span macro='view dob year'></span>
			<span macro='aet if:dod'>-</span>
			<span macro='view dod year'></span>)
		</span>
		<div class='subtitle'>
			last modified <span macro='view modified date'></span> 
			(<span macro='message views.wikified.createdPrompt'></span>
			 <span macro='view created date'></span>)
		</div>
		<div class='subtitle'>
			<span macro='aet if:mother|father'>Child of</span>
			<span macro='view father link'></span>
			<span macro='aet if:father&mother'>and</span>
			<span macro='view mother link'></span><br/>
			<span macro='aet if:spouse'>Spouse(s): </span>
			<span macro='view spouse bracketedlist'></span>
		</div>
		<h3>Children of <span macro='view title'></span></h3>
		<div macro='listchildren filter:[sort[dob]]'></div>
		<div class='tagging' macro='tagging'></div>
		<div class='tagged' macro='tags'></div>

		<h3>Facts</h3>
		<div class='factbox'>
			<div>
				<span macro='aet if:dob&!dod'>
					current age: <span macro='age'></span>
				</span>
				<span macro='aet if:!dob&!placeofbirth&!occupation&!dod&!placeofdeath'>No facts.</span>
				<span macro='aet if:dob'>
					born <span macro='view dob date'></span>
				</span>
				<span macro='aet if:placeofbirth'>in </span>
				<span macro='view placeofbirth link'></span>
			</div>
			<div>
				<span macro='aet if:occupation'>occupation </span><span macro='view occupation'></span>
			</div>
			<div>
				<span macro='aet if:dod'>died </span>
				<span macro='view dod date'></span>
				<span macro='aet if:placeofdeath'> in </span>
				<span macro='view placeofdeath link'></span>
				<span macro='aet if:dod&dob'> 
					aged <span macro='age'></span>
				</span>
			</div>
		</div>
		<h3>Further Information</h3>
		<div class='viewer' macro='view text wikified'></div>
		<div class='tagClear'></div>
	</div>
</div>
<!--}}}-->
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.2|
|''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.6.0|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.2 (2010-03-04)
* suppressed wikification in diff view
!!v0.3 (2010-04-07)
* restored wikification in diff view
* added link to side-by-side 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 = 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",
	linkLabel: "side-by-side view",
	revSuffix: " [rev. #%0]",
	diffSuffix: " [diff: #%0 #%1]",
	dateFormat: "YYYY-0MM-0DD 0hh:0mm",
	listError: "revisions could not be retrieved",

	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) {
		removeNode(userParams.loading);
		if(context.status) {
			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);
			};
			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)!?
			}
		} else {
			$("<li />").text(cmd.listError).appendTo(userParams.popup);
		}
	},

	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" + context.diff + "\n}}}";
		tiddler.tags = ["diff"];
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		var tiddlerEl = story.displayTiddler(src, tiddler);
		var uri = context.uri.replace("format=unified", "format=horizontal");
		var link = $('<a target="_blank" />').attr("href", uri).text(cmd.linkLabel);
		$(".viewer", tiddlerEl).prepend(link);
	},

	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];
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInclusion|
|''Version''|0.5.1|
|''Description''|provides user interfaces for managing TiddlySpace inclusions|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceInclusion.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceUserControls chrjs|
!HTMLForm
<form action="#">
	<fieldset>
		<legend />
		<p class="description" />
		<dl>
			<dt class="_passive">Space Name:</dt>
			<dd class="_passive"><input type="text" name="space" /></dd>
			<dt class="_active">Space Selection:</dt>
			<dd class="_active">
				<select>
					<option></option>
				</select>
			</dd>
		</dl>
		<p class="annotation" />
		<input type="submit" />
	</fieldset>
</form>
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;
var currentSpace = config.extensions.tiddlyspace.currentSpace.name;

var macro = config.macros.TiddlySpaceInclusion = {
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
	locale: {
		addPassiveLabel: "Include space",
		addActiveLabel: "Include into space",
		passiveDesc: "Include a space into the current space",
		activeDesc: "Include another space in the current space",
		addSuccess: "included %0 in %1",
		delPrompt: "Are you sure you want to exclude %0 from the current space?",
		delTooltip: "click to exclude from the space",
		delError: "error excluding %0: %1",
		listError: "error retrieving spaces included in space %0: %1",
		forbiddenError: "unauthorized to modify space <em>%0</em>",
		noSpaceError: "space <em>%0</em> does not exist",
		conflictError: "space <em>%0</em> is already included in <em>%1</em>",
		noInclusions: "no spaces are included",
		recursiveInclusions: "Spaces included by the removed space are highlighted and should be removed manually.",
		reloadPrompt: "The page must be reloaded for inclusion to take effect. Reload now?"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		// passive mode means subscribing given space to current space
		// active mode means subscribing current space to given space
		this.name = macroName;
		var mode = params[0] || "list";
		var form = $(this.formTemplate).
			find(".annotation").hide().end();
		if(mode == "passive") {
			if(!readOnly) {
				form.submit(function(ev) { return macro.onSubmit(this, mode); }).
					find("._active").remove().end().
					find("legend").text(this.locale.addPassiveLabel).end().
					find(".description").text(this.locale.passiveDesc).end().
					find("[type=submit]").val(this.locale.addPassiveLabel).end().
					appendTo(place);
			}
		} else if(mode == "active") {
			form.submit(function(ev) { return macro.onSubmit(this, mode); }).
				find("._passive").remove().end().
				find("legend").text(this.locale.addActiveLabel).end().
				find(".description").text(this.locale.activeDesc).end().
				find("[type=submit]").val(this.locale.addActiveLabel).end().
				appendTo(place);
			this.populateSpaces(form);
		} else {
			var container = $("<div />").addClass(this.name).appendTo(place);
			$('<p class="annotation" />').hide().appendTo(container);
			this.listInclusions(container);
		}
	},
	listInclusions: function(container) {
		var recipe = new tiddlyweb.Recipe(currentSpace + "_public", tweb.host);
		recipe.get(function(recipe, status, xhr) {
			var inclusions = $.map(recipe.recipe, function(item, i) { // TODO: refactor to canonicalize; move to TiddlySpaceConfig!?
				var arr = item[0].split("_public");
				return (arr[0] != currentSpace && arr[1] === "") ? arr[0] : null;
			});
			var items = $.map(inclusions, function(item, i) { // TODO: DRY (cf. displayMembers)
				var link = $("<a />").text(item);
				tweb.getStatus(function(status) {
					var uri = config.extensions.tiddlyspace.getHost(
						status.server_host, item);
					link.attr("href", uri);
				});
				var btn = $('<a class="deleteButton" href="javascript:;" />').
					text("x"). // TODO: i18n (use icon!?)
					attr("title", macro.locale.delTooltip).
					data("space", item).click(macro.onDelClick);
				if(readOnly) {
					btn.hide();
				}
				return $("<li />").append(link).append(btn)[0];
			});
			if(items.length) {
				$("<ul />").append(items).appendTo(container);
			} else {
				$('<div class="annotation" />').
					text(macro.locale.noInclusions).appendTo(container);
			}
		}, function(xhr, error, exc) {
			displayMessage(macro.locale.listError.format([currentSpace, error]));
		});
	},
	populateSpaces: function(form) { // TODO: rename?
		$.ajax({ // TODO: add to model/space.js?
			url: tweb.host + "/spaces?mine=1",
			type: "GET",
			success: function(data, status, xhr) {
				var spaces = $.map(data, function(item, i) {
					return $("<option />", { value: item.name }).text(item.name)[0];
				});
				$("select", form).append(spaces);
			} // TODO: error handling?
		});
	},
	onSubmit: function(el, mode) {
		var form = $(el).closest("form");
		var selector = mode == "passive" ? "[name=space]" : "select";
		var space = form.find(selector).val();
		var provider = mode == "passive" ? space : currentSpace;
		var subscriber = mode == "passive" ? currentSpace : space;
		var loc = macro.locale;
		var callback = function(data, status, xhr) {
			displayMessage(loc.addSuccess.format([provider, subscriber]));
			if(confirm(loc.reloadPrompt)) {
				window.location.reload();
			}
		};
		var errback = function(xhr, error, exc) {
			if(xhr.status == 409) {
				var included = "already subscribed";
				xhr = { // XXX: hacky
					status: xhr.responseText.indexOf(included) != -1 ? "409a" : "409b"
				};
			}
			var ctx = {
				msg: {
					403: loc.forbiddenError.format([subscriber]),
					404: loc.noSpaceError.format([subscriber]), // XXX: only relevant for passive mode
					"409a": loc.conflictError.format([provider, subscriber]),
					"409b": loc.noSpaceError.format([provider])
				},
				form: form,
				selector: selector
			};
			config.macros.TiddlySpaceLogin.displayError(xhr, error, exc, ctx);
		};
		this.inclusion(provider, subscriber, callback, errback, false);
		return false;
	},
	onDelClick: function(ev) { // XXX: too long, needs refactoring
		var btn = $(this);
		var provider = btn.data("space");

		var msg = macro.locale.delPrompt.format([provider]);
		var callback = function(data, status, xhr) {
			btn.closest("li").slideUp(function(ev) { $(this).remove(); });
		};
		var errback = function(xhr, error, exc) { // XXX: doesn't actually happen
			displayMessage(macro.locale.delError.format([username, error]));
		};
		if(confirm(msg)) {
			var recipe = new tiddlyweb.Recipe(provider + "_public", tweb.host);
			recipe.get(function(recipe, status, xhr) {
				var inclusions = $.map(recipe.recipe, function(item, i) { // XXX: duplicated from above
					var arr = item[0].split("_public");
					return (arr[0] != provider && arr[1] === "") ? arr[0] : null;
				});
				var recursiveMatch = false;
				btn.closest("ul").find("li").each(function(i, node) {
					var space = $(".deleteButton", node).data("space"); // XXX: relying on button is hacky
					if($.inArray(space, inclusions) != -1) {
						recursiveMatch = true;
						$(node).addClass("annotation"); // TODO: proper highlighting
					}
				});
				if(recursiveMatch) {
					btn.closest("." + macro.name).find("> .annotation").
						text(macro.locale.recursiveInclusions).slideDown();
				}
			});
			macro.inclusion(provider, currentSpace, callback, errback, true);
		}
		return false;
	},
	inclusion: function(provider, subscriber, callback, errback, remove) {
		var data = {};
		var key = remove ? "unsubscriptions" : "subscriptions";
		data[key] = [provider];
		$.ajax({ // TODO: add to model/space.js?
			url: tweb.host + "/spaces/" + subscriber,
			type: "POST",
			contentType: "application/json",
			data: $.toJSON(data),
			success: callback,
			error: errback
		});
	}
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1"
 viewBox="416 13 34 34" width="34pt" height="34pt">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 418.78613 28.08259 C 420.0481 20.113405 427.54074 14.6697865 435.51 15.931775
		 C 443.4801 17.193707 448.9237 24.686371 447.6617 32.656437 C 446.3989 40.62574 438.90625
		 46.069302 430.93698 44.807312 C 422.96774 43.545353 417.52328 36.0519 418.78613 28.08259 Z"
		 fill="#c1e6fd"/><path d="M 418.78613 28.08259 C 420.0481 20.113405 427.54074 14.6697865 435.51 15.931775 C
		 443.4801 17.193707 448.9237 24.686371 447.6617 32.656437 C
		 446.3989 40.62574 438.90625 46.069302 430.93698 44.807312 C 422.96774 43.545353 417.52328 36.0519 418.78613
		 28.08259 Z" stroke="#7aa3be" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/>
		<path d="M 433.17715 35.897835 C 429.89737 35.897835 427.23505 33.2355 427.23505 29.955704 
		C 427.23505 26.675049 429.89737 24.013567 433.17715 24.013567 C 436.45694 24.013567 439.11926 26.675049 439.11926
		 29.955704 C 439.11926 33.2355 436.45694 35.897835 433.17715 35.897835 Z" fill="#f4c4e2"/>
		<path d="M 433.17715 35.897835 C 429.89737 35.897835 427.23505 33.2355 427.23505 29.955704 
		C 427.23505 26.675049 429.89737 24.013567 433.17715 24.013567 C 436.45694 24.013567 439.11926 26.675049 439.11926 
		29.955704 C 439.11926 33.2355 436.45694 35.897835 433.17715 35.897835 Z" stroke="#ce81b0" 
		stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/>
	</g>
</g>
</svg>
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.0|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/BinaryTiddlersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
!Code
***/
//{{{
(function($) {

var ctfield = "server.content-type";

var plugin = config.extensions.BinaryTiddlersPlugin = {
	isWikiText: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		if(ctype) {
			return !this.isBinary(tiddler) && !this.isTextual(ctype);
		} else {
			return true;
		}
	},
	// NB: pseudo-binaries are considered non-binary here
	isBinary: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		return ctype ? !this.isTextual(ctype) : false;
	},
	isTextual: function(ctype) {
		return ctype.indexOf("text/") == 0 || this.endsWith(ctype, "+xml");
	},
	endsWith: function(str, suffix) {
		return str.length >= suffix.length &&
			str.substr(str.length - suffix.length) == suffix;
	}
};

// hijack text viewer to add special handling for binary tiddlers
var _view = config.macros.view.views.wikified;
config.macros.view.views.wikified = function(value, place, params, wikifier,
		paramString, tiddler) {
	var ctype = tiddler.fields["server.content-type"];
	if(params[0] == "text" && ctype && !tiddler.tags.contains("systemConfig")) {
		var el;
		if(plugin.isBinary(tiddler)) {
			var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
			if(ctype.indexOf("image/") == 0) {
				el = $("<img />").attr("alt", tiddler.title).attr("src", uri);
			} else {
				el = $("<a />").attr("href", uri).text(tiddler.title);
			}
		} else {
			el = $("<pre />").text(tiddler.text);
		}
		el.appendTo(place);
	} else {
		_view.apply(this, arguments);
	}
};

// hijack edit macro to disable editing of binary tiddlers' body
var _editHandler = config.macros.edit.handler;
config.macros.edit.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	if(params[0] == "text" && plugin.isBinary(tiddler)) {
		return false;
	} else {
		_editHandler.apply(this, arguments);
	}
};

// hijack autoLinkWikiWords to ignore binary tiddlers
var _autoLink = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function() {
	return plugin.isWikiText(this) ? _autoLink.apply(this, arguments) : false;
};

})(jQuery);
//}}}
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.7.0|
|''Description''|Allows the rendering of svg images in a TiddlyWiki|
|''Author''|Osmosoft|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Notes''|Currently only works in modern browsers (not IE)|
|''Usage''|{{{<<image SVG>>}}} will render the text of the tiddler with title SVG as an SVG image (but not in ie where it will fail silently)|
!Notes
Binary tiddlers in TiddlyWeb when passed through the wikifier will be shown as images.
eg. {{{<<view text wikified>>}}} on a binary tiddler will show the image.
{{{<<view fieldname image>>}}}
will render the value of the tiddler field 'fieldname' as an image. This field can contain a tid
{{{<<image SiteIcon>>}}}
will create an image tag where the tiddler has content type beginning image and not ending +xml
will attempt to create svg object in other scenarios
{{{<<image /photos/x.jpg>>}}}
will create an image tag with src /photos/x.jpg as long as there is not a tiddler called /photos/x.jpg in 
which case it will render that tiddler as an image.

!Code
***/
//{{{
(function($) {

var macro = config.macros.image = {
	svgns: "http://www.w3.org/2000/svg",
	xlinkns: "http://www.w3.org/1999/xlink", 
	svgAvailable: document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
	_fixPrefix: 1,
	_external_cache: {},
	isBinaryImageType: function(contentType) {
		if(contentType && contentType.indexOf("image") === 0 &&
			contentType.indexOf("+xml") != contentType.length - 4) {
			return true;
		} else {
			return false;
		}
	},
	isImageTiddler: function(tiddler) {
		return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
	},
	isSVGTiddler: function(tiddler) {
		var type;
		type = tiddler ? tiddler.fields['server.content-type'] : false;
		return type == "image/svg+xml";
	},
	isBinaryImageTiddler: function(tiddler) {
		return macro.isBinaryImageType(tiddler.fields['server.content-type']);
	},
	generateIdPrefix: function(){
		return "tw_svgfix_" + (this._fixPrefix++).toString() + "_";
	},
	fixSVG: function(childNodes,idPrefix) {
		if(!idPrefix) {
			idPrefix = this.generateIdPrefix();
		}
		var urlPattern = /^\s*url\(\#([^\)]*)\)\s*$/ig;
		var fixes = [
		{ attr: "id", namespace: "", pattern: /^(.*)$/ig },
		{ attr: "filter", namespace: "", pattern: urlPattern },
		{ attr: "fill", namespace: "", pattern: urlPattern },
		{ attr: "stroke", namespace: "", pattern: urlPattern },
		{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
		];
		for(var t = 0; t < childNodes.length; t++) {
			var node = childNodes[t];
			for(var a = 0; a < fixes.length; a++) {
				var fix = fixes[a];
				if(node.hasAttributeNS && node.hasAttributeNS(fix.namespace, fix.attr)) {
					var v = node.getAttributeNS(fix.namespace, fix.attr);
					fix.pattern.lastIndex = 0;
					var match = fix.pattern.exec(v);
					if(match) {
						// Make sure replacement string doesn't contain any single dollar signs
						var replacement = (idPrefix + match[1]).replace("$", "$$$$"); 
						v = v.replace(match[1], replacement);
						node.setAttributeNS(fix.namespace, fix.attr,v);
					}
				}
			}
			var children = node.childNodes;
			if(children.length > 0) {
				this.fixSVG(children, idPrefix);
			}
		}
	},
	importSVGfallback: function(place,options){
		// no fallback yet for browsers such as IE
	},
	importSVG: function(place,options){
		if(!options) {
			options = {};
		}
		var tiddlerText = options.tiddler.text;
		var svgDoc;
		if (window.DOMParser) {
			svgDoc = new DOMParser().parseFromString(tiddlerText, "application/xml").documentElement;
			var idPrefix = options.idPrefix || this.generateIdPrefix();
			this.fixSVG([svgDoc], idPrefix);
			var el = document.importNode(svgDoc, true);

			var existingDefs = el.getElementsByTagNameNS(macro.svgns, "defs");
			var elDef;
			if(existingDefs.length === 0) {
				elDef = document.createElementNS(macro.svgns, "defs");
			} else {
				elDef = existingDefs[0];
			}
			if(options.def) {
				for(var i = 0; i < options.def.length; i++) {
					var text = store.getTiddlerText(options.def[i]);
					var def = new DOMParser().parseFromString(text, "application/xml").documentElement;
					this.fixSVG([def], idPrefix);
					elDef.appendChild(document.importNode(def, true));
				}
			}
			el.insertBefore(elDef, el.firstChild);
			var svgHolder = document.createElementNS(macro.svgns,"svg");
			var width = options.width;
			var height = options.height;
			// what if width and height exist in css?
			if(width || height) {
				if(width && height) {
					// set view box of containing svg element based on the svg viewbox and width and height.
					var viewBox = el.getAttribute("viewBox");
					var topLeft = "0 0";
					if(viewBox) {
						topLeft = viewBox.replace(/([0-9]*) +([0-9]*) +([0-9]*) +([0-9]*) */gi,"$1 $2");
					}
					svgHolder.setAttributeNS(macro.svgns, "viewBox", "0 0 %0 %1".format([width, height]));
				} else {
					if(!width) {
						width = el.getAttribute("width");
					}
					if(!height) {
						height = el.getAttribute("height");
					}
				}
				svgHolder.setAttribute("width", width);
				svgHolder.setAttribute("height", height);

				el.setAttribute("width", "100%");
				el.setAttribute("height", "100%");
				svgHolder.setAttribute("class", "svgImage svgIcon %0".format([options.imageClass || ""]));
				svgHolder.appendChild(el);
				place.appendChild(svgHolder);
			}
			else {
				el.setAttribute("class","svgImage svgIcon");
				place.appendChild(el);
			}
			// if a tiddler attribute is set this is read as a link
			jQuery("[tiddler]", place).click(function(ev) {
				var tiddler = $(ev.target).attr("tiddler");
				if(tiddler) {
					story.displayTiddler(ev.target, tiddler);
				}
			});
		}
		else{ 
			this.importSVGfallback(place,options);		
		}
	},
	supportsDataUris: false,
	renderBinaryImageTiddler: function(place, tiddler, options) {
		var ctype = tiddler.fields["server.content-type"] || tiddler.type;
		if(macro.supportsDataUris && ctype) {
			var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
			return macro.renderBinaryImageUrl(place, uri, options);
		} else if(options.src) {
			return macro.renderBinaryImageUrl(place, options.src, options);
		} else {
			var src;
			var fields = tiddler.fields;
			if(fields["server.type"] == 'tiddlyweb') { // construct an accurate url for the resource  
				src = "%0%1/tiddlers/%2".format([fields['server.host'],
					fields['server.workspace'],fields['server.title']]);
			} else { // guess the url for the resource
				src = tiddler.title;
			}
			return macro.renderBinaryImageUrl(place, src, options);
		}
	},
	renderImage: function(place, imageSource, options) {
		var imageTiddler = store.getTiddler(imageSource);
		if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
			return macro.renderBinaryImageTiddler(place, imageTiddler, options);
		} else if(imageTiddler){ // handle the case where we have a tiddler
			return macro.renderSVGTiddler(place, imageTiddler, options);
		} else { // we have a string representing a url
			// check if we can access the json format of this url
			var newplace = $('<div class="externalImage"/>').appendTo(place)[0];
			try{
				var img = new Image();
				img.onload = function(ev) { 
					return macro.renderBinaryImageUrl(newplace, imageSource, options);
				}; 
				img.onerror = function(ev) {
					var renderTiddler = function(tiddler, contentType) {
						macro._external_cache[imageSource] = {tiddler: tiddler, contentType: contentType};
						if(contentType == 'application/json') { // assume tiddlyweb server
							contentType = tiddler.type;
						} else { // try and use the response as tiddler text
							tiddler = {text: tiddler};
						}
						if(macro.isBinaryImageType(contentType)) {
							options.src = imageSource;
							return macro.renderBinaryImageTiddler(newplace, tiddler, options);
						} else {
							return macro.renderSVGTiddler(newplace, tiddler, options);
						}
					};

					var cached = macro._external_cache[imageSource];
					if(cached) { // use cache where possible
						renderTiddler(cached.tiddler, cached.contentType)
					} else {
						ajaxReq({ // deal with tiddlyweb binary images
							url: imageSource,
							beforeSend: function(xhr) {
								xhr.setRequestHeader("Accept", "application/json,*/*");
								xhr.setRequestHeader("X-ControlView", "false"); // for tiddlyspace usage
							},
							success: function(tiddler, status, xhr) {
								if(!tiddler) {
									return macro.renderBinaryImageUrl(newplace, imageSource, options);
								}
								var header = xhr.getResponseHeader("content-type");
								var contentType;
								if(header) {
									header = header ? header.split(";") : [];
									contentType = header[0] || false;
								}
								renderTiddler(tiddler, contentType);
							},
							error: function() {
								return macro.renderBinaryImageUrl(newplace, imageSource, options);
							}
						});
					}
				};
				img.src = imageSource;
			} catch(e) { // the url is external thus our ajax request failed. we could try proxying..
				return macro.renderBinaryImageUrl(newplace, imageSource, options); // attempt to render as image
			}
		}
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler){
		var imageSource = params[0];
		// collect named arguments
		var args = macro.getArguments(paramString, params);
		this.renderImage(place, imageSource, args);		
	},
	renderAlternateText: function(place, options) {
		if(options.alt) {
			$("<div class='svgImageTest svgIconText' />").text(options.alt).appendTo(place);
		}
	},
	renderSVGTiddler: function(place, tiddler, options) {
		if(!options) {
			options = {};
		}
		options.tiddler = tiddler;
		options.fix = true;
		
		if(macro.svgAvailable) {
			this.importSVG(place, options); // display the svg
		} else {
			// instead of showing the image show the alternate text.
			this.renderAlternateText(place, options);
		}
	},
	renderBinaryImageUrl: function(place, src, options) {
		var container = $('<div class="image" />').appendTo(place)[0];
		var image = new Image(); // due to weird scaling issues where you use just a width or just a height
		var createImageTag = function(userW, userH) {
			var img = $("<img />");
			img.attr("src", src);
			img.appendTo(container);
			if(userH) {
				img.attr("height", userH);
			}
			if(userW) {
				img.attr("width", userW);
			}
			img.addClass(options.imageClass);
		};
		
		image.onload = function() {
			var w = image.width;
			var h = image.height;
			var userH = options.height;
			var userW = options.width;
			var ratio;
			if(userH && !userW) {
				ratio = userH / h;
				userW = ratio * w;
			} else if (userW && !userH) {
				ratio = userW / w;
				userH = ratio * h;
			}
			createImageTag(userW, userH);
		};
		image.onerror = function() {
			createImageTag(options.width, options.height);
		};
		image.src = src;
	},
	getArguments: function(paramString, params) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = {};
		for(var id in args) {
			if(true) {
				var p = args[id];
				if(id == "def") {
					options[id] = p;
				} else {
					options[id] = p[0];
				}
			}
		}
		var width = params[1] || false;
		var height = params[2] || false;
		if(width && width.indexOf(":") > -1) {
			width = false;
		}
		if(height && height.indexOf(":") > -1) {
			height = false;
		}
		options.width = macro.lookupArgument(options, "width", width);
		options.height = macro.lookupArgument(options, "height", height);
		return options;
	},
	lookupArgument: function(args, id, ifEmpty) {
		if(args[id]) {
			return args[id];
		} else {
			return ifEmpty;
		}
	}
};

var datauriTest = function() {
	var data = new Image();
	data.onload = function() {
		if(this.width != 1 || this.height != 1) {
			macro.supportsDataUris = false;
		} else {
			macro.supportsDataUris = true;
		}
	};
	data.onerror = data.onload;
	data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
};
datauriTest();

// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
config.macros.view.views.wikified = function(value, place, params, wikifier, paramString, tiddler) {
	if(macro.isImageTiddler(tiddler) && params[0] == "text") {
		var newplace = $('<div class="wikifiedImage" />').appendTo(place)[0];
		macro.renderImage(newplace, tiddler.title, {});
	} else {
		_oldwikifiedview(value, place, params, wikifier, paramString, tiddler);
	}
};
config.macros.view.views.image = function(value, place, params, wikifier, paramString, tiddler) {
	invokeMacro(place, "image", "%0 %1".format([value, params.splice(2).join(" ")]), null, tiddler);
};

config.shadowTiddlers.StyleSheetImageMacro = ".wikifiedImage svg, .wikifiedImage .image { width: 80%; }";
store.addNotification("StyleSheetImageMacro", refreshStyles);

})(jQuery);
//}}}
<<TiddlySpacePublisher>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="918 510 14 14" width="14pt" height="14pt">
<defs>
	<radialGradient cx="0" cy="0" r="1" id="Gradient" gradientUnits="userSpaceOnUse">
		<stop offset="0" stop-color="white"/>
		<stop offset="1" stop-color="#2b2b2b"/>
	</radialGradient>
	<radialGradient id="Obj_Gradient" xl:href="#Gradient" gradientTransform="translate(922.3752 513.7837) scale(11.4739436)"/>
</defs>
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 929.6952 512.9018 C 927.1568 510.36337 923.0412 510.36337 920.5028 512.9018 C 917.9644 515.4402 917.9644 519.5558 920.5028 522.09418 C 923.0412 524.63257 927.1568 524.63257 929.6952 522.09418 C 932.2336 519.5558 932.2336 515.4402 929.6952 512.9018 M 925.099 515.7425 L 927.17633 513.66516 L 928.9318 515.42065 L 926.8545 517.498 L 928.9318 519.57532 L 927.17633 521.3308 L 925.099 519.25348 L 923.02167 521.3308 L 921.2662 519.57532 L 923.3435 517.498 L 921.2662 515.42065 L 923.02167 513.66516 Z" fill="url(#Obj_Gradient)"/>
		<path
	   d="M 927.61447,515.38354 A 4.5120482,4.2590361 0 1 1 918.59037,515.38354 A 4.5120482,4.2590361 0 1 1 927.61447,515.38354 z"
	   transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
	   id="path2394"
	   style="opacity:1;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
	</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="416 13 34 34" width="34pt" height="34pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-06-05 14:34Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.2 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 418.78613 28.08259 C 420.0481 20.113405 427.54074 14.6697865 435.51 15.931775 C 443.4801 17.193707 448.9237 24.686371 447.6617 32.656437 C 446.3989 40.62574 438.90625 46.069302 430.93698 44.807312 C 422.96774 43.545353 417.52328 36.0519 418.78613 28.08259 Z" fill="#c1e6fd"/><path d="M 418.78613 28.08259 C 420.0481 20.113405 427.54074 14.6697865 435.51 15.931775 C 443.4801 17.193707 448.9237 24.686371 447.6617 32.656437 C 446.3989 40.62574 438.90625 46.069302 430.93698 44.807312 C 422.96774 43.545353 417.52328 36.0519 418.78613 28.08259 Z" stroke="#7aa3be" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/><path d="M 433.17715 35.897835 C 429.89737 35.897835 427.23505 33.2355 427.23505 29.955704 C 427.23505 26.675049 429.89737 24.013567 433.17715 24.013567 C 436.45694 24.013567 439.11926 26.675049 439.11926 29.955704 C 439.11926 33.2355 436.45694 35.897835 433.17715 35.897835 Z" fill="white"/><path d="M 433.17715 35.897835 C 429.89737 35.897835 427.23505 33.2355 427.23505 29.955704 C 427.23505 26.675049 429.89737 24.013567 433.17715 24.013567 C 436.45694 24.013567 439.11926 26.675049 439.11926 29.955704 C 439.11926 33.2355 436.45694 35.897835 433.17715 35.897835 Z" stroke="#6a96bd" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="1081 357 41 41"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-06-05 15:00Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.2 --></metadata><defs><linearGradient x1="0" x2="1" id="Gradient" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b8b8b8"/><stop offset=".5" stop-color="black"/><stop offset="1" stop-color="black"/></linearGradient><linearGradient id="Obj_Gradient" xl:href="#Gradient" gradientTransform="translate(1101.07983 359.21158) rotate(90) scale(27)"/><linearGradient x1="0" x2="1" id="Gradient_2" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="white"/><stop offset="1" stop-color="#280000"/></linearGradient><linearGradient id="Obj_Gradient_2" xl:href="#Gradient_2" gradientTransform="translate(1122.6825 365.0514) rotate(149.999995) scale(48.74121)"/></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path d="M 1083.50964 359.21158 C 1083.6959 359.26721 1083.7958 359.29745 1083.7958 359.29745 C 1083.7958 359.29745 1099.2529 358.84064 1109.0364 367.7494 C 1114.3331 372.57196 1116.91943 380.21628 1118.17786 386.21158 L 1118.65015 386.21158 L 1118.65015 359.21158 Z" fill="url(#Obj_Gradient)"/><path d="M 1113.9187 376.45688 C 1115.64136 375.06143 1116.8745 373.04938 1117.24854 370.68896 C 1118.0514 365.61874 1114.5885 360.85217 1109.5182 360.04938 C 1106.0405 359.49866 1102.7052 360.95535 1100.69434 363.56107" fill="#c1e6fd"/><path d="M 1113.9187 376.45688 C 1115.64136 375.06143 1116.8745 373.04938 1117.24854 370.68896 C 1118.0514 365.61874 1114.5885 360.85217 1109.5182 360.04938 C 1106.0405 359.49866 1102.7052 360.95535 1100.69434 363.56107" stroke="#7aa3be" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="1.5"/><path d="M 1111.5276 370.43875 C 1111.71826 369.98734 1111.8236 369.49133 1111.8236 368.97086 C 1111.8236 366.88382 1110.1299 365.19073 1108.04346 365.19073 C 1107.4209 365.19073 1106.8334 365.34143 1106.3154 365.60834" fill="#f4c4e2"/><path d="M 1111.5276 370.43875 C 1111.71826 369.98734 1111.8236 369.49133 1111.8236 368.97086 C 1111.8236 366.88382 1110.1299 365.19073 1108.04346 365.19073 C 1107.4209 365.19073 1106.8334 365.34143 1106.3154 365.60834" stroke="#ce81b0" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="1.5"/><path d="M 1083.79565 359.29755 C 1083.79565 359.29755 1099.2533 358.84064 1109.036 367.74924 C 1118.817 376.6543 1119.3557 395.18008 1119.35815 395.1798 C 1119.3573 395.18008 1118.0963 378.3106 1111.4159 374.57047 C 1104.73865 370.83041 1102.46655 373.58853 1102.46655 373.58853 C 1102.46655 373.58853 1105.8236 370.51877 1102.7499 365.99915 C 1099.68506 361.479 1083.79565 359.29755 1083.79565 359.29755 Z" fill="url(#Obj_Gradient_2)"/><path d="M 1083.79565 359.29755 C 1083.79565 359.29755 1099.2533 358.84064 1109.036 367.74924 C 1118.817 376.6543 1119.3557 395.18008 1119.35815 395.1798 C 1119.3573 395.18008 1118.0963 378.3106 1111.4159 374.57047 C 1104.73865 370.83041 1102.46655 373.58853 1102.46655 373.58853 C 1102.46655 373.58853 1105.8236 370.51877 1102.7499 365.99915 C 1099.68506 361.479 1083.79565 359.29755 1083.79565 359.29755 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width=".5"/></g></g></svg>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
Enter some details about your mum here.
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.5.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
Tag a tiddler with "follow" to express a list of followers.
Using the {{{<<followTiddlers X>>}}}
will reveal the number of tiddlers with name X in the set of spaces the *current* user viewing your space follows.
{{{<<following jon>>}}} will list all the users following Jon.
{{{<<followers jon>>}}} will list all the followers of jon.
If no name is given eg. {{{<<following>>}}} or {{{<<follow>>}}} it will default the current user.
!StyleSheet
.followTiddlersList li {
	list-style:none;
}

.followButton {
	width: 2em;
}

.followTiddlersList li .siteIcon {
	height:48px;
	width: 48px;
}

.followTiddlersList li .externalImage, .followTiddlersList li .image {
	display: inline;
}
!Code
***/
//{{{
(function($) {

config.annotations.FollowersTemplate = "This tiddler is used in the display of tiddlers from spaces you are following. Use the wildcard $1 for the space name, $2 for the space uri and $3 for the tiddler text.";
config.shadowTiddlers.FollowersTemplate = "[[$1|$2]]";

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var imageMacro = config.macros.image;

var name = "StyleSheetFollowing";
config.shadowTiddlers[name] = store.getTiddlerText(tiddler.title +
     "##StyleSheet");
store.addNotification(name, refreshStyles);

// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace) {
	var adaptor = store.getTiddlers()[0].getAdaptor();
	tweb.getStatus(function(status) {
		var context = {
			workspace: workspace,
			headers: { "X-ControlView": "false" }
		};
		var isPublic = workspace.indexOf("_public") > -1;
		var space = workspace.substr(workspace.indexOf("/") + 1).
			replace("_public", "").replace("_private", "");
		if(tiddlyspace.currentSpace.name == space) {
			space = isPublic ? "public" : "private";
		} else {
			space = "@%0".format([space]);
		}
		var callback = function(context, userParams) {
			var tiddler = context.tiddler;
			tiddler.fields.doNotSave = "true";
			tiddler.title = "%0 [%1]".format([title, space]);
			store.addTiddler(tiddler); // overriding existing allows updating

			var el = story.displayTiddler(src || null, tiddler.title);
			var refresh = story.getTiddler(tiddler.title);
			if(refresh) {
				story.refreshTiddler(tiddler.title, null, true);
			}
			return el;
		};
		adaptor.getTiddler(title, context, null, callback);
	});
};

var followMacro = config.macros.followTiddlers = {
	locale: {
		followListHeader: "Here are tiddlers from spaces you follow using the follow tag which match this name.",
		noTiddlersFromFollowers: "None of the spaces you follow contain a tiddler with this name.",
		errorMessage: "There was a problem retrieving tiddlers from the server. Please try again later."
	},
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	},
	followTag: "follow",
	follower_names_cache: {},
	getHosts: function(callback) {
		tweb.getStatus(function(status) {
			callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
		});
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
		var user = params[1] || false; // allows a user to use the macro on another username
		this.getFollowers(function(followers) {
			var bagQuery = followMacro._constructBagQuery(followers);
			followMacro.getHosts(function(host, tsHost) {
				if(followers.length > 0) { // only run the search if we have a list of followers
					var url = '%0/search?q=title:"%1" %2'.
						format([host, encodeURI(title), bagQuery]);
					ajaxReq({
						dataType: "json",
						beforeSend: followMacro.beforeSend,
						url: url,
						success: function(tiddlers) {
							followMacro.constructInterface(place, tiddlers, { host: tsHost });
						}
					});
				} else {
					followMacro.constructInterface(place, [], {});
				}
			});
		}, user);
	},
	constructInterface: function(place, tiddlers, options) {
		var ul = $('<ul class="followTiddlersList" />');
		var host = options.host || "";
		var handler = function(ev) {
			var link = $(ev.target);
			var spaceName = link.attr("space");
			var title = link.attr("title");
			tiddlyspace.displayServerTiddler(null, title, "bags/%0_public".format([spaceName]));
		};
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var title = tiddler.title;
			var spaceName = tiddler.bag.replace(/([^_]*)_public/i, "$1");
			var tsHost = host.format([spaceName]);
			var modifier = tiddler.modifier;
			var link = $('<a href="#" title="%0" class="alienTiddlerLink">%0</a>'.format([title])).
				attr("space", spaceName).click(handler);
			var li = $("<li />");
			imageMacro.renderImage(li[0],
				"%0/bags/%1_public/tiddlers/SiteIcon".format([tsHost, spaceName]),
				{ imageClass: "siteIcon" });
			li.append(link);
			var modifierLink = host.format([modifier]);
			var spaceLink = host.format([spaceName]);
			$('<span>&nbsp;(last modified by <a href="%2">%0</a> in <a href="%3">%1</a>)</span>'.
				format([modifier, spaceName, modifierLink, spaceLink])).
				appendTo(li);
			ul.append(li);
		}
		var txt = tiddlers.length;
		if(tiddlers.length === 0) {
			if(options.error) {
				txt = "?";
				$("<li />").text(followMacro.locale.errorMessage).appendTo(ul);
			} else {
				$("<li />").text(followMacro.locale.noTiddlersFromFollowers).appendTo(ul);
			}
		}
		var container = $('<div class="followButton" />').
		click(function(ev) {
			followMacro.followingOnClick(ev,ul[0]);
		}).appendTo(place)[0];
		$('<a class="followedTiddlers">%0</a>'.format([txt])).
			appendTo('<div class="followedTiddlers" />').appendTo(container);
	},
	followingOnClick: function(ev, list) {
		var target = ev.target;
		var el = $(story.findContainingTiddler(target));
		var place = $(".concertina", el)[0];
		var headerTxt = followMacro.locale.followListHeader;
		var contentEl = $("<div />").
			append('<div class="followHeader">%0</div>'.format([headerTxt])).
			append(list);
		if(!place) {
			var popup = Popup.create(target,"div");
			addClass(popup ,"taggedTiddlerList followList");
			place = popup;
			$(popup).append(contentEl);
			Popup.show();
		} else {
			if($(place).attr("openedby") == "followTiddlers") {
				el.removeClass("concertinaOn");
				$(place).attr("openedby","").empty().append(contentEl).
					slideUp(500);
			} else {
				el.addClass("concertinaOn");
				$(place).empty().append(contentEl).slideDown(500).
					attr("openedby", "followTiddlers");
			}
		}
		ev.stopPropagation();
	},
	_constructBagQuery: function(followers) {
		var querySegments = [];
		var currentSpaceName = tiddlyspace.currentSpace.name;
		for(var i = 0; i < followers.length; i++) {
			var follower = followers[i];
			if(follower != currentSpaceName) {
				querySegments.push("bag:%0_public".format([encodeURI(follower)]));
			}
		}
		var searchArg = "(%0)".format([querySegments.join("%20OR%20")]);
		return querySegments.length > 0 ? searchArg : false;
	},
	getFollowers: function(callback, username) {
		// returns a list of spaces being followed by the existing space
		var followersCallback = function(user) {
			var followers = [];
			if(!user.anon) {
				var username = user.name;
				if(username == tiddlyspace.currentSpace.name) {
					// just get the tiddlers in the local store
					var followerTiddlers = store.getTaggedTiddlers(followMacro.followTag);
					for(var i = 0; i < followerTiddlers.length; i++) {
						followers.push(followerTiddlers[i].title);
					}
					callback(followers);
				} else {
					var adaptor = store.getTiddlers()[0].getAdaptor();
					if(followMacro.follower_names_cache[username]) {
						// use cached list to save ajax requests
						return callback(followMacro.follower_names_cache[username]);
					}
					followMacro.getHosts(function(host, tsHost) {
						var context = {
							host: host,
							workspace: "bags/%0_public".format([user.name]),
							filters: "select=tag:%0".format([followMacro.followTag]),
							headers: { "X-ControlView": "false" }
						};
						var tiddlerListCallback = function(context){
							var tiddlers = context.tiddlers || [];
							for(var i = 0; i < tiddlers.length; i++) {
								followers.push(tiddlers[i].title);
							}
							followMacro.follower_names_cache[username] = followers;
							callback(followers);
						};
						adaptor.getTiddlerList(context, null, tiddlerListCallback);
					});
				}
			}
		};
		if(!username) {
			tweb.getUserInfo(followersCallback);
		} else {
			followersCallback({ name: username });
		}
	}
};

var followersMacro = config.macros.followers = {
	locale: {
		loggedOut: "Please login to see the list of followers",
		noSupport: "We were unable to retrieve followers as your browser does not support following.",
		pleaseWait: "Please wait while we look this up...",
		error: "Whoops something went wrong. I was unable to find the followers of this user.",
		noone: "No-one. :("
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followersMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var fat = args.fat ? "&fat=y" : "";
		var username = params[0] || false;
		var container = $('<div class="followers" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followersCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				followMacro.getHosts(function(host, tsHost) {
					var url = '%0/search?q=(title:"%1" AND tag:%2)%3'.
						format([host, user.name,followMacro.followTag, fat]);
					followersMacro.listUsers(container, url, locale,
						{ field: "bag", link: true, host: tsHost });
				});
			}
		};
		if(!username) {
			tweb.getUserInfo(followersCallback);
		} else {
			followersCallback({ name: username });
		}
	},
	listUsers: function(place, url, locale, options) {
		options = options ? options: {};
		options.template = options.template ? options.template : "FollowersTemplate";
		locale = locale ? locale : {};
		var host = options.host || "/";
		var field = options.field;
		try {
			ajaxReq({
				url: url,
				dataType: "json",
				beforeSend: followMacro.beforeSend,
				success: function(tiddlers) {
					$(place).empty();
					var list = $("<ul />").appendTo(place);
					for(var i = 0; i < tiddlers.length; i++) {
						var tiddler = tiddlers[i];
						var spaceName = tiddler[field];
						if(field == "bag") {
							spaceName = spaceName.replace("_public", "");
						}
						var spaceURI = host.format([spaceName]);
						var item = $('<li class="spaceName" />').appendTo(list)[0];
						config.macros.tiddler.handler(item,null,null,null,
							'name:%0 with:"%1" with:"%2" with:"%3"'.
								format([options.template, spaceName, spaceURI, tiddler.text]));
					}
					if(tiddlers.length === 0) {
						$("<li />").text(locale.noone).appendTo(list);
					}
				},
				error: function() {
					$("<span />").text(locale.error).appendTo(place);
				}
			});
		} catch(e) {
			$('<span class="error"/>').text(locale.noSupport).appendTo(place);
		}
	}
};

var followingMacro = config.macros.following = {
	locale: {
		pleaseWait: followersMacro.locale.pleaseWait,
		loggedOut: "Please login to see who you are following",
		noSupport: followersMacro.locale.noSupport,
		error: "Whoops something went wrong. I was unable to find who this user is following.",
		noone: followersMacro.locale.noone
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followingMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var fat = args.fat ? "&fat=y" : "";
		var username = params[0] || false;
		var container = $('<div class="following" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followingCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				followMacro.getHosts(function(host) {
					var url =  '%0/search?q=(bag:"%1_public" AND tag:%2)%3'.
						format([host, user.name,followMacro.followTag, fat]);
					followersMacro.listUsers(container, url, locale,
						{ field: "title", link: true });
				});
			}
		};
		if(!username) {
			tweb.getUserInfo(followingCallback);
		} else {
			followingCallback({ name: username });
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpacePublisher|
|''Version''||
|''Description''|Provides a batch publishing tool for managing lots of tiddlers in TiddlySpace|
|''Requires''|TiddlySpacePublishCommand TiddlySpaceTiddlerIconsPlugin|
|''Author''|Jon Robson|
|''Version''|0.3.0|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpacePublisher.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<TiddlySpacePublisher>>
creates an interface with which you can manage unpublished versions of tiddlers.
}}}
!Parameters
filter: allows you to run the publisher on a filtered set of tiddlers.
eg. filter:[tag[systemConfig]]

!TODO
batch publishing for the other way round (public to private)

!Code
***/
//{{{
(function($) {

var currentSpace = config.extensions.tiddlyspace.currentSpace.name;
var originMacro = config.macros.tiddlerOrigin;

var macro = config.macros.TiddlySpacePublisher = {
	locale: {
		title: "Publisher",
		updatedPrivateTiddler: "newer than published version (click {{viewPublicTiddler{%0}}} to view)",
		makePublicLabel: "Make public",
		noTiddlersText: "No tiddlers to publish",
		makePublicPrompt: "Make all the selected tiddlers public.",
		description: "Publish tiddlers to public version of this space",
		pleaseWait: "please wait while we load the publisher... "
	},

	listViewTemplate: {
		columns: [
			{ name: "Selected", field: "Selected", rowName: "title", type: "Selector" },
			{ name: "Tiddler", field: "tiddler", title: "Tiddler", type: "Tiddler" },
			{ name: "Status", field: "status", title: "Status", type: "WikiText" }
		],
		rowClasses: [
			{ className: "updated", field: "updated" },
			{ className: "notPublished", field: "notPublished" }
		]
	},

	publishedTiddlers: {}, // maps tiddler titles to a currently public tiddler where public tiddlers exist
	getPublicTiddlers: function(listWrapper, paramString, spaceName, tiddler) { // fills in publishedTiddlers variable above
		var adaptor = tiddler.getAdaptor();
		var context = {
			workspace: "recipes/%0_public".format([spaceName])
		};
		var callback = function(context, userParams) {
			if(context.status) {
				var tiddlers = context.tiddlers;
				for(var i = 0; i < tiddlers.length; i++) {
					var tid = tiddlers[i];
					macro.publishedTiddlers[tid.title] = tid;
				}
				macro.refresh(listWrapper, paramString);
			}
		};
		adaptor.getTiddlerList(context, null, callback);
	},
	makePublic: function(e, listWrapper, paramString) { // this is what is called when you click the publish button
		var wizard = new Wizard(e.target);
			var listView = wizard.getValue("listView");
			var rowNames = ListView.getSelectedRows(listView);
			var callback = function(status) {
				macro.refresh(listWrapper, paramString);
			};
			var cmd = config.commands.publishTiddler;
			var publicWorkspace;
			for(var i = 0; i < rowNames.length; i++) {
				var title = rowNames[i];
				var tiddler = store.getTiddler(title);
				if(!publicBag) {
					publicBag = cmd.toggleBag(tiddler, "public");
				}
				macro.publishedTiddlers[title] = tiddler;
				var newTiddler = {
					title: tiddler.title,
					fields: { "server.bag": publicBag }
				};
				config.commands.publishTiddler.moveTiddler(tiddler, newTiddler, true, callback);
			}
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var wizard = new Wizard();
		var locale = macro.locale;
		wizard.createWizard(place, locale.title);
		wizard.addStep(macro.locale.description, '<input type="hidden" name="markList" />');
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper, markList);
		listWrapper.setAttribute("refresh", "macro");
		listWrapper.setAttribute("macroName", "SpaceManager");
		listWrapper.setAttribute("params", paramString);

		$(listWrapper).text(macro.locale.pleaseWait);
		this.getPublicTiddlers(listWrapper, paramString, currentSpace, tiddler);
	},
	refresh: function(listWrapper, paramString) {
		var wizard = new Wizard(listWrapper);
		var locale = macro.locale;
		var selectedRows = [];
		ListView.forEachSelector(listWrapper, function(e, rowName) {
			if(e.checked) {
				selectedRows.push(e.getAttribute("rowName"));
			}
		});
		removeChildren(listWrapper);
		var params = paramString.parseParams("anon");
		var publishCandidates = [];
		var unpublishedTiddlers;
		var filter = params[0].filter;
		if(filter) {
			unpublishedTiddlers = store.filterTiddlers(filter[0]);
		} else {
			unpublishedTiddlers = store.getTiddlers();
		}
		var publishedTiddlers = macro.publishedTiddlers;
		var privateBag = currentSpace + "_private";
		for(var t = 0; t < unpublishedTiddlers.length; t++) {
			var include = false;
			var tiddler = unpublishedTiddlers[t];
			var bag = tiddler.fields["server.bag"];
			if(!tiddler.tags.contains("excludePublisher")) {
				if(bag == privateBag) {
					var candidate = {
						title: tiddler.title,
						tiddler: tiddler
					};
					var publishedTiddler = publishedTiddlers[tiddler.title];
					if(!publishedTiddler) {
						candidate.status = "unpublished";
						include = true;
						candidate.notPublished = true;
					} else if(!originMacro.areIdentical(tiddler, publishedTiddler)) {
						candidate.status = locale.updatedPrivateTiddler.format([tiddler.title]);
						candidate.publicTiddler = publishedTiddler;
						candidate.updated = true;
						include = true;
					}
					if(include) {
						publishCandidates.push(candidate);
					}
				}
			}
		}

		if(publishCandidates.length === 0) {
			createTiddlyElement(listWrapper, "em", null, null, locale.noTiddlersText);
		} else {
			var listView = ListView.create(listWrapper, publishCandidates, macro.listViewTemplate);
			wizard.setValue("listView", listView);

			var btnHandler = function(ev) {
				macro.makePublic(ev, listWrapper, paramString);
			};
			wizard.setButtons([
				{ caption: locale.makePublicLabel, tooltip: locale.makePublicPrompt, onClick: btnHandler }
			]);
		}

		var publicLinks = $(".viewPublicTiddler");
		$.each(publicLinks, function(index, el) {
			el = $(el);
			var title = el.text();
			el.empty();
			var handler = function(ev) {
				ev.preventDefault();
				var tiddler = store.getTiddler(title);
				config.extensions.tiddlyspace.spawnPublicTiddler(tiddler, el);
			};
			$('<a href="javascript:;" />').text(title).click(handler).appendTo(el);
		});
	}
};

var unpublishedTabText = 'Unpublished "Manage unpublished tiddlers" TabUnpublished';
config.shadowTiddlers.TabMore = config.shadowTiddlers.TabMore.replace(
	"TabMoreShadowed", "TabMoreShadowed %0".format([unpublishedTabText]));

})(jQuery);
//}}}
/*{{{*/
body {
	font-size: 1.0em;
	font-family: helvetica, arial, sans-serif;
	background-color: [[ColorPalette::Background]];
}

#displayArea {
	margin: 0;
	position: relative;
}

#tiddlerDisplay {
	margin: 2em 23em 0 2em;
}

.public {
	border-color: #C7EAFF;
}

.private {
	border-color: #FFCAE9;
}

.revisionCloak {
	position: absolute;
	position: fixed !important;
	height: 100%;
	width: 100%;
	top: 0;
	left: 0;
	border: 0;
	margin: 0;
	padding: 0;
	opacity: 0.5;
	filter: alpha(opacity=50);
	background-color: black;
}

[[StyleSheetHeader]]
[[StyleSheetMenuBar]]
[[StyleSheetSideBar]]
[[StyleSheetTiddler]]
/*}}}*/
aaaaasdsad
blob
<!--{{{-->
<link rel='shortcut icon' href='/bags/tiddlyspace/tiddlers/favicon.ico' />
<!--}}}-->
<<TiddlySpaceLogin>>
<<TiddlySpaceRegister>>
Enter some details about you here.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 478.39694 232.53705 L 478.39694 232.53705 
		C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994 
		L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214 
		L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936 
		L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052 
		C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978 
		L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988 
		L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283 
		L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688 
		C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936 
		L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814 
		L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273 
		C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273 
		C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714 
		C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
		class="glyph"/>
	</g>
</g>
</svg>
These options for customising your family tree are saved in your browser.

<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
/*{{{*/
.tiddler {position: relative;}
.tiddlerOrigin {position: absolute; top: 60px; right: 5px;}
.tiddler .modifier {
position:absolute;
right:10px;
top:120px;
}
.tiddler .modifier .siteIcon {
width:48px;
height:48px;
}
.niceTaggerAdder input {width:auto;display:inline;}
.niceTaggerAdder .adder {display:inline;width:auto;}
.clear {clear:both;}
.tagged a {display:block;}
body {background-color:white;}
.tip {font-style:italic;font-weight:bold;}
.dp-popup {position:absolute;background-color:white;} 
a.dp-choose-date { float: left; 
width: 16px; height: 16px; padding: 0; margin: 5px 3px 0; display: block; 
text-indent: -2000px; overflow: hidden; background: url(calendar.png) no-repeat; }
a.dp-choose-date.dp-disabled { background-position: 0 -20px; cursor: default;}input.dp-applied { width: 140px; float: left;}
.niceTagger input {width:200px; float:left;}
.deleter {color:red; font-weight:bold; padding:2px; cursor:pointer;}
.tiddler img {
	-moz-box-shadow: 2px 2px 4px 4px black;
	-webkit-box-shadow: 2px 2px 4px 4px black;
}

.ftLabelText {float:left;}
.ftLabelImage {height:25px;float:left;}
#contentWrapper .FamilyTree .VGraph {height:150px;width:600px;margin:auto;}
.FamilyTree {
background-color:white;
border-bottom:7px solid black;
border-left:7px solid black;
height:230px;
left:420px;
position:absolute;
right:7px;
top:0;
z-index:3;
}

.changeAlgorithm {right:65px;}
.canvasLabel {position:absolute; font-size:0.7em;color:black;cursor:pointer;}
.fromRoot0 {font-size:1.2em;}
.fromRoot1 {font-size:1.1em;}
.fromRoot2 {font-size:1.0em;}
.fromRoot3 {font-size:0.9em;}
.fromRoot4 {font-size:0.8em;}
.hoverNode {background-color:white;font-weight:bold;z-index:2;font-size:1.2em;}

.ac_results {	padding: 0px;	border: 1px solid black;	background-color: white;	overflow: hidden;	z-index: 99999;}
.ac_results ul {	width: 100%;	list-style-position: outside;	list-style: none;	padding: 0;	margin: 0;}
.ac_results li {	margin: 0px;	padding: 2px 5px;	cursor: default;	display: block;	/* 
	if width will be 100% horizontal scrollbar will apear 
	when scroll mode will be used
	*/
	/*width: 100%;*/
	font: menu;	font-size: 12px;	/* 
	it is very important, if line-height not setted or setted 
	in relative units scroll will be broken in firefox
	*/
	line-height: 16px;	overflow: hidden;}
.ac_loading {	background: white url('indicator.gif') right center no-repeat;}
.ac_odd {	background-color: #eee;}
.ac_over {background-color:#4DA6C9;color: white;}


a,.tabSelected,#sidebarOptions .sliderPanel a{color:#008500;}
.button {background-color:white;border:1px solid #FFFFFF;color:green;margin-right:2px;padding:10px;}
#topToolbar {margin-top:10px;margin-left:-12px;}
#messageArea {background:#39ac1b;border:1px solid white;z-index:100;}
.nodeLabel {width:200px; overflow:hidden;}
.factbox {border:1px dashed #024E02;
color:black;
font-weight:bold;
padding:10px;}
.subtitle {padding-top:5px;}
.ftSubTitle {color:white;
font-size:1.2em;
left:20px;
position:relative;
top:80px;
z-index:3;}
.ftSubTitle a {color:white;}
#sidebarOptions input,.tagging, .tagged {
background-color:none;
border:1px dashed #024E02;
}



.tagsection input {width:150px;}
.button:hover {background-color:rgb(110,220,90);color:white;border-left:solid 1px black;border-right:solid 1px black;border-top:solid 1px black;}
.tiddler .button {padding:0.4em 1.2em;} 

.sexMale .title,.command_addFather, .sexFemale .command_addSpouse {border-bottom:solid 5px #71B4FF;}
.sexFemale .title,.command_addMother,.sexMale .command_addSpouse{border-bottom:solid 5px #ed00f5;}
.yourSearchResult {z-index:99999;}
.tiddler {background-color:white;margin-top:10px;padding:0 10px 20px;}
#displayArea {margin:1em 17em 0 1em;padding:0px;}
body {font-family: Helvetica, Arial, Sans-serif;color:#024E02;}
h1,h2,h3,h4,h5,.title{color:#39ac1b;}
.title {font-size:3em;}
.siteIcon {float:left;height:51px;margin-right:10px;}
.ftTitle {color:#39ac1b;font-size:52px;float:left;position:relative;font-weight:700;margin-bottom:10px;}
.ftContainer {background-color:#39ac1b;padding:20px;position:relative;top:-12px;margin-right:17px;left:10px;z-index:2;}
#sidebarOptions .sliderPanel {background-color:#EEEEEE;}
.ftTitleBG {color:white;z-index:2;}
.ftContainer #displayArea {background-color:auto;}
.ftContainer #sidebar {background-color:white;margin-right:40px;}
.ft_tooltip {background-color:white;padding:10px;color:#39ac1b;z-index:40; font-weight:bold;}
#tiddlerDisplay {margin-top:70px;}

.tiddlerContainer {margin-left:10px;margin-right:10px;}
.toolbar {margin-top:10px;}

.tabContents {
color:black;
}
.tagging .listTitle, .tagged .listTitle {
color:black;
}

.ftHideCorner {border-color:#39AC1B #39AC1B white white;
border-style:solid;
border-width:20px 20px 10px 10px;
position:absolute;
left:0;
bottom:0;
z-index:1;
}
.zooming {cursor:crosshair;}
.panning {cursor:move;}
.VismoCanvas {z-index:11;margin-left:10px;}
.changeroot {margin-left:50%;width:200px;right:100px;z-index:10;position:relative;}
.changeAlgorithm {z-index:100;position:absolute;right:70px;bottom:0px;}
.yourSearchNaviBar .currentPage {color:#39AC1B;}

#yourSearchResult {background-color:#EEEEEE;background:#EEEEEE none repeat scroll 0 0;}
.yourSearchResult .button {padding:0px;}
/*}}}*/
/***
|''Name''|TiddlySpaceIdentities|
|''Version''|0.1.0|
|''Description''||
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceIdentities.js|
|''Requires''|TiddlySpaceConfig chrjs|
!HTMLForm
<form method="POST" action="#">
	<fieldset>
		<legend />
		<dl>
			<dt>Type:</dt>
			<dd>
				<select>
					<option value="openid">OpenID</option>
				</select>
			</dd>
			<dt>Identity:</dt>
			<dd><input type="text" name="openid" /></dd>
		</dl>
		<input type="hidden" name="tiddlyweb_redirect" />
		<input type="submit" />
	</fieldset>
</form>
!TODO
* process config.extensions.tiddlyweb.challengers instead of hardcoding OpenID
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var macro = config.macros.TiddlySpaceIdentities = {
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
	locale: {
		listError: "error retrieving identities for user %0",
		addLabel: "Add Identity"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		tweb.getUserInfo(function(user) {
			if(!user.anon) {
				var container = $("<div />").appendTo(place);
				macro.refresh(container);
			}
		});
	},
	refresh: function(container) {
		container.empty().append("<ul />").append(this.generateForm());
		$.ajax({ // TODO: add (dynamically) to chrjs user extension?
			url: "%0/users/%1/identities".format([tweb.host, tweb.username]),
			type: "GET",
			success: function(data, status, xhr) {
				var identities = $.map(data, function(item, i) {
					return $("<li />").text(item)[0];
				});
				$("ul", container).append(identities);
			},
			error: function(xhr, error, exc) {
				displayMessage(macro.locale.listError.format([tweb.username]));
			}
		});
	},
	generateForm: function() {
		var challenger = "tiddlywebplugins.tiddlyspace.openid";
		var uri = "%0/challenge/%1".format([tweb.host, challenger]);
		var redirect = tweb.serverPrefix + "#auth:OpenID=";
		return $(this.formTemplate).attr("action", uri).submit(this.onSubmit).
			find("legend").text(this.locale.addLabel).end().
			find("[name=tiddlyweb_redirect]").val(redirect).end().
			find("[type=submit]").val(this.locale.addLabel).end();
	},
	onSubmit: function(ev) {
		var form = $(this);
		var redirect = form.find("[name=tiddlyweb_redirect]");
		var openid = form.find("[name=openid]").val();
		redirect.val(redirect.val() + openid);
		return true;
	}
};

config.paramifiers.auth = {
	locale: {
		success: "successfully added identity %0",
		error: "error adding identity %0: %1"
	},

	onstart: function(v) {
		var identity = window.location.hash.split("auth:OpenID=")[1];
		if(identity) {
			this.addIdentity(identity);
		}
	},
	addIdentity: function(name) {
		var msg = config.paramifiers.auth.locale;
		var tiddler = new tiddlyweb.Tiddler(name);
		tiddler.bag = new tiddlyweb.Bag("MAPUSER", tweb.host);
		var callback = function(data, status, xhr) {
			displayMessage(msg.success.format([name]));
			window.location = window.location.toString().split("#")[0] + "#";
		};
		var errback = function(xhr, error, exc) {
			displayMessage(msg.error.format([name, error]));
		};
		tiddler.put(callback, errback);
	}
};

})(jQuery);
//}}}
/***
|''Name:''|AET (Advanced Edit Template)|
|''Description:''|Provides stuff the standard edit macro doesn't. First things first.. dropdowns!|
|''Author:''|JonRobson |
|''Version:''|0.8|
|''Date:''|April 2010|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Dependencies:''|[[AdvancedEditTemplate (core code)|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/AET/plugins/AET.js]]|
|''Usage:''|

<<aet type:dropdown field:foo values:{{tiddler title}}>>
{{{
***/
try{
    config.locationData = [];
    config.geoData = {};
  config.shadowTiddlers.AdvancedEditTemplateStyle = "/*{{{*/\n" +
  ".clearboth {clear:both;}\n"+
  ".aet_radioboxes label {width:auto;float:left;}\n"+
  ".aet_radioboxes input {width:auto;float:left;}\n"+
  ".tip {font-style:italic;font-weight:bold;}\n"+
  ".dp-popup {position:absolute;background-color:white;} a.dp-choose-date {  float: left;  width: 16px;  height: 16px;  padding: 0;  margin: 5px 3px 0;  display: block;  text-indent: -2000px;  overflow: hidden;  background: url(calendar.png) no-repeat; }a.dp-choose-date.dp-disabled {  background-position: 0 -20px;  cursor: default;}input.dp-applied {  width: 140px;  float: left;}\n"+
  ".filebrowser{background-color:white; border:solid 1px black;}\n"+
  "a.dp-choose-date {border:solid 1px black;}\n"+
  ".dp-nav-prev {float:left;}\n"+
  ".dp-nav-next {float:right;}\n"+
  ".dp-calendar {clear:both;}\n"+
  ".dp-popup {padding:10px;border:solid 1px black;z-index:4;}\n"+
  ".jCalendar .selected {background-color:gray;}\n"+
  "/*}}}*/"
store.addNotification("AdvancedEditTemplateStyle", refreshStyles);
}catch(e){};

String.prototype.toJSON = function(){var namedprms = this.parseParams(null, null, true);var options ={};for(var i=0; i < namedprms.length;i++){var nameval = namedprms[i];if(nameval.name)options[nameval.name] = nameval.value;}return options;};

config.macros.AdvancedEditTemplate = {
  lingo:{
      "aet_upload":"Upload a local file:",
      "aet_imgpreview":"a preview of currently selected image will be shown here",
      "aet_select":"Please select.."
  }
  ,translate: function(id){
      if(!config.macros.aet.lingo[id]) return id;
      return config.macros.aet.lingo[id];
  }
  ,extensions: {
    "dropdown":{
      createDropDownMenu: function(place,fieldName,values,initialValue,tiddler,selected,sort){
        
          if(typeof fieldName == 'object'){
            fields = fieldName;
          }
          else{
            fields = [fieldName];
          }
          if(!selected) selected = "";
          if(!initialValue){
            initialValue = "aet_select";
          }
          var menus = this._createMenus(values);
          var lastMenu, fieldid;
          var allMenus = [];
          var selectedItem = false;
          var nowtselected = true;
          for(var j=menus.length-1; j >-1; j--){
            var selectedOption = selected;
            
            var newMenu = document.createElement("select");
            if(j > 0){
              newMenu.style.display = "none";
            }
            if(fields.length == 1){
              fieldid = 0;
            }
            else{
              fieldid = menus[j].depth;
            }
            if(tiddler)selectedOption = tiddler.fields[fields[fieldid]] || "";
            
            newMenu.name = fields[fieldid];
            newMenu.associatedFields = fields;
            var menuoptions = menus[j].options;
              for(var k=0; k<menus[j].options.length;k++){
                var translation = config.macros.aet.translate(menus[j].options[k].caption);
                if(translation) menus[j].options[k].caption=translation;
            }
            if(sort){     
              var sorter = function(a,b){if(a.caption < b.caption){ return -1; }else return 1;};
              sorter =menuoptions.sort(sorter);
            }
            var firstCaption= config.macros.aet.translate(initialValue);
            if(!firstCaption)firstCaption = initialValue;
            var topitem = [{'caption': firstCaption, 'value': 'null', 'name': null}];
            menuoptions = topitem.concat(menuoptions);

            for(var k=0; k <menuoptions.length; k++){
              var opt =menuoptions[k];

              if(opt.caption.replace(" ","") != ""){
                var optionEl = document.createElement("option");
                if(opt.childMenu) {
                  optionEl.childMenu = allMenus[opt.childMenu];
                  optionEl.childMenu.parentOption = optionEl;
                }

                if(opt.value){
                  optionEl.value = opt.value;
                }

                if(nowtselected && optionEl.value ==selectedOption){
                  optionEl.selected = true;
                  newMenu.style.display = "";
                  selectedItem = optionEl;
                  nowtselected = false;
                }
                optionEl.appendChild(document.createTextNode(opt.caption));
                newMenu.appendChild(optionEl);
              }
            }
            newMenu.onchange = function(e){


              /*toggle menu*/
              var opt =this[this.selectedIndex];

              if(opt.childMenu){
                opt.childMenu.style.display=""
                if(this.expandedMenu) this.expandedMenu.style.display = "none";
                this.expandedMenu = opt.childMenu;
              }
              else{
                if(this.expandedMenu) this.expandedMenu.style.display = "none";
                this.expandedMenu = null;
              }

              var handler = config.macros.aet.extensions["dropdown"].setDropDownMetaData(e,this,tiddler);
            };

            allMenus[j] = newMenu;
            if(lastMenu){
              lastMenu.childMenu = newMenu;
            }
            lastMenu = newMenu;

          }
          for(var k=0; k < allMenus.length; k++){
            place.appendChild(allMenus[k]);
          }

          if(nowtselected){
            selectedItem = allMenus[0].firstChild;
          }
          if(selectedItem){
            this._revealSelectMenus(selectedItem);
          }
      }

      ,_revealSelectMenus: function(selecteditem){
        if(!selecteditem.selected) selecteditem.selected = true;

        var containingmenu = selecteditem.parentNode;


        if(selecteditem.childMenu){
          selecteditem.childMenu.style.display = "";
          containingmenu.expandedMenu = selecteditem.childMenu;
        }
        if(containingmenu.style.display == "none"){
          containingmenu.style.display = "";
        }
        while(containingmenu){
          var parentoption = containingmenu.parentOption;
          if(parentoption) {
            parentoption.selected = true;
            var parentmenu = parentoption.parentNode;
            if(parentmenu){ 
              parentmenu.style.display = "";
              parentmenu.expandedMenu = containingmenu;
              containingmenu = parentmenu;
            }
            else{
              containingmenu = false;
            }
          }
          else{
            containingmenu = false;
          }



        }

        //containingmenu.parentMenu.style.display = "";
      }

  		,_createMenus: function(menutextrepresentation){
  			var chain = [0];
  			var menus = [];
  			var values = menutextrepresentation;
  			var myparents = [];
  			var depth = 0;
  			for (var i=0; i < values.length; i++) {

  				var value;
  				var caption = values[i];
  				if(caption.indexOf("##") > -1){ //remove any commenting
  					caption = caption.substring(0,caption.indexOf("##"));
  				}
  				value = caption;

  				if(caption.indexOf(":") > -1){
  					var splitstr= caption.split(":");
  					caption = splitstr[0];
  					value = splitstr[1];
  				}
  				caption = caption.replace("<","");
  				caption = caption.replace(">","");

  				var chainid = chain.length -1;
  				if(!menus[chain[chainid]]){
  					menus[chain[chainid]] = {depth: depth};
  					menus[chain[chainid]].options= [];
  				}


  				if(value.indexOf(">") != -1){
  					value = value.replace(">","");
  					var newmenuid = menus.length;
  					menus[chain[chainid]].options.push({'caption': caption, 'value': value,'childMenu': newmenuid});
  					chain.push(newmenuid);
  					myparents.push(value+">");
  					depth += 1;	

  				}
  				else if(value.indexOf("<") != -1){			
  					value = value.replace("<","");

  					menus[chain[chainid]].options.push({'caption': caption,'value': value});
  					myparents.pop();
  					chain.pop();
  					depth -= 1;	
  				}
  				else{
  					menus[chain[chainid]].options.push({'caption': caption, 'value':value});
  				}




  			}

  			return menus;
  		}

      // Ensure that changes to a dropdown field are stored as an extended field.
      ,setDropDownMetaData: function(ev,el,tiddler,autosavechanges) {
        var aet = config.macros.aet;
        var e = ev ? ev : window.event;
        
          var title = tiddler.title
          var selected = el[el.selectedIndex];
          var aet = config.macros.AdvancedEditTemplate;
          var fieldname = selected.parentNode.name;
          var fieldvalue = selected.value;
          for(var i=0; i < el.associatedFields.length; i++){
            var fieldname =el.associatedFields[i];
            aet.setMetaData(title,fieldname,fieldvalue,autosavechanges);
          }  
          var parent = selected.parentNode.parentOption;

          if(selected.value == 'null'){
            if(parent){
              selected = parent;
              fieldvalue = selected.value;  
            }
          }
          if(parent){
            config.macros.aet.extensions['dropdown'].setDropDownMetaData(ev,parent.parentNode,tiddler);
          }
          aet.setMetaData(title,fieldname,fieldvalue,autosavechanges);
        
      }
    }
    ,"if":{
      _doStatement: function(stmt,tiddler,or){
  		        var delimiter = "&";
  		        if(or){
  		            delimiter = "|";
  		        }
  		       var params = stmt.split(delimiter);
                  var finalEval = true;
                  if(or) finalEval = false;
                  for(var i=0; i < params.length; i++){
                       var evaluatesTo = true;
                      var arg = params[i];


                      if(arg.indexOf("!") == 0){
                          var x = tiddler.fields[arg.substr(1)];
                          //console.log("cool");
                          if(x){
                              evaluatesTo = false;
                          }
                          else{
                              evaluatesTo = true;
                          }
                      }
                      else{
                          var x = tiddler.fields[arg];
                          if(!x){
                              evaluatesTo = false;
                          }
                      }
                      if(or){
                          finalEval = evaluatesTo || finalEval;
                      }
                      else{
                          finalEval = evaluatesTo && finalEval;
                      }//console.log(arg,evaluatesTo,finalEval);

                  }
                  return finalEval;
  		}
  		,doIfStatement: function(place,stmt,tiddler){
  		    var or = false;
  		    if(stmt.indexOf("|") > -1){
  		        or= true;
  		    }
  		    var finalEval = this._doStatement(stmt,tiddler,or);

              if(!finalEval){
                  place.innerHTML = "";
               }

  		}
  		
    }
  }
  ,controlTypes: {
    text: function(place,tiddler,fieldName,options){
      var maxlength = options.maxlength;
	    var rows = options.rows;
	    params = [fieldName];
	    if(rows) params.push(rows);
	    paramString ="";
	    var e = config.macros.edit.handler(place,null,params,null,paramString,tiddler);
	    jQuery(e).attr("maxlength",maxlength);
    }
    ,dropdown: function(place,tiddler,fieldName,options){
      var aet = config.macros.aet;
      var valueSource = options.values ||options.valuesSource;
      if(!valueSource) {displayMessage("Please provide a parameter valuesSource telling me the name of the tiddler where your drop down is defined.");return;}
      if(fieldName.indexOf(",") > -1){
        fields = fieldName.split(",");
        for(var j=0; j < fields.length; j++){
          fields[j] = jQuery.trim(fields[j]);
        }
      }
      else{
        fields = [fieldName];
      }
      var selected = store.getValue(tiddlerobj,fields[fields.length -1]);
      if(!selected){
        var qsvalue =aet.getVariableFromQueryString(fields[fields.length-1]);
        if(qsvalue) selected = qsvalue;
      }
      var tiddlerobj =store.getTiddler(valueSource);
      if(tiddlerobj){
        var values = tiddlerobj.text.split('\n');
        var sorted = tiddlerobj.tags.contains("sorted");
        config.macros.aet.extensions["dropdown"].createDropDownMenu(place,fields,values,false,tiddler,selected,sorted);
      }
    }
  }
  ,readValueSlice: function(valuesTiddler){
    
  }
  ,handler: function(place,macroName,p,wikifier,paramString,tiddler) {
    var options = paramString.toJSON();
    if(options["if"]){
      config.macros.aet.extensions["if"].doIfStatement(place,options["if"],tiddler);
    }
    var controlType = options.type;
    var field = options.field || options.metaDataName;
    options.field = field;
    var controlHandler = config.macros.AdvancedEditTemplate.controlTypes[controlType];
    if(controlHandler)controlHandler(place,tiddler,field,options);
  }
  ,getMetaData: function(title,extField){ 
    extField = extField.toLowerCase();
    var tiddler =  store.getTiddler(title);
    if(!tiddler) {
      return false;
    }
    else{
      if(!tiddler.fields[extField]){
        return false;
      }
      else{
        return tiddler.fields[extField];
      }
    }
  }
  ,setMetaData: function(title,extField,extFieldVal,autosavechanges){
    //jQuery("input").blur();
  
    extField = extField.toLowerCase();

    var tiddler =  store.getTiddler(title);
    if(!tiddler) {
      store.saveTiddler(title,title,null,true,null,[],config.defaultCustomFields,null);
      tiddler = store.getTiddler(title);
    }
    
    if(!extFieldVal){
      store.setValue(tiddler,extField);
      delete tiddler.fields[extField]
    }
    else{
      
      tiddler.fields[extField] = extFieldVal;
      store.setValue(tiddler,extField,extFieldVal);  
    }
    story.setDirty(title,true);
    if(autosavechanges){autoSaveChanges();}
    else{}
  }

  ,getVariableFromQueryString:function(varName){
    var qs = window.location.search.substring(1);
    var atts = qs.split("&");
    for(var i =0; i <atts.length; i++){
      var varVal = atts[i].split("=");
      if(varVal[0]==varName){
        return decodeURI(varVal[1]);
      }
    }
    return false;
  }
}
config.macros.aet = config.macros.AdvancedEditTemplate;
if(config.macros.view){
    if(!config.macros.view.views)config.macros.view.views={};
   
    config.macros.view.views.linklist = function(value,place,params,wikifier,paramString,tiddler) {
        var classname="";
        var values = value.split("\n");
        for(var i=0; i < values.length;i++){
            wikify("[["+values[i]+"]]\n",place);
        }
        
    };  
    config.macros.view.views.hiddeninput = function(value,place,params,wikifier,paramString,tiddler) {
        var classname="";
        if(params[2]) classname = params[2];
	    jQuery(place).append("<input type='hidden' value='"+value+"'/>");
    };
}
/***
|''Name''|TiddlySpacePubRevCommand|
|''Version''||
|''Description''||
|''Requires''|TiddlySpaceConfig BinaryTiddlersPlugin|
|''Source''||
!Code
***/
//{{{
(function($) {

var ns = config.extensions.tiddlyspace;

var cmd = config.commands.pubRev = { // TODO: rename
	text: "public",
	tooltip: "view public version",
	loadingMsg: "retrieving public version of <em>%0</em>",
	noPubError: "<em>%0</em> has not been published",

	isEnabled: function(tiddler) {
		if(readOnly) {
			return false;
		}
		var space = ns.determineSpace(tiddler, true);
		var bag = tiddler.fields["server.bag"];
		return space && (bag ? bag == space.name + "_private" : true);
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		var adaptor = tiddler.getAdaptor();
		var space = ns.determineSpace(tiddler, false);
		var context = {
			host: adaptor.fullHostName(tiddler.fields["server.host"]),
			workspace: "bags/%0_public".format([space.name])
		};
		var popup = Popup.create(src, "div");
		var msg = cmd.loadingMsg.format([title]);
		popup = $(popup).html(msg);
		Popup.show(); // XXX: can be irritating if it just flashes quickly
		var callback = function(context, userParams) {
			if(context.status) {
				ns.spawnPublicTiddler(context.tiddler, src);
				Popup.remove();
			} else {
				var msg = cmd.noPubError.format([context.tiddler.title]);
				msg = $('<div class="annotation" />').html(msg);
				popup.empty().append(msg);
			}
		};
		adaptor.getTiddler(title, context, null, callback);
		return false;
	}
};

// adds a Tiddler instance to the store as temporary tiddler and displays it
// src is passed to Story's displayTiddler as srcElement
ns.spawnPublicTiddler = function(tiddler, src) { // XXX: rename!?
	tiddler.fields.doNotSave = "true";
	tiddler.title = tiddler.title + this.spawnPublicTiddler.pubSuffix;
	store.addTiddler(tiddler); // overriding existing allows updating
	var refresh = story.getTiddler(tiddler.title);
	var el = story.displayTiddler(src || null, tiddler.title);
	if(refresh) {
		story.refreshTiddler(tiddler.title, null, true);
	}
	return el;
};
ns.spawnPublicTiddler.pubSuffix = " [public]"; // XXX: hacky?

// hijack ServerSideSavingPlugin's sync to support virtual public tiddlers
var _sync = config.extensions.ServerSideSavingPlugin.sync;
config.extensions.ServerSideSavingPlugin.sync = function(tiddlers) {
	_sync.apply(this, arguments);
	store.forEachTiddler(function(title, tiddler) {
		var pubRev = config.extensions.BinaryTiddlersPlugin.endsWith(title,
			ns.spawnPublicTiddler.pubSuffix);
		if(pubRev && tiddler.fields.doNotSave == "true") {
			var tid = $.extend(new Tiddler(title), tiddler);
			tid.fields = $.extend({}, tiddler.fields);
			tid.title = tid.fields["server.title"];
			delete tid.fields.doNotSave;
			delete tid.fields["server.title"];
			config.extensions.ServerSideSavingPlugin.saveTiddler(tid);
		}
	});
};

})(jQuery);
//}}}
The following people are members of the space ''<<message extensions.tiddlyspace.currentSpace.name>>''. Only members have access to the private tiddlers in a space.
<<TiddlySpaceMembers>>
<<TiddlySpaceChangePassword>>
upload file:
<<binaryUpload edit:title>>

search:
<<search>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">> <<slider chkSliderSideBarTabs SideBarTabs "advanced »">>
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
/***
|''Name''|TiddlySpaceMembers|
|''Version''|0.5.0|
|''Description''|provides a UI for managing space members|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceMembers.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceUserControls|
!HTMLForm
<form action="#">
	<fieldset>
		<legend />
		<dl>
			<dt>Username:</dt>
			<dd><input type="text" name="username" /></dd>
		</dl>
		<p class="annotation" />
		<input type="submit" />
	</fieldset>
</form>
!Code
***/
//{{{
(function($) {

var macro = config.macros.TiddlySpaceMembers = {
	formTemplate: store.getTiddlerText(tiddler.title + "##HTMLForm"),
	locale: {
		authError: "list of members is only visible to members of space <em>%0</em>",
		listError: "error retrieving members for space <em>%0</em>: %1",
		addLabel: "Add member",
		noUserError: "user <em>%0</em> does not exist",
		delTooltip: "click to remove member",
		delPrompt: "Are you sure you want to remove member %0?",
		delError: "error removing member %0: %1"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var space = config.extensions.tiddlyspace.currentSpace.name;
		var host = config.extensions.tiddlyweb.host;
		this.space = new tiddlyweb.Space(space, host); // XXX: singleton
		var container = $("<div />").appendTo(place);
		if(!readOnly) {
			this.refresh(container);
		} else {
			var msg = this.locale.authError.format([this.space.name]);
			this.notify(msg, container);
		}
	},
	refresh: function(container) {
		var callback = function(data, status, xhr) {
			container.empty();
			macro.displayMembers(data, container);
		};
		var errback = function(xhr, error, exc) {
			var msg = xhr.status == 403 ? "authError" : "listError";
			msg = macro.locale[msg].format([macro.space.name, error]);
			macro.notify(msg, container);
		};
		this.space.members().get(callback, errback);
	},
	displayMembers: function(members, container) {
		var items = $.map(members, function(member, i) {
			var link = $('<a href="javascript:;" />').text(member); // TODO: link to space
			var btn = $('<a class="deleteButton" href="javascript:;" />').
				text("x"). // TODO: i18n (use icon!?)
				attr("title", macro.locale.delTooltip).
				data("username", member).click(macro.onClick);
			return $("<li />").append(link).append(btn)[0];
		});
		$("<ul />").append(items).appendTo(container);
		this.generateForm().appendTo(container);
	},
	generateForm: function() {
		return $(this.formTemplate).submit(this.onSubmit).
			find("legend").text(this.locale.addLabel).end().
			find(".annotation").hide().end().
			find("[type=submit]").val(this.locale.addLabel).end();
	},
	onSubmit: function(ev) {
		var form = $(this).closest("form");
		var selector = "[name=username]";
		var username = form.find(selector).val();
		var callback = function(data, status, xhr) {
			var container = form.closest("div");
			macro.refresh(container);
		};
		var errback = function(xhr, error, exc) {
			var ctx = {
				msg: { 409: macro.locale.noUserError.format([username]) },
				form: form,
				selector: selector
			};
			config.macros.TiddlySpaceLogin.displayError(xhr, error, exc, ctx);
		};
		macro.space.members().add(username, callback, errback);
		return false;
	},
	onClick: function(ev) { // XXX: ambiguous; rename
		var btn = $(this);
		var username = btn.data("username");
		var msg = macro.locale.delPrompt.format([username]);
		var callback = function(data, status, xhr) {
			if(username == config.extensions.tiddlyweb.username) { // assumes getStatus has completed
				readOnly = true;
				refreshDisplay();
			}
			var container = btn.closest("div");
			macro.refresh(container);
		};
		var errback = function(xhr, error, exc) {
			displayMessage(macro.locale.delError.format([username, error]));
		};
		if(confirm(msg)) {
			macro.space.members().remove(username, callback, errback);
		}
	},
	notify: function(msg, container) {
		container.addClass("annotation").html(msg);
	}
};

})(jQuery);
//}}}
/*{{{*/
#menuBar {
	left: 0;
	right: 0;
	position: relative;
	background-color: [[ColorPalette::PrimaryLight]];
	margin: 0;
	padding: 0.5em 0 0.5em 0;
	min-height: 1em;
	overflow: hidden;
	border-top: 1px solid [[ColorPalette::PrimaryDark]];
	border-bottom: 1px solid [[ColorPalette::PrimaryDark]];
	width: 100%; /* for ie 6 */
}

#mainMenu {
	position: static;
	text-align: left;
	min-height: 1em;
	margin-left: 1em;
	float: left;
	width: auto;
	padding: 0;
}

#sidebarOptions {
	float: right;
	font-size: 1.1em;
	line-height: 1.6em;
	min-height: 1em;
	padding-top: 0;
}

#mainMenu a {
	padding: 0.6em 0.25em;
}

#mainMenu a:hover {
	background-color: [[ColorPalette::PrimaryMid]];
	color: [[ColorPalette::Background]]
}

#sidebarOptions a {
	border: 0 none;
	margin: 0 0.2em;
	padding: 0.6em 0.25em;
	display: inline;
}
/*}}}*/
/***
|''Name:''| NiceTaggingPlugin|
|''Description:''| creates a nicer interface for adding and removing TiddlyWiki. Ideal for tiddly novices. |
|''Version:''|0.511|
|''Date:''|April 2010|
|''Source:''|http://www.jonrobson.me.uk/development/niceTagging|
|''Author:''|Jon Robson|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.3|
|''Dependencies:''||
***/

if(store){
  config.shadowTiddlers.NiceTaggingStyle = "/*{{{*/\n" +
  ".tip {font-style:italic;font-weight:bold;}\n"+
  ".dp-popup {position:absolute;background-color:white;} a.dp-choose-date {  float: left;  width: 16px;  height: 16px;  padding: 0;  margin: 5px 3px 0;  display: block;  text-indent: -2000px;  overflow: hidden;  background: url(calendar.png) no-repeat; }a.dp-choose-date.dp-disabled {  background-position: 0 -20px;  cursor: default;}input.dp-applied {  width: 140px;  float: left;}\n"+
  ".niceTagger input {width:200px; float:left;}\n"+
  ".deleter {color:red; font-weight:bold; padding:2px; cursor:pointer;}\n"+
  ".ac_results {padding: 0px;border: 1px solid black;background-color: white;overflow: hidden;z-index: 99999;}\n"+
  ".ac_results ul {width: 100%;list-style-position: outside;list-style: none;padding: 0;margin: 0;}\n"+
  ".ac_results li {margin: 0px;padding: 2px 5px;cursor: default;display: block;font: menu;font-size: 12px;line-height: 16px;overflow: hidden;}\n"+
  ".ac_loading {background: white url('indicator.gif') right center no-repeat;}\n"+
  ".ac_odd {background-color: #eee;}\n"+
  ".ac_over {background-color: #0A246A;color: white;}\n"+
  "/*}}}*/";
store.addNotification("NiceTaggingStyle", refreshStyles);
}

String.prototype.toJSON = function(){var namedprms = this.parseParams(null, null, true);var options ={};for(var i=0; i < namedprms.length;i++){var nameval = namedprms[i];if(nameval.name)options[nameval.name] = nameval.value;}return options;};

config.macros.niceTagger = {
  lingo:{
    add: "add"
  }
  ,twtags: {}
  ,initialised:{}
  ,init: function(field){
    if(!field)field = 'tags';
    if(this.initialised[field]){
        if(field =='tags'){
            var numTags= store.getTags();
            if(numTags.length == this.twtags[field].length) return;
        }
        else{
            return;
        }
    }
    var tiddlers= store.getTiddlers();
    config.macros.niceTagger.twtags[field] = [];
    var uniqueSuggestions = [];
    for(var i=0; i < tiddlers.length; i++){
      
      var tid = tiddlers[i];
      var values;
      if(field=='tags')values = tid.tags;
      else {
        values=tid.fields[field]
        if(!values)values="";
        values = values.readBracketedList();
      }
      for(var j=0; j < values.length; j++){
        uniqueSuggestions.pushUnique(values[j]);
      }
      
    }
    config.macros.niceTagger.twtags[field] = uniqueSuggestions;
    this.initialised[field] =true;
  }
  ,save: function(title,field,listvalues,place,autosavechanges){
    //console.log("save",title,field,list);
    var tiddler =  store.getTiddler(title);
    if(!tiddler) { //doesnt work when tiddler is brand spanking new
      var dummytiddler ={title:title,tags:[],fields:{}};
      var tagTempPlace = jQuery("input[edit="+field+"]",place);

      if(!tagTempPlace[0]){
        jQuery(place).append('<input style="display:none;" type="text" edit="'+field+'"/>')
      }
      tagTempPlace = jQuery("input[edit="+field+"]",place);
      
      var tags = [];
      if(field=='tags'){
          tags = listvalues;
          dummytiddler.tags = listvalues;
      }
      else{
          dummytiddler.fields[field] = listvalues;
      }
      tagTempPlace.val(String.encodeTiddlyLinkList(listvalues))
      return dummytiddler;
      //store.saveTiddler(title,title,null,true,null,tags,fields,null);
      //tiddler =  store.getTiddler(title);
    } 
    var strVal;
    if(typeof(listvalues) =='string'){
        strVal = listvalues;
    }
    else{
        strVal= String.encodeTiddlyLinkList(listvalues);
    } 
    //tiddler.fields[field] = strVal
    //store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,null,null,tiddler.tags,tiddler.fields,null);
    store.setValue(tiddler.title,field,strVal);
    store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, false, tiddler.created)
    if(autosavechanges)autoSaveChanges()      
    //story.setDirty(title,true);
    return tiddler;
        //console.log("finished save tags",tiddler.tags,"field",tiddler.fields[field]);
  }
  ,refreshFieldDisplay: function(place,tiddler,field){
    //console.log("refresh tasgs",field,tiddler.fields[field]);
    jQuery(place).html("");
    var tags;
    if(!field ||field=='tags'){
      tags = tiddler.tags;
    }
    else{
      var val= tiddler.fields[field];
      if(!val)val="";
      tags = val.readBracketedList();
    }
    for(var t=0; t < tags.length; t++){
      var tag = tags[t];
      jQuery(place).append(" <span class='tag'>"+tag+"</span> <span class='deleter' deletes='"+escape(tag)+"'>x</span>");
    }
      
    jQuery(".deleter",place).click(function(e){
      //console.log("gonna delete");
      var todelete = jQuery(this).attr("deletes");
      var newtags = [];
      //console.log("delete",todelete);
      for(var i=0; i < tags.length; i++){
          if(escape(tags[i]) != todelete){
             newtags.push(tags[i]);
          }
      }
      //console.log("Save",tiddler.title,field,newtags);
      tiddler = config.macros.niceTagger.save(tiddler.title,field,newtags,place,tiddler.autosavechanges);
      //console.log("Refresh",tiddler,field);
      config.macros.niceTagger.refreshFieldDisplay(place,tiddler,field);
      //console.log("done refresh")
    });
  }
  ,saveNewTag: function(tiddler,field,value,place,splitChar){
    var saveThis = [];
    
    var adder = jQuery("input",place)[0];
    if(field=='tags'){
        saveThis = tiddler.tags;
    }
    else{
      var val = tiddler.fields[field];
      if(!val)val= "";
      saveThis = val.readBracketedList();
    }
    //console.log(value,"is value");
    if(value && value.replace(" ","").length == 0) return;
    if(typeof(value) == 'string')value = value.trim();
    var savedVals;
    if(splitChar && value.indexOf(splitChar) !=-1){
      savedVals= value.split(splitChar);
    }
    else{
      savedVals = [value];
    }            
    for(var i=0; i < savedVals.length;i++){
      var svalue = savedVals[i];
      if(saveThis.indexOf(svalue) == -1) saveThis.push(svalue);
    }            
    tiddler= config.macros.niceTagger.save(tiddler.title,field,saveThis,place,tiddler.autosavechanges);
    
    var tagplace = jQuery(".niceTagger",place)[0];
    if(tagplace)config.macros.niceTagger.refreshFieldDisplay(tagplace,tiddler,field);
    if(adder)adder.value = "";
  }
  ,getSuggestionsFromTiddler: function(srcTiddler,textcase){
    var suggestions = [];
    if(srcTiddler){
      var src = store.getTiddler(srcTiddler);
      var text = src.text;
      var tempdiv = document.createElement("div");
      wikify(text,tempdiv,null,src);
      var html = jQuery(tempdiv).html();
      suggestions = html.split(/<br\/?>/gi);
    }
    var finalSuggestions = [];
    for(var i=0; i < suggestions.length; i++){
      var val = suggestions[i].trim();
      if(textcase && textcase == "lower")val = val.toLowerCase();
      finalSuggestions.pushUnique(val);
    }
    return finalSuggestions;
  }
  ,removeFromList: function(list,removeList){
    var uniqueSuggestions = [];
    for(var i=0; i < list.length; i++){
      var s =list[i];
      if(s && typeof(s) =='string'){
        if(uniqueSuggestions.indexOf(s) ==-1 && removeList.indexOf(s) ==-1){
          uniqueSuggestions.push(s);
        }
      }
    }
    return uniqueSuggestions;
  }
  ,handler: function(place,macroName,paramlist,wikifier,paramString,tiddler){
    var macro =config.macros.niceTagger;
    var options = paramString.toJSON();
    if(options.autoSaveChanges)tiddler.autosavechanges = true;
    if(!options.field)options.field = "tags";        
    this.init(options.field);
    var displayer = document.createElement("div");
    displayer.className = "niceTagger";
    place.appendChild(displayer);
    config.macros.niceTagger.refreshFieldDisplay(displayer,tiddler,options.field);
    var tagplace = document.createElement("div");
    tagplace.className ="niceTaggerAdder"
    place.appendChild(tagplace);
        
    var splitChar = options.splitOn;
    var saveNewTag= config.macros.niceTagger.saveNewTag;
    var adder;
    

    if(jQuery().autocomplete){
      var params = paramString.parseParams("anon",null,true,false,false);
      var textcase = getParam(params,"case");
      var srcTiddler = getParam(params,"valuesSource");
      var suggestions;
      if(srcTiddler)suggestions = macro.getSuggestionsFromTiddler(srcTiddler,textcase);
      else suggestions = [];
      var tagsoff = getParam(params,"nostoretags");
      if(!tagsoff) suggestions = suggestions.concat(config.macros.niceTagger.twtags[options.field]);
      
      
      var ignoreList = paramString.parseParams("exclude",null,true,false,true);
      if(ignoreList && ignoreList[0] && ignoreList[0]["exclude"]) ignoreList =  ignoreList[0]["exclude"];
      else ignoreList = ["excludeList"];
      suggestions = macro.removeFromList(suggestions,ignoreList);
    
      var addtaghandler = function(v){
        saveNewTag(tiddler,options.field,v,place,splitChar);
        jQuery("input",tagplace).val("");
      }
      jQuery("<input type='text' name=\""+options.field+"\" value=\"\"/>").autocomplete(suggestions,{matchContains: true,selectFirst:false}).result(addtaghandler).appendTo(tagplace);
      adder = jQuery("input",tagplace)[0];
      
    }
    else{
      adder = document.createElement("input");
      tagplace.appendChild(adder);
    }
    jQuery(adder).keypress(function (e) {
      if(e.which == 13){
        var results = jQuery(".ac_over",".ac_results"); //is anything highlighted in autocomplete plugin
        if(results.length ==0)saveNewTag(tiddler,options.field,adder.value,place,splitChar);
      }
    });
    var addbutton = document.createElement("input");
    addbutton.type = "button";
    addbutton.value = config.macros.niceTagger.lingo.add;
    addbutton.className = "adder";
    tagplace.appendChild(addbutton);
    jQuery(addbutton).click(function(e){
      var val = adder.value;
      saveNewTag(tiddler,options.field,val,place,splitChar);
    }); 
    jQuery(place).attr("dirty","true");
        
  }  
};
config.macros.niceTagger.init();
(function($) { 
/* The following code is optional and adds search suggestions */
/*
 * Autocomplete - jQuery plugin 1.0.2
 *
 * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $
 *
 */
 /* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
  * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
  *
  * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $
  * $Rev: 2447 $
  *
  * Version 2.1.1
  */
 (function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
  
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(3($){$.31.1o({12:3(b,d){5 c=Y b=="1w";d=$.1o({},$.D.1L,{11:c?b:14,w:c?14:b,1D:c?$.D.1L.1D:10,Z:d&&!d.1x?10:3U},d);d.1t=d.1t||3(a){6 a};d.1q=d.1q||d.1K;6 I.K(3(){1E $.D(I,d)})},M:3(a){6 I.X("M",a)},1y:3(a){6 I.15("1y",[a])},20:3(){6 I.15("20")},1Y:3(a){6 I.15("1Y",[a])},1X:3(){6 I.15("1X")}});$.D=3(o,r){5 t={2N:38,2I:40,2D:46,2x:9,2v:13,2q:27,2d:3x,2j:33,2o:34,2e:8};5 u=$(o).3f("12","3c").P(r.24);5 p;5 m="";5 n=$.D.2W(r);5 s=0;5 k;5 h={1z:B};5 l=$.D.2Q(r,o,1U,h);5 j;$.1T.2L&&$(o.2K).X("3S.12",3(){4(j){j=B;6 B}});u.X(($.1T.2L?"3Q":"3N")+".12",3(a){k=a.2F;3L(a.2F){Q t.2N:a.1d();4(l.L()){l.2y()}A{W(0,C)}N;Q t.2I:a.1d();4(l.L()){l.2u()}A{W(0,C)}N;Q t.2j:a.1d();4(l.L()){l.2t()}A{W(0,C)}N;Q t.2o:a.1d();4(l.L()){l.2s()}A{W(0,C)}N;Q r.19&&$.1p(r.R)==","&&t.2d:Q t.2x:Q t.2v:4(1U()){a.1d();j=C;6 B}N;Q t.2q:l.U();N;3A:1I(p);p=1H(W,r.1D);N}}).1G(3(){s++}).3v(3(){s=0;4(!h.1z){2k()}}).2i(3(){4(s++>1&&!l.L()){W(0,C)}}).X("1y",3(){5 c=(1n.7>1)?1n[1]:14;3 23(q,a){5 b;4(a&&a.7){16(5 i=0;i<a.7;i++){4(a[i].M.O()==q.O()){b=a[i];N}}}4(Y c=="3")c(b);A u.15("M",b&&[b.w,b.H])}$.K(1g(u.J()),3(i,a){1R(a,23,23)})}).X("20",3(){n.18()}).X("1Y",3(){$.1o(r,1n[1]);4("w"2G 1n[1])n.1f()}).X("1X",3(){l.1u();u.1u();$(o.2K).1u(".12")});3 1U(){5 b=l.26();4(!b)6 B;5 v=b.M;m=v;4(r.19){5 a=1g(u.J());4(a.7>1){v=a.17(0,a.7-1).2Z(r.R)+r.R+v}v+=r.R}u.J(v);1l();u.15("M",[b.w,b.H]);6 C}3 W(b,c){4(k==t.2D){l.U();6}5 a=u.J();4(!c&&a==m)6;m=a;a=1k(a);4(a.7>=r.22){u.P(r.21);4(!r.1C)a=a.O();1R(a,2V,1l)}A{1B();l.U()}};3 1g(b){4(!b){6[""]}5 d=b.1Z(r.R);5 c=[];$.K(d,3(i,a){4($.1p(a))c[i]=$.1p(a)});6 c}3 1k(a){4(!r.19)6 a;5 b=1g(a);6 b[b.7-1]}3 1A(q,a){4(r.1A&&(1k(u.J()).O()==q.O())&&k!=t.2e){u.J(u.J()+a.48(1k(m).7));$.D.1N(o,m.7,m.7+a.7)}};3 2k(){1I(p);p=1H(1l,47)};3 1l(){5 c=l.L();l.U();1I(p);1B();4(r.2U){u.1y(3(a){4(!a){4(r.19){5 b=1g(u.J()).17(0,-1);u.J(b.2Z(r.R)+(b.7?r.R:""))}A u.J("")}})}4(c)$.D.1N(o,o.H.7,o.H.7)};3 2V(q,a){4(a&&a.7&&s){1B();l.2T(a,q);1A(q,a[0].H);l.1W()}A{1l()}};3 1R(f,d,g){4(!r.1C)f=f.O();5 e=n.2S(f);4(e&&e.7){d(f,e)}A 4((Y r.11=="1w")&&(r.11.7>0)){5 c={45:+1E 44()};$.K(r.2R,3(a,b){c[a]=Y b=="3"?b():b});$.43({42:"41",3Z:"12"+o.3Y,2M:r.2M,11:r.11,w:$.1o({q:1k(f),3X:r.Z},c),3W:3(a){5 b=r.1r&&r.1r(a)||1r(a);n.1h(f,b);d(f,b)}})}A{l.2J();g(f)}};3 1r(c){5 d=[];5 b=c.1Z("\\n");16(5 i=0;i<b.7;i++){5 a=$.1p(b[i]);4(a){a=a.1Z("|");d[d.7]={w:a,H:a[0],M:r.1v&&r.1v(a,a[0])||a[0]}}}6 d};3 1B(){u.1e(r.21)}};$.D.1L={24:"3R",2H:"3P",21:"3O",22:1,1D:3M,1C:B,1a:C,1V:B,1j:10,Z:3K,2U:B,2R:{},1S:C,1K:3(a){6 a[0]},1q:14,1A:B,E:0,19:B,R:", ",1t:3(b,a){6 b.2C(1E 3J("(?![^&;]+;)(?!<[^<>]*)("+a.2C(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/2A,"\\\\$1")+")(?![^<>]*>)(?![^&;]+;)","2A"),"<2z>$1</2z>")},1x:C,1s:3I};$.D.2W=3(g){5 h={};5 j=0;3 1a(s,a){4(!g.1C)s=s.O();5 i=s.3H(a);4(i==-1)6 B;6 i==0||g.1V};3 1h(q,a){4(j>g.1j){18()}4(!h[q]){j++}h[q]=a}3 1f(){4(!g.w)6 B;5 f={},2w=0;4(!g.11)g.1j=1;f[""]=[];16(5 i=0,30=g.w.7;i<30;i++){5 c=g.w[i];c=(Y c=="1w")?[c]:c;5 d=g.1q(c,i+1,g.w.7);4(d===B)1P;5 e=d.3G(0).O();4(!f[e])f[e]=[];5 b={H:d,w:c,M:g.1v&&g.1v(c)||d};f[e].1O(b);4(2w++<g.Z){f[""].1O(b)}};$.K(f,3(i,a){g.1j++;1h(i,a)})}1H(1f,25);3 18(){h={};j=0}6{18:18,1h:1h,1f:1f,2S:3(q){4(!g.1j||!j)6 14;4(!g.11&&g.1V){5 a=[];16(5 k 2G h){4(k.7>0){5 c=h[k];$.K(c,3(i,x){4(1a(x.H,q)){a.1O(x)}})}}6 a}A 4(h[q]){6 h[q]}A 4(g.1a){16(5 i=q.7-1;i>=g.22;i--){5 c=h[q.3F(0,i)];4(c){5 a=[];$.K(c,3(i,x){4(1a(x.H,q)){a[a.7]=x}});6 a}}}6 14}}};$.D.2Q=3(e,g,f,k){5 h={G:"3E"};5 j,y=-1,w,1m="",1M=C,F,z;3 2r(){4(!1M)6;F=$("<3D/>").U().P(e.2H).T("3C","3B").1J(2p.2n);z=$("<3z/>").1J(F).3y(3(a){4(V(a).2m&&V(a).2m.3w()==\'2l\'){y=$("1F",z).1e(h.G).3u(V(a));$(V(a)).P(h.G)}}).2i(3(a){$(V(a)).P(h.G);f();g.1G();6 B}).3t(3(){k.1z=C}).3s(3(){k.1z=B});4(e.E>0)F.T("E",e.E);1M=B}3 V(a){5 b=a.V;3r(b&&b.3q!="2l")b=b.3p;4(!b)6[];6 b}3 S(b){j.17(y,y+1).1e(h.G);2h(b);5 a=j.17(y,y+1).P(h.G);4(e.1x){5 c=0;j.17(0,y).K(3(){c+=I.1i});4((c+a[0].1i-z.1c())>z[0].3o){z.1c(c+a[0].1i-z.3n())}A 4(c<z.1c()){z.1c(c)}}};3 2h(a){y+=a;4(y<0){y=j.1b()-1}A 4(y>=j.1b()){y=0}}3 2g(a){6 e.Z&&e.Z<a?e.Z:a}3 2f(){z.2B();5 b=2g(w.7);16(5 i=0;i<b;i++){4(!w[i])1P;5 a=e.1K(w[i].w,i+1,b,w[i].H,1m);4(a===B)1P;5 c=$("<1F/>").3m(e.1t(a,1m)).P(i%2==0?"3l":"3k").1J(z)[0];$.w(c,"2c",w[i])}j=z.3j("1F");4(e.1S){j.17(0,1).P(h.G);y=0}4($.31.2b)z.2b()}6{2T:3(d,q){2r();w=d;1m=q;2f()},2u:3(){S(1)},2y:3(){S(-1)},2t:3(){4(y!=0&&y-8<0){S(-y)}A{S(-8)}},2s:3(){4(y!=j.1b()-1&&y+8>j.1b()){S(j.1b()-1-y)}A{S(8)}},U:3(){F&&F.U();j&&j.1e(h.G);y=-1},L:3(){6 F&&F.3i(":L")},3h:3(){6 I.L()&&(j.2a("."+h.G)[0]||e.1S&&j[0])},1W:3(){5 a=$(g).3g();F.T({E:Y e.E=="1w"||e.E>0?e.E:$(g).E(),2E:a.2E+g.1i,1Q:a.1Q}).1W();4(e.1x){z.1c(0);z.T({29:e.1s,3e:\'3d\'});4($.1T.3b&&Y 2p.2n.3T.29==="3a"){5 c=0;j.K(3(){c+=I.1i});5 b=c>e.1s;z.T(\'3V\',b?e.1s:c);4(!b){j.E(z.E()-28(j.T("32-1Q"))-28(j.T("32-39")))}}}},26:3(){5 a=j&&j.2a("."+h.G).1e(h.G);6 a&&a.7&&$.w(a[0],"2c")},2J:3(){z&&z.2B()},1u:3(){F&&F.37()}}};$.D.1N=3(b,a,c){4(b.2O){5 d=b.2O();d.36(C);d.35("2P",a);d.4c("2P",c);d.4b()}A 4(b.2Y){b.2Y(a,c)}A{4(b.2X){b.2X=a;b.4a=c}}b.1G()}})(49);',62,261,'|||function|if|var|return|length|||||||||||||||||||||||||data||active|list|else|false|true|Autocompleter|width|element|ACTIVE|value|this|val|each|visible|result|break|toLowerCase|addClass|case|multipleSeparator|moveSelect|css|hide|target|onChange|bind|typeof|max||url|autocomplete||null|trigger|for|slice|flush|multiple|matchSubset|size|scrollTop|preventDefault|removeClass|populate|trimWords|add|offsetHeight|cacheLength|lastWord|hideResultsNow|term|arguments|extend|trim|formatMatch|parse|scrollHeight|highlight|unbind|formatResult|string|scroll|search|mouseDownOnSelect|autoFill|stopLoading|matchCase|delay|new|li|focus|setTimeout|clearTimeout|appendTo|formatItem|defaults|needsInit|Selection|push|continue|left|request|selectFirst|browser|selectCurrent|matchContains|show|unautocomplete|setOptions|split|flushCache|loadingClass|minChars|findValueCallback|inputClass||selected||parseInt|maxHeight|filter|bgiframe|ac_data|COMMA|BACKSPACE|fillList|limitNumberOfItems|movePosition|click|PAGEUP|hideResults|LI|nodeName|body|PAGEDOWN|document|ESC|init|pageDown|pageUp|next|RETURN|nullData|TAB|prev|strong|gi|empty|replace|DEL|top|keyCode|in|resultsClass|DOWN|emptyList|form|opera|dataType|UP|createTextRange|character|Select|extraParams|load|display|mustMatch|receiveData|Cache|selectionStart|setSelectionRange|join|ol|fn|padding|||moveStart|collapse|remove||right|undefined|msie|off|auto|overflow|attr|offset|current|is|find|ac_odd|ac_even|html|innerHeight|clientHeight|parentNode|tagName|while|mouseup|mousedown|index|blur|toUpperCase|188|mouseover|ul|default|absolute|position|div|ac_over|substr|charAt|indexOf|180|RegExp|100|switch|400|keydown|ac_loading|ac_results|keypress|ac_input|submit|style|150|height|success|limit|name|port||abort|mode|ajax|Date|timestamp||200|substring|jQuery|selectionEnd|select|moveEnd'.split('|'),0,{}))


})(jQuery); //end alias
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 225 48 52"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 333.00003 234 L 306 258.75003 L 301.5 270 L 312.75 265.50003 L 339.75 240.74998 Z M 337.5 229.50002 
		L 335.24988 231.75008 L 341.99997 238.50003 L 344.24997 236.24995 Z M 342 225.00003 L 339.74988 227.25009 
		L 346.5 234.00005 L 348.75 231.75003 Z M 301.5 273.9719 C 301.5 273.9719 309.59888 277.99927 317.70013 273.97183 
		C 325.80066 269.94437 341.99997 276.65686 341.99997 276.65686 L 341.99997 273.97195 
		C 341.99997 273.97195 325.80014 267.2594 317.70013 271.28687 C 309.6 275.31451 301.5 271.28683 301.5 271.28683 Z" 
		fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
/***
http://github.com/tiddlyweb/chrjs/raw/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.9.0
//
// TODO:
// * ensure all routes are supported
// * Policy class (attributes read, write, create, delete, manage, accept and owner)
// * documentation

(function($) {

tiddlyweb = {
	routes: {
		// host is the TiddlyWeb instance's URI (including server_prefix)
		// placeholders "_type" & "name" refer to the respective bag/recipe
		root     : "{host}/",
		bags     : "{host}/bags",
		bag      : "{host}/bags/{name}",
		recipes  : "{host}/recipes",
		recipe   : "{host}/recipes/{name}",
		tiddlers : "{host}/{_type}s/{name}/tiddlers",
		tiddler  : "{host}/{_type}s/{name}/tiddlers/{title}",
		revisions: "{host}/{_type}s/{name}/tiddlers/{title}/revisions",
		revision : "{host}/{_type}s/{name}/tiddlers/{title}/revisions/{id}",
		search   : "{host}/search?q={query}"
	}
};

// host (optional) is the URI of the originating TiddlyWeb instance
tiddlyweb.Resource = function(type, host) {
	if(arguments.length) { // initialization
		this._type = type; // XXX: somewhat redundant, as it generally corresponds to class name
		if(host !== false) {
			this.host = host !== undefined ? host.replace(/\/$/, "") : null;
		}
	}
};
$.extend(tiddlyweb.Resource.prototype, {
	// retrieves resource from server
	// callback is passed resource, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	// filters is a filter string (e.g. "select=tag:foo;limit=5")
	get: function(callback, errback, filters) {
		var uri = this.route();
		if(filters) {
			var separator = uri.indexOf("?") == -1 ? "?" : ";";
			uri += separator + filters;
		}
		var self = this;
		return $.ajax({
			url: uri,
			type: "GET",
			dataType: "json",
			success: function(data, status, xhr) {
				var resource = self.parse(data);
				callback(resource, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// sends resource to server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	put: function(callback, errback) {
		var uri = this.route();
		var data = {};
		var self = this;
		$.each(this.data, function(i, item) {
			var value = self[item];
			if(value !== undefined) {
				data[item] = value;
			}
		});
		return $.ajax({
			url: uri,
			type: "PUT",
			contentType: "application/json",
			data: $.toJSON(data),
			success: callback,
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// deletes resource on server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	"delete": function(callback, errback) {
		var uri = this.route();
		var self = this;
		return $.ajax({
			url: uri,
			type: "DELETE",
			success: callback,
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// returns corresponding instance from raw JSON object (if applicable)
	parse: function(data) {
		return data;
	},
	// list of accepted keys in serialization
	data: [],
	// returns resource's URI
	route: function() {
		return supplant(tiddlyweb.routes[this._type], this);
	}
});

var Container = function(type, name, host) {
	if(arguments.length) { // initialization
		tiddlyweb.Resource.apply(this, [type, host]);
		this.name = name;
		this.desc = "";
		this.policy = null;
	}
};
Container.prototype = new tiddlyweb.Resource();
$.extend(Container.prototype, {
	tiddlers: function() {
		return new TiddlerCollection(this);
	},
	parse: function(data) {
		var type = tiddlyweb._capitalize(this._type);
		var container = new tiddlyweb[type](this.name, this.host);
		return $.extend(container, data);
	},
	data: ["desc", "policy"]
});

// attribs is an object whose members are merged into the instance (e.g. query)
tiddlyweb.Collection = function(type, host, attribs) {
	if(arguments.length) { // initialization
		tiddlyweb.Resource.apply(this, [type, host]);
		$.extend(this, attribs);
	}
};
tiddlyweb.Collection.prototype = new tiddlyweb.Resource();

var TiddlerCollection = function(container, tiddler) {
	if(arguments.length) { // initialization
		tiddlyweb.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
		this.container = container || null;
		this.tiddler = tiddler || null;
	}
};
TiddlerCollection.prototype = new tiddlyweb.Collection();
$.extend(TiddlerCollection.prototype, {
	parse: function(data) {
		var host = this.container.host;
		return $.map(data, function(item, i) { // TODO: DRY (cf. Tiddler's parse method)
			var tiddler = new tiddlyweb.Tiddler(item.title);
			tiddler.bag = new tiddlyweb.Bag(item.bag, host);
			delete item.bag;
			if(item.recipe) {
				tiddler.recipe = new tiddlyweb.Recipe(item.recipe, host);
				delete item.recipe;
			}
			return $.extend(tiddler, item);
		});
	},
	route: function() {
		if(this.tiddler) {
			var container = this.tiddler.bag || this.tiddler.recipe;
			var params = {
				_type: container._type,
				host: container.host,
				name: container.name,
				title: this.tiddler.title
			};
		} else {
			params = this.container;
		}
		return supplant(tiddlyweb.routes[this._type], params);
	}
});

// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
tiddlyweb.Tiddler = function(title, container) {
	tiddlyweb.Resource.apply(this, ["tiddler", false]);
	this.title = title;
	this.bag = container && container._type == "bag" ? container : null;
	this.recipe = container && container._type == "recipe" ? container : null;
	var self = this;
	$.each(this.data, function(i, item) {
		self[item] = undefined; // exposes list of standard attributes for inspectability
	});
};
tiddlyweb.Tiddler.prototype = new tiddlyweb.Resource();
$.extend(tiddlyweb.Tiddler.prototype, {
	revisions: function() {
		return new TiddlerCollection(this.bag || this.recipe, this);
	},
	route: function() {
		var container = this.bag || this.recipe;
		var params = $.extend({}, this, {
			host: container ? container.host : null,
			_type: this.bag ? "bag" : (this.recipe ? "recipe" : null),
			name: container ? container.name : null
		});
		return supplant(tiddlyweb.routes[this._type], params);
	},
	parse: function(data) {
		var tiddler = new tiddlyweb.Tiddler(this.title);
		var container = this.bag || this.recipe;
		tiddler.bag = new tiddlyweb.Bag(data.bag, container.host);
		delete data.bag;
		if(this.recipe) {
			tiddler.recipe = this.recipe;
		}
		return $.extend(tiddler, data);
	},
	data: ["created", "modified", "modifier", "tags", "fields", "text", "type"]
});

tiddlyweb.Bag = function(name, host) {
	Container.apply(this, ["bag", name, host]);
};
tiddlyweb.Bag.prototype = new Container();

tiddlyweb.Recipe = function(name, host) {
	Container.apply(this, ["recipe", name, host]);
	this.recipe = [];
};
tiddlyweb.Recipe.prototype = new Container();
$.extend(tiddlyweb.Recipe.prototype, {
	data: ["recipe"].concat(Container.prototype.data)
});

/*
 * utilities
 */

tiddlyweb._capitalize = function(str) {
	return str.charAt(0).toUpperCase() + str.slice(1);
};

// adapted from Crockford (http://javascript.crockford.com/remedial.html)
var supplant = function(str, obj) {
	return str.replace(/{([^{}]*)}/g, function (a, b) {
		var r = obj[b];
		r = typeof r === "string" || typeof r === "number" ? r : a;
		return b == "host" ? r : encodeURIComponent(r); // XXX: special-casing
	});
};

})(jQuery);
//}}}
<<TiddlySpacePublisher>>
AAABAAYAEBAQAAEABAAoAQAAZgAAABAQAAABAAgAaAUAAI4BAAAQEAAAAQAgAGgEAAD2BgAAICAQAAEABADoAgAAXgsAACAgAAABAAgAqAgAAEYOAAAgIAAAAQAgAKgQAADuFgAAKAAAABAAAAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAjD3WKwEAAAAQAAAAgACAM4CAAADAwMAigICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAAAAALsREYh4h4gRERFId3d3d4QRFId3d3d3eEEYd3d3d3d3gYd3d3d3d3d4h3d3d3d3d3h3d3d3d3d3d4d3d3d3d3d4h3d3d3d3d3h3d3d3d3d3d4d3d3d3d3d4h3d3d3d3d3gYd3d3d3d3gRZ3d3d3d3dhEWh3d3d3hhEREYh4h4gREfgfAADgBwAAwAMAAIABAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIABAADAAwAA4AcAAPgfAAAoAAAAEAAAACAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////8z//wCZ//8AZv//ADP//4AA//+A/8z/gMzM/8CZzP+AZsz/ADPM/wAAzP8A/5n//8yZ//+Zmf//Zpn/ADOZ//8Amf///2b//8xm/8yZZv//Zmb/zDNm//8AZv/M/zP//8wz/yyZM//yZjP/LzMz//gAM/8s/wD//MwA/yyZAP/0ZgD/KDMA//QAAP8o///M9Mz/zCKZ/8z/Zv/MIjP/zP8A/8wi/8zM/8zMzCKZzMz/ZszM+DPMzP8AzMz//5nM8MyZzMCZmcyAZpnMgDOZzAAAmcwA/2bMAMxmzACZZswAZmbMADNmzAAAZswA/zPMgMwzzICZM8zAZjPM8DMzzAAAM8wA/wDMCswAzAqZAMwOZgDMdzMAzLcAAMy3//+Z+8z/mWWZ/5m7Zv+Z9DP/mQAA/5n+/8yZt8zMmbeZzJm7ZsyZtzPMmbsAzJm7/5mZVMyZmcuZmZmZZpmZJzOZmbsAmZm3/2aZt8xmmbuZZpl7ZmaZ+jNmmWUAZpkc/zOZmcwzmSiZM5m7ZjOZtzMzmbcAM5m7/wCZe8wAmXuZAJmyZgCZsTMAmfMAAJkA//9m/sz/ZruZ/2a3Zv9muzP/ZrcA/2a3/8xme8zMZrKZzGYcZsxmmTPMZikAzGa7/5lmt8yZZruZmWa3ZplmuzOZZrsAmWa7/2ZmG8xmZqmZZmaQZmZmyDNmZrIAZma7/zNmAcwzZgCZM2YEZjNmujMzZgEAM2YA/wBmAswAZvCZAGYAZgBm4TMAZssAAGaZ//8zDcz/MxGZ/zOqZv8zkDP/M6wA/zPL/8wzmczMMwuZzDO7ZswzmTPMMwkAzDOq/5kzkMyZM4iZmTMKZpkz6zOZMwAAmTMA/2YzCsxmMwCZZjMAZmYzAjNmM/8AZjMA/zMzAMwzMwCZMzMAZjMzADMzMwAAMzMA/wAzScwAMwCZADMAZgAzRzMAM2gAADMA//8AAMz/AACZ/wAAZv8AADP/AAAA/wAA/8wAAMzMAACZzAAAZswAADPMAAAAzAAA/5kAAMyZAACZmQAAZpkAADOZAAAAmQD//2YAAMxmAP+ZZgAAZmYA/zNmAAAAZgD//zMAAMwzAP+ZMwAAZjMA/zMzAAAAMwDM/wAAAMwAAMyZAAAAZgAAzDMAAAAAAO7MAADdAAAAu8wAAKoAAACIzAAAdwAAAFWZAABEAAAAIpkAABEAAO4AmQDdAAAAuwCZAKoAAACIAJkAdwAAAFUAmQBEAAAAIgBmABEAAO4AAGbdAAAAuwAAZqoAAACIAABmdwAAAFUAAGZEAAAAIgAAZhEAAADu7u4z3d3dALu7uzOqqqoAiIiIM3d3dwBVVVUzREREACIiIjMREREAAAAAM/////96eXl5eXl5ev////////15eU9OKipOT3l5/f///9B5TyoqKioqKioqT3nQ//95TyoqKioqKioqKipPef95eSoqKioxMjIxKioqKnl5eU8qKioxMQcHMTEqKipPeXlOKioxMQcHBwcxMSoqTnl5KioqMgcHBwcHBzIqKip5eSoqKjIHBwcHBwcyKioqeXlOKioxMQcHBwcxMSoqTnl5TyoqKjExBwcxMSoqKk95eXkqKioqMTIyMSoqKip5ef95TyoqKioqKioqKipPef//pXlPKioqKioqKipPeaX///+leXlPTioqTk95eaX///////95eXl5eXl5ef/////4HwAA4AcAAMADAACAAQAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAOAHAAD4HwAAKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAWghWMuu6F4lsClfOK+pHr4vqR6+MClfOK7oXiWoIVjLgAAAAUAAAADAAAAAQAAAAAAAAABAAAABCIiEQ+zm3WfwKV89tzCnPvw17L/+eG8//nhvP/w17L/3MKc+8ClfPazm3WfIiIRDwAAAAQAAAABAAAAATMzGQq8oXnHzbOL9fngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/54Lz/zbOL9byhecczMxkKAAAAAQAAAAG+pXuZzbOL9fvjv//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//vjv//Ns4v1vqV7mQAAAAG6m3YpwaZ99fngvP/85cD//OXA//DUwf/Fnsr/soXN/7KFzf/Fnsr/8NTB//zlwP/85cD/+eC8/8GmffW6m3YpvaV6lNzCnPv85cD//OXA//DUwf+0iM3/yqXh/92/8P/dv/D/yqXh/7SIzf/w1MH//OXA//zlwP/cwpz7vaV6lMGnfuHw17L//OXA//zlwP/Fnsr/yqXh/+HD8//hw/P/4cPz/+HD8//KpeH/xZ7K//zlwP/85cD/8Nex/8GnfuG+pXr3+eG8//zlwP/85cD/soXN/92/8P/hw/P/4cPz/+HD8//hw/P/3b/w/7KFzf/85cD//OXA//nhvP++pXr3vqV69/nhvP/85cD//OXA/7KFzf/dv/D/4cPz/+HD8//hw/P/4cPz/92/8P+yhc3//OXA//zlwP/54bz/vqV698GnfuHw17L//OXA//zlwP/Fnsr/yqXh/+HD8//hw/P/4cPz/+HD8//KpeH/xZ7K//zlwP/85cD/8Ney/8GnfuG9pXqU3MKc+/zlwP/85cD/8NTB/7SIzf/KpeH/3b/w/92/8P/KpeH/tIjN//DUwf/85cD//OXA/9zCnPu9pXqUupt2KcGmffX54Lz//OXA//zlwP/w1MH/xZ7K/7KFzf+yhc3/xZ7K//DUwf/85cD//OXA//ngvP/Bpn31upt2KQAAAAC9pHyYzrSN9Pvjv//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//vjv//OtI30vaR8mAAAAAAAAAAAZmYzBcKmfsPOtI30+eC8//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/OtI30wqZ+w2ZmMwUAAAAAAAAAAAAAAABmZjMFvaR8mMGmffXcwpz78Ney//nhvP/54bz/8Ney/9zCnPvBpn31vaR8mGZmMwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6m3YpvaV6lMGnfuG+pXr3vqV698GnfuG9pXqUupt2KQAAAAAAAAAAAAAAAAAAAAD4HwAA4AcAAMADAACAAQAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAOAHAAD4HwAAKAAAACAAAABAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAjD3WKwEAAAAQAP15eU9OKipOT3l5/f///9B5TyoqKioqKioqT3nQ//95TyoqKioqKioqKipPef8REREREVyIiIiIxREREREREREREViIiIiIiIiFEREREREREZyIiIiIiIiIiMkRERERERWIiIiIiIiIiIiIURERERFYiIiIiIiIiIiIiIUREREViIiIiIiIiIiIiIiIURERWIiIiIiIiIiIiIiIiIUREYiIiIiIiIiIiIiIiIiIERyIiIiIiIgiIoiIiIiIiMEYiIiIiIgiIiIiiIiIiIiBWIiIiIgiInd3IiKIiIiIhYiIiIiIInd3d3ciiIiIiIiIiIiIgid3d3d3ciiIiIiIiIiIiIInd3d3d3IoiIiIiIiIiIgid3d3d3d3IoiIiIiIiIiIInd3d3d3dyKIiIiIiIiIiCJ3d3d3d3ciiIiIiIiIiIgid3d3d3d3IoiIiIiIiIiIgid3d3d3ciiIiIiIiIiIiIInd3d3d3IoiIiIiIiIiIiIInd3d3ciiIiIiIhYiIiIiCIid3ciIoiIiIiFGIiIiIiIIiIiIoiIiIiIgRyIiIiIiIgiIoiIiIiIiMERiIiIiIiIiIiIiIiIiIgREViIiIiIiIiIiIiIiIiFEREYiIiIiIiIiIiIiIiIgREREciIiIiIiIiIiIiIjBEREREYiIiIiIiIiIiIiIEREREREViIiIiIiIiIiIURERERERERyIiIiIiIiIwRERERERERERFYiIiIiIUREREREf/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/KAAAACAAAABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAABXSOAwEAAAAz//+AAP//gP/M/4DMzP/Amcz/gGbM/wAzzP8AAMz/AP+Z///Mmf//mZn//2aZ/wAzmf//AJn///9m///MZv/MmWb//2Zm/8wzZv//AGb/zP8z///MM/8smTP/8mYz/y8zM//4ADP/LP8A//zMAP8smQD/9GYA/ygzAP/0AAD/KP//zPTM/8wimf/M/2b/zCIz/8z/AP/MIv/MzP/MzMwimczM/2bMzPgzzMz/AMzM//+ZzPDMmczAmZnMgGaZzIAzmcwAAJnMAP9mzADMZswAmWbMAGZmzAAzZswAAGbMAP8zzIDMM8yAmTPMwGYzzPAzM8wAADPMAP8AzArMAMwKmQDMDmYAzHczAMy3AADMt///mfvM/5llmf+Zu2b/mfQz/5kAAP+Z/v/MmbfMzJm3mcyZu2bMmbczzJm7AMyZu/+ZmVTMmZnLmZmZmWaZmSczmZm7AJmZt/9mmbfMZpm7mWaZe2ZmmfozZpllAGaZHP8zmZnMM5komTOZu2YzmbczM5m3ADOZu/8AmXvMAJl7mQCZsmYAmbEzAJnzAACZAP//Zv7M/2a7mf9mt2b/Zrsz/2a3AP9mt//MZnvMzGaymcxmHGbMZpkzzGYpAMxmu/+ZZrfMmWa7mZlmt2aZZrszmWa7AJlmu/9mZhvMZmapmWZmkGZmZsgzZmayAGZmu/8zZgHMM2YAmTNmBGYzZrozM2YBADNmAP8AZgLMAGbwmQBmAGYAZuEzAGbLAABmmf//Mw3M/zMRmf8zqmb/M5Az/zOsAP8zy//MM5nMzDMLmcwzu2bMM5kzzDMJAMwzqv+ZM5DMmTOImZkzCmaZM+szmTMAAJkzAP9mMwrMZjMAmWYzAGZmMwIzZjP/AGYzAP8zMwDMMzMAmTMzAGYzMwAzMzMAADMzAP8AM0nMADMAmQAzAGYAM0czADNoAAAzAP//AADM/wAAmf8AAGb/AAAz/wAAAP8AAP/MAADMzAAAmcwAAGbMAAAzzAAAAMwAAP+ZAADMmQAAmZkAAGaZAAAzmQAAAJkA//9mAADMZgD/mWYAAGZmAP8zZgAAAGYA//8zAADMMwD/mTMAAGYzAP8zMwAAADMAzP8AAADMAADMmQAAAGYAAMwzAAAAAADuzAAA3QAAALvMAACqAAAAiMwAAHcAAABVmQAARAAAACKZAAARAADuAJkA3QAAALsAmQCqAAAAiACZAHcAAABVAJkARAAAACIAZgARAADuAABm3QAAALsAAGaqAAAAiAAAZncAAABVAABmRAAAACIAAGYRAAAA7u7uM93d3QC7u7szqqqqAIiIiDN3d3cAVVVVM0RERAAiIiIzERERAAAAADMBAQEBAQEBAQEBpXl5eXl5eXl5eXmlAQEBAQEBAQEBAQEBAQEBAQEBgHl5eXl5eXl5eXl5eXl5gAEBAQEBAQEBAQEBAQEB/Xp5eXlVT04qKioqTk9VeXl5ev0BAQEBAQEBAQEBAaV5eXlPKioqKioqKioqKioqT3l5eaUBAQEBAQEBAQGAeXlVTioqKioqKioqKioqKioqTlV5eYABAQEBAQEBgHl5VSoqKioqKioqKioqKioqKioqKlV5eYABAQEBAaV5eVUqKioqKioqKioqKioqKioqKioqKlV5eaUBAQEBeXlVKioqKioqKioqKioqKioqKioqKioqKlV5eQEBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBeXlPKioqKioqKjEyMjIyMjIyMjEqKioqKioqT3l5AXp5eSoqKioqKioxMjIxBwcHBzEyMjEqKioqKioqeXl6eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl5eU8qKioqKioyMgcHBwcHBwcHBwcyMioqKioqKk95eXl5TioqKioqMTIxBwcHBwcHBwcHBzEyMSoqKioqTnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eSoqKioqKjEyBwcHBwcHBwcHBwcHMjEqKioqKip5eXl5KioqKioqMTIHBwcHBwcHBwcHBwcyMSoqKioqKnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eU4qKioqKjEyMQcHBwcHBwcHBwcxMjEqKioqKk55eXl5TyoqKioqKjIyBwcHBwcHBwcHBzIyKioqKioqT3l5eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl6eXkqKioqKioqMTIyMQcHBwcxMjIxKioqKioqKnl5egF5eU8qKioqKioqMTIyMjIyMjIyMSoqKioqKipPeXkBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBAXl5VSoqKioqKioqKioqKioqKioqKioqKipVeXkBAQEB+nl5VSoqKioqKioqKioqKioqKioqKioqVXl5+gEBAQEBenl5VSoqKioqKioqKioqKioqKioqKlV5eXoBAQEBAQEBeXl5VU4qKioqKioqKioqKioqKk5VeXl5AQEBAQEBAQEBenl5eU8qKioqKioqKioqKipPeXl5egEBAQEBAQEBAQEB+nl5eXlVT04qKioqTk9VeXl5efoBAQEBAQEBAQEBAQEBAXl5eXl5eXl5eXl5eXl5eXkBAQEBAQEBAQEBAQEBAQEBAQF6eXl5eXl5eXl5eXoBAQEBAQEBAQEB/+AH//+AAf/+AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAADwAAAA+AAAAfwAAAP+AAAH/wAAD/+AAB//4AB///gB/8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAABG1bSA61m3JXuqB4mbuhd8m9o3jqvaF4+b2hePm9o3jqu6F3ybqgeJm1m3JXbVtIDgAAAAQAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACI98Wye0nXWavKF4876kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev+8oXjztJ11mo98WycAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAAChwcHBKulnGJvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+K6WcYkcHBwSAAAACgAAAAcAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAADAAAABwAAAAtuYkUst552z76kev++pHr+1LuS//Latf/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/8tq1/9S7kv++pHr+vqR6/7eeds9uYkUsAAAACwAAAAcAAAADAAAAAQAAAAAAAAABAAAAAgAAAAQAAAAIi3hbNbqgd+a+pHr/xayD/+3Vr//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr//FrIP/vqR6/7qgd+aJdVg0AAAACAAAAAQAAAACAAAAAQAAAAEAAAACAAAABIl8WSW8oXjlvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7yheOWJfFklAAAABAAAAAIAAAABAAAAAAAAAAFfXz8Iu6F4zL6kev/Msor/+uK+//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//rivv/Msor/vqR6/7uheMxfXz8IAAAAAQAAAAAAAAAAAAAAAbqid4K+pHr/xayD//ngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//fgvP/FrIP/vqR6/7qid4IAAAABAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAALuheJa+pHr/1LuS//zlwP/85cD//OXA//zlwP/85cD//OXA//riwP/Pq8f/r4HM/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HN/6+BzP/Pq8f/+uLA//zlwP/85cD//OXA//zlwP/85cD//OXA/9S5kv++pHr/u6F4lgAAAACii3MLvKF4876kev/y2rX//OXA//zlwP/85cD//OXA//zlwP/64sD/w5vJ/6+Bzf+vg83/w5vc/9W06v/dwPD/3cDw/9W06v/Dm9z/r4PN/6+Bzf/Dm8n/+uLA//zlwP/85cD//OXA//zlwP/85cD/8tq1/76kev+8oXjzootzC72feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVvaF4mL6kev/fxZ7//OXA//zlwP/85cD//OXA//zlwP/v08L/r4HM/6+Dzf/Wtev/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/r4PN/6+BzP/v08L//OXA//zlwP/85cD//OXA//zlwP/fxZ7/vqR6/72heJi8oXfIvqR6/+zUrv/85cD//OXA//zlwP/85cD//OXA/9Crx/+vgc3/w5vc/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Dm9z/r4HN/9Crx//85cD//OXA//zlwP/85cD//OXA/+zUrv++pHr/vKF3yL2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvaF4+b6kev/64r7//OXA//zlwP/85cD//OXA//zlwP+zhsz/r4HN/93A8P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/3cDw/6+Bzf+zhsz//OXA//zlwP/85cD//OXA//zlwP/64r7/vqR6/72hePm9oXj5vqR6//rivv/85cD//OXA//zlwP/85cD//OXA/7OGzP+vgc3/3cDw/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//dwPD/r4HN/7OGzP/85cD//OXA//zlwP/85cD//OXA//rivv++pHr/vaF4+b2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvKF3yL6kev/s1K7//OXA//zlwP/85cD//OXA//zlwP/Qq8f/r4HN/8Ob3P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/w5vc/6+Bzf/Qq8f//OXA//zlwP/85cD//OXA//zlwP/s1K7/vqR6/7yhd8i9oXiYvqR6/9/Fnv/85cD//OXA//zlwP/85cD//OXA/+/Twv+vgcz/r4PN/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9a16/+vg83/r4HM/+/Twv/85cD//OXA//zlwP/85cD//OXA/9/Fnv++pHr/vaF4mL2feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVootzC7yhePO+pHr/8tq1//zlwP/85cD//OXA//zlwP/85cD/+uLA/8Obyf+vgc3/r4PN/8Ob3P/VtOr/3cDw/93A8P/VtOr/w5vc/6+Dzf+vgc3/w5vJ//riwP/85cD//OXA//zlwP/85cD//OXA//Latf++pHr/vKF486KLcwsAAAAAu6N3l76kev/Uu5L//OXA//zlwP/85cD//OXA//zlwP/85cD/+uLA/8+rx/+vgcz/r4HN/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HM/8+rx//64sD//OXA//zlwP/85cD//OXA//zlwP/85cD/1LmS/76kev+7oXiWAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAAAAAAAC6oneCvqR6/8Wsg//54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/34Lz/xayD/76kev+6oneCAAAAAAAAAAAAAAAAAAAAAH9/VQa8oHjLvqR6/8yyiv/64r7//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/+uK+/8yyiv++pHr/vKB4y39/VQYAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh67o3nkvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7ujeeSyoW4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqbdim7o3nkvqR6/8Wsg//t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/t1a//xayD/76kev+7o3nkupt2KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh68oHjLvqR6/76kev7Uu5L/8tq1//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/y2rX/1LmS/76kev6+pHr/vKB4y7Khbh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VQa6oneCvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+Lqid4J/f1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3l28gu6F4lryhePO+pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vKF487uheJa3l28gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAootzC72feFW9oXiYvKF3yL2jeOq9oXj5vaF4+b2jeOq8oXfIvaF4mL2feFWii3MLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/
/*{{{*/
#sidebar .wizard table {
	margin: 0px;
}

#menuBar #sidebarOptions {
	margin-right: 0.6em;
}

#sidebarTabs {
	position: absolute;
	right: 0;
	top: 0;
	width: 22.2em;
}

.tabset {
	padding: 1em 6px 1px 0;
	position: relative;
	top: 2px;
}

#sidebarTabs .tabsetWrapper .tabset {
	float: left;
	height: auto;
	display: inline;
	width: 5.5em;
	word-wrap: break-word;
	top: 0;
	padding: 0 0 1px;
}

#sidebarTabs .tabsetWrapper .tabsetWrapper .tabset {
	float: none;
	height: auto;
	top: 1px;
	padding: 0 0 1px;
}

.tab {
	margin: 0.1em 0.25em 0 0;
	padding: 6px 6px 0;
	display: inline-block;
}

#sidebarTabs .tabsetWrapper .tabset .tab {
	display: block;
	margin: 0 0 1px 0.25em;
	padding: 1em 6px 0.5em;
	position: relative;
	left: 3px;
	border-right: 0;
	border-bottom: 1px solid [[ColorPalette::TertiaryMid]];
	border-color: [[ColorPalette::TertiaryMid]];
}

dd {
	margin-left: 0px;
}

#sidebarTabs .tabsetWrapper .tabContents {
	display: inline;
	border-width: 1px 1px 1px 3px;
	float: left;
	border-color: [[ColorPalette::TertiaryMid]];
	*height: expression(this.scrollHeight < 301? "300px" : "auto");
	min-height: 25em;
	background-color: [[ColorPalette::TertiaryPale]];
}

/*}}}*/
{{textRight{
<<TiddlySpaceLogout>>
<<tabs txtUserTab
	"Your Identities" "Manage your identities" BackstageIdentities
	"Your Spaces" "Maintain your spaces and create new ones" BackstageUserSpaces
	"Your Password" "Change your password" BackstagePassword
>>
}}}
Enter some details about your sibling here.
<!--{{{-->
		<div id='messageArea'></div>
<img class='siteIcon' src='SiteIcon' />
<div class='ftTitle' refresh='content' force='true' tiddler='SiteTitle'></div>
<div class='clear'></div>
<div class='ftSubTitle' refresh='content' force='true' tiddler='SiteSubtitle'></div>
<div class='ftContainer'>
	<div id='topToolbar' tiddler='topToolbar' refresh='content'></div>
	<div id='sidebar'>
		<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>

	</div>
	
	<div id='displayArea'>
		<div class='ftHideCorner'></div>

		<div id='tiddlerDisplay'></div>
		
	</div>

</div>
<!--}}}-->
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.6.2|
|''Description''|Initializes new TiddlySpaces the first time they are created|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpaceInit.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig RandomColorPalettePlugin chrjs|
!TODO
* robust error notification and recovery
!Code
***/
//{{{
(function($) {

var versionField = "tiddlyspaceinit_version";

var currentSpace = config.extensions.tiddlyspace.currentSpace;

var plugin = config.extensions.TiddlySpaceInit = {
	version: "0.2",
	SiteTitle: "%0",
	SiteSubtitle: "a TiddlySpace",
	flagTitle: "%0SetupFlag",
	flagWarning: "Please do not modify this tiddler; it was created " +
		"automatically upon space creation.",

	dispatch: function() {
		var title = plugin.flagTitle.format([currentSpace.name]);
		config.annotations[title] = this.flagWarning;
		if(currentSpace.type != "private") {
			return;
		}
		var tiddlers = [];
		var tid = store.getTiddler(title);
		if(tid) {
			curVersion = parseFloat(tid.fields[versionField]);
			reqVersion = parseFloat(plugin.version);
			if(curVersion < reqVersion) {
				plugin.update(curVersion);
				tid.fields[versionField] = plugin.version;
				tid.incChangeCount();
				tid = store.saveTiddler(tid);
				tiddlers.push(tid);
			}
		} else { // first run
			tid = new Tiddler(title);
			tid.tags = ["excludeLists", "excludeSearch"];
			tid.fields = $.extend({}, config.defaultCustomFields);
			tid.fields[versionField] = plugin.version;
			tid.text = "@@%0@@".format([plugin.flagWarning]);
			tid = store.saveTiddler(tid);
			tiddlers = tiddlers.concat(plugin.firstRun(), tid);
		}
		autoSaveChanges(null, tiddlers);
	},
	update: function(curVersion) {
		if(curVersion < 0.2) {
			this.createAvatar();
		}
	},
	firstRun: function() {
		var tiddlers = [];
		var pubWorkspace = "bags/%0_public".format([currentSpace.name]);
		// generate Site*itle
		$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
			var tid = new Tiddler(item);
			tid.tags = ["excludeLists", "excludeSearch"];
			tid.fields = $.extend({}, config.defaultCustomFields, {
				"server.workspace": pubWorkspace
			});
			tid.text = plugin[item].format([currentSpace.name]);
			tid = store.saveTiddler(tid);
			tiddlers.push(tid);
		});
		// generate ColorPalette (ensuring it's public)
		var wfield = "server.workspace";
		var workspace = config.defaultCustomFields[wfield];
		config.defaultCustomFields[wfield] = pubWorkspace; // XXX: hacky
		config.macros.RandomColorPalette.generatePalette({}, true);
		config.defaultCustomFields[wfield] = workspace;
		// generate avatar
		this.createAvatar();
		return tiddlers;
	},
	createAvatar: function() {
		var avatar = "SiteIcon";
		var tweb = config.extensions.tiddlyweb;
		var host = tweb.host;
		var notify = function(xhr, error, exc) {
			displayMessage("ERROR: could not create avatar - " + // TODO: i18n
				"%0: %1".format([xhr.statusText, xhr.responseText]));
			// TODO: resolve!?
		};

		var pubBag = currentSpace.name + "_public";
		var tid = new tiddlyweb.Tiddler(avatar);
		tid.bag = new tiddlyweb.Bag(pubBag, host);

		var callback = function(data, status, xhr) {}; // avatar already exists; do nothing
		var errback = function(xhr, error, exc) {
			if(xhr.status != 404) {
				return;
			}
			// copy default avatar
			var _notify = function(tid, status, xhr) {
				displayMessage("created avatar"); // TODO: i18n
			};
			var _callback = function(tid, status, xhr) {
				tid.title = avatar;
				tid.bag.name = pubBag;
				tid.put(_notify, notify); // TODO: add to current session document (via adaptor?)
			};
			tweb.getUserInfo(function(user) {
				var avatarTitle = currentSpace.name == user.name ?
					"defaultUserIcon" : "defaultSiteIcon";
				var tid = new tiddlyweb.Tiddler(avatarTitle);
				tid.bag = new tiddlyweb.Bag("common", host);
				tid.get(_callback, notify);
			});
		};
		tid.get(callback, errback);
	}
};

$(document).bind("startup", plugin.dispatch);

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 592 37 36" width="37pt" height="3pc"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-07-21 12:53Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.3 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 303.9367 606.33264 C 305.2315 598.36346 312.91907 592.91986 321.09567 594.18182 C 329.2731 595.4438 334.8583 602.9364 333.56348 610.9065 C 332.26782 618.8758 324.58026 624.31934 316.40369 623.05737 C 308.22711 621.7954 302.64102 614.30194 303.9367 606.33264 Z" fill="#c1e6fd"/><path d="M 303.9367 606.33264 C 305.2315 598.36346 312.91907 592.91986 321.09567 594.18182 C 329.2731 595.4438 334.8583 602.9364 333.56348 610.9065 C 332.26782 618.8758 324.58026 624.31934 316.40369 623.05737 C 308.22711 621.7954 302.64102 614.30194 303.9367 606.33264 Z" stroke="#7aa3be" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/><path d="M 318.70273 614.1482 C 315.33759 614.1482 312.60602 611.4859 312.60602 608.20605 C 312.60602 604.9254 315.33759 602.2639 318.70273 602.2639 C 322.06784 602.2639 324.79944 604.9254 324.79944 608.20605 C 324.79944 611.4859 322.06784 614.1482 318.70273 614.1482 Z" fill="white"/><path d="M 318.70273 614.1482 C 315.33759 614.1482 312.60602 611.4859 312.60602 608.20605 C 312.60602 604.9254 315.33759 602.2639 318.70273 602.2639 C 322.06784 602.2639 324.79944 604.9254 324.79944 608.20605 C 324.79944 611.4859 322.06784 614.1482 318.70273 614.1482 Z" stroke="#6a96bd" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/><path d="M 315.1293 613.7912 C 316.02603 608.27203 321.35019 604.50195 327.01303 605.37598 C 332.67642 606.24994 336.54456 611.4391 335.64783 616.95892 C 334.75049 622.47815 329.42633 626.24823 323.76352 625.3742 C 318.10068 624.5002 314.23193 619.3105 315.1293 613.7912 Z" fill="white"/><path d="M 315.1293 613.7912 C 316.02603 608.27203 321.35019 604.50195 327.01303 605.37598 C 332.67642 606.24994 336.54456 611.4391 335.64783 616.95892 C 334.75049 622.47815 329.42633 626.24823 323.76352 625.3742 C 318.10068 624.5002 314.23193 619.3105 315.1293 613.7912 Z" stroke="#bebebe" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/><path d="M 325.3543 619.20392 C 323.02374 619.20392 321.13193 617.36005 321.13193 615.08856 C 321.13193 612.81653 323.02374 610.97327 325.3543 610.97327 C 327.68488 610.97327 329.5767 612.81653 329.5767 615.08856 C 329.5767 617.36005 327.68488 619.20392 325.3543 619.20392 Z" fill="#f4c4e2"/><path d="M 325.3543 619.20392 C 323.02374 619.20392 321.13193 617.36005 321.13193 615.08856 C 321.13193 612.81653 323.02374 610.97327 325.3543 610.97327 C 327.68488 610.97327 329.5767 612.81653 329.5767 615.08856 C 329.5767 617.36005 327.68488 619.20392 325.3543 619.20392 Z" stroke="#ce81b0" stroke-linecap="butt" stroke-linejoin="bevel" stroke-width="2"/></g></g></svg>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div><span class='title' macro='view title'></span> (excluded from tree)
</div>
<div class="tiddlerOrigin" macro="tiddlerOrigin"></div>
<div class="modifier" macro="view modifier SiteIcon width:48 height:48"></div>
<div class='concertina'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>

<div macro='view text wikified'></div>
<div class='tagClear'></div>

<!--}}}-->
/***
|''Name''|TiddlySpacePublisher|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Requires''|TiddlySpacePublishCommand|
|''Author''|Jon Robson|
|''Version''|<0.1.1>|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/RandomColorPalettePlugin/RandomColorPalettePlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<TiddlySpacePublisher>>
creates an interface with which you can manage unpublished versions of tiddlers.
}}}
!Params
filter: allows you to run the publisher on a filtered set of tiddlers.
eg. filter:[tag[systemConfig]]

!Code
***/
/*{{{*/
(function($){
	var macro = config.macros.TiddlySpacePublisher = {
		locale: {
			title: "Publisher",
			updatedPrivateTiddler: "newer than published version {{viewPublicTiddler{%0}}}",
			makePublicLabel: "Make public",
			noTiddlersText: "No tiddlers to publish",
			makePublicPrompt: "Make all the selected tiddlers public.",
			description: "Publish tiddlers to public version of this space",
			pleaseWait: "please wait while we load the publisher... "
		},
		
		listViewTemplate: {
			columns:[
				{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
				{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
				{name: 'Text', field: 'text', title: "Text", type: 'String'},
				{name: 'Status', field: 'status', title: "Status", type: 'WikiText'}
			],
			rowClasses:[
				{className: 'updated', field: 'updated'},
				{className: 'notPublished', field: 'notPublished'}
			]
		},
		publishedTiddlers: {}, // maps tiddler titles to a currently public tiddler where public tiddlers exist
		getPublicTiddlers: function(listWrapper, paramString, spaceName) { // fills in publishedTiddlers variable above
			ajaxReq({
				url: "/recipes/"+ spaceName + "_public/tiddlers.json",
				success: function(tiddlers){
					for(var i = 0; i < tiddlers.length; i++) {
						var tid = tiddlers[i];
						macro.publishedTiddlers[tid.title] = tid;
					}
					macro.refresh(listWrapper,paramString);
				}
			});
		},
		makePublic: function(e, listWrapper, paramString){ // this is what is called when you click the publish button
			var wizard = new Wizard(e.target);
				var listView = wizard.getValue("listView");
				var rowNames = ListView.getSelectedRows(listView);
				var callback = function(status) {
					macro.refresh(listWrapper,paramString);
				};
				for(var i = 0; i < rowNames.length; i++) {
					var tiddlerTitle = rowNames[i];
					macro.publishedTiddlers[tiddlerTitle] = store.getTiddler(tiddlerTitle);
					config.commands.publishTiddlerRevision.publishTiddler(tiddlerTitle, callback);
				}
		},
		handler: function(place, macroName, params, wikifier, paramString) {
			var wizard = new Wizard();
			var locale = macro.locale;
			wizard.createWizard(place,locale.title);
			wizard.addStep(macro.locale.description,"<input type='hidden' name='markList'></input>");
			var markList = wizard.getElement("markList");
			var listWrapper = document.createElement("div");
			markList.parentNode.insertBefore(listWrapper,markList);
			listWrapper.setAttribute("refresh","macro");
			listWrapper.setAttribute("macroName","SpaceManager");
			listWrapper.setAttribute("params",paramString);
			
			$(listWrapper).text(macro.locale.pleaseWait);
			this.getPublicTiddlers(listWrapper,paramString,config.extensions.tiddlyspace.currentSpace.name);
		},
		refresh: function(listWrapper, paramString){
			var wizard = new Wizard(listWrapper);
			var locale = macro.locale;
			var selectedRows = [];
			ListView.forEachSelector(listWrapper, function(e,rowName) {
				if(e.checked) {
					selectedRows.push(e.getAttribute("rowName"));
				}
			});
			removeChildren(listWrapper);
			var params = paramString.parseParams("anon");
			var publishCandidates = [];
			var unpublishedTiddlers;
			var filter = params[0].filter;
			if(filter) {
				unpublishedTiddlers = store.filterTiddlers(filter[0]);
			} else {
				unpublishedTiddlers = store.getTiddlers();
			}
			var publishedTiddlers = macro.publishedTiddlers;
			var spaceName = config.extensions.tiddlyspace.currentSpace.name;
			var privateBag = spaceName +"_private";
			for(var t = 0; t < unpublishedTiddlers.length; t++) {
				var include = false;
				var tiddler = unpublishedTiddlers[t];
				var bag = tiddler.fields['server.bag'];
				if(!tiddler.tags.contains("excludePublisher")) {
					if(bag == privateBag) {
						var candidate = {
							title:tiddler.title,
							tiddler:tiddler,
							text: tiddler.text.substr(0,100)
						};
						if(tiddler.text.length > 100) {
							candidate.text += "... ";
						}
						var publishedTiddler = publishedTiddlers[tiddler.title];
						if(publishedTiddler) {
							var publishedModified = publishedTiddler.modified;
							if(typeof(publishedModified) == typeof("")) {
								publishedModified = Date.convertFromYYYYMMDDHHMM(publishedModified);
							}
							if(publishedModified < tiddler.modified) {
								candidate.status = "%0".format([locale.updatedPrivateTiddler.format([tiddler.title])]);
								candidate.publicTiddler = publishedTiddler;
								candidate.updated = true;
								include = true;
							}
						}
						else {
							candidate.status = 'unpublished';
							include = true;
							candidate.notPublished = true;
						}
						if(include) {
							publishCandidates.push(candidate);
						}
					}
				}
			}

			if(publishCandidates.length === 0) {
				createTiddlyElement(listWrapper,"em",null,null,locale.noTiddlersText);
				wizard.setButtons([]);
			} else {
				var listView = ListView.create(listWrapper,publishCandidates, macro.listViewTemplate, this.onSelectCommand);
				wizard.setValue("listView",listView);
				
				var btnHandler = function(ev) {
					macro.makePublic(ev,listWrapper,paramString);
				};
				wizard.setButtons([
						{caption: locale.makePublicLabel, tooltip: locale.makePublicPrompt, onClick: btnHandler}
					]);
			}
			/*var publicLinks = $(".viewPublicTiddler");
			$.each(publicLinks, function(index,el){
				var el = $(el);
				
				var title = el.text();
				var handler = function(ev) {
					var ns = config.extensions.tiddlyspace;
					var host = config.defaultCustomFields["server.host"];
					var publishedTiddler = publishedTiddlers[title];
					ajaxReq({
						url: host + "/bags/" + publishedTiddler["bag"] + "/tiddlers/" + title + ".json",
						success: function(tid) {
							ns.spawnPublicTiddler(tid);
						}
					});
					
				};
				el.html("<a>%0</a>".format([title])).click(handler);
			});
		*/
		}
		
	};
})(jQuery);
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
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/TiddlySpaceLinkPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/TiddlySpaceLinkPlugin/ |
|''Version:''|0.6|
|''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 provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
{{{@space}}} -- @psd 
{{{~@space}}} -- ~@psd 
{{{Tiddler@space}}} -- Tiddler@glossary
{{{[[Tiddler Name]]@space}}} -- [[How do I link to another space?]]@faq 
{{{[[Link text|Tiddler Name]]@space}}} -- [[about spaces|Space]]@glossary

TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} [[space|Space]] and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}. Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink */

function createSpaceLink(place, spaceName, title, alt) {
	var link, a;
	try {
		// seems safe to expect this to have been initialised within TiddlySpace
		link = config.extensions.tiddlyweb.status.server_host.url;
	} catch (ex) {
		link = "http://tiddlyspace.com";
	}
	// assumes a http URI without user:pass@ prefix
	link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");

	if (title) {
		a = createExternalLink(place, link + "#" + encodeURIComponent(String.encodeTiddlyLink(title)), alt || title);
	} else {
		a = createExternalLink(place, link, spaceName);
	}
	jQuery(a).addClass('tiddlySpaceLink');
}

(function ($) {
	version.extensions.TiddlySpaceLinkPlugin = {installed: true};

	config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*";
	config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";

	config.formatters.splice(0, 0, {
		name: "spacenameLink",
		match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.anyLetter + "*@" + config.textPrimitives.spaceName + ".?",
		lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.anyLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			if (w.matchText.substr(w.matchText.length-1, 1) === '.') {
				w.outputText(w.output, w.matchStart, w.nextMatch);
				return;
			}
			if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
				w.outputText(w.output, w.matchStart + 1, w.nextMatch);
				return;
			}
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlyLinkSpacenameLink",
		match: "\\[\\[[^\\[]*\\]\\]@",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var title = lookaheadMatch[2] || lookaheadMatch[1];
				var alt = lookaheadMatch[1] || lookaheadMatch[2];
				createSpaceLink(w.output, lookaheadMatch[3], title, alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	});
}(jQuery));
//}}}
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
You can associate your account with multiple identities. If you have an open id for example you could log into TiddlySpace with that as well as a TiddlySpace user account.
{{inlineList{
	<<TiddlySpaceIdentities>>
}}}
This space includes the public tiddlers from the following spaces:
<<TiddlySpaceInclusion list>>
<<TiddlySpaceInclusion passive>>
/***
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {

var ns = config.extensions.tiddlyspace;

var cmd = config.commands.publishTiddlerRevision = {
	text: "publish",
	tooltip: "Make this revision public",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		if(readOnly || !store.tiddlerExists(tiddler.title)) {
			return false;
		}
		var space = ns.determineSpace(tiddler, true);
		return space && space.name == ns.currentSpace.name && space.type == "private";
	},
	publishTiddler: function(title,callback) {
		var original = store.getTiddler(title);
		var space = ns.determineSpace(original);
		var tiddler = $.extend(new Tiddler(title), original);
		tiddler.fields = $.extend({}, original.fields, {
			"server.workspace": "bags/%0_public".format([space.name]),
			"server.page.revision": "false"
		});
		var adaptor = tiddler.getAdaptor();
		adaptor.putTiddler(tiddler, null, null, callback);
	},
	handler: function(ev, src, title) {
		var callback = function(context, userParams) {
			if(context.status) {
				ns.spawnPublicTiddler(context.tiddler, src);
			} else {
				displayMessage(cmd.errorMsg.format([title, context.statusText]));
			}
		};
		cmd.publishTiddler(title,callback);
	}
};

})(jQuery);
//}}}
a TiddlySpace
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.1.1|
|''Status''|beta|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor|
!Usage
The viewRevisions macro can be attached to any element, which should be passed
in as a parameter.

For example:

&lt;&lt;viewRevisions page:10 link:"<<view modified date>>"&gt;&gt;

would show the revisions "stack of cards" view, 10 at a time, when the modified
date is clicked.
!Code
***/
//{{{
(function($) {

var me;
config.macros.viewRevisions = me = {
	revisionTemplate: "RevisionTemplate",
	revSuffix: " [rev. #%0]",
	defaultPageSize: 10,
	defaultLinkText: "View Revisions",
	offsetTop: 30, //in px
	offsetLeft: 10, //in px
	shiftDownDelay: 50, //in ms
	visibleSlideAmount: 20, //amount of revisions to show on left hand edge after sliding
	zIndex: 100, //default z-index
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true)[0];
		var tiddlerElem = story.findContainingTiddler(place);

		//var revButton = $('<span class="button openRevisions" />')
		var revButton;
		var pageSize = parseInt(params.page[0], 10) || me.defaultPageSize;
		var linkObj = params.link ? params.link[0] || me.defaultLinkText : false;
		if(linkObj) {
			 revButton = $('<span class="button openRevisions" />')
				.appendTo(place);
			wikify(linkObj, revButton[0], null, tiddler);
		} else {
			revButton = place;
		}
		//wikify(linkObj, revButton[0], null, tiddler);

		$(revButton).click(function() {
			if (!$(tiddlerElem).hasClass("revisions")) {
				me.showRevisions(tiddlerElem, tiddler, pageSize);
			} else {
				me.closeRevisions(tiddlerElem);
			}
		});
	},
	showRevisions: function(tiddlerElem, tiddler, pageSize) {
		var context = {
			host: tiddler.fields["server.host"],
			workspace: tiddler.fields["server.workspace"]
		};
		$(tiddlerElem).addClass('revisions');
		$(tiddlerElem).attr("revName", tiddler.title);
		$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
			var _onclick = btn.onclick;
			$(btn).click(function() {
				me.closeRevisions(tiddlerElem);
				_onclick.apply(this, arguments);
			});
		});
		var type = tiddler.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var userParams = {
			tiddlerElem: tiddlerElem,
			pageSize: pageSize,
			title: tiddler.title
		};
		me.createCloak(tiddlerElem);
		adaptor.getTiddlerRevisionList(tiddler.title, null, context, userParams,
				function (context, userParams) {
					//strip the current revision
					context.revisions.shift();
					me.expandStack(context, userParams);
				});
	},
	showRevision: function(place, revision, callback) {
		var context = {
			host: revision.fields["server.host"],
			workspace: revision.fields["server.workspace"]
		};
		var userParams = {
			revElem: place
		};
		var type = revision.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var revNo = revision.fields["server.page.revision"];
		adaptor.getTiddlerRevision(revision.title, revNo, context, userParams,
			function(context, userParams) {
				var tiddler = context.tiddler;
				tiddler.title += me.revSuffix
					.format([$(place).attr("revision")]);
				tiddler.fields.doNotSave = true;
				if (store.getTiddler(tiddler.title)) {
					store.deleteTiddler(tiddler.title);
				}
				store.addTiddler(tiddler);

				//now, populate the existing div
				var revElem = userParams.revElem;
				$(revElem).attr('id', story.tiddlerId(tiddler.title));
				$(revElem).attr("refresh", "tiddler");
				story.refreshTiddler(tiddler.title, me.revisionTemplate, true);
				callback(tiddler);
			});
	},
	createCloak: function(promoteElem) {
		//store for later
		$(promoteElem).attr("zindex", $(promoteElem).css("z-index"));
		$(promoteElem).attr("top", $(promoteElem).css("top"));
		$(promoteElem).attr("left", $(promoteElem).css("left"));

		$('<div class="revisionCloak" />').css("z-index", me.zIndex)
			.click(function() {
				me.closeRevisions(promoteElem);
			})
			.appendTo(document.body);

		$(promoteElem).css("z-index", me.zIndex + 1);
	},
	closeRevisions: function(promoteElem) {
		//revert the original tiddler back to its previous state
		$(promoteElem)
			.css("z-index", $(promoteElem).attr("zindex"))
			.css("top", $(promoteElem).attr("top"))
			.css("left", $(promoteElem).attr("left"))
			.removeAttr("zindex")
			.removeAttr("top")
			.removeAttr("left")
			.removeAttr("revName")
			.removeClass("revisions");

		//delete the previous revisions
		$(".revisions").remove();

		//remove the cloak
		$(".revisionCloak").remove();
	},
	expandStack: function(context, userParams) {
		var pageSize = userParams.pageSize;

		var from = userParams.from || 0;
		var tiddlerElem = userParams.tiddlerElem;

		userParams.defaultHeight = $(tiddlerElem).height();
		userParams.defaultWidth = $(tiddlerElem).width();
		if (from < context.revisions.length) {
			me.displayNextRevision(tiddlerElem, userParams, context, from,
				from + pageSize - 1);
		}
	},
	displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
		var revision = context.revisions[from];
		function callback() {
			var revText = revBtn.getRevisionText(tiddlerElem, revision);
			tiddlerElem = me.createRevisionObject(tiddlerElem, context,
				userParams, revText);
			$(tiddlerElem)
				.attr("revision", (context.revisions.length - from));
			if ((from < to) && ((from + 1) < context.revisions.length)){
				me.displayNextRevision(tiddlerElem, userParams, context,
					from + 1, to);
			} else if ((context.revisions.length - 1) > to) {
				me.showMoreButton(tiddlerElem, context, userParams, to + 1);
			}
		}
		me.shiftVisibleDown(userParams.title, callback);
	},
	createRevisionObject: function(tiddlerElem, context, userParams, text) {
		var newPosition = me.calculatePosition(tiddlerElem, context);
		return $('<div class="revisions tiddler" />')
			.css({
				position: "absolute",
				top: newPosition.top,
				left: newPosition.left,
				"z-index": me.zIndex + 1,
				height: userParams.defaultHeight,
				width: userParams.defaultWidth
			})
			.attr("revName", userParams.title)
			.append(text)
			.insertBefore(tiddlerElem);
	},
	shiftVisibleDown: function(title, callback) {
		var revisions = $("[revName=%0].revisions".format([title]));
		var revisionCount = revisions.length;
		
		$(revisions).animate({top: "+=" + me.offsetTop},
				me.shiftDownDelay, function() {
					revisionCount -= 1;
					if ((callback) && (!revisionCount)) {
						callback();
					}
				});
	},
	calculatePosition: function(elem, context) {
		var offset = $(elem).offset();
		var currentPosition = $(elem).position();
		var newPosition = {
			top: currentPosition.top - me.offsetTop
		};
		if ((context.restrictLeft) ||
				((offset.left - me.offsetLeft) <
				$("#contentWrapper").offset().left)) {
			newPosition.left = 0;
			context.restrictLeft = true;
		} else {
			newPosition.left = currentPosition.left - me.offsetLeft;
		}
		return newPosition;
	},
	showMoreButton: function(tiddlerElem, context, userParams, moreIndex) {
		userParams.from = moreIndex + 1;
		me.shiftVisibleDown(userParams.title, function() {
			var btn = me.createRevisionObject(tiddlerElem, context, userParams,
				"");

			var more = createTiddlyButton(btn[0], "more...", "show more revisions",
				function() {
					if ($(".viewRevision").length) {
						return;
					}
					userParams.tiddlerElem = btn[0];
					$(btn).text("")
						.append(revBtn
							.getRevisionText(btn[0], context.revisions[moreIndex]))
						.attr("revision", context.revisions.length - moreIndex);
					me.expandStack(context, userParams);
				});
			$(more).css("float", "right");
		});
	},
	stripRevFromTitle: function(revisionTitle) {
		return revisionTitle.split(/ ?\[rev\. #[0-9]+\]$/)[0];
	},
	onClickRevision: function(revElem, revision, callback) {
		// don't do anything if we are still loading
		if ($(".revisions").hasClass("loading")) {
			return null;
		}

		var origTitle = me.stripRevFromTitle(revision.title);
		if ($(revElem).hasClass("viewRevision")) {
			$(".revisions").addClass("loading");
			me.slideIn(revElem, revision, origTitle, function() {
				store.deleteTiddler(revision.title);
				revision.title = origTitle;
				$(revElem).text("").append(revBtn.getRevisionText(revElem,
						revision))
					.removeAttr("tags").removeAttr("tiddler")
					.removeAttr("refresh").removeAttr("template")
					.removeAttr("id");
				$(".revisions").removeClass("loading");
				if (callback) {
					callback();
				}
			});
			$(revElem).removeAttr("prevPos").removeClass("viewRevision");
		} else {
			var viewRevision = function() {
				var prevPos = $(revElem).offset().left;
				$(revElem).addClass("viewRevision").attr("prevPos", prevPos);
				$(".revisions").addClass("loading");
				me.showRevision(revElem, revision, function(rev) {
					me.slideOut(revElem, rev, origTitle, function() {
						$(".revisions").removeClass("loading");
					});
				});
			};
			//make sure another revision isn't already out
			if ($(".viewRevision").length) {
				var newRevElem = $(".viewRevision")[0];
				var newRevision = store.getTiddler($(newRevElem)
					.attr("tiddler"));
				me.onClickRevision(newRevElem, newRevision, viewRevision);
			} else {
				viewRevision();
			}
		}
	},
	slideOut: function(revElem, revision, title, callback) {
		var leftMostPos = $("[revName=%0].revisions".format([title]))
			.offset().left;
		var width = $(revElem).width();
		var originalLeftPos = $(story.getTiddler(title))
			.offset().left;

		var slideAmount = leftMostPos + width - me.visibleSlideAmount;
		$("[revName=%0].revisions:not(.viewRevision)".format([title]))
			.animate({left: "-=" + slideAmount}, 1000);
		$(revElem)
			.attr("baseHeight", $(revElem).css("height"))
			.css("height", "auto")
			.animate({left: originalLeftPos}, 1000, callback);
	},
	slideIn: function(revElem, revision, title, callback) {
		var slideAmount = $(revElem).offset().left -
			$(story.getTiddler(title)).offset().left;
		var origRevPos = $(revElem).attr("prevPos");

		$("[revName=%0].revisions:not(.viewRevision)".format([title]))
			.animate({left: "+=" + slideAmount}, 1000);
		$(revElem).animate({left: origRevPos}, 1000, function() {
			$(revElem)
				.css("height", $(revElem).attr("baseHeight"))
				.removeAttr("baseHeight");
			callback();
		});
	}
};

var revBtn;
config.macros.slideRevision = revBtn = {
	btnText: "created by %0 at %1 on %2",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var btn = revBtn.getRevisionText(place, tiddler);
		$(place).append(btn);
	},
	getRevisionText: function(place, revision) {
		var text = revBtn.btnText.format([revision.modifier,
			revision.modified.formatString("0hh:0mm"),
			revision.modified.formatString("0DD MMM YYYY")]);
		var btn = $('<a href="javascript:;" class="button revButton" />')
			.text(text)
			.click(function() {
				var revElem = story.findContainingTiddler(this);
				me.onClickRevision(revElem, revision);
			});
		return btn;
	}
};

})(jQuery);
//}}}
body {
	font-size: 1.0em;
	font-family: helvetica, arial, sans-serif;
}
[[StyleSheetTiddler]]
[[StyleSheetBackstage]]

[[StyleSheetFamilyTree]]
familytree
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.5.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.'' 
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.01.06 [1.5.1] reversed logic so that title-as-prefix takes precedence over tag-matched prefix
2008.12.18 [1.5.0] added handling for using tiddler //title// as prefix (e.g., {{{SomeTiddlerViewTemplate}}}) 
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 5, revision: 1, date: new Date(2009,1,6)};

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

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

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

	// look for template whose prefix matches the *title* of this tiddler
	if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
		if (store.getTiddlerText(theme+title+template)) { return theme+title+template; } // theme##TitleTemplate
		if (store.getTiddlerText(title+template)) 	{ return title+template; }	 // TitleTemplate
	}

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

	// no matching tag OR title prefix... return core result
	return coreTemplate;
}
//}}}
/***
|''Name:''|FamilyTreeUtilsPlugin|
|''Description:''|Adds useful macros for the purpose of family tree related fun|
|''Version:''|0.21alpha|
|''Date:''|July 2010|
|''Source:''|http://www.jonrobson.me.uk|
|''Author:''|Jon Robson |
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.3|

***/
/*{{{*/
(function($){
  config.macros.viewimage = {
    handler: function(place,macroName,params,wikifier,paramString,tiddler){
      var p = paramString.parseParams("name",null,true,false,true);
      var field = p[0]["field"][0];
      var width,height;
      if(p[0]["width"])width = p[0]["width"][0];
      if(p[0]["height"])height = p[0]["height"][0];
      var val = tiddler[field] || tiddler.fields[field];
      if(!val) return;
      var html = "<img src=\""+val+"\" ";
      if(width) html+= "width='"+width+"' ";
      if(height) html+="height='"+height+"'";
      html += ">";
      $(place).append(html);
    }

  }
  config.macros.view.views.year= function(value,place,params,wikifier,paramString,tiddler) {
    var year = value.substr(0,4);
    wikify(year,place);
  };

  config.macros.view.views.bracketedlist= function(value,place,params,wikifier,paramString,tiddler) {
    var  links = value.readBracketedList();
    for(var i=0; i < links.length;i++){
      config.macros.view.views.link(links[i],place,params,wikifier,paramString,tiddler);
      wikify(" ",place);
    }
  };


  TiddlyWiki.prototype.familytree_saveTiddler = TiddlyWiki.prototype.saveTiddler;
  TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created)
  {
    if(!newTitle) newTitle = title;
    //clean up children  
    if(newTitle &&newTitle != title){
    var tiddlers = store.getTiddlers();
    for(var i=0; i < tiddlers.length; i++){
      var tid = tiddlers[i];
      if(tid.fields.mother ==title){
      tid.fields.mother = newTitle;
      }
      if(tid.fields.father ==title){
      tid.fields.father = newTitle;
      }
      if(tid.fields.spouse){
      var spouses = tid.fields.spouse.split(",");
    
      var update = spouses.indexOf(title);
      if(update !=-1){
      spouses[update]= newTitle;
      tid.fields.spouse = spouses.join(",");
      }
  }
    }
    //do spouses

    }
    var newSpouseField, tiddlerSpouses;
    if(fields){
    newSpouseField =fields.spouse;
    if(newSpouseField && newSpouseField.length > 0){
      tiddlerSpouses = newSpouseField.split(",");
    }
    else{
      tiddlerSpouses = [];
    }
    }
    else{
    tiddlerSpouses = [];
    }

  
  
    //add the new spouses
   
    for(var i=0; i < tiddlerSpouses.length; i++){
      var spouse = tiddlerSpouses[i];
      //console.log("spouse",i,spouse);
      var spouseTiddler = store.getTiddler(spouse);
      if(spouseTiddler){
      if(!spouseTiddler.fields.spouse)spouseTiddler.fields.spouse = "";
      var spouseSpouses = spouseTiddler.fields.spouse.split(",");
      //console.log(spouseSpouses,newTitle);
      if(spouseSpouses.indexOf(newTitle) == -1){
      spouseSpouses.push(newTitle);
      spouseTiddler.fields.spouse = spouseSpouses.join(",");
      //console.log("save");
      }
      }
    }
  
    this.familytree_saveTiddler(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);

  };
  config.macros.age ={
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
      var d1 = tiddler.fields["dob"];
      var d2=  tiddler.fields["dod"];
      if(!d2){
        return " unknown ";
      }
      var y1 = parseInt(d1.substr(0,4));
      var y2 = parseInt(d2.substr(0,4));
  
      if(y1 == Number.NaN || y2 == Number.NaN || y1== 0 || y2 == 0) return;
      var m1 = parseInt(d1.substr(4,2));
      var m2 = parseInt(d2.substr(4,2));
  
      var day1 = parseInt(d1.substr(6,2));
      var day2 = parseInt(d2.substr(6,2));
  
  
      var ageY = y2-y1;
      var ageM = m2 - m1;
      if(m2 > m1){
        ageM = m2 - m1;
      }
      else if(m2 < m1){
        ageM = 12 -(m1- m2);
        ageY -=1;
      }
      if(ageY != Number.Nan){
        var html =ageY + " years";
        if(ageM != 0 && ageM != Number.NaN){
           html+=" and "+ ageM+" months";
        }
      }
      jQuery(place).html(html);
    }
  };
  config.macros.familytreelist = {
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
      var param = paramString.parseParams();
      var sex= getParam(param,"sex");
      var filter = getParam(param,"filter")
      var print ="";
      var tiddlers;
      if(!filter){
        tiddlers = store.getTiddlers();
      }
      else{
        tiddlers = store.filterTiddlers(filter);
      }
      var sort = getParam(param,"sort");
      if(sort){
        tiddlers = store.sortTiddlers(tiddlers,sort);
      }
      for(var i=0; i < tiddlers.length;i++){
        var tid = tiddlers[i];
        var good = false;
        if(tid.fields.sex && tid.fields.sex == sex){
          good = true;
        }
        if("excludeTree" in tiddler.tags){
          good = false;
        }
        if(good){
          print += tid.title+"\n";
        }
      }
      wikify(print,place);
    }
  };
  config.macros.makeRootLink = {
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
    jQuery(place).html("<a class='button makeRoot' href=\"#[["+tiddler.title+"]]\" name=\""+escape(tiddler.title)+"\">"+tiddler.title +" as root</a>");
    jQuery(".makeRoot",place).click(function(e){
      var name = unescape(jQuery(this).attr("name"));
      config.activeTree.compute(name);
      config.activeTree.centerOn(name);
    })
    }
  
  };
  config.macros.listchildren ={
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
      var parent = tiddler.title;
      var children = [];
      var t = store.getTiddlers();
    
      for(var i=0; i < t.length; i++){
       var person = t[i];
       if(person.fields.father == parent){children.push(person);}
       else if(person.fields.mother == parent){children.push(person);}
      }

      var param = paramString.parseParams();
      var sort = getParam(param,"sort");
      if(sort){
        children = store.sortTiddlers(children,sort);
      }
    
      if(children.length ==0){
        var div = document.createElement("div");
        div.innerHTML = "No children.";
        place.appendChild(div);
      }
      else{
        var ul = document.createElement("ul");
        place.appendChild(ul);
        for(var i=0; i < children.length; i++){
          var child = document.createElement("a");
          child.className="child";
          var name =children[i].title;
          child.innerHTML = name;
          child.title = name;
          var li = document.createElement("li");
          li.appendChild(child);
          ul.appendChild(li);
          jQuery(child).click(function(e){story.displayTiddler(e,this.title);});
        }
      }
    }

  };
  config.macros.tiddlerGender ={
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
      var jqplace = jQuery(place);
      if(tiddler.fields["sex"] == 'M'){
        jqplace.addClass("sexMale");
      }
      else if(tiddler.fields["sex"] == 'F'){
        jqplace.addClass("sexFemale");
      }
    }

  };

  config.macros.ftview = {
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
    var field = params[0];
    if(!tiddler.fields[field]) return;
    if(field == 'spouse'){
      var sp = tiddler.fields["spouse"].split(",");
      var str = "";
    
      for(var i=0; i < sp.length;i++){
      var thisSpouse = sp[i];
      if(thisSpouse){
        str += "[["+thisSpouse + "]]";
        if(i < sp.length-1) str += " and ";
      }
      }
    
      wikify(str,place);
    }

    }
  
  };

  config.commands.addMother = {
    text: "Add Mother",
    tooltip: "add a mother",
  
    handler:function(event,src,title){
      var motherName = prompt("Who is their mother?");
      if(motherName){
        var tiddler = store.getTiddler(title);
        tiddler.fields.mother = motherName;
        if(!store.getTiddler(motherName))story.displayTiddler(null,motherName,DEFAULT_EDIT_TEMPLATE);  
      }
     
    }
  };
  config.commands.addSpouse = {
    text: "Add Spouse",
    tooltip: "add a spouse",
  
    handler:function(event,src,title){
      var spouse = prompt("What is the name of the spouse?");
      if(spouse){
        var tiddler = store.getTiddler(title);
        var currentSpouses =tiddler.fields.spouse || [];
        if(typeof(currentSpouses) == typeof(""))currentSpouses= currentSpouses.readBracketedList();
        currentSpouses.push(spouse);
        tiddler.fields.spouse = String.encodeTiddlyLinkList(currentSpouses); 
        store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created);   
      
        var spouseTiddler = store.getTiddler(spouse);
        if(spouseTiddler){
          var currentSpouses =spouseTiddler.fields.spouse || [];
          if(typeof(currentSpouses) == typeof(""))currentSpouses= currentSpouses.readBracketedList();
          currentSpouses.push(title);
          spouseTiddler.fields.spouse = String.encodeTiddlyLinkList(currentSpouses);
          store.saveTiddler(spouseTiddler.title,spouseTiddler.title,spouseTiddler.text,spouseTiddler.modifier,spouseTiddler.modified,spouseTiddler.tags,spouseTiddler.fields,true,spouseTiddler.created);   
        }
        else{
          store.saveTiddler(spouse,spouse,"","",new Date(),[],{spouse: "[["+title+"]]"},true,new Date());
          story.displayTiddler(null,spouse,DEFAULT_EDIT_TEMPLATE);
        }
    
      }
     
    }
  };

  config.commands.addChild = {
    text: "Add Child",
    tooltip: "add a child",
  
    handler: function(event,src,title){
      var parent = store.getTiddler(title);
      var sex = false;
      var spouse = "";
      if(parent && parent.fields.spouse)spouse = parent.fields.spouse;
      if(!parent) {
        //try and work out the sex..
        var tiddlers = store.getTiddlers();
      
        for(var i=0; i < tiddlers.length; i++){
          if(!sex && tiddlers[i].fields.mother == title) sex = "F";
          if(!sex && tiddlers[i].fields.father == title) sex = "M";
        }
      }
      else{
        if(parent.fields.sex) sex =parent.fields.sex;
      }
      if(sex){

        var childName = prompt("What is the name of the child?");
        if(childName){
        

        
         
           var tiddler = store.getTiddler(childName);
           if(!tiddler){
           
             var fields = {};
             if(sex == "F") {
               fields.mother = title;
              fields.father = spouse;
             }
             else if(sex == "M") {
               fields.father = title;
              fields.mother = spouse;
            }
             store.saveTiddler(childName,childName,"",false,new Date(),[],fields,true,new Date());
             //childName,childName,"",false,false,[],fields,true,new Date());
          
          }
          else{
          
                    if(sex == "F") {
                       tiddler.fields.mother = title;
                      tiddler.fields.father = spouse;
                     }
                     else if(sex == "M") {
                       tiddler.fields.father = title;
                      tiddler.fields.mother = spouse;
                    }
          }
   
        }
     
         if(childName) story.displayTiddler(null,childName,DEFAULT_EDIT_TEMPLATE);
      }
      else{
        alert("I can't do this until I know the sex of this person..");
      }
    
    }
  };

  config.commands.addFather = {
    text: "Add Father",
    tooltip: "add a father",
  
    handler: function(event,src,title){
      var fatherName = prompt("Who is their father?");
      if(fatherName){
        var tiddler = store.getTiddler(title);
        tiddler.fields.father = fatherName;
        if(!store.getTiddler(fatherName))story.displayTiddler(null,fatherName,DEFAULT_EDIT_TEMPLATE);  
      }
    }
  };

  merge(config.macros.newTiddler,{
  	label: "new person",
  	prompt: "Create a new person in your family tree",
  	title: "New Person",
  	accessKey: "N"});

  config.macros.bootUpFamilyTree = {
      handler: function(place,macroName,params,wikifier,paramString,tiddler){
          story.closeAllTiddlers();
            var tiddlers = store.getTaggedTiddlers("rootTree");
           for(var i=0; i < tiddlers.length; i++){
               story.displayTiddler(null,tiddlers[i].title);
           }
        
        
      }
  };
}(jQuery))
/*}}}*/
  if(!config.shadowTiddlers.VGraphStyle){
      config.shadowTiddlers.VGraphStyle = "/*{{{*/\n" +
      ".changeAlgorithm {z-index:10;position:absolute;right:0px;bottom:0px;}\n"+
      ".VGraph {height:400px;width:600px;position:relative;border:solid 1px black;}\n"+
      "#contentWrapper .VGraph {margin-left:150px;}\n#contentWrapper #tiddlerDisplay .VGraph {margin-left:0px;}\n"+
      "/*}}}*/"
    store.addNotification("VGraphStyle", refreshStyles);
  }   
config.macros.VGraphDefaultLabelMacro = {
    handler: function(place,macroName,params,wikifier,paramString,tiddler,options){
        wikify("[["+tiddler.title+"]]",place);
    }
};
config.macros.VGraph= {
    _vgrs: {}
    ,handler: function(place,macroName,params,wikifier,paramString,tiddler,options){
        /*setup options */
        
        var newplace= document.createElement("div");
        newplace.className = "VGraph"
        place.appendChild(newplace);
        place = newplace;
            var div = document.createElement("div");
               
               place.appendChild(div);
               var w = jQuery(place).width();
               var h = jQuery(place).height();
               if(!w) w = 500;
               if(!h) h= 300;
               jQuery(div).css({width:w,height:h,"position":"relative"});
               place = div;
     
       
        var nodes = store.getTiddlers();
        if(!options){
            options = {};
        }
        options.pointsize = 20;
        merge(options,{nodeWidth:20,nodeHeight:10,defaultNodeColor:"rgb(200,200,200)",lineColor:"rgb(200,200,200)",lineWidth:"2"});
     
        if(!paramString)paramString = "";
        var namedprms = paramString.parseParams(null, null, true);
        for(var i=0; i < namedprms.length;i++){
            var nameval = namedprms[i];
            options[nameval.name] = nameval.value;
            
        }
        if(!options.lineType){
            options.lineType = 'bezier';
        }
        if(!options.parentFields) {
            options.parentFields = ["tags"];
        }
        
        if(!options.excludeTags){
            options.excludeTags =[];
        }
        if(!options.styleNode){
            options.styleNode = function(tiddler,json){
                json.properties.label = json.id;
            }
        }
        if(!options.labelMacro)options.labelMacro = "VGraphDefaultLabelMacro";
        if(options.labelMacro){
            var paramStart = options.labelMacro.indexOf(" ");
            var paramString = options.labelMacro.substr(paramStart+1);
            if(paramStart == -1){
                paramStart = options.labelMacro.length;
            }
            var macro = options.labelMacro.substr(0,paramStart);
            
            
        
            var params = paramString.split(" ");
            //console.log("macro",macro,paramString);
            
            if(config.macros[macro]){
                options.plotNode = function(el,shape){
                    var tiddler =store.getTiddler(shape.properties.id);
                    if(!tiddler)tiddler = {title:shape.properties.id,tags:[],fields:{}};
                    tiddler.vismoShape = shape;
                    config.macros[macro].handler(el,false,params,false,paramString,tiddler);
                }
            }
        }
   
        if(!options.root){
            options.root = "_VGraphBridge_";
            options.connectOrphans = true;
        }
        var graph = this.constructGraph(nodes,options);
           
        options.graph = graph;
        

        

        if(!options.algorithm)options.algorithm = "walkers";

        var vgr =  this.setup(place,options);
        
       
        config.macros.VGraph.algorithmDropdown(place,vgr,vgr.options.algorithm);
        
        return vgr;
    }
    
    ,algorithmDropdown: function(place,vgr,selected){
        var that = this;
        var algorithmStr = "<select class='changeAlgorithm'><option value='-1'>change layout algorithm</option>";
        var algs =VismoGraphAlgorithms.available();
       
        for(var i=0;i < algs.length; i++){
            var alg_id = algs[i];
            var alg = VismoGraphAlgorithms[alg_id];
            var selectStr = "";
            if(selected == alg_id){
                selectStr = " selected";
            }
            if(alg.name){
                algorithmStr += "<option value='"+alg_id+"'"+selectStr+">"+alg.name+"</option>";
            }
        }
        algorithmStr += "</select>";
        
        jQuery(place).append(algorithmStr);
        jQuery(".changeAlgorithm",place).change(function(e){
           if(this.value == "-1") return;
           
            vgr.algorithm(this.value);
            vgr.clear();
            vgr.compute();
        });
    }
    
    
    ,makeNode: function(id,options){
        var json={id:id,properties:{name:id}};
        var tiddler = store.getTiddler(id);
        if(!tiddler) tiddler = {title:id,fields:{},tags:[]};
        if(options.styleNode)options.styleNode(tiddler,json);
        return json;
    }
    ,constructGraph: function(tiddlers,options){
        var parentFields =options.parentFields;
        var childFields = options.childFields;
        var ignoreTags = options.excludeTags;
        var prepNode = options.styleNode;
        var n = [];
        var edges = [];
        var tempnodes = {};
        
        if(options.connectOrphans){
            var bridgeNode = "_VGraphBridge_";
            tempnodes[bridgeNode] = this.makeNode(bridgeNode,options);
            tempnodes[bridgeNode].properties.hidden= true;
        }
        var anOrphan = {};
        for(var i=0; i< tiddlers.length; i++){
            var node = tiddlers[i];
            var id1 = node.title;

            var tags = node.tags;
            
            if(this._includeTiddlerInGraph(node,ignoreTags)){ 
              if(!tempnodes[id1])tempnodes[id1] = this.makeNode(id1,options);
              /*define parents of that tiddler */
             
              for(var j=0; j < parentFields.length; j++){
                var field = parentFields[j];
                var isOrphan = true;
                //console.log(field);
                if(field == 'tags'){
                    
                    for(var k=0; k < node.tags.length; k++){ 
                       var tag = node.tags[k];
                        
                       if(!tempnodes[tag])tempnodes[tag] =this.makeNode(tag,options);
                       edges.push([tag,id1]);
                       isOrphan = false;
                       
                       var tagTiddler = store.getTiddler(tag);
                       if(!tagTiddler && !anOrphan[tag]){
                           edges.push(["_VGraphBridge_",tag]);
                           anOrphan[tag] = true;
                       }
                    }
                }
                else if(node[field]) {
                    edges.push([node[field],id1]);
                    isOrphan = false;
                }
                else if(node.fields[field]){
                    edges.push([node.fields[field],id1]);
                    isOrphan = false;
                }
                //console.log(id1,isOrphan);
                if(isOrphan && options.connectOrphans){
                    //console.log("orphan");
                    edges.push(["_VGraphBridge_",id1]);
                }
              }

            }
        }

        for(var l in tempnodes){
            n.push(tempnodes[l]);
        }
        
     
        //console.log(tempnodes,n,edges);
        var graph = new VismoGraph({nodes:n,edges:edges});
        return graph;
    }
    ,setup: function(place,options){
        this.options = options;
        this.setuptooltip(place);
        var that = this;
        var vgr_id = Math.random();
        options.dblclick = function(e,s){if(!s)return;story.displayTiddler(null,s.properties.name);};
        options.mousedown = function(e,s){
          
            if(s && that._vgrs){
                that._vgrs[vgr_id].centerOn(s.properties.id);
            }
        };
        this.options.vismoController = {labels:true,controlFill:options.lineColor,controlShape: "circle",controlStroke:"rgb(255,255,255)"};
     
        
        this._vgrs[vgr_id] =  new VismoGraphRenderer(place,options);
        return this._vgrs[vgr_id];
    }
    ,graph: function(){
        return this.vgr.graph();
    }
    ,setuptooltip: function(place){
        
        var tooltip = document.createElement("div");
        tooltip.className = "ft_tooltip";
        place.appendChild(tooltip);
        jQuery(tooltip).css({position:"absolute",display:"none"});
        
        var that = this;
        this.options.move = function(e,s){ jQuery(tooltip).css({display:"none"});if(s){var bb = s.getBoundingBox();jQuery(tooltip).text(s.getProperty("name"));jQuery(tooltip).css({top:e.screenY - e.clientY,left:0,display:""});}};
        
        
        
    }

    ,_includeTiddlerInGraph: function(tiddler,ignoreTags){
        for(var i=0; i < ignoreTags.length; i++){
            var tag = ignoreTags[i];
            if(tiddler.tags.indexOf(tag) != -1) return false;
        }
        return true;
    }
};
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.2|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceToolbar.js|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|ImageMacroPlugin|
|''Keywords''|toolbar icons SVG|
!Description
replaces tiddler toolbar commands with SVG icons if available
!Notes
requires [[ImageMacroPlugin|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/ImageMacroPlugin/plugins/ImageMacroPlugin.tid]]

SVG icons are drawn from tiddlers titled {{{<command>.svg}}}
!TODO
* rename (IconToolbarPlugin?)
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var macro = config.macros.toolbar;

macro.icons = {
	cloneTiddler: "editTiddler"
};

var _handler = macro.handler;
macro.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	var toolbar = $(place);
	toolbar.attr({
		refresh: "macro",
		macroName: macroName
	}).data("args", arguments);
	var status = _handler.apply(this, arguments);
	if(tiddler.isReadOnly()) {
		toolbar.addClass("toolbarReadOnly");
	} else {
		toolbar.removeClass("toolbarReadOnly");
	}
	var parsedParams = paramString.parseParams("name")[0];
	if(parsedParams.icons && parsedParams.icons == "yes") {
		this.augmentCommandButtons(place);
	}
	if(parsedParams.more && parsedParams.more == "popup") {
		// note we must override the onclick event like in createTiddlyButton
		// otherwise the click event is the popup AND the slider
		$(".moreCommand", place)[0].onclick = macro.onClickMorePopUp;
	}
	return status;
};

macro.refresh = function(place, params) {
	var args = $(place).empty().data("args");
	this.handler.apply(this, args);
};

var imageMacro = config.macros.image;
macro.augmentCommandButtons = function(toolbar) {
	$(".button", toolbar).each(function(i, el) {
		var cmd = $(el).attr("commandname");
		cmd = cmd ? cmd : "moreCommand"; // XXX: special-casing of moreCommand due to ticket #1234
		var icon = store.tiddlerExists(cmd) ? cmd : macro.icons[cmd];
		var text = $(el).text();
		if(store.tiddlerExists(icon)) {
			$(el).empty();
			imageMacro.renderImage(el, icon, { alt: text });
		}
	});
};

// provide onClickMore to provide extra commands in a popup
macro.onClickMorePopUp = function(ev) {
	ev = ev || window.event;
	var sibling = this.nextSibling;
	var commands = sibling.childNodes;
	var popup = Popup.create(this);
	addClass(popup ,"taggedTiddlerList");
	for(var i = 0; i < commands.length; i++) {
		var li = createTiddlyElement(popup, "li", null);
		var oldCommand = commands[i];
		var command = oldCommand.cloneNode(true);
		command.onclick = oldCommand.onclick;
		li.appendChild(command);
	}
	Popup.show();
	ev.cancelBubble = true;
	if(ev.stopPropagation) {
		ev.stopPropagation();
	}
	return false;
};

})(jQuery);
//}}}
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div><span class='title' macro='view title'></span> (place)</div>
<div class="tiddlerOrigin" macro="tiddlerOrigin"></div>
<div class="modifier" macro="view modifier SiteIcon width:48 height:48"></div>
<div class='concertina'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div macro='view text wikified'></div>
<div class='tagClear'></div>
Springfield is a fictional place in the Simpsons.
/***
http://github.com/tiddlyweb/chrjs/raw/master/users.js
***/
//{{{
// chrjs users extension
// v0.4.0
//
// requires tiddlywebplugins.socialusers
// http://pypi.python.org/pypi/tiddlywebplugins.socialusers

(function($) {

tiddlyweb.routes.users = "{host}/users";
tiddlyweb.routes.user = "{host}/users/{username}";

tiddlyweb.User = function(username, password, host) {
	tiddlyweb.Resource.apply(this, ["user", host]);
	this.username = username;
	this.password = password;
};
tiddlyweb.User.prototype = new tiddlyweb.Resource();
$.extend(tiddlyweb.User.prototype, {
	create: function(callback, errback) {
		var uri = this.route().split("/"); // XXX: hacky!?
		uri.pop();
		uri = uri.join("/");
		var data = {
			username: this.username,
			password: this.password
		};
		var self = this;
		return $.ajax({
			url: uri,
			type: "POST",
			contentType: "application/json",
			data: $.toJSON(data),
			success: callback,
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	setPassword: function(newPass, callback, errback) {
		this.old_password = this.password; // XXX: should not use underscore (consistency)
		this.password = newPass;
		return this.put(callback, errback);
	},
	data: ["password", "old_password"]
});

})(jQuery);
//}}}
<!--{{{-->
<div class='tiddlerContainer'>
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div macro='setPrivacy'></div>
<div class='editor' macro='edit text'></div>
<div class='tagsection'>
tags:<span class='editor' macro='niceTagger'></span>
</div>
<h1>Family Tree Specific</h1>
sex (M or F): <div class='editor' macro='AdvancedEditTemplate metaDataName:sex type:radio valuesSource:sexDefinition'></div>
date of birth:<div class='editor' macro='aet type:date metaDataName:dob'></div>
place of birth:<div class='editor' macro='edit placeofbirth'></div>
mother:<div class='editor' macro='aet type:search metaDataName:mother valuesSource:ListOfWomen wikify:yes'></div>
father:<div class='editor' macro='aet type:search metaDataName:father valuesSource:ListOfMen wikify:yes'></div>
spouse:<div class='editor' macro='niceTagger field:spouse'></div>
<div class='clear'>
date of marriage: <div class='editor' macro='aet type:date metaDataName:dom'></div>
where did they get married: <div class='editor' macro='edit placeofmarriage'></div>
where did they live?: <div class='editor' macro='edit home'></div>
occupation:<div class='editor' macro='edit occupation'></div>
date of death:<div class='editor' macro='aet type:date metaDataName:dod'></div>
What did he/she die of?<div class='editor' macro='edit causeofdeath'></div>
where did they die?<div class='editor' macro='edit placeofdeath'></div>
</div>
</div>
<!--}}}-->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="450 366 38 57"
width="30" height="30">
	<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
		<g>
			<path d="M 452.1094 421.2422 L 450 421.2422 L 450 423 L 487.9688 423 L 487.9688 421.2422 L 485.8595 421.2422 
			L 485.8595 377.29688 L 487.9688 377.29688 L 487.9688 375.53906 L 485.8595 375.53906 
			C 485.8595 375.53906 481.12463 371.59341 473.02023 370.52802 C 472.6824 368.9689 471.72098 366.75 468.9844 366.75 
			C 466.24783 366.75 465.28638 368.9689 464.94864 370.52802 
			C 456.84418 371.59341 452.1094 375.53906 452.1094 375.53906 L 450 375.53906 L 450 377.29688 L 452.1094 377.29688 
			Z M 467.12247 370.32086 L 467.12247 370.32086 C 467.3805 369.42395 467.90762 368.50781 468.9844 368.50781 
			C 470.0612 368.50781 470.5883 369.42395 470.84634 370.32086 
			C 470.24136 370.2848 469.62054 370.26562 468.9844 370.26562 
			C 468.34827 370.26562 467.72748 370.2848 467.12247 370.32086 Z M 454.21875 420.92804 L 454.21875 420.92804 
			C 455.46762 420.42087 456.32816 419.35281 456.32816 418.11716 L 456.32816 377.29688 L 458.4375 377.29688 
			L 458.4375 421.2422 L 454.21875 421.2422 Z M 460.5469 420.92804 L 460.5469 420.92804 
			C 461.79578 420.42087 462.65625 419.35281 462.65625 418.11716 L 462.65625 377.29688 L 464.76566 377.29688 
			L 464.76566 421.2422 L 460.5469 421.2422 Z M 466.87503 420.92804 L 466.87503 420.92804 
			C 468.1239 420.42087 468.9844 419.35281 468.9844 418.11716 L 468.9844 377.29688 L 471.09378 377.29688 
			L 471.09378 421.2422 L 466.87503 421.2422 Z M 473.2032 420.92804 L 473.2032 420.92804 
			C 474.45203 420.42087 475.31256 419.35281 475.31256 418.11716 L 475.31256 377.29688 L 477.4219 377.29688 
			L 477.4219 421.2422 L 473.2032 421.2422 Z M 479.5313 420.92804 L 479.5313 420.92804 
			C 480.78018 420.42087 481.64066 419.35281 481.64066 418.11716 L 481.64066 377.29688 L 483.75006 377.29688 
			L 483.75006 421.2422 L 479.5313 421.2422 Z" fill="black" class="glyph"/>
		</g>
	</g>
</svg>
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.2.4|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/RandomColorPalettePlugin/RandomColorPalettePlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<RandomColorPalette>>
Sets and saves a random color palette on execution

<<RandomColorPaletteButton>>
Creates a button, which when clicked will change the color palette
}}}
!Parameters
rgb: yes
By default the ColorPalette is defined in hex. You can output the colours as rgb by simply including this parameter.
hue:[0,360]
Seeds the randomiser with this hue.
saturation:[0,1]
Seeds the randomiser with a given saturation
lightness:[0,1]
Seeds the randomiser with a value for the lightest color tone (0 being darkest, 1 being lightest).

darkest:[0,1]
Seeds the randomiser with a value for the darkest color tone (0 being darkest, 1 being lightest).

huevariance: [0,90]
Given a certain hue, specify the angle from the secondary colour to which the secondary and tertiary colours should be determined.

Note parameters can be discovered by viewing the ColorPaletteParameter slice within the generated ColorPalette.
!Code
***/
//{{{
(function($){
	RGB.prototype.toRGBString = function() {
		return "rgb(%0,%1,%2)".format([parseInt(this.r * 255, 10), 
			parseInt(this.g * 255, 10), parseInt(this.b * 255, 10)])
	}
	function HSL_TO_RGB(h, s, l){ // h (hue) between 0 and 360, s (saturation) & l (lightness) between 0 and 1
		var c;
		if(l <= 0.5) {
			c = 2 * l * s;
		} else {
			c = ( 2 - (2 * l)) * s;
		}
		var h1 = h / 60;
		var x = c * (1 - Math.abs((h1 % 2) - 1)); 
		var r, g, b;
		if(typeof(h) == 'undefined') {
			r = 0;
			g = 0;
			b = 0;
		} else if(0 <= h1 && h1 < 1) {
			r = c;
			g = x;
			b = 0;
		} else if(1 <= h1 && h1 < 2) {
			r = x;
			g = c;
			b = 0;
		} else if(2 <= h1 && h1 < 3) {
			r = 0;
			g = c;
			b = x;
		}
		else if(3 <= h1 && h1 < 4) {
			r = 0;
			g = x;
			b = c;
		} else if(4 <= h1 && h1 < 5) {
			r = x;
			g = 0;
			b = c;
		} else if(5 <= h1 && h1 < 6) {
			r = c;
			g = 0;
			b = x;
		}
		m = l - (0.5 * c);
		r += m;
		g += m;
		b += m;
		return new RGB(r, g, b);
	}

	var macro = config.macros.RandomColorPalette = {
		messagesOn: false, 
		changedPaletteText: "We have assigned you a random theme by adjusting the [[ColorPalette]] tiddler.\nDon't like it? Click <<RandomColorPalette>> for another one.", 
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			paramString = paramString || "";
			var options = paramString.parseParams("name", null, true, false, true)[0];
			var tiddler = macro.generatePalette(options, true);
		},
		generateRandomNumber: function(min, max, info) {
			var num = (Math.random() * 1);
			if(!info) {
				info = { attempts:0 };
			}
			info.attempts += 1;
			var good = true;
			if(min == max) return max;
			if(min && num < min) {
				good = false;
			} else if(max && num > max) {
				good = false;
			}
			if(!good) {
				if(info.attempts < 5) {
					return macro.generateRandomNumber(min, max, info);
				} else {
					if(max) {
						return max;
					} else if(min) {
						return min;
					} else {
						return 1;
					}
				}
			}
			return num;
		},
		getExistingPalette: function(asJSON) {
			var title = "ColorPalette";
			var tiddlerText;
			if(store.tiddlerExists(title)) {
				tiddlerText = store.getTiddlerText(title);
			} else if(store.isShadowTiddler(title)){
				tiddlerText = config.shadowTiddlers[title];
			}
			if(asJSON) {
				var json = {};
				if(tiddlerText) {
					var lines = tiddlerText.split("\n");
					for(var i = 0; i < lines.length; i++) {
						var definition = lines[i].split(":");
						if(definition.length == 2) {
							var name = definition[0].trim();
							var value = definition[1].trim();
							json[name] = value;
						}
					}
				}
				return json;
			} else {
				return tiddlerText;
			}
		},
		generatePalette: function(options, save) {
			var outputRGB = options.rgb && options.rgb[0];
			if(this.inprogress) { 
				return;
			}
			this.inprogress = true;
			var palette = macro.getExistingPalette(true);
			var hue = options.hue ? parseInt(options.hue[0]) : Math.floor(Math.random() * 359);
			var saturation = options.saturation ? parseFloat(options.saturation[0]) : macro.generateRandomNumber(0.3, 0.7);
			var dark = options.darkest ? parseFloat(options.darkest[0]) : macro.generateRandomNumber(0, 0.1);
			var pale = options.lightness ? parseFloat(options.lightness[0]) : macro.generateRandomNumber(0.6 + dark, 1);
			var lightness_values = {Dark:dark, Mid:pale - ( ( pale - dark ) / 2 ), 
				Light:pale - ( ( pale - dark ) / 4 ), Pale:pale};

			var opposite_hue = (hue + 180) % 360;
			var seed = options.huevariance ? options.huevariance[0] : Math.floor((85 * Math.random()) + 5); // we want it to be at least 5 degrees
			var huetwo = (opposite_hue + seed) % 360;
			var huethree = (opposite_hue - seed) % 360;
			if(huetwo < 0) {
				huetwo = 360 + huetwo;
			}
			if(huethree < 0) {
				huethree = 360 + huethree;
			}
			for(var j in lightness_values) {
				if(true) {
					palette["Primary" + j] = HSL_TO_RGB(hue, saturation, lightness_values[j]);
					palette["Secondary" + j] = HSL_TO_RGB(huetwo, saturation, lightness_values[j]);
					palette["Tertiary" + j] = HSL_TO_RGB(huethree, saturation, lightness_values[j]);
				}
			}
			palette.Background = HSL_TO_RGB(hue, saturation, 0.92);
			palette.Foreground = HSL_TO_RGB(hue, saturation, 0.08);
			palette.ColorPaletteParameters = ["HSL([", hue, "|", seed, "], [", saturation, "],",
				"[", dark, "|", pale, "])"].join("");
			// construct new ColorPalette
			var text = ["/*{{{*/\n"];
			var colorcode;
			for(var id in palette) {
				if(true) {
					var color = palette[id];
					if(outputRGB) {
						colorcode = color.toRGBString();
					} else {
						colorcode = color.toString();
					}	
					text.push("%0: %1\n".format([id, colorcode]));
				}
			}
			text.push("/*}}}*/");
			
			var tid = store.getTiddler('ColorPalette');
			if(!tid) {
				tid = new Tiddler('ColorPalette');
				tid.fields = merge({}, config.defaultCustomFields);
				tid.modifier ='RandomColorPalette Macro';
			} else {
				// save location may be different
				tid.fields = merge(tid.fields, config.defaultCustomFields);
			}
			tid.text = text.join("");
			this.inprogress = false;
			if(save) { 
				macro.saveColorPalette(tid);
			}
			return tid;
		},
		saveColorPalette: function(tid) {
			// save the color palette in tid
			tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier, tid.modified, 
				tid.tags, tid.fields, false, tid.created, '');
			// an interval is used to cope with users clicking on the palette button quickly.
			if(macro._nextSave) {
				window.clearTimeout(macro._nextSave);
			}
			macro._nextSave = window.setTimeout(function() {
					autoSaveChanges(null, [tid]);
				}, 2000);
			refreshAll();
			macro.reportChange();
		},
		reportChange: function() {
			if(macro.messagesOn) { // only display message once..
				var msgPlace = getMessageDiv();
				if(!$(".changedPalette", msgPlace)[0]) {
					var tempPlace = document.createElement("div");
					wikify("{{changedPalette{" + macro.changedPaletteText + "}}}", tempPlace);
					msgPlace.appendChild(tempPlace);
				}
			}
		}
	};
	config.macros.RandomColorPaletteButton = {
			text: "New ColorPalette",
			tooltip: "Generate a random colour scheme for your TiddlyWiki",
			handler: function(place, macroName, params, wikifier, paramString, tiddler) {
				var btnHandler = function() {
					config.macros.RandomColorPalette.handler(place, macroName, params, wikifier, paramString, tiddler);
				};
				createTiddlyButton(place, this.text, this.tooltip, btnHandler);
			}
	};
})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="78 222 60 60" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 107.92718 244.14815 L 86.651474 222.89253 L 78.85206 230.69925 L 100.120415 251.9476 L 78.774 273.27396 
		L 86.57342 281.08075 L 107.927216 259.74707 L 129.39981 281.19946 L 137.19922 273.39267 L 115.73397 251.94763 
		L 137.121155 230.58054 L 129.32175 222.77374 Z" fill="black" class="glyph"/>
	</g>
</g>
</svg>
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.1|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/TiddlyWebConfig.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|TiddlyWebAdaptor ServerSideSavingPlugin|
|''Keywords''|serverSide TiddlyWeb|
!Code
***/
//{{{
(function($) {

if(!config.extensions.ServerSideSavingPlugin) {
	throw "Missing dependency: ServerSideSavingPlugin";
}
if(!config.adaptors.tiddlyweb) {
	throw "Missing dependency: TiddlyWebAdaptor";
}

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

var adaptor = tiddler.getAdaptor();
var recipe = tiddler.fields["server.recipe"];
var workspace = recipe ? "recipes/" + recipe : "bags/common";

var plugin = config.extensions.tiddlyweb = {
	host: tiddler.fields["server.host"].replace(/\/$/, ""),
	username: null,
	status: {},

	getStatus: null, // assigned later
	getUserInfo: function(callback) {
		this.getStatus(function(status) {
			callback({
				name: plugin.username,
				anon: plugin.username == "GUEST"
			});
		});
	},
	hasPermission: function(type, tiddler) {
		var perms = tiddler.fields["server.permissions"];
		if(perms) {
			return perms.split(", ").contains(type);
		} else {
			return true;
		}
	}
};

config.defaultCustomFields = {
	"server.type": tiddler.getServerType(),
	"server.host": plugin.host,
	"server.workspace": workspace
};

// modify toolbar commands

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

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

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

// hijack option macro to disable username editing
var _optionMacro = config.macros.option.handler;
config.macros.option.handler = function(place, macroName, params, wikifier,
		paramString) {
	if(params[0] == "txtUserName") {
		params[0] = "options." + params[0];
		var self = this;
		var args = arguments;
		args[0] = $("<span />").appendTo(place)[0];
		plugin.getUserInfo(function(user) {
			config.macros.message.handler.apply(self, args);
		});
	} else {
		_optionMacro.apply(this, arguments);
	}
};

// hijack isReadOnly to take into account permissions and content type
var _isReadOnly = Tiddler.prototype.isReadOnly;
Tiddler.prototype.isReadOnly = function() {
	return _isReadOnly.apply(this, arguments) ||
		!plugin.hasPermission("write", this);
};

var getStatus = function(callback) {
	if(plugin.status.version) {
		callback(plugin.status);
	} else {
		var self = getStatus;
		if(self.pending) {
			if(callback) {
				self.queue.push(callback);
			}
		} else {
			self.pending = true;
			self.queue = callback ? [callback] : [];
			var _callback = function(context, userParams) {
				var status = context.serverStatus || {};
				for(var key in status) {
					if(key == "username") {
						plugin.username = status[key];
						config.macros.option.propagateOption("txtUserName",
							"value", plugin.username, "input");
					} else {
						plugin.status[key] = status[key];
					}
				}
				for(var i = 0; i < self.queue.length; i++) {
					self.queue[i](plugin.status);
				}
				delete self.queue;
				delete self.pending;
			};
			adaptor.getStatus({ host: plugin.host }, null, _callback);
		}
	}
};
(plugin.getStatus = getStatus)(); // XXX: hacky (arcane combo of assignment plus execution)

})(jQuery);
//}}}
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.5.7|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate|
|''Requires''|TiddlySpaceConfig|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/ToggleTiddlerPrivacyPlugin.js|
!Notes
When used in conjunction with TiddlySpaceTiddlerIconsPlugin changing the privacy setting will also interact with any privacy icons.

Currently use of
<<setPrivacy defaultValue:public>> is in conflict with <<newTiddler fields:"server.workspace:x_private">>
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)

!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

config.macros.setPrivacy = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var el = $(story.findContainingTiddler(place));
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var container = $("<div />").addClass("privacySettings").appendTo(place)[0];
		var currentSpace = tiddlyspace.currentSpace.name;
		var currentWorkspace = tiddler ? tiddler.fields["server.workspace"] : false;
		var isNewTiddler = el.hasClass("missing") || !currentWorkspace; // XXX: is this reliable?
		if(isNewTiddler || this.isExternal(tiddler)) {
			var userDefault = args.defaultValue;
			userDefault = userDefault ? "bags/%0_%1".format([currentSpace, userDefault[0]]) : false;
			var defaultValue = currentWorkspace || userDefault || false;
			var options = config.macros.tiddlerOrigin ?
				config.macros.tiddlerOrigin.getOptions(params, paramString) : false;
			this.createRoundel(container, tiddler, currentSpace, defaultValue, options);
		}
	},

	isExternal: function(tiddler) {
		var bag = tiddler.fields["server.bag"] || "";
		var prefix = "%0_".format([tiddlyspace.currentSpace.name]);
		return bag.indexOf(prefix) != 0 || bag == "tiddlyspace";
	},
	createRoundel: function(container, tiddler, currentSpace, defaultValue, options) {
		var el = $(story.findContainingTiddler(container));
		var originButton = $(".originButton", el)[0];
		var privateWorkspace = "bags/%0_private".format([currentSpace]);
		var publicWorkspace = "bags/%0_public".format([currentSpace]);
		var rbtn = $("<input />").attr("type", "radio").attr("name", tiddler.title);
		var rPrivate = rbtn.clone().val("private").addClass("isPrivate").appendTo(container);
		$("<label />").text("private").appendTo(container); // TODO: i18n
		var rPublic = rbtn.clone().val("public").addClass("isPublic").appendTo(container);
		$("<label />").text("public").appendTo(container); // TODO: i18n
		var status = "private";

		var refreshIcon = function(type) {
			var originMacro = config.macros.tiddlerOrigin;
			if(originButton && originMacro) {
				$(originButton).empty();
				originMacro.showPrivacyRoundel(tiddler, type, originButton, null, options);
			}
		};
		var setWorkspace = function(workspace) {
			var saveField = $("[edit=server.workspace]", el);
			if(!workspace) {
				workspace = saveField.val();
			}
			if(workspace) {
				saveField.val(workspace);
				tiddler.fields["server.workspace"] = workspace; // for external tiddlers
				if(workspace.indexOf("_public") > -1) {
					rPublic.attr("checked", true);
					rPrivate.attr("checked", false);
					status = "public";
				} else {
					rPrivate.attr("checked", true);
					rPublic.attr("checked", false); // explicitly do this for ie
					status = "private";
				}
				refreshIcon(status);
			}
		};

		$("[type=radio]", container).click(function() {
			var btn = $(this);
			tiddler.fields["server.page.revision"] = "false";
			if(btn.hasClass("isPrivate")) { // private button clicked.
				el.addClass("isPrivate").removeClass("isPublic");
				setWorkspace(privateWorkspace);
			} else {
				el.addClass("isPublic").removeClass("isPrivate");
				setWorkspace(publicWorkspace);
			}
		});
		// TODO: replace with a hijack of displayTiddler?
		window.setTimeout(function() {
			setWorkspace(defaultValue);
		}, 200); // not ideal - but need to wait till finished displayTiddler for brand new tiddlers
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceRevertRevision|
|''Description''|Revert to a previous revision|
|''Author''|BenGillies|
|''Version''|0.1|
|''Status''|unstable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor TiddlySpaceRevisionView|
!Usage
Add a control button to revert to a particular revision.

The button must be called from within a revision, as generated by TiddlySpaceRevisionView
!Code
***/
//{{{
(function($) {

config.commands.revert = {
	text: "revert",
	tooltip: "make this revision the current one",
	handler: function(ev, src, title) {
		var revElem = story.getTiddler(title);
		var tidToRevert = store.getTiddler($(revElem).attr("revName"));

		var revision = store.getTiddler(title);
		if ((revision) && (tidToRevert)) {
			tidToRevert.text = revision.text;
			var newFields = merge({}, revision.fields);
			for (var fieldName in newFields) {
				if (fieldName.substr(0, 7) === "server.") {
					delete newFields[fieldName];
				}
			}
			merge(tidToRevert.fields, newFields);
			tidToRevert.tags = merge([], revision.tags);
			tidToRevert.fields.changecount = 1;
			delete tidToRevert.fields.doNotSave;

			store.saveTiddler(tidToRevert.title, tidToRevert.title,
				tidToRevert.text, null, null, tidToRevert.tags,
				tidToRevert.fields, false, tidToRevert.created, tidToRevert.creator);

			autoSaveChanges(true);
		}
	}
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="2 724 68 55" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 2.25 756 L 11.25 747 L 24.75 760.4994 L 60.750004 724.4994 L 69.75 733.49902 
		L 24.749977 778.49976 Z" fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
<html><img src="http://familytree.tiddlyspace.com/recipes/familytree_private/tiddlers/calendar.png" /></html>
<<familytreelist sex:M>>
Familytree is a Family Tree vertical for [[TiddlyWiki|http://www.tiddlywiki.org]] created by Jon Robson.
It was first released October 2009. Read the corresponding blog post [[here|http://www.jonrobson.me.uk/posts/Finally a Family Tree Vertical]]

It has been modified to work with TiddlySpace, to get started with your own space simply include the familytree space and begin your tree!

!Instructions
!!Example
See [[Jon Robson's Family Tree|http://www.jonrobson.me.uk/FamilyTree]]
!!Tagging
Tagging a tiddler with rootTree will make them appear on startup.
Tagging a tiddler with excludeTree will stop it from appearing in the family tree visualisation.

!Feedback
I would love to hear your feedback - please post it [[here|http://groups.google.com/group/TiddlyWiki/topics]] or contact me through [[one of these mediums|http://www.jonrobson.me.uk/posts/AboutMe%20and%20Contact%20Me]]
<<fileImport>>
/***
|''Requires''|AETPlugin|
***/
/***
|''Name:''|AETSearch|
|''Description:''||
|''Author:''|JonRobson |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Requires:''|[[AdvancedEditTemplate (core code)|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/AET/plugins/AET.js]]|
|''Usage:''|

Adds search boxes to the AET plugin default behaviour
{{{
***/
config.macros.aet.extensions.search = {
	setupSearchbox: function(place,tiddlerobj,metaDataName,handler,options){
	  var macro = config.macros.aet;
	  var valueSource = options.values || options.valuesSource;
	  var needsWikify = options.wikify;
	  if(!valueSource) {
			displayMessage("Please provide a parameter valuesSource telling me the name of the tiddler where your drop down is defined.");
			return;
		}
		var selected = store.getValue(tiddlerobj,metaDataName);
		if(!selected){
			var qsvalue =macro.getVariableFromQueryString(metaDataName);
			if(qsvalue) selected = qsvalue;
		}
		var tiddlerobj =store.getTiddler(valueSource);
		
		var contents;
		if(needsWikify){
		    var div = document.createElement("div");
		    var source = tiddlerobj.text;
		    wikify(source,div,false,tiddlerobj);
		    var contents = div.innerHTML;
	
		    contents = contents.replace(/\<br\/?\>/gi,"\n");
	    }
	    else{
	        contents = tiddlerobj.text;
	    }
	    
		if(tiddlerobj){
			var values = contents.split('\n');

			this.createSearchBox(place,metaDataName,values,selected,handler);
			jQuery("input",place).keypress(function (e) {
			    
      			if(e.which == 13){
      				var results = jQuery(".ac_over",".ac_results"); //is anything highlighted in autocomplete plugin
      				if(results.length ==0)

      					handler(this.value);
      			}
      		});
      		jQuery("input",place).blur(function(e){
      		    handler(this.value);
      		});
		
		}
	}
	
  ,createSearchBox: function(place,fieldName,values,initialValue,action,options){
	    var whatyousee=[];
      var whatyousave = {};
      for(var i=0; i < values.length; i ++){
		    if(values[i] != ""){
  			    var name_value = values[i].split(":");
  			    var name = name_value[0];
  			    var value = name_value[1];
  			    if(!value) value = name;
		    
  			    name = name.replace(/[\>|\<]/ig, "");
  			    value = value.replace(/[\>|\<]/ig, "");
  			    whatyousee.push(decodeURI(name));
  			    whatyousave[name] = value;
  			    if(initialValue == value) initialValue = name;
		    }
		  }
		var handler = function(event,targets){
		    
		    if(targets.length == 0) return;
		    var name = targets[0]
		    var save_this = whatyousave[name];
		    if(action)action(save_this);
		};
		
		if(!initialValue) initialValue = "";
		var options = {matchContains: true,selectFirst:false};
	  jQuery("<input type='text' name=\""+fieldName+"\" value=\""+initialValue +"\"/>").autocomplete(whatyousee,options).result(handler).appendTo(place);
	
	}
};
config.macros.aet.controlTypes.search = function(place,tiddler,metaDataName,options){
    if(!options)return;
    var handler= function(value){
		  config.macros.AdvancedEditTemplate.setMetaData(tiddler.title,metaDataName,value,options.autosavechanges);
	  };
	var extension = config.macros.aet.extensions.search;
	extension.setupSearchbox(place,tiddler,metaDataName,handler,options);
};

/* The following code is optional and adds search suggestions */
/*
 * Autocomplete - jQuery plugin 1.0.2
 *
 * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $
 *
 */
 /* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
  * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
  *
  * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $
  * $Rev: 2447 $
  *
  * Version 2.1.1
  */
(function($) { 
  (function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
  
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(3($){$.31.1o({12:3(b,d){5 c=Y b=="1w";d=$.1o({},$.D.1L,{11:c?b:14,w:c?14:b,1D:c?$.D.1L.1D:10,Z:d&&!d.1x?10:3U},d);d.1t=d.1t||3(a){6 a};d.1q=d.1q||d.1K;6 I.K(3(){1E $.D(I,d)})},M:3(a){6 I.X("M",a)},1y:3(a){6 I.15("1y",[a])},20:3(){6 I.15("20")},1Y:3(a){6 I.15("1Y",[a])},1X:3(){6 I.15("1X")}});$.D=3(o,r){5 t={2N:38,2I:40,2D:46,2x:9,2v:13,2q:27,2d:3x,2j:33,2o:34,2e:8};5 u=$(o).3f("12","3c").P(r.24);5 p;5 m="";5 n=$.D.2W(r);5 s=0;5 k;5 h={1z:B};5 l=$.D.2Q(r,o,1U,h);5 j;$.1T.2L&&$(o.2K).X("3S.12",3(){4(j){j=B;6 B}});u.X(($.1T.2L?"3Q":"3N")+".12",3(a){k=a.2F;3L(a.2F){Q t.2N:a.1d();4(l.L()){l.2y()}A{W(0,C)}N;Q t.2I:a.1d();4(l.L()){l.2u()}A{W(0,C)}N;Q t.2j:a.1d();4(l.L()){l.2t()}A{W(0,C)}N;Q t.2o:a.1d();4(l.L()){l.2s()}A{W(0,C)}N;Q r.19&&$.1p(r.R)==","&&t.2d:Q t.2x:Q t.2v:4(1U()){a.1d();j=C;6 B}N;Q t.2q:l.U();N;3A:1I(p);p=1H(W,r.1D);N}}).1G(3(){s++}).3v(3(){s=0;4(!h.1z){2k()}}).2i(3(){4(s++>1&&!l.L()){W(0,C)}}).X("1y",3(){5 c=(1n.7>1)?1n[1]:14;3 23(q,a){5 b;4(a&&a.7){16(5 i=0;i<a.7;i++){4(a[i].M.O()==q.O()){b=a[i];N}}}4(Y c=="3")c(b);A u.15("M",b&&[b.w,b.H])}$.K(1g(u.J()),3(i,a){1R(a,23,23)})}).X("20",3(){n.18()}).X("1Y",3(){$.1o(r,1n[1]);4("w"2G 1n[1])n.1f()}).X("1X",3(){l.1u();u.1u();$(o.2K).1u(".12")});3 1U(){5 b=l.26();4(!b)6 B;5 v=b.M;m=v;4(r.19){5 a=1g(u.J());4(a.7>1){v=a.17(0,a.7-1).2Z(r.R)+r.R+v}v+=r.R}u.J(v);1l();u.15("M",[b.w,b.H]);6 C}3 W(b,c){4(k==t.2D){l.U();6}5 a=u.J();4(!c&&a==m)6;m=a;a=1k(a);4(a.7>=r.22){u.P(r.21);4(!r.1C)a=a.O();1R(a,2V,1l)}A{1B();l.U()}};3 1g(b){4(!b){6[""]}5 d=b.1Z(r.R);5 c=[];$.K(d,3(i,a){4($.1p(a))c[i]=$.1p(a)});6 c}3 1k(a){4(!r.19)6 a;5 b=1g(a);6 b[b.7-1]}3 1A(q,a){4(r.1A&&(1k(u.J()).O()==q.O())&&k!=t.2e){u.J(u.J()+a.48(1k(m).7));$.D.1N(o,m.7,m.7+a.7)}};3 2k(){1I(p);p=1H(1l,47)};3 1l(){5 c=l.L();l.U();1I(p);1B();4(r.2U){u.1y(3(a){4(!a){4(r.19){5 b=1g(u.J()).17(0,-1);u.J(b.2Z(r.R)+(b.7?r.R:""))}A u.J("")}})}4(c)$.D.1N(o,o.H.7,o.H.7)};3 2V(q,a){4(a&&a.7&&s){1B();l.2T(a,q);1A(q,a[0].H);l.1W()}A{1l()}};3 1R(f,d,g){4(!r.1C)f=f.O();5 e=n.2S(f);4(e&&e.7){d(f,e)}A 4((Y r.11=="1w")&&(r.11.7>0)){5 c={45:+1E 44()};$.K(r.2R,3(a,b){c[a]=Y b=="3"?b():b});$.43({42:"41",3Z:"12"+o.3Y,2M:r.2M,11:r.11,w:$.1o({q:1k(f),3X:r.Z},c),3W:3(a){5 b=r.1r&&r.1r(a)||1r(a);n.1h(f,b);d(f,b)}})}A{l.2J();g(f)}};3 1r(c){5 d=[];5 b=c.1Z("\\n");16(5 i=0;i<b.7;i++){5 a=$.1p(b[i]);4(a){a=a.1Z("|");d[d.7]={w:a,H:a[0],M:r.1v&&r.1v(a,a[0])||a[0]}}}6 d};3 1B(){u.1e(r.21)}};$.D.1L={24:"3R",2H:"3P",21:"3O",22:1,1D:3M,1C:B,1a:C,1V:B,1j:10,Z:3K,2U:B,2R:{},1S:C,1K:3(a){6 a[0]},1q:14,1A:B,E:0,19:B,R:", ",1t:3(b,a){6 b.2C(1E 3J("(?![^&;]+;)(?!<[^<>]*)("+a.2C(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/2A,"\\\\$1")+")(?![^<>]*>)(?![^&;]+;)","2A"),"<2z>$1</2z>")},1x:C,1s:3I};$.D.2W=3(g){5 h={};5 j=0;3 1a(s,a){4(!g.1C)s=s.O();5 i=s.3H(a);4(i==-1)6 B;6 i==0||g.1V};3 1h(q,a){4(j>g.1j){18()}4(!h[q]){j++}h[q]=a}3 1f(){4(!g.w)6 B;5 f={},2w=0;4(!g.11)g.1j=1;f[""]=[];16(5 i=0,30=g.w.7;i<30;i++){5 c=g.w[i];c=(Y c=="1w")?[c]:c;5 d=g.1q(c,i+1,g.w.7);4(d===B)1P;5 e=d.3G(0).O();4(!f[e])f[e]=[];5 b={H:d,w:c,M:g.1v&&g.1v(c)||d};f[e].1O(b);4(2w++<g.Z){f[""].1O(b)}};$.K(f,3(i,a){g.1j++;1h(i,a)})}1H(1f,25);3 18(){h={};j=0}6{18:18,1h:1h,1f:1f,2S:3(q){4(!g.1j||!j)6 14;4(!g.11&&g.1V){5 a=[];16(5 k 2G h){4(k.7>0){5 c=h[k];$.K(c,3(i,x){4(1a(x.H,q)){a.1O(x)}})}}6 a}A 4(h[q]){6 h[q]}A 4(g.1a){16(5 i=q.7-1;i>=g.22;i--){5 c=h[q.3F(0,i)];4(c){5 a=[];$.K(c,3(i,x){4(1a(x.H,q)){a[a.7]=x}});6 a}}}6 14}}};$.D.2Q=3(e,g,f,k){5 h={G:"3E"};5 j,y=-1,w,1m="",1M=C,F,z;3 2r(){4(!1M)6;F=$("<3D/>").U().P(e.2H).T("3C","3B").1J(2p.2n);z=$("<3z/>").1J(F).3y(3(a){4(V(a).2m&&V(a).2m.3w()==\'2l\'){y=$("1F",z).1e(h.G).3u(V(a));$(V(a)).P(h.G)}}).2i(3(a){$(V(a)).P(h.G);f();g.1G();6 B}).3t(3(){k.1z=C}).3s(3(){k.1z=B});4(e.E>0)F.T("E",e.E);1M=B}3 V(a){5 b=a.V;3r(b&&b.3q!="2l")b=b.3p;4(!b)6[];6 b}3 S(b){j.17(y,y+1).1e(h.G);2h(b);5 a=j.17(y,y+1).P(h.G);4(e.1x){5 c=0;j.17(0,y).K(3(){c+=I.1i});4((c+a[0].1i-z.1c())>z[0].3o){z.1c(c+a[0].1i-z.3n())}A 4(c<z.1c()){z.1c(c)}}};3 2h(a){y+=a;4(y<0){y=j.1b()-1}A 4(y>=j.1b()){y=0}}3 2g(a){6 e.Z&&e.Z<a?e.Z:a}3 2f(){z.2B();5 b=2g(w.7);16(5 i=0;i<b;i++){4(!w[i])1P;5 a=e.1K(w[i].w,i+1,b,w[i].H,1m);4(a===B)1P;5 c=$("<1F/>").3m(e.1t(a,1m)).P(i%2==0?"3l":"3k").1J(z)[0];$.w(c,"2c",w[i])}j=z.3j("1F");4(e.1S){j.17(0,1).P(h.G);y=0}4($.31.2b)z.2b()}6{2T:3(d,q){2r();w=d;1m=q;2f()},2u:3(){S(1)},2y:3(){S(-1)},2t:3(){4(y!=0&&y-8<0){S(-y)}A{S(-8)}},2s:3(){4(y!=j.1b()-1&&y+8>j.1b()){S(j.1b()-1-y)}A{S(8)}},U:3(){F&&F.U();j&&j.1e(h.G);y=-1},L:3(){6 F&&F.3i(":L")},3h:3(){6 I.L()&&(j.2a("."+h.G)[0]||e.1S&&j[0])},1W:3(){5 a=$(g).3g();F.T({E:Y e.E=="1w"||e.E>0?e.E:$(g).E(),2E:a.2E+g.1i,1Q:a.1Q}).1W();4(e.1x){z.1c(0);z.T({29:e.1s,3e:\'3d\'});4($.1T.3b&&Y 2p.2n.3T.29==="3a"){5 c=0;j.K(3(){c+=I.1i});5 b=c>e.1s;z.T(\'3V\',b?e.1s:c);4(!b){j.E(z.E()-28(j.T("32-1Q"))-28(j.T("32-39")))}}}},26:3(){5 a=j&&j.2a("."+h.G).1e(h.G);6 a&&a.7&&$.w(a[0],"2c")},2J:3(){z&&z.2B()},1u:3(){F&&F.37()}}};$.D.1N=3(b,a,c){4(b.2O){5 d=b.2O();d.36(C);d.35("2P",a);d.4c("2P",c);d.4b()}A 4(b.2Y){b.2Y(a,c)}A{4(b.2X){b.2X=a;b.4a=c}}b.1G()}})(49);',62,261,'|||function|if|var|return|length|||||||||||||||||||||||||data||active|list|else|false|true|Autocompleter|width|element|ACTIVE|value|this|val|each|visible|result|break|toLowerCase|addClass|case|multipleSeparator|moveSelect|css|hide|target|onChange|bind|typeof|max||url|autocomplete||null|trigger|for|slice|flush|multiple|matchSubset|size|scrollTop|preventDefault|removeClass|populate|trimWords|add|offsetHeight|cacheLength|lastWord|hideResultsNow|term|arguments|extend|trim|formatMatch|parse|scrollHeight|highlight|unbind|formatResult|string|scroll|search|mouseDownOnSelect|autoFill|stopLoading|matchCase|delay|new|li|focus|setTimeout|clearTimeout|appendTo|formatItem|defaults|needsInit|Selection|push|continue|left|request|selectFirst|browser|selectCurrent|matchContains|show|unautocomplete|setOptions|split|flushCache|loadingClass|minChars|findValueCallback|inputClass||selected||parseInt|maxHeight|filter|bgiframe|ac_data|COMMA|BACKSPACE|fillList|limitNumberOfItems|movePosition|click|PAGEUP|hideResults|LI|nodeName|body|PAGEDOWN|document|ESC|init|pageDown|pageUp|next|RETURN|nullData|TAB|prev|strong|gi|empty|replace|DEL|top|keyCode|in|resultsClass|DOWN|emptyList|form|opera|dataType|UP|createTextRange|character|Select|extraParams|load|display|mustMatch|receiveData|Cache|selectionStart|setSelectionRange|join|ol|fn|padding|||moveStart|collapse|remove||right|undefined|msie|off|auto|overflow|attr|offset|current|is|find|ac_odd|ac_even|html|innerHeight|clientHeight|parentNode|tagName|while|mouseup|mousedown|index|blur|toUpperCase|188|mouseover|ul|default|absolute|position|div|ac_over|substr|charAt|indexOf|180|RegExp|100|switch|400|keydown|ac_loading|ac_results|keypress|ac_input|submit|style|150|height|success|limit|name|port||abort|mode|ajax|Date|timestamp||200|substring|jQuery|selectionEnd|select|moveEnd'.split('|'),0,{}))


})(jQuery); //end alias


/*
}}}
*/
/*{{{*/
.publicLightText {
	color: #C0E5FC;
}

.privateLightText {
	color: #E2C1D6;
}

#backstageLogo {
	margin: 1px auto auto -200px;
	font-weight: bold;
	width: 200px;
	line-height:24px;
	font-size: 1.2em;
	padding: 0;
	text-align: center;
	top: 0;
	position: absolute;
	left: 50%;
}

#backstageLogo .svgIcon {
	margin-top:-2px;
}

#backstageLogo .svgIconText {
	display: none;
}

#backstageLogo .logoText {
	position: absolute;
	top: 0px;
	margin-left: 5px;
}

#backstageArea {
	z-index: 49;
	color: white;
	background-color: black;
	background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	/* For Internet Explorer 5.5 - 7 */
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
	/* For Internet Explorer 8 */
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
	height: 24px;
	padding: 0;
	border-bottom: solid 1px black;
}

.backstageBackground {
	fill: black;
}

#backstageButton {
	overflow: hidden;
}

#backstageButton #backstageShow,
#backstageButton #backstageHide {
	margin: 0px;
	padding: 0px;
}

#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
	background: none;
	color: none;
}

#backstageShow {
	margin-right: -3px;
	margin-top: -3px;
}

#backstageShow .svgIcon {
	left: 8px;
	position: relative;
	top: -5px;
}

#messageArea {
	top: 50px;
}

#backstageToolbar {
	position: relative;
}

#backstageArea a {
	padding: 0px;
	margin-left: 0px;
	color: white;
	background: none;
}

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

#backstage .tabContents ol,
#backstage .tabContents ul {
	padding: auto;
}

#backstageButton a {
	margin: 0;
}

.backstagePanelBody,
.backstagePanelBody .tabContents ul {
	padding: 5px;
	margin: 5px;
}

#backstage #backstagePanel {
	margin-left: 5%;
	padding: 0em;
	margin-right: 5%;
}

#backstageToolbar a {
	position: relative;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask {
	line-height: 24px;
	color: #767676;
}

.backstageTask .externalImage,
.backstageTask .image {
	display: inline;
}

.backstageTask .txtUserName,
.backstageTask .spaceName {
	color: #fff;
}

.backstageSelTab .txtUserName,
.backstageSelTab .spaceName,
a:hover .txtUserName,
a:hover .spaceName {
	color: #000;
}

.spaceSiteIcon {
	margin-right: 10px;
}

.userSiteIcon {
	margin-left: 10px;
}

#backstageToolbar .task_space {
	position: absolute;
	top: 0px;
	left: 0%;
}

#backstageToolbar .task_user span,
#backstageToolbar .task_login span {
	display: block;
	float: left;
}

#backstageToolbar .task_user,
#backstageToolbar .task_login {
	display: block;
	position: absolute;
	top: 0px;
	right: 5%;
}

#backstageToolbar .task_login img {
	position: relative;
	display: inline;
}

#backstageToolbar .task_space .svgIcon {
	float: left;
	position: relative;
	z-index: 2;
}

#backstageToolbar a span {
	z-index: 2;
}

#backstageToolbar .spaceSiteIcon {
	float: left;
}

a.backstageTask {
	display: block;
	height: 53px;
}

#backstageToolbar a span.txtUserName,
#backstageToolbar a .txtUserName span {
	display: inline;
	float: none;
}

#backstage .deleteButton {
	margin-left: 0.3em;
	font-weight: bold;
	color: red;
	font-size: 1.6em;
}

#backstage .deleteButton:hover {
	background: none;
}

#backstagePanel .TiddlySpaceLogin {
	display: inline;
}

.backstagePanelBody .tabContents .button {
	display: block;
}

.backstagePanelBody .tab {
	margin: 0 0 0 0.6em;
	padding: 0.4em 0.5em 1px 0.5em;
}

#backstage .tabContents{
	padding: 1.5em;
}

#backstage .wizard {
	border: 0px;
}

#backstage .txtSpaceTab li {
	border: 1px solid #ddd;
	background: #eee;
	list-style: none;
	margin: 0.5em;
	padding: 0.5em;
	width: 80%;
}

#backstage .txtSpaceTab li.annotation {
	border: 2px solid [[ColorPalette::SecondaryMid]];
}

#backstage div  li.listLink {
	border: 0px;
	width: 78%;
	font-size: 0.7em;
}

#backstage div li.listTitle {
	font-weight: bold;
	text-decoration: underline;
	font-size: 1em;
	background: #ccc;
	width: 100%;
}

#backstage div.txtSpaceTab li .deleteButton {
	float: right;
}

#backstage fieldset {
	border: solid 1px [[ColorPalette::Background]];
}

#backstage .viewer table,#backstage table.twtable {
	border: 0px;
}

#backstageToolbar img {
	padding: 0;
}

#backstage .wizard, 
#backstage .wizardFooter {
	background: none;
}

.viewer td, .viewer tr, .twtable td, .twtable tr {
	border: 1px solid #eee;
}

#backstage .inlineList ul li {
	background-color: [[ColorPalette::Background]];
	border: solid 1px [[ColorPalette::TertiaryMid]];
	display: block;
	float: left;
	list-style: none;
	margin-right: 1em;
	padding: 0.5em;
}

.backstageClear, .inlineList form {
	clear: both;
	display: block;
	margin-top: 3em;
}
/*}}}*/
/***
|''Name:''|YourSearchPlugin|
|''Version:''|2.1.0 (2006-10-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin ([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]])|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2006 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!

For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1. 
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Source Code
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.0.js]] to get the readable source code.
***/
///%
if(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:0,source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"};if(!window.abego){window.abego={};}if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,len=_1.length;i<len;i++){_2.call(_3,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,len=this.length;i<len;i++){_5.call(_6,this[i],i,this);}};}abego.toInt=function(s,_9){if(!s){return _9;}var n=parseInt(s);return (n==NaN)?_9:n;};abego.createEllipsis=function(_b){var e=createTiddlyElement(_b,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_d){if(!_d){return _d;}var _e={};for(var n in _d){_e[n]=_d[n];}return _e;};abego.copyOptions=function(_10){return !_10?{}:abego.shallowCopy(_10);};abego.countStrings=function(_11,s){if(!s){return 0;}var len=s.length;var n=0;var _15=0;while(1){var i=_11.indexOf(s,_15);if(i<0){return n;}n++;_15=i+len;}return n;};abego.getBracedText=function(_17,_18,_19){if(!_18){_18=0;}var re=/\{([^\}]*)\}/gm;re.lastIndex=_18;var m=re.exec(_17);if(m){var s=m[1];var _1d=abego.countStrings(s,"{");if(!_1d){if(_19){_19.lastIndex=re.lastIndex;}return s;}var len=_17.length;for(var i=re.lastIndex;i<len&&_1d;i++){var c=_17.charAt(i);if(c=="{"){_1d++;}else{if(c=="}"){_1d--;}}}if(!_1d){if(_19){_19.lastIndex=i-1;}return _17.substring(m.index+1,i-1);}}};abego.select=function(_21,_22,_23,_24){if(!_24){_24=[];}_21.forEach(function(t){if(_22.call(_23,t)){_24.push(t);}});return _24;};abego.TiddlerFilterTerm=function(_26,_27){if(!_27){_27={};}var _28=_26;if(!_27.textIsRegExp){_28=_26.escapeRegExp();if(_27.fullWordMatch){_28="\\b"+_28+"\\b";}}var _29=new RegExp(_28,"m"+(_27.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_29,_27.fields,_27.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_2a){return this.tester.test(_2a);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}var _2f=m[2]?m[2].trim():"";r.push({name:"text",value:_2f});r[0].text=[_2f];return {title:m[1].trim(),params:r};}else{return {title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_30,_31,_32){var re=/\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg;var _34={"!":"title","%":"text","#":"tags"};var _35={};var _36;re.lastIndex=_31;while(1){var i=re.lastIndex;var m=re.exec(_30);if(!m||m.index!=i){throw "Word or String literal expected";}if(m[1]){var _39={};var _3a=abego.getBracedText(_30,0,_39);if(!_3a){throw "Invalid {...} syntax";}var f=Function("tiddler","return ("+_3a+");");return {func:f,lastIndex:_39.lastIndex,markRE:null};}if(m[2]){_36=true;}else{if(m[3]){_35[_34[m[3]]]=1;}else{if(m[4]){_35[m[4]]=1;}else{var _3c=m[6];var _3d=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _32=abego.copyOptions(_32);_32.fullWordMatch=_36;_32.textIsRegExp=_3c;var _3e=[];for(var n in _35){_3e.push(n);}if(_3e.length==0){_32.fields=_32.defaultFields;}else{_32.fields=_3e;_32.withExtendedFields=false;}var _40=new abego.TiddlerFilterTerm(_3d,_32);var _41=_3c?_3d:_3d.escapeRegExp();if(_41&&_36){_41="\\b"+_41+"\\b";}return {func:function(_42){return _40.test(_42);},lastIndex:re.lastIndex,markRE:_41?"(?:"+_41+")":null};}}}}};abego.BoolExp=function(s,_44,_45){this.s=s;var _46=_45&&_45.defaultOperationIs_OR;var _47=/\s*(?:(\-|not)|(\())/gi;var _48=/\s*\)/g;var _49=/\s*(?:(and|\&\&)|(or|\|\|))/gi;var _4a=/\s*[^\)\s]/g;var _4b=/\s*(\-|not)?(\s*\()?/gi;var _4c=function(_4d){_4b.lastIndex=_4d;var m=_4b.exec(s);var _4f;var _50;if(m&&m.index==_4d){_4d=_4b.lastIndex;_4f=m[1];if(m[2]){var e=parseBoolExpression(_4d);_48.lastIndex=e.lastIndex;if(!_48.exec(s)){throw "Missing ')'";}_50={func:e.func,lastIndex:_48.lastIndex};}}if(!_50){_50=_44(s,_4d,_45);}if(_4f){_50.func=(function(f){return function(_53){return !f(_53);};})(_50.func);_50.markRE=null;}return _50;};var _54=function(_55){var _56=_4c(_55);while(1){var l=_56.lastIndex;_49.lastIndex=l;var m=_49.exec(s);var _59;var _5a;if(m&&m.index==l){_59=!m[1];_5a=_4c(_49.lastIndex);}else{try{_5a=_4c(l);}catch(e){return _56;}_59=_46;}_56.func=(function(_5b,_5c,_5d){return _5d?function(_5e){return _5b(_5e)||_5c(_5e);}:function(_5f){return _5b(_5f)&&_5c(_5f);};})(_56.func,_5a.func,_59);_56.lastIndex=_5a.lastIndex;if(!_56.markRE){_56.markRE=_5a.markRE;}else{if(_5a.markRE){_56.markRE=_56.markRE+"|"+_5a.markRE;}}}};var _60=_54(0);this.evalFunc=_60.func;if(_60.markRE){this.markRegExp=new RegExp(_60.markRE,_45.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_62,_63){this.re=re;this.fields=_62?_62:["title","text","tags"];this.withExtendedFields=_63;};abego.MultiFieldRegExpTester.prototype.test=function(_64){var re=this.re;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_64,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}if(this.withExtendedFields){return store.forEachField(_64,function(_68,_69,_6a){return typeof _6a=="string"&&re.test(_6a)?_69:null;},true);}return null;};abego.TiddlerQuery=function(_6b,_6c,_6d,_6e,_6f){if(_6d){this.regExp=new RegExp(_6b,_6c?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_6e,_6f);}else{this.expr=new abego.BoolExp(_6b,abego.parseTiddlerFilterTerm,{defaultFields:_6e,caseSensitive:_6c,withExtendedFields:_6f});}this.getQueryText=function(){return _6b;};this.getUseRegExp=function(){return _6d;};this.getCaseSensitive=function(){return _6c;};this.getDefaultFields=function(){return _6e;};this.getWithExtendedFields=function(){return _6f;};};abego.TiddlerQuery.prototype.test=function(_70){if(!_70){return false;}if(this.regExp){return this.tester.test(_70);}return this.expr.exec(_70);};abego.TiddlerQuery.prototype.filter=function(_71){return abego.select(_71,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return (this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_72){this.items=_72;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_73){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_74){this.firstIndexOnPage=Math.min(Math.max(0,_74),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_75,_76){},renderPage:function(_77){if(_77.beginRendering){_77.beginRendering(this);}try{if(this.getItemsCount()){var _78=this.getLastIndexOnPage();var _79=-1;for(var i=this.getFirstIndexOnPage();i<=_78;i++){_79++;_77.render(this,this.items[i],i,_79);}}}finally{if(_77.endRendering){_77.endRendering(this);}}},addPageNavigation:function(_7b){if(!this.getItemsCount()){return;}var _7c=this;var _7d=function(e){if(!e){var e=window.event;}var _7f=abego.toInt(this.getAttribute("page"),0);var _80=_7c.getCurrentPageIndex();if(_7f==_80){return;}var _81=_7f*_7c.getItemsPerPage();_7c.setFirstIndexOnPage(_81);_7c.onPageChanged(_7f,_80);};var _82;var _83=this.getCurrentPageIndex();var _84=this.getLastPageIndex();if(_83>0){_82=createTiddlyButton(_7b,"Previous","Go to previous page (Shortcut: Alt-'<')",_7d,"prev");_82.setAttribute("page",(_83-1).toString());_82.setAttribute("accessKey","<");}for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _86=_83+i;if(_86<0){continue;}if(_86>_84){break;}var _87=(i+_83+1).toString();var _88=_86==_83?"currentPage":"otherPage";_82=createTiddlyButton(_7b,_87,"Go to page %0".format([_87]),_7d,_88);_82.setAttribute("page",(_86).toString());}if(_83<_84){_82=createTiddlyButton(_7b,"Next","Go to next page (Shortcut: Alt-'>')",_7d,"next");_82.setAttribute("page",(_83+1).toString());_82.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _89=40;var _8a=4;var _8b=function(_8c,_8d,_8e){var n=_8c.length;if(n==0){_8c.push({start:_8d,end:_8e});return;}var i=0;for(;i<n;i++){var _91=_8c[i];if(_91.start<=_8e&&_8d<=_91.end){var r;var _93=i+1;for(;_93<n;_93++){r=_8c[_93];if(r.start>_8e||_8d>_91.end){break;}}var _94=_8d;var _95=_8e;for(var j=i;j<_93;j++){r=_8c[j];_94=Math.min(_94,r.start);_95=Math.max(_95,r.end);}_8c.splice(i,_93-i,{start:_94,end:_95});return;}if(_91.start>_8e){break;}}_8c.splice(i,0,{start:_8d,end:_8e});};var _97=function(_98){var _99=0;for(var i=0;i<_98.length;i++){var _9b=_98[i];_99+=_9b.end-_9b.start;}return _99;};var _9c=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _9e=function(s,_a0){if(!_9c(s[_a0])){return null;}for(var i=_a0-1;i>=0&&_9c(s[i]);i--){}var _a2=i+1;var n=s.length;for(i=_a0+1;i<n&&_9c(s[i]);i++){}return {start:_a2,end:i};};var _a4=function(s,_a6,_a7){var _a8;if(_a7){_a8=_9e(s,_a6);}else{if(_a6<=0){return _a6;}_a8=_9e(s,_a6-1);}if(!_a8){return _a6;}if(_a7){if(_a8.start>=_a6-_8a){return _a8.start;}if(_a8.end<=_a6+_8a){return _a8.end;}}else{if(_a8.end<=_a6+_8a){return _a8.end;}if(_a8.start>=_a6-_8a){return _a8.start;}}return _a6;};var _a9=function(s,_ab){var _ac=[];if(_ab){var _ad=0;var n=s.length;var _af=0;do{_ab.lastIndex=_ad;var _b0=_ab.exec(s);if(_b0){if(_ad<_b0.index){var t=s.substring(_ad,_b0.index);_ac.push({text:t});}_ac.push({text:_b0[0],isMatch:true});_ad=_b0.index+_b0[0].length;}else{_ac.push({text:s.substr(_ad)});break;}}while(true);}else{_ac.push({text:s});}return _ac;};var _b2=function(_b3){var _b4=0;for(var i=0;i<_b3.length;i++){if(_b3[i].isMatch){_b4++;}}return _b4;};var _b6=function(s,_b8,_b9,_ba,_bb){var _bc=Math.max(Math.floor(_bb/(_ba+1)),_89);var _bd=Math.max(_bc-(_b9-_b8),0);var _be=Math.min(Math.floor(_b9+_bd/3),s.length);var _bf=Math.max(_be-_bc,0);_bf=_a4(s,_bf,true);_be=_a4(s,_be,false);return {start:_bf,end:_be};};var _c0=function(_c1,s,_c3){var _c4=[];var _c5=_b2(_c1);var pos=0;for(var i=0;i<_c1.length;i++){var t=_c1[i];var _c9=t.text;if(t.isMatch){var _ca=_b6(s,pos,pos+_c9.length,_c5,_c3);_8b(_c4,_ca.start,_ca.end);}pos+=_c9.length;}return _c4;};var _cb=function(s,_cd,_ce){var _cf=_ce-_97(_cd);while(_cf>0){if(_cd.length==0){_8b(_cd,0,_a4(s,_ce,false));return;}else{var _d0=_cd[0];var _d1;var _d2;if(_d0.start==0){_d1=_d0.end;if(_cd.length>1){_d2=_cd[1].start;}else{_8b(_cd,_d1,_a4(s,_d1+_cf,false));return;}}else{_d1=0;_d2=_d0.start;}var _d3=Math.min(_d2,_d1+_cf);_8b(_cd,_d1,_d3);_cf-=(_d3-_d1);}}};var _d4=function(_d5,s,_d7,_d8,_d9){if(_d8.length==0){return;}var _da=function(_db,s,_dd,_de,_df){var t;var _e1;var pos=0;var i=0;var _e4=0;for(;i<_dd.length;i++){t=_dd[i];_e1=t.text;if(_de<pos+_e1.length){_e4=_de-pos;break;}pos+=_e1.length;}var _e5=_df-_de;for(;i<_dd.length&&_e5>0;i++){t=_dd[i];_e1=t.text.substr(_e4);_e4=0;if(_e1.length>_e5){_e1=_e1.substr(0,_e5);}if(t.isMatch){createTiddlyElement(_db,"span",null,"marked",_e1);}else{createTiddlyText(_db,_e1);}_e5-=_e1.length;}if(_df<s.length){abego.createEllipsis(_db);}};if(_d8[0].start>0){abego.createEllipsis(_d5);}var _e6=_d9;for(var i=0;i<_d8.length&&_e6>0;i++){var _e8=_d8[i];var len=Math.min(_e8.end-_e8.start,_e6);_da(_d5,s,_d7,_e8.start,_e8.start+len);_e6-=len;}};this.render=function(_ea,s,_ec,_ed){if(s.length<_ec){_ec=s.length;}var _ee=_a9(s,_ed);var _ef=_c0(_ee,s,_ec);_cb(s,_ef,_ec);_d4(_ea,s,_ee,_ef,_ec);};};(function(){function alertAndThrow(msg){alert(msg);throw msg;}if(version.major<2||(version.major==2&&version.minor<1)){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");}abego.YourSearch={};var _f1;var _f2;var _f3=function(_f4){_f1=_f4;};var _f5=function(){return _f1?_f1:[];};var _f6=function(){return _f1?_f1.length:0;};var _f7=4;var _f8=10;var _f9=2;var _fa=function(s,re){var m=s.match(re);return m?m.length:0;};var _fe=function(_ff,_100){var _101=_100.getMarkRegExp();if(!_101){return 1;}var _102=_ff.title.match(_101);var _103=_102?_102.length:0;var _104=_fa(_ff.getTags(),_101);var _105=_102?_102.join("").length:0;var _106=_ff.title.length>0?_105/_ff.title.length:0;var rank=_103*_f7+_104*_f9+_106*_f8+1;return rank;};var _108=function(_109,_10a,_10b,_10c,_10d,_10e){_f2=null;var _10f=_109.reverseLookup("tags",_10e,false);try{var _110=[];if(config.options.chkSearchInTitle){_110.push("title");}if(config.options.chkSearchInText){_110.push("text");}if(config.options.chkSearchInTags){_110.push("tags");}_f2=new abego.TiddlerQuery(_10a,_10b,_10c,_110,config.options.chkSearchExtendedFields);}catch(e){return [];}var _111=_f2.filter(_10f);var _112=abego.YourSearch.getRankFunction();for(var i=0;i<_111.length;i++){var _114=_111[i];var rank=_112(_114,_f2);_114.searchRank=rank;}if(!_10d){_10d="title";}var _116=function(a,b){var _119=a.searchRank-b.searchRank;if(_119==0){if(a[_10d]==b[_10d]){return (0);}else{return (a[_10d]<b[_10d])?-1:+1;}}else{return (_119>0)?-1:+1;}};_111.sort(_116);return _111;};var _11a=80;var _11b=50;var _11c=250;var _11d=50;var _11e=25;var _11f=10;var _120="yourSearchResult";var _121="yourSearchResultItems";var _122;var _123;var _124;var _125;var _126;var _127=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _128=function(){return _123!=null&&_123.parentNode==document.body;};var _129=function(){if(_128()){document.body.removeChild(_123);}};var _12a=function(e){_129();var _12c=this.getAttribute("tiddlyLink");if(_12c){var _12d=this.getAttribute("withHilite");var _12e=highlightHack;if(_12d&&_12d=="true"&&_f2){highlightHack=_f2.getMarkRegExp();}story.displayTiddler(this,_12c);highlightHack=_12e;}return (false);};var _12f=function(){if(!_124){return;}var root=_124;var _131=findPosX(root);var _132=findPosY(root);var _133=root.offsetHeight;var _134=_131;var _135=_132+_133;var _136=findWindowWidth();if(_136<_123.offsetWidth){_123.style.width=(_136-100)+"px";_136=findWindowWidth();}var _137=_123.offsetWidth;if(_134+_137>_136){_134=_136-_137-30;}if(_134<0){_134=0;}_123.style.left=_134+"px";_123.style.top=_135+"px";_123.style.display="block";};var _138=function(){if(_123){window.scrollTo(0,ensureVisible(_123));}if(_124){window.scrollTo(0,ensureVisible(_124));}};var _139=function(){_12f();_138();};var _13a;var _13b;var _13c=new abego.PageWiseRenderer();var _13d=function(_13e){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){alertAndThrow("YourSearchItemTemplate not found");}this.place=document.getElementById(_121);if(!this.place){this.place=createTiddlyElement(_13e,"div",_121);}};merge(_13d.prototype,{render:function(_13f,_140,_141,_142){_13a=_142;_13b=_140;var item=createTiddlyElement(this.place,"div",null,"yourSearchItem");item.innerHTML=this.itemHtml;applyHtmlMacros(item,null);refreshElements(item,null);},endRendering:function(_144){_13b=null;}});var _145=function(){if(!_123||!_124){return;}var html=store.getTiddlerText("YourSearchResultTemplate");if(!html){html="<b>Tiddler YourSearchResultTemplate not found</b>";}_123.innerHTML=html;applyHtmlMacros(_123,null);refreshElements(_123,null);var _147=new _13d(_123);_13c.renderPage(_147);_139();};_13c.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_11f):abego.toInt(config.options.txtItemsPerPage,_11e);return (n>0)?n:1;};_13c.onPageChanged=function(){_145();};var _149=function(){if(!_123){_123=createTiddlyElement(document.body,"div",_120,"yourSearchResult");}else{if(_123.parentNode!=document.body){document.body.appendChild(_123);}}_145();};var _14a=function(){if(_124==null||!config.options.chkUseYourSearch){return;}if((_124.value==_122)&&_122&&!_128()){if(_123&&(_123.parentNode!=document.body)){document.body.appendChild(_123);_139();}else{_149();}}};var _14b=function(){_129();_123=null;_122=null;};var _14c=function(self,e){while(e!=null){if(self==e){return true;}e=e.parentNode;}return false;};var _14f=function(e){if(e.target==_124){return;}if(e.target==_125){return;}if(_123&&_14c(_123,e.target)){return;}_129();};var _151=function(e){if(e.keyCode==27){_129();}};addEvent(document,"click",_14f);addEvent(document,"keyup",_151);var _153=function(text,_155,_156){_122=text;_f3(_108(store,text,_155,_156,"title","excludeSearch"));highlightHack=_f2?_f2.getMarkRegExp():null;_13c.setItems(_f5());_149();highlightHack=null;};var _157=function(_158,_159,_15a,_15b,_15c,_15d){_127();_122="";var _15e=null;var _15f=function(txt){if(config.options.chkUseYourSearch){_153(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_122=txt.value;};var _161=function(e){_15f(_124);return false;};var _163=function(e){if(!e){var e=window.event;}_124=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_126&&_128()){_126.onclick.apply(_126,[e]);}else{_15f(this);}break;case 27:if(_128()){_129();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_14a();}if(this.value.length<3&&_15e){clearTimeout(_15e);}if(this.value.length>2){if(this.value!=_122){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_15e){clearTimeout(_15e);}var txt=this;_15e=setTimeout(function(){_15f(txt);},500);}}else{if(_15e){clearTimeout(_15e);}}}if(this.value.length==0){_129();}};var _166=function(e){this.select();clearMessage();_14a();};var args=_15c.parseParams("list",null,true);var _169=getFlag(args,"buttonAtRight");var _16a=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_169){btn=createTiddlyButton(_158,this.label,this.prompt,_161);}var txt=createTiddlyElement(_158,"input",null,null,null);if(_15a[0]){txt.value=_15a[0];}txt.onkeyup=_163;txt.onfocus=_166;txt.setAttribute("size",_16a);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}if(_169){btn=createTiddlyButton(_158,this.label,this.prompt,_161);}_124=txt;_125=btn;};var _16d=function(){_129();var _16e=_f5();var n=_16e.length;if(n){var _170=[];for(var i=0;i<n;i++){_170.push(_16e[i].title);}story.displayTiddlers(null,_170);}};var _172=function(_173,_174,_175,_176){invokeMacro(_173,"option",_174,_175,_176);var elem=_173.lastChild;var _178=elem.onclick;elem.onclick=function(e){var _17a=_178.apply(this,arguments);_145();return _17a;};return elem;};var _17b=function(s){var _17d=["''","{{{","}}}","//","<<<","/***","***/"];var _17e="";for(var i=0;i<_17d.length;i++){if(i!=0){_17e+="|";}_17e+="("+_17d[i].escapeRegExp()+")";}return s.replace(new RegExp(_17e,"mg"),"").trim();};var _180=function(){var i=_13a;return (i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _182=new abego.LimitedTextRenderer();var _183=function(_184,s,_186){_182.render(_184,s,_186,_f2.getMarkRegExp());};var _187=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_188,_189,_18a,_18b,_18c,tags,_18e){_187.apply(this,arguments);_14b();};var _18f=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_190){_18f.apply(this,arguments);_14b();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_191,_192,_193,_194,_195,_196){if(_193.length==0){return;}var name=_193[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_191,_192,_193,_194,_195,_196);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _f6()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_199){if(_f6()){var _19a=_13c.getLastIndexOnPage();var s="%0 - %1".format([_13c.getFirstIndexOnPage()+1,_19a+1]);createTiddlyText(_199,s);}},count:function(_19c){createTiddlyText(_19c,_f6().toString());},query:function(_19d){if(_f2){createTiddlyText(_19d,_f2.toString());}},version:function(_19e){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_19e,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_1a1){var e=createTiddlyElement(_1a1,"a");e.setAttribute("href","http://www.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">&copy; 2005-2006 <b><font color=\"red\">abego</font></b> Software<font>";},newTiddlerButton:function(_1a3){if(_f2){var r=abego.parseNewTiddlerCommandLine(_f2.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_1a3,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _1a6=btn.onclick;btn.onclick=function(){_129();_1a6.apply(this,arguments);};_126=btn;}},linkButton:function(_1a7,_1a8,_1a9,_1aa,_1ab,_1ac){if(_1a9<2){return;}var _1ad=_1a9[1];var text=_1a9<3?_1ad:_1a9[2];var _1af=_1a9<4?text:_1a9[3];var _1b0=_1a9<5?null:_1a9[4];var btn=createTiddlyButton(_1a7,text,_1af,_12a,null,null,_1b0);btn.setAttribute("tiddlyLink",_1ad);},closeButton:function(_1b2,_1b3,_1b4,_1b5,_1b6,_1b7){var _1b8=createTiddlyButton(_1b2,"close","Close the Search Results (Shortcut: ESC)",_129);},openAllButton:function(_1b9,_1ba,_1bb,_1bc,_1bd,_1be){var n=_f6();if(n==0){return;}var _1c0=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _1c1=createTiddlyButton(_1b9,_1c0,"Open all found tiddlers (Shortcut: Alt-O)",_16d);_1c1.setAttribute("accessKey","O");},naviBar:function(_1c2,_1c3,_1c4,_1c5,_1c6,_1c7){_13c.addPageNavigation(_1c2);},"if":function(_1c8,_1c9,_1ca,_1cb,_1cc,_1cd){if(_1ca.length<2){return;}var _1ce=_1ca[1];var _1cf=(_1ce=="not");if(_1cf){if(_1ca.length<3){return;}_1ce=_1ca[2];}var test=config.macros.yourSearch.tests[_1ce];var _1d1=false;try{if(test){_1d1=test(_1c8,_1c9,_1ca,_1cb,_1cc,_1cd)!=_1cf;}else{_1d1=(!eval(_1ce))==_1cf;}}catch(ex){}if(!_1d1){_1c8.style.display="none";}},chkPreviewText:function(_1d2,_1d3,_1d4,_1d5,_1d6,_1d7){var _1d8=_1d4.slice(1).join(" ");var elem=_172(_1d2,"chkPreviewText",_1d5,_1d7);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_1da,_1db,_1dc,_1dd,_1de,_1df){var name=_1dc[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_1da,_1db,_1dc,_1dd,_1de,_1df);}},funcs:{title:function(_1e2,_1e3,_1e4,_1e5,_1e6,_1e7){if(!_13b){return;}var _1e8=_180();var _1e9=_1e8>=0?"Open tiddler (Shortcut: Alt-%0)".format([_1e8.toString()]):"Open tiddler";var btn=createTiddlyButton(_1e2,null,_1e9,_12a,null);btn.setAttribute("tiddlyLink",_13b.title);btn.setAttribute("withHilite","true");_183(btn,_13b.title,_11a);if(_1e8>=0){btn.setAttribute("accessKey",_1e8.toString());}},tags:function(_1eb,_1ec,_1ed,_1ee,_1ef,_1f0){if(!_13b){return;}_183(_1eb,_13b.getTags(),_11b);},text:function(_1f1,_1f2,_1f3,_1f4,_1f5,_1f6){if(!_13b){return;}_183(_1f1,_17b(_13b.text),_11c);},field:function(_1f7,_1f8,_1f9,_1fa,_1fb,_1fc){if(!_13b){return;}var name=_1f9[1];var len=_1f9.length>2?abego.toInt(_1f9[2],_11d):_11d;var v=store.getValue(_13b,name);if(v){_183(_1f7,_17b(v),len);}},number:function(_200,_201,_202,_203,_204,_205){var _206=_180();if(_206>=0){var text="%0)".format([_206.toString()]);createTiddlyElement(_200,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_11e,txtItemsPerPageWithPreview:_11f};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+"eady \"use\" these shortcuts.//";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chk"+"SearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFiel"+"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+"view text: <<option txtItemsPerPageWithPreview>>|\n";config.shadowTiddlers["YourSearchStyleSheet"]="/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tborder-bottom-width:"+" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+"rchRange, .yourSearchCount, .yourSearchQuery   {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+";\n\tcolor: blue;\n}\n/*}}}*/\n";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+"<tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+"h itemRange\"></span>\n\t\t&nbsp;of&nbsp;<span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+"\t\tfor&nbsp;<span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+"seButton\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+">\n  <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+"h copyright\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n  <"+"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\n<span class='yourSearchTags' macro='found"+"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";config.macros.search.handler=_157;var _20a=function(){if(config.macros.search.handler!=_157){alert("Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+"lers)\nto enable the 'Your Search' features.");}};setTimeout(_20a,5000);abego.YourSearch.getStandardRankFunction=function(){return _fe;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return _13b;};abego.YourSearch.closeResult=function(){_129();};})();}
//%/
<<closeAll>><<permaview>><<newTiddler>><<saveChanges>>{{button{[[About]]}}}
/***
|''Requires''|AETPlugin|
***/
/***
|''Name:''|AETRadio|
|''Version:''|0.8|
|''Description:''||
|''Author:''|JonRobson |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Requires:''|[[AdvancedEditTemplate (core code)|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/AET/plugins/AET.js]]|
|''Usage:''|

Adds radio boxes to the AdvancedEditTemplatePlugin
<<aet type:radio field:fieldname values:tiddlerTitle>>
{{{
***/

config.macros.aet.controlTypes.radio = function(place,tiddlerobj,metaDataName,options){
      var valueSource = options.value || options.valuesSource;
      var source = store.getTiddler(valueSource);
	    if(!source) source = "";
	    else source = source.text;	    
	    var aet = config.macros.aet;
      var handler = function(e){
        var newval = this.value;
        aet.setMetaData(tiddlerobj.title,metaDataName,newval,options.autosavechanges);
      }       
      var selected;
      if(tiddlerobj)selected= tiddlerobj.fields[metaDataName];
console.log(selected,tiddlerobj);
	    var lines = source.split("\n");
	    var radiogroupname = "radiogroup"+Math.random();
	    var radioHtml = "";
	    var currentValue = selected;
	    var selected;
	    for(var i=0; i < lines.length; i++){
	        var val = lines[i];
	        if(val != ""){
  		        var label;
  		        var spl = val.split(":");
  		        if(spl[0] && spl[1]){
  		            label = spl[0];
  		            val = spl[1];
  		        }
  		        else{
  		            label = val;
  		        }
  		        if(val == currentValue){
  		            selected = "checked=true";
  		        }
  		        else{
  		            selected = "";
  		        }
  		        radioHtml += "<input class='aet_radiobutton' "+selected+" type='radio' value=\""+val+"\" name='"+radiogroupname+"'/><label>"+label+"</label>";
	        }
	    }
	    jQuery(place).append("<div class='aet_radioboxes'>"+radioHtml+"</div><div class='clearboth'></div>");
	    jQuery(".aet_radiobutton",place).click(handler);
	
};
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div><span class='title' macro='view title'></span> (excluded from tree)</div>
<div class="tiddlerOrigin" macro="tiddlerOrigin"></div>
<div class="modifier" macro="view modifier SiteIcon width:48 height:48"></div>
<div class='concertina'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>

<div macro='view text wikified'></div>
<div class='tagClear'></div>

<!--}}}-->
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''Author''|Jon Robson|
|''Description''|Provides ability to render SiteIcons and icons that correspond to the home location of given tiddlers|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceTiddlerIconsPlugin.js|
|''Requires''|TiddlySpaceConfig BinaryTiddlersPlugin ImageMacroPlugin TiddlySpacePublishingCommands|
!Notes
Provides an additional SiteIcon view for use with view macro
{{{<<view modifier SiteIcon>>}}}
will show the SiteIcon located in the space with the same name as modifier.
It also works if the attribute given ends with _private or _public (so {{{<<view server.bag SiteIcon>>}}} is usable).

{{{<<tiddlerOrigin>>}}} shows the origin of the tiddler it is being run on.
In TiddlySpace terms this means it will determine whether the tiddler is external, public or private.
Where private it will analyse whether a public version exists and distinguish between the different scenarios.
If a tiddler is external, the SiteIcon of that external space will be shown

When a ViewTemplate contains an element with class concertina, clicking on the icon outputted by the tiddlerOrigin macro
will reveal more detailed information on what the icon means.
!Parameters
both take the same parameters
width / height : define a width or height of the outputted icon
label: if label parameter is set to yes, a label will accompany the icon.

!!additional view parameters
labelPrefix / labelSuffix : prefix or suffix the label with additional text. eg. labelPrefix:'modified by '
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var imageMacro = config.macros.image;
var tiddlyspace = config.extensions.tiddlyspace;
var getStatus = config.extensions.tiddlyweb.getStatus;
var cmd = config.commands.publishTiddler;

config.macros.view.views.SiteIcon = function(value, place, params, wikifier,
		paramString, tiddler) {
	var container = $('<div class="siteIcon" />').prependTo(place);
	var extraArgs = params.splice(2, params.length - 2).join(" ");
	var imageOptions = imageMacro.getArguments(extraArgs, []);
	var imagePlace = $("<div />").appendTo(container)[0];
	var pos;
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(endsWith(value, "_public")) {
		pos = value.indexOf("_public");
		value = value.substr(0, pos);
	} else if(endsWith(value, "_private")) {
		pos = value.indexOf("_private");
		value = value.substr(0, pos);
	}

	var args = paramString.parseParams("name", null, true, false, true)[0];
	var labelPrefix = args.labelPrefix ? args.labelPrefix[0] : "";
	var labelSuffix = args.labelSuffix ? args.labelSuffix[0] : "";
	if(!store.tiddlerExists(tiddler.title) || value == "None") { // some core tiddlers lack modifier
		value = "unknown";
		if(store.tiddlerExists("missingIcon")) {
			imageMacro.renderImage(imagePlace, "missingIcon", imageOptions);
		}
	} else {
		getStatus(function(status) {
			var uri = tiddlyspace.getAvatar(status.server_host, value);
			imageMacro.renderImage(imagePlace, uri, imageOptions);
			if(!value) {
				value = "tiddlyspace";
			}
		});
	}
	$('<div class="label" />').text(labelPrefix + value + labelSuffix).
		appendTo(container);
	$(container).attr("title", value).attr("alt", value);
};

var originMacro = config.macros.tiddlerOrigin = {
	locale: {
		"shadow": "shadow tiddler",
		"missing": "missing tiddler",
		"private": "private",
		"unknown": "unknown state",
		"public": "public",
		"privateAndPublic": "public and private tiddler",
		"privateNotPublic": "private different to public",
		"external": "from %0",
		"missing_info": "This tiddler does not currently exist in the space.\nIt is possible you reached this via a broken link",
		"external_info": "This tiddler was written by %0 in the %1 space. \nIt is visible to all at:\n%2",
		"private_info": "This tiddler is currently private.\n It is visible to only members of this space at:\n%2\n\n",
		"public_info": "This tiddler is currently public with no private revision.\nIt is visible to all at:\n%2",
		"privateAndPublic_info": "This tiddler is currently public without any later private revisions.\nIt is visible to all at:\n%2",
		"privateNotPublic_info": "This tiddler is currently public, with a different private revision. You are currently viewing the private version.\nIt is visible to all at:\n%2\nbut the content will differ depending on permissions.\n\n",
		"shadow_info": "This tiddler is a special tiddler that is part of the TiddlySpace application. It has no uri.",
		"unknownUser": "an unknown user",
		"makePublic": "Make this tiddler public",
		"makePrivate": "Make this tiddler private",
		"deletePrivate": "Delete the private version of this tiddler",
		"deletePublic": "Delete the public version of this tiddler",
		publishPrivateDeletePrivate: "Are you sure you want to publish this tiddler?\nNote that all private versions of this tiddler will be deleted however all public versions will be retained.\n Hit cancel to abort.",
		publishPrivateKeepPrivate: "Are you sure you want to publish this tiddler?\nNote that any existing public versions of this tiddler will be deleted. Hit cancel to abort.",
		retainPrivateRevisions: "Also copy over the private revisions of this tiddler",
		retainPublicRevisions: "Also copy over the public revisions of this tiddler",
		moveToPrivate: "Are you sure you want to make this private? It will no longer be publically available to non-members of the space and you will lose any existing revisions.",
		moveToPrivateKeep: "Are you sure you want to make this tiddler and all its revisions private? It will no longer be publically available to non-members of the space.",
		"publicConfirmDelete": "Are you sure you want to delete all the public revisions of this tiddler?",
		"privateConfirmDelete": "Are you sure you want to delete all the private revisions of this tiddler?",
		pleaseWait: "please wait.."
	},
	handler: function(place, macroName, params,wikifier, paramString, tiddler){
		var adaptor = tiddler.getAdaptor();
		var locale = originMacro.locale;
		var type = "private";
		if(tiddler && tiddler.fields["server.workspace"]) {
			name = tiddler.fields["server.workspace"].replace("recipes/", "").
			replace("bags/", "");
		} else {
			name = tiddler;
		}
		var options = originMacro.getOptions(params, paramString);
		options.space = tiddlyspace.determineSpace(name, true);
		var concertinaContentEl = $("<div />")[0];

		var concertinaButton = originMacro.createConcertinaButton(place, concertinaContentEl);
		type = originMacro.determineTiddlerType(tiddler, options, function(type) {
			originMacro.renderIcon(tiddler, type, concertinaButton,
				concertinaContentEl, options);
		});
	},

	createConcertinaButton: function(place, concertinaContent) {
		var concertinaButton = $('<a class="originButton" href="javascript:;" />').
			click(function(ev) {
				var tidEl = $(story.findContainingTiddler(place));
				var concertina = $(".concertina", tidEl);
				concertina.empty().
					append(concertinaContent);
				if(concertina.attr("openedby") == "origin") {
					tidEl.removeClass("concertinaOn");
					concertina.slideUp(500).attr("openedby", "");
				} else {
					tidEl.addClass("concertinaOn");
					concertina.slideDown(500).
						attr("openedby", "origin");
				}
			}).appendTo(place);
			return concertinaButton[0];
	},
	determineTiddlerType: function(tiddler, options, callback) {
		var isShadow = store.isShadowTiddler(tiddler.title);
		var exists = store.tiddlerExists(tiddler.title);
		if(isShadow && !exists) {
			callback("shadow");
		} else if(!exists) {
			callback("missing");
		} else {
			var space = options.space;
			if(space && space.name == tiddlyspace.currentSpace.name) {
				var parts = tiddler.fields["server.workspace"].split("_"); // TODO: use the split function in TiddlySpaceConfig
				var spaceType = parts[parts.length - 1];
				var type = ["public", "private"].contains(spaceType) ? spaceType : false;
				originMacro.distinguishPublicPrivateType(tiddler, options, type, callback);
			} else {
				callback("external");
			}
		}
	},
	distinguishPublicPrivateType: function(tiddler, options, type, callback) {
		var space = options.space;
		var adaptor = tiddler.getAdaptor();
		var determineType = function(privateTiddler, publicTiddler) {
			if(publicTiddler && !privateTiddler) {
				return "public";
			} else if(privateTiddler && !publicTiddler) {
				return "private";
			} else if(originMacro.areIdentical(privateTiddler, publicTiddler)) {
				return "privateAndPublic";
			} else {
				return "privateNotPublic";
			}
		};
		var context;
		if(type == "private") { //check for a public version
			// is there a public version in store?
			var title = tiddler.title;
			var publicVersion = store.getTiddler("%0 [public]".format([title]));
			if(!publicVersion) {
				context = {
					workspace: "bags/%0_public".format([space.name])
				};
				adaptor.getTiddler(tiddler.title, context, null, function(context) {
					if(context) {
						var publicTiddler = context.status ? context.tiddler : false;
						callback(determineType(tiddler, publicTiddler));
					}
				});
			} else { // we have a public tiddler in the local store.
				callback(determineType(tiddler, publicVersion));
			}
		} else {
			var serverTitle = tiddler.fields["server.title"];
			if(serverTitle && serverTitle != tiddler.title) { // viewing a spawned public tiddler
				callback(determineType(store.getTiddler(serverTitle), tiddler));
			} else {
				context = {
					workspace: "bags/%0_private".format([space.name])
				};
				adaptor.getTiddler(tiddler.title, context, null, function(context) {
					if(context) {
						var privateTiddler = context.status ? context.tiddler : false;
						callback(determineType(privateTiddler, tiddler));
					}
				});
			}
		}
	},
	getOptions: function(params, paramString) {
		var options = {
			labelOptions: originMacro._getLabelOptions(paramString.parseParams("name")),
			imageOptions: imageMacro.getArguments(paramString, [])
		};
		return options;
	},
	_getLabelOptions: function(parsedParams) {
		var parsedParams = parsedParams[0];
		var includeLabel = !parsedParams.label || ( parsedParams.label && parsedParams.label[0] == "yes" );
		return { includeLabel: includeLabel };
	},
	renderIcon: function(tiddler, type, concertinaButton, concertinaContentEl, options) {
		var locale = originMacro.locale;
		if(type != "external") {
			originMacro.showPrivacyRoundel(tiddler, type, concertinaButton,
				concertinaContentEl, options);
		} else {
			var label = locale.external.format([options.space.name || "tiddlyspace"]);
			getStatus(function(status) {
				var uri = tiddlyspace.getAvatar(status.server_host, options.space.name);
				imageMacro.renderImage(concertinaButton, uri, options.imageOptions);
				var labelOptions = options.labelOptions;
				labelOptions.label = label;
				originMacro.showLabel(concertinaButton, type, labelOptions);
				originMacro.fillConcertina(concertinaContentEl, type, tiddler);
			});
		}
	},
	areIdentical: function(tiddler1, tiddler2) {
		var sameText = tiddler1.text == tiddler2.text;
		var sameTags = true;
		var tags1 = tiddler1.tags;
		var tags2 = tiddler2.tags;
		if(tags1.length != tags2.length) {
			sameTags = false;
		} else {
			for(var i = 0; i < tags2.length; i++) {
				if(!tags1.contains(tags2[i])) {
					sameTags = false;
				}
			}
		}
		var fields1 = tiddler1.fields;
		var fields2 = tiddler2.fields;
		var allFields = fields1;
		var field;
		for(field in fields2) {
			if(typeof(allFields[field]) == "undefined") {
				allFields[field] = false;
			}
		}
		var sameFields = true;
		var ignoreList = ["changecount", "doNotSave"];
		for(field in allFields) {
			if(field.indexOf("server.") !== 0 && !ignoreList.contains(field)) { // ignore server fields
				if(!fields2[field]) {
					sameFields = false;
				} else if(fields2[field] != fields1[field]) {
					sameFields = false;
				}
			}
		}
		return sameText && sameTags &&  sameFields;
	},
	showPrivacyRoundel: function(thisTiddler, privacyType, concertinaButton, concertinaContentEl, options) {
		// there is a public tiddler as well as the current tiddler!
		// to do: not this is not enough.. we also need to check if the public tiddler is the same as..
		// .. the private tiddler to determine whether this is a draft
		// use of hashes would be useful here.
		imageMacro.renderImage(concertinaButton, "%0Icon".format([privacyType]), options.imageOptions);
		originMacro.showLabel(concertinaButton, privacyType, options.labelOptions);
		originMacro.fillConcertina(concertinaContentEl, privacyType, thisTiddler);
	},
	showLabel: function(concertinaButton, type, options) {
		var locale = originMacro.locale;

		var tidEl = $(story.findContainingTiddler(concertinaButton));

		label = options.label ? options.label : locale[type];

		tidEl.
			removeClass("private public external privateAndPublic privateNotPublic shadow").
			addClass(type);
		if(options && options.includeLabel) {
			$('<div class="roundelLabel" />').text(label || locale.unknown).appendTo(concertinaButton);
		}
		$(concertinaButton).attr("title", label);
	},
	fillConcertina: function(place, privacyType, tiddler) {
		if(!place) {
			return;
		} else {
			var locale = originMacro.locale;
			var space = tiddlyspace.determineSpace(tiddler);
			space = space.name ? space.name : false;
			getStatus(function(status) {
				var modifier = tiddler.modifier;
				if(modifier == "None") {
					modifier = locale.unknownUser;
				}
				var spaceLink, link;
				var title = tiddler.fields["server.title"] || tiddler.title;
				if(!space) {
					space = "core";
					link = "[[/%0|/%0]]".format([title]);
				} else {
					spaceLink = tiddlyspace.getHost(status.server_host, space);
					space = "[[%0|%1]]".format([space, spaceLink]);
					link = "[[%0/%1|%0/%1]]".format([spaceLink, title]);
				}

				var localeString = locale["%0_info".format([privacyType])];
				if(localeString){
					wikify(localeString.format([modifier, space, link]), place);
				}
				var command = originMacro.concertinaCommands[privacyType];
				if(command && tiddler) {
					command(place, tiddler);
				}
			});
		}
	},
	concertinaCommands: {
		"public": function(place, tiddler) {
			var locale = originMacro.locale;
			var chk = $('<input type="checkbox" checked="true" name="retainPublicRevisions" />');
			var inProgress = false;
			var doPublish = function(ev) {
				if(inProgress) {
					return;
				}
				var checked = chk.attr("checked");
				var msg = checked ? locale.moveToPrivateKeep : locale.moveToPrivate;
				var answer = confirm(msg);
				if(answer) {
					inProgress = true;
					var target = $(ev.target);
					var oldText = target.text();
					target.text(locale.pleaseWait);
					var onComplete = function(info) {
						target.text(oldText);
						inProgress = false;
					};
					var privateBag= cmd.toggleBag(tiddler, "private");
					cmd.moveTiddler(tiddler, {
						title: tiddler.title,
						fields: { "server.bag": privateBag }
					}, chk.attr("checked"), onComplete);
				}
			};
			var toggleCheckbox = function(ev) {
				if (chk.attr("checked")) {
					chk.attr("checked", true);
				} else {
					chk.attr("checked", false);
				}
			};
			var link = $('<a class="publishButton" />').text(locale.makePrivate).
			click(doPublish).appendTo(place);
			chk.appendTo(place);
			$("<span />").click(toggleCheckbox).
				text(locale.retainPublicRevisions).appendTo(place);
		},
		"private": function(place, tiddler) {
			var locale = originMacro.locale;
			var adaptor = tiddler.getAdaptor();
			var chk = $('<input type="checkbox" checked="true" name="retainRevisions" />');
			var toggleCheckbox = function(ev) {
				if (chk.attr("checked")) {
					chk.attr("checked", true);
				} else {
					chk.attr("checked", false);
				}
			};
			var inProgress;
			var doPublish = function(ev) {
				if(inProgress) {
					return;
				}
				var publishTo = tiddler.fields["server.publish.name"];
				var workspace = "bags/%0".format([tiddler.fields["server.bag"]]);
				tiddler.fields["server.workspace"] = workspace;
				var publicBag = cmd.toggleBag(tiddler, "public");
				var msg;
				var checked = chk.attr("checked");
				msg = checked ? locale.publishPrivateKeepPrivate : locale.publishPrivateDeletePrivate;
				var title = tiddler.title;
				var newTitle = publishTo || tiddler.title;
				tiddler.fields["server.page.revision"] = "false";
				store.addTiddler(tiddler);
				var answer = confirm(msg);
				if(answer) {
					inProgress = true;
					var target = $(ev.target);
					var oldText = target.text();
					target.text(locale.pleaseWait);
					var onComplete = function(info) {
						target.text(oldText);
						inProgress = false;
					};
					cmd.moveTiddler(tiddler, {
						title: newTitle,
						fields: { "server.bag": publicBag }
					}, checked, onComplete);
				}
			};
			var link = $('<a class="publishButton" />').text(locale.makePublic).
			click(doPublish).appendTo(place);
			chk.appendTo(place);
			$("<span />").click(toggleCheckbox).
				text(locale.retainPrivateRevisions).appendTo(place);
		},
		privateNotPublic: function(place, tiddler) {
			originMacro.concertinaCommands["private"](place, tiddler);
			originMacro.concertinaCommands.privateAndPublic(place, tiddler);
		},
		privateAndPublic: function(place, tiddler) {
			var locale = originMacro.locale;
			var inProgress;
			var deleteTiddler = function(ev, type) {
				if(inProgress) {
					return;
				}
				type = type ? type.toLowerCase() : "public";
				var bag = cmd.toggleBag(tiddler, type);
				if(confirm(locale["%0ConfirmDelete".format([type])])) {
					inProgress = true;
					var target = $(ev.target);
					var oldText = target.text();
					target.text(locale.pleaseWait);
					var onComplete = function(info) {
						target.text(oldText);
						inProgress = false;
					};
					config.commands.deleteTiddler.deleteResource(tiddler, bag, onComplete);
				}
			};
			var deletePublic = function(ev) {
				deleteTiddler(ev, "public");
			};
			var deletePrivate = function(ev) {
				deleteTiddler(ev, "private");
			};
			$('<a class="publishButton" />').text(locale.deletePublic).
				click(deletePublic).appendTo(place);
			$('<a class="publishButton" />').text(locale.deletePrivate).
				click(deletePrivate).appendTo(place);
		}
	}
};

})(jQuery);
//}}}
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.4|
|''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
!!v0.6 (2010-04-21)
* added notification about cross-domain restrictions to ImportTiddlers
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
(function($) {

readOnly = false; //# enable editing over HTTP

var 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",
	hostError: "Unable to import from this location due to cross-domain restrictions."
};

plugin.sync = function(tiddlers) {
	tiddlers = tiddlers && tiddlers[0] ? tiddlers : store.getTiddlers();
	$.each(tiddlers, function(i, 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 serverTitle = tiddler.fields["server.title"]; // indicates renames
	if(!serverTitle) {
		tiddler.fields["server.title"] = tiddler.title;
	} else if(tiddler.title != serverTitle) {
		return adaptor.moveTiddler({ title: serverTitle },
			{ title: tiddler.title }, context, null, this.saveTiddlerCallback);
	}
	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) {
	var desc = (context && 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(tiddlers);
	}
};

// 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);
	}
};

// hijack ImportTiddlers wizard to handle cross-domain restrictions
var _onOpen = config.macros.importTiddlers.onOpen;
config.macros.importTiddlers.onOpen = function(ev) {
	var btn = $(resolveTarget(ev));
	var url = btn.closest(".wizard").find("input[name=txtPath]").val();
	if(window.location.protocol != "file:" && url.indexOf("://") != -1) {
		var host = url.split("/")[2];
		var macro = config.macros.importTiddlers;
		if(host != window.location.host) {
			btn.text(macro.cancelLabel).attr("title", macro.cancelPrompt);
			btn[0].onclick = macro.onCancel;
			$('<span class="status" />').text(plugin.locale.hostError).insertAfter(btn);
			return false;
		}
	}
	return _onOpen.apply(this, arguments);
};

})(jQuery);
//}}}
/***
|''Name''|DiffFormatter|
|''Description''|highlighting of text comparisons|
|''Author''|FND|
|''Version''|0.9.0|
|''Status''|beta|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/FND/formatters/DiffFormatter.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Keywords''|formatting|
!Description
Highlights changes in a unified [[diff|http://en.wikipedia.org/wiki/Diff#Unified_format]].
!Notes
Based on Martin Budden's [[DiffFormatterPlugin|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/DiffFormatterPlugin.js]].
!Usage
The formatter is applied to blocks wrapped in <html><code>{{{diff{..}}}</code></html> within tiddlers tagged with "diff".
!Revision History
!!v0.9 (2010-04-07)
* initial release; fork of DiffFormatterPlugin
!StyleSheet
.diff { white-space: pre; font-family: monospace; }
.diff ins, .diff del { display: block; text-decoration: none; }
.diff ins { background-color: #dfd; }
.diff del { background-color: #fdd; }
.diff .highlight { background-color: [[ColorPalette::SecondaryPale]]; }
!Code
***/
//{{{
(function() {

config.shadowTiddlers.StyleSheetDiffFormatter = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("StyleSheetDiffFormatter", refreshStyles);

var formatters = [{
		name: "diffWrapper",
		match: "^\\{\\{diff\\{\n", // XXX: suboptimal
		termRegExp: /(.*\}\}\})$/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "div", null, "diff");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRange",
		match: "^(?:@@|[+\\-]{3}) ",
		lookaheadRegExp: /^(?:@@|[+\-]{3}) .*\n/mg,
		handler: function(w) {
			createTiddlyElement(w.output, "div", null, "highlight").
				innerHTML = "&#8230;";
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	}, {
		name: "diffAdded",
		match: "^\\+",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "ins", null, "added");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRemoved",
		match: "^-",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "del", null, "removed");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}
];

config.parsers.diffFormatter = new Formatter(formatters);
config.parsers.diffFormatter.format = "diff";
config.parsers.diffFormatter.formatTag = "diff";

})();
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="364 157 64 51" width="64pt" height="51pt"><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 364.50006 184.50061 L 386.99985 207.00037 L 396 198.00002 L 373.50003 175.50066 Z M 403.02295 181.97704 C 400.38693 179.34099 396.11307 179.34099 393.47702 181.97704 C 390.841 184.61307 390.841 188.88695 393.47702 191.52298 C 396.11307 194.15903 400.38693 194.15903 403.02295 191.52298 C 405.65906 188.88695 405.65906 184.61307 403.02295 181.97704 M 414.27298 170.72704 C 411.63693 168.091 407.36307 168.091 404.72702 170.72704 C 402.091 173.36308 402.091 177.63693 404.72702 180.27296 C 407.36307 182.90901 411.63693 182.90901 414.27298 180.27296 C 416.90903 177.63693 416.90903 173.36308 414.27298 170.72704 M 425.523 159.47705 C 422.88696 156.841 418.6131 156.841 415.97705 159.47705 C 413.341 162.11308 413.341 166.38695 415.97705 169.02295 C 418.6131 171.65903 422.88696 171.65903 425.523 169.02295 C 428.15906 166.38695 428.15906 162.11308 425.523 159.47705" fill="#020202"/></g></g></svg>
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.2|
|''Description''|provides a toolbar command for cloning external tiddlers|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceCloneCommand.js|
|''Requires''|TiddlySpaceConfig|
!Code
***/
//{{{
(function($) {

var cmd = config.commands;
var ns = config.extensions.tiddlyspace;
var fieldStash = {}; // XXX: should not be private!?

cmd.cloneTiddler = {
	text: cmd.editTiddler.text,
	tooltip: "Create a copy of this tiddler in the current space",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		if(!store.tiddlerExists(tiddler.title)) {
			return true;
		}
		var bag = tiddler.fields["server.bag"];
		if(readOnly) {
			return false;
		} else if(ns.coreBags.contains(bag)) {
			return true;
		} else {
			var space = ns.determineSpace(tiddler, false);
			return space && space.name != ns.currentSpace.name;
		}
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			fieldStash[title] = $.extend({}, tiddler.fields);
			tiddler.fields["server.workspace"] = "bags/%0_private".
				format([ns.currentSpace.name]);
			tiddler.fields["server.permissions"] = "read, write, create"; // no delete
			delete tiddler.fields["server.page.revision"];
			// special handling for pseudo-shadow tiddlers
			if(tiddler.fields["server.bag"] == "tiddlyspace") {
				tiddler.tags.remove("excludeLists");
			}
		} else { // ensure workspace is the current space
			var el = story.findContainingTiddler(src);
			el = $(el);
			var fields = el.attr("tiddlyfields");
			if(fields) { // inherited via TiddlyLink
				fields = fields.decodeHashMap();
				fields["server.workspace"] = config.
					defaultCustomFields["server.workspace"];
			} else {
				fields = config.defaultCustomFields;
			}
			fields = String.encodeHashMap(fields);
			el.attr("tiddlyfields", fields);
		}
		cmd.editTiddler.handler.apply(this, arguments);
		return false;
	}
};

cmd.editTiddler.isEnabled = function(tiddler) {
	return !cmd.cloneTiddler.isEnabled.apply(this, arguments);
};

// hijack cancelTiddler to restore original fields
var _cancelHandler = cmd.cancelTiddler.handler;
cmd.cancelTiddler.handler = function(ev, src, title) {
	var tiddler = store.getTiddler(title);
	if(tiddler) {
		tiddler.fields = fieldStash[title] || tiddler.fields;
		delete fieldStash[title];
	}
	return _cancelHandler.apply(this, arguments);
};

// hijack saveTiddler to clear unused fields stash
var _saveHandler = cmd.saveTiddler.handler;
cmd.saveTiddler.handler =  function(ev, src, title) {
	delete fieldStash[title];
	return _saveHandler.apply(this, arguments);
};

})(jQuery);
//}}}
|~ViewToolbar|closeTiddler +editTiddler > cloneTiddler publishTiddlerRevision addFather addMother addSpouse addChild fields permalink|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
<<tabs txtMainTab "Recent" "Recently edited tiddlers" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadows" "Shadowed tiddlers" TabMoreShadowed>>