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
<!--{{{-->
<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>>
<<importTiddlers>>
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
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]]
<!--{{{-->
<div class='header' role='banner' 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' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/*{{{*/
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]];}

.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:0; top:0;}

.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:0 3px 0 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:0; padding-bottom:0;}

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

.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='toolbar' role='navigation' 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>
<!--}}}-->
/*{{{*/
var $ = jQuery;
config.macros.AIMForm = {
	categories: null,
	$activeItem: null,
	parseItemTitleRegex: new RegExp('(\\d\\d) (.*) - (.*)'),
	parseItemTitle: function(item) {
		// item.title is like "04 Young person daily life - Other talents and abilities"
		var regex = config.macros.AIMForm.parseItemTitleRegex,
			matches = regex.exec(item),
			tiddlerTitle = matches ? matches[0] : null,
			number = matches ? matches[1] : null,
			category = matches ? matches[2] : null,
			label = matches ? matches[3] : null,
			itemData = {
				tiddlerTitle: tiddlerTitle,
				number: number,
				category: category,
				label: label
			};
			if(!tiddlerTitle) {
  			return false;
			}
			return itemData;
	},
	loadItems: function(tag) {
		var items = store.getTaggedTiddlers(tag),
			aimIntro = store.getTaggedTiddlers('AIM-intro')[0],
			aimResults = store.getTaggedTiddlers('AIM-results')[0],
			$aimForm = $('#aimForm'),
			$aimMenu = $aimForm.children('ul'),
			htmlToAdd = ['<li class="category"><a href="#">'+aimIntro.title+'</a></li>\n'],
			itemData,
			category,
			categories = config.macros.AIMForm.categories;
		if(!categories) {
			categories = {};
			$.each(items, function(i, item) {
				itemData = config.macros.AIMForm.parseItemTitle(item.title);
				if(!itemData) {
  				return true; // ignore this item
				}
				category = itemData.category;
				if(!categories[category]) {
					categories[category] = [];
				}
				categories[category].push(itemData);
			});
			config.macros.AIMForm.categories = categories;
		}
		$.each(categories, function(category, categoryItems) {
			categoryItems.done = true;
			$.each(categoryItems, function(j, item) {
				if(!item.value) {
					delete categoryItems.done;
				}
			});
		});
		$.each(categories, function(category, categoryItems) {
			var categoryClass = categoryItems.done ? ' class="category done"' : ' class="category"';
			htmlToAdd.push('<li'+categoryClass+'><a href="#">'+category+'</a>\n<ul>');
			$.each(categoryItems, function(i, item) {
				var itemClass = item.value ? (item.isKeyProblem ? ' class="done keyProblem"' : ' class="done"') : "";
				htmlToAdd.push('<li'+itemClass+'><a href="#">'+item.label+'</a></li>');
			});
			htmlToAdd.push('</ul>\n</li>');
		});
		htmlToAdd.push('<li><a href="#">'+aimResults.title+'</a></li>'),
		$aimMenu.html(htmlToAdd.join('\n'));
	},
	displayItem: function(tiddler, item) {
		var heading = item.number+" - "+item.label,
			description = store.getTiddlerText(tiddler.title+"##description"),
			breakdown = store.getTiddlerText(tiddler.title+"##breakdown"),
			bits = breakdown.split("<br>\n"),
			bitsRegex = new RegExp(/(\d\+?)/),
			content = wikifyStatic('!'+heading+"\n",null,tiddler) +
				"<p>" + wikifyStatic(description,null,tiddler) + 
				"</p>\n",
			breakdownPieces = [],
			existingValue = item.value,
			isKeyProblem = item.isKeyProblem,
			$item;
		// add key problem checkbox
		breakdownPieces.push('<div class="choice">\n' +
			'<input type="checkbox" value="yes" name="key_problem" class="choice" id="key_problem" />\n' +
			'<label id="key_problem_label" for="key_problem"><strong>Is this a key problem?</strong></label>\n' +
			'</div>');
		$.each(bits, function(i, bit) {
			var matches = bitsRegex.exec(bit),
				value = matches && matches[1];
			if(value) {
				breakdownPieces.push('<div class="choice">\n' +
					'<input type="radio" value="'+value+'" name="question" class="choice" id="'+value+'" />\n' +
					'<label for="'+value+'">'+wikifyStatic(bit,null,tiddler)+'</label>\n' +
					'</div>');
			}
		});
		content += breakdownPieces.join('\n');
		$item = $('#aimForm div.question div.item');
		$item.find('div.error').remove();
		$item.html(content);
		if(existingValue) {
			$item.find('input[value="'+existingValue+'"]').attr('checked','checked');
		}
		if(isKeyProblem) {
			$item.find('input[type=checkbox]').attr('checked','checked');
		}
		$item.find('input[type=checkbox]').change(function(e) {
			var plugin = config.macros.AIMForm,
				keyProblemCount = plugin.keyProblemCount || 0,
				$choiceBox = $(this).parent();
			$choiceBox.prev('div.error').remove();
			if(!$('#aimForm').find('div.item input[type=radio]:checked').length) {
				$('<div class="error">Please choose an option first</div>').insertBefore($choiceBox);
				this.checked = false;
				return true; // don't pay attention if there is no item selected
			}
			if(this.checked) {
				if(keyProblemCount>=6) { // this allows six to be selected
					$('<div class="error">'+store.getRecursiveTiddlerText('AIMFormKeyProblemErrorMessage', 'too many key problems selected', 0)+'</div>').insertBefore($choiceBox);
					this.checked = false;
				} else {
					plugin.keyProblemCount = ++keyProblemCount;
					// make the item active
					config.macros.AIMForm.$activeItem.addClass("keyProblem");
				}
			} else {
				plugin.keyProblemCount = --keyProblemCount;
				// make the item inactive
				config.macros.AIMForm.$activeItem.removeClass("keyProblem");
			}
		});
	},
	closeItem: function($activeItem) {
		if(!$activeItem || $activeItem.hasClass('category')) {
			return false;
		}
		var $openItem = $('#aimForm').find('div.item'),
			$selected = $openItem.find('input[type=radio]:checked'),
			value = $selected.val(),
			isKeyProblem = !!$openItem.find('input[type=checkbox]:checked').length,
			$uncheckedItems,
			item = config.macros.AIMForm.getItemFromElement($activeItem);
		if(value && item) {
			$activeItem.addClass("done");
			$uncheckedItems = $activeItem.siblings().filter(function() {
				return !$(this).hasClass("done");
			});
			if($uncheckedItems.length===0) {
				$activeItem.parent().parent().addClass("done");
			}
			item.value = value;
			item.isKeyProblem = isKeyProblem;
			// setOption("AIM_"+item.tiddlerTitle,value); - Do this if I want to save between sessions in cookies
		}
	},
	getItemFromElement: function($item) {
		var categories = config.macros.AIMForm.categories,
			category = $item.parent().parent().children('a').text(),
			items = categories[category],
			label = $item.children('a').text(),
			matchingItem;
		if(items) {		
			$.each(items, function(i, item) {
				if(item.label===label) {
					matchingItem = item;
					return false;
				}
			});
		}
		return matchingItem;
	},
	getAllItems: function() {
		var items = {};
		$.each(config.macros.AIMForm.categories, function(i, category) {
			$.each(category, function(j, item) {
				items[item.tiddlerTitle] = item;
			});
		});
		return items;
	},
	addBehaviour: function() {
		var $container = $('#aimForm'),
			$navArrows = $container.find('.navigation').find('a'),
			$categories = $container.children('ul').children('li'),
			$items = $categories.children('ul').children('li'),
			plugin = config.macros.AIMForm,
			$itemHolder = $container.find('div.question'),
			clickedPrev,
			openAimItem = function($item) {
				var item = config.macros.AIMForm.getItemFromElement($item),
					tiddler = store.getTiddler(item.tiddlerTitle);
				config.macros.AIMForm.displayItem(tiddler,item);
			},
			findToOpen = function(selector) {
				var move = $(selector).hasClass('next') ? 'next' : 'prev',
					$toOpen = plugin.$activeItem[move](),
					$newCategory;
				if($toOpen.length) {
					return $toOpen;
				} else {
					if(plugin.$activeItem.hasClass('category')) {
						$newCategory = plugin.$activeItem[move]();
					} else {
						$newCategory = plugin.$activeItem.parent().parent()[move](); // assumes a li inside a ul inside a li
					}
					if($newCategory.length) {
						return $newCategory;
					}
				}
			},
			toggleNavArrows = function() {
				$navArrows.each(function(i, arrow) {
					if(!findToOpen(arrow)) {
						$(arrow).css('visibility','hidden');
					} else {
						$(arrow).css('visibility','visible');
					}
				});
			};
	
		$navArrows.click(function() {
			if(!plugin.$activeItem) {
				return false;
			}
			var $toOpen = findToOpen(this);
			if($toOpen.length) {
				$toOpen.click();
			}
			return false;
		});
	
		$categories.click(function(e) {
			var openLast = false,
				$items = $(this).children('ul').children('li'),
				clickIndex = openLast ? $items.length-1 : 0,
				title,
				tiddler,
				content,
				$nextButton,
				$place = $('#aimForm div.question div.item');
			if($items.length) {
				$(this)
					.addClass('active')
					.children('ul')
					.show()
					.end()
					.siblings()
					.removeClass('active')
					.children('ul')
					.hide();
				$items.eq(clickIndex).click();
			} else {
				// it has no children, so it's probably the intro or results
				config.macros.AIMForm.closeItem(plugin.$activeItem);
				title = $(this).find('a').text();
				tiddler = store.getTiddler(title);
				plugin.$activeItem = $(this).addClass('active');
				plugin.$activeItem
					.siblings()
					.removeClass('active');
				/*content = wikifyStatic('!~'+tiddler.title+"\n",null,tiddler) +
					"<p>" + wikifyStatic(tiddler.text,null,tiddler) + 
					"</p>\n";*/
				//$('#aimForm div.question div.item').html(content);
				wikify('!~'+tiddler.title+"\n",$place.empty().get(0));
				wikify(tiddler.text, $place.get(0));
				/*if($('#aimForm input[option]').length) {
					$('#aimForm input[option]').change(function(e) {
						config.macros.option.genericOnChange.apply(this,arguments);
					});
				}*/
				toggleNavArrows();
			}
			return false;
		});
		
		$items.click(function(e) {
			config.macros.AIMForm.closeItem(plugin.$activeItem);
			plugin.$activeItem = $(this).addClass('active');
			plugin.$activeItem
				.siblings()
				.removeClass('active');
			openAimItem(plugin.$activeItem);
			toggleNavArrows();
			return false;
		});
		$categories.eq(0).click();
	},
	handler: function(place,macroName,params) {
		var template = params[0],
			tag = params[1];
		$(place).append(store.getTiddler(template).text);
		config.macros.AIMForm.loadItems(tag);
		config.macros.AIMForm.addBehaviour();
	}
};


/* Add a custom type of option that doesn't store a cookie */
config.macros.option.privateOnChange = function(e) {
	// based on config.macros.option.genericOnChange
	var opt = this.getAttribute('option');
	if(opt) {
		var optType = opt.substr(0,3);
		var handler = config.macros.option.types[optType];
		if(handler.elementType && handler.valueField)
			config.macros.option.propagateOptionPrivate(opt,handler.valueField,this[handler.valueField],handler.elementType,this);
	}
	return true;
};
config.macros.option.propagateOptionPrivate = function(opt,valueField,value,elementType,elem) {
	// based on config.macros.option.propagateOption
	config.options[opt] = value;
	// saveOption(opt); // don't do this in this function!
	var t,nodes = document.getElementsByTagName(elementType);
	for(t=0; t<nodes.length; t++) {
		var optNode = nodes[t].getAttribute('option');
		if(opt == optNode && nodes[t]!=elem)
			nodes[t][valueField] = value;
	}
};
config.macros.option.types.pri = {
	elementType: 'input',
	valueField: 'value',
	eventName: 'onchange',
	className: 'txtOptionInput',
	create: config.macros.option.genericCreate,
	onChange: config.macros.option.privateOnChange
};
/*}}}*/
<!--{{{-->
<div id="aimForm">
	<div class="navigation left">
		<a class="previous button">Prev<span></span></a>
		<a class="next button">Next<span></span></a>
	</div>
	<ul class="AIMmenu">
	</ul>
	<div class="question">
		<div class="item"></div>
		<div class="navigation">
			<a class="next button">Next<span></span></a>
		</div>
	</div>
</div>
<!--}}}-->
/*{{{*/
config.macros.AMBITFormatterChanges = {

	init: function() {
		for(var i=0;i<formatter.formatters.length;i++)
		{
			if(formatter.formatters[i].name=="heading") //(say)
			{
				formatter.formatters[i].handler = function(w) {
					var headingCount = w.matchLength + 2;
					if(headingCount > 6) {
						headingCount = 6;
					}
					w.subWikifyTerm(createTiddlyElement(w.output,"h" + headingCount),this.termRegExp);
				};
			} else if(formatter.formatters[i].name=="table") {
				formatter.formatters[i]._handler = formatter.formatters[i].handler;
				formatter.formatters[i].handler = function(w) {
					var _output = w.output;
					w.output = createTiddlyElement(w.output, "div", null, "tableContainer");
					this._handler.apply(this,arguments);
					w.output = _output;
				};
			}
		}
	}
};
/*}}}*/
/*{{{*/
config.macros.AMBITFormatterChanges = {

	init: function() {
		for(var i=0;i<formatter.formatters.length;i++)
		{
			if(formatter.formatters[i].name=="heading") //(say)
			{
				formatter.formatters[i].handler = function(w) {
					var headingCount = w.matchLength + 2;
					if(headingCount > 6) {
						headingCount = 6;
					}
					w.subWikifyTerm(createTiddlyElement(w.output,"h" + headingCount),this.termRegExp);
				};
			} else if(formatter.formatters[i].name=="table") {
				formatter.formatters[i]._handler = formatter.formatters[i].handler;
				formatter.formatters[i].handler = function(w) {
					var _output = w.output;
					w.output = createTiddlyElement(w.output, "div", null, "tableContainer");
					this._handler.apply(this,arguments);
					w.output = _output;
				};
			}
		}
	}
};
/*}}}*/
[[Replies and Notifications]]

<<activity>>
/***
|''Name''|ActivityStreamPlugin|
|''Version''|0.5.4|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceFollowingPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Source''|https://github.com/jdlrobson/TiddlyWiki/raw/master/plugins/TiddlySpaceInstaller/ActivityStreamPlugin.js|
!Usage
{{{<<activity>>}}}
!!Supressing activity
You can supress notifications by  id:
"plugin", "shadow", "standard", "follow", "followYou", "siteInfo", "siteIcon", "ownSiteIcon", "notify", "reply"
e.g. {{{ <<activity supress:siteIcon>> }}} will hide siteIcon activity from you.

!!Supressing people
{{{<<activity ignore:person}}} will ignore all activity where person is the subject of the activity. eg. person followed other-person will not appear in the feed.
!!Controlling displayed dates.
{{{<<activity timestampFormat:"<0hh o' clock>" headingFormat:"0DD/0MM" >>}}} will display date headings as date/month eg.
3rd of January would be displayed as 03/01. This particular timestamp example gives you the hour of the activity.

!!Even more content
{{{<<activity limit:no>>}}} will show you all possible activity in the last X days where X is set at a macro level (advanced developers should see config.macros.activity.RECENTNESS).
!StyleSheet

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

.feedItem .siteIcon {
	display: inline;
}

.activityStream .error {
	background-color: red;
	color: white;
	font-weight: bold;
}

.activityStream .feedItem {
list-style: none;
}

.activityStream .notification {
	background-color: yellow;
	color: black;
}

.activityStream .activityGroupTitle {
	font-weight: bold;
	margin-top: 8px;
}
.activityStream .feedItem {
	margin-left: 8px;
}
!Code
***/
//{{{
(function($) {
var name = "StyleSheetActivityStream";
config.shadowTiddlers[name] = store.getTiddlerText(tiddler.title +
     "##StyleSheet");
store.addNotification(name, refreshStyles);

var followMacro = config.macros.followTiddlers;
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var scanMacro = config.macros.tsScan;

var modifierSpaceLink = "<<view modifier spaceLink>>";
var spaceTiddlyLink = "<<view server.bag spaceLink server.title>>";
var bagSpaceLink = "<<view server.bag spaceLink>>";
var bagSiteIcon = "<<view server.bag SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>";
var modifierSiteIcon = "<<view modifier SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>";
var timestamp = "[<<view modified date '0hh:0mm'>>]";
var replyLink = "<<view server.title replyLink>>";
config.shadowTiddlers.ActivityStreamTemplates = [
	"!notify\n%3 {{notification{%0 %1 has modified %2 in %0 %1 and flagged it for your attention!}}} %8\n",
	"!reply\n%3 {{notification{%0 %1 replied with %2 to your %4 %5 post.}}} %8\n",
	"!userSiteIcon\n%3 %6 %7 has a new ~SiteIcon.\n",
	"!spaceSiteIcon\n%3 %6 %7 updated the SiteIcon for the %0 %1 space.\n",
	"!image\n%3 %6 %7 drew the image %2 in the %1 space.\n",
	"!plugin\n%3 %6 %7 modified a plugin called %2 in the %0 %1 space.\n",
	"!shadow\n%3 %6 %7 modified a shadow tiddler %2 in the %0 %1 space.\n",
	"!geo\n%3 %6 %7 modified a geo tiddler called %2 in the %0 %1 space <<view title maplink 'view on map'>>. %8\n",
	"!followYou\n%3 %0 %1 is now following you.\n",
	"!follow\n%3 %0 %1 is now following %4 %5 <<view server.title link follow>>\n",
	"!siteInfo\n%3 %6 %7 <<view server.bag spaceLink server.title label:described>> the %0 %1 space.\n",
	"!video\n%3 %6 %7 modified a video entitled %2 in the %0 %1 space. %8\n",
	"!standard\n%3 %6 %7 modified %2 in the %0 %1 space. %8\n"
	].join("").format(bagSiteIcon, bagSpaceLink, spaceTiddlyLink, timestamp,
		"<<view server.title SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>", "<<view server.title spaceLink>>",
		modifierSiteIcon, modifierSpaceLink, replyLink);
story.refreshTiddler("ActivityStreamTemplates", null, true);
config.annotations.ActivityStreamTemplates = "This is a special tiddler used by the ActivityStreamPlugin. It is used for templating notifications. Templates at the top have preference over templates at the bottom.";

var macro = config.macros.activity = {
	default_limit: 50,
	templates: [],
	init: function() {
		var templates = [];
		var regex = new RegExp(/^!(.*)\n/gm);
		var text = store.getTiddlerText("ActivityStreamTemplates");
		var match = regex.exec(text);
		while(match) {
			templates.push(match[1]);
			match = regex.exec(text);
		}
		macro.templates = templates;
	},
	// order matters - earlier templates override older ones
	RECENTNESS: 2, // in days
	TIMESTAMP_FORMAT: "<0hh:0mm>",
	info: {},
	locale: {
		pleaseWait: "please wait while we load your stream...",
		errorLoading: "The activity stream failed to load. Please make sure you have an internet connection and try again.",
		userHeading: "Below is the activity stream for spaces that this space follows with the follow tag. (%0/%1 spaces have been loaded)",
		emptyStream: "Activity stream currently empty. (%0/%1 loaded)"
	},
	getTimeStamp: function() {
		var today = new Date();
		macro._lastRun = today.getTime();
		var previous = new Date(today.setDate(today.getDate() - macro.RECENTNESS));
		return previous.convertToYYYYMMDDHHMM();
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").text(macro.locale.pleaseWait).appendTo(place).
			attr("refresh", "macro").attr("macroName", macroName).attr("paramString", paramString);
		var space = tiddlyspace.currentSpace.name;
		var options = macro.getOptions(paramString);
		$(container).attr("activity-limit", options.limit);
		macro._session = Math.random();
		var activityType;
		var sourceActivity = function(user) {
			macro.CURRENT_USER = user.name;
			macro.USER_AT_TAG = "@%0".format(user.name);
			followMacro.getFollowers(function(users) {
				macro.getActivity(container, users, activityType, options);
			}, macro.CURRENT_USER);
			container.attr("activity-type", activityType);
			macro._renderStream(container, activityType, options);
		};

		if(options.user) {
			sourceActivity({name: options.user});
		} else {
			sourceActivity({ name: tiddlyspace.currentSpace.name });
		}
	},
	getOptions: function(paramString) {
		var options = {};
		var args = paramString.parseParams("name")[0];
		var toMap = ["timestampFormat", "headingFormat", "limit", "user"];
		var i;
		for(i = 0; i < toMap.length; i++) {
			var map = toMap[i];
			options[map] = args[map] ? args[map][0] : false;
		}
		var supress = args.supress || [];
		var templates = [];
		var show = args.show ? args.show : macro.templates;
		for(i = 0; i < show.length; i++) {
			var template = show[i];
			if(supress.indexOf(template) === -1) {
				templates.push(template);
			}
		}
		options.ignore = args.ignore || [];
		options.templates = templates;
		return options;
	},
	_getActivityQuery: function(user, timestamp) {
		timestamp = timestamp || macro.getTimeStamp();
		if(user) {
			return "/bags/%0_public/tiddlers?select=modified:>%1".format(user, timestamp);
		} else {
			return false;
		}
	},
	refresh: function(container) {
		var type = $(container).attr("activity-type");
		var limit = $(container).attr("activity-limit");
		var options = macro.getOptions($(container).attr("paramString"));
		options.limit = parseInt(limit, 10);
		macro.renderStream(container, type, options);
	},
	getActivity: function(place, users, type, options) {
		var i;
		var timestamp = macro.activityTimestamp;
		var firstRun =  timestamp ? false : true;
		macro.info.loaded = firstRun ? 0 : macro.info.loaded;
		var afterAjax = function(tiddlers) {
			if(firstRun) {
				macro.info.loaded += 1;
			}
			macro.updateStream(tiddlers, type, options);
			macro.renderStream(place, type, options);
		};
		var success = function(tiddlers) {
			afterAjax(tiddlers);
		};
		var error = function() {
			afterAjax([]);
		};
		if(macro._lastRun > new Date().getTime() - 300000) { // leave 5 minutes between calls
			afterAjax([]);
			return;
		}
		macro.info.queries = users.length;
		for(i = 0; i < users.length; i++) {
			var user = users[i];
			ajaxReq({
				url: macro._getActivityQuery(user, timestamp),
				dataType: "json", success: success, error: error
			});
		}
		macro.activityTimestamp = new Date().convertToYYYYMMDDHHMM();
	},
	reportError: function(place) {
		var error = $("<div />").addClass("error").text(locale.errorLoading);
		$(place).empty().append(error);
	},
	createFeedEntry: function(container, tiddler, options) {
		var item = $("<li />").addClass("feedItem");
		var content = $("<div />").appendTo(item);
		var wikifyPlace = $("<span />").appendTo(content)[0];
		var author = tiddler.modifier;
		if(author && !options.ignore.contains(author)) {
			$(container).append(item);
			config.macros.view.views.activityItem(null, wikifyPlace, null, null, null, tiddler);
			return item;
		}
		return false;
	},
	renderStream: function(place, type, options) {
		window.clearTimeout(macro._renderTimeout);
		macro._renderTimeout = window.setTimeout(function() {
			macro._renderStream(place, type, options);
		}, 100);
	},
	_renderStream: function(place, type, options) {
		$(place).empty();
		var limit = options.limit;
		var container = $("<ul />").addClass("activityStream").appendTo(place);
		var textHeading = macro.locale.userHeading.format(macro.info.loaded, macro.info.queries);
		$("<li />").addClass("listTitle").text(textHeading).appendTo(container);
		var tiddlers = store.sortTiddlers(store.filterTiddlers("[server.activity[true]]"), "-modified"); // TODO: sort headings instead if possible (conflicts with limit)
		var headings = [];
		var groups = {};
		var processed = 0, i, j;
		var atEndOfActivityFeed = true;
		for(i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			if(options.templates.contains(tiddler.fields["server.activity.type"])) {
				if(!limit || processed < limit) {
					var modified = tiddler.modified;
					if(modified) {
						// format date.
						var modifiedString = modified.formatString(options.headingFormat || config.macros.timeline.dateFormat);
						if(headings.contains(modifiedString)) {
							groups[modifiedString].push(tiddler);
						} else {
							headings.push(modifiedString);
							groups[modifiedString] = [ tiddler ];
						}
					}
					processed += 1;
				} else {
					atEndOfActivityFeed = false;
				}
			}
		}
		var somethingRendered;
		for(i = 0; i < headings.length; i++) {
			var heading = headings[i];
			var _tiddlers = store.sortTiddlers(groups[heading], "-modified");
			var headingEl;
			if(_tiddlers.length > 0) {
				headingEl = $("<li />").addClass("listTitle activityGroupTitle").text(heading).appendTo(container);
			}
			var rendered = [];
			for(j = 0; j < _tiddlers.length; j++) {
				var item = macro.createFeedEntry(container, _tiddlers[j], options);
				if(item) {
					rendered.push(item);
				}
			}
			if(rendered.length === 0) {
				headingEl.remove();
			} else {
				somethingRendered = true;
			}
		}
		if(!somethingRendered) {
			var msg;
			if(macro.gotActivity) { // it has been run before
				msg = macro.locale.emptyStream.format(macro.info.loaded, macro.info.queries);
			} else {
				msg = macro.locale.pleaseWait;
			}
			$(container).text(msg);
		}
		if(!atEndOfActivityFeed) { // show more button
			$("<input />").attr("type", "button").val("more").click(function(ev) {
				var currentLimit = $(place).attr("activity-limit");
				var newLimit = parseInt(currentLimit, 10) + 50;
				macro.default_limit = newLimit;
				$(place).attr("activity-limit", newLimit);
				macro.refresh(place);
			}).appendTo(place);
		}
		this.gotActivity = true;
	},
	updateStream: function(jstiddlers, type, options) {
		// assume already sorted.
		var tiddlers = scanMacro._tiddlerfy(jstiddlers, options);
		var _dirty = store.isDirty();
		$.each(tiddlers, function(i, tid) {
			var info = config.macros.view.activity.getActivityInfo(tid, options);
			tid.fields["server.activity.type"] = info.type;
			tid.fields["server.activity"] = "true";
			if(!tid.tags.contains("excludeLists")) {
				tid.title = tiddlyspace.getLocalTitle(tid.title, tid.fields["server.workspace"]);
				tid.tags = tid.tags.concat(["excludeLists", "excludeMissing", "excludeSearch"]);
				tid.fields.doNotSave = "true";
				store.addTiddler(tid); // save caused unsaved changes alert and slowdown
			}
		});
		store.setDirty(_dirty);
	}
};

config.macros.view.views.activityItem = function(value, place, params, wikifier,
	paramString, tiddler) {
	var info = config.macros.view.activity.getActivityInfo(tiddler, {});
	wikify(info.template, place, null, tiddler);
};

var helper = config.macros.view.activity = {
	_isNotification: function(tiddler) {
		return tiddler.tags.contains(macro.USER_AT_TAG) || tiddler.tags.contains("@all");
	},
	_repliesOn: function() {
		return tiddlyspace.currentSpace.name === macro.CURRENT_USER;
	},
	types: {
		video: function(tiddler) {
			return tiddler.tags.contains("video");
		},
		geo: function(tiddler) {
			return tiddler.fields["geo.lat"] && tiddler.fields["geo.long"];
		},
		siteInfo: function(tiddler) {
			var title = tiddler.fields["server.title"];
			return title === "SiteInfo";
		},
		userSiteIcon: function(tiddler) {
			var modifierBag = "%0_public".format(tiddler.modifier);
			var title = tiddler.fields["server.title"];
			return title === "SiteIcon" && modifierBag === tiddler.fields["server.bag"];
		},
		spaceSiteIcon: function(tiddler) {
			var title = tiddler.fields["server.title"];
			return title === "SiteIcon"; // note userSiteIcon above does the bag check
		},
		shadow: function(tiddler) {
			var title = tiddler.fields["server.title"];
			return title in config.shadowTiddlers;
		},
		plugin: function(tiddler) {
			return tiddler.tags.contains("systemConfig");
		},
		followYou: function(tiddler) {
			var title = tiddler.fields["server.title"];
			title = title.indexOf("@") === 0 ? title.substr(1) : title;
			return tiddler.tags.contains("follow") && title === macro.USER_AT_TAG;
		},
		follow: function(tiddler) {
			return tiddler.tags.contains("follow");
		},
		reply: function(tiddler) {
			var title = tiddler.fields["server.title"];
			var myTiddler = store.getTiddler(tiddler.title);
			var myTiddlerIsOlder = myTiddler && myTiddler.modified < tiddler.modified;
			return store.tiddlerExists(title) && myTiddlerIsOlder && helper._repliesOn(tiddler);
		},
		notify: function(tiddler) {
			var title = tiddler.fields["server.title"];
			var myTiddler = store.getTiddler(title);
			var myTiddlerIsNewer = myTiddler && myTiddler.modified > tiddler.modified;
			return helper._isNotification(tiddler) && helper._repliesOn(tiddler) && !myTiddlerIsNewer;
		},
		standard: function(tiddler) {
			return true;
		},
		image: function(tiddler) {
			return config.macros.image.isImageTiddler(tiddler);
		}
	},
	// each type should point to a slice in ActivityStreamTemplates tiddler
	getActivityInfo: function(tiddler, options) {
		var repliesOn = tiddlyspace.currentSpace.name === macro.CURRENT_USER;
		var activityType, i;
		if(tiddler) {
			for(i = 0; i < macro.templates.length; i++) {
				var type = macro.templates[i];
				if(!activityType && helper.types[type]) {
					if(helper.types[type](tiddler)) {
						activityType = type;
					}
				}
			}
		}
		template = store.getTiddlerText("ActivityStreamTemplates##" + activityType) || locale.standardTemplate;
		return activityType ? { template: template, type: activityType } : false;
	}
};

config.macros.view.views.link = function(value, place, params, wikifier,
		paramString, tiddler) {
		var el = createTiddlyLink(place,value,true);
		if(params[2]) {
			$(el).text(params[2]);
		}
};

config.macros.view.views.maplink = function(value, place, params, wikifier,
		paramString, tiddler) {
		var lat = tiddler.fields["geo.lat"];
		var lng = tiddler.fields["geo.long"];
		var label  = params[2] || value;
		if(lat && lng) {
			$("<a />").attr("href", "http://maps.google.com/maps?saddr=%0,%1".format(lat, lng)).text(label).appendTo(place);
		}
};

var _displayS = tiddlyspace.displayServerTiddler;
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var localTiddler = store.getTiddler(localTitle);

	var _callback = function(src, tiddler) {
		if(callback) {
			callback(src, tiddler);
		}
		if(localTiddler) {
			tiddler.fields["server.activity"] = "true";
			tiddler.fields["server.activity.type"] = localTiddler.fields["server.activity.type"];
		}
	};
	return _displayS.apply(this, [ src, title, workspace, _callback ]);
};
}(jQuery));
//}}}
/*{{{*/
config.macros.footerSlider = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var $ = jQuery,
			$sliderButton = $('<a class="slider button" title="Show or hide related information for this tiddler">show/hide related information</a>').appendTo(place),
			$topicsContainer = $("<div></div>")
				.appendTo(place)
				.css('display', 'none'),
			topicsElem = $topicsContainer.get(0);
		$sliderButton.click(function() {
			$topicsContainer.slideToggle();
		});
		config.macros.ambitTags.handler(topicsElem,"ambitTags",params,wikifier,paramString,tiddler);
		$topicsContainer.append("<br />");
		config.macros.ambitTagging.handler(topicsElem,"ambitTags",params,wikifier,paramString,tiddler);
		$topicsContainer.append("<br />");
	}
};

// based on tags macro
config.macros.ambitTags = {};
config.macros.ambitTags.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	params = paramString.parseParams("anon",null,true,false,false);
	var ul = createTiddlyElement(place,"ul");
	var title = getParam(params,"anon","");
	if(title && store.tiddlerExists(title))
		tiddler = store.getTiddler(title);
	var sep = getParam(params,"sep"," ");
	var lingo = config.views.wikified.tag;
	if(tiddler.tags.length===0) {
		createTiddlyElement(ul,"li",null,null,"no topic");
	}
	for(var t=0; t<tiddler.tags.length; t++) {
		var tag = store.getTiddler(tiddler.tags[t]);
		if(!tag || !tag.tags.contains("excludeLists")) {
			createTagButton(createTiddlyElement(ul,"li"),tiddler.tags[t],tiddler.title);
			if(t<tiddler.tags.length-1)
				createTiddlyText(ul,sep);
		}
	}
};

// based on tagging macro
config.macros.ambitTagging = {};
config.macros.ambitTagging.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	params = paramString.parseParams("anon",null,true,false,false);
	var ul = createTiddlyElement(place,"ul");
	var title = getParam(params,"anon","");
	if(title == "" && tiddler instanceof Tiddler)
		title = tiddler.title;
	var sep = getParam(params,"sep"," ");
	ul.setAttribute("title",config.macros.tagging.tooltip.format([title]));
	var tagged = store.getTaggedTiddlers(title);
	if(tagged.length===0) {
		createTiddlyElement(ul,"li",null,"listTitle","no topics");
	} else {
		for(var t=0; t<tagged.length; t++) {
			if(!tagged[t].tags || !tagged[t].tags.contains("excludeLists")) {
				createTiddlyLink(createTiddlyElement(ul,"li"),tagged[t].title,true);
				if(t<tagged.length-1)
					createTiddlyText(ul,sep);
			}
		}
	}
};

// newHere plugin - http://mptw.tiddlyspot.com/#NewHerePlugin
config.macros.newHere = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		$(place).attr({
			refresh: 'macro',
			macroName: 'newHere'
		}).data('args', arguments);
		wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
	},
	refresh: function(place, params) {
		var args = $(place).empty().data('args');
		this.handler.apply(this, args);
	}
};

config.macros.ambitRevisions = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		config.macros.toolbar.createCommand(place,"revisions",tiddler);
	}
};

config.macros.ambitReferences = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		config.macros.toolbar.createCommand(place,"references",tiddler);
	}
};

(function($) {
	$(document).bind('startup', function() {
		$('.panelToggle').live('click', function() {
			$(this)
				.toggleClass('open')
				.closest('.headingPanel')
				.find('.infoPanel')
				.slideToggle();
			return false;
		});
	});
}(jQuery))


config.macros.ambitElsewhere = {
	searchURL: '/search.json?q=title:"%0"',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var url = config.macros.ambitElsewhere.searchURL.format(encodeURIComponent(tiddler.title)),
			$ = jQuery,
			whitelist = store.getTiddler('AMBIT community of practice - members').text.split('\n'),
			bagFilters = [];
		$.each(whitelist, function(i, line) {
			var pieces = line.split(':'),
				space = pieces[0];
			bagFilters.push("bag:"+space+"_public");
		});
		url += "%20("+bagFilters.join(" OR ")+")";
		
		$.ajax({
			url: url,
			dataType: "json",
			success: function(tiddlers) {
				tiddlers = $.grep(tiddlers, function(t, i) {
					return t.bag.indexOf('ambit')!==-1 && t.bag!==tiddler.fields['server.bag'];
				});
				var count = tiddlers.length;
				$(place).prepend(count);
				if(count) {
					config.macros.ambitElsewhere.wrapWithElsewhereLink(place, tiddlers, tiddler);
				}
			},
			error: function() {
				$(place).prepend('(error)');
			}
		});
	},
	wrapWithElsewhereLink: function(place, tiddlers, tiddler) {
		var $ = jQuery;
		var $place = $(place)
			.wrap("<a></a>")
			.parent().click(function() {
				var popup = Popup.create(this),
					$ul,
					bag,
					space,
					diffURL = "diff?rev1=bags/"+tiddler.fields['server.bag']+"/"+encodeURIComponent(tiddler.title)+"/"+tiddler.fields['server.page.revision']+"&rev2=bags/<bag>/"+encodeURIComponent(tiddler.title)+"/<revision>&format=horizontal";
				if(popup) {
					$popup = $(popup);
					$.each(tiddlers, function(i, t) {
						bag = t.bag;
						space = bag.substring(0, bag.lastIndexOf('_'));
						$popup.append('<li><a href="'+diffURL.replace("<bag>",bag).replace("<revision>",t.revision)+'" target="_blank">'+space+'</li>');
					});
				}
				Popup.show();
				return false;
			});
	}
};

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

// settings
config.options.chkBackstage = false;
readOnly = true;

config.extensions.ambitLoader = {
	dispatch: function() {
		// go get the content of app.js and eval them
		var text = store.getTiddlerText('app.js');
		eval(text);
	}
};

jQuery(document).bind("startup", config.extensions.ambitLoader.dispatch);
/*}}}*/
/***
|''Name''|AmbitSearchPlugin|
|''Description''|based on SimpleSearchPlugin by FND|
|''Authors''|Jonathan Lister|
|''Version''|0.1|
|''Status''|stable|
|''Source''|http://ambit-plugins.tiddlyspace.com/AmbitSearchPlugin|
|''License''|[[MIT|http://www.opensource.org/licenses/mit-license.php]]|
|''Keywords''|search|

Note: this does not add styles - there are sample styles in http://ambit-theme.tiddlyspace.com/Stylesheet

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

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

var $ = jQuery;

config.extensions.AmbitSearchPlugin = {
	heading: "Search Results",
	containerId: "searchResults",
	btnCloseLabel: "close",
	btnCloseTooltip: "dismiss search results",
	btnCloseId: "search_close",
	btnOpenLabel: "Open all",
	btnOpenTooltip: "open all search results",
	btnOpenId: "search_open",

	displayElsewhereResults: function(tiddlers) {
		var spaces = {};
		$(tiddlers).each(function(i, t) {
			var bag = t.bag,
				space = bag.substring(0, bag.lastIndexOf('_'));
			if(!spaces[space]) {
				spaces[space] = [];
			}
			spaces[space].push(t);
		});
		
		var $searchResults = $('#searchResults');
		if(tiddlers.length) {
			$.each(spaces, function(space, tiddlers) {
				//createTiddlyLink($li.get(0),match.title,true);
				
				var $li = $('<li>'+space+' ('+tiddlers.length+')<ul></ul></li>').appendTo($searchResults),
					$ul = $li.children('ul');
				$(tiddlers).each(function(i, t) {
					var $item = $('<li></li>').appendTo($ul),
						url = "//"+space+".tiddlyspace.com/#[["+t.title+"]]";
					createExternalLink($item.get(0), url, t.title);
				});
			});
		} else {
			//$searchResults.append('<span>no results for '+query+'</span>');
		}
		$('#searchResults li.loading').hide();
	},
	
	displayResults: function(matches, query) {
		var $searchResults = $('#searchResults').empty(),
			$thisSpaceLi,
			$thisSpaceList,
			count = matches.length || 0;
		$searchResults.append('<li class="loading">searching across all manuals...</li>');
		$thisSpaceLi = $('<li>This manual ('+count+')<ul></ul></li>').appendTo($searchResults);
		$thisSpaceList = $thisSpaceLi.children('ul');
		story.refreshAllTiddlers(true); // update highlighting within story tiddlers
		window.scrollTo(0,0);
		if(matches.length) {
			$(matches).each(function(i, match) {
				//$searchResults.append('<li><a href="#">'+match.title+'</a></li>');
				var $li = $('<li></li>').appendTo($thisSpaceList);
				createTiddlyLink($li.get(0),match.title,true);
			});
		} else {
			$thisSpaceList.append('<span>no results for '+query+'</span>');
		}
		// if we're only searching this space, click the space name to open it
		if(!$('#searchBox input[type=checkbox]').prop('checked')) {
			$('#searchResults li:not(".loading"):eq(0)').click();
		}
		$('#searchBox input[type=search]').click();
		
		/*query = '"""' + query + '"""'; // prevent WikiLinks
		var $container = $('<div id="'+this.containerId+'"><div class="jbasewrap"><div class="overlay"></div></div></div>').insertAfter('#header'),
			el = $container.find('.overlay').get(0),
			msg = "!" + this.heading + "\n";
		if(matches.length > 0) {
			msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n";
			this.results = [];
			for(var i = 0 ; i < matches.length; i++) {
				this.results.push(matches[i].title);
				msg += "* [[" + matches[i].title + "]]\n";
			}
		} else {
			msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?
		}
		createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, config.extensions.AmbitSearchPlugin.closeResults, "button", this.btnCloseId);
		createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, config.extensions.AmbitSearchPlugin.openAll, "button", this.btnOpenId);
		wikify(msg, el);
		createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, config.extensions.AmbitSearchPlugin.closeResults, "button", this.btnCloseId);
		createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, config.extensions.AmbitSearchPlugin.openAll, "button", this.btnOpenId);
		$container.click(function(e) {
			if($(e.target).hasClass('tiddlyLink')) {
				config.extensions.AmbitSearchPlugin.closeResults();
			}
			return false;
		});*/
	},

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

	openAll: function(ev) {
		story.displayTiddlers(null, config.extensions.AmbitSearchPlugin.results);
		return false;
	}
};

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

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

} //# end of "install only once"
//}}}
Type the text for 'AnotherTag'
!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> Sync is currently unavailable in ~TiddlyWiki due to security constraints in modern browsers. Research is being done to build a suitable alternative. In the meantime if you have changed content in an offline ~TiddlyWiki, you can get your content back into ~TiddlySpace by using the ''import'' functionality from the backstage of the online wiki.
}}}
}}}

!Menu
<<message messages.memberStatus>> <<homeLink>>
{{unsyncedList{<<message messages.syncListHeading>> <<list filter [is[unsynced]]>>}}}

running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
{{autotable{
<<tiddler Backstage##Resources>>
}}}

!Resources
[[blog|@@blog]] [[documentation|@@docs]] [[featured spaces|@@featured]] 

!ImportExport
<<fileImport>>
You can download this TiddlySpace as an offline TiddlyWiki:

{{chunkyButton{<<exportSpace>>}}}

!BackstageTiddlers
|upload a <<message messages.privacySetting>> file: <<binaryUpload>>|<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>>|
|>|<<search>>|
|>|<<tiddler Backstage##Tiddlers>>|

!Tiddlers
<<tabs
	txtMainTab
	"Recent" "Recently edited tiddlers" TabTimeline
	"All" "All tiddlers" TabAll
	"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
	"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
	"Tags" "All tags" TabTags
	"Spaces" "Tiddlers grouped by space" [[TiddlySpaceTabs##Spaces]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>

!BatchOps
<<tabs
	txtPublisherTab
	"Private" "Move tiddlers from private to public" Backstage##BatchPrivate
	"Public" "Move tiddlers from public to private" Backstage##BatchPublic
>>

!BatchPrivate
<<TiddlySpacePublisher type:private>>

!BatchPublic
<<TiddlySpacePublisher type:public>>

!Plugins
''Note:'' Many of these plugins are core TiddlySpace plugins and cannot be changed unless first cloned.

<<tiddler PluginManager>>

!Tweaks
These options change behavior in TiddlyWiki //only// and may be ineffective in TiddlySpace.

<<tiddler AdvancedOptions>>
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.2|
|''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($) {

"use strict";

var ctfield = "server.content-type";

var plugin = config.extensions.BinaryTiddlersPlugin = {
	isWikiText: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		if(ctype) {
			if (ctype === 'text/x-tiddlywiki') {
				return true;
			}
			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")
			|| ctype === 'application/json'
			|| ctype === 'application/javascript';
	},
	endsWith: function(str, suffix) {
		return str.length >= suffix.length &&
			str.substr(str.length - suffix.length) === suffix;
	},
	isLink: function(tiddler) {
		return this.isBinary(tiddler) && tiddler.text.indexOf("<html>") !== -1;
	}
};

// Disable edit for linked tiddlers (for now)
// This will be changed to a GET then PUT
config.commands.editTiddler.isEnabled = function(tiddler) {
    var existingTest = config.commands.editTiddler.isEnabled;
    if (existingTest) {
        return existingTest && !plugin.isLink(tiddler);
    } else {
        return !plugin.isLink(tiddler);
    }
};

// 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 && ctype !== 'text/x-tiddlywiki' &&
			!tiddler.tags.contains("systemConfig") && !plugin.isLink(tiddler)) {
		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''|BinaryUploadPlugin|
|''Version''|0.3.16|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{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 (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.binaryUpload = {
	locale: {
		titleDefaultValue: "Please enter a title...",
		tagsDefaultValue: "Please enter some tags...",
		titlePrefix: "title: ",
		tagsPrefix: "tags: ",
		loadSuccess: 'Tiddler %0 successfully uploaded',
		loadError: "An error occurred when uploading the tiddler %0",
		uploadInProgress: "Please wait while the file is uploaded...",
		membersOnly: "Only members can upload."
	},
	renderInputFields: function(container, options) {
		var locale = macro.locale;
		var editableFields = options.edit;
		var includeFields = {
			tags:  editableFields && editableFields.contains("tags") ? true : false,
			title: editableFields && editableFields.contains("title") ? true : false
		};
		var fields = ["title", "tags"];
		for(var i = 0; i < fields.length; i++) {
			var fieldName = fields[i];
			var userDefault = options[fieldName];
			var defaultValue = userDefault ? userDefault[0] : false;
			if(includeFields[fieldName] || defaultValue) {
				var localeDefault = locale["%0DefaultValue".format(fieldName)];
				var className = defaultValue ? "userInput" : "userInput notEdited";
				var inputEl;
				var val = defaultValue || localeDefault || "";
				var iContainer = $("<div />").addClass("binaryUpload%0".format(fieldName)).
					appendTo(container);
				if(defaultValue && !includeFields[fieldName]) {
					var label = locale["%0Prefix".format(fieldName)];
					$("<span />").text(label).appendTo(iContainer);
					$("<span />").addClass("disabledInput").text(val).appendTo(iContainer);
					inputEl = $("<input />").attr("type", "hidden");
				} else {
					inputEl = $("<input />").attr("type", "text");
				}
				inputEl.attr("name", fieldName).
					addClass("%0Edit".format(fieldName)).
					val(val).addClass(className).appendTo(iContainer);
			}
		}
	},
	getTiddlerName: function(fileName) {
		var fStart = fileName.lastIndexOf("\\");
		var fStart2 = fileName.lastIndexOf("/");
		fStart = fStart < fStart2 ? fStart2 : fStart;
		fileName = fileName.substr(fStart+1);
		return fileName;
	},
	errorHandler: function(fileName) {
		displayMessage("upload of file %0 failed".format(fileName));
	},
	uploadFile: function(place, baseURL, workspace, options) {
		var pleaseWait = $(".uploadProgress", place);
		var iframeName = options.target;
		var form = $("form", place);
		var existingVal = $("input[name=title]", form).val();
		var fileName = existingVal || $('input:file', form).val();
		if(!fileName) {
			return false; // the user hasn't selected a file yet
		}
		fileName = macro.getTiddlerName(fileName);
		$("input[name=title]", place).val(fileName);
		// we need to go somewhere afterwards to ensure the onload event triggers
		var redirectTo = "/%0/tiddlers.txt?select=title:%1".
			format(workspace, fileName);
		var token = tiddlyspace ? tiddlyspace.getCSRFToken() : "";
		var action = "%0?csrf_token=%1&redirect=%2"
			.format(baseURL, token, redirectTo);
		form[0].action = action; // dont use jquery to work with ie
		form[0].target = iframeName;
		// do not refactor following line... won't work in IE6 otherwise
		$(place).append($('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
		macro.iFrameLoader(iframeName, function() {
			var content = document.getElementById(iframeName).contentWindow.document.documentElement;
			if($(content).text().indexOf(fileName) > -1) {
				options.callback(place, fileName, workspace, baseURL);
			} else {
				macro.errorHandler(fileName);
			}
			form.show(1000);
			pleaseWait.hide(1000);
		});
		form.hide(1000);
		pleaseWait.show(1000);
		return true;
	},
	createUploadForm: function(place, options) {
		var locale = macro.locale;
		if(readOnly) {
			$('<div class="annotation" />').text(locale.membersOnly).
				appendTo(place);
			return;
		}
		var bag = options.bag;
		options.callback = options.callback ? options.callback :
			function(place, fileName, workspace, baseurl) {
				macro.displayFile(place, fileName, workspace);
				displayMessage(locale.loadSuccess.format(fileName));
				$("input[type=text]", place).val("");
			};
		var defaults = config.defaultCustomFields;
		place = $("<div />").addClass("container").appendTo(place)[0];
		var workspace = bag ? "bags/%0".format(bag) : config.defaultCustomFields["server.workspace"];
		var baseURL = defaults["server.host"];
		baseURL += (baseURL[baseURL.length - 1] !== "/") ? "/" : "";
		baseURL = "%0%1/tiddlers".format(baseURL, workspace);
		//create the upload form, complete with invisible iframe
		var iframeName = "binaryUploadiframe%0".format(Math.random());
		// do not refactor following line of code to work in IE6.
		var form = $('<form action="%0" method="POST" enctype="multipart/form-data" />'.
					format(baseURL)).addClass("binaryUploadForm").
			appendTo(place)[0];
		macro.renderInputFields(form, options);
		$(form).
			append('<div class="binaryUploadFile"><input type="file" name="file" /></div>').
			append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" disabled /></div>').
			submit(function(ev) {
				this.target = iframeName;
				options.target = iframeName;
				macro.uploadFile(place, baseURL, workspace, options);
			})
			.find('[type="file"]').bind('change', function() {
				$(form).find('[type="submit"]').prop('disabled', false);
			}).end();
		$('<div />').addClass("uploadProgress").text(locale.uploadInProgress).hide().appendTo(place);
		$("input[name=file]", place).change(function(ev) {
			var target = $(ev.target);
			var fileName = target.val();
			var title = $("input[type=text][name=title]", place);
			if(!title.val()) {
				title.val(fileName);
			}
		});
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true);
		macro.createUploadForm(place, params[0]);
	},
	iFrameLoader: function(iframeName, callback) {
		var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
		var locale = macro.locale;
		$(".userInput").addClass("notEdited"); // reset editing
		var finishedLoading = function() {
			callback();
		};
		var iFrameLoadHandler = function() {
			finishedLoading.apply();
			return;
		};

		iframe.onload = iFrameLoadHandler;
		//IE
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 3) {
				iFrameLoadHandler();
			}
		};
	},
	displayFile: function(place, title, workspace) {
		var adaptor = store.getTiddlers()[0].getAdaptor();
		var context = {
			workspace: workspace,
			host: config.defaultCustomFields['server.host']
		};
		adaptor.getTiddler(title, context, null, function(context) {
			if(context.status) {
				store.addTiddler(context.tiddler);
				story.displayTiddler(place, title);
				var image = config.macros.image;
				if(image && image.refreshImage) {
					image.refreshImage("/%0/tiddlers/%1".format(workspace, title));
					image.refreshImage(title);
					image.refreshImage("/%0".format(title));
					image.refreshImage("%0/%1/tiddlers/%2".format(config.extensions.tiddlyweb.host, workspace, title));
				}
			} else {
				displayMessage(macro.locale.loadError.format(title));
			}
		});
	}
};

if(tiddlyspace) {
	config.macros.binaryUploadPublic = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			var options = paramString.parseParams(null, null, true)[0];
			var bag = tiddlyspace.getCurrentBag("public");
			options.bag = bag;
			macro.createUploadForm(place, options);
		}
	};
	config.messages.privacySetting = config.options.chkPrivateMode ?
		"private" : "public";
	config.macros.binaryUpload.defaultWorkspace = tiddlyspace.
		getCurrentWorkspace(config.messages.privacySetting);
}

})(jQuery);
//}}}
//{{{
jQuery(document).bind("startup", function() {
	var _tmpCloneTiddlerHandler = config.commands.cloneTiddler.handler;
	config.commands.cloneTiddler.handler = function(ev, src, title) {
		_tmpCloneTiddlerHandler.apply(this, arguments);
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			tiddler.fields["server.workspace"] = config.extensions.tiddlyspace.getCurrentWorkspace("public"); // the default is private
		}
	};
});
//}}}
/*{{{*/
Background: #ccc
Foreground: #666
PrimaryPale: #fff
PrimaryLight: #fff
PrimaryMid: #fff
PrimaryDark: #666
SecondaryPale: #fff
SecondaryLight: #fff
SecondaryMid: #fff
SecondaryDark: #fff
TertiaryPale: #fff
TertiaryLight: #fff
TertiaryMid: #fff
TertiaryDark: #fff
Error: #f88
ColorPaletteParameters: HSL([48|58], [0.67|0.53|0.43|0.06],[0.31|0.5|0.85|0.99])
/*}}}*/
/*
	Title: Community of Practice macro
	Description: provides display of editing activity across different manuals
	Version: v0.4

	Changelog:
		v0.4: July 30th, 2013
			- fixed problems with cloned tiddlers not acquiring correct fields and permissions
		v0.3: June 25th, 2013
			- removed core manuals from whitelist
			- changed GO-TO button so it opens tiddlers in-situ in their manuals
			- made it possible to switch between 'core' and 'community' changes by using the 'manuals:community|core' parameter; defaults to 'community'
		v0.2: June 24rd, 2013
			- put snippet into own container and styled
		v0.1: June 20th, 2013
*/
/*{{{*/
config.macros.communityOfPractice = {
	/* 
		1. DONE
		- get the data (changes across all manuals)
		- get top 10 by date
		- spit it out as a table
		2. DONE
		- make page title a link
		- add hover popup
		- add text
		- add link to original
		3. DONE
		- change snippet of text to centre on the area of difference
		- add styling for diff
	*/
	searchURL: '/search.json?fat=1&q=',
	feedPath: '/bags/%0_public/tiddlers.json?fat=1',
	refresh: function() {
		console.log('refreshing',arguments);
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var plugin = config.macros.communityOfPractice,
			$ = jQuery,
			$place = $('<div>loading Community of Practice data...</div>').appendTo(place),
			feedPath = plugin.feedPath,
			whitelist = store.getTiddler('AMBIT community of practice - members').text.split('\n'),
			bagFilters = [],
			params = paramString.parseParams(null, null, true),
			communityOrCore = getParam(params,'manuals','community'), // defaults to 'community'
			url;
		$.each(whitelist, function(i, line) {
			var pieces = line.split(':'),
				space = pieces[0],
				isCore = line.indexOf('| core')!==-1;
			if(space) {
				// if we want community changes, just include non-core manuals
				if(communityOrCore==="community" && !isCore) {
					bagFilters.push("bag:"+space+"_public");
				} else if(communityOrCore==="core" && isCore) {
					// if we want core changes, just include core manuals
					bagFilters.push("bag:"+space+"_public");				
				}
			}
		});
		url = plugin.searchURL + "("+bagFilters.join(" OR ")+")";
		
		// TO-DO: potentially add cacheing here, so multiple macro calls share the same tiddlers array
		
		$.ajax({
			url: url,
			dataType: "json",
			success: function(tiddlers) {
				// make sure we are not including any non-ambit tiddlers, which shouldn't be the case anyway
				tiddlers = $.grep(tiddlers, function(t, i) {
					return t.bag.indexOf('ambit')!==-1;
				});
				plugin.processResults($place, tiddlers);
			},
			error: function() {
				$place.prepend('(error)');
			}
		});
	},
	processResults: function($place, tiddlers) {
		// create results table
		var $ = jQuery,
			plugin = config.macros.communityOfPractice,
			host = window.location.protocol+"//"+window.location.host,
			$place = $place.empty(),
			$table = $("<table><thead><tr><th>Page name</th><th>Manual</th><th>Editor</th><th>Date</th></tr></thead><tbody></tbody></table>").appendTo($place),
			$tbody = $table.find('tbody');
		// process tiddlers into table
		$.each(tiddlers, function(i, tiddler) {
			var name = tiddler.title,
				text = tiddler.text,
				bag = tiddler.bag,
				space = bag.split('_')[0],
				editor = tiddler.modifier,
				modified = Date.convertFromYYYYMMDDHHMM(tiddler.modified).formatString("0DD/0MM/YY"),
				$row = $("<tr><td><a href='#'>"+name+"</a></td><td>"+space+"</td><td>"+editor+"</td><td>"+modified+"</td></tr>").appendTo($tbody),
				localTiddler = store.getTiddler(name);
			$row.find('a').click(function(e) {
				e.preventDefault();
				var popup = Popup.create(this),
					$popup = $(popup),
					$meta = $("<div><strong>Page: "+name+"</strong><br>Manual: "+space+"<br><a target='_blank' href='http://"+space+".tiddlyspace.com/#[["+encodeURIComponent(name)+"]]' class='button' title=\"Clicking on this button will open a view of the page you are interested in; this page's manual will open in a separate tab with this page open\">Go to</a><br><br></div>").appendTo($popup),
					$snippet = $("<div class='snippet'>").appendTo($popup),
					snippet = $snippet.get(0),
					snippetText,
					diffURL,
					newTiddler = config.adaptors.tiddlyweb.toTiddler(tiddler, host),
					// only allow cloning if:
					//	- we're in edit mode
					//	- the tiddler doesn't exist in this space
					cloningEnabled = config.commands.cloneTiddler.isEnabled(newTiddler) && !localTiddler;

				if(cloningEnabled) {
					$('<a href="#" class="button" title="Click to make a clone of this page in your manual for customisation">Clone and customise</a>')
						.click(function(e) {
							e.preventDefault();
							// first localize the tiddler & make sure we can edit it
							newTiddler.fields['server.permissions'] = 'read, write, create';
							// this tiddler doesn't exist in this space - we need to add it so the cloneTiddler process work properly
							store.addTiddler(newTiddler);
							// editTiddler expects the tiddler to already be open, so open it (in edit mode so it doesn't change appearance)
							story.displayTiddler(e,newTiddler.title,DEFAULT_EDIT_TEMPLATE,null,null,newTiddler.fields);
							config.commands.cloneTiddler.handler(null,null,newTiddler.title);
							Popup.remove();
							return false;
						}).insertAfter($meta.find('a.button'));
				}
				
				if(localTiddler && localTiddler.fields['server.bag'] !== bag) {
					// show the diff'ed text
					$popup.append('<span class="diff">loading comparison&hellip;</span>');
					$.get("diff?rev1=bags/"+localTiddler.fields['server.bag']+"/"+encodeURIComponent(name)+"/"+localTiddler.fields['server.page.revision']+"&rev2=bags/"+bag+"/"+encodeURIComponent(name)+"/"+tiddler.revision+"&format=unified",
						function(text) {
							var fakeTiddler = new Tiddler();
							fakeTiddler.tags.push('diff');
							$popup.find('span.diff').remove();
							
							text = plugin.extractFirstDiff(text);
							snippetText = "{{diff{\n"+plugin.snippet(text, 200)+"\n}}}";
							
							$meta.append(wikifyStatic('//showing snippet (from area of difference)//\n'));
							
							$snippet.html(wikifyStatic(snippetText, null, fakeTiddler));
							delete fakeTiddler;
						}
					);
				} else {
					$meta.append(wikifyStatic('//showing snippet//\n'));
					$snippet.append(plugin.snippet(text, 200));
				}
				Popup.show();
				return false; // without this the popup doesn't appear. I don't know why, but it ends up not attached to any element
			});
		});
	},
	extractFirstDiff: function(text) {
		/*
			1. Select the first diff (as delimited by @@ ... @@)
			2. Remove everything before the content (as delimited by the last _hash: ...)
			
			Example diff:		
			--- 
			
			+++ 
			
			@@ -1,14 +1,12 @@
			
			-creator: jnthnlstr
			...
			-_hash: 1a1bee67501d45074a2ffd7227b0136692b0429f
			+_hash: 7e87f2d158e20809bd934cc20422ff421c181572
			 
			-t
			 !Purpose
			 to help new users become familiar with basic knowledge about AMBIT.
 
		*/
		var diffs = text.split(/@@.+?@@\n/),
			diff = diffs[1],
			parts = diff.split(/_hash:.+?\n/),
			content = parts.slice(-1)[0];
		return content;
	},
	snippet: function(text, limit) {
		// return a snippet of text ready for wikification
		// TO-DO return with the difference highlighted
		return text.length>limit ? text.substr(0, limit-3)+"..." : text;
	}
/*	NOT necessary in this macro?
	wrapWithElsewhereLink: function(place, tiddlers, tiddler) {
		var $ = jQuery;
		var $place = $(place)
			.wrap("<a></a>")
			.parent().click(function() {
				var popup = Popup.create(this),
					$ul,
					bag,
					space,
					diffURL = "diff?rev1=bags/"+tiddler.fields['server.bag']+"/"+encodeURIComponent(tiddler.title)+"/"+tiddler.fields['server.page.revision']+"&rev2=bags/<bag>/"+encodeURIComponent(tiddler.title)+"/<revision>&format=horizontal";
				if(popup) {
					$popup = $(popup);
					$.each(tiddlers, function(i, t) {
						bag = t.bag;
						space = bag.substring(0, bag.lastIndexOf('_'));
						$popup.append('<li><a href="'+diffURL.replace("<bag>",bag).replace("<revision>",t.revision)+'" target="_blank">'+space+'</li>');
					});
				}
				Popup.show();
				return false;
			});
	}*/
};

/* maybe repurpose to go-to button */
// newHere plugin - http://mptw.tiddlyspot.com/#NewHerePlugin
/*config.macros.newHere = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		$(place).attr({
			refresh: 'macro',
			macroName: 'newHere'
		}).data('args', arguments);
		wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
	},
	refresh: function(place, params) {
		var args = $(place).empty().data('args');
		this.handler.apply(this, args);
	}
};*/

/*}}}*/
[is[local]][sort[-modified]]
/***
|''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";

})();
//}}}
<!--{{{-->

<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'></div>

<div class='article editor'>
	<div class='heading editorHeading'>
		<div class='editor title' macro='edit title'></div>
		<div class='tagClear'></div>
	</div>
	<div class='annotationsBox' macro='annotations'>
		<!--<div class='editSpaceSiteIcon'
			macro='tiddlerOrigin height:16 width:16 label:no interactive:no'>
		</div>
		<div class="privacyEdit" macro='setPrivacy label:no interactive:no'></div>-->
		<div class='tagClear'></div>
	</div>
	<div class='editor' macro='edit text'></div>
	<div class='editorFooter'>
		<div class='tagTitle'>tags</div>
		<div class='editor' macro='edit tags'></div>
		<div class='tagAnnotation'>
			<span macro='message views.editor.tagPrompt'></span>
			<span macro='tagChooser excludeLists'></span>
		</div>
	</div>
</div>

<!--}}}-->
/***
|''Name''|ErrorHandlerPlugin|
|''Version''|0.4.3|
|''Author''|Jon Robson|
|''Description''|Localised tiddler save errors including edit conflict resolution.|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
tiddlyspace.getLocalTitle = function(title, workspace, suffix) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(!suffix) {
		var isPublic = endsWith(workspace, "_public");
		suffix = tiddlyspace.resolveSpaceName(workspace);
		if(currentSpace == suffix) {
			suffix = isPublic ? "public" : "private";
		} else {
			suffix = "@%0".format(suffix);
		}
	}
	return "%0 *(%1)*".format(title, suffix);
};

var sssp = config.extensions.ServerSideSavingPlugin;

var msgs = config.messages.editConflict = {
	loading: "Loading..",
	resolve: "[[Edit Conflict]]@glossary: this tiddler may have been changed by someone else.",
	reviewDiff: "review (recommended)",
	reviewDiffTooltip: "review changes made to this tiddler",
	reviewDiffError: "error retrieving revision.",
	save: "overwrite",
	saveTooltip: "make this revision the top revision of this tiddler",
	discard: "cancel",
	discardTooltip: "undo changes to this tiddler and get most recent version",
	diffTitle: "%0",
	diffFieldTitle: "%0 - fields",
	diffTextTitle: "%0 - text",
	updating: "updating your version...",
	diffHeader: ["Review the changes that have been made whilst you were editing this tiddler. ",
		"Fold relevant changes back into your version.\n",
		"{{removed{Red}}} highlight shows content removed. ",
		"{{added{Green}}} highlight shows content added.\n"].join(""),
	diffTextHeader: "View changes in text",
	diffFieldsHeader: "View changes in fields"
};

var plugin = config.extensions.errorHandler = {
	diffTags: ["excludeLists", "excludeMissing", "excludeSearch"],
	displayMessage: function(message, tiddler, context) {
		var desc = context && context.httpStatus ? context.statusText :
			sssp.locale.connectionError;
		var reportArea = plugin.reportError(tiddler.title);
		var msg = $("<div />").appendTo(reportArea);
		if(message == "saveConflict") {
			wikify(msgs.resolve, msg[0]);
			var choiceArea = $("<div />").appendTo(reportArea)[0];
			plugin.editConflictHandler(choiceArea, tiddler);
		} else {
			msg.text(sssp.locale[message].format(tiddler.title, desc));
		}
	},
	editConflictHandler: function(container, tiddler) {
		var title = tiddler.title;
		var myrev = tiddler.fields["server.page.revision"];
		// note user now needs to edit, fix problem and save. 
		// TODO: make sure this gets reset in save callback
		store.getTiddler(title).fields["server.page.revision"] = "false";

		var diffBtn = createTiddlyButton(container, msgs.reviewDiff, msgs.reviewDiffTooltip, function(ev) {
			var title = $(ev.target).data("title");
			plugin.displayDiff(ev.target, store.getTiddler(title), myrev);
		});
		var saveBtn = createTiddlyButton(container, msgs.save, msgs.saveTooltip, function(ev) {
				var title = $(ev.target).data("title");
				var tid = store.saveTiddler(store.getTiddler(title));
				autoSaveChanges(null, [tid]);
			});
		var ignoreBtn = createTiddlyButton(container, msgs.discard, msgs.discardTooltip, function(ev) {
			var title = $(ev.target).text(msgs.updating).data("title");
			plugin.resetToServerVersion(store.getTiddler(title));
		});
		$([diffBtn, ignoreBtn, saveBtn]).data("title", title);
	},
	getDiffTiddlerTexts: function(diffText) {
		var chunks = diffText.split("\n  \n");
		if(chunks.length < 2) {
			return [chunks[0], ""];
		} else {
			var diffFieldsText = "{{diff{\n%0\n}}}".format(chunks[0]);
			diffText = '{{diff{\n%0\n}}}'.format(chunks.splice(1, chunks.length).join("\n"));
			return [diffText, diffFieldsText];
		}
	},
	makeDiffTiddler: function(title, diff) {
		var newTiddler = new Tiddler(title);
		var tags = plugin.diffTags;
		newTiddler.text = msgs.loading;
		newTiddler.fields.doNotSave = true;
		newTiddler.tags = diff ? tags.concat(["diff"]) : tags;
		newTiddler = store.saveTiddler(newTiddler);
		$.extend(store.getTiddler(title).fields,
			config.defaultCustomFields); // allow option to save it
		return newTiddler;
	},
	displayDiff: function(src, tiddler, latestRevision) {
		var adaptor = tiddler.getAdaptor();
		var title = tiddler.title;
		var ts = new Date().formatString("0hh:0mm:0ss");
		var suffix = "edit conflict %0".format(ts);
		var diffTitle = tiddlyspace.getLocalTitle(msgs.diffTitle.format(title), "", suffix);
		var diffTextTitle = tiddlyspace.getLocalTitle(msgs.diffTextTitle.format(title), "", suffix);
		var diffFieldsTitle = tiddlyspace.getLocalTitle(msgs.diffFieldTitle.format(title), "", suffix);
		plugin.makeDiffTiddler(diffTextTitle, true);
		plugin.makeDiffTiddler(diffFieldsTitle, true);
		var newTiddler = plugin.makeDiffTiddler(diffTitle, false);
		newTiddler.text = ['%0\n<<slider chkViewDiffText "%1" "%2">>\n',
			'<<slider chkViewDiffField "%3" "%4">>'].join("").
			format(msgs.diffHeader, diffTextTitle, msgs.diffTextHeader,
				diffFieldsTitle, msgs.diffFieldsHeader);
		store.saveTiddler(newTiddler);

		var callback = function(r) {
			var text = plugin.getDiffTiddlerTexts(r);
			store.getTiddler(diffTextTitle).text = text[0];
			store.getTiddler(diffFieldsTitle).text = text[1];
			story.refreshTiddler(diffTitle, null, true);
		};
		var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
		ajaxReq({
			type: "get",
			dataType: "text",
			url: "/diff?format=unified&rev1=%0/%1/%2&rev2=%0/%1".format(workspace, title, latestRevision),
			success: callback,
			error: function() {
				displayMessage(msgs.reviewDiffError);
			}
		});
		story.displayTiddler(src, diffTitle);
	},
	resetToServerVersion: function(tiddler) {
		var adaptor = tiddler.getAdaptor();
		var ctx = { 
			host: tiddler.fields["server.host"],
			workspace: "bags/" + tiddler.fields["server.bag"]
		};
		adaptor.getTiddler(tiddler.title, ctx, null, function(context) {
			store.saveTiddler(context.tiddler);
			story.refreshTiddler(tiddler.title);
			store.setDirty(false);
		});
	},
	reportError: function(title) {
		var el = story.getTiddler(title);
		if(!el) {
			el = story.displayTiddler(null, title);
		}
		return $("<div />").addClass("error annotation").prependTo(el)[0];
	}
};

sssp.reportFailure = function(message, tiddler, context) {
	config.options.chkViewDiffText = config.options.chkViewDiffText === undefined ?
		true : config.options.chkViewDiffText;
	config.options.chkViewDiffFields = config.options.chkViewDiffFields || false;
	plugin.displayMessage(message, tiddler, context);
};

})(jQuery);
//}}}
//{{{
var $ = jQuery;

config.macros.exportAIM = {
	tag: 'AIM',
	csv: "",
	setup: false,
	handler: function(place) {
		$(place).append('<a href="#" class="export marginbottomsmall button" title="Export AIM to CSV">Export AIM</a>');
		this.setBehaviour();
	},
	setBehaviour: function() {
		if(this.setup) {
			return;
		}
		$('#aimForm').live('click', function(e) {
			if($(e.target).hasClass('export')) {
				config.macros.exportAIM.exportCSV();
			}
		});
		this.setup = true;
	},
	onWindowOpen: function(newDocument) {
		var $textarea = $('textarea', newDocument),
			textarea = $textarea.get(0),
			str = $textarea.val();
		textarea.rows = str.split("\n").length+1;
	},
	exportCSV: function() {
		var aimFormItems = config.macros.AIMForm.getAllItems(),
			csv = "",
			fields,
			score,
			keyOnly,
			newWindow,
			newDocument,
			interventionLabel,
			interventions,
			writeInterventionsList = function(newDocument, interventions) {
				newDocument.write("<ul>");
				$.each(interventions, function(i, intervention) {
					newDocument.write("<li>"+intervention.name+"<ul>");
					$.each(intervention.AIMitems, function(j, AIMitem) {
						newDocument.write("<li>"+AIMitem.title+" (rating "+aimFormItems[AIMitem.title].value+")</li>");
					});
					newDocument.write("</ul></li>");
				});
				newDocument.write("</ul>");	
			};
		$.each(aimFormItems, function(i, AIMitem) {
			if(AIMitem.value) {
				csv += '"'+AIMitem.tiddlerTitle+'","'+AIMitem.value+'","'+(AIMitem.isKeyProblem ? 'key problem' : '')+'"\n';
			}
		});
		if(!csv) {
			csv = "the AIM has not been filled in yet";
		}
		config.macros.exportAIM.csv = csv;
		newWindow = window.open("", "sourceWindow", "width=700,height=600,scrollbars=yes");
		newWindow.focus();
		newDocument = newWindow.document;
		newDocument.write("<html><head><script type='text/javascript' src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js'></script><title>AIM export to CSV</title>" +
			'<style type="text/css">textarea { border: 2px inset #B5B5B5; width: 100%; }</style>' +
			"</head><body onload=\"var exp = function() { window.opener.config.macros.exportAIM.save(); window.close(); }; var button = document.getElementsByTagName('button')[0]; if(button) { button.onclick=exp; } document.getElementsByTagName('textarea')[0].select();  \">" +
			"<h1>AIM export to CSV</h1>" +
			"<h2>Form information:</h2>" +
			"<dl><dt>Name/Unique ID:</dt><dd>"+(config.options.txtAIM_ID || "not filled in")+"</dd>" +
			"<dt>Date of assessment</dt><dd>"+(config.options.txtAIM_date || "not filled in")+"</dd>" +
			"<dt>Name of assessor</dt><dd>"+(config.options.txtAIM_assessor || "not filled in")+"</dd></dl>" +
			"<hr />");
		if(!config.options.txtAIM_ID || !config.options.txtAIM_date || !config.options.txtAIM_assessor) {
			newDocument.write("<p>Please go back and fill in the undefined details above</p><hr/>");
		}
		newDocument.write(wikifyStatic("<<tiddler ExportAIMInstructions>>") +
			"<textarea>" +
			csv +
			"</textarea>");
		newDocument.write("<h2>List of specific interventions:</h2>");
		// now show the list of interventions, if there are any
		keyOnly = true;
		interventions = config.macros.AIMResults.createResults(keyOnly);
		config.macros.AIMResults.analyseResults(interventions, "global_ranking");
		newDocument.write("<h3>Global ranking (key problems only):</h3>");
		writeInterventionsList(newDocument, interventions);
		config.macros.AIMResults.analyseResults(interventions, "focal_ranking");
		newDocument.write("<h3>Focal ranking (key problems only):</h3>");
		writeInterventionsList(newDocument, interventions);
		keyOnly = false;
		interventions = config.macros.AIMResults.createResults(keyOnly);
		config.macros.AIMResults.analyseResults(interventions, "global_ranking");
		newDocument.write("<h3>Global ranking (all results):</h3>");
		writeInterventionsList(newDocument, interventions);
		config.macros.AIMResults.analyseResults(interventions, "focal_ranking");
		newDocument.write("<h3>Focal ranking (all results):</h3>");
		writeInterventionsList(newDocument, interventions);
		newDocument.write("<script type='text/javascript'>$(document).ready(function() { window.opener.config.macros.exportAIM.onWindowOpen(document); });</script></body></html>");
		newDocument.close();
	},
	save: function() {
		// TiddlyTemplating.saveFile - http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/plugins/TiddlyTemplatingMacro.js
		var filename = (config.options.txtAIM_ID+"_"+config.options.txtAIM_date+"_"+config.options.txtAIM_assessor+".csv").replace(/ /g," "),
			content = config.macros.exportAIM.csv.replace(/<br\/>/g,"\n"),
			localPath = getLocalPath(document.location.toString()),
			savePath,
			p,
			fileSave;

		config.messages.fileSaved = "file successfully saved";
		config.messages.fileFailed = "file save failed";
		if((p = localPath.lastIndexOf("/")) != -1) {
			savePath = localPath.substr(0,p) + "/" + filename;
		} else {
			if((p = localPath.lastIndexOf("\\")) != -1) {
				savePath = localPath.substr(0,p) + "\\" + filename;
			} else {
				savePath = localPath + "." + filename;
			}
		}
		alert("saving AIM to file: "+savePath);
		fileSave = saveFile(savePath,convertUnicodeToUTF8(content));
		if(fileSave) {
			displayMessage("saved... click here to load","file://"+savePath);
		} else {
			displayMessage(config.messages.fileFailed,"file://"+savePath);
		}
	}
};
//}}}
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
To have an interface to delete stuff, include this space in the space where you want to delete things, then navigate to [[/bulkdelete|/bulkdelete]] to delete stuff!
/***
|''Name''|GroupByPlugin|
|''Description''|Mimics allTags macro to provide ways of creating lists grouping tiddlers by any field|
|''Version''|0.6.1|
|''Author''|Jon Robson|
|''Status''|beta|
!Usage
{{{<<groupBy tags>>}}}
mimics allTags macro

{{{<<groupBy server.bag>>}}}
groups by the server.bag field (this version contains TiddlySpace specific code for turning a bag into a space name)

{{{groupBy modified dateFormat:"YYYY"}}}
group tiddlers by year.

{{{<<groupBy tags exclude:excludeLists exclude:systemConfig>>}}}
group tiddlers by tag but exclude the tags with values excludeLists and systemConfig

Within that group you can also exclude things by filter
{{{groupBy modifier filter:[tag[film]]}}}
will group tiddlers tagged with film by modifier.
***/
//{{{
(function($) {
var taglocale = config.views.wikified.tag;
var macro = config.macros.groupBy = {
	locale: {
		tooltip: "all tiddlers in group %0",
		noTiddlers: "no tiddlers",
		openAllText: taglocale.openAllText,
		openAllTooltip: taglocale.openAllTooltip,
		openTiddler: "open tiddler with title %0"
	},
	morpher: {
		// TODO: note currently the following 2 morphers are TiddlySpace specific and probably should be in separate plugin
		"server.workspace": function(value, options) {
			return macro.morpher["server.bag"](value.replace("bags/", "").replace("recipes/", ""));
		},
		"server.bag": function(value, options) {
			if(typeof(value) !== "string") {
				return false;
			} else if(value.indexOf("_public") === -1 && value.indexOf("_private") === -1) {
				value = "*%0".format(value); // add star for non-space bags.
			}
			return value.replace("_public", "").replace("_private", "");
		},
		created: function(value, options) {
			return value.formatString(options.dateFormat || "DD MMM YYYY");
		},
		modified: function(value, options) {
			return macro.morpher.created(value, options);
		}
	},

	handler: function(place, macroName, params, wikifier, paramString) {
		var field = params[0] || "server.workspace";
		var dateFormat = params[1] || "DD MMM YYYY";
		var container = $("<div />").attr("macroName", macroName).addClass("groupBy").
			attr("refresh", "macro").attr("fieldName", field).
			attr("paramString", paramString).
			attr("dateFormat", dateFormat).appendTo(place)[0];
		macro.refresh(container);
	},
	isTypeArray: function(value) {
		var valueType = typeof value;
		if(valueType === "object" && typeof value.length === "number" &&
			!(value.propertyIsEnumerable("length")) &&
			typeof value.splice === "function") { //is Array
			return true;
		} else {
			return false;
		}
	},
	_onClickGroup: function(ev, options) {
		var i, target = ev.target, locale = macro.locale;
		var tiddlers = $(target).closest(".templateContainer").data("tiddlers");
		var popup = $(Popup.create(target)).addClass("taggedTiddlerList")[0];
		var value = $(target).attr("value");
		var openAll = createTiddlyButton($("<li />").appendTo(popup)[0],
			locale.openAllText.format(value), locale.openAllTooltip);
		$(openAll).click(function(ev) {
			story.displayTiddlers(ev.target, tiddlers);
			return false;
		});
		var listBreak = $("<li />").addClass("listBreak").html("<div />").appendTo(popup);
		for(i = 0; i < tiddlers.length; i++) {
			var item = $("<li />").appendTo(popup)[0];
			var template = store.getTiddlerText(options.template) || macro.template;
			wikify(template, item, null, tiddlers[i]);
		}
		listBreak.clone().appendTo(popup);
		$(createTiddlyLink($("<li />").appendTo(popup)[0], value, false)).
			text(locale.openTiddler.format(value));
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	_refresh: function(container, tiddlers, options) {
		var totalGroups = 0, locale = macro.locale, i, j;
		var excludeValues = options.exclude;
		var values = {}, value_ids = [];
		var field = options.field;
		var morpher = macro.morpher[field] || function(value) {
			return value;
		};
		for(i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var value = tiddler[field] || tiddler.fields[field];
			value = macro.isTypeArray(value) ? value : [ value ];
			for(j = 0; j < value.length; j++) {
				var v = morpher(value[j], options);
				if(v && $.inArray(v, excludeValues) === -1) {
					totalGroups += 1;
					if(!values[v]) {
						values[v] = [];
					}
					values[v].push(tiddler);
					value_ids.pushUnique(v);
				}
			}
		}
		var ul = $("<ul />").appendTo(container)[0];
		if(totalGroups === 0) {
			$("<li />").addClass("listTitle").text(locale.noTiddlers);
		}
		value_ids = value_ids.sort();
		var groupTemplate = store.getTiddlerText(options.groupTemplate);
		var onClick = function(ev) {
			macro._onClickGroup(ev, options);
		};
		for(i = 0; i < value_ids.length; i++) {
			var title = value_ids[i];
			var info = getTiddlyLinkInfo(title);
			tiddlers = values[title];
			var btn = createTiddlyButton($("<li />").appendTo(ul)[0],
				"%0 (%1)".format(title, tiddlers.length), locale.tooltip.format(title), null, info.classes);
			if(groupTemplate) {
				$(btn).empty();
				wikify(groupTemplate, btn, null, tiddlers[0]);
			}
			$(btn).click(onClick).attr("value", title).attr("refresh", "link").attr("tiddlyLink", title);
			$(btn).addClass("templateContainer").data("tiddlers", tiddlers);
		}
	},
	refresh: function(container) {
		container = $(container).empty();
		var paramString = container.attr("paramString");
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { field: container.attr("fieldName"), dateFormat: container.attr("dateFormat"), exclude: args.exclude || [],
			template: args.template ? args.template[0] : false, groupTemplate: args.groupTemplate ? args.groupTemplate[0] : "" };
		var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers("title");
		macro._refresh(container, tiddlers, options);
	},
	template: "<<view title link>>"
};

}(jQuery));
//}}}
/*{{{*/
(function() {
	var $ = jQuery,
		$historyBox,
		$historyList,
		scrollingInterval;

	config.macros.history = {
		init: function() {
			// add behaviour to tiddler opening
		},
		handler: function(place) {
			if(!$historyBox) {
				/* TW macro handlers get called twice (bug), but the first time, place is not set to the correct element - it is some mysterious element which ends up not in the document. So we have to let the HTML creation happen twice, but not the event binding */
				$(document).bind("startup", this.dispatch);
			}
			$historyBox = $('<div class="historyBox"></div>')
				.append('<div class="scrollBar"></div>')
				.appendTo(place);
			$historyList = $('<ul class="browsingTool"></ul>')
				.appendTo($historyBox)
				.css({
					position: 'relative',
					top: 0
				}); // prepare for scrolling
			/*$historyBox.find('.scrollBar span').mousedown(function(e) {
				var direction = e.target.className === "up" ? 1 : -1;
				scrollingInterval = window.setInterval(function() {
					var top = parseInt($historyList.css('top'),10),
						newTop = top;
					if(direction > 0 && top < 0) {
						newTop = top + 3;
					} else if(direction < 0 && $historyList.height()+top > $historyBox.height()) {
						newTop = top - 3;
					}
					$historyList.css({
						top: newTop+"px"
					});
				}, 100);
			}).mouseup(function(e) {
				window.clearInterval(scrollingInterval);
			}).mouseout(function(e) {
				window.clearInterval(scrollingInterval);
			});*/
		},
		listItem: function(title, active, addToBottom) {
			var mostRecentTiddler = $historyList.find('li').eq(0).text();
			if(title!==mostRecentTiddler) {
				var link = createTiddlyLink(null,title,true,(active ? "active" : "")),
					$newItem = $('<li></li>').append(link);
				if(addToBottom) {
					$historyList.append($newItem);
				} else {
					$historyList.prepend($newItem);
				}
			}
		},
		dispatch: function() {
			// populate history from story
			var title,
				id,
				idPrefix = "",
				prefixLength = idPrefix.length,
				plugin = config.macros.history;
			$(story.getContainer())
				.find('.tiddler')
				.each(function(i, tid) {
					title = $(tid).attr("tiddler");
					plugin.listItem(title, i===0, 'bottom');
				});
			
			// add to history whenever tiddler is opened
			var tmpDisplayTiddler = Story.prototype.displayTiddler;
			Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly) {
				var t = story.chooseTemplateForTiddler(title, template);
				if(t.indexOf('ViewTemplate')!==-1) {
					var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler;
					plugin.listItem(title);
				}
				tmpDisplayTiddler.apply(this, arguments);
			};
		}
	};
}());

/*}}}*/

There are a lot of interesting people using ~TiddlySpace that you might like to keep track of and interact with. There are a number of ways of doing this.

If you see a number in the speech bubble in one of your tiddlers, it means that someone is writing about the same thing as you. You can find out what they're saying by clicking on it. Likewise, if you see something interesting in someone else's space, you can respond to it and write up your own thoughts on the subject by clicking "Reply to this tiddler".

Additionally, if you find anyone interesting, or you find an interesting looking space and you'd like to know when it's changed, you can "follow" that space. To do this, simply create a tiddler with the title: {{{@space-name}}} and tag it {{{follow}}}. If you want, you can store some notes about that space in the body of the tiddler.

If you then want to know what happening, simply [[include|How do I include/exclude spaces?]]@docs the @tivity space and then visit your activity stream at [[/activity|/activity]], or just visit the @tapas space directly.

!Not sure who to follow?
Here's a few suggestions:
* @fnd
* @cdent
* @pmario
* @bengillies
* @dickon
The activity feed is best for sharing opinions on something. To make best use of it create a tiddler and tag it with a username you would like to share thought with on this subject.

For instance I might create a tiddler called [[Animal I'd least like to be stuck in a cage with]]. I might say 
<<<
I would least like to be stuck in a cage with a lion as it could tear me apart amongst other reasons.
<<<
I then tag it @matias to get @matias's attention to see what he think. This flags it in @matias's activity feed and tells him that I am interested in his thoughts. Of course @matias can ignore it, and if he is not using the activity feed feature he may not even know about the message. If he wants to respond all @matias then has to do is create his own tiddler [[Animal I'd least like to be stuck in a cage with]]. Matias might say
<<<
A lion would be not as bad as a great white shark... not only would you be stuck in a cage with it but you would  be underwater with a likelihood of drowning to increase suffering.
<<<
It's not over yet.. now I can refine my original post with the thoughts of Matias. I might think mm, @matias has got a point there with the water, but I think a crocodile would more likely eat me then a great white shark and I fancy my chances with the great white.

I then update my tiddler to say 
<<<
I would least like to be stuck in a cage with a crocodile as it could tear me apart amongst other reasons. A lion would also be scary however I'm not a good swimmer so would be less likely to be able to make an escape. A crocodile is worse than a shark as shark attacks on humans are rare, so I'd fancy my chances.
<<<

We continue replying this way revising our tiddlers till the process finishes and I have a tiddler which clearly explains the [[Animal I'd least like to be stuck in a cage with]] with very detailed reasoning.
/bags/common/tiddlers/jquery.js
/htmljs-takenoteedit.js
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.4|
|''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)|
|''Requires''|BinaryTiddlersPlugin|
!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)
!!Parameters
width/height: specify width/height parameters
link: make the image link to a given location
tiddlyLink: link to a tiddler

!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. Note for the case of svg files it will attempt to render as an svg if possible via the image
tag. It doesn't embed the svg in the dom for security reasons as svg code can contain javascript.
!Code
***/
//{{{
(function($) {

var macro = config.macros.image = {
	shim: "/bags/common/tiddlers/shim",
	ieVersion: config.browser.isIE ? parseInt(config.browser.ieVersion[1], 10) : false,
	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: {},
	_image_tag_cache: {},
	_image_dimensions: {},
	locale: {
		badImage: "This image cannot be displayed."
	},
	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);
	},
	init: function() {
		var startupImages = store.getTaggedTiddlers("systemImage");
		var place = $("<div />").attr("id", "systemImageArea").appendTo("body").hide()[0];
		for(var i = 0; i < startupImages.length; i++) {
			var image = startupImages[i];
			macro.renderImage(place, image.title, { idPrefix: "" });
		}
		var data = new Image();
		data.onload = function() {
			// note ie 8 only supports data uris up to 32k so cannot be relied on
			macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
			macro.supportsDataUris = macro.ieVersion && macro.ieVersion < 9 ? false : macro.supportsDataUris;
		};
		data.onerror = data.onload;
		data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
	},
	refreshImage: function(src) {
		var elements = macro._image_tag_cache[src] ? macro._image_tag_cache[src] : [];
		if(macro._image_dimensions[src]) {
			macro._image_dimensions[src] = false;
		}
		for(var i = 0; i < elements.length; i++) {
			var el = $(elements[i]);
			var newSrc = "%0?nocache=%1".format(src, Math.random());
			el.attr("src", newSrc); // force reload
		}
	},
	isBinaryImageType: function(contentType) {
		return (contentType && contentType.indexOf("image") === 0 &&
			contentType.indexOf("+xml") != contentType.length - 4) ? true : false;
	},
	isImageTiddler: function(tiddler) {
		return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
	},
	isSVGTiddler: function(tiddler) {
		var type = tiddler ? tiddler.fields['server.content-type'] : false;
		return type == "image/svg+xml";
	},
	isBinaryImageTiddler: function(tiddler) {
		return macro.isBinaryImageType(tiddler.fields['server.content-type']);
	},
	renderImage: function(place, imageSource, options) {
		var imageTiddler = store.getTiddler(imageSource);
		var container;
		var classes = ["image"];
		if(options.link) {
			classes = classes.concat(["imageLink", "externalLink"]);
			container = $("<a />").attr("href", options.link).appendTo(place)[0];
		} else if(options.tiddlyLink) {
			classes.push("imageLink");
			container = createTiddlyLink(place, options.tiddlyLink, false);
		} else {
			container = $("<span />").appendTo(place)[0];
		}
		$(container).addClass(classes.join(" "));

		options = options ? options : {};
		if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
			return macro._renderBinaryImageTiddler(container, imageTiddler, options);
		} else if(imageTiddler){ // handle the case where we have a tiddler
			return macro._renderSVGTiddler(container, imageTiddler, options);
		} else { // we have a string representing a url
			return macro._renderBinaryImageUrl(container, imageSource, options);
		}
	},
	_renderAlternateText: function(container, options) {
		var img;
		var src = options.src || "";
		if(options.width && options.height) {
			img = $("<img />").attr("src", src).addClass("svgImageText").attr("width", options.width).
				attr("height", options.height).appendTo(container);
		}
		var alt = options.alt;
		if(img && alt) {
			img.attr("alt", alt).attr("title", alt);
		} else if(alt) {
			$(container).addClass("svgImageText").text(alt);
		}
		macro._image_tag_cache[src] = img;
	},
	_renderSVGTiddler: function(place, tiddler, options) {
		if(!options) {
			options = {};
		}
		merge(options, { tiddler: tiddler, fix: true});

		if(macro.svgAvailable) {
			this._importSVG(place, options); // display the svg
		} else if(options.altImage) {
			var image = options.altImage;
			delete options.altImage;
			this._renderBinaryImageUrl(place, image, options);
		} else {
			this._renderAlternateText(place, options); // instead of showing the image show the alternate text.
		}
	},
	_renderBinaryImageTiddler: function(place, tiddler, options) {
		var resourceURI;
		var fields = tiddler.fields;
		if(fields["server.type"] == "tiddlyweb") { // construct an accurate url for the resource
			resourceURI = "%0/%1/tiddlers/%2".format(config.defaultCustomFields["server.host"],
				fields["server.workspace"], encodeURI(fields["server.title"]));
		} else { // guess the url for the resource
			resourceURI = tiddler.title;
		}
		var ctype = fields["server.content-type"] || tiddler.type;
		var text = tiddler.text;
		if(macro.supportsDataUris && ctype && text.indexOf("<html") == -1) {
			var uri = "data:%0;base64,%1".format(ctype, text);
			options.src = resourceURI;
			return macro._renderBinaryImageUrl(place, uri, options);
		} else if(options.src) {
			return macro._renderBinaryImageUrl(place, options.src, options);
		} else {
			return macro._renderBinaryImageUrl(place, resourceURI, options);
		}
	},
	_renderImageTag: function(container, src, width, height, options) {
		var img;
		img = $("<img />").appendTo(container);
		if(height) {
			img.attr("height", height);
		}
		if(width) {
			img.attr("width", width);
		}
		if(macro.ieVersion && macro.ieVersion < 7 && macro.shim && options.ie6png) {
			$(img).css({width: userW, height: userH,
					filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%0', sizingMethod='scale')".format(src)
				}).attr("src", macro.shim);
		} else {
			img.attr("src", src);
		}
		if(!macro._image_tag_cache[options.srcUrl]) {
			macro._image_tag_cache[options.srcUrl] = [];
		}
		img = $(img).addClass(options.imageClass)[0];
		macro._image_tag_cache[options.srcUrl].push(img);
		return img;
	},
	_getDimensions: function(realDimensions, reqDimensions, preserve) {
		var w = realDimensions.width;
		var h = realDimensions.height;
		var reqh = reqDimensions.height;
		var reqw = reqDimensions.width;
		var finalw = w, finalh = h;
		var ratiow = reqw / w, ratioh = reqh / h;
		var scaledw = ratioh * w;
		var scaledh = ratiow * h;
		if(!reqw && reqh) {
			finalw = scaledw;
			finalh = reqh;
		} else if(reqw && !reqh) {
			finalw = reqw;
			finalh = scaledh;
		} else if(reqh && reqw) {
			var preserveWidth = w > h ? true : false;
			if(preserve) {
				if(preserveWidth && scaledh < reqh) {
					finalh = scaledh;
					finalw = reqw;
				} else {
					finalh = reqh;
					finalw = scaledw;
				}
			} else {
				finalw = reqw;
				finalh = reqh;
			}
		}
		return { width: parseInt(finalw, 10), height: parseInt(finalh, 10) };
	},
	_renderBinaryImageUrl: function(container, src, options) {
		var srcUrl = options.src ? options.src : src;
		srcUrl = srcUrl.indexOf("/") === -1 ? "/%0".format(srcUrl) : srcUrl; // for IE. 
		var image_dimensions = macro._image_dimensions[srcUrl];
		var image = new Image(); // due to weird scaling issues where you use just a width or just a height
		var createImageTag = function(dimensions, error) {
			if(error) {
				var altImage = options.altImage;
				if(altImage) {
					delete options.altImage;
					macro._renderBinaryImageUrl(container, altImage, options);
				} else {
					options.src = src;
					macro._renderAlternateText(container, options);
				}
			} else {
				var dim = macro._getDimensions(dimensions, { 
					width: options.width, height: options.height }, options.preserveAspectRatio);
				options.srcUrl = srcUrl;
				macro._renderImageTag(container, src, dim.width, dim.height, options);
			}
		};

		if(!image_dimensions) {
			image.onload = function() {
				var dimensions = { width: image.width, height: image.height};
				macro._image_dimensions[srcUrl] = dimensions;
				createImageTag(dimensions);
			};
			image.onerror = function() {
				createImageTag(null, true);
			};
			image.src = src;
		} else {
			createImageTag(image_dimensions);
		}
	},
	_generateIdPrefix: function(){
		return "twsvgfix_" + (this._fixPrefix++).toString() + "_";
	},
	_fixSVG: function(childNodes, idPrefix) {
		var urlPattern = /url\(\#([^\)]*)\)*/ig;
		var fixes = [
		{ attr: "id", pattern: /^(.*)$/ig },
		{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
		];
		var url_fixes = ["filter", "fill", "mask", "stroke", "style"];
		for(var i = 0; i < url_fixes.length; i++) {
			fixes.push({ attr: url_fixes[i], pattern: urlPattern });
		}
		for(var t = 0; t < childNodes.length; t++) {
			var node = childNodes[t];
			for(var a = 0; a < fixes.length; a++) {
				var fix = fixes[a];
				var attr = fix.attr;
				var ns = fix.namespace || "";
				if(node.hasAttributeNS && node.hasAttributeNS(ns, attr)) {
					var v = node.getAttributeNS(ns, 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 toReplace = match[1];
						if(toReplace.indexOf(idPrefix) !== 0 && toReplace.indexOf("twglobal_") !== 0) {
							var replacement = (idPrefix + toReplace).replace("$", "$$$$"); 
							v = v.replace(match[1], replacement);
						}
						node.setAttributeNS(ns, attr,v);
					}
				}
			}
			var children = node.childNodes;
			if(children.length > 0) {
				this._fixSVG(children, idPrefix);
			}
		}
	},
	_importSVG: function(place, options){
		options = options ? options : {};
		var svgDoc, tiddlerText = options.tiddler.text;
		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 svgHolder = document.createElementNS(macro.svgns,"svg");
			var width = options.width;
			var height = options.height;
			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 {
				var existing = el.className ? el.className.baseVal : "";
				el.setAttribute("class","svgImage %0".format(existing));
				place.appendChild(el);
			}
			// if a tiddler attribute is set this is read as a link
			$("[tiddler], [tiddlyLink]", place).attr("refresh", "link").click(function(ev) {
				var tiddler = $(ev.target).attr("tiddlyLink");
				if(tiddler) {
					story.displayTiddler(ev.target, tiddler);
				}
			});
		}
	},
	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 = isNaN(params[1]) ? false : parseInt(params[1], 10);
		var height = isNaN(params[2]) ? false : parseInt(params[2], 10);

		options.width = macro.lookupArgument(options, "width", width);
		options.height = macro.lookupArgument(options, "height", height);
		options.preserveAspectRatio = args.preserveAspectRatio && 
			args.preserveAspectRatio[0] == "yes" ? true : false;
		options.tiddlyLink = macro.lookupArgument(options, "tiddlyLink", false);
		options.link = macro.lookupArgument(options, "link", false);
		return options;
	},
	lookupArgument: function(args, id, ifEmpty) {
		return args[id] ? args[id] : ifEmpty;
	}
};

// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
merge(config.macros.view.views, {
	wikified: function(value, place, params, wikifier, paramString, tiddler) {
		if(macro.isImageTiddler(tiddler) && params[0] == "text") {
			var newplace = $("<div />").addClass("wikifiedImage").appendTo(place)[0];
			macro.renderImage(newplace, tiddler.title, { alt: macro.locale.badImage });
		} else {
			_oldwikifiedview.apply(this, arguments);
		}
	},
	image: function(value, place, params, wikifier, paramString, tiddler) {
		// a field can point to another tiddler whereas text is the current tiddler.
		var title = params[0] == "text" ? tiddler.title : value;
		var args = macro.getArguments(paramString, params);
		macro.renderImage(place, title, args);
	}
});
config.shadowTiddlers.StyleSheetImageMacro = [".wikifiedImage svg, .wikifiedImage .image { width: 80%; }",
	".svgImageText { background-color:[[ColorPalette::Error]]; color:#ddd; display: inline-block; }",
	"span.svgImageText { display: inline-block; overflow: hidden; }"
].join("");
store.addNotification("StyleSheetImageMacro", refreshStyles);

})(jQuery);
//}}}
/***
|''Name''|ImportExternalLinksPlugin|
|''Author''|Jon Robson|
|''Version''|0.3.0|
|''Requires''|TiddlySpaceConfig TiddlySpaceLinkPlugin TiddlySpaceCloneCommand|
|''Description''|Turns space links into ajax links so you don't have to leave the comfort of your own TiddlyWiki|
!Notes
This maybe should hides the editTiddler, cloneTiddler commands. Ideally the toolbar commands should hide themselves but we need a strong concept of "this is a sucked in tiddler" to do that.
***/
//{{{
(function($){
var tiddlyspace = config.extensions.tiddlyspace;
_createSpaceLink = createSpaceLink;
if(_createSpaceLink) {
	createSpaceLink = function(place, spaceName, title, alt, isBag) {
		var tooltip = "Click to open in current document. Right click to open in original space.";
		_createSpaceLink(place, spaceName, title, alt, isBag);
		var workspace;
		if(isBag) {
			workspace = "bags/%0".format(spaceName);
		} else {
			workspace = "bags/%0_public".format(spaceName);
		}
		if(title && spaceName != tiddlyspace.currentSpace.name) {
			var link = $("a:last", place);
			var newlink = $("<a />").text("[link]").after(link[0]);
			// very hacky
			var updateInterval = setInterval(function() {
				var href = link.attr("href");
				if(href) {
					$(newlink).attr("href", href);
					clearInterval(updateInterval);
				}
			}, 200);
			
			if(link.parent(".replyLink").length == 0) { // don't suck in a reply link.
				link.attr("title", tooltip).addClass("importLink").click(function(ev) {
					if(config.floorboards) {
						config.floorboards.pushUnique("%0_public".format(spaceName));
					}
					tiddlyspace.displayServerTiddler(ev.target, title, workspace, function(el) {
						// TODO: the commands should disable themselves based on the meta information.
						//$("[commandname=editTiddler], [commandname=cloneTiddler]", el).hide(); 
					});
					ev.preventDefault();
				});
			}
		}
	};
}

var _cloneHandler = config.commands.cloneTiddler.handler;
config.commands.cloneTiddler.handler = function(event, src, title) {
	var _tiddler = store.getTiddler(title);
	var source = _tiddler ? _tiddler.fields["server.bag"] : false;
	var imported = _tiddler ? _tiddler.fields["tiddler.source"] : false;
	var realTitle = _tiddler ? _tiddler.fields["server.title"] : title;
	_cloneHandler.apply(this, [event, src, title]);
	var tidEl = story.getTiddler(title);
	$(story.getTiddlerField(title, "title")).val(realTitle);
	if(source) {
		$("<input />").attr("type", "hidden").attr("edit", "tiddler.source").val(source).appendTo(tidEl);
		$("<input />").attr("type", "hidden").attr("edit", "server.activity").appendTo(tidEl);
	}
}
})(jQuery);
//}}}
/*
    http://www.JSON.org/json2.js
    2011-02-23

    Public Domain.

    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.

    See http://www.JSON.org/js.html


    This code should be minified before deployment.
    See http://javascript.crockford.com/jsmin.html

    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    NOT CONTROL.


    This file creates a global JSON object containing two methods: stringify
    and parse.

        JSON.stringify(value, replacer, space)
            value       any JavaScript value, usually an object or array.

            replacer    an optional parameter that determines how object
                        values are stringified for objects. It can be a
                        function or an array of strings.

            space       an optional parameter that specifies the indentation
                        of nested structures. If it is omitted, the text will
                        be packed without extra whitespace. If it is a number,
                        it will specify the number of spaces to indent at each
                        level. If it is a string (such as '\t' or '&nbsp;'),
                        it contains the characters used to indent at each level.

            This method produces a JSON text from a JavaScript value.

            When an object value is found, if the object contains a toJSON
            method, its toJSON method will be called and the result will be
            stringified. A toJSON method does not serialize: it returns the
            value represented by the name/value pair that should be serialized,
            or undefined if nothing should be serialized. The toJSON method
            will be passed the key associated with the value, and this will be
            bound to the value

            For example, this would serialize Dates as ISO strings.

                Date.prototype.toJSON = function (key) {
                    function f(n) {
                        // Format integers to have at least two digits.
                        return n < 10 ? '0' + n : n;
                    }

                    return this.getUTCFullYear()   + '-' +
                         f(this.getUTCMonth() + 1) + '-' +
                         f(this.getUTCDate())      + 'T' +
                         f(this.getUTCHours())     + ':' +
                         f(this.getUTCMinutes())   + ':' +
                         f(this.getUTCSeconds())   + 'Z';
                };

            You can provide an optional replacer method. It will be passed the
            key and value of each member, with this bound to the containing
            object. The value that is returned from your method will be
            serialized. If your method returns undefined, then the member will
            be excluded from the serialization.

            If the replacer parameter is an array of strings, then it will be
            used to select the members to be serialized. It filters the results
            such that only members with keys listed in the replacer array are
            stringified.

            Values that do not have JSON representations, such as undefined or
            functions, will not be serialized. Such values in objects will be
            dropped; in arrays they will be replaced with null. You can use
            a replacer function to replace those with JSON values.
            JSON.stringify(undefined) returns undefined.

            The optional space parameter produces a stringification of the
            value that is filled with line breaks and indentation to make it
            easier to read.

            If the space parameter is a non-empty string, then that string will
            be used for indentation. If the space parameter is a number, then
            the indentation will be that many spaces.

            Example:

            text = JSON.stringify(['e', {pluribus: 'unum'}]);
            // text is '["e",{"pluribus":"unum"}]'


            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'

            text = JSON.stringify([new Date()], function (key, value) {
                return this[key] instanceof Date ?
                    'Date(' + this[key] + ')' : value;
            });
            // text is '["Date(---current time---)"]'


        JSON.parse(text, reviver)
            This method parses a JSON text to produce an object or array.
            It can throw a SyntaxError exception.

            The optional reviver parameter is a function that can filter and
            transform the results. It receives each of the keys and values,
            and its return value is used instead of the original value.
            If it returns what it received, then the structure is not modified.
            If it returns undefined then the member is deleted.

            Example:

            // Parse the text. Values that look like ISO date strings will
            // be converted to Date objects.

            myData = JSON.parse(text, function (key, value) {
                var a;
                if (typeof value === 'string') {
                    a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
                    if (a) {
                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
                    }
                }
                return value;
            });

            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
                var d;
                if (typeof value === 'string' &&
                        value.slice(0, 5) === 'Date(' &&
                        value.slice(-1) === ')') {
                    d = new Date(value.slice(5, -1));
                    if (d) {
                        return d;
                    }
                }
                return value;
            });


    This is a reference implementation. You are free to copy, modify, or
    redistribute.
*/

/*jslint evil: true, strict: false, regexp: false */

/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
    lastIndex, length, parse, prototype, push, replace, slice, stringify,
    test, toJSON, toString, valueOf
*/


// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

var JSON;
if (!JSON) {
    JSON = {};
}

(function () {
    "use strict";

    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }

    if (typeof Date.prototype.toJSON !== 'function') {

        Date.prototype.toJSON = function (key) {

            return isFinite(this.valueOf()) ?
                this.getUTCFullYear()     + '-' +
                f(this.getUTCMonth() + 1) + '-' +
                f(this.getUTCDate())      + 'T' +
                f(this.getUTCHours())     + ':' +
                f(this.getUTCMinutes())   + ':' +
                f(this.getUTCSeconds())   + 'Z' : null;
        };

        String.prototype.toJSON      =
            Number.prototype.toJSON  =
            Boolean.prototype.toJSON = function (key) {
                return this.valueOf();
            };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        rep;


    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
            var c = meta[a];
            return typeof c === 'string' ? c :
                '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
        }) + '"' : '"' + string + '"';
    }


    function str(key, holder) {

// Produce a string from holder[key].

        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

        if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }

// What happens next depends on the value's type.

        switch (typeof value) {
        case 'string':
            return quote(value);

        case 'number':

// JSON numbers must be finite. Encode non-finite numbers as null.

            return isFinite(value) ? String(value) : 'null';

        case 'boolean':
        case 'null':

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.

            return String(value);

// If the type is 'object', we might be dealing with an object or an array or
// null.

        case 'object':

// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.

            if (!value) {
                return 'null';
            }

// Make an array to hold the partial results of stringifying this object value.

            gap += indent;
            partial = [];

// Is the value an array?

            if (Object.prototype.toString.apply(value) === '[object Array]') {

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

                v = partial.length === 0 ? '[]' : gap ?
                    '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
                    '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }

// If the replacer is an array, use it to select the members to be stringified.

            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    if (typeof rep[i] === 'string') {
                        k = rep[i];
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            } else {

// Otherwise, iterate through all of the keys in the object.

                for (k in value) {
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

            v = partial.length === 0 ? '{}' : gap ?
                '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
                '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }

// If the JSON object does not yet have a stringify method, give it one.

    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

            var i;
            gap = '';
            indent = '';

// If the space parameter is a number, make an indent string containing that
// many spaces.

            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }

// If the space parameter is a string, it will be used as the indent string.

            } else if (typeof space === 'string') {
                indent = space;
            }

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

            rep = replacer;
            if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                    typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }

// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.

            return str('', {'': value});
        };
    }


// If the JSON object does not yet have a parse method, give it one.

    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.

            var j;

            function walk(holder, key) {

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.prototype.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }


// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

            text = String(text);
            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

            if (/^[\],:{}\s]*$/
                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

                j = eval('(' + text + ')');

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.

                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }

// If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('JSON.parse');
        };
    }
}());


/*
 * ----------------------------- JSTORAGE -------------------------------------
 * Simple local storage wrapper to save data on the browser side, supporting
 * all major browsers - IE6+, Firefox2+, Safari4+, Chrome4+ and Opera 10.5+
 *
 * Copyright (c) 2010 Andris Reinman, andris.reinman@gmail.com
 * Project homepage: www.jstorage.info
 *
 * Licensed under MIT-style license:
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

/**
 * $.jStorage
 * 
 * USAGE:
 *
 * jStorage requires Prototype, MooTools or jQuery! If jQuery is used, then
 * jQuery-JSON (http://code.google.com/p/jquery-json/) is also needed.
 * (jQuery-JSON needs to be loaded BEFORE jStorage!)
 *
 * Methods:
 *
 * -set(key, value)
 * $.jStorage.set(key, value) -> saves a value
 *
 * -get(key[, default])
 * value = $.jStorage.get(key [, default]) ->
 *    retrieves value if key exists, or default if it doesn't
 *
 * -deleteKey(key)
 * $.jStorage.deleteKey(key) -> removes a key from the storage
 *
 * -flush()
 * $.jStorage.flush() -> clears the cache
 * 
 * -storageObj()
 * $.jStorage.storageObj() -> returns a read-ony copy of the actual storage
 * 
 * -storageSize()
 * $.jStorage.storageSize() -> returns the size of the storage in bytes
 *
 * -index()
 * $.jStorage.index() -> returns the used keys as an array
 * 
 * -storageAvailable()
 * $.jStorage.storageAvailable() -> returns true if storage is available
 * 
 * -reInit()
 * $.jStorage.reInit() -> reloads the data from browser storage
 * 
 * <value> can be any JSON-able value, including objects and arrays.
 *
 **/
(function($){
    if(!$ || !($.toJSON || Object.toJSON || window.JSON)){
        throw new Error("jQuery, MooTools or Prototype needs to be loaded before jStorage!");
    }
    var
        /* This is the object, that holds the cached values */ 
        _storage = {},

        /* Actual browser storage (localStorage or globalStorage['domain']) */
        _storage_service = {jStorage:"{}"},

        /* DOM element for older IE versions, holds userData behavior */
        _storage_elm = null,
        
        /* How much space does the storage take */
        _storage_size = 0,

        /* function to encode objects to JSON strings */
        json_encode = $.toJSON || Object.toJSON || (window.JSON && (JSON.encode || JSON.stringify)),

        /* function to decode objects from JSON strings */
        json_decode = $.evalJSON || (window.JSON && (JSON.decode || JSON.parse)) || function(str){
            return String(str).evalJSON();
        },
        
        /* which backend is currently used */
        _backend = false,
        
        /**
         * XML encoding and decoding as XML nodes can't be JSON'ized
         * XML nodes are encoded and decoded if the node is the value to be saved
         * but not if it's as a property of another object
         * Eg. -
         *   $.jStorage.set("key", xmlNode);        // IS OK
         *   $.jStorage.set("key", {xml: xmlNode}); // NOT OK
         */
        _XMLService = {
            
            /**
             * Validates a XML node to be XML
             * based on jQuery.isXML function
             */
            isXML: function(elm){
                var documentElement = (elm ? elm.ownerDocument || elm : 0).documentElement;
                return documentElement ? documentElement.nodeName !== "HTML" : false;
            },
            
            /**
             * Encodes a XML node to string
             * based on http://www.mercurytide.co.uk/news/article/issues-when-working-ajax/
             */
            encode: function(xmlNode) {
                if(!this.isXML(xmlNode)){
                    return false;
                }
                try{ // Mozilla, Webkit, Opera
                    return new XMLSerializer().serializeToString(xmlNode);
                }catch(E1) {
                    try {  // IE
                        return xmlNode.xml;
                    }catch(E2){}
                }
                return false;
            },
            
            /**
             * Decodes a XML node from string
             * loosely based on http://outwestmedia.com/jquery-plugins/xmldom/
             */
            decode: function(xmlString){
                var dom_parser = ("DOMParser" in window && (new DOMParser()).parseFromString) ||
                        (window.ActiveXObject && function(_xmlString) {
                    var xml_doc = new ActiveXObject('Microsoft.XMLDOM');
                    xml_doc.async = 'false';
                    xml_doc.loadXML(_xmlString);
                    return xml_doc;
                }),
                resultXML;
                if(!dom_parser){
                    return false;
                }
                resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, 'text/xml');
                return this.isXML(resultXML)?resultXML:false;
            }
        };

    ////////////////////////// PRIVATE METHODS ////////////////////////

    /**
     * Initialization function. Detects if the browser supports DOM Storage
     * or userData behavior and behaves accordingly.
     * @returns undefined
     */
    function _init(){
        /* Check if browser supports localStorage */
        if("localStorage" in window){
            try {
                if(window.localStorage) {
                    _storage_service = window.localStorage;
                    _backend = "localStorage";
                }
            } catch(E3) {/* Firefox fails when touching localStorage and cookies are disabled */}
        }
        /* Check if browser supports globalStorage */
        else if("globalStorage" in window){
            try {
                if(window.globalStorage) {
                    _storage_service = window.globalStorage[window.location.hostname];
                    _backend = "globalStorage";
                }
            } catch(E4) {/* Firefox fails when touching localStorage and cookies are disabled */}
        }
        /* Check if browser supports userData behavior */
        else {
            _storage_elm = document.createElement('link');
            if(_storage_elm.addBehavior){

                /* Use a DOM element to act as userData storage */
                _storage_elm.style.behavior = 'url(#default#userData)';

                /* userData element needs to be inserted into the DOM! */
                document.getElementsByTagName('head')[0].appendChild(_storage_elm);

                _storage_elm.load("jStorage");
                var data = "{}";
                try{
                    data = _storage_elm.getAttribute("jStorage");
                }catch(E5){}
                _storage_service.jStorage = data;
                _backend = "userDataBehavior";
            }else{
                _storage_elm = null;
                return;
            }
        }

        _load_storage();
    }
    
    /**
     * Loads the data from the storage based on the supported mechanism
     * @returns undefined
     */
    function _load_storage(){
        /* if jStorage string is retrieved, then decode it */
        if(_storage_service.jStorage){
            try{
                _storage = json_decode(String(_storage_service.jStorage));
            }catch(E6){_storage_service.jStorage = "{}";}
        }else{
            _storage_service.jStorage = "{}";
        }
        _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;    
    }

    /**
     * This functions provides the "save" mechanism to store the jStorage object
     * @returns undefined
     */
    function _save(){
        try{
            _storage_service.jStorage = json_encode(_storage);
            // If userData is used as the storage engine, additional
            if(_storage_elm) {
                _storage_elm.setAttribute("jStorage",_storage_service.jStorage);
                _storage_elm.save("jStorage");
            }
            _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
        }catch(E7){/* probably cache is full, nothing is saved this way*/}
    }

    /**
     * Function checks if a key is set and is string or numberic
     */
    function _checkKey(key){
        if(!key || (typeof key != "string" && typeof key != "number")){
            throw new TypeError('Key name must be string or numeric');
        }
        return true;
    }

    ////////////////////////// PUBLIC INTERFACE /////////////////////////
    $.jStorage = {
        /* Version number */
        version: "0.1.5.3",

        /**
         * Sets a key's value.
         * 
         * @param {String} key - Key to set. If this value is not set or not
         *              a string an exception is raised.
         * @param value - Value to set. This can be any value that is JSON
         *              compatible (Numbers, Strings, Objects etc.).
         * @returns the used value
         */
        set: function(key, value){
            _checkKey(key);
            if(_XMLService.isXML(value)){
                value = {_is_xml:true,xml:_XMLService.encode(value)};
            }
            _storage[key] = value;
            _save();
            return value;
        },
        
        /**
         * Looks up a key in cache
         * 
         * @param {String} key - Key to look up.
         * @param {mixed} def - Default value to return, if key didn't exist.
         * @returns the key value, default value or <null>
         */
        get: function(key, def){
            _checkKey(key);
            if(key in _storage){
                if(_storage[key] && typeof _storage[key] == "object" &&
                        _storage[key]._is_xml &&
                            _storage[key]._is_xml){
                    return _XMLService.decode(_storage[key].xml);
                }else{
                    return _storage[key];
                }
            }
            return typeof(def) == 'undefined' ? null : def;
        },
        
        /**
         * Deletes a key from cache.
         * 
         * @param {String} key - Key to delete.
         * @returns true if key existed or false if it didn't
         */
        deleteKey: function(key){
            _checkKey(key);
            if(key in _storage){
                delete _storage[key];
                _save();
                return true;
            }
            return false;
        },

        /**
         * Deletes everything in cache.
         * 
         * @returns true
         */
        flush: function(){
            _storage = {};
            _save();
            return true;
        },
        
        /**
         * Returns a read-only copy of _storage
         * 
         * @returns Object
        */
        storageObj: function(){
            function F() {}
            F.prototype = _storage;
            return new F();
        },
        
        /**
         * Returns an index of all used keys as an array
         * ['key1', 'key2',..'keyN']
         * 
         * @returns Array
        */
        index: function(){
            var index = [], i;
            for(i in _storage){
                if(_storage.hasOwnProperty(i)){
                    index.push(i);
                }
            }
            return index;
        },
        
        /**
         * How much space in bytes does the storage take?
         * 
         * @returns Number
         */
        storageSize: function(){
            return _storage_size;
        },
        
        /**
         * Which backend is currently in use?
         * 
         * @returns String
         */
        currentBackend: function(){
            return _backend;
        },
        
        /**
         * Test if storage is available
         * 
         * @returns Boolean
         */
        storageAvailable: function(){
            return !!_backend;
        },
        
        /**
         * Reloads the data from browser storage
         * 
         * @returns undefined
         */
        reInit: function(){
            var new_storage_elm, data;
            if(_storage_elm && _storage_elm.addBehavior){
                new_storage_elm = document.createElement('link');
                
                _storage_elm.parentNode.replaceChild(new_storage_elm, _storage_elm);
                _storage_elm = new_storage_elm;
                
                /* Use a DOM element to act as userData storage */
                _storage_elm.style.behavior = 'url(#default#userData)';

                /* userData element needs to be inserted into the DOM! */
                document.getElementsByTagName('head')[0].appendChild(_storage_elm);

                _storage_elm.load("jStorage");
                data = "{}";
                try{
                    data = _storage_elm.getAttribute("jStorage");
                }catch(E5){}
                _storage_service.jStorage = data;
                _backend = "userDataBehavior";
            }
            
            _load_storage();
        }
    };

    // Initialize jStorage
    _init();

})(window.jQuery || window.$);
/***
|''Name''|LoadMissingExternalTiddler|
|''Version''|0.1.0|
|''Author''|Jon Robson|
***/
//{{{
var _loadMissing = Story.prototype.loadMissingTiddler;
Story.prototype.loadMissingTiddler = function(title,fields,callback) {
	var matches = title.match(/([^\*]*) \*\(@([^\)]*)\)\*/);
	if(matches && matches.length > 0) {
		var sTitle = matches[1];
		var space = matches[2];		config.extensions.tiddlyspace.displayServerTiddler(story.getTiddler(title),
			sTitle, "bags/%0_public".format(space));
	} else {
	_loadMissing.apply(this, arguments)
	}
};
//}}}
Marn I'm af ndasd a?
<<tree "SampleTag TagTwo">>
<script type="text/javascript">
	function yo() {
		alert('yo');
	}
</script>
<!--{{{-->
<link rel="shortcut icon" href="/recipes/mobile_public/tiddlers/favicon.ico" />
<link href="/bags/mobile_public/tiddlers.atom?select=tag:!excludeLists"
	rel="alternate" type="application/atom+xml" title="mobile's public feed" />
<!--}}}-->
This is overwriting the NewHerePlugin contained in @ambit-plugins
/*
	Title: NoRefreshSlider
	Description: allows you to create sliders that don't refresh their content when a general refresh is called. This can be useful when you have dynamic content in the revealed slider e.g. with AJAX requests you don't want to refire; or a table you don't want to rebuild
	Version: v0.1
	
	Usage: <<slider chkOption [[tiddler to show]] buttonLabel buttonHover [noRefresh]>>
	i.e. same as regular slider with optional 'noRefresh' parameter
	if noRefresh is present, slider will not refresh content when a general refresh is called

	Changelog:
		v0.1: June 20th, 2013
*/
/*{{{*/
config.macros.slider.handler = function(place,macroName,params) {
	var panel = this.createSlider(place,params[0],params[2],params[3]);
	var text = store.getTiddlerText(params[1]);
	var noRefresh = params[4];
	if(!noRefresh) {
		panel.setAttribute("refresh","content");
	}
	panel.setAttribute("tiddler",params[1]);
	if(text)
		wikify(text,panel,null,store.getTiddler(params[1]));
};
/*}}}*/
Marn I'm af ndasd a?
Type the text for 'OtherTiddler' MainMenu
<!--{{{-->
<div id="displayArea">
	<!-- AMBIT HTML build here -->
	<div id="sidebar">
		<span id="SiteIcon" macro="image SiteIcon"></span>
		<h1><span id="SiteTitle" class='siteTitle' refresh='content' tiddler='SiteTitle'></span> <span id="SiteSubtitle" class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span></h1>
		<div id="searchBox" class="panel closed">
			<div macro="searchBox"></div>
			<!--<input type="text" placeholder="Search" />-->
			<!---<button id="clearSearch">&#215;</button>-->
			<!--<h3>showing 10 results&hellip;</h3>-->
			<!--<ul class="browsingTool" id="searchResults">
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
				<li><a href="#">Object</a></li>
			</ul>-->
		</div>
		<div class="panel closed" id="historyPanel">
			<h2>
				<a href="#">History</a>
			</h2>
			<div macro="history"></div>
		</div>
		<div class="panel closed" id="currentlyOpenPanel">
			<h2>
				<a href="#">Currently Open</a>
				<span macro="buttonPermaviewMacro"></span>
			</h2>
			<div macro="youAreReading"></div>
		</div>
		<div class="panel" id="contentsPanel">
			<h2>
				<a href="#">Contents</a>
			</h2>
			<div refresh="content" tiddler="MainMenu"></div>
		</div>
		<div id="sidebarIcons">
			<a id="toggle" href="#" title="Toggle Sidebar">Toggle Sidebar</a>
			<a id="search" href="#" title="Search">Search</a>
			<a id="history" href="#" title="History">History</a>
			<a id="current" href="#" title="Currently Open">Currently Open <span></span></a>
			<a id="contents" href="#" title="Contents">Contents</a>
		</div>
	</div> <!-- End #sidebar -->
	<div id="rightPanel">
		<div id="statusTab"><span class="browsing panelOpen">Editing</span></div>
		<div id="statusPanel">
			<div id="modeStatus">
				<span class="title">Mode:</span>
				<span class="value"><a class="browsing current" href="#">Browsing</a></span>
				<div class="dropDown">
					<span class="value"><a class="edit" href="#">Edit</a></span>
					<span class="value"><a class="advanced" href="#">Advanced</a></span>
				</div>
			</div>
			<div id="accountStatus">
				<span class="title">Logged in as:</span>
				<span class="value"><a class="current" href="#">GUEST</a></span>
				<div class="dropDown">
					<form id="logOutForm" action="/logout" method="post">
						<input type="submit" value="Log out" />
					</form>
				</div>
			</div>
			<div class="overflow">
				<!--<span class="title"></span>-->
				<span class="plain" id="feedback"></span>
				<span class="plain" id="manualizingOurWork"></span>
		 	</div>
		</div><!-- End #statusPanel -->
		<div id="syncPanel">
			<h3>Error syncing to online manual</h3>
			<p>The following items were not synced to the online manual. They can be synced from your browser when you have an internet connection</p>
			<ul>
				<li>+ Getting started</li>
			</ul>
			<button class="affirmative"><span>Sync</span>Sync</button>
			<button class="negative"><span>Discard</span>Discard</button>
		</div>
		<div id="messageArea"></div>
		<form id="loginForm" action="/challenge/tiddlywebplugins.tiddlyspace.cookie_form" method="post">
			<label for="user">account ID:</label>
			<input type="text" name="user" id="user" />
			<label for="password">password:</label>
			<input type="password" name="password" id="password" />
			<button type="submit">Log in</button>
		</form>
	</div>
	<div id="screenWidth" class="jbasewrap">
		<div id="tiddlerDisplay" class="jbasewrap">
		</div> <!-- End #tiddlerDisplay -->
	</div> <!-- End #screenWidth -->
</div> <!-- #displayArea -->
<!--}}}-->
/*{{{*/
var provenanceMacro = config.macros.provenance = {
	/* Provenance macro checks the origin of the tiddler.
	   If it is inherited from another space, nothing is done.
	   If it was created in this space, or is a local modification
	   of a tiddler from another space, a label indicating this is
	   added.
	*/
	provenanceHelper: function(place) {
		var $ = jQuery,
			$place = $(place),
			title = $place.data("tiddler"),
			tiddler = store.getTiddler(title),
			currentSpace = config.extensions.tiddlyspace.currentSpace.name,
			source,
			labelText,
			isLocal;
		if(!tiddler) { // it is possible that provenanceHelper is called before the handler has setup the tiddler
			return;
		}
		source = tiddler.fields['tiddler.source'];
		isLocal = config.filterHelpers.is.local(tiddler);
		if (isLocal) {
			if (source) {
				source = source.replace(/_public$/,''); // so we don't show <space>_public
				labelText = "Derived from <a href='http://" + source + ".tiddlyspace.com/#[[" + encodeURIComponent(tiddler.title) + "]]' target='_blank'>" + source + "</a>";
			} else {
				labelText = currentSpace + " original content";
			}
		} else {
			// Page is inherited. Return without adding label.
			return;
		}
		$place.html(labelText);	
	},
	refresh: function(place) {
		provenanceMacro.provenanceHelper(place);
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		$(place).attr("refresh", "macro")
			.attr("macroName", macroName)
			.data("tiddler", tiddler.title);
		provenanceMacro.provenanceHelper(place);
	}
};
/*}}}*/
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.4.0|
|''Status''|stable|
|''Source''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/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
More information at http://macros.tiddlyspace.com/#%5B%5BRandomColorPaletteButton%20macro%5D%5D
!Code
***/
//{{{
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 = l <= 0.5 ? 2 * l * s : ( 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);
	return new RGB(r + m, g + m, b + m);
}

(function($){
	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 = macro.getOptions(paramString);
			macro.generatePalette(options, true);
		},
		optionTypes: {
			floats: ["hue", "saturation", "darkest", "lightness", "huevariance", "dark", "pale", "light", "mid",
				"saturation_light", "saturation_pale", "saturation_mid", "saturation_dark"
			]
		},
		getOptions: function(paramString) {
			var args = paramString.parseParams("name", null, true, false, true)[0];
			var options = {};
			var numbers = macro.optionTypes.floats;
			for(var i in args) {
				options[i] = numbers.indexOf(i) > -1 ? parseFloat(args[i][0], 10) : args[i][0];
			}
			return options;
		},
		generateRandomNumber: function(min, max, info) {
			var num = (Math.random() * 1);
			info = !info ? { attempts:0 } : info;
			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;
			var palette = macro.getExistingPalette(true);
			var hue = options.hue || Math.floor(Math.random() * 359);
			var saturation = options.saturation || macro.generateRandomNumber(0.3, 0.7);
			var dark = options.dark || options.darkest || macro.generateRandomNumber(0, 0.10);
			var pale = options.pale || options.lightness || macro.generateRandomNumber(0.90, 1);
			var delta = ( ( pale - dark ) / 3 );
			var mid = options.mid || dark + delta;
			var light = options.light || dark + (delta * 2);
			var lightness_values = {Dark: dark, Mid: mid, Light: light, Pale: pale};
			var saturation_values = {};
			for(i in lightness_values) {
				if(true) {
					saturation_values[i] = options["saturation_" + i.toLowerCase()] || saturation;
				}
			}

			var opposite_hue = (hue + 180) % 360;
			var seed = options.huevariance || 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) {
					var saturation = saturation_values[j];
					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_values.Pale, "|",
				saturation_values.Light, "|", saturation_values.Mid, "|", saturation_values.Dark, "],",
				"[", dark, "|", mid, "|", light, "|", pale, "])"].join("");
			// construct new ColorPalette
			var text = ["/*{{{*/\n"];
			var colorcode;
			for(var id in palette) {
				if(true) {
					var color = palette[id];
					colorcode = outputRGB ? color.toRGBString() : color.toString();
					text.push("%0: %1\n".format(id, colorcode));
				}
			}
			text.push("/*}}}*/");
			text = text.join("");
			if(save) {
				macro.saveColorPalette(text);
			}
			return text;
		},
		saveColorPalette: function(text) {
			var tid = store.getTiddler("ColorPalette");
			if(!tid) {
				tid = new Tiddler("ColorPalette");
				tid.fields = merge({}, config.defaultCustomFields);
			} // TODO: detect that the ColorPalette in the space comes from outside recipe
			tid.fields["server.page.revision"] = "false"; // edit conflicts dont matter

			// save the color palette in tid
			tid = store.saveTiddler(tid.title, tid.title, text, tid.modifier, tid.modified,
				tid.tags, tid.fields, false, tid.created, tid.creator);
			// 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);
			// temporary workaround for IE.
			$.twStylesheet.remove({ id: "StyleSheetColors" });
			$.twStylesheet.remove({ id: "StyleSheet" });
			refreshAll();
			macro.reportChange();
			return tid;
		},
		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);
				}
			}
		}
	};
	var btnMacro = config.macros.RandomColorPaletteButton = {
			text: "New ColorPalette",
			tooltip: "Generate a random colour scheme for your TiddlyWiki",
			makeButton: function(place, options) {
				var btnHandler = function(ev) {
					var t = $(ev.target);
					var options = t.data("options");
					macro.generatePalette(options, true);
					ev.preventDefault();
					return false;
				};
				var btn = createTiddlyButton(place, this.text, this.tooltip, btnHandler);
				$(btn).data("options", options);
				return btn;
			},
			handler: function(place, macroName, params, wikifier, paramString, tiddler) {
				var options = macro.getOptions(paramString);
				btnMacro.makeButton(place, options);
			}
	};
})(jQuery);
//}}}
/***
|''Name''|RefreshTiddlerCommand|
|''Version''|0.3.0|
***/
//{{{
(function($) {

var cmd = config.commands.refreshTiddler = {
	text: "refresh",
	locale: {
		refreshing: "Refreshing tiddler..."
	},
	tooltip: "refresh this tiddler to be the one on the server",
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(!tiddler) {
			tiddler = new Tiddler(title);
			merge(tiddler.fields, config.defaultCustomFields);
		}
		$(story.getTiddler(title)).find(".viewer").
			empty().text(cmd.locale.refreshing);
		var dirtyStatus = store.isDirty();
		story.loadMissingTiddler(title, {
			"server.workspace": tiddler.fields["server.recipe"]  ? "recipes/" + tiddler.fields["server.recipe"] :
				tiddler.fields["server.workspace"] || "bags/"+tiddler.fields["server.bag"],
			"server.host": tiddler.fields["server.host"],
			"server.type": tiddler.fields["server.type"]
		}, function() {
			store.setDirty(dirtyStatus);
		});
	}
};

})(jQuery);
//}}}
<<activity show:reply show:notify>>
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'></div>
	</span>
	<span class='modifierIcon'
		macro='view modifier SiteIcon label:no height:48 width:48 preserveAspectRatio:yes'>
	</span>
	<div class='toolbar'
		macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes height:48 width:48 more:popup'>
	</div>
	<div class='tagClear'></div>
</div>
<div class='content'>
	<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
	<div class='tidTags' macro='tags'></div>
	<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.3|
|''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) {
		title = this.stripSuffix("rev", title);
		title = this.stripSuffix("diff", title);
		var tiddler = store.getTiddler(title);
		var type = _getField("server.type", tiddler);
		var adaptor = new config.adaptors[type]();
		var limit = null; // TODO: customizable
		var context = {
			host: _getField("server.host", tiddler),
			workspace: _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);
	},

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

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

})(jQuery);
//}}}
My children:
SampleTagChild
AnotherTag
MainMenu
/*{{{*/
var $ = jQuery;

config.macros.searchBox = {
	handler: function(place, macroName, params) {
		// add choice for searching all manuals	
		$(place).append('<div class="allManuals"> \
			<label for="allManuals">Search all manuals</label> \
			<input type="checkbox" id="allManuals" /> \
		</div>');
	
		var $input = $('<input type="search" results="5" accessKey="4" autocomplete="off" autosave="unique" name="s" placeholder="Search" lastSearchText="" />').appendTo(place),
			$clearButton = $('<button id="clearSearch">&#215;</button>'),
			input = $input.get(0);
		if(config.browser.isSafari) {
			$input.css({
				height: '28px',
				width: '230px',
				'background-image': 'none',
				'-webkit-appearance': 'none'
			});
		} else {
			$clearButton.appendTo(place)
				.click(function() {
					var $searchBox = $('#searchBox');
					$clearButton.hide();
					$('#searchResults').empty(); // TO-DO: make this happen when clear button is pressed in safari
					$input.val('').click().focus();
				});
			$input.keyup(function() {
				if($(this).val()) {
					$('#clearSearch').show();
				} else {
					//$('#clearSearch').click();
				}
			});
		}

		input.onfocus = config.macros.search.onFocus;
		
		$('#searchResults').live('click', function(e) {
			if(e.target.nodeName==="LI") {
				$(e.target).toggleClass("open");
			}
			return true;
		});
		
		$('#allManuals').change(function() {
			config.macros.search.doSearch(input);
		});
		
		/*
		this is adding specific behaviour that happens before click on panels are processed
		if click on input and there are search results, add noToggle
		if click on input and there are no search results, remove noToggle
		if keyup and there is nothing in the search string, click on input
		*/
		
		/* 
		search box behaviours v2 (as per Oct 4th 2012):
		- when clear button clicked
		-- close panel
		-- empty search input
		-- empty results list
		- when term searched for
		-- open panel
		-- empty results list
		-- show search results
		- click on input
		-- if results, show results

		*/
		
		$input.click(function() {
			var $searchBox = $('#searchBox'),
				$ul = $('#searchBox').find('ul.browsingTool'),
				$results = $ul.children('li, span'),
				isBlank = !$input.val(),
				isEmpty = !$results.length,
				panelClosed = $searchBox.hasClass('closed');
			//console.log('input click', 'val: '+$input.val(), 'panelClosed: '+panelClosed, 'isBlank: '+isBlank, 'isEmpty: '+isEmpty);
			//if((panelClosed && !isEmpty) || (!panelClosed && isBlank)) {
			if(panelClosed && isEmpty) {
				// if the panel is closed and there are no search results, don't allow the panel to be opened
				$searchBox.addClass('noToggle');
			} else if(!panelClosed && !isBlank || panelClosed && isBlank) {
				// if the panel is open and there is something in the input box, don't allow the panel to be closed
				// if the panel is closed and there is nothing in the input box, don't allow the panel to be opened
				$searchBox.addClass('noToggle');
			} else {
				$searchBox.removeClass('noToggle');
			}
			if(isBlank) {
				// erase last search history so we can trigger a new search later
				$input.attr('lastSearchText','');
			}
			
		}).keyup(function(e) {
			// if we've started typing without clicking on the search box, it won't have opened
			if($('#searchBox').hasClass('closed')) {
				$input.click();
			}
			// if empty, click to close
			if(!$input.val()) {
				$('#searchBox').find('ul.browsingTool li').remove();
				$input.click();
			} else {
				config.macros.search.onKeyPress.call(input, e);
			}
		});
		
		$('<ul class="browsingTool" id="searchResults"></ul>').appendTo(place);
	}
};

/* aiming for:
<input type="text" placeholder="Search" />
<button id="clearSearch">&#215;</button>
<ul class="browsingTool">
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
	<li><a href="#">Object</a></li>
</ul>
*/

//--
//-- Search macro
//--

config.macros.search.handler = function(place,macroName,params)
{
	var searchTimeout = null;
	var btn = createTiddlyButton(place,this.label,this.prompt,this.onClick,"searchButton");
	var txt = createTiddlyElement(null,"input",null,"txtOptionInput searchField");
	if(params[0])
		txt.value = params[0];
	if(config.browser.isSafari) {
		txt.setAttribute("type","search");
		txt.setAttribute("results","5");
	} else {
		txt.setAttribute("type","text");
	}
	place.appendChild(txt);
	txt.onkeyup = this.onKeyPress;
	txt.onfocus = this.onFocus;
	txt.setAttribute("size",this.sizeTextbox);
	txt.setAttribute("accessKey",params[1] || this.accessKey);
	txt.setAttribute("autocomplete","off");
	txt.setAttribute("lastSearchText","");
};

config.macros.search.elsewhereSearch = function(text) {
	var url = '/search.json?q=%0'.format(encodeURIComponent(text)),
		$ = jQuery,
		whitelist = store.getTiddler('AMBIT community of practice - members').text.split('\n'),
		bagFilters = [];
	$('#searchResults li.loading').show();
	$.each(whitelist, function(i, line) {
		var pieces = line.split(':'),
			space = pieces[0],
			url = pieces[1];
		bagFilters.push("bag:"+space+"_public");
	});
	url += "%20("+bagFilters.join(" OR ")+")";
		
	$.ajax({
		url: url,
		dataType: "json",
		success: function(tiddlers) {
			tiddlers = $.grep(tiddlers, function(t, i) {
				return t.bag.indexOf('ambit')!==-1 && t.bag!==tiddler.fields['server.bag'];
			});
			var count = tiddlers.length;
			if(count) {
				config.extensions.AmbitSearchPlugin.displayElsewhereResults(tiddlers);
			} else {
				$('#searchResults li.loading').text('no results found in other manuals');
			}
		},
		error: function() {
			// show error
			$('#searchResults li.loading').hide();
		}
	});
}

// Global because there's only ever one outstanding incremental search timer
config.macros.search.timeout = null;

config.macros.search.doSearch = function(txt)
{
	if(txt.value.length > 0) {
		story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
		if($('#searchBox input[type=checkbox]').prop('checked')) {
			config.macros.search.elsewhereSearch(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
		}
		txt.setAttribute("lastSearchText",txt.value);
	}
};

config.macros.search.onClick = function(e)
{
	config.macros.search.doSearch(this.nextSibling);
	return false;
};

config.macros.search.onKeyPress = function(ev)
{
	var e = ev || window.event;
	switch(e.keyCode) {
		case 13: // Ctrl-Enter
		case 10: // Ctrl-Enter on IE PC
			config.macros.search.doSearch(this);
			break;
		case 27: // Escape
			this.value = "";
			clearMessage();
			break;
	}
	if(config.options.chkIncrementalSearch) {
		if(this.value.length > 2) {
			if(this.value != this.getAttribute("lastSearchText")) {
				if(config.macros.search.timeout)
					clearTimeout(config.macros.search.timeout);
				var txt = this;
				config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
			}
		} else {
			if(config.macros.search.timeout)
				clearTimeout(config.macros.search.timeout);
		}
	}
	return true;
};

config.macros.search.onFocus = function(e)
{
	this.select();
};



/*}}}*/
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!!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"]) { // XXX: server.host could be empty string
			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;
	}
	var context = {
		host: tiddler.fields["server.host"],
		workspace: tiddler.fields["server.workspace"],
		tiddler: tiddler
	};
	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);
//}}}

<<newTiddler label:"new html file" fields:"server.content-type:text/html" text:"<html>
<head></head>
<body>
<script type='text/javascript' src='http://tiddlyspace.com/bags/console/tiddlers/jquery.min.js'></script> 
</body>
</html>">>
<<newTiddler label:"new javascript file" fields:"server.content-type:text/javascript">>
<<newTiddler label:"new css file" fields:"server.content-type:text/css">>
<<newTiddler label:"new cache manifest" fields:"server.content-type:text/cache-manifest">>
<<newTiddler label:"new tiddler">>
<<binaryUpload>>
<<closeAll>>

All files
<<timeline "created" "" "" template:TimelineType filter:'[is[local]]'>>
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

a TiddlySpace
ambit-theme-v3
!Upload an icon
<<tiddler spaceIcon>>
!Describe your space
If you haven't already done so, you should provide a brief decscription of yourself and what you're using this space for. To do this, just edit the [[SiteInfo]] tiddler (keeping the title the same of course).

!Change the title
<<tiddler spaceTitle>>
!Change the theme
<<tiddler colorScheme>>
!Change the menu
If you'd like to change the menu items along the top, you can edit the [[MainMenu]] tiddler.

!Change the default tiddlers
<<tiddler setDefaultTiddlers>>
!More Advanced customisations
If you know HTML and CSS, you can edit some or all of the following tiddlers to customise your space further:
* PageTemplate
* EditTemplate
* ViewTemplate
* StyleSheet
Click the "new tiddler" button towards the top right of the screen to write something in your space. You'll need to give it a title, some content and, optionally, some tags that will help you identify it later.

!Stuck for ideas?
Not sure what to write about? Not sure what to keep in your space? Other people use ~TiddlySpace for almost anything. How about some of the following:

* [[Save interesting sites|http://bookmarks.tiddlyspace.com]], images or articles from around the web so that you can refer back to them.
* [[Record your family tree|http://familytree.tiddlyspace.com]], store notes on long lost relatives or ancestors and map their relationship to you.
* [[Make up a pocketbook|http://pocketbook.tiddlyspace.com]] to store some useful information in, then print it out, [[fold it up|http://www.pocketmod.com/]], and take it with you.
* [[Plan your holiday|http://the-web-is-your-oyster.tiddlyspace.com/]], record where you're planning to go, note down places of interest and refer back to it later.
* [[Create a mindmap|http://mindmaps.tiddlyspace.com/]] to visualise your inner thoughts and see how they relate to each other.
* [[Set up a questionnaire|http://questionnaire.tiddlyspace.com/]] and get all your friends to answer it.

If you don't like any of those ideas, you can still use this space directly to keep notes and link them together, make a todo list and keep track of everything you're doing, or any one of a hundred million other things.

Still stuck? Check out the @featured space for more suggestions.

You can also [[socialise with others|How to socialise]].
/* 

This CSS file contains all the generic CSS framework stuff.
Combined into one file to reduce http calls, could be reduced further later eg. by removing unused elements.

1. Reset.css
2. Grid.css
3. Jbase.css
4. Stickyfooter.css


reset.css from http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	font-weight: inherit;
	font-style: inherit;
	font-size: 100%;
	font-family: inherit;
	vertical-align: baseline;
}
/* remember to define focus styles! */
:focus {
	outline: 0;
}
body {
	line-height: 1;
	color: black;
	background: white;
}
ol, ul {
	list-style: none;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
	border-collapse: separate;
	border-spacing: 0;
}
caption, th, td {
	text-align: left;
	font-weight: normal;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: "";
}
blockquote, q {
	quotes: "" "";
}


/*
.....................................

TiddlySpace specific resets
(using #displayArea to avoid unstyling the backstage)

.....................................
*/

#displayArea #sidebar {
	font-size: 100%;
	right: auto;
}

#displayArea {
	margin: 0;
}

.tiddler {
	padding: 0;
}

a:hover {
	background-color: transparent;
	color: black;
}

#displayArea .title {
	font-size: 100%;
	font-weight: normal;
}


#displayArea h1, h2, h3, h4, h5, h6 {
	border: none;
	color: inherit;
	/* font-weight: normal;
	margin: 0;
	padding: 0; */
}

#displayArea .viewer br {
	margin-bottom: 24px;
	content: '';
	display: block;
}

#app-picker, #backstageButton {
	visibility: hidden;
	display: none;
}

#backstageArea {
	display: none;
    height: 28px;
    left: 0;
    position: absolute;
    top: 0;
    width: 100%;
}

.externalLink {
	text-decoration: none;
}

.viewer h1 {
	font-size: 32px;
    line-height: 36px;
    margin: 0px 0px 12px;
}

.viewer h2 {
	font-size: 28px;
	line-height: 30px;
	margin-bottom: 14px;
	padding-top: 4px;
}

.viewer h3 {
	font-size: 24px;
	line-height: 30px; 		
	margin-bottom: 13px;
	padding-top: 5px;
}

.viewer h4 {
	font-size: 20px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;	
}

.viewer h5 {
	font-size: 18px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;
}

.viewer h6 {
	font-size: 14px;
	line-height: 24px;		
	margin-bottom: 12px; 	
}

.viewer {
	line-height: 24px;
	padding: 0;
}

.title {
	color: #303030;
}

/*

.....................................

jBase - Grid 

http://www.withjandj.com/jbase
https://github.com/Joshuwar/fragments

Licensed under GPL and MIT.	

.....................................

TO-DO

- check ie6 & ie7 are compatible with row system (if not, make sure it doesn't break anything else!)
	- will require selectivizr
	- maybe only support this feature in modern browsers

		

		Generic & Global
		
................................................................................................ */

.grid1col, 
.grid2col, 
.grid3col, 
.grid4col, 
.grid5col, 
.grid6col, 
.grid7col, 
.grid8col, 
.grid9col, 
.grid10col, 
.grid11col, 
.grid12col {
/* 
	keep this here in case you need to apply something to all column sizes
*/ 
}

body {
	min-width: 960px;
}



/* 		Basic Columns

................................................................................................ */

.grid1col {
	width:60px;
}

.grid2col {
	width:140px;
}

.grid3col {
	width:220px;
}

.grid4col {
	width:300px;
}

.grid5col {
	width:380px;
}

.grid6col {
	width:460px;
}

.grid7col {
	width:540px;
}

.grid8col {
	width:620px;
}

.grid9col {
	width:700px;
}

.grid10col {
	width:780px;
}

.grid11col {
	width:860px;
}

.grid12col {
	width:940px;
}


/* 		Columns with boxes

................................................................................................ */

.grid1col.box, .ie6 .grid1col-box {
	width: 20px;
}

.grid2col.box, .ie6 .grid2col-box {
	width: 100px;
}

.grid3col.box, .ie6 .grid3col-box {
	width: 180px
}

.grid4col.box, .ie6 .grid4col-box {
	width: 260px
}

.grid5col.box, .ie6 .grid5col-box {
	width: 180px
}

.grid6col.box, .ie6 .grid6col-box {
	width: 420px;
}

.grid7col.box, .ie6 .grid7col-box {
	width: 500px
}

.grid8col.box, .ie6 .grid8col-box {
	width: 580px;
}

.grid9col.box, .ie6 .grid9col-box {
	width: 660px;
}

.grid10col.box, .ie6 .grid10col-box {
	width: 740px
}

.grid11col.box, .ie6 .grid11col-box {
	width: 820px
}

.grid12col.box, .ie6 .grid12col-box {
	width: 900px;
}






/* 			Boxes within Boxes 

................................................................................................ */


.box .grid1col.box {
	width: 0px;
}

.box .grid2col.box {
	width: 80px;
}

.box .grid3col.box {
	width: 160px
}

.box .grid4col.box {
	width: 240px; 
}

.box .grid5col.box {
	width: 320px
}

.box .grid6col.box {
	width: 400px;
}

.box .grid7col.box {
	width: 480px
}

.box .grid8col.box {
	width: 560px
}

.box .grid9col.box {
	width: 640px;
}

.box .grid10col.box {
	width: 720px
}

.box .grid11col.box {
	width: 800px
}

.box .grid12col.box {
	width: 880px;
}




/*			Rows of Boxes 
			(uses first/last-child pseudo elements to push rows of boxes within boxes back onto the grid)

................................................................................................ */

.row {
	overflow: hidden;
}

.row .grid1col.box {
	width: 20px;
}

.row .grid2col.box {
	width: 100px;
}

.row .grid3col.box {
	width: 180px
}

.row .grid4col.box {
	width: 260px; 
}

.row .grid5col.box {
	width: 340px
}

.row .grid6col.box {
	width: 420px;
}

.row .grid7col.box {
	width: 500px
}

.row .grid8col.box {
	width: 580px
}

.row .grid9col.box {
	width: 660px;
}

.row .grid10col.box {
	width: 740px
}

.row .grid11col.box {
	width: 820px
}

.row .grid12col.box {
	width: 900px;
}

.row > .grid1col.box:first-child, .row > .grid1col.box:last-child {
	width: 0px;
}

.row > .box.grid2col:first-child, .row > .grid2col.box:last-child {
	width: 80px;
}

.row > .grid3col.box:first-child, .row > .grid3col.box:last-child {
	width: 160px;
}

.row > .grid4col.box:first-child, .row > .grid4col.box:last-child {
	width: 240px;
}

.row > .grid5col.box:first-child, .row > .grid5col.box:last-child {
	width: 320px;
}

.row > .grid6col.box:first-child, .row > .grid6col.box:last-child {
	width: 400px;
}

.row > .grid7col.box:first-child, .row > .grid7col.box:last-child {
	width: 480px;
}

.row > .grid8col.box:first-child, .row > .grid8col.box:last-child {
	width: 560px;
}

.row > .grid9col.box:first-child, .row > .grid9col.box:last-child {
	width: 640px;
}

.row > .grid10col.box:first-child, .row > .grid10col.box:last-child {
	width: 720px;
}

.row > .grid11col.box:first-child, .row > .grid11col.box:last-child {
	width: 800px;
}

.row > .grid12col.box:first-child, .row > .grid12col.box:last-child {
	width: 880px;
}


/*			Modifiers

................................................................................................ */


.marginleft {
	margin-left:20px;
}

.marginright {
	margin-right:20px;
}

.left {
	float: left;
}

.right {
	float: right;
}

.clearboth {
	clear: both;
	display: block;
	overflow: hidden;
	visibility: hidden;
	width: 0;
	height: 0;
}

.alignright {
	text-align: right;
}

.alignleft {
	text-align: left;
}

.aligncentre {
	text-align: center;
}

/*			Box modifiers

................................................................................................ */


.right.outbox, .outboxright {
	margin-right: -10px;
	padding: 12px 10px;
	margin-left: 0px;
}

.outbox, .outboxleft {
	margin-left: -10px;
	padding: 12px 10px;
	margin-right: 0px;
}


.box {
	padding: 12px 20px 12px;
	margin-bottom: 24px;
}


/* browser fixes */

.ie6.box {
	width: auto;
}



/*

.....................................

jBase - Baseline & Typographic defaults 

http://www.withjandj.com/jbase
https://github.com/Joshuwar/fragments

Licensed under GPL and MIT.	

.....................................


		TO-DO
		
................................................................................................

- a jquery  script which checks out <p>s within an element of a certain class, checks their height, and then extends their bottom margin to the nearest multiple of 24px - so that new paragraphs come back in rhythm 

- fix the 'p.large' baseline (1px out of step) 

- forms

- buttons (?)

- image (& caption?) sizes, boxes etc

- Sort out the push/pull controllers with the .small and .large modifiers (padding overriden etc) - try to do this without conditional combinators... ?

*/



/*		Generic & Global
		
................................................................................................ */


body {
	font-size: 15px;
	line-height: 24px;
	position: relative;
}

html {
}

.jbasewrap {
	width: 960px;
	margin: auto;
	position: relative;
	padding: 0px 20px;
}

a {
	text-decoration: underline;
}




/*		Typography 

................................................................................................ */

p {
	margin-bottom: 24px;	
}

.smallcaps {
	font-variant: small-caps;
}

strong {
	font-weight: bold;
}

del {
	text-decoration: line-through;
}

dfn {
	font-weight: bold;
}

em, dfn {
	font-style: italic;	
}

address {
	font-style: italic;
}

pre, code, tt {
	font-family: 'andale mono','lucida console',monospace;
}

abbr, acronym {
	border-bottom: 1px dotted;
}

table {
	margin-bottom: 24px;
}

th {
}

ul, ol {
	margin: 0 0 24px 24px;
	
}

ul li, ol ul li {
	list-style: disc;
}

ol li, ul ol li {
	list-style: decimal;
}

li ul, li ol {
	margin: 0 0 0 24px;
} 


dl {
	margin-bottom: 24px;
}

dl dt {
	font-weight: bold;
}

dd {
	margin-left: 24px;
}

blockquote {
	font-style: italic;
	padding-left: 24px;
}

hr {
	border: none;
	height: 1px; 
	color: #858585;
	background: #858585;
	margin: -1px 0 12px 0;
}

p.small, span.small, ul.small, ol.small, blockquote.small {
	font-size: 12px;
	line-height: 18px;
	padding: 3px 0px; 
}

p.large, span.large, ul.large, ol.large, blockquote.large  {
	font-size: 20px;
    line-height: 30px;
    margin: -5px 0 23px;
    
}

sup {
	vertical-align: top;
	font-size: 12px;
}
sub {
	vertical-align: bottom;
	font-size: 12px;
}

h1, h2, h3, h4, h5, h6 {
	font-weight: normal;
}


h1 {
	font-size: 32px;
    line-height: 36px;
    margin: 0px 0px 12px;
}

h2 {
	font-size: 28px;
	line-height: 30px;
	margin-bottom: 14px;
	padding-top: 4px;
}

h3 {
	font-size: 24px;
	line-height: 30px; 		
	margin-bottom: 13px;
	padding-top: 5px;
}

h4 {
	font-size: 20px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;	
}

h5 {
	font-size: 18px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;
}

h6 {
	font-size: 14px;
	line-height: 24px;		
	margin-bottom: 12px; 	
}




h1.large {
	font-size: 40px;
    line-height: 54px;
    margin: 0 0 12px;
    padding-top: 0;
}

h2.large {
	font-size: 32px;
    line-height: 36px;
    margin: 0px 0px 12px;
    padding-top: 0px
}

h3.large {
	font-size: 28px;
	line-height: 30px;
	margin-bottom: 14px;
	padding-top: 4px;
}

h4.large {
	font-size: 24px;
	line-height: 30px; 		
	margin-bottom: 13px;
	padding-top: 5px;
}

h5.large {
	font-size: 20px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;
}

h6.large {
	font-size: 18px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;	
}



h1.small {
	font-size: 28px;
	line-height: 30px;
	margin-bottom: 14px;
	padding-top: 4px;
}

h2.small {
	font-size: 24px;
	line-height: 30px; 		
	margin-bottom: 13px;
	padding-top: 5px;
}

h3.small {
	font-size: 20px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;
}

h4.small {
	font-size: 18px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;
}

h5.small {
	font-size: 14px;
	line-height: 24px;		
	margin-bottom: 12px; 
	padding-top: 0px
}

h6.small {
	font-size: 12px;
	line-height: 24px;		
	margin-bottom: 12px; 
}


h1.fixed, h2.fixed, h3.fixed, h4.fixed, h5.fixed, h6.fixed{
	font-size: 14px;
	line-height: 24px;		
	margin-bottom: 12px; 
	padding-top: 0px
}




/*			Div Modifiers 

................................................................................................ */

.push1 {
	padding-top: 6px;
}

.push2 {
	padding-top: 12px;
}

.push3 {
	padding-top: 18px;
}

.push4 {
	padding-top: 24px;
}

.pull1 {
	margin-top: -6px;
}

.pull2 {
	margin-top: -12px;
}

.pull3 {
	margin-top: -18px;
}

.pull4 {
	margin-top: -24px;
}


/* NEED to find a better way of doing this with small/large p's etc  - JB */

p.small.push2, span.small.push2, ul.small.push2, ol.small.push2, blockquote.small.push2 {
	padding-top: 15px;
}

.margintop {
	margin-top: 24px;
}
.marginbottom {
	margin-bottom: 24px;
}
.marginbottomsmall {
	margin-bottom: 12px;
}
.margintopsmall {
	margin-top: 12px;
}

.padtop {
	padding-top: 24px;
}

.padtopsmall {
	padding-top: 12px;
}

.padbottom {
	padding-bottom: 24px;
}
.padbottomsmall {
	padding-bottom: 12px;
}

.borderbottom {
	border-bottom: 1px solid #ccc;
	margin-bottom: 23px; /* JB - this may need modifiers for h1-6 and others, if that becomes necessary */ 

}
.bordertop {
	border-top: 1px solid #ccc;
	margin-top: -1px;
}
.bartop {
	border-top: 6px solid #ccc;
}
.barbottom {
	border-bottom: 6px solid #ccc;
}

.overflow {
	overflow: hidden;
}


::selection			{ background:#ff5656; color:#fff; }
::-moz-selection	{ background:#ff5656; color:#fff; }



/*			Forms 
................................................................................................ */




/*			Buttons 

................................................................................................ */





/* thanks Ryan Fait - http://ryanfait.com/sticky-footer/ */
* {
	margin: 0;
}
html, body {
	height: 100%;
}
#wrapper {
	min-height: 100%;
	height: auto !important;
	height: 100%;
	margin: 0 auto -207px;
}

#footer {
	height: 183px;
	padding-top: 24px;
}

.push {
	height: 207px;
}
/* 

AMBIT theme v3.5
designed by J&J


Palette:
Red			#ff2b2b;
off-white:	#fcfcfc;
dark grey:	#303030;

*/


/* 
----------------------------------- Generic
*/

body {
	font-family: "Helvetica Neue", Helvetica;
	background: #ddb78c;
	background-image: url(wood-texture.jpg);
	background-attachment: fixed;
	color: #303030;
}

a {
	text-decoration: none;
	color: #ff2b2b;
}

a:hover {
	text-decoration: underline;
}

#displayArea iframe {
	height: 340px;
	width: 100%;
}

#displayArea button, #displayArea a.button, #popup button, #popup a.button {
	font-size: 11px;
	font-family: "Helvetica Neue", Helvetica;
	font-weight: bold;
	letter-spacing: 0.04em;
	border: 1px solid #dadada;
	line-height: 30px;
	padding: 0px 6px;
	color: #303030;
	
  -webkit-border-radius: 2px; 
     -moz-border-radius: 2px; 
          border-radius: 2px;       
  -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 
  
	background: #eeeeee;
	background: -moz-linear-gradient(top,  #ffffff 0%, #f3f3f3 14%, #ededed 51%, #eaeaea 97%, #e0e0e0 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(14%,#f3f3f3), color-stop(51%,#ededed), color-stop(97%,#eaeaea), color-stop(100%,#e0e0e0));
	background: -webkit-linear-gradient(top,  #ffffff 0%,#f3f3f3 14%,#ededed 51%,#eaeaea 97%,#e0e0e0 100%);
	background: -o-linear-gradient(top,  #ffffff 0%,#f3f3f3 14%,#ededed 51%,#eaeaea 97%,#e0e0e0 100%);
	background: -ms-linear-gradient(top,  #ffffff 0%,#f3f3f3 14%,#ededed 51%,#eaeaea 97%,#e0e0e0 100%);
	background: linear-gradient(top,  #ffffff 0%,#f3f3f3 14%,#ededed 51%,#eaeaea 97%,#e0e0e0 100%);
	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e0e0e0',GradientType=0 );
	
	
}

#displayArea button:hover, #displayArea a.button:hover, #popup button:hover, #popup a.button:hover {
	border-color: #999;
	cursor: pointer;
	-webkit-box-shadow: 0px 1px 2px #c8c8c8; 
	-moz-box-shadow: 0px 1px 2px #c8c8c8; 
	box-shadow: 0px 1px 2px #c8c8c8; 
	background: #f5f5f5;
	text-decoration: none;
}

#displayArea button:active, #displayArea a.button:active, #popup button:active, #popup a.button:active {
	box-shadow: none;
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	border: #ccc 1px solid;
}

a.button {
	display: inline-block;
}

#displayArea .noButton a.button {
	border: none;
	background: transparent;
	display: inline;
	filter: none;
	text-decoration: none;
	color: #ff2b2b;
	font: inherit;
	padding: 0px;
	letter-spacing: inherit; 
}

#displayArea .noButton a.button:hover, #displayArea .noButton a.button:active {
	-webkit-box-shadow: none; 
	-moz-box-shadow: none; 
	box-shadow: none; 
	border: none;
	background: none;
	color: #303030;
	text-decoration: underline;
}


#screenWidth {
	position: absolute;
	z-index: 0;
	left:330px;
}

#tiddlerAIM_Form div.error {
	background-color: #EF6565;
    color: white;
    display: block;
    font-weight: bold;
    letter-spacing: 0.08em;
    margin: auto;
    padding: 5px 10px;
    text-align: center;
    font-size: 12px;
}

.highlight {
	background: #fbff9a;
}

/* 
----------------------------------- Sidebar
*/

#sidebar {
	background-color: #303030;
	color: #fcfcfc;
	position: fixed;
	height: 100%;
	width: 230px;
	padding: 20px;
	z-index: 10;
}

#sidebar #SiteIcon {
	display: block;
	margin-bottom: 9px;
}

#sidebar h1 {
	font-size: 13px;
	line-height: 20px;
}

div#searchBox {
	background-color: #303030;
	margin-bottom: 10px;
}

#searchBox ul {
	margin: 1px 0px 10px 0px;
	padding-left: 24px;
	background-color: #fcfcfc;
}

ul#searchResults {
	padding-left: 0px;
}

ul#searchResults li.loading {
	font-weight: normal;
	font-size: 10px;
	background-image: none;
	cursor: default;
	display: none;
}

ul#searchResults li.loading:hover {
	color: #777;
}

ul#searchResults li {
	list-style: none;
	font-weight: bold;
	color: #777;
	border-bottom: 1px dotted #777;
	background-image: url(v3sprite.png);
	filter:none;
	background-repeat: no-repeat;
	background-position: 195px -593px;
	cursor: pointer;	
	line-height: 16px;
	padding: 0px 0px 5px 10px;
	margin-top: 3px;
}

ul#searchResults li:hover {
	color: #303030;
}

ul#searchResults li.open {
	background-position: 195px -692px;
}

ul#searchResults ul {
	display: none;
}

ul#searchResults .open ul {
	display: block;
}

ul#searchResults ul li {
	list-style: disc;
	color: #303030;
	padding-left: 0px;
	border-bottom: none;
	background-image: none;
}

#searchBox h3 {
	margin: 0px 0px 0px 0px;
	background-color: #fcfcfc;
	font-size: 11px;
	padding: 0px 0px 0px 10px;
	letter-spacing: 0.08em;
	color: #aaa;
}

#searchBox div.allManuals {
	text-align: right;
	overflow: hidden;
	height: 18px;
}

#searchBox .allManuals label {
	color: white;
	font-size: 10px;
	letter-spacing: 0.05em;
}

#searchBox input[type=search] {
	background-color: #fcfcfc;
	border: none;
	width: 220px;
	height: 18px;
	padding: 5px;
	font-weight: bold;
	font-family: Helvetica Neue;
	font-size: 13px;
	margin-top: 10px;
	background-image: url(v3sprite.png);
	filter:none;
	background-position: 209px -42px;
	background-repeat: no-repeat;
	margin-bottom: 0px;
}

#searchBox button#clearSearch {
	background: none;
	filter: none;
	position: absolute;
	width: 20px;
	height: 20px;
	border: none;
	opacity: 0.6;
	right: 45px;
	top: 211px;
	font-size: 17px;
	line-height: 17px;
}

#searchBox button#clearSearch:hover {
	background: none;
	border: none;
	box-shadow: none;
	opacity: 1;
}

#sidebar .panel h2 {
	font-size: 15px;
	margin: 0px;
	border-top: 1px #fff solid;
	background-color: #303030;
	padding: 0px;
	background-image: url(v3sprite.png);
	filter:none;
	background-position: 5px -437px;
	background-repeat: no-repeat;
	position: relative;
}

#sidebar .panel h2 a {
	color: #fcfcfc;
	display: block;
	padding: 0px 0px 0px 20px;
}

#sidebar button#snapshot { /* camera image from The Noun Project  http://thenounproject.com/noun/camera/#icon-No476 */
	background-position: 7px -992px;
	background-image: url(v3sprite.png);
	filter:none;
	background-repeat: no-repeat;
	display: block;
	text-indent: -999px;
	width: 30px;
	height: 30px;
	cursor: pointer;
	z-index: 100;
	position: absolute;
	right: 0px;
	top: 0px;
	padding: 0px;
	border: none;
	background-color: transparent;
}

#sidebar #snapshot:hover {
	opacity: 0.6;
	-webkit-box-shadow: none; 
	-moz-box-shadow: none; 
	box-shadow: none; 
}

#sidebar .panel h2 a:hover {
	text-decoration: none;
}

#sidebar .closed ul {
	height: 0px;
}

#sidebar .closed {
	padding: 0px; 
}

#sidebar .closed h2 {
	padding: 0px; 
	background-position: 5px -391px;
}

.panel {
	color: #303030;
	font-size: 12px;
	background-color: #fcfcfc;
}

.panel ul {
	margin-bottom: 0px;
	padding: 0px;
	overflow-y: auto;
	position: relative;
}

.panel ul ul {
	overflow: auto;
	height: auto;
}


#sidebar .panel a {
	color: #303030;
}

.open {
}

#sidebar a {
	color: #fcfcfc;
}

#sidebar #currentlyOpenPanel li span.close {
	padding-right: 10px;
	position: relative;
	top: -1px;
	font-size: 13px;
}

#sidebar #currentlyOpenPanel li span.close:hover {
	cursor: pointer;
	color: #ff2b2b;
}

#sidebar #contentsPanel ul {
	margin-left: 20px;
	padding-left: 20px;
	line-height: 15px;
}

#sidebar #contentsPanel ul ul {
	margin-left: 0px;
	overflow: hidden;
}

#sidebar #contentsPanel li {
	list-style: none;
	margin-top: 10px;
}

#sidebar #contentsPanel li span.closed:after, #sidebar #contentsPanel li span.open:after {
	content: '+';
	float: left;
	width: 10px;
	height: 10px;
	font-weight: bold;
	padding-right: 10px;
	position: relative;
	top: -1px;
	background-color: #fcfcfc;
	text-decoration: none;
	padding-bottom: 4px;
	margin-left: -20px;
}

#sidebar #contentsPanel li span.open:after {
	content: '-';
}

#sidebar #contentsPanel li span:hover {
	cursor: pointer;
	color: #ff2b2b;
}



/* 
----------------------------------- Status and Sync Panels 
*/

#rightPanel {
	position: fixed;
	right: 0px;
	top: 30px;
	width: 210px;
	z-index: 1;
}

#statusPanel, #syncPanel, #messageArea, #loginForm {
	position: relative;
	width: 210px;
	top: 0px;
	background-color: rgba(241, 241, 241, 0.8);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#E5FBFBFB,endColorstr=#E5FBFBFB)"; /* IE8 */    
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#E5FBFBFB,endColorstr=#E5FBFBFB);   /* IE6 & 7 */      
	zoom: 1;
	font-size: 12px;
	padding-left: 10px;
	font-weight: bold;
	z-index: 10;
}

.ie7 #statusPanel, .ie7 #syncPanel, .ie7 #messageArea, .ie7 #loginForm {
	border: 1px 0px 1px 1px #303030 solid;
}

#loginForm {
	margin-top: 20px;
	padding: 10px;
	font-weight: normal;
	font-size: 11px;
	letter-spacing: 0.04em;
	display: none;
}

#loginForm input { 
	margin-bottom: 10px;
	border: 1px solid #ccc;
	padding: 7px;
	width: 170px;
}

#statusPanel .title {
	width: 90px;
	display: inline-block;
}

#statusPanel a, #statusPanel #logOutForm input {
	background-image: url(v3sprite.png);
	filter:none;
	background-repeat: no-repeat;
	background-position: 90px -592px;	
	display: inline-block;
	width: 116px;
	height: 25px;
}

#statusPanel span.plain {
	float: right;
	margin-right: 20px;
}

#statusPanel span.plain a {
	background-image: none;
	width: auto;
}

#statusPanel #logOutForm input {
	font-size: 13px;
	font-weight: bold;
	font-family: 'Helvetica Neue', Helvetica;
	color: #ff2b2b;
	background-color: transparent;
	border: none;
	background-image: none;
	text-align: left;
}

#statusPanel a.open {
	background-position: 90px -692px;	
}

#statusPanel a:hover {
	text-decoration: none;
}

#statusPanel .dropDown {
	position: relative;
	background-color: transparent;
	width: 200px;
	padding-left: 84px;	
}

#statusPanel .dropDown {
	display: none;
}

#statusPanel a.browsing {
	color: #74c276;
}

#statusPanel .dropDown a {
	background-image: none;
	padding-left: 10px;
}

#statusPanel .dropDown a:hover, #statusPanel #logOutForm input:hover {
	background-color: #303030;
	color: #fff;
	cursor: pointer;
}

#statusTab {
	position: absolute;
	left: -30px;
	background-color: rgba(241, 241, 241, 0.8);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#E5FBFBFB,endColorstr=#E5FBFBFB)"; /* IE8 */    
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#E5FBFBFB,endColorstr=#E5FBFBFB);   /* IE6 & 7 */      
}

#statusTab:hover {
	border-left: 2px solid black;
	left: -32px;
}

#statusTab span {
	background-image: url("v3sprite.png");
	filter:none;
    background-position: 8px -1143px;
    background-repeat: no-repeat;
    text-indent: -9999px;
	width: 30px;
	height: 30px;
	display: block;
	cursor: pointer;
}

#statusTab span.browsing {
	background-position: 8px -1192px;
}

#syncPanel { 
	margin-top: 20px;
	padding-bottom: 10px;
	display: none;
}

#messageArea {
	margin: 0px;
	padding: 10px;
	border: none;
	line-height: 18px;
	font-size: 11px;
	letter-spacing: 0.06em;
	font-weight: normal;
	margin-top: 20px;
}

#messageArea div {
	margin-right: 20px;
}	

#messageArea .messageToolbar {
	text-align: left;
	padding: 0px;
}

#messageArea a.button {
	margin-bottom: 10px;
}

#messageArea a {
	text-decoration: none;		
}

#syncPanel h3 { 
	font-size: 13px;
	font-weight: bold;	
	padding-right: 10px;
	margin-bottom: 10px;
	line-height: 18px;
}

#syncPanel.error h3 {
	color: #ff2b2b;
}

#syncPanel.success h3 { 
	color: #74C276;
}

#syncPanel p { 
	font-size: 12px;
	line-height: 18px;
	font-weight: normal;
	padding-right: 10px;
	margin-bottom: 0px;
}

#syncPanel ul { 
	padding-right: 10px;
	margin: 8px 0px 10px 20px;
}

#syncPanel span {
	background-image: url("v3sprite.png");
	filter:none;
    background-position: 0 -749px;
    background-repeat: no-repeat;
    display: block;
    float: left;
    height: 15px;
    margin-top: 8px;
    margin-right: 5px;
    width: 15px;
    text-indent: -999px;
    overflow: hidden;
}

#syncPanel .negative span {
    background-position: 0 -799px;
    margin-top: 7px;
}

/* 
----------------------------------- Tiddler layout
*/

.jbasewrap {
	width: 720px;
}

#tiddlerDisplay {
	padding: 30px 0px;
	z-index: 1;	
}

.tiddler {
	background: #fcfcfc;
	position: relative;	
	margin-bottom: 40px;
	
  -webkit-box-shadow: 0px 1px 2px #000; 
     -moz-box-shadow: 0px 1px 2px #000; 
          box-shadow: 0px 1px 2px #000; 
}

.tiddler img {
	max-width: 620px;
	width: expression(this.width > 620 ? 620: true);
	height: auto;
}


.watermark {
	position: absolute;
	width: 220px;
	left: 490px;
	top: 40px;
	font-size: 12px;
}

.watermark .title {
	width: 80px;
	display: inline-block;
}

.watermark p {
	font-size: 11px;
	margin-top: -5px;
}

.tiddler h2 {
	font-size: 32px;
	font-weight: bold;
	padding-top: 40px;
	padding-left: 50px;
	width: 420px;
}

/* 
---------------------- AIM Form
*/


#tiddlerAIM_Form {
	background-color: #fffada;
}

#tiddlerAIM_Form .watermark, #tiddlerAIM_Form .infoToggle, #tiddlerAIM_Form .infoBorder {
	display: none;
}

#tiddlerAIM_Form .article {
	padding: 0px 0px 30px 0px;
	margin-top: 40px;
	position: relative;
	overflow: hidden;
}

#tiddlerAIM_Form .article.editor {
	padding: 40px 80px 30px 50px;
	margin-top: 0px;
}

#tiddlerAIM_Form .question {
	background-color: #fff297;
	width: 500px;
	padding: 20px 20px 40px;
	float: right;
}

.viewer ul.AIMmenu {
	float: left;
	width: 150px;
	margin: 50px 0px 0px 30px;
	font-size: 13px;
	padding-left: 0px;
	font-weight: bold;
}

.viewer ul.AIMmenu ul {
	margin: 0px;
	border-left: 2px solid #fff297;
	border-bottom: 2px solid #fff297;
	padding-left: 0px;
	display: none;
	font-weight: normal;
}

.viewer .AIMmenu li {
	list-style: none;
	overflow: hidden;
}

.viewer .AIMmenu li a {
	color: #333;
	line-height: 20px;
	padding: 10px 10px;
	display: block;
}

.viewer .AIMmenu ul li a {
	padding-left: 15px;
}

.viewer .AIMmenu li.done a {
	color: #5f973a;
}

.viewer .AIMmenu li.active {
	
}

.viewer .AIMmenu li.active a {
	background-color: #ffffff;
}

.viewer .AIMmenu li.active ul  a {
	background-color: transparent;
}

.viewer .AIMmenu li.active ul  li.active a {
	background-color: #fff5ad;
}

#tiddlerAIM_Form .navigation {
	position: absolute;
	width: 150px;
	left: 30px;
	top: 10px;
	text-align: center;
}

#tiddlerAIM_Form .navigation a {
	margin-right: 5px;
	padding-right: 20px;
	position: relative;
}

#tiddlerAIM_Form .navigation a.previous {
	padding: 0px 5px 0px 20px;
}

#tiddlerAIM_Form .navigation a span {
	background-image: url("v3sprite.png");
	filter:none;
    background-position: 0px -650px;
    background-repeat: no-repeat;
    display: block;
    position: absolute;
    width: 10px;
    height: 12px;
    text-indent: -999px;
    overflow: hidden;
    top: 9px;
    right: 3px;
}

#tiddlerAIM_Form .navigation a.previous span {
	background-position: 0px -849px;
	left: 8px;
}

#tiddlerAIM_Form .viewer h1, #tiddlerAIM_Form .viewer h2,  #tiddlerAIM_Form h3, #tiddlerAIM_Form h4, #tiddlerAIM_Form h5 {
	font-weight: bold;
	color: #333;
	letter-spacing: 0.02em;
}

#tiddlerAIM_Form .viewer h3, #tiddlerAIM_Form .viewer h2, #tiddlerAIM_Form .viewer h1 {
	font-size: 22px;
}

#tiddlerAIM_Form h4 {
	font-size: 18px;
}

#tiddlerAIM_Form h5 {
	font-size: 14px;
}

#tiddlerAIM_Form .choice {
	position: relative;
	border-bottom: 1px solid #fafafa;
	font-size: 13px;
}

#tiddlerAIM_Form .choice input {
	position: absolute;
	top: 50%;
	margin-top: -10px;
	right: 10px;
}

#tiddlerAIM_Form .choice label {
	cursor: pointer;
	display: block;
	padding: 10px 35px 10px 140px;
	letter-spacing: 0.02em;
}

#tiddlerAIM_Form .choice label:hover {
	background-color: #fffad9;
}

#tiddlerAIM_Form .choice label strong {
	display: block;
	width: 130px;
	float: left;
	margin-left: -130px;
	font-size: 14px;
}

#tiddlerAIM_Form .choice label#key_problem_label strong {
	width: 200px;
	float: none;
}

ol li {
	list-style: decimal;
}

ol ol li {
	list-style: lower-alpha;
}

#tiddlerAIM_Form input {
	margin-left: 20px;
	font-weight: normal;
	border: none;
	margin-bottom: 10px;
	padding: 5px 8px;
}

#tiddlerAIM_Form .editor input {
	border: inherit;
	margin-left: 0px;
	
}

#tiddlerAIM_Form .question .navigation {
	right: 20px;
	bottom: 40px;
	left: auto;
	top: auto;
	width: 50px
}

#tiddlerAIM_Form .item {
	margin-bottom: 20px;
}
	
#tiddlerAIM_Form table, #tiddlerAIM_Form table td, #tiddlerAIM_Form table tr {
	border: none;
	margin: 0px;
}


/* 
---------------------- Jbase & TiddlySpace overrides for tiddler headers 
*/

body {
	min-width: 0;
}

.article h3 {
	font-size: 32px;
	margin: 0px 0px 12px;
	font-weight: normal;
	padding:0px;
}

.article h4 {
	font-size: 28px;
	line-height: 30px;
	margin-bottom: 14px;
	padding-top: 4px;
}

.article h5 {
	font-size: 24px;
	line-height: 30px; 		
	margin-bottom: 13px;
	padding-top: 5px;
}

.article h6 {
	font-size: 20px;
    line-height: 24px;
    margin-bottom: 14px;
    padding-top: 4px;	
}

#displayArea .tiddler h1, #displayArea .tiddler h2, #displayArea .tiddler h3, #displayArea .tiddler h3, #displayArea .tiddler h4, #displayArea .tiddler h5, #displayArea .tiddler h6, #displayArea code {
	color: #303030;
}


/* 
---------------------- End Jbase
*/

.article {
	padding: 40px 80px 30px 50px;
}

hr.infoBorder {
	height: 3px;
	background-color: #303030;
	color: #303030;
	margin: 0px 10px 0px 0px;
}

.info {
	display: none;
	margin-right: 10px;
	background-color: #f1f1f1;
	font-size: 11px;
	padding-left: 30px;
	overflow: hidden;
	line-height: 18px;
}

.ie7 hr.infoBorder {
	margin-top: -10px; /* IE7 appears to add extra space around an hr */
}

.ie7 .info {
	margin-top: -14px
}

.info .column {
	float: left;
	width: 150px;
	margin-left: 20px;
	margin-bottom: 20px;
}

.info h3 {
	font-size: 13px;
	margin-top: 12px;
	padding-right: 14px;
	line-height: 18px;
	font-weight: bold;
	height: 50px;
	border-bottom: #303030 1px solid;
}

.info ul {
	list-style: none;
	margin-left: 0px;
}

.info ul li {
	margin-bottom: 6px;
}

.infoToggle {
	position: relative;
	left: 490px;
	display: block;
	width: 220px;
}

.infoToggle a span {
	width: 15px;
	display: inline-block;
}


.infoToggle a, .infoToggle a:hover {
	color: #fcfcfc;
	text-decoration: none;
	background-color: #303030;	
	width: 220px;
	display: block;
	text-align: center;
	font-size: 12px;
	letter-spacing: 0.08em;
}

.infoToggle a:hover {
	background-color: #505050;	
}

.toolbar {
	position: absolute;
	width: 220px;
	left: 490px;
	top: 10px;
	text-align: right;
	z-index: 1;
}

#displayArea .toolbar a, #displayArea .toolbar span {
	background-image: url(v3sprite.png);
	filter:none;
	background-repeat: no-repeat;
	display: block;
	text-indent: 999px;
	width: 20px;
	height: 30px;
	float: right;
	margin-left: 10px;
	overflow: hidden;
}

#displayArea .toolbar a:hover {
	opacity: 0.6;
}

#displayArea .toolbar a.command_saveDraft {
	background-position: 10px -947px;
}

#displayArea .toolbar a.command_deleteTiddler {
	background-position: 10px -798px;
}

#displayArea .toolbar a.command_cloneTiddler {
	background-position: 10px -250px;
}

#displayArea .toolbar a.command_editTiddler {
	background-position: 10px -300px;
}

/*#displayArea .toolbarReadOnly a.command_editTiddler, #displayArea .toolbarReadOnly a.command_cloneTiddler {
	display: none;
}*/
#displayArea .toolbarReadOnly a.command_editTiddler {
	display: none;
}

#displayArea .toolbar a.command_closeTiddler, #displayArea .toolbar a.command_cancelTiddler {
	background-position: 10px -350px;
}

#displayArea .toolbar a.command_saveTiddler {
	background-position: 10px -900px;
}

#displayArea .toolbar .button {
	border: none;
}

#displayArea .public {
	background-position: 0px -1100px;
	
} 

#displayArea .private {
	background-position: 0px -1050px;	
} 

#displayArea .toolbar .button:hover, #displayArea .toolbar .button:active {
	border: none;
	background-image: url(v3sprite.png);
	filter:none;
	background-repeat: no-repeat;
	-webkit-box-shadow: none; 
	-moz-box-shadow: none; 
	box-shadow: none; 
	background-color: transparent;
}

#sidebarIcons {
	width: 30px;
	position: absolute;
	top: 20px;
	right: -30px;
}

#sidebarIcons a {
	background-color: #303030;
	background-image: url(v3sprite.png);
	filter:none;
	background-repeat: no-repeat;
	display: block;
	text-indent: -999px;
	width: 30px;
	height: 30px;
	background-position: 10px -500px;
	cursor: pointer;
	z-index: 100;
	border-top: #666 solid 1px; 
}

#sidebarIcons a:hover {
	border-right: 2px #fcfcfc solid;
}

a#toggle {
	height: 40px;
	background-position: 10px -490px;
	margin-bottom: 58px;
	border-top: none;
}

a#search {
	height: 40px;
	background-position: 10px 13px;
	border-top: none;
}

a#history {
	background-position: 10px -92px;
}

a#current {
	background-position: 10px -142px;
	position: relative;
}

a#current span {
	background-color: #fcfcfc;
	color: #303030;
    border-radius: 10px 10px 10px 10px;
    display: block;
    font-size: 10px;
    height: 15px;
    line-height: 14px;
    padding: 0 4px;
    position: absolute;
    right: -8px;
    text-indent: 0;
    top: 6px;
    z-index: 111;
}

a#contents {
	background-position: 10px -192px;
}



/*

Editor Styles 

*/

.editor {
	font-size: inherit;
}

.editor input, .editor textarea {
	color: #303030;
	border-color: #ccc;
	width: 560px;
	padding: 10px 0px 10px 15px;
	margin-top: 10px;
}

.title input {
	font-size: 30px;
	font-weight: bold;
	padding: 10px 0px 10px 15px;	
	margin-bottom: 10px;
} 

.editor .annotation {
	margin: 0px;
	padding: 5px 10px;
	background-color: #fae9d8;
	border: none;
	color: #666;
	font-size: 12px;
	letter-spacing: 0.08em;
	width: 560px;
}

.editor .tagTitle, .editor .tagAnnotation {
	color: #8c8c8c;
	text-transform: uppercase;
	letter-spacing: 0.08em;
	font-size: 11px;
	margin: 20px 0px 5px;
}

.editor .tagAnnotation {
	text-transform: none;
	margin-top: 3px;
}

.editorFooter input {
	font-size: 12px;
	padding: 5px 10px;
	letter-spacing: 0.06em;
	margin-bottom: 0px;
}

#backstagePanel a {
	color: #303030;
}

body #app-picker {
	right:5px;
}

/*-------------- Pop up lists */

ol.popup {
    background-color: #fbfbfb;
    border: 1px solid #CCCCCC;
    color: #565656;
	font-size: 11px;
    list-style: none outside none;
    margin: -1px 0 0;
    padding: 10px;
    position: absolute;
    z-index: 300;
	-moz-box-shadow: 1px 1px 2px #939393;
	-webkit-box-shadow: 1px 1px 2px #939393;
	box-shadow: 1px 1px 2px #939393;
	letter-spacing: 0.04em;
}

ol.popup table, ol.popup table *  {
	margin: 0px;	
	border: none;
}

ol.popup table td {
    font-weight: normal;
    padding: 2px 6px;
    text-align: left;
}

.popup li {
	list-style: none;
}

.popup li a {
    cursor: pointer;
    display: block;
    font-weight: normal;
    padding: 2px 4px;
}
.popup li a:hover {
	background-color: #303030;
	color: #fefefe;
}

.popup li a, .popup li a:visited {
    border: medium none;
    color: #565656;
}


/* Community of Practice widget */

.popup .snippet {
	background-color: #f5f5f5;
	padding: 10px;
}

/*
----- Tabbed interface Styling 
*/


#tiddlerDisplay .tabContents {
	color: inherit;
	padding: inherit;
	border: none;
	background: none;
}

#tiddlerDisplay .tabset {
	padding: inherit;
	overflow: hidden;
	width: 100%;
	clear: both;
	margin-bottom: 20px;
}

#tiddlerDisplay .tab {
	background-color: #CCCCCC;
    border-right: 2px solid white;
    float: left;
    font-size: 12px;
    line-height: 20px;
    min-height: 60px;
    padding: 2px 10px 10px 7px;
    width: 95px;
    margin: 0 0 1px 0;
}

#tiddlerDisplay .tabSelected {
	color: #eee;
	background-color: #303030;
	border: none;
	border-right: 2px solid white;
}


#tiddlerDisplay .tabUnselected {
	color: #303030;
}

.tabContents ul, .tabContents ol {
	margin-bottom: 20px;
}

/*
----- Provenance label, Vote of Confidence label
*/

.provenanceLabel, .voteOfConfidenceLabel {
    padding-left: 50px;
    font-size: 12px;
    color: #696969;
    margin-bottom: -15px;
    margin-top: -10px;
}

.voteOfConfidenceLabel {
	margin-top: 10px;
}

.voteOfConfidence div.grid2col {
	line-height: 18px;
}
/*{{{*/
.tiddler .originButton div {
	display: inline-block;
}

.tiddler .spaceSiteIcon .siteIcon {
	_display: inline; /* IE doesn't like inline-block */
}

.tiddler .originButton {
	display: block;
}

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

.tagging {
	float: none;
	background: none;
	border: none;
}

.tagging li.listTitle {
	margin-left: 0px;
}
.tagging li {
	margin: 0 8px;
}

.tagging .tiddlyLink {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	-o-border-radius: 3px;
	border-radius: 3px;
	padding: 1px 2px;
	line-height: 1.2em;
}

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

.content {
	width: 100%; /* IE */
	font-size: 0.9em;
}

.editorHeading {
	height: 48px;
}

.heading {
	left: 0;
	margin-bottom: 40px;
	position: relative;
	top: 32px;
}

.followButton a {
	display: block;
	margin-top: -20px;
}

.tiddler .followPlaceHolder {
	display: block;
	position: absolute;
	top: 16px;
	right: 64px;
	_right: 138px; // add width of modifierIcon
}

.tiddler .followButton {
	position: relative;
	height: 24px;
	text-align: left;
	color: #fff;
	background: [[ColorPalette::PrimaryMid]];
	padding: 10px 0px 0px 10px;
	width: 38px;
	margin: -16px -8px 24px 0;
}

/* creates the larger triangle */
.followButton:before {
	content: "\00a0";
	display: block; /* reduce the damage in FF3.0 */
	position: relative;
	bottom: -20px;
	right: 0;
	width: 0;
	height: 0;
	border-width: 0 0 20px 20px;
	border-style: solid;
	border-color: transparent [[ColorPalette::PrimaryMid]];
}

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

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

.toolbar a:hover .glyph {
	fill: black;
}

.toolbar a:active .glyph {
	fill: [[ColorPalette::Background]];
}

.originButton,
.followPlaceHolder,
.tiddler .subtitle {
	cursor: pointer;
}

.editSpaceSiteIcon .originButton {
	cursor: auto;
}

.tiddler .subtitle:hover {
	font-weight: bold;
	background: none;
}

.originButton img,
.originButton svg {
	margin-left: 0px;
}

.modifierIcon {
	position: absolute;
	width: 74px;
	top: 0px;
	right: 0px;
	_right: 74px; /* in IE6 positioning works incorrectly so use -width instead */
	text-align: right;
}

.modifierIcon img,
.modifierIcon svg {
	margin-right: 8px;
}

.tiddler .viewer {
	padding-bottom: 16px;
	margin: 0 0 0 56px;
	line-height: 1.4em;
}

.viewer pre {
	margin-left: 0;
}

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

.tiddler .spaceSiteIcon {
	float: left;
	margin-right: 0;
	margin-top: 0;
	position: relative;
	display: block;
}

.tiddler .titleBar {
	display: block;
	margin-right: 136px;
	margin-left: 56px;
}

.followButton a {
	color: [[ColorPalette::Background]];
}

.tiddler {
	position: relative;
	padding: 0;
	margin-bottom: 3em;
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	background: #fff;
}

.tiddler .editor {
	padding: 0px 8px;
}

.tiddler .heading .title {
	position: relative;
	display: block;
	word-wrap: break-word;
	font-size: 32px;
	line-height: 32px;
}
.tiddler .heading .editor.title {
	font-size: 1.7em;
	line-height: normal;
}

.tiddler .headingClear {
	clear: both;
}

.tiddler .subtitle {
	font-style: italic;
	font-size: 0.9em;
	color: #a6a59e;
	margin-top: 0;
}

.toolbar {
	position: absolute;
	padding: 0;
	top: 8px;
	right: -8px;
}

.toolbar .moreCommand.highlight {
	background: none;
}

.tiddler .toolbar .button {
	border: none;
	display: inline;
	padding: 0px;
	margin-right: 16px;
}

.tiddler .toolbar a:hover {
	background: none;
}

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

.revButton {
	float: right;
}

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

.editSpaceSiteIcon, .privacyEdit {
	float: left;
}

.editSpaceSiteIcon svg,
.editSpaceSiteIcon img,
.editSpaceSiteIcon .roundelLabel {
	float: left;
}

.tagTitle {
	position: absolute;
	text-align: center;
	width: 48px;
	top: 0px;
	left: -56px;
}

.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
	height: 16px;
	margin-left: 24px;
	margin-right: 32px;
	width: 16px;
}

.tagAnnotation {
	margin-top: 8px;
	padding-bottom: 8px;
}
.annotationsBox {
	margin-top: 8px;
}

.editorFooter {
	position: relative;
	padding: 0;
	margin-top: 16px;
	margin-left: 64px;
}

.tiddler .editorFooter .editor {
	padding-left: 0px;
}

.heading .editor input {
	width: 100%;
	font-size: 1.5em;
}

.spaceSiteIcon .externalImage .image a:hover,
.modifierIcon .externalImage .image a:hover {
	background: none;
}

div.toolbar {
	visibility:hidden;
	right:-16px;
}

.selected div.toolbar {
	visibility: visible;
}

.followButton a:hover {
	background: [[ColorPalette::PrimaryMid]];
	text-decoration: underline;
}

a.image:hover {
	background: transparent;
}

@media all and (max-device-width: 480px) {
	div.toolbar {
		visibility:visible;
	}
}
@media only screen and (device-width: 768px) {
	div.toolbar {
		visibility:visible;
	}
}
@media all and (max-width: 960px) {
	.tiddler .titleBar {
		margin-left: 36px;
		margin-right: 80px;
	}

	.tiddler .heading {
		margin-bottom: 48px;
	}

	.tiddler .heading .title {
		font-size: 32px;
		line-height: 32px;
	}

	.tiddler .modifierIcon img,
	.tiddler .modifierIcon svg,
	.tiddler .spaceSiteIcon .originButton img,
	.originButton svg {
		width: 32px;
		height: 32px;
		margin-left: 0px;
		margin-right: 0px;
	}

	.tiddler .followPlaceHolder {
		right: 48px;
	}

	.tiddler .followButton {
		width: 24px;
	}

	.tiddler .viewer {
		margin: 0px 0px 0px 36px;
		padding-top: 0;
	}

	br {
		line-height: 0.5em;
	}
}
/*}}}*/
/*{{{*/
body {
	font-size: 1em;
	font-family: helvetica, arial, sans-serif;
	background-color: #fff;
	color: [[ColorPalette::Foreground]];
}

body ul { margin: 0; }

#popup {
	background-color: [[ColorPalette::TertiaryPale]];
}

#popup.confirmationPopup, .followList {
	font-size: 0.8em;
	padding: 1em;
	border: solid 1px [[ColorPalette::SecondaryMid]];
	background-color: [[ColorPalette::SecondaryPale]];
}

.followList .listTitle {
	text-decoration: underline;
}

#popup .followTiddlersList a {
	display: inline;
	padding: 0;
}

#popup li a {
	color: [[ColorPalette::PrimaryMid]];
	font-weight: bold;
}

#popup li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

#popup li.listTitle {
	border-bottom: 1px solid #000;
	font-weight: bold;
	margin-bottom: 10px;
}

#popup.followList {
	margin-left: 50px;
	margin-top: -30px;
}

.followTiddlersList .label {
	display: block;
	left: 10px;
	top: 0px;
	line-height: 16px;
	position: relative;
}

#popup .followTiddlersList .siteIcon{
	height: auto;
}

#popup .followTiddlersList li{
	clear: both;
	display: block;
	height: 48px;
	margin-bottom: 8px;
	position: relative;
}

#popup .followTiddlersList a{
	display: inline;
}

#displayArea {
	margin: 0;
	top: 0px;
	left: 0px;
	width: 100%;
	position: relative;
}

.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: #000;
}

/* *** Header *** */
.header {
	position: relative;
	background-color: [[ColorPalette::PrimaryMid]];
	_width: 100%; /* ie 6 demands */
}

.headerForeground {
	background-color: [[ColorPalette::PrimaryMid]];
	float: left;
	margin: 24px 16px 0px 72px;
	padding: 0;
	position: relative;
	top: 0;
	_width: 70%; /*ie6: needed for the background to actually be transparent*/
	_background-color: transparent; /*ie6: needed to show the search box*/
}

.clearFloat {
	clear: both;
}

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

#tiddlerDisplay {
	_position: relative; /* ie 6*/
}

.siteTitle {
	clear: both;
	display: block;
	font-size: 32px;
	font-weight: bold;
	line-height: 32px;
}

.siteSubtitle {
	display: block;
	font-size: 14px;
	height: 16px;
	margin-bottom: 8px;
}

#sidebarSearch {
	padding: 0;
	position: absolute;
	right: 80px;
	top: 8px;
	width: 176px;
}

#sidebarSearch .txtOptionInput {
	width: 100%;
	margin-top: 5px;
	_color: #bbb; /* ie6 danger */
}

#sidebarSearch .txtOptionInput:focus {
	color: #000;
}

#sidebarSearch .searchButton {
	display: none;
}

/* *** Menu Bar *** */

#mainMenu {
	position: static;
	text-align: left;
	margin-left: 72px;
	float: left;
	width: auto;
	padding: 0;
	font-size: 1em;
	line-height: normal;
}

#mainMenu a {
	color: #fff;
	padding: 8px;
	font-size: 0.9em;
	margin-right: 16px;
}

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

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

#sidebarOptions a {
	margin-right: 8px;
}

.confirmationPopup .button,
#sidebarOptions .button {
	cursor: pointer;
	line-height: 1.4em;
	text-align: center;
	margin-right: 8px;
	margin-left:-2px;
}

.confirmationPopup .button {
	font-size: 0.9em;
	padding: 2px;
}

#sidebarOptions .button {
	font-size: 0.7em;
	float: left;
	width: 80px;
	padding: 0px;
        color: #fff;
}

.confirmationPopup a.button,
#sidebarOptions a {
	border: none;
	margin: 0 0.2em;
	padding: 0.6em 0.25em;
	display: inline;
	color: #666;
}

.confirmationPopup a.button:hover,
#sidebarOptions a:hover {
	color: #000;
}

.confirmationPopup a.button:active,
#sidebarOptions a:active {
	border: solid 1px [[ColorPalette::PrimaryMid]];
	background-color: #fff;
	background: -webkit-gradient( linear, left bottom, left top, color-stop(0.1,rgb(200,200,200)), color-stop(1, rgb(100,100,100)));
	background: -moz-linear-gradient(center bottom , rgb(200,200,200) 10%,rgb(100,100,100) 100%) repeat scroll 0 0 transparent;
}
/* *** Sidebar *** */

#sidebar .wizard table {
	margin: 0px;
}

.tabContents .listTitle:first-child {
	margin-top: 0px;
}

#menuBar {
	background: [[ColorPalette::PrimaryLight]];
	left: 0;
	right: 0;
	position: relative;
	margin: 0;
	padding: 0.5em 0 0.5em 0;
	min-height: 1em;
	overflow: hidden;
	_width: 100%; /* for ie 6 */
}

#sidebarOptions a.button:hover {
	color: [[ColorPalette::PrimaryPale]];
    background: [[ColorPalette::PrimaryMid]];
}

#tiddlerDisplay, #searchResults {
	margin: 16px 448px 0 72px;
}

#sidebarTabs {
	position: absolute;
	right: 72px;
	width: 352px;
	top: 0;
}

#sidebarTabs .tabsetWrapper .tabset {
	width: 87px;
	border-top: 1px solid [[ColorPalette::PrimaryPale]];
	border-left: 1px solid [[ColorPalette::PrimaryPale]];
	border-bottom: 1px solid [[ColorPalette::PrimaryPale]];
	height: auto;
	float: left;
	word-wrap: break-word;
	top: 0;
	padding: 0;
}

#sidebarTabs .tabsetWrapper .tabContents {
	background-color: [[ColorPalette::PrimaryPale]];
	border: 3px solid [[ColorPalette::PrimaryMid]];
	width: 242px;
	_width: 238px;
	left: -3px;
	_left: -5px;
	position: relative;
	min-height: 34em;
	padding: 8px;
	font-size: 0.8em;
}

/* ---- Side style --- */

#sidebarTabs .tabsetWrapper .tabset .tab {
	font-size: 0.9em;
	padding: 0.7em 8px 0.5em;
	color: #fff;
	background: [[ColorPalette::PrimaryLight]];
	border: none;
	line-height: 16px;
	position: relative;
	display: block;
	margin: 0;
}

#sidebarTabs .tabsetWrapper .tabset .tabSelected {
	color: [[ColorPalette::PrimaryMid]];
	background: [[ColorPalette::PrimaryPale]];
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	border-bottom: 3px solid [[ColorPalette::PrimaryMid]];
	border-left: 3px solid [[ColorPalette::PrimaryMid]];
	z-index: 10;
	margin-top: -1px;
	font-weight: bold;
}

#sidebarTabs .tabContents li {
	border: none;
	margin-left: 0;
	word-wrap: break-word;
}

.tabContents .timeline {
	background: [[ColorPalette::PrimaryPale]];
	margin-bottom: 8px;
}

#sidebarTabs .timeline li.listTitle {
	color: #132E43;
	margin-left: 8px 0;
	padding: 0.3em 0.11em;
	font-size: 1em;
	border-bottom: none;
}

#sidebarTabs .tabContents li a {
	display: block;
	text-align: left;
	margin: 0 0 1px 0;
	padding: 0.3em 1em;
	background: [[ColorPalette::PrimaryPale]];
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabContents li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

/* Activity Stream */
#sidebarTabs .tabContents .activityStream .feedItem a {
	display: inline-block;
	padding: 0;
	background: none;
}

/* ---- Tagging box --- */
.tagInfo {
	border: 1px solid #cccccc;
	padding: 10px 15px;
	-moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
	box-shadow: 0 2px 2px rgba(0,0,0,0.2);
	color: [[ColorPalette::TertiaryMid]];
	background: -moz-linear-gradient(100% 100% 90deg, #f4f4f4, #e5e5e5);
	background: -webkit-gradient(linear, left top, right top, from(#e5e5e5), to(#f4f4f4));
	margin-top: 1em;
	font-size: 13px;
	margin: 0 0 0 56px;
}

.tagInfo ul {
	list-style: none;
	padding-left: 2.2em;
}

.tagInfo ul li {
	display: inline;
}

.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
	color: [[ColorPalette::PrimaryMid]];
	font-size: 13px;
}

.tagInfo ul li a {
	border: none;
}

.tagInfo .tagging ul li {
	float: none;
	display: inline-block;
}

.tagInfo .tagging {
	padding: 0;
}

.viewRevision .toolbar {
	right: 48px;
	top: 8px;
}

.viewRevision .modifierIcon img,
.viewRevision .modifierIcon svg {
	margin-right: 8px;
}

.viewRevision .toolbar svg {
	width: 32px;
	height: 32px;
}

/* --- IE hacks from lattice --- */

/* ie hacks */
* html #menuBar {
	margin-bottom: 8px;
}
.toolbar .svgIconText {
	*display: inline;
}

div.tiddler .toolbar a {
	cursor: pointer;
	float: left\9;
	display: inline\9;
}

* html .toolbar {
	right: 8px;
}
* html .followButton a {
	margin-top: 0px;
	margin-right: 8px;
}
* html #tiddlerDisplay {
	margin-top: 0px;
}

/* for printing purposes */
@media print {
	#mainMenu,
	#sidebar,
	#messageArea,
	.toolbar,
	.followPlaceHolder,
	#backstageButton,
	#backstageArea,
	#sidebarTabs,
	#sidebarSearch .txtOptionInput,
	#sidebarOptions {
		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 */
	}
	#tiddlerDisplay {
		margin: 16px 16px;
	}
}

@media all and (max-width: 960px){
	#tiddlerDisplay,
	#searchResults {
		margin: 16px 366px 0 16px;
	}

	#mainMenu {
		margin-left: 16px;
	}

	.headerForeground {
		margin-left: 16px;
	}

	#sidebarSearch {
		right: 16px;
	}

	#sidebarOptions {
		margin-right: 16px;
	}

	#sidebarTabs {
		right: 16px;
		width: 326px;
	}

	#sidebarTabs .tabsetWrapper .tabset {
		font-size: 0.9em;
		width: 77px;
	}

	#sidebarTabs .tabsetWrapper .tabContents {
		width: 226px;
		_width: 222px;
	}

	#sidebarTabs .tabContents li a {
		font-size: 0.9em;
	}
}
/*}}}*/
[[StyleSheetTiddler]]
syncing: Syncing to online manual
error: Error syncing to online manual
flush: Cleared all unsynced items
complete: Syncing to online manual complete
unsyncedNote: The following items were not synced to the online manual. They can be synced from your browser when you have an internet connection
!Followers
<<followers>>
!Activity
[[Replies and Notifications]]

<<activity>>
!Following
All spaces tagged follow
<<list filter [tag[follow]][sort[title]]>>

<<followSuggestions>>
My children:
[[TagTwoChild]]
[[OtherTiddler]]
My child

ThirdLevel 
HEEHEE
/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.8|
|''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?csrf_token=%0',
	incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
	uploadLabel: 'Upload',
	uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
	step1FileText: 'File:',
	step1PostText: 'In the next screen you will select the tiddlers to import.',
	step1Title: 'Step 1: Pick a TiddlyWiki to import',
	step1TypeChooser: 'Import From:',
	step3Html: ['<input type="hidden" name="markList" />',
		'<input type="hidden" checked="true" name="chkSync" />',
		'<input type="hidden" name="chkSave" />',
		'<input type="hidden" name="txtSaveTiddler" />'].join(),

	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" />'].join(""));
		var markList = wizard.getElement('markList');
		var uploadWrapper = document.createElement('div');
		markList.parentNode.insertBefore(uploadWrapper, markList);
		uploadWrapper.setAttribute('refresh', 'macro');
		uploadWrapper.getAttribute('macroName', 'fileImport');
		var iframeName = 'reflectorImporter' + Math.random().toString();
		me.createForm(uploadWrapper, wizard, iframeName);
		$(uploadWrapper).append('<p>' + me.step1PostText + '</p>');
		wizard.setValue('serverType', 'tiddlyweb');
		wizard.setValue('adaptor', new config.adaptors.file());
		wizard.setValue('host', config.defaultCustomFields['server.host']);
		wizard.setValue('context', {});
		var iframe = $(['<iframe name="' + iframeName + '" ',
			'style="display: none" />'].join("")).appendTo(uploadWrapper);
		var onSubmit = function(ev) {
			var uploadType = $('select[name=uploadtype]', wizard.formElem).val();
			if (uploadType == "file") {
				// set an onload ready to hijack the form
				me.setOnLoad(uploadWrapper, wizard, iframe[0]);
				wizard.importType = 'file';
				wizard.formElem.submit();
			} else {
				var csrf_token = config.extensions.tiddlyspace.getCSRFToken();
				$.ajax({
					url: "%0/reflector?csrf_token=%1".format(
						config.defaultCustomFields["server.host"], csrf_token),
					type: "POST",
					dataType: "text",
					data: {
						uri: $("input", ".importFrom", wizard.formElem).val()
					},
					success: function(data, txtStatus, xhr) {
						wizard.POSTResponse = data;
						me.importTiddlers(uploadWrapper, wizard);
					},
					error: function(xhr, txtStatus, error) {
						displayMessage(["There was an error fetching the ",
							'url: ', txtStatus].join(""));
						me.restart(wizard);
					}
				});
				return false;
			}
		};
		wizard.setButtons([{
			caption: me.uploadLabel,
			tooltip: me.uploadLabelPrompt,
			onClick: onSubmit
		}]);
		$(wizard.formElem).submit(function(ev) {
			onSubmit(ev);
			ev.preventDefault();
		});
	},

	createForm: function(place, wizard, iframeName) {
		var form = wizard.formElem;
		var me = config.macros.fileImport;
		form.action = me.reflectorURI.format(
			config.extensions.tiddlyspace.getCSRFToken());
		form.enctype = 'multipart/form-data';
		form.encoding = 'multipart/form-data';
		form.method = 'POST';
		form.target = iframeName;
		onSelectChange = function(e) {
			var changeTo = $(this).val();
			if (changeTo == "file") {
				$(".importFrom").html('%0 <input type="file" name="file" />'.
					format(me.step1FileText));
			} else {
				$(".importFrom").html('URL: <input type="text" name="uri" />'
					+ ' Do you want <a target="_blank" href="http://faq.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F">inclusion</a> instead?');
			}
		};
		$(place).append('<span>%0</span>'.format(me.step1TypeChooser)).
			append($(['<select name="uploadtype"><option value="file" selected="selected">file',
				'<option value="uri">url</select>'].join("")).change(onSelectChange)).
			append('<div class="importFrom">%0<input type="file" name="file" /></div>'.
					format(me.step1FileText));
	},

	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 (++(completeReadyStateChanges) == 5) {
				loadHandler();
			}
		};
	},

	importTiddlers: function(place, wizard, iframe) {
		var tmpStore = new TiddlyWiki();
		var POSTedWiki = "";
		if (wizard.importType == "file") {
			try {
				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();
		} else {
			POSTedWiki = wizard.POSTResponse;
		}

		tmpStore.importTiddlyWiki(POSTedWiki);
		var newTiddlers = tmpStore.getTiddlers();
		var workspace = config.defaultCustomFields['server.workspace'];
		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);
	}
};

var _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);
		fields["server.workspace"] = wizard.getValue('workspace');
		delete fields['server.permissions'];
		delete fields['server.bag'];
		fields['server.page.revision'] = 'false';
		delete fields['server.recipe'];
		fields.changecount = 1;
		store.suspendNotifications();
		store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
			tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
			false, tiddler.created);
		store.resumeNotifications();
		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);
	}
};

var _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;
};

var _step3Html = config.macros.importTiddlers.step3Html;
var _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);
//}}}
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.8.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink macro|
|''Status''|@@beta@@|
|''Contributors''|Jon Lister, Jon Robson, Colm Britton|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!StyleSheet
.tiddler .error.annotation .button{
	display: inline-block;
}

#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%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
	height: 25px;
	padding: 0;
}

#backstageButton {
	overflow: hidden;
}

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

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

#backstageButton img,
#backstageButton svg {
	width: 24px;
	height: 24px;
}

#messageArea {
	top: 50px;
}

#backstageToolbar {
	position: relative;
}

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

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

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

#backstageButton a {
	margin: 0;
}

.backstagePanelBody 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: 25px;
	color: #767676;
}

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

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

a.backstageTask {
	display: inline;
        margin-left: 1em !important;
}

.backstagePanelBody .button {
	display: inline-block;
	margin-right: 10px;
}

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

#backstage table {
	margin: auto;
}

#backstage .wizard table {
	border: 0px;
	margin: 0;
}

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

.tiddlyspaceMenu {
	text-align: center;
}

span.chunkyButton {
	display: inline-block;
	padding: 0;
	margin: 0;
	border: solid 2px #000;
	background-color: #04b;
}

span.chunkyButton a.button, span.chunkyButton a:active.button {
	white-space: nowrap;
	font-weight: bold;
	font-size: 1.8em;
	color: #fff;
	text-align: center;
	padding: 0.5em 0.5em;
	margin: 0;
	border-style: none;
	display: block;
}

span.chunkyButton:hover {
	background-color: #014;
}

span.chunkyButton a.button:hover {
	border-style: none;
	background: none;
	color: #fff;
}

#backstage .unpluggedSpaceTab .wizard,
.unpluggedSpaceTab .wizard {
	background: white;
	border: 2px solid #CCC;
	padding: 5px;
}

.syncKey .keyItem {
	border: 1px solid black;
	display: inline-block;
	margin: 0.2em;
	padding: 0.1em 0.1em 0.1em 0.1em;
}

.keyHeading {
	font-size: 2em;
	font-weight: bold;
	margin: 0.4em 0em -0.2em;
}

.unpluggedSpaceTab .putToServer,
.unpluggedSpaceTab .notChanged {
	display: none;
}

.tiddlyspaceMenu ul {
	margin: 0;
	padding: 0;
}

.tiddlyspaceMenu ul li {
	list-style: none;
}

.unsyncedChanges .unsyncedList {
	display: block;
}

.unsyncedList {
	display: none;
}
!Code
***/
//{{{
(function ($) {
    var name = "StyleSheet" + tiddler.title;
    config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
        format(store.getTiddlerText(tiddler.title + "##StyleSheet")); // this accesses the StyleSheet section of the current tiddler (the plugin that contains it)
    store.addNotification(name, refreshStyles);

    if (!config.extensions.tiddlyweb.status.tiddlyspace_version) { // unplugged
        config.extensions.tiddlyweb.status.tiddlyspace_version = "<unknown>";
        config.extensions.tiddlyweb.status.server_host = {
            url:config.extensions.tiddlyweb.host }; // TiddlySpaceLinkPlugin expects this
    }
    var disabled_tasks_for_nonmembers = ["tiddlers", "plugins", "batch", "sync"];

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

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

// Set up Backstage
    config.tasks = {};
    config.tasks.status = {
        text:"status",
        tooltip:"TiddlySpace Info",
        content:"<<tiddler Backstage##Menu>>"
    };
    config.tasks.tiddlers = {
        text:"tiddlers",
        tooltip:"tiddlers control panel",
        content:"<<tiddler Backstage##BackstageTiddlers>>"
    };
    config.tasks.plugins = {
        text:"plugins",
        tooltip:"Manage installed plugins",
        content:"<<tiddler Backstage##Plugins>>"
    };
    config.tasks.batch = {
        text:"batch",
        tooltip:"Batch manage public/private tiddlers",
        content:"<<tiddler Backstage##BatchOps>>"
    };
    config.tasks.tweaks = {
        text:"tweaks",
        tooltip:"Tweak TiddlyWiki behaviors",
        content:"<<tiddler Backstage##Tweaks>>"
    };
    config.tasks.exportTiddlers = {
        text:"import/export",
        tooltip:"Import/export tiddlers from/to a TiddlyWiki",
        content:"<<tiddler Backstage##ImportExport>>"
    };
    config.tasks.sync = {
        text:"sync",
        tooltip:"Check Sync status",
        content:"<<tiddler Backstage##SpaceUnplugged>>"
    };

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

    config.backstageTasks = ["status", "tiddlers", "plugins",
        "batch", "tweaks", "exportTiddlers", "sync"];

    config.messages.backstage.prompt = "";
// initialize state
    var _show = backstage.show;
    backstage.show = function () {
        // selectively hide backstage tasks and tabs based on user status
        var tasks = $("#backstageToolbar .backstageTask").show();
        var bs = backstage.tiddlyspace;
        if (!config.unplugged) {
            tweb.getUserInfo(function (user) {
                if (user.anon) {
                    jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
                        var taskIndex = config.backstageTasks.indexOf(task);
                        if (taskIndex !== -1) {
                            config.backstageTasks.splice(taskIndex, 1);
                        }
                    });
                    config.messages.memberStatus = bs.locale.loggedout;
                } else {
                    config.messages.memberStatus = readOnly ?
                        bs.locale.nonmember : bs.locale.member;
                }
            });
        } else {
            config.messages.memberStatus = bs.locale.unplugged;
        }

        // display backstage
        return _show.apply(this, arguments);
    };
    if (readOnly) {
        jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
            var taskIndex = config.backstageTasks.indexOf(task);
            if (taskIndex !== -1) {
                config.backstageTasks.splice(taskIndex, 1);
            }
        });
    }

    var tasks = config.tasks;
    var commonUrl = "/bags/common/tiddlers/%0";

    backstage.tiddlyspace = {
        locale:{
            member:"You are a member of this space.",
            nonmember:"You are not a member of this space.",
            loggedout:"You are currently logged out of TiddlySpace.",
            unplugged:"You are unplugged."
        },
        showButton:function () {
            var showBtn = $("#backstageShow")[0];
            var altText = $(showBtn).text();
            $(showBtn).empty();
            imageMacro.renderImage(showBtn, "backstage.svg",
                { altImage:commonUrl.format("backstage.png"), alt:altText});
        },
        hideButton:function () {
            var hideBtn = $("#backstageHide")[0];
            var altText = $(hideBtn).text();
            $(hideBtn).empty();
            imageMacro.renderImage(hideBtn, "close.svg",
                { altImage:commonUrl.format("close.png"), alt:altText, width:24, height:24 });
        }
    };

    var _init = backstage.init;
    backstage.init = function () {
        _init.apply(this, arguments);
        var init = function (user) {
            var bs = backstage.tiddlyspace;
            bs.showButton();
            bs.hideButton();
        };
        tweb.getUserInfo(init);
    };

    var home = config.macros.homeLink = {
        locale:{
            linkText:"your home space"
        },
        handler:function (place) {
            var container = $("<span />").appendTo(place)[0];
            tweb.getUserInfo(function (user) {
                if (!user.anon && user.name !== currentSpace) {
                    createSpaceLink(container, user.name, null, home.locale.linkText);
                }
            });
        }
    };

    config.macros.exportSpace = {
        handler:function (place, macroName, params) {
            var filename = params[0] ||
                "/tiddlers.wiki?download=%0.html".format(currentSpace);
            $('<a class="button">download</a>').// XXX: i18n
                attr("href", filename).appendTo(place);
        }
    };

}(jQuery));
//}}}
(function() {
var getCSRFToken = function(window) {
	// XXX: should not use RegEx - cf.
	// http://www.quirksmode.org/js/cookies.html
	// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
	var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
	var match = regex.exec(document.cookie);
	var csrf_token = null;
	if (match && (match.length === 2)) {
		csrf_token = match[1];
	}

	return csrf_token;
};

if (typeof config !== 'undefined' && config.extensions &&
		config.extensions.tiddlyspace &&
		config.extensions.tiddlyspace.getCSRFToken === null) {
	config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
	window.getCSRFToken = getCSRFToken;
}
})(window);
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.8|
|''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 TiddlySpaceFilters|
!Code
***/
//{{{
(function($) {

var cmd = config.commands;
var tiddlyspace = config.extensions.tiddlyspace;

var fieldsCache = {};

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) {
		return !config.filterHelpers.is.local(tiddler) && !readOnly;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			fieldsCache[title] = $.extend({}, tiddler.fields);
			tiddler.fields["server.workspace"] = tiddlyspace.getCurrentWorkspace(config.options.chkPrivateMode ?
		"private" : "public");
			tiddler.fields["server.permissions"] = "read, write, create"; // no delete
			delete tiddler.fields["server.page.revision"];
			delete tiddler.fields["server.title"];
			delete tiddler.fields["server.etag"];
			// special handling for pseudo-shadow tiddlers
			if(tiddlyspace.coreBags.contains(tiddler.fields["server.bag"])) {
				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);
		if(tiddler) {
			tiddler.fields["server.permissions"] += ", delete";
		}
		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 = fieldsCache[title] || tiddler.fields;
		delete fieldsCache[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 fieldsCache[title];
	return _saveHandler.apply(this, arguments);
};

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

var tweb = config.extensions.tiddlyweb;

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

var disabledTabs = [];

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

// 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) {
				var dirty = store.isDirty();
				store.saveTiddler(context.tiddler).clearChangeCount();
				store.setDirty(dirty);
			} else {
				store.notify(title, true);
			}
		};
		context.adaptor.getTiddler(title, context, null, callback);
	}
};

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

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;
	},
	getCurrentBag: function(type) {
		return "%0_%1".format(currentSpace, type);
	},
	getCurrentWorkspace: function(type) {
		return "bags/" + this.getCurrentBag(type);
	},
	// 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 ? currentSpace : 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) {
		if(host === undefined) { // offline
			tweb.status.server_host = {}; // prevents exceptions further down the stack -- XXX: hacky workaround, breaks encapsulation
			return null;
		}
		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;
	},
	disableTab: function(tabTiddler) {
		if(typeof(tabTiddler) == "string") {
			disabledTabs.push(tabTiddler);
		} else {
			for(var i = 0; i < tabTiddler.length; i++) {
				plugin.disableTab(tabTiddler[i]);
			}
		}
	},
    checkSyncStatus: function(tiddler) {
		if(tiddler) {
			var title = typeof(tiddler) === "string" ? tiddler : tiddler.title;
			var el = story.getTiddler(title) || false;
			if(el) {
				refreshElements(el);
			}
		}
	},
	isDisabledTab: function(tabTitle) {
		var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
		var tabIdentifier = match ? match[1] : tabTitle;
		return disabledTabs.contains(tabIdentifier);
	},
	getCSRFToken: window.getCSRFToken || null // this may not have been processed yet
};

currentSpace = plugin.currentSpace.name;

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;
	config.messages.tsVersion = status.version;
});

if(window.location.protocol == "file:") {
	// enable AutoSave by default
	config.options.chkAutoSave = config.options.chkAutoSave === undefined ?
		true : config.options.chkAutoSave;
} else {
	// set global read-only mode based on membership heuristics
	var indicator = store.getTiddler("SiteTitle") || tiddler;
	readOnly = !(recipe.split("_").pop() == "private" ||
		tweb.hasPermission("write", indicator));
	// replace TiddlyWiki's ImportTiddlers due to cross-domain restrictions
	if(config.macros.fileImport) {
		$.extend(config.macros.importTiddlers, config.macros.fileImport);
	}
}

// hijack saveChanges to ensure SystemSettings is private by default
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(tiddlers && tiddlers.length == 1 &&
			tiddlers[0] && tiddlers[0].title == "SystemSettings") {
		var fields = tiddlers[0].fields;
		delete fields["server.recipe"];
		fields["server.bag"] = plugin.getCurrentBag("private");
		fields["server.workspace"] = plugin.getCurrentWorkspace("private");
	}
	return _saveChanges.apply(this, arguments);
};

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

// disable evaluated macro parameters for security reasons
config.evaluateMacroParameters = "none";
var _parseParams = String.prototype.parseParams;
String.prototype.parseParams = function(defaultName, defaultValue, allowEval,
		noNames, cascadeDefaults) {
	if(config.evaluateMacroParameters == "none") {
		arguments[2] = false;
	}
	return _parseParams.apply(this, arguments);
};

var _tabsMacro = config.macros.tabs.handler;
config.macros.tabs.handler = function(place, macroName, params) {
	var newParams = [params[0]]; // keep cookie name
	for(var i = 1; i < params.length; i += 3) {
		var tabTitle = params[i + 2];
		if(!plugin.isDisabledTab(tabTitle)){
			newParams = newParams.concat(params[i], params[i + 1], tabTitle);
		}
	}
	_tabsMacro.apply(this, [place, macroName, newParams]);
};

// disable ControlView for XHRs by default
$.ajaxSetup({
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	}
});
// TiddlyWeb adaptor currently still uses httpReq, which needs extra magic -- XXX: obsolete this!
var _httpReq = httpReq;
httpReq = function(type, url, callback, params, headers, data, contentType,
		username, password, allowCache) {
	headers = headers || {};
	headers["X-ControlView"] = "false";
	_httpReq.apply(this, arguments);
};

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

// option for default privacy setting
config.optionsDesc.chkPrivateMode = "Set your default privacy mode to private";
config.optionsSource.chkPrivateMode = "setting";
config.options.chkPrivateMode = config.options.chkPrivateMode || false;
saveSystemSetting("chkPrivateMode", true);
config.defaultCustomFields["server.workspace"] = plugin.
	getCurrentWorkspace(config.options.chkPrivateMode ? "private" : "public");

config.paramifiers.follow = {
	onstart: function(v) {
		if(!readOnly) {
			var bag = "%0_public".format(currentSpace);
			story.displayTiddler(null, v, DEFAULT_EDIT_TEMPLATE, null, null,
				"server.bag:%0 server.workspace:bags/%0".format(bag));
			story.setTiddlerTag(v, "follow", 1);
			story.focusTiddler(v, "text");
		}
	}
};

var fImport = config.macros.fileImport;
if(fImport) {
	fImport.uploadTo = "Upload to: ";
	var _createForm = config.macros.fileImport.createForm;
	config.macros.fileImport.createForm = function(place, wizard, iframeName) {
		var container = $("<div />").text(fImport.uploadTo).appendTo(place);
		var select = $('<select name="mode" />').appendTo(container)[0];
		$('<option value="private" selected>private</a>').appendTo(select);
		$('<option value="public">public</a>').appendTo(select);
		wizard.setValue("importmode", select);
		_createForm.apply(this, [place, wizard, iframeName]);
	};

	var _onGet = config.macros.importTiddlers.onGetTiddler;
	config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
		var type = $(wizard.getValue("importmode")).val();
		var ws =  plugin.getCurrentWorkspace(type);
		wizard.setValue("workspace", ws);
		_onGet.apply(this, [context, wizard]);
	};
}

config.extensions.ServerSideSavingPlugin.reportSuccess = function(msg, tiddler) {
	plugin.checkSyncStatus(tiddler);
	msg = config.extensions.ServerSideSavingPlugin.locale[msg];
	var link = "/" + encodeURIComponent(tiddler.title);
	displayMessage(msg.format([tiddler.title]), link);
};


})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFilters|
|''Description''|provide TiddlySpace-specific filter extensions|
|''Author''|Jon Robson|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''CoreVersion''|2.6.2|
|''Requires''|TiddlySpaceConfig|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>
<<tsList Draft>>
}}}
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var privateBag = tiddlyspace.getCurrentBag("private");
var publicBag = tiddlyspace.getCurrentBag("public");

config.filterHelpers = {
	is: {
		"private": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == privateBag;
		},
		"public": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == publicBag;
		},
		draft: function(tiddler) {
			var fields = tiddler.fields;
			var bag = fields["server.bag"];
			return (privateBag == bag && fields["publish.name"]) ? true : false;
		},
		local: function(tiddler) {
			return config.filterHelpers.is["public"](tiddler) ||
				config.filterHelpers.is["private"](tiddler);
		},
		unsynced: function(tiddler) {
			return tiddler ? tiddler.isTouched() : false;
		}
	}
};

config.filters.is = function(results, match) {
	var candidates = store.getTiddlers("title");
	var type = match[3];
	for (var i = 0; i < candidates.length; i++) {
		var tiddler = candidates[i];
		var helper = config.filterHelpers.is[type];
		if(helper && helper(tiddler)) {
			results.pushUnique(tiddler);
		}
	}
	return results;
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.7.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin ErrorHandler|
|''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.
{{{<linkedTiddlers>>}}} will list all tiddlers across TiddlySpace linked to the current tiddler
{{{<linkedTiddlers follow:yes>>}}} will list all tiddlers across TiddlySpace that come from your list of followers
adds spaceLink view type {{{<<view server.bag spaceLink>>}}} creates a link to the space described in server.bag
{{{<<view server.bag spaceLink title>>}}} makes a link to the tiddler with title expressed in the field title in space server.bag
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;
}

#sidebarTabs .followers li a,
.followers .siteIcon,
.followers .siteIcon div {
	display: inline;
}

.followTiddlersList li .externalImage, .followTiddlersList li .image {
	display: inline;
}

.scanResults li {
	list-style: none;
}
!Code
***/
//{{{
(function($) {
var LIMIT_FOLLOWING = 100;

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

var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is the default template used in the display of tiddlers founding using the tsScan macro. To access attributes use the view macro e.g. {{{<<view title text>>}}}";
shadows.ScanTemplate = "<<view modifier SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title link>>";
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>>";
shadows.FollowTiddlersBlackList = "";
shadows.FollowTiddlersHeading = "There are tiddlers in spaces you follow using the follow tag which use the title <<view title text>>";
shadows.FollowTiddlersTemplate = ["* <<view server.space SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
	"<<view server.space spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
	"in the <<view server.space spaceLink>> space (<<view modified date>> @ <<view modified date 0hh:0mm>>).\n"].join("");

var name = "StyleSheetFollowing";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);

// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var adaptor = store.getTiddlers()[0].getAdaptor();
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var tiddler = new Tiddler(localTitle);
	tiddler.text = "Please wait while this tiddler is retrieved...";
	tiddler.fields.doNotSave = "true";
	store.addTiddler(tiddler);
	src = story.displayTiddler(src || null, tiddler.title);
	tweb.getStatus(function(status) {
		var context = {
			host: tweb.host, // TODO: inherit from source tiddler?
			workspace: workspace,
			headers: { "X-ControlView": "false" }
		};
		var getCallback = function(context, userParams) {
			var tiddler = context.tiddler;
			tiddler.title = localTitle;
			store.addTiddler(tiddler);
			story.refreshTiddler(localTitle, null, true); // overriding existing allows updating
			if(callback) {
				callback(src, tiddler);
			}
		};
		adaptor.getTiddler(title, context, null, getCallback);
	});
};

tiddlyspace.scroller = {
	runHandler: function(title, top, bottom, height) {
		var i;
		var handlers = tiddlyspace.scroller.handlers;
		var tidEl = story.getTiddler(title);
		if(tidEl) {
			var topEl = $(tidEl).offset().top + 20;
			if(top === false || (topEl > top && topEl < bottom)) {
				var h = handlers[title];
				for(i = 0; i < h.length; i++) {
					h[i]();
				}
				tiddlyspace.scroller.clearHandlers(title);
			}
		} else {
			tiddlyspace.scroller.clearHandlers(title);
		}
	},
	clearHandlers: function(title) {
		tiddlyspace.scroller.handlers[title] = [];
	},
	registerIsVisibleEvent: function(title, handler) {
		tiddlyspace.scroller.handlers[title] = tiddlyspace.scroller.handlers[title] || [];
		tiddlyspace.scroller.handlers[title].push(handler);
	},
	init: function() {
		this.handlers = {};
		this.interval = window.setInterval(function() {
			var top = $(window).scrollTop();
			var height = $(window).height();
			var bottom = top + height;
			var title;
			for(title in tiddlyspace.scroller.handlers) {
				if(title) {
					tiddlyspace.scroller.runHandler(title, top, bottom, height);
				}
			}
		}, 2000); // every 2 seconds check scroll position
	}
};
tiddlyspace.scroller.init();

var followMacro = config.macros.followTiddlers = {
	locale: {
		followListHeader: "Here are tiddlers from spaces you follow using the follow tag which use this title.",
		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."
	},
	init: function() {
		followMacro.lookup = {};
	},
	followTag: "follow",
	getHosts: function(callback) {
		tweb.getStatus(function(status) {
			callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
		});
	},
	getBlacklist: function() {
		return store.getTiddlerText("FollowTiddlersBlackList").split("\n");
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		var title = (args.anon && args.anon[0]) || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var user = params[1] || false;
		if(tid) {
			followMacro.makeButton(place, {
				url: "/search?q=title:%22" + encodeURIComponent(title) + "%22",
				containingTiddler: containingTiddler,
				blacklisted: followMacro.getBlacklist(), title: title, user: user,
				consultFollowRelationship: (args.follow &&
					args.follow[0] === 'false') ? false : true });
		}
	},
	makeButton: function(place, options) { // this is essentially the same code in TiddlySpaceFollowingPlugin
		var title = options.title;
		var blacklisted = options.blacklisted;
		var tiddler = store.getTiddler(title);
		var btn = $('<div class="followButton" />').addClass("notLoaded").appendTo(place)[0];
		if(blacklisted.contains(title)) {
			$(btn).remove();
			return;
		} else {
			var user = options.user;
			window.setTimeout(function() { // prevent multiple calls due to refresh
				tiddlyspace.scroller.registerIsVisibleEvent(options.containingTiddler, function() {
					var mkButton = function(followers, ignore) {
						if(!followers && !ignore) {
							$(btn).remove();
						} else {
							$("<a />").appendTo(btn);
							var scanOptions = { url: options.url,
								spaceField: options.spaceField || "bag", template: null, sort: "-modified",
								callback: function(tiddlers) {
									$(btn).removeClass("notLoaded");
									followMacro.constructInterface(btn, tiddlers);
								}
							};
							if(!ignore) {
								scanOptions.showBags = followMacro._getFollowerBags(followers);
							}
							scanOptions.hideBags = [tiddler.fields["server.bag"]];
							scanMacro.scan(null, scanOptions, user);
						}
					};
					if(options.consultFollowRelationship) {
						followMacro.getFollowers(mkButton);
					} else {
						mkButton([], true);
					}
				});
			}, 1000);
		}
	},
	constructInterface: function(container, tiddlers) {
		var txt = tiddlers.length;
		var className = txt > 0 ? "hasReplies" : "noReplies";
		var el = $(story.findContainingTiddler(container));
		$(container).empty().addClass(className);
		var btn = $("<a />").addClass("followedTiddlers").text(txt).
			click(function(ev) {
				followMacro.followingOnClick(ev);
			}).appendTo('<div class="followedTiddlers" />').appendTo(container)[0];
		$.data(btn, "tiddlers", tiddlers);
	},
	followingOnClick: function(ev) {
		var target = ev.target;
		var locale = followMacro.locale;
		var el = $('<div class="followTiddlersList" />')[0];
		var popup = Popup.create(target,"div");
		$(popup).addClass("taggedTiddlerList followList").click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
			if(ev.target.parentNode != document) {
				ev.stopPropagation();
			}
		}).append(el);
		var tiddlers = $.data(target, "tiddlers") || [];
		scanMacro.template(el, tiddlers.slice(0,1), "FollowTiddlersHeading");
		scanMacro.template(el, tiddlers, "FollowTiddlersTemplate");
		if(tiddlers.length === 0) {
			$("<li />").text(locale.noTiddlersFromFollowers).appendTo(el);
		}
		Popup.show();
		ev.stopPropagation();
		return popup;
	},
	_getFollowerBags: function(followers) { // XXX: private or not?
		return $.map(followers, function(name, i) {
			return name != currentSpace ? "%0_public".format(name) : null;
		});
	},
	getFollowers: function(callback, username) {
		// returns a list of spaces being followed by the existing space
		var followersCallback = function(user) {
			if(!user.anon) {
				scanMacro.scan(null, { 
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title", template: null, cache: true,
					callback: function(tiddlers) {
						var followers = [];
						for(var i = 0; i < tiddlers.length; i++) {
							followers.push(tiddlyspace.resolveSpaceName(tiddlers[i].title));
						}
						callback(followers);
					}
				});
			} else {
				callback(false);
			}
		};
		return !username ? tweb.getUserInfo(followersCallback) : followersCallback({ name: username });
	}
};

var scanMacro = config.macros.tsScan = {
	init: function () {
		this.scanned = {};
	},
	_tiddlerfy: function(jsontiddlers, options) {
		var tiddlers = [];
		var spaceField = options.spaceField || "bag"; // TODO: phase out use view types instead
		$.each(jsontiddlers, function(i, t) {
			var use = false;
			if(!options.showBags || (options.showBags && options.showBags.contains(t.bag))) {
				use = true;
			}
			if(options.hideBags && options.hideBags.contains(t.bag)) {
				use = false;
			}
			if(use) {
				var spaceName = t[spaceField];
				var tiddler = config.adaptors.tiddlyweb.toTiddler(t, tweb.host);
				tiddler.fields["server.space"] = tiddlyspace.resolveSpaceName(spaceName);
				tiddlers.push(tiddler);
			}
		});
		return tiddlers;
	},
	_scanCallback: function(place, jsontiddlers, options) {
		var locale = followersMacro.locale;
		var tiddlers = scanMacro._tiddlerfy(jsontiddlers, options);
		
		if(options.sort) {
			tiddlers = store.sortTiddlers(tiddlers, options.sort);
		}
		if(options.filter) {
			var _store = new TiddlyWiki();
			config.lastStore = _store;
			for(var i = 0; i < tiddlers.length; i++) {
				var clone = tiddlers[i];
				clone.title = tiddlyspace.getLocalTitle(clone.title, clone.fields['server.workspace']);
				_store.addTiddler(clone);
			}
			tiddlers = _store.filterTiddlers(options.filter);
		}
		if(place) {
			$(place).empty();
			var list = $("<ul />").appendTo(place)[0];
			scanMacro.template(list, tiddlers, options.template);
			if(tiddlers.length === 0) {
				$("<li />").text(options.emptyMessage || locale.noone).appendTo(list);
				$(list).addClass("emptyList");
			}
		}
		if(options.callback) {
			options.callback(tiddlers);
		}
	},
	constructSearchUrl: function(host, options) {
		if(options.url) {
			return options.url;
		}
		var inputs = options.searchValues;
		var tag = options.tag;
		var searchField = options.searchField || "title";
		var searchQuery = [];
		for(var i = 0; i < inputs.length; i++) {
			searchQuery.push('%0:"%1"'.format(searchField, inputs[i]));
		}
		var query = searchQuery.join(" OR ");
		query = tag ? "(%0) AND tag:%1".format(query, tag) : query;
		query = options.query ? "%0;%1;".format(query, options.query) : query;
		query = options.fat ? "%0&fat=1".format(query) : query;
		return '%0/search?q=%1'.format(host, query);
	},
	scan: function(place, options) { // TODO: make use of list macro with url filter
		var locale = followersMacro.locale;
		options.template = options.template ? options.template : "ScanTemplate";
		followMacro.getHosts(function(host, tsHost) {
			$(place).text(followersMacro.locale.pleaseWait);
			options = options ? options: {};
			var url = scanMacro.constructSearchUrl(host, options);
			if(options.cache && scanMacro.scanned[url]) {
				var tiddlers = scanMacro.scanned[url].tiddlers;
				var run = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(tiddlers) {
					run(tiddlers);
				} else {
					scanMacro.scanned[url].callbacks.push(run);
				}
			} else {
				var callback = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(scanMacro.scanned[url] && scanMacro.scanned[url].callbacks) {
					scanMacro.scanned[url].callbacks.push(callback);
				} else {
					scanMacro.scanned[url] = {
						callbacks: [callback]
					};
				}
				ajaxReq({
					url: url,
					dataType: "json",
					success: function(tiddlers) {
						scanMacro.scanned[url].tiddlers = tiddlers;
						var callbacks = scanMacro.scanned[url].callbacks;
						while(callbacks.length > 0) {
							callbacks.pop()(tiddlers);
						}
					},
					error: function(xhr) {
						$(place).empty();
						$("<span />").addClass("annotation error").text(locale.error.format(xhr.status)).appendTo(place);
					}
				});
			}
		});
	},
	template: function(place, tiddlers, template) { // TODO: make use of list macro.
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var item = $('<li class="spaceName" />').appendTo(place)[0];
			var spaceName = tiddler.fields["server.space"] || "";
			var templateText = store.getTiddlerText(template).replace(/\$1/mg, spaceName);
			wikify(templateText, item, null, tiddler);
		}
	},
	getOptions: function(paramString, tiddler) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { query: false, sort: false, tag: false, template: false, showBags: args.show || false,
			hideBags: args.hide || false, filter: false, spaceField: "bag", searchField: "title", fat: false,
			emptyMessage: false };
		for(var name in args) {
			if(name != "name") {
				if(name == "fat") {
					options[name] = true;
				} else {
					options[name] = args[name][0];
				}
			}
		}
		// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
		var searchField = options.searchField;
		var searchValues = args[searchField] ? args[searchField] : args.searchValues;
		// if neither of those were used use the first parameter
		var defaultValues = tiddler ? [ tiddler.title ] : [];
		options.searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
		return options;
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").addClass("scanResults resultsArea").appendTo(place)[0];
		var options = scanMacro.getOptions(paramString, tiddler);
		scanMacro.scan(container, options);
	}
};

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: "Error %0 occurred whilst retrieving data from server",
		noone: "None."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followersMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var username = args.name ? args.name[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 {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=title:@%0 OR title:%0 tag:%1 _limit:%2".
						format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "bag",
					template: options.template ? options.template : "FollowersTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followersCallback({ name: currentSpace }) : followersCallback({ name: username });
	}
};

var followingMacro = config.macros.following = {
	locale: {
		pleaseWait: followersMacro.locale.pleaseWait,
		loggedOut: "Please login to see who you are following",
		noSupport: followersMacro.locale.noSupport,
		error: followersMacro.locale.error,
		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 ? true : false;
		var username = args.name ? args.name[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 {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title",
					template: options.template ? options.template : "FollowingTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followingCallback({ name: currentSpace }) : followingCallback({ name: username });
	}
};

var linkedMacro = config.macros.linkedTiddlers = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		if(tid) {
			followMacro.makeButton(place, {
				spaceField: "recipe",
				url: "/bags/%0/tiddlers/%1/backlinks".format(tid.fields['server.bag'],
					encodeURIComponent(tid.title)),
				blacklisted: followMacro.getBlacklist(),
				title: title,
				containingTiddler: containingTiddler,
				user: params[1] || false,
				consultFollowRelationship: args.follow ? true : false });
		}
	}
};

if(config.options.chkFollowTiddlersIsLinkedTiddlers) {
	merge(config.macros.followTiddlers, config.macros.linkedTiddlers);
	config.shadowTiddlers.FollowTiddlersHeading = "These are the other tiddlers that link to this tiddler.";
}

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFollowingSuggestions|
|''Version''|0.2.5dev|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceFollowingPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage

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

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var followMacro = config.macros.followTiddlers;

var followSuggestions = config.macros.followSuggestions = {
	cache: {},
	handler: function(place, macroName, params) {
		// to do - limit results
		place = $('<div class="suggestions" />').appendTo(place)[0];
		var currentSpace = tiddlyspace.currentSpace.name;
		var user = params[0] || currentSpace;
		var pleaseWait = $("<div class='loading' />").text("please wait..").appendTo(place);
		tweb.getUserInfo(function(activeUser) {
			if(activeUser.name != tiddlyspace.currentSpace.name) {
				pleaseWait.hide();
				return;
			}
			followMacro.getFollowers(function(users) {
				// suggestions are followers of people that you follow that you don't follow
				var bags = followMacro._getFollowerBags(users);
				var _bags = [];
				for(var i = 0; i < bags.length; i++) {
					_bags.push("bag:%0".format([bags[i]]));
				}
				var bagString = _bags.join(" OR ");
				ajaxReq({
					beforeSend: followMacro.beforeSend,
					url: "/search?q=(%0)&select=title:!%1&select=title:!@%1".format([bagString, activeUser.name]),
					dataType: "json",
					success: function(tiddlers) {
						pleaseWait.hide();
						var suggestions = [];
						for(var i = 0; i < tiddlers.length; i++) {
							var tiddler = tiddlers[i];
							if(tiddler.tags.contains("follow")) {
								var title = tiddler.title;
								if(title.indexOf("@") === 0) {
									title = title.substr(1);
								}
								if(!users.contains(title)) {
									suggestions.pushUnique(title);
								}
							}
						}
						$(place).append("<div>suggestions:</div>");
						var suggestionArea = $("<div class='suggestionArea' />").appendTo(place)[0];
						var id = "more_%0".format([Math.random()]);
						var more = $("<div class='moreButton' />").text("more...").appendTo(place).attr("id", id);
						followSuggestions.cache[id] = suggestions;
						var limit = suggestions.length;
						more.click(function(ev) {
							var suggestions = config.macros.followSuggestions.cache[id];
							var newSuggestions = followSuggestions.suggest(place, suggestions, limit);
							config.macros.followSuggestions.cache[id] = newSuggestions;
						});
						followSuggestions.suggest(place, suggestions, limit);
					
					}
				});
			
			}, user);
		});
	},
	randomize: function(a, b) {
		if(Math.random() < Math.random()) {
			return -1;
		} else {
			return 1;
		}
	},
	suggest: function(place, suggestions, limit) {
		var currentSpace = tiddlyspace.currentSpace.name;
		suggestions = suggestions.sort(followSuggestions.randomize);
		var suggestionsArea = $(".suggestionArea", place)[0];
		if(suggestions.length === 0) {
			$("<span />").text("no suggestions..").appendTo(suggestionsArea);
			return;
		}
		limit = limit < suggestions.length ? limit : suggestions.length;
		for(var j = 0; j < limit; j++) {
			var link = $("<span />").appendTo(suggestionsArea)[0];
			var title = suggestions[j];
			var newTiddler = '@%0 <<newTiddler title:"@%0" fields:"server.workspace:bags/%1_public" tag:follow label:"follow">>\n'.format([title, currentSpace]);
			wikify(newTiddler, link);
		}
		var newSuggestions = suggestions.slice(limit, suggestions.length);
		var more = $(".moreButton", place);
		if(newSuggestions.length == 0) {
			more.remove();
		}
		return newSuggestions;
	}
};
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFollowingWizard|
|''Version''|0.7.0|
|''Description''|Provides a following wizard macro and deleteButton view type|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin TiddlySpaceTiddlerIconsPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{ <<followWizard>> }}}
!StyleSheet
.followWizard ul,
.followWizard li .siteIcon,
.followWizard li {
	list-style: none;
	display: inline-block;
}

.followWizard li {
	margin-right: 8px;
	background-color: #eee;
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	padding: 4px;
}
!Code
***/
//{{{
(function($) {

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

var shadows = config.shadowTiddlers;
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>> <<view title deleteButton>>";

var name = "StyleSheetFollowingWizard";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);

var wizard = config.macros.followWizard = {
	locale: {
		mission: "Which user or space would you like to follow?",
		badpermissions: "Only members of the space can maintain followers.",
		follow: "follow"
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = wizard.locale;
		var container = $("<div />").addClass("followWizard").appendTo(place)[0];
		if(!readOnly) {
			var form = $("<form />").addClass("followForm").appendTo(container)[0];
			$("<span />").text(locale.mission).appendTo(form);
			var input = $("<input />").attr("name", "space").attr("type", "text").appendTo(form);
			$("<input />").attr("type", "submit").val(locale.follow).appendTo(form).click(function(ev) {
				wizard.addFollowing(ev, input.val());
				ev.preventDefault();
			});
		} else {
			$(container).addClass("annotation").text(locale.badpermissions);
		}
	},
	addFollowing: function(ev, space) {
		var name = tiddlyspace.resolveSpaceName(space);
		if(!name) {
			alert("That doesn't appear to be a valid space name. Please check and try again.");
			return;
		}
		var title = "@" + name;
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			tiddler.tags.push("follow");
		} else {
			tiddler = new Tiddler(title);
			tiddler.tags.push("follow");
			merge(tiddler.fields, config.defaultCustomFields);
		}
		store.saveTiddler(tiddler);
		autoSaveChanges();
	}
};

config.macros.view.views.deleteButton = function(value,place,params,wikifier,paramString,tiddler) {
	var tid = store.getTiddler(value)
	if(tid && config.commands.deleteTiddler.isEnabled(tid)) {
		var handler = function(ev) {
			config.commands.deleteTiddler.handler(ev,ev.target,value);
		};
		createTiddlyButton(place, "X", "delete this tiddler", handler);
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.7.3|
|''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 ImageMacroPlugin|
!TODO
* robust error notification and recovery
!MarkupPreHead
<!--{{{-->
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="%0's public feed" />
<link rel="canonical" href="%1/" />
<!--}}}-->
!Code
***/
//{{{
(function($) {

var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace;
var tweb = config.extensions.tiddlyweb;

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

	dispatch: function(ev) {
		var title = plugin.flagTitle.format([currentSpace.name]);
		config.annotations[title] = plugin.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);
				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", "excludePublisher"];
			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, flagTiddler) {
		if(curVersion < 0.2) {
			this.createAvatar();
		}
		if(curVersion < 0.3) {
			flagTiddler.tags.pushUnique("excludePublisher"); // XXX: never persisted
		}
		if(curVersion < 0.5) { // v0.4 was faulty
			this.setupMarkupPreHead();
		}
		if(curVersion < 0.6) {
			this.purgeSystemSettings();
		}
	},
	pubTid: {
		tags: ["excludeLists", "excludeSearch"],
		fields: $.extend({}, config.defaultCustomFields, {
			"server.workspace": tiddlyspace.getCurrentWorkspace("public")
		})
	},
	makeTiddlerIfNot: function(tiddler) {
		if (!store.tiddlerExists(tiddler.title)) {
			$.extend(true, tiddler, plugin.pubTid);
			return [store.saveTiddler(tiddler)];
		} else {
			return [];
		}
	},
	firstRun: function() {
		var tiddlers = [];
		// generate Site*itle
		$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
			var tid = new Tiddler(item);
			tid.text = plugin[item].format([currentSpace.name]);
			tiddlers.push.apply(tiddlers,
				plugin.makeTiddlerIfNot(tid));
		});
		// generate public ColorPalette
		var tid = new Tiddler("ColorPalette");
		tid.text = config.macros.RandomColorPalette.generatePalette({
			saturation_pale: 0.67, saturation_light: 0.53,
			saturation_mid: 0.43, saturation_dark: 0.06,
			pale: 0.99, light: 0.85, mid: 0.5, dark: 0.31
		},
			false);
		tiddlers.push.apply(tiddlers, plugin.makeTiddlerIfNot(tid));
		this.createAvatar();
		this.setupMarkupPreHead();
		return tiddlers;
	},
	// remove _cookie slices (TiddlyWiki 2.6.2 beta 6 remnants)
	purgeSystemSettings: function() {
		var ss = store.getTiddler("SystemSettings");
		if(ss) {
			var lines = ss.text.split("\n");
			var persistentOptions = $.grep(lines, function(line, i) {
				return line.indexOf("_cookie:") == -1;
			});
			ss.text = persistentOptions.join("\n");
			ss = store.saveTiddler(ss);
			autoSaveChanges(null, [ss]);
		}
	},
	createAvatar: function() {
		var avatar = "SiteIcon";
		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 = tiddlyspace.getCurrentBag("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 image = config.macros.image;
				if(image && image.refreshImage) {
					var uri = "/%0/tiddlers/SiteIcon".
						format(tiddlyspace.getCurrentWorkspace("public"));
					image.refreshImage(uri);
					image.refreshImage("SiteIcon");
				}
			};
			var _callback = function(tid, status, xhr) {
				tid.title = avatar;
				tid.bag.name = pubBag;
				delete tid.etag;
				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);
	},
	savePublicTiddlerText: function(title, text, pubWorkspace) {
		var tid = new Tiddler(title);
		tid.text = text;
		tid.tags = ["excludeLists"];
		tid.fields = $.extend({}, config.defaultCustomFields);
		tid.fields["server.workspace"] = pubWorkspace;
		tid.fields["server.page.revision"] = "false";
		tid = store.saveTiddler(tid);
		autoSaveChanges(null, [tid]);
	},
	setupMarkupPreHead: function() {
		var pubWorkspace = tiddlyspace.getCurrentWorkspace("public");
		var existing = store.getTiddler("MarkupPreHead");
		if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
			var context = this;
			tweb.getStatus(function(status) {
				var text = markupPreHead.format(currentSpace.name,
					tiddlyspace.getHost(status.server_host, currentSpace.name));
				context.savePublicTiddlerText("MarkupPreHead", text,
					pubWorkspace);
			});
		}
		// also set up DefaultTiddlers
		var title = "DefaultTiddlers";
		existing = store.getTiddler(title) || new Tiddler(title);
		if(existing.fields["server.workspace"] != pubWorkspace) {
			var text = existing.text || store.getShadowTiddlerText(title);
			this.savePublicTiddlerText(title, text, pubWorkspace);
		}
	}
};

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

})(jQuery);
//}}}
/***
|''Name:''|TiddlySpaceIntraSpaceInclusion|
|''Description:''|Provides support for {{{<<tiddler Foo@bar>>}}} and {{{<<tiddler [[Foo]]@bar>>}}}|
|''Author:''|Jon Robson|
|''Source:''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/TiddlySpaceIntraSpaceInclusion/TiddlySpaceIntraSpaceInclusion.js|
|''Version:''|0.3.8a|
|''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|
***/
//{{{
(function() {
	var _tidtext = TiddlyWiki.prototype.getTiddlerText;
	var cache = {};

	// allmost the same regExp as in TiddlySpaceLinkPlugin but .. no "mg" parameter, because it didn't work for this usecase.
	config.textPrimitives.spacenameLinkRegExp = new RegExp(config.textPrimitives.unWikiLink + 
													 "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "");
	config.textPrimitives.tiddlyLinkSpacenameLinkRegExp = new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "");
	
	TiddlyWiki.prototype.getTiddlerText = function(title, defaultText) {
		var ct = config.textPrimitives;
		var match = ct.spacenameLinkRegExp.exec(title);	// foo@bar
		var match2 = ct.tiddlyLinkSpacenameLinkRegExp.exec(title); 	// [[foo]]@bar
		
		if(match || match2) {
		//	console.log('inner: ', 'spacename: ', match, 'tiddlyLink: ', match2, 'place: ');
			var tidtitle, space;
			if(match[1] && match.length === 3) {
				tidtitle = match[1];
				space = match[2];
			} else if(match2 && match2.length === 4) {
				tidtitle = match2[1];
				space = match2[3];
			}
			var newtitle = tidtitle + "@" + space;
			if(tidtitle && space) {
				title = newtitle;
			}
			if(tidtitle && space && !store.getTiddler(newtitle)) {
				var tiddler = new Tiddler(title);
				// get the tiddler, where the macro is rendered. //XXX will need more testing
				var el = story.findContainingTiddler(place);
				var refreshTitle = (el) ? el.getAttribute('tiddler') : null;

				tiddler.text = "//retrieving from server//";
				tiddler.fields.doNotSave = "true";
				tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
				merge(tiddler.fields, config.defaultCustomFields);
				tiddler.fields["server.bag"] = space + "_public";
				tiddler = store.addTiddler(tiddler);
				ajaxReq({ url: "/bags/" + space + "_public/tiddlers/" + tidtitle,
					dataType: "json",
					success: function(tid) {
						var tiddler = store.getTiddler(title);
						tiddler.text = tid.text;
						store.addTiddler(tiddler);
						// store.notify(title,true);
						story.refreshTiddler(refreshTitle,null,true);
						// story.refreshAllTiddlers(); // hacky but above link doesn't always seem to work!
					},
					error: function() {
						var tiddler = store.getTiddler(title);
						tiddler.text = "//error retrieving tiddler {{{" + title + "}}} from space @" + space + "//";
						store.addTiddler(tiddler);
						// store.notify(title,true);
						story.refreshTiddler(refreshTitle,null,true);
						// story.refreshAllTiddlers(); // hacky but above link doesn't always seem to work!
					}
				});
			}
		}
		return _tidtext.apply(this, [title, defaultText]);
	}
})();
//}}}
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.4.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
  {{{@space}}} -- @space 
  {{{~@space}}} -- ~@space 
  {{{Tiddler@space}}} -- Tiddler@space
  {{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space 
  {{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
  {{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
  {{{[[@@space]]}}} -- [[@@space]]
  {{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
  {{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
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 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.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */

function createSpaceLink(place, spaceName, title, alt, isBag) {
	var link, a, currentSpaceName, label;
	try {
		if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
			title = title || spaceName;
			a = createTiddlyLink(place, title, false);
			jQuery(a).text(alt || title);
			return a;
		}
	} catch (ex1) {
		currentSpaceName = false;
	}

	a = jQuery("<a />").addClass('tiddlySpaceLink externalLink').appendTo(place)[0];
	if(title) {
		jQuery(a).attr('tiddler', title);
	}
	if(isBag) {
		jQuery(a).attr('bag', spaceName);
	} else {
		jQuery(a).attr('tiddlyspace', spaceName);
	}

	config.extensions.tiddlyweb.getStatus(function(status) {
		link = status.server_host.url;
		if (title) {
			label = alt || title;
			link = link + "/" + encodeURIComponent(title);
		} else {
			label = alt || spaceName;
		}
		// assumes a http URI without user:pass@ prefix
		if(!isBag) {
			link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
		} else {
			link += "/bags/" + spaceName + "/tiddlers.wiki";
		}
		jQuery(a).attr("href", link).text(label);
	});
	return a;
}

(function ($) {

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

	config.formatters.splice(0, 0, {
		name: "spacenameLink",
		match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
		lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
				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: "tiddlySpaceLink",
		match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
				var space = lookaheadMatch[2] || alt;
				createSpaceLink(w.output, space, "", alt);
				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;
			}
		}
	});

	// ensure space links don't appear as missing links
	config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
	config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";

	// reevaluate derrived expressions ..
	config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");
	config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
		config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");

	// treat space links in titledBracketedLink as external links
	var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
	var isExternalLink = config.formatterHelpers.isExternalLink;
	config.formatterHelpers.isExternalLink = function(link) {
		return missingTiddlySpaceLink.test(link) || isExternalLink(link);
	};

}(jQuery));
//}}}
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.5|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Usage
Provides changeToPrivate, changeToPublic and saveDraft commands
Provides TiddlySpacePublisher macro.
{{{<<TiddlySpacePublisher type:private>>}}} make lots of private tiddlers public.
{{{<<TiddlySpacePublisher type:public>>}}} make lots of public tiddlers public.
!TODO
* add public argument?
!Code
***/
//{{{
(function($) {

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

tiddlyspace.getTiddlerStatusType = function(tiddler) {
	var isShadow = store.isShadowTiddler(tiddler.title);
	var exists = store.tiddlerExists(tiddler.title);
	if(isShadow && !exists) {
		return "shadow";
	} else if(!exists) {
		return "missing";
	} else {
		var types = ["private", "public"];
		var type = "external";
		for(var i = 0; i < types.length; i++) {
			var t = types[i];
			type = config.filterHelpers.is[t](tiddler) ? t : type;
		}
		if(config.filterHelpers.is.unsynced(tiddler)) {
			type = type == "private" ? "unsyncedPrivate" : "unsyncedPublic";
		}
		return type;
	}
};

var cmd = config.commands.publishTiddler = {
	text: "make public",
	tooltip: "Change this private tiddler into a public tiddler",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["private"](tiddler);
	},
	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.fields["publish.name"] || 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;
	},
	copyTiddler: function(title, newTitle, newBag, callback) {
		var original = store.getTiddler(title);
		newTitle = newTitle ? newTitle : title;
		var adaptor = original.getAdaptor();
		var publish = function(original, callback) {
			var tiddler = $.extend(new Tiddler(newTitle), original);
			tiddler.fields = $.extend({}, original.fields, {
				"server.bag": newBag,
				"server.workspace": "bags/%0".format(newBag),
				"server.page.revision": "false"
			});
			delete tiddler.fields["server.title"];
			tiddler.title = newTitle;
			adaptor.putTiddler(tiddler, null, null, callback);
		};
		publish(original, callback);
	},
	moveTiddler: function(tiddler, newTiddler, callback) {
			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, newTitle, newBag, function(ctx) {
				info.copyContext = ctx;
				var context = {
					tiddler: tiddler,
					workspace: newWorkspace
				};
				store.addTiddler(ctx.tiddler);
				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;
							}
							el = el ? el : story.refreshTiddler(oldTitle, null, true);
							if(oldTitle != newTitle) {
								store.deleteTiddler(oldTitle);
								store.notify(oldTitle, true);
							}
							if(el) {
								story.displayTiddler(el, newTitle);
							}
							if(oldTitle != newTitle) {
								story.closeTiddler(oldTitle);
							}
							if(callback) {
								callback(info);
							}
							store.setDirty(_dirty);
						});
					} else {
						if(callback) {
							callback(info);
						}
					}
					refreshDisplay();
				}
		});
	}
};

var changeToPrivate = config.commands.changeToPrivate = {
	text: "make private",
	tooltip: "turn this public tiddler into a private tiddler",
	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["public"](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);
	}
};
config.commands.changeToPublic = cmd;

/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
	text: "save draft",
	tooltip: "Save as a private draft",
	isEnabled: function(tiddler) {
		return changeToPrivate.isEnabled(tiddler);
	},
	getDraftTitle: function(title) {
		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;
			}
		}
		return draftTitle;
	},
	createDraftTiddler: function(title, gatheredFields) {
		var tiddler = store.getTiddler(title);
		var draftTitle = saveDraftCmd.getDraftTitle(title);
		var draftTiddler = new Tiddler(draftTitle);
		if(tiddler) {
			$.extend(true, draftTiddler, tiddler);
		} else {
			$.extend(draftTiddler.fields, config.defaultCustomFields);
		}
		for(var fieldName in gatheredFields) {
			if(TiddlyWiki.isStandardField(fieldName)) {
				draftTiddler[fieldName] = gatheredFields[fieldName];
			} else {
				draftTiddler.fields[fieldName] = gatheredFields[fieldName];
			}
		}
		var privateBag = tiddlyspace.getCurrentBag("private");
		var privateWorkspace = tiddlyspace.getCurrentWorkspace("private");
		draftTiddler.title = draftTitle;
		draftTiddler.fields["publish.name"] = title;
		draftTiddler.fields["server.workspace"] = privateWorkspace;
		draftTiddler.fields["server.bag"] = privateBag;
		draftTiddler.fields["server.title"] = draftTitle;
		draftTiddler.fields["server.page.revision"] = "false";
		delete draftTiddler.fields["server.etag"];
		return draftTiddler;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title); // original tiddler
		var tidEl = story.getTiddler(title);
		var uiFields = {};
		story.gatherSaveFields(tidEl, uiFields);
		var tid = saveDraftCmd.createDraftTiddler(title, uiFields);
		tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier,
			new Date(), tid.tags, tid.fields);
		autoSaveChanges(null, [tid]);
		story.closeTiddler(title);
		story.displayTiddler(src, title);
		story.displayTiddler(src, tid.title);
	}
};

var macro = config.macros.TiddlySpacePublisher = {
	locale: {
		title: "Batch Publisher",
		changeStatusLabel: "Make %0",
		noTiddlersText: "No tiddlers to publish",
		changeStatusPrompt: "Make all the selected tiddlers %0.",
		description: "Change tiddlers from %0 to %1 in this space"
	},

	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: []
	},

	changeStatus: function(tiddlers, status, callback) { // this is what is called when you click the publish button
		var publicBag;
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var newTiddler = {
				title: tiddler.title,
				fields: { "server.bag": cmd.toggleBag(tiddler, status) }
			};
			cmd.moveTiddler(tiddler, newTiddler, callback);
		}
	},
	getMode: function(paramString) {
		var params = paramString.parseParams("anon")[0];
		var status = params.type ?
			(["public", "private"].contains(params.type[0]) ? params.type[0] : "private") :
			"private";
		var newStatus = status == "public" ? "private" : "public";
		return [status, newStatus];
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var wizard = new Wizard();
		var locale = macro.locale;
		var status = macro.getMode(paramString);
		wizard.createWizard(place, locale.title);
		wizard.addStep(macro.locale.description.format(status[0], status[1]),
			'<input type="hidden" name="markList" />');
		var markList = wizard.getElement("markList");
		var listWrapper = $("<div />").addClass("batchPublisher").
			attr("refresh", "macro").attr("macroName", macroName).
			attr("params", paramString)[0];
		markList.parentNode.insertBefore(listWrapper, markList);
		$.data(listWrapper, "wizard", wizard);
		macro.refresh(listWrapper);
	},
	getCheckedTiddlers: function(listWrapper, titlesOnly) {
		var tiddlers = [];
		$(".chkOptionInput[rowName]:checked", listWrapper).each(function(i, el) {
			var title = $(el).attr("rowName");
			if(titlesOnly) {
				tiddlers.push(title);
			} else {
				tiddlers.push(store.getTiddler(title));
			}
		});
		return tiddlers;
	},
	refresh: function(listWrapper) {
		var checked = macro.getCheckedTiddlers(listWrapper, true);
		var paramString = $(listWrapper).empty().attr("params");
		var wizard = $.data(listWrapper, "wizard");
		var locale = macro.locale;
		var params = paramString.parseParams("anon")[0];
		var publishCandidates = [];
		var status = macro.getMode(paramString);
		var pubType = status[0];
		var newPubType = status[1];
		var tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) :
			store.filterTiddlers("[is[%0]]".format(pubType));
		var enabled = [];
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var title = tiddler.title;
			if(!tiddler.tags.contains("excludePublisher") && title !== "SystemSettings") {
				publishCandidates.push({ title: title, tiddler: tiddler, status: pubType});
			}
			if(checked.contains(title)) {
				enabled.push("[rowname=%0]".format(title));
			}
		}

		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) {
				var tiddlers = macro.getCheckedTiddlers(listWrapper);
				var callback = function(status) {
					$(".batchPublisher").each(function(i, el) {
						macro.refresh(el);
					});
				};
				macro.changeStatus(tiddlers, newPubType, callback);
			};
			wizard.setButtons([{
				caption: locale.changeStatusLabel.format(newPubType),
				tooltip: locale.changeStatusPrompt.format(newPubType),
				onClick: btnHandler
			}]);
			$(enabled.join(",")).attr("checked", true); // retain what was checked before
		}
	}
};

})(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);
//}}}
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.2.0|
|''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 = {
	revisionTemplate: "RevisionTemplate",
	revSuffix: " [rev. #%0]", // text to append to each tiddler title
	defaultPageSize: 5, // default number of revisions to show
	defaultLinkText: "View Revisions", // when there's nothing else to use
	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;
		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;
		}

		$(revButton).click(function() {
			if (!$(tiddlerElem).hasClass("revisions")) {
				me.showRevisions(tiddlerElem, tiddler, pageSize);
			} else {
				me.closeRevisions(tiddlerElem);
			}
		});
	},

	// initialisation for revision view
	showRevisions: function(tiddlerElem, tiddler, pageSize) {
		var context = {
			host: tiddler.fields["server.host"],
			workspace: tiddler.fields["server.workspace"]
		};
		$(tiddlerElem).addClass("revisions").attr("revName", tiddler.title);
		// ensure toolbar commands deactivate RevisionsView
		$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
			var _onclick = btn.onclick;
			btn.onclick = function(e) {
				me.closeRevisions(tiddlerElem);
				_onclick.apply(this, arguments);
			};
		});
		// ensure default action deactivates RevisionsView
		var _ondblclick = tiddlerElem.ondblclick;
		tiddlerElem.ondblclick = function(e) {
			me.closeRevisions(tiddlerElem);
			_ondblclick.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);
				});
	},

	// fetch the actual revision and put it in the tiddler div
	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");
				var getTemplate = function() {
					var themeName = config.options.txtTheme;
					if (themeName) {
						return store.getTiddlerSlice(themeName,
							me.revisionTemplate) || me.revisionTemplate ||
							"ViewTemplate";
					} else {
						return (store.getTiddler(me.revisionTemplate)) ?
							me.revisionTemplate : "ViewTemplate";
					}
				};
				var template = getTemplate();
				story.refreshTiddler(tiddler.title, template, true);
				callback(tiddler);
			});
	},

	createCloak: function(promoteElem) {
		var el = $(promoteElem);
		// cache styles for resetting later
		el.data({
			top: el.css("top"),
			left: el.css("left"),
			zIndex: el.css("z-index")
		});

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

		el.css("z-index", me.zIndex + 1);
	},

	// clean up, removing all evidence of revision view
	closeRevisions: function(promoteElem) {
		var el = $(promoteElem);
		// revert the original tiddler back to its previous state
		el.removeAttr("revName").removeClass("revisions").css({
			top: el.data("top"),
			left: el.data("left"),
			zIndex: el.data("zIndex")
		});

		// remove any revisions still in the store
		var revisions = $(".revisions");
		revisions.each(function(index, revision) {
			var revAttributes = revision.attributes;
			if ((revAttributes.revname) &&
					(revAttributes.revision)) {
				var revName = revAttributes.revname.value;
				var revNo = revAttributes.revision.value;
				var title = revName + me.revSuffix.format([revNo]);

				if (store.getTiddler(title)) {
					store.deleteTiddler(title);
				}
			}
		});

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

		// remove the cloak
		$(".revisionCloak").remove();
	},

	// calback from getting list of revisions
	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);
		}
	},

	// place the next div above and behind the previous one
	displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
		var revision = context.revisions[from];
		var callback = function() {
			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);
	},

	// move the already present revisions down by 1 to fit the next one in
	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();
					}
				});
	},

	// where we put the new revision
	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 = $(elem).position().left;
			context.restrictLeft = true;
		} else {
			newPosition.left = currentPosition.left - me.offsetLeft;
		}
		return newPosition;
	},

	// equivalent of displayNextRevision, but for the more button
	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).position().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))
			.position().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);
//}}}
/***
|''Description''|Sanitisation for dynamically pulling tiddlers into your space and displaying them|
!Notes
Works both inside and outside TiddlyWiki. Uses the HTML Sanitizer provided by the Google Caja project
(see http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer for more on this), which is licensed under
an Apache License (see http://www.apache.org/licenses/LICENSE-2.0).
!Code
***/
//{{{
(function($) {

var cleanURL = function(url) {
	var regexp = /^(?:http|https|mailto|ftp|irc|news):\/\//;
	return (regexp.test(url)) ? url : null;
};

$.sanitize = function(html) {
	return html_sanitize(html, cleanURL);
};

/*
 * HTML Sanitizer, provided by Google Caja
 */

/* Copyright Google Inc.
 * Licensed under the Apache Licence Version 2.0
 * Autogenerated at Tue May 17 17:39:24 BST 2011
 * @provides html4
 */var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10},html4.ATTRIBS={"*::class":9,"*::dir":0,"*::id":4,"*::lang":0,"*::onclick":2,"*::ondblclick":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::style":3,"*::title":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::rel":0,"a::rev":0,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"del::cite":1,"del::datetime":0,"dir::compact":0,"div::align":0,"dl::compact":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::ismap":0,"input::maxlength":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::readonly":0,"input::size":0,"input::src":1,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"ol::compact":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"p::align":0,"pre::width":0,"q::cite":1,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::size":0,"select::tabindex":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::cols":0,"textarea::disabled":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::readonly":0,"textarea::rows":0,"textarea::tabindex":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"ul::compact":0,"ul::type":0},html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128},html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:16,area:2,b:0,base:18,basefont:18,bdo:0,big:0,blockquote:0,body:49,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,dd:1,del:0,dfn:0,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,font:0,form:0,frame:18,frameset:16,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:49,hr:2,html:49,i:0,iframe:4,img:2,input:2,ins:0,isindex:18,kbd:0,label:0,legend:0,li:1,link:18,map:0,menu:0,meta:18,nobr:0,noframes:20,noscript:20,object:16,ol:0,optgroup:0,option:1,p:1,param:18,pre:0,q:0,s:0,samp:0,script:84,select:0,small:0,span:0,strike:0,strong:0,style:148,sub:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,title:24,tr:1,tt:0,u:0,ul:0,"var":0},html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2},html4.URIEFFECTS={"a::href":2,"area::href":2,"blockquote::cite":0,"body::background":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0},html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0},html4.LOADERTYPES={"a::href":2,"area::href":2,"blockquote::cite":2,"body::background":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2};var html=function(a){function x(b,c,d){var e=[];w(function(b,e){for(var f=0;f<e.length;f+=2){var g=e[f],h=e[f+1],i=null,j;if((j=b+"::"+g,a.ATTRIBS.hasOwnProperty(j))||(j="*::"+g,a.ATTRIBS.hasOwnProperty(j)))i=a.ATTRIBS[j];if(i!==null)switch(i){case a.atype.NONE:break;case a.atype.SCRIPT:case a.atype.STYLE:h=null;break;case a.atype.ID:case a.atype.IDREF:case a.atype.IDREFS:case a.atype.GLOBAL_NAME:case a.atype.LOCAL_NAME:case a.atype.CLASSES:h=d?d(h):h;break;case a.atype.URI:h=c&&c(h);break;case a.atype.URI_FRAGMENT:h&&"#"===h.charAt(0)?(h=d?d(h):h,h&&(h="#"+h)):h=null;break;default:h=null}else h=null;e[f+1]=h}return e})(b,e);return e.join("")}function w(b){var c,d;return v({startDoc:function(a){c=[],d=!1},startTag:function(e,f,g){if(!d){if(!a.ELEMENTS.hasOwnProperty(e))return;var h=a.ELEMENTS[e];if(h&a.eflags.FOLDABLE)return;if(h&a.eflags.UNSAFE){d=!(h&a.eflags.EMPTY);return}f=b(e,f);if(f){h&a.eflags.EMPTY||c.push(e),g.push("<",e);for(var i=0,j=f.length;i<j;i+=2){var k=f[i],l=f[i+1];l!==null&&l!==void 0&&g.push(" ",k,'="',r(l),'"')}g.push(">")}}},endTag:function(b,e){if(d)d=!1;else{if(!a.ELEMENTS.hasOwnProperty(b))return;var f=a.ELEMENTS[b];if(!(f&(a.eflags.UNSAFE|a.eflags.EMPTY|a.eflags.FOLDABLE))){var g;if(f&a.eflags.OPTIONAL_ENDTAG)for(g=c.length;--g>=0;){var h=c[g];if(h===b)break;if(!(a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG))return}else for(g=c.length;--g>=0;)if(c[g]===b)break;if(g<0)return;for(var i=c.length;--i>g;){var h=c[i];a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG||e.push("</",h,">")}c.length=g,e.push("</",b,">")}}},pcdata:function(a,b){d||b.push(a)},rcdata:function(a,b){d||b.push(a)},cdata:function(a,b){d||b.push(a)},endDoc:function(a){for(var b=c.length;--b>=0;)a.push("</",c[b],">");c.length=0}})}function v(c){return function(d,e){d=String(d);var f=null,g=!1,h=[],j=void 0,l=void 0,m=void 0;c.startDoc&&c.startDoc(e);while(d){var n=d.match(g?t:u);d=d.substring(n[0].length);if(g){if(n[1]){var o=b(n[1]),p;if(n[2]){var q=n[3];switch(q.charCodeAt(0)){case 34:case 39:q=q.substring(1,q.length-1)}p=k(i(q))}else p=o;h.push(o,p)}else if(n[4]){l!==void 0&&(m?c.startTag&&c.startTag(j,h,e):c.endTag&&c.endTag(j,e));if(m&&l&(a.eflags.CDATA|a.eflags.RCDATA)){f===null?f=b(d):f=f.substring(f.length-d.length);var r=f.indexOf("</"+j);r<0&&(r=d.length),l&a.eflags.CDATA?c.cdata&&c.cdata(d.substring(0,r),e):c.rcdata&&c.rcdata(s(d.substring(0,r)),e),d=d.substring(r)}j=l=m=void 0,h.length=0,g=!1}}else if(n[1])c.pcdata&&c.pcdata(n[0],e);else if(n[3])m=!n[2],g=!0,j=b(n[3]),l=a.ELEMENTS.hasOwnProperty(j)?a.ELEMENTS[j]:void 0;else if(n[4])c.pcdata&&c.pcdata(n[4],e);else if(n[5]&&c.pcdata)switch(n[5]){case"<":c.pcdata("&lt;",e);break;case">":c.pcdata("&gt;",e);break;default:c.pcdata("&amp;",e)}}c.endDoc&&c.endDoc(e)}}function s(a){return a.replace(m,"&amp;$1").replace(n,"&lt;").replace(o,"&gt;")}function r(a){return a.replace(l,"&amp;").replace(n,"&lt;").replace(o,"&gt;").replace(p,"&#34;").replace(q,"&#61;")}function k(a){return a.replace(j,g)}function i(a){return a.replace(h,"")}function g(a,b){return f(b)}function f(a){a=b(a);if(c.hasOwnProperty(a))return c[a];var f=a.match(d);if(f)return String.fromCharCode(parseInt(f[1],10));if(!!(f=a.match(e)))return String.fromCharCode(parseInt(f[1],16));return""}var b;"script"==="SCRIPT".toLowerCase()?b=function(a){return a.toLowerCase()}:b=function(a){return a.replace(/[A-Z]/g,function(a){return String.fromCharCode(a.charCodeAt(0)|32)})};var c={lt:"<",gt:">",amp:"&",nbsp:"240",quot:'"',apos:"'"},d=/^#(\d+)$/,e=/^#x([0-9A-Fa-f]+)$/,h=/\0/g,j=/&(#\d+|#x[0-9A-Fa-f]+|\w+);/g,l=/&/g,m=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,n=/</g,o=/>/g,p=/\"/g,q=/\=/g,t=new RegExp("^\\s*(?:(?:([a-z][a-z-]*)(\\s*=\\s*(\"[^\"]*\"|'[^']*'|(?=[a-z][a-z-]*\\s*=)|[^>\"'\\s]*))?)|(/?>)|[\\s\\S][^a-z\\s>]*)","i"),u=new RegExp("^(?:&(\\#[0-9]+|\\#[x][0-9a-f]+|\\w+);|<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\?[^>*]*>|<(/)?([a-z][a-z0-9]*)|([^<&>]+)|([<&>]))","i");return{escapeAttrib:r,makeHtmlSanitizer:w,makeSaxParser:v,normalizeRCData:s,sanitize:x,unescapeEntities:k}}(html4),html_sanitize=html.sanitize

// stop here if we're not in TiddlyWiki
// XXX: is this the correct way of checking for TiddlyWiki?
if (!window.TiddlyWiki || !window.store || !store instanceof TiddlyWiki) {
	return;
}

var tiddlyspace = config.extensions.tiddlyspace;

var _subWikify = Wikifier.prototype.subWikify;

var cleanedTitle = 'This section has been cleaned of any potentially harmful code';

var replaceFunctions = {
	html: function(w) {
		var sanitizedHTML, spanEl;
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			sanitizedHTML = $.sanitize(lookaheadMatch[1]);
			spanEl = createTiddlyElement(w.output, 'span', null, 'sanitized');
			spanEl.innerHTML = sanitizedHTML;
			spanEl.setAttribute('title', cleanedTitle);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	},
	customFormat: function(w) {
		switch(w.matchText) {
			case '@@':
				var e = createTiddlyElement(w.output, 'span');
				var styles = config.formatterHelpers.inlineCssHelper(w);
				if (styles.length === 0) {
					e.className = 'marked';
				}
				w.subWikifyTerm(e, /(@@)/mg);
				break;
			case '{{':
				var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
				lookaheadRegExp.lastIndex = w.matchStart;
				var lookaheadMatch = lookaheadRegExp.exec(w.source);
				if(lookaheadMatch) {
					w.nextMatch = lookaheadRegExp.lastIndex;
					e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
					w.subWikifyTerm(e,/(\}\}\})/mg);
				}
				break;
		}
	}
};

Wikifier.prototype.subWikify = function(output, terminator) {
	var tid = this.tiddler,
		spaceName = tiddlyspace.currentSpace.name,
		tidSpace, recipeName, stripped;
	try {
		recipeName = tid.fields['server.recipe'] ||
			tid.fields['server.workspace'];
		tidSpace = tiddlyspace.resolveSpaceName(recipeName);
		if (tidSpace !== spaceName) {
			// external tiddler, so replace dangerous formatters
			stripped = stripHTML(tid, this.formatter);
		}
	} catch(e) {
		// do nothing. There's no tiddler, so assume it's safe (?!?!?)
	}

	_subWikify.apply(this, arguments);

	if (stripped) {
		// change back to the original function
		unstripHTML(stripped, this.formatter);
	}
};

// replace potentially unsafe formatters with versions that strip bad HTML/CSS
var stripHTML = function(tid, formatter) {
	var popped = {}, _handler;
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (replaceFunctions[f.name]) {
			_handler = f.handler;
			popped[f.name] = _handler;
			f.handler = replaceFunctions[f.name];
		}
	};

	return popped;
};

// put the original formatters back where they belong
var unstripHTML = function(stripped, formatter) {
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (stripped[f.name]) {
			f.handler = stripped[f.name];
		}
	};
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;

config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
	".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);

var search = config.macros.tsSearch = {
	locale: {
		advanced: "Advanced Options",
		header: "Search",
		resultsHeader: "Results (%0)",
		find: "find",
		noResults: "No tiddlers matched your search query",
		query: "QUERY: ",
		error: "please provide a search query or a tag, modifier or title!",
		titleAdvanced: "where the title is",
		modifierAdvanced: "where the last modifier is",
		spaceAdvanced: "only in the space: ",
		notspaceAdvanced: "but not in the spaces: ",
		tagsAdvanced: "with the tags: "
	},
	andConstructor: function(container, label, fieldname, negationMode) {
		var tags = $("<div />").appendTo(container);
		$('<span />').text(label).appendTo(tags);
		var id = "area" + Math.random();
		container = $("<span />").attr("id", id).appendTo(tags)[0];
		function add(container) {
			var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
			if(negationMode) {
				el.attr("negation", "true");
			}
		}
		add(container);
		var el = $("<button />").text("AND").click(function(ev) {
			add($(ev.target).data("container"));
			ev.preventDefault();
		}).appendTo(tags);
		$(el).data("container", container);
	},
	fieldConstructor: function(container, label, field) {
		container = $("<div />").appendTo(container)[0];
		$("<span />").text(label).appendTo(container);
		$("<input />").attr("text", "input").attr("field", field).appendTo(container);
	},
	advancedOptions: function(form) {
		var locale = search.locale;
		var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
		$("<h2/ >").text(search.locale.advanced).appendTo(container);
		$("<div />").addClass("separator").appendTo(container);
		search.fieldConstructor(container, locale.titleAdvanced, "title");
		search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
		search.fieldConstructor(container, locale.spaceAdvanced, "space");
		search.andConstructor(container, locale.notspaceAdvanced, "space", true);
		search.andConstructor(container, locale.tagsAdvanced, "tag");
	},
	constructSearchQuery: function(form) {
		var data = [], select = [];
		var query = $("[name=q]", form).val();
		if(query) {
			data.push("q=%0".format(query));
		}

		// add tags, fields etc..
		$("[field]", form).each(function(i, el) {
			var val = $(el).val();
			var name = $(el).attr("field");
			var negate = $(el).attr("negation") == "true";
			if(val && name) {
				val = encodeURIComponent(val);
				val = negate ? "!" + val : val;
				if(name == "space") {
					val += "_public";
					name = "bag";
				}
				if(negate) {
					select.push("select=%0:%1".format(name,val));
				} else {
					var prefix = data.length === 0 ? "q=" : "";
					data.push('%0%1:"%2"'.format(prefix, name, val));
				}
			}
		});
		var dataString = data.join(" ");
		if(dataString.length === 0 && !query) {
			return false;
		}
		var selectStatement = select.join("&");
		if(dataString.length > 0 && selectStatement.length > 0) {
			dataString += "&";
		}
		dataString += selectStatement;
		return "/search?%0".format(dataString);
	},
	constructForm: function(place) {
		var locale = search.locale;
		$("<h1 />").text(locale.header).appendTo(place);
		var form = $("<form />").appendTo(place)[0];
		$('<input type="text" name="q" />').appendTo(form);
		$('<input type="submit" />').val(locale.find).appendTo(form);
		search.advancedOptions(form);
		var query = $('<h2 class="query"/>').appendTo(place)[0];
		var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
		var lookup = function(url) {
			if(!url) {
				results.empty().addClass("error").text(locale.error);
				return;
			}
			config.extensions.tiddlyweb.getStatus(function(status) {
				$(query).text(locale.query);
				var href = status.server_host.url + url;
				$("<a />").attr("href", href).text(href).appendTo(query);
				tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
					template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
						$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
					}
				});
			});
		};
		$(form).submit(function(ev) {
			ev.preventDefault();
			var url = search.constructSearchQuery(form);
			config.macros.tsSearch.lastSearch = url;
			lookup(url);
		});
		if(search.lastSearch) {
			lookup(search.lastSearch);
		}
		return form;
	},
	handler: function(place) {
		var container = $("<div />").addClass("searchForm").appendTo(place)[0];
		search.constructForm(container);
	}
};

})(jQuery);
//}}}
!Spaces
<<groupBy server.bag>>

!Private
<<list filter [is[private]]>>

!Public
<<list filter [is[public]]>>

!Drafts
<<list filter [is[draft]]>>
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.8.10|
|''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
{{{<<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

!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.
!Code
***/
//{{{
(function($) {

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

var imageMacro = config.macros.image;
var tiddlyspace = config.extensions.tiddlyspace;
var tweb = config.extensions.tiddlyweb;
var cmds = config.commands;
var cmd = cmds.publishTiddler;
tiddlyspace.resolveSpaceName = function(value) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(value) {
		value = value.indexOf("bags/") === 0 ? value.substr(5) : value;
		value = value.indexOf("recipes/") === 0 ? value.substr(8) : value;
		if(value.indexOf("@") === 0) {
			value = value.substr(1);
		}
		if(endsWith(value, "_public")) {
			value = value.substr(0, value.length - 7);
		} else if(endsWith(value, "_private")) {
			value = value.substr(0, value.length - 8);
		}
		value = value.toLowerCase();
	}
	return value;
};

tiddlyspace.renderAvatar = function(place, value, options) {
	options = options ? options : {};
	options.labelOptions = options.labelOptions ? options.labelOptions : { include: false, height: 48, width: 48 };
	options.imageOptions = options.imageOptions ? options.imageOptions : {};
	options.imageOptions.altImage = "/bags/common/tiddlers/defaultUserIcon";
	var container = $('<div class="siteIcon" />').appendTo(place);
	value = tiddlyspace.resolveSpaceName(value);

	tweb.getStatus(function(status) {
		var link, noLabel;
		if(!value || value == config.views.wikified.defaultModifier ||
			value == config.views.wikified.shadowModifier) {
			var icon = config.views.wikified.shadowModifier == value ? "shadowIcon" : "missingIcon";
			if(store.tiddlerExists(icon)) {
				imageMacro.renderImage(container, icon, options.imageOptions);
			} else {
				noLabel = true;
			}
		} else {
			var spaceURI;
			if(value != tiddlyspace.currentSpace.name) {
				spaceURI = options.notSpace ? tiddlyspace.getHost(status.server_host) :
					tiddlyspace.getHost(status.server_host, value);
			}
			link = spaceURI ? $("<a />").attr("href", spaceURI) : $("<span />");
			link.text(value);

			var imageOptions = options.imageOptions;
			if(options.spaceLink && !imageOptions.link) {
				imageOptions.link = spaceURI;
			}
			var avatar = options.notSpace ? false : value;
			var uri = tiddlyspace.getAvatar(status.server_host, avatar);
			imageMacro.renderImage(container, uri, options.imageOptions);
			if(!value) {
				value = "tiddlyspace";
			}
		}
		if(!noLabel && options.labelOptions.include) {
			var prefix = $("<span />").text(options.labelOptions.prefix || "")[0];
			var suffix = $("<span />").text(options.labelOptions.suffix || "")[0];
			$('<div class="label" />').append(prefix).append(link).
				append(suffix).appendTo(container);
		}
	});
	if(value) {
		var prefix = options.labelOptions.prefix || "";
		var suffix = options.labelOptions.suffix || "";
		var label = "%0%1%2".format(prefix, value, suffix);
		$(container).attr("title", label);
	}
};

var originMacro = config.macros.tiddlerOrigin = {
	locale: {
		"shadow": "shadow tiddler",
		"missing": "missing tiddler",
		"private": "private",
		"unknown": "unknown state",
		"public": "public",
		"unsyncedPrivate": "unsynced and private",
		"unsyncedPublic": "unsynced and public",
		externalPrefix: "from ",
		externalBagSuffix: " bag",
		externalSuffix: " space",
		publishPrivateDeletePrivate: "Are you sure you want to make this tiddler public?",
		moveToPrivate: "Are you sure you want to make this tiddler private? Only members will be able to see it.",
		pleaseWait: "please wait..",
		keepPublic: "keep public",
		cannotPublishDirtyTiddler: "The current tiddler is unsaved so cannot be published. Please save the tiddler first.",
		keepPrivate: "keep private",
		makePublic: "make public",
		makePrivate: "make private"
	},
	handler: function(place, macroName, params,wikifier, paramString, tiddler){
		var adaptor = tiddler.getAdaptor();
		var btn = $("<div />").addClass("originButton").attr("params", paramString).
			attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
		$(btn).data("tiddler", tiddler);
		originMacro.refresh(btn);
	},
	refresh: function(btn) {
		$(btn).empty();
		var paramString = $(btn).attr("params");
		var tiddler = $(btn).data("tiddler");
		var options = originMacro.getOptions(paramString);
		var type = tiddlyspace.getTiddlerStatusType(tiddler);
		originMacro.renderIcon(tiddler, type, btn, options);
	},
	getOptions: function(paramString) {
		paramString = "%0 label:no width:48 height:48 spaceLink:yes preserveAspectRatio:yes".format(paramString);
		var parsedParams = paramString.parseParams("name");
		var params = parsedParams[0].name;
		var options = {
			labelOptions: originMacro._getLabelOptions(parsedParams),
			imageOptions: imageMacro.getArguments(paramString, []),
			noclick: parsedParams[0].interactive &&
				parsedParams[0].interactive[0] == "no" ? true : false
		};
		if(!options.noclick) {
			var spaceLink = parsedParams[0].spaceLink;
			options.spaceLink = spaceLink && spaceLink[0] == "no" ? false : true;
		} else {
			options.spaceLink = false;
		}
		return options;
	},
	_getLabelOptions: function(parsedParams) {
		parsedParams = parsedParams[0];
		var includeLabel = !parsedParams.label || ( parsedParams.label && parsedParams.label[0] == "yes" );
		var prefix = parsedParams.labelPrefix ? parsedParams.labelPrefix[0] : false;
		var suffix = parsedParams.labelSuffix ? parsedParams.labelSuffix[0] : false;
		return { include: includeLabel, suffix: suffix, prefix: prefix };
	},
	_isSpace: function(value) {
		value = value ? value : "";
		var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
		if(endsWith(value, "_private") || endsWith(value, "_public")) {
			return true;
		} else {
			return false;
		}
	},
	renderIcon: function(tiddler, type, button, options) {
		var locale = originMacro.locale;
		originMacro.annotateTiddler(button, type);
		if(type != "external") {
			originMacro.showPrivacyRoundel(tiddler, type, button,
				options);
		} else {
			var prefix = options.labelOptions.prefix, suffix = options.labelOptions.suffix;
			var space = tiddler.fields["server.bag"];
			options.notSpace = !originMacro._isSpace(space);
			options.labelOptions.prefix = prefix ? prefix : locale.externalPrefix;
			options.labelOptions.suffix = suffix ? suffix : (options.notSpace ? locale.externalBagSuffix : locale.externalSuffix);

			tiddlyspace.renderAvatar(button, space, options);
		}
	},
	showPrivacyRoundel: function(thisTiddler, privacyType, button, options) {
		// there is a public tiddler as well as the current tiddler!
		// TODO: 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.
		$(button).empty();
		var icon = "%0Icon".format(privacyType);
		if(privacyType.indexOf("unsynced") === 0 && !store.tiddlerExists(icon)) {
			icon = "unsyncedIcon";
		}
		if(privacyType == "shadow") {
			if(!store.tiddlerExists(icon)) {
				icon = "bags/tiddlyspace/tiddlers/SiteIcon";
			}
		}
		if(privacyType == "missing" && !store.tiddlerExists(icon)) {
			return; // the user is not making use of the missingIcon
		} else {
			imageMacro.renderImage(button, icon, options.imageOptions);
			originMacro.showLabel(button, privacyType, options.labelOptions);
			var cmd = originMacro.iconCommands[privacyType];
			if(cmd && thisTiddler && !options.noclick) {
				$(button).click(function(ev) {
					cmd(ev, thisTiddler);
				});
			}
		}
	},
	annotateTiddler: function(place, type) {
		var tidEl = $(story.findContainingTiddler(place));
		tidEl.
			removeClass("private public external privateAndPublic privateNotPublic shadow").
			addClass(type);
	},
	showLabel: function(button, type, options) {
		var locale = originMacro.locale;
		var label = options.label ? options.label : locale[type];
		label = label ? label : locale.unknown;
		if(options && options.include) {
			$('<div class="roundelLabel" />').html(label).appendTo(button);
		}
		$(button).attr("title", label);
	},
	confirm: function(ev, msg, onYes, options) {
		options = options ? options : {};
		onYes = onYes ? onYes : function(ev) {};
		var btn = $(".originButton", $(ev.target).parents())[0];
		var popup = Popup.create(btn);
		$(popup).addClass("confirmationPopup");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		$("<button />").addClass("button").text(options.yesLabel || "yes").appendTo(popup).click(onYes);
		$("<button />").addClass("button").text(options.noLabel || "no").click(function(ev) {
			Popup.remove();
		}).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	alert: function(ev, msg) {
		var popup = Popup.create(ev.target);
		$(popup).addClass("confirmationPopup alert");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
	},
	reportDirty: function(el) {
		originMacro.alert(el, originMacro.locale.cannotPublishDirtyTiddler);
	},
	iconCommands: {
		"public": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var msg = locale.moveToPrivate;
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var target = $(ev.target);
						var onComplete = function(info) {};
						var privateBag = cmd.toggleBag(tiddler, "private");
						cmd.moveTiddler(tiddler, {
							title: tiddler.title,
							fields: { "server.bag": privateBag }
						}, onComplete);
					}, { yesLabel: locale.makePrivate, noLabel: locale.keepPublic });
				}
			}
		},
		"private": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var adaptor = tiddler.getAdaptor();
				var publishTo = tiddler.fields["publish.name"] || tiddler.title;
				var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
				tiddler.fields["server.workspace"] = workspace;
				var publicBag = cmd.toggleBag(tiddler, "public");
				var msg;
				msg = locale.publishPrivateDeletePrivate;
				var title = tiddler.title;
				var newTitle = publishTo || tiddler.title;
				tiddler.fields["server.page.revision"] = "false";
				store.addTiddler(tiddler);
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var onComplete = function(info) {};
						cmd.moveTiddler(tiddler, {
							title: newTitle,
							fields: { "server.bag": publicBag }
						}, onComplete);
					}, { yesLabel: locale.makePublic, noLabel: locale.keepPrivate });
				}
			}
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.6|
|''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}}}
In readonly mode a tiddler called {{{<command>ReadOnly.svg}}} will be used if it exists.
!TODO
* rename (IconToolbarPlugin?)
* support more than one more popup menu in the toolbar.
!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).each(function(i, el) {
			el.onclick = macro.onClickMorePopUp;
		});
		// buttons that are after a less command should not be in more menu.
		$(".lessCommand ~ .button", place).appendTo(place);
		$(".lessCommand", place).remove();
	}
	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(readOnly) {
			var readOnlyAlternative = "%0ReadOnly".format([icon]);
			if(store.tiddlerExists(readOnlyAlternative)) {
				icon = readOnlyAlternative;
			}
		}
		if(store.tiddlerExists(icon)) {
			$(el).css({display: "inline-block"}).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;
	if(sibling) {
		var commands = sibling.childNodes;
		var popup = Popup.create(this);
		$(popup).addClass("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);
//}}}
/***
|''Name''|TiddlySpaceViewTypes|
|''Version''|0.6.0|
|''Status''|@@beta@@|
|''Description''|Provides TiddlySpace specific view types|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceViewTypes.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin|
!Usage
Provides replyLink, spaceLink and SiteIcon view types.
!!SiteIcon view parameters
* labelPrefix / labelSuffix : prefix or suffix the label with additional text. eg. labelPrefix:'modified by '
* spaceLink: if set to "yes" will make any avatars link to the corresponding space. {{{<<originMacro spaceLink:yes>>}}}

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

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;
var tweb = config.extensions.tiddlyweb;

config.macros.view.replyLink = {
	locale: {
		label: "Reply to this tiddler"
	}
};

var _replyButtons = [];
var _replyInitialised, _replyScriptLoaded;
config.macros.view.views.replyLink = function(value, place, params, wikifier,
		paramString, tiddler) {
	var valueField = params[0];
	var imported;
	if(valueField == "title") { // special casing for imported tiddlers
		var localTitle = tiddler.title;
		var serverTitle = tiddler.fields["server.title"];
		if(serverTitle && localTitle != serverTitle) {
			value = serverTitle ? serverTitle : localTitle;
			imported = true;
		}
	} else {
		title = tiddler[valueField] ? tiddler[valueField] : tiddler.fields[valueField];
	}
	var args = paramString.parseParams("anon")[0];
	var label = (args.label) ? args.label : config.macros.view.replyLink.locale.label;
	var space;
	if(tiddler) {
		var bag = tiddler.fields["server.bag"];
		space = tiddlyspace.resolveSpaceName(bag);
	}
	var container = $('<span class="replyLink" />').appendTo(place)[0];

	tweb.getUserInfo(function(user) {
		if ((!user.anon) && ((space && user.name != space &&
				user.name != tiddlyspace.currentSpace.name) || imported)) {
			var link = $("<a />")
				.text(config.macros.view.replyLink.locale.label)
				.appendTo(container)[0];

			if(typeof(createReplyButton) === "undefined") {
				_replyButtons.push(link);
			}
			if(_replyInitialised) {
				createReplyButton(link);
			} else if(!_replyScriptLoaded) {
				_replyScriptLoaded = true;
				$.getScript("/bags/common/tiddlers/_reply-button.js",
					function() {
						_replyInitialised = true;
						for(var i = 0; i < _replyButtons.length; i++) {
							createReplyButton(_replyButtons[i]);
						}
						_replyButtons = [];
					});
			}
		}
	});

};

config.macros.view.views.spaceLink = function(value, place, params, wikifier,
		paramString, tiddler) {
		var spaceName = tiddlyspace.resolveSpaceName(value);
		var isBag = params[0] == "server.bag" && value === spaceName ? true : false;
		var args = paramString.parseParams("anon")[0];
		var titleField = args.anon[2];
		var labelField = args.labelField ? args.labelField[0] : false;
		var label;
		if(labelField) {
			label = tiddler[labelField] ? tiddler[labelField] : tiddler.fields[labelField];
		} else {
			label = args.label ? args.label[0] : false;
		}
		var title = tiddler[titleField] ? tiddler[titleField] : tiddler.fields[titleField];

		var link = createSpaceLink(place, spaceName, title, label, isBag);
		if(args.external && args.external[0] == "no") {
			$(link).click(function(ev) {
				var el = $(ev.target);
				var title = el.attr("tiddler");
				var bag = el.attr("bag");
				var space = el.attr("tiddlyspace");
				bag = space ? space + "_public" : bag;
				if(title && bag) {
					ev.preventDefault();
					tiddlyspace.displayServerTiddler(el[0], title,
						"bags/" + bag);
				}
				return false;
			});
		}
};

config.macros.view.views.SiteIcon = function(value, place, params, wikifier,
		paramString, tiddler) {
	var options = originMacro.getOptions(paramString);
	if(!tiddler || value == "None") { // some core tiddlers lack modifier
		value = false;
	}
	var field = params[0];
	if(field == "server.bag") {
		options.notSpace = !originMacro._isSpace(value);
	}
	tiddlyspace.renderAvatar(place, value, options);
};

})(jQuery);
//}}}
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''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 = responseText ? status : false;
	try {
		context.statusText = xhr.statusText;
	} catch(exc) { // offline (Firefox)
		context.status = false;
		context.statusText = null;
	}
	context.httpStatus = xhr.status;
	if(context.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 tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			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 tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			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.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 tid = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false;
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		var tiddler = adaptor.toTiddler(tid, context.host);
		tiddler.title = context.tiddler.title;
		tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		// normally we'd assign context.tiddler = tiddler here - but we can't do
		// that because of IE, which triggers getTiddler in putTiddlerCallback,
		// and since ServerSideSavingPlugin foolishly relies on persistent
		// object references, we need to merge the data into the existing object
		$.extend(context.tiddler, tiddler);
	}
	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 loc = xhr.getResponseHeader("Location");
		var etag = xhr.getResponseHeader("Etag");
		if(loc && etag) {
			var bag = loc.split("/bags/").pop().split("/")[0];
			context.tiddler.fields["server.bag"] = bag;
			context.tiddler.fields["server.workspace"] = "bags/" + bag;
			var rev = etag.split("/").pop().split(/;|:/)[0];
			context.tiddler.fields["server.page.revision"] = rev;
			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]);
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.title = to.title;
		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) {
			if(!context.status) {
				return callback(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);
		}
		$.extend(true, newTiddler, context.tiddler);
		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;
};

// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
	var created = Date.convertFromYYYYMMDDHHMM(json.created);
	var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
	var fields = json.fields;
	fields["server.type"] = adaptor.serverType;
	fields["server.host"] = AdaptorBase.minHostName(host);
	fields["server.bag"] = json.bag;
	fields["server.title"] = json.title;
	if(json.recipe) {
		fields["server.recipe"] = json.recipe;
	}
	if(json.type && json.type != "None") {
		fields["server.content-type"] = json.type;
	}
	fields["server.permissions"] = json.permissions.join(", ");
	fields["server.page.revision"] = json.revision;
	fields["server.workspace"] = "bags/" + json.bag;
	var tiddler = new Tiddler(json.title);
	tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
		created, json.fields, json.creator);
	return tiddler;
};

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);
//}}}
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.2|
|''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 ? plugin.username == "GUEST" : true
			});
		});
	},
	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);
//}}}
<<view title link>>
//''<<view 'server.content-type' text>>''//
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.7.1|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate, and allows you to set a default privacy setting|
|''CoreVersion''|2.6.1|
|''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">>}}}

There is an option, found in the tweak tab of the backstage, called txtPrivacyMode. Set this to either ''public'' or ''private'' depending on your security preference. If you choose not to set it then it will default to ''public''.
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)

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

	var tiddlyspace = config.extensions.tiddlyspace,
		macro;
	macro = config.macros.setPrivacy = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			if(readOnly) {
				return;
			}
			var el = $(story.findContainingTiddler(place)),
				args = paramString.parseParams("name",
					null, true, false, true)[0],
				container = $("<div />").
					addClass("privacySettings").
					appendTo(place)[0],
				currentSpace = tiddlyspace.currentSpace.name,
				currentBag = tiddler ? tiddler.fields["server.bag"] : false,
				// XXX: is the following reliable?
				isNewTiddler = el.hasClass("missing") || !currentBag,
				tiddlerStatus = tiddlyspace.getTiddlerStatusType(tiddler),
				customFields = el.attr("tiddlyfields"),
				defaultValue = "public",
				options = config.macros.tiddlerOrigin ?
						config.macros.tiddlerOrigin.getOptions(paramString) :
						{};
			customFields = customFields ? customFields.decodeHashMap() : {};
			if(isNewTiddler || !["public", "private", "unsyncedPrivate",
					"unsyncedPublic"].contains(tiddlerStatus)) {
				if(args.defaultValue) {
					defaultValue = args.defaultValue[0].toLowerCase();
				} else {
					defaultValue = config.options.chkPrivateMode ?
							"private" : "public";
				}
				defaultValue = defaultValue ?
						"%0_%1".format(currentSpace, defaultValue) :
						customFields["server.bag"];
				this.createRoundel(container, tiddler, currentSpace,
						defaultValue, options);
			}
		},
		updateEditFields: function(tiddlerEl, bag) {
			var saveBagField = $('[edit="server.bag"]', tiddlerEl),
				saveWorkspaceField = $('[edit="server.workspace"]', tiddlerEl),
				input = $("<input />").attr("type", "hidden"),
				workspace = "bags/" + bag;
			if(saveBagField.length === 0) {
				input.clone().attr("edit", "server.bag").val(bag).
					appendTo(tiddlerEl);
			} else {
				saveBagField.val(bag);
			}
			// reset to prevent side effects
			$(tiddlerEl).attr("tiddlyFields", "");
			if(saveWorkspaceField.length === 0) {
				input.clone().attr("edit", "server.workspace").
					val(workspace).appendTo(tiddlerEl);
			} else {
				saveWorkspaceField.val(workspace);
			}
		},
		setBag: function(tiddlerEl, newBag, options) {
			var bagStatus,
				title = $(tiddlerEl).attr("tiddler"),
				tiddler = store.getTiddler(title),
				originButton = $(".originButton", tiddlerEl)[0],
				refreshIcon,
				newWorkspace = "bags/" + newBag,
				rPrivate = $("input[type=radio].isPrivate", tiddlerEl),
				rPublic = $("input[type=radio].isPublic", tiddlerEl);
			refreshIcon = function(type) {
				var originMacro = config.macros.tiddlerOrigin;
				if(originButton && originMacro) {
					options.noclick = true;
					originMacro.showPrivacyRoundel(tiddler, type,
							originButton, options);
				}
			};
			macro.updateEditFields(tiddlerEl, newBag);
			if(tiddler) {
				tiddler.fields["server.bag"] = newBag;
				// for external tiddlers
				tiddler.fields["server.workspace"] = newWorkspace;
			}
			if(newBag.indexOf("_public") > -1) {
				rPrivate.attr("checked", false);
				rPublic.attr("checked", true);
				bagStatus = "public";
			} else {
				rPublic.attr("checked", false); // explicitly do this for ie
				rPrivate.attr("checked", true);
				bagStatus = "private";
			}
			refreshIcon(bagStatus);
		},
		createRoundel: function(container, tiddler, currentSpace,
							   defaultValue, options) {
			var privateBag = "%0_private".format(currentSpace),
				publicBag = "%0_public".format(currentSpace),
				rbtn = $("<input />").attr("type", "radio").
					attr("name", tiddler.title),
				el = story.findContainingTiddler(container);
			rbtn.clone().val("private").addClass("isPrivate").
				appendTo(container);
			$("<label />").text("private").appendTo(container); // TODO: i18n
			rbtn.clone().val("public").addClass("isPublic")
				.appendTo(container);
			$("<label />").text("public").appendTo(container); // TODO: i18n
			$("[type=radio]", container).click(function(ev) {
				var btn = $(ev.target);
				tiddler.fields["server.page.revision"] = "false";
				if(btn.hasClass("isPrivate")) { // private button clicked.
					$(el).addClass("isPrivate").removeClass("isPublic");
					macro.setBag(el, privateBag, options);
				} else {
					$(el).addClass("isPublic").removeClass("isPrivate");
					macro.setBag(el, publicBag, options);
				}
			});
			window.setTimeout(function() {
				macro.setBag(el, defaultValue, options);
			}, 100);
			// annoyingly this is needed as customFields are added to end of EditTemplate so are not present yet
			// and don't seem to respect any existing customFields.
		}
	};

}(jQuery));
//}}}
|~ViewToolbar|closeTiddler editTiddler cloneTiddler|
|~ViewToolbar2|+editTiddler +cloneTiddler > fields refreshTiddler changeToPublic changeToPrivate revisions syncing permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
/*{{{*/
(function() {
	var $ = jQuery,
		plugin;
		config.macros.tree = {};
	plugin = config.macros.tree;
	plugin.handler = function(place,macroName,params) {
		var tags = params[0],
			$contentsList;
		if(!tags) {
			return;
		}
		tags = params[0].readBracketedList();
		$contentsList = $('<ul class="browsingTool"></ul>')
			.appendTo(place);
		$.each(tags, function(i, tag) {
			plugin.addListItems(tag, $contentsList);
		});
	};
	plugin.addListItems = function(tag, $parentList, recursionLevel) {
		if(!recursionLevel) {
			recursionLevel = 0;
		}
		var tiddlers,
			moreTids,
			link,
			$listItem,
			$subList;

		link = createTiddlyLink(null,tag,false);
		$listItem = $('<li></li>').appendTo($parentList);
		$(link)
			.append(tag)
			.appendTo($listItem);
			
		if(recursionLevel<2) {
			tiddlers = store.getTaggedTiddlers(tag);
			moreTids = tiddlers.length;
			if(moreTids) {
				$listItem.prepend('<span class="closed"></span>');
				$subList = $('<ul></ul>')
					.css('display','none')
					.appendTo($listItem);
			
				$listItem.click(function(e) {
					if($(e.target).is('ul')) { // you clicked on the background!
						return false;
					}
					$(this)
						.children('span')
						.toggleClass('closed open')
						.end()
						.children('ul')
						.slideToggle();
					return false;
				});
				
				$.each(tiddlers, function(i, tid) {
					plugin.addListItems(tid.title, $subList, recursionLevel+1);
				});
			}
		}
		if(!moreTids) {
			$listItem.click(function(e) {
				return false;
			});
		}
	};
}());
/*}}}*/

/* structure we're aiming for:
	<ul>
		<li>
			<span class="open"></span><a>Introduction</a>
			<ul>
				<li><a>Overview of AMBIT</a></li>
				<li><a>Core Features of Ambit</a></li>
				<li><a>Feedback Please!</a></li>
				<li><a>Find your way around</a></li>
				<li><a>Security and authorisation</a></li>
				<li><a>Start here: Mark the task</a></li>
				<li><a>Using the Manual</a></li>
				<li><a>Videos</a></li>
			</ul>
		</li>
		<li><span class="closed"></span><a>What is our team?</a>
			<ul>
				<li><a>Sample link</a></li>
			</ul>
		</li>
	</ul>
*/
<!--{{{-->
<h2 macro='view title text'></h2>
<p class="provenanceLabel" macro='provenance'></p>
<p class="voteOfConfidenceLabel" macro='voteOfConfidence'></p>
<div class="toolbar" macro='toolbar [[ToolbarCommands::ViewToolbar]]'>
	<!--<a class="close" title="Close this page" href="#">Close</a>
	<a class="edit" title="Edit this page" href="#">Edit</a>
	<a class="duplicate" title="Copy this page into your manual" href="#">Duplicate</a>-->
</div>
<div class="watermark">
	<!--<span class="title">Derived from:</span>
	<span class="value"><a href="#">CASUS</a></span>
	<p>
		<a href="#">comparison</a> / <a href="#">original</a> -->
	</p>
</div>
<span class="infoToggle"><a href="#"><span>+</span> show references & info</a></span>
<hr class="infoBorder" />
<div class="info">
	<div class="column">
		<h3>Information about this page:</h3>
		<ul>
			<li>Edited by <span macro='view modifier link'></span></li>
			<li>Edited on <span macro='view modified date "0hh:0mm - 0DD/0MM/0YY"'></span></li>
			<li>Explore this topic's <span class="noButton" macro="ambitRevisions"></span></li>
			<li>Explore this topic's <span class="noButton" macro="ambitReferences"></span></li>
		</ul>
	</div>
	<div class="column">
		<h3>Versions of this page in other manuals:</h3>
		<p>There are <span macro="ambitElsewhere"> other manuals</span> with different versions of this topic.</p>
	</div>
	<div class="column">
		<h3>This page contains These sub-topics:</h3>
		<div macro="ambitTagging"></div>
		<span macro="newHere label:'new sub-topic' title:'new sub-topic' class:'button'"></span>
	</div>
	<div class="column">
		<h3>This page is a sub-topic of:</h3>
		<div class="noButton" macro="ambitTags"></div>
	</div>
</div>
<div class="article">
	<div class='viewer' macro='view text wikified'></div>
</div>
<!--}}}-->
/*{{{*/

/*
	What we're doing
		- go find all content that is cloned from this space (on init)
		- when running the macro, try to find this tiddler in the content
			- if found, show count of tiddlers
		- when you click on the count, open up a popup with the information:
			- title of tiddler / space / date cloned

	BUG: if the tiddler loads visible (e.g. by visiting that previous link), this doesn't work. See Provenance macro for help I think! The view needs to be refreshed
	
	On cloning, what I want to be able to support is this flow:
		- I clone a tiddler and save it in my space
		- when I visit the space I cloned the tiddler from, the tiddler I cloned tells me that clones of it exist, and points to which spaces they are in and when they were cloned
		- I want this connection to remain EVEN IF I change the title of the tiddler in my space
		(nice to have: - I want this connection to remain EVEN IF the title of the tiddler I cloned changes)

	pieces:
		- <bag>/<title> _source field e.g. _source: /bags/totw_public/tiddlers/Why
		- preserving original title in a field when renaming (?) You could presumably alter the rename routines to keep a
history of previous names
			- don't do this for now
		- TwinTiddlers (?)

*/

var voteOfConfidenceMacro = config.macros.voteOfConfidence = {
	/* Vote of Confidence macro checks how many times a tiddler has been cloned and display some information about those clones. */
	clonedTiddlers: {},
	queue: [],
	init: function() {
		var plugin = config.macros.voteOfConfidence,
			$ = jQuery,
			currentSpace = config.extensions.tiddlyspace.currentSpace.name,
			url = "/search.json?q=tiddler.source:"+currentSpace+"_public";
		url = "/search.json?q=tiddler.source:"+currentSpace+"_public"; // this is for debug
		$.ajax({
			url: url,
			dataType: "json",
			success: function(tiddlers) {
				plugin.initDone = true;
				// make sure we are not including any non-ambit tiddlers
				tiddlers = $.grep(tiddlers, function(t, i) {
					return t.bag.indexOf('ambit')!==-1;
				});
				// index all the cloned tiddlers by _source
				$.each(tiddlers, function(i, tiddler) {
					var _source = tiddler.fields['tiddler._source'];
					if(!_source) {
						return true;
					}
					if(!plugin.clonedTiddlers[_source]) {
						plugin.clonedTiddlers[_source] = [];
					}
					plugin.clonedTiddlers[_source].push(tiddler);
				});
				// trigger any waiting macro calls
				$.each(plugin.queue, function() {
					this();
				});
			},
			error: function() {
				// TO-DO: decide what to do in the event of an error
			}
		});
	},
	getSourceFromTitle: function(title,space) {
		var currentSpace = config.extensions.tiddlyspace.currentSpace.name;
		return '/bags/'+(currentSpace||space)+'_public/tiddlers/'+encodeURIComponent(title);
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var plugin = config.macros.voteOfConfidence,
			displayCloneCount = function() {
				var plugin = config.macros.voteOfConfidence,
					$ = jQuery,
					$place = $(place),
					title = tiddler.title,
					_source = plugin.getSourceFromTitle(title),
					clones = plugin.clonedTiddlers[_source],
					clonedCount = clones && clones.length;
				if(!clonedCount) {
					return;
				}
				$place.html('<a href="#">cloned '+clonedCount+' times</a>')
					.children('a')
					.click(function(e) {
						e.preventDefault();
						var popup = Popup.create(this,null,"voteOfConfidence popup"),
							$popup = $(popup),
							htmlPieces = ["<div>"];
						$.each(clones, function(i, t) {
							var space = t.bag.replace('_public',''),
								created = Date.convertFromYYYYMMDDHHMM(t.created).formatString('0DD/0MM/YY');
							htmlPieces.push("<div class='grid2col left marginright'><a href='http://"+space+".tiddlyspace.com/#[["+t.title+"]]' target='_blank'>"+t.title+"</a></div><div class='grid2col left marginright'>"+space+"</div><div class='grid2col left'>"+created+"</div><br class='clearboth' />");
						});
						htmlPieces.push("</div>");
						html = htmlPieces.join("\n");
						$(html).appendTo($popup);
						Popup.show();
						return false;
					});
			};
		if(!plugin.initDone) {
			// place this call into a queue
			plugin.queue.push(displayCloneCount);
		} else {
			// perform this call now
			displayCloneCount();
		}
	}
};

/* addition to cloneTiddler so that it saves the cloned tiddler title as _source field */
var _cloneHandler = config.commands.cloneTiddler.handler;
config.commands.cloneTiddler.handler = function(event, src, title) {
	var _tiddler = store.getTiddler(title);
	var source = _tiddler ? _tiddler.fields["server.bag"] : false;
	var _source = _tiddler ? '/bags/'+source+'/tiddlers/'+encodeURIComponent(_tiddler.title) : false;
	var realTitle = _tiddler ? _tiddler.fields["server.title"] : title;
	_cloneHandler.apply(this, [event, src, title]);
	var tidEl = story.getTiddler(title);
	$(story.getTiddlerField(title, "title")).val(realTitle);
	if(_source) {
		$("<input />").attr("type", "hidden").attr("edit", "tiddler._source").val(_source).appendTo(tidEl);
	}
};

/*}}}*/
/*{{{*/
(function($) {
	var $readingList,
		plugin;
	config.macros.youAreReading = {};
	plugin = config.macros.youAreReading;
	
	plugin.handler = function(place) {
		if(!$readingList) {
			$(document).bind("startup", this.dispatch);
		}
		$readingList = $('<ul class="browsingTool"></ul>').appendTo(place);
	};
	plugin.addItem = function(title, flashing) {
		var link = createTiddlyLink(null,title,true,(flashing ? "active" : "")),
			$newItem = $('<li></li>')
				.append('<span class="close">&times;</span>')
				.append(link);
		$newItem
			.appendTo($readingList)
			.find('span.close')
			.click(function() {
				story.closeTiddler(title, true);
			});
		if(flashing) {
			$newItem.css('backgroundColor', '#FFF')
				.fadeOut(75, function() {
					$newItem.fadeIn(75, function() {
						$newItem.css('backgroundColor', 'transparent');
					});	
				});
		}
	};
	plugin.refreshList = function(activeTitle, omit) {
		var title,
			active,
			id,
			idPrefix = "",
			prefixLength = idPrefix.length;
		$readingList.empty();
		$(story.getContainer())
			.find('.tiddler')
			.each(function(i, tid) {
				id = $(tid).attr("tiddler");
				title = id.substring(prefixLength);
				if(title && omit!==title) {
					active = activeTitle===title;
					plugin.addItem(title, active);
				}
			});
	};
	plugin.dispatch = function() {
		// populate list with default story
		plugin.refreshList();
			
		var tmpDisplayTiddler = Story.prototype.displayTiddler;
		Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly) {
			var $element = $(srcElement);
			// disable scrolling for opening tiddlers from #tiddlerDisplay
			if($element.closest('#tiddlerDisplay').length) {
				/*var tmpStartAnimating = anim.startAnimating;
				anim.startAnimating = function() {
					anim.startAnimating = tmpStartAnimating;
				};*/
				var tmpAnimate = config.options.chkAnimate;
				var tmpScrollTo = window.scrollTo;
				window.scrollTo = function() {
					window.scrollTo = tmpScrollTo;
					config.options.chkAnimate = tmpAnimate;
				};
				config.options.chkAnimate = false;
				var tmpPositionTiddler = Story.prototype.positionTiddler;
				Story.prototype.positionTiddler = function() {
					Story.prototype.positionTiddler = tmpPositionTiddler;
					return null; // open at bottom
				};
				// animate the title over to the you are reading list
				var linkText = $element.is('a') ? $element.text() : (tiddler instanceof Tiddler ? tiddler.title : tiddler),
					$linkClone = $("<span>"+linkText+"</span>").appendTo($('#displayArea')),
					y = $element.offset().top,
					mainPaneOffset = $('#displayArea').offset(),
					x = $element.offset().left-mainPaneOffset.left,
					$readingList = $('#currentlyOpenPanel li'),
					existingList = $readingList.map(function(i) {
						if($(this).children('a').text()===linkText) {
							return i;
						}
					}).get(),
					panelIsVisible = $('#sidebar').position().left>=0 && $('#currentlyOpenPanel ul').height(),
					$existingLink = existingList.length && $readingList.eq(existingList[0]).children('a'),
					$target,
					$toX,
					$toY;
				$target = panelIsVisible ? $existingLink : $('#sidebarIcons #current span');
				if($target.length) {
					toY = $target.offset().top + parseInt($target.css('paddingTop'),10) + parseInt($target.css('marginTop'),10);
					toX = $target.offset().left;
				} else {
					$target = $readingList.last();
					toY = $target.height();
					$target = $target.children('a');
					toY += $target.offset().top + parseInt($target.css('paddingTop'),10) + parseInt($target.css('marginTop'),10);
					toX = $target.offset().left;
				}
				$linkClone.css({
					"position": "absolute",
					"z-index": "10",
					"top": y+'px',
					"left": x+'px',
					"lineHeight": "1em",
					"color": "#000000",
					"opacity": 0.7
				}).animate({
					'opacity': 0.5,
					'top': toY+'px',
					'left': toX-mainPaneOffset.left+'px'
				},
				1000,
				function() {
					$(this).remove();
				});
			}
			// recreate list when tiddler opened - JRL: this looks wrong, as title is used before it is defined...
			var t = story.chooseTemplateForTiddler(title, template);
			tmpDisplayTiddler.apply(this, [srcElement, tiddler, template, animate, slowly]);

			if(t.indexOf('ViewTemplate')!==-1) {
				var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler;
				plugin.refreshList(title);
			}
			$(document).trigger("StoryUpdated");
		};
		
		// recreate list when tiddler closed
		var tmpCloseTiddler = Story.prototype.closeTiddler;
		Story.prototype.closeTiddler = function(title, animate, unused) {
			tmpCloseTiddler.apply(this, arguments);
			plugin.refreshList(title, title);
			$(document).trigger("StoryUpdated", [true]);
		}
	};
}(jQuery));
/*}}}*/
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>Account</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/jquery-ui.custom.css" type='text/css' rel='stylesheet' >
</head>
<body>

<div id="container">
	<div class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<div id="siteiconArea">
		<h2>User Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		</div>
		<h2>Find Space</h2>
		<form class="spaceSearch">
			<input class="inputBox" type="text" placeholder="find space" />
			<a href="http://docs.tiddlyspace.com/What%20is%20a%20Space%3F" class="help"
				title="What is a space?">What is a space?</a>
			<button>view all</button>
		</form>
		<div class='list-container'>
			You are a member of the following spaces:
			<ul class='ts-space-search'>
			</ul>
		</div>
		<h2>Create New Space</h2>
		<form class="ts-spaces">
			<input class="inputBox" type="text" name="spacename" placeholder="space name"><span class="hostSuffix">.tiddlyspace.com</span>
			<input type="submit" value="Create Space" />
		</form>
		</div>
		<div class="right">
		<h2>Change Password</h2>
		<form class="ts-password">
			<input class="inputBox" placeholder="existing password" type="password" name="password">
			<input class="inputBox" placeholder="new password" type="password" name="new_password">
			<input class="inputBox" placeholder="new password"	type="password" name="new_password_confirm">
			<input type="submit" value="Change password">
		</form>
		<h2>OpenID</h2>
		<h3>Why OpenID?</h3>
		<a href="http://openid.net/"><img src="/bags/common/tiddlers/openid.png" alt="openid" ></a><br />
		Use just one username and password across hundreds of OpenID-enabled sites.<br />
		It's an open standard.<br />
		<a href="http://openid.net/what/">learn more</a>
		<ul class="ts-identities"></ul>
		<form class="ts-openid" target="_top">
			<div>
				Add an openid:
			</div>
			<input class="inputBox" type="text" name="openid" placeholder="your openid" />
			<input type="submit" value="Register" />
			<a href="http://openid.net/get-an-openid/" class="help"
			title="What is an open id?">What is an open id?</a>
		</form>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src="/bags/common/tiddlers/backstage.js"></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src="/bags/common/tiddlers/jquery-ui.custom.js"></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src='/bags/common/tiddlers/ts.js'></script>
<script src="/status.js"></script>
<script type="text/javascript">
/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function( $ ) {

var proto = $.ui.autocomplete.prototype,
	initSource = proto._initSource;

function filter( array, term ) {
	var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
	return $.grep( array, function(value) {
		return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
	});
}

$.extend( proto, {
	_initSource: function() {
		if ( this.options.html && $.isArray(this.options.source) ) {
			this.source = function( request, response ) {
				response( filter( this.options.source, request.term ) );
			};
		} else {
			initSource.call( this );
		}
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
			.appendTo( ul );
	}
});

})( jQuery );

/***
_accounts application specific javascript
***/
var link;
ts.init(function(ts) {
	if(ts.user.anon) { // redirect to homepage when user not logged in
		window.location = ts.getHost();
	} else if(ts.user.name === ts.currentSpace){
		initSiteIconUpload(ts.user.name);
	} else {
		link = $("<a />").attr("href", ts.getHost(ts.user.name) + "/_account").text("Change User Icon");
		$("#siteiconArea div").empty().append(link);
	}
	$(".hostSuffix").text("." + ts.getHost("").split("//")[1]);
	ts.getSpaces(function(spaces) {
		$("<div class='info' />").text("You have " + spaces.length + " spaces.").insertBefore($(".spaceSearch")[0]);
		$("form.spaceSearch input").autocomplete({
			html: true,
			source: function(req, response) {
				ts.getSpaces(function(spaces) {
					var selected = [];
					for(var i = 0; i < spaces.length; i++) {
						var space = spaces[i];
						if(space.name.indexOf(req.term) > -1) {
							var host = ts.getHost(space.name) ;
							var img = host + "/SiteIcon";
							selected.push({
								value: space.name,
								label: '<a href="' + host + '" target="_parent" class="autocompleteLink"><img src="' + img + '" style="height:24px;width:auto;max-height:24px;max-width:24px;"/>' + space.name + '</a>'
							});
						}
					}
					response(selected);
				});
			},
			select: function(event, ui) {
				window.top.location = ts.getHost(ui.item.value);
			}
		});

		var $ul = $('.ts-space-search');
		$.each(spaces, function(i, space) {
			$ul.append($('<li/>').html($('<a/>').attr('href', space.uri)
				.text(space.name)));
		});

		$('form.spaceSearch button').click(function(ev) {
			$('.list-container').slideToggle('fast');
			ev.preventDefault();
			return false;
		});
	});
});

if(window != window.top) {
	$("html").addClass("iframeMode");
	$("a").live("click",function(ev) {
		$(ev.target).attr("target", "_parent");
	});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Reply</title>
	<link rel="stylesheet" href="//tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}

		#help {
			position: absolute;
			border: 0;
			right: 4px;
			top: 5px;
			text-indent: -9999px;
			color: transparent;
			height: 16px;
			width: 16px;
			background: none;
			background-image: url(/bags/common/tiddlers/help.png);
			background-repeat: no-repeat;
			background-color: white;
			z-index: 2;
			border-radius: 10px;
		}

		#help-info {
			padding: 0;
			border: 1px solid gray;
			width: 60%;
			height: 50px;
			color: #404040;
			background-color: white;
			position: absolute;
			top: 5px;
			right: 5px;
			z-index: 1;
			cursor: auto;
			border-radius: 5px;

		}

		#help-info p {
			padding: 10px 25px;
			margin-bottom: 0;
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<button id="help">help</button>
				<div id="help-info" style="display:none;"><p>
				Found something interesting? Write about it in your own space. <a href="//docs.tiddlyspace.com/Reply to this Tiddler" target="_blank">Find out more</a>
				</p></div>
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li class="active" data-tab-name="post"><a href="#postForm">Reply</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class="checkbox">
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript"
            src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/_reply.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>This Space</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<!--[if lte IE 8]>
	<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/es5-shim.min.js"></script>
	<![endif]-->
</head>
<body>
<div id="container">
	<div id="text-html" class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<h2>About this space <button class='toggleNext'></button></h2>
		<div id="siteinfo"></div>
		<h2>Site Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input class="btn" type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		<h2>Vital Statistics</h2>
		<div id="info">please wait while information is loaded about this space...</div>
		<button class="spacereset">Reset Space</button>
		<div class="reset-confirm-wrap messageArea">
			<button class="close-btn" title="cancel reset">×</button>
			<p>Are you sure you want to reset the space? You can't go back! This will remove all the content from the space!</p>
			<form class="cf">
				<label for="reset-confirm">Enter the space name to confirm.</label>
				<input type="text" name="reset-confirm" class="reset-confirm-input inputBox" />
				<button type="submit">Reset Now</button>
			</form>
			<div class="reset-message-area">
				<p class="performing">Resetting...</p>
				<p class="finished">Reset Done!</p>
				<p class="recipe-error-msg">Error removing includes. Please remove manually.</p>
			</div>
		</div>
		</div>
		<div class="right">
		<div class="ts-membership">
			<h2>
				Add Member
				<a href="http://docs.tiddlyspace.com/What%20is%20a%20member%3F" title="What is a Member?" class="help">What is a Member?</a>
			</h2>
			<div>
				<p>Add a new member to your space by entering their name below. Enter a space name instead and prefix with @ to add everyone who is already a member of that space.</p>
				<form class="ts-members">
					<input class="inputBox" type="text" name="username">
					<input type="submit" value="Add Member" class="btn" />
				</form>
			</div>
			<h2>
				Existing Members <button class='toggleNext'></button>
			</h2>
			<div>
				Your space currently has the following members: 
				<ul class="ts-members"></ul>
			</div>
			<h2>
				Include Space
				<a class="help" href="http://docs.tiddlyspace.com/What%20is%20space%20inclusion%3F" title="What is inclusion?">What is Inclusion?</a>
			</h2>
			<form class="ts-includes">
				<input class="inputBox" type="text" name="spacename">
				<input type="submit" value="Include Space" class="btn" />
			</form>
		</div>
		<div>
			<h2>Included Spaces <button class='toggleNext'></button></h2>
			<div>
			This space includes the following spaces:
			<ul class="ts-includes"></ul>
			</div>
		</div>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src='/bags/common/tiddlers/backstage.js'></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src='/bags/tiddlyspace/tiddlers/TiddlySpaceCSRF'></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src="/bags/common/tiddlers/ts.js"></script>
<script src="/status.js"></script>
<script src="/bags/common/tiddlers/space.js"></script>
</body>
</html>
<!DOCTYPE HTML>
<html>
<body style="display:none">
topics: <ul id="topics"></ul>
<button id='addtopic'>add topic</button>
stream:
<ul id="stream"></ul>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src="/twikifier.js" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript'>
	$.ajaxSetup({
		beforeSend: function(xhr) {
			xhr.setRequestHeader("X-ControlView", "false");
		}
	});
	function renderTopic(topic) {
		var item = $("<li />").appendTo("#topics");
		$("<button class='show' />").text(topic).appendTo(item);
		$("<button class='delete'>x</button>").appendTo(item);
		return item[0];
	}
	var host =  '/';
	var space = "jon";
	var active_topics = [];
	var current_topic, offset;
	function renderTopics() {
		var topics = active_topics;
		$("#topics").empty();
		for(var i = 0; i < topics.length; i++) {
			var topic = topics[i];
			if(topic) {
				renderTopic(topic);
			}
		}
		$("body").show();
	}
	// Array Remove - By John Resig (MIT Licensed)
	Array.prototype.remove = function(from, to) {
		var rest = this.slice((to || from) + 1 || this.length);
		this.length = from < 0 ? this.length + from : from;
		return this.push.apply(this, rest);
	};

	var topicList = new tiddlyweb.Tiddler("Topics", new tiddlyweb.Bag(space + "_public", host));
	topicList.get(function(tid) {
			active_topics = tid.text.split("\n");
			renderTopics(active_topics);
			$("#topics .show:first").trigger("click");
		},
		function() {
			active_topics = ["tiddlyspace"];
			renderTopics(active_topics)
		}
	);
	$("#addtopic").click(function(ev) {
		var text = prompt("What topic would you like to watch?");
		if(active_topics.indexOf(text) === -1) {
			active_topics.push(text);
		}
		var el = renderTopic(text);
		topicList.text = active_topics.join("\n");
		topicList.put(function() {
			$("button.show", el).trigger("click");
		}, function() {
			alert("eek!")
		});
	});
	$("#topics .delete").live("click",function(ev) {
		var topic = $(".show", this.parentNode).text();
		active_topics.remove(active_topics.indexOf(topic));
		renderTopics();
		topicList.text = active_topics.join("\n");
		topicList.put(function() {}, function() {
			alert("eek!")
		});
	});
	w = createWikifier(window, jQuery, { host: host, container: "recipes/" + space + "_public" });
	$("#topics .show").live("click",function(ev) {
		var tag = $(this).text();
		current_topic = tag;
		offset = 0;
		$("#stream").empty();
		var search = new tiddlyweb.Search('tag:"' + tag + '" &fat=y', host);
		search.get(function(tiddlers) {
			for(var i = 0; i < tiddlers.length; i++) {
				var tiddler = tiddlers[i];
				var item = $("<li />").appendTo("#stream")[0];
				$("<h2 />").text(tiddler.title + ": ").appendTo(item);
				
				$("<div class='text' />").text(tiddler.text).appendTo(item);
				$("<div class='author' />").text(tiddler.modifier).appendTo(item);
			}
		}, function() {
			$("<li>no topics :-(</li>").appendTo("#stream");
		});
	});
	$(window).scroll(function(){
		if($(window).scrollTop() == $(document).height() - $(window).height()) {
			offset += 10;
			// find a way to get all tiddlers created before the ones above
			console.log("loadMore();");
		}
	});
</script>
</body>
</html>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
iVBORw0KGgoAAAANSUhEUgAAAp4AAAKeCAMAAAA7qOuhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTEwOUY5OTBCQ0YxRjM1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyQzZBODVGQzQ5RDExMUUxQkI0ODgzMDJGMDFGM0M0OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyQzZBODVGQjQ5RDExMUUxQkI0ODgzMDJGMDFGM0M0OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNFODRBODgyNjAyMDY4MTE5MTA5Rjk5MEJDRjFGMzUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MTA5Rjk5MEJDRjFGMzUwIi8+IDwvcmRmOkRlc2NyaXB0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
//background position functions
var $ = jQuery;
function getBgPosY(elem) {
	var bgPos = $(elem).css('backgroundPosition');
	if(bgPos) {
		return bgPos.split(" ")[1];
	}
}
function setBgPosY(elem, pos) {
	var bgPos = $(elem).css('backgroundPosition'),
		posX;
	if(bgPos) {
		posX = bgPos.split(" ")[0];
		$(elem).css('backgroundPosition', posX+" "+pos);
	}
}
var delay = (function(){
  var timer = 0;
  return function(callback, ms){
    clearTimeout (timer);
    timer = setTimeout(callback, ms);
  };
})();
function positionPage(open) {
	var newLeft,
		viewportWidth = $(window).width(),
		sidebarWidth,
		sidebarGutter = 30,
		paperWidth = 720,
		sidePanelWidth = 210;
	if(open) {
		sidebarWidth = 10;
	} else {
		sidebarWidth = 270;
	}
	if(viewportWidth >= sidebarWidth + paperWidth + sidePanelWidth) {
		// center paper between sidebar and sidePanel
		newLeft = (sidebarWidth+sidebarGutter)/2 + (viewportWidth-paperWidth-sidePanelWidth)/2;
	} else if(viewportWidth >= sidebarWidth + paperWidth) {
		// stick paper to sidebar
		newLeft = sidebarWidth;
	} else {
		// let paper move to left side
		newLeft = viewportWidth - paperWidth;
		if(newLeft < 0) {
			newLeft = 0;
		}
	}
	if(newLeft) {
		$('#screenWidth').stop(true,true).animate( {
			left: newLeft
		}, 200);
	}
}

// the sidebar

$('#sidebarIcons').click(function(e) {
	e.preventDefault();
	var curLeft = parseInt($('#sidebar').css('left'),10),
		open = curLeft===0,
		$target = $(e.target),
		$panel = $('#sidebar').find('.panel').eq($target.index()-1);
	if($target.attr('id')==="toggle") {				
		$('#sidebar').animate( {
			left: open ? "-260px" : "0px"
		}, 200);
		// determine whether the screen is wide enough to centre between the statuspanel and sidebar
		positionPage(open);
		setBgPosY('#toggle', open ? "-540px" : "-490px");
	} else {
		if(!open) {
			$('#toggle').click();
		}
		if($target.attr('id')==="search") {
			$('#searchBox').find('input').click().focus();
		} else {
			if($panel.hasClass("closed")) {
				$panel.children('h2').click();
			}
		}
	}
});

// keep Currently Open count up-to-date
function updateCurrentlyOpenCounter(e, closing) {
	var count = $('#contentWrapper .tiddler').length;
	if(closing) {
		count -= 1;
	}
	if(count<0) {
		count=0;
	}
	$('#sidebarIcons #current span').each(function() {
		if(!count) {
			$(this).hide().text('');
		} else {
			$(this).show().text(count);
		}
	});
}
updateCurrentlyOpenCounter();
$(document).bind("StoryUpdated", updateCurrentlyOpenCounter);

$(window).resize(function() {
	delay(function() {
		var open = parseInt($('#sidebar').css('left'),10)!==0;
		positionPage(open);
	}, 500);
});

/*
	sidebar toggle 
		always toggles sidebar in/out

	click on icon
		if sidebar is open  
			opens accordion section
		if sidebar is closed 
			opens accordion section and sidebar
		
	
	-width
		find screen width
		when sidebar opens
			change #screenWidth to be screen width minus the width of the sidebar
		when sidebar closes
			vice versa
			
		240
		
		if the #screenwidth is large enough for the statuspanel to not overlap the tiddlers
			centre the tiddler content between the statuspanel and the extended sidebar
		
		is the screenwidth wide enough? 
			statuspanel+padding = 240px
			sidebar+padding 	= 300px
			tiddler				= 720px
			
			Total				= 1260px
			
			so if viewport width is 1260+, add right:240px and width:-240 to #screenWidth 
			
			if sidebar is closed and width is 1000+, add right:240px and width:-240 to #screenWidth 

*/


/* 
the accordion generic click behaviour
principle: make the sidebar handle clicks;
if click on panel>h2 or input, toggle accordion stage, unless noToggle exists on panel
*/

var viewportHeight = $(window).height() / 3;
$('#sidebar .panel').not('.closed').find('ul.browsingTool').height(viewportHeight);

$('#sidebar .panel').click(function(e) {
	var $target = $(e.target),
		$panel = $(this),
		panelClosed = $panel.hasClass('closed'),
		$otherPanels = $(this).siblings('.panel');

	if(!$target.is('input[type=search], h2') && !$target.parent().is('h2')) {
		return true;
	}

	// close other panels
	$otherPanels.each(function() {
		var $panel = $(this),
			$ul = $panel.find('ul.browsingTool'),
			panelClosed = $panel.hasClass('closed');
		if($ul.length && !panelClosed) {
			$ul.stop().animate({
				height: 0
			}, function() {
				$panel.addClass('closed');
			});
			setBgPosY($panel.find('h2'), "-391px");
		}
	});
	
	// toggle this panel
	if($panel.hasClass('noToggle')) {
		return;
	}
	$panel.find('.browsingTool').animate({
		height: panelClosed ? viewportHeight : 0
	}, function() {
		$panel.toggleClass('closed');
	});
	setBgPosY($panel.find('h2'), panelClosed ? "-437px" : "-391px");
});


// the info toggle

$('.infoToggle a').live('click', function() {
	$(this).parent().siblings('div.info').slideToggle(200, function() {
		if ($(this).is(':visible')) {
			$('.infoToggle a span').text('-');
		} else {
			$('.infoToggle a span').text('+');
		}
	});
	return false;
});

// the status panel timeout

window.setTimeout(function() {
	if($('#statusTab span').hasClass('panelOpen')) {
		$('#statusTab span').click();
	}
},5000);

// the status panel overall toggle

$('#statusTab span').live('click', function() {
	var $clicked = $(this);
	if($clicked.hasClass('panelOpen')) {
		$('#rightPanel').animate({'right': '-210px'}, 100);
	} else {
		$('#rightPanel').animate({'right': '0px'}, 100);
	}
	$clicked.toggleClass('panelOpen');
});


// the status panel internal toggles
$('#statusPanel a').live('click', function() {
	var $clicked = $(this);
	if($clicked.hasClass('current')) {
		$clicked.parent().next().slideToggle(100);
		$clicked.toggleClass('open');
	}
});
$('#statusPanel #modeStatus a').live('click', function(e) {
	e.preventDefault();
	var $clicked = $(this),
		$dropDownContainer,
		$current;
	if(!$clicked.hasClass('current')) {
		$dropDownContainer = $clicked.closest('.dropDown');
		$current = $dropDownContainer.prev().children('.current');
		$clicked.insertBefore($current).addClass('current');
		$current.prependTo($dropDownContainer).removeClass('current');
	}
	
	// handle advanced toggling
	if($clicked.hasClass('advanced')) {
		if(!backstage.isVisible()) {
			backstage.show();
			$('#app-picker').show().css({'visibility':'visible'});
		}	
	} else {
		if(backstage.isVisible()) {
			backstage.hide();
			$('#app-picker').hide().css({'visibility':'hidden'});
		}
	}
	if($clicked.hasClass('browsing')) {
		readOnly = true;
		refreshElements(document.getElementById('tiddlerDisplay'));
		$('#statusTab span').addClass('browsing');
	} else {
		if(readOnly) {
			readOnly = false;
			refreshElements(document.getElementById('tiddlerDisplay'));
			$('#statusTab span').removeClass('browsing');
		}		
	}
});

$('#statusPanel').mouseleave(function() {
	if ($('div.dropDown').is(':visible')) {
		$('div.dropDown').slideUp(100);
		$('#statusPanel a.current').removeClass('open');
	}
});


// login/logout box
function updateAccountDisplay(name) {
	var $status = $('#statusPanel #accountStatus'),
		$title =  $status.children('.title'),
		$current = $status.children('.value').children('.current'),
		$dropDown = $status.children('.dropDown');
	if(!name) {
		$title.text('Not logged in');
		$current.text('').css('visibility','hidden');
	} else {
		$title.text('Logged in as:');
		$current.text(name).css('visibility','visible');
	}
}
function addLoginForm() {
	var $loginForm = $('#loginForm').show();
}
function disableModeToggle() {
	$('#statusPanel #modeStatus a').click(function() {
		return false;
	});
}

config.extensions.tiddlyweb.getUserInfo(function(info) {
	var anon = info.anon,
		name = info.name;
	if(anon) {
		disableModeToggle();
		updateAccountDisplay();
		addLoginForm();
	} else {
		updateAccountDisplay(name);
	}
});

$('#statusPanel #accountStatus form').submit(function(e) {
	e.preventDefault();
	var token = config.extensions.tiddlyspace.getCSRFToken();
	this.action += "?csrf_token="+token;
	this.submit();
});

// sidebar links
createTiddlyLink($('#feedback').get(0),'Feedback please!',true);
createTiddlyLink($('#manualizingOurWork').get(0),'+ Manualize our work',true);


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8"/>
	<title>TiddlySpace Apps</title>
	<link rel="stylesheet" href="http://tiddlyspace.com/bags/common/tiddlers/reset.css" />
	<link rel="stylesheet" href="appspage.css" />
</head>
<body>
	
	<div id="wrapper">
		<div id="TSbar"></div>
		<div id="main-content">
			<div id="space-details">
				<img class="siteicon" src="http://placehold.it/100x100">
				<div id="title-subtitle">
					<h1 class="spaceaddress">
						<span>SPACENAME</span>.tiddlyspace.com
					</h1>
					<p class="tagline">your space's tagline... <a class="managespaces inactive" href="/ManageSpaces">manage space</a></p>
				</div>
			</div>
			<div id="holder">
				<div id="appswitcher-wrapper">
					<div id="appswitcher">
						<h2>Your Apps</h2>
						<ul id="app-list">
							<li class="write"><a href="/takenote">
								<img src="http://placehold.it/50x50" alt="" class="app-img" />
								WRITE
								</a>
							</li>
							<li class="htmlserialisation">
								<a href="/tiddlers.html">
									<img src="http://placehold.it/50x50" alt="" class="app-img" />
									BROWSE
								</a>
							</li>
							<li class="links">
								<a href="/links">
									<img src="http://placehold.it/50x50" alt="" class="app-img" />
									SHARE
								</a>
							</li>
							<li class="tiddlywiki">
								<a href="/tiddlers.wiki">
									<img src="http://placehold.it/50x50" alt="" class="app-img" />
									TIDDLYWIKI
								</a>
							</li>
							<li class="preso">
								<a class="soon" href="">
									<img src="http://placehold.it/50x50" alt="" class="app-img" />
									PRESO <span class="comingsoon">(coming soon...)</span>
								</a>
							</li>
						</ul>
						<div id="addapp">
							<button class="inactive">Add More!</button>
						</div>
					</div>
					<aside id="app-desc">
						<ul>
							<li class="writedesc"><p>write your notes on the web.  Link them, tag them, share them.  Your notes are available everywhere, on and offline.</p></li>
							<li class="htmlserialisationdesc"><p>an easy to understand HTML representation of your content.</p></li>
							<li class="linksdesc"><p>share direct links to your content. The share app provides you with quick and easy access to the key links within your TiddlySpace.</p></li>
							<li class="tiddlywikidesc"><p>use TiddlyWiki to create, edit and organise your content.</p></li>
							<li class="presodesc"><p>an interactive pan-able, zoom-able, shareable representation of your content.  Think PowerPoint but on the web. And better.</p></li>
						</ul>
					</aside>
					<br style="clear:both">
				</div>
			</div>
		</div>
		<div id="footer"><!-- ie doesn't support footer tag -->
			<div id="footer-content">
				<div class="links">
					<a href="http://blog.tiddlyspace.com">blog</a>
					<a href="http://featured.tiddlyspace.com">featured</a>
					<a href="http://docs.tiddlyspace.com">documentation</a>
					<a href="https://github.com/TiddlySpace/tiddlyspace">source</a>
				</div>
				<p>TiddlySpace 2011, created by <a href="http://osmosoft.com">Osmosoft</a></p>
			</div>
		</div>
	</div>
	
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
	<script type="text/javascript" src="appspage.js"></script>
</body>
</html>
body {
	font-family: "helvetica neue";
	font-size: 16px;
}

#TSbar {
	background: #000;
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
	border-bottom: 1px solid black;
	height: 24px;
}

#main-content {
	margin: 0 auto;
	padding-top: 2em;
	width: 960px;
}

#space-details {
	height: 100px;
	margin: 0 0 5em;
}

#space-details img {
	border-radius: 2px;
	float: left;
	margin-right: 2em;
}

#title-subtitle {
	color: #79757A;
}

.spaceaddress {
	height: 62px;
	line-height: 62px;
}

#title-subtitle p {
	font-size: 1.3em;
	line-height: 38px;
}

.managespaces {
	background: #D0D5D6;
	color: #F0F4F8;
	border-radius: 4px;
	float: right;
	padding: 0 0.7em;
	text-decoration: none;
	-webkit-transition: all 0.4s ease-in-out;
	-moz-transition: all 0.4s ease-in-out;
	-o-transition: all 0.4s ease-in-out;
	-ms-transition: all 0.4s ease-in-out;
	transition: all 0.4s ease-in-out;
}

#space-details:hover .managespaces {
	background: #ADD1DD;
}

#space-details .managespaces:hover {
	background: #0082AF;
}

h1 {
	color: #B8B6BD;
	font-size: 2em;
}

h1 span {
	color: #0059AF;
	color: #0082AF;
	font-size: 1.5em;
}

#holder {
	background: #DCE7F1;
	border-radius: 2px;
	border: 1px solid #ADD1DD;
	box-shadow: 1px 2px 3px 0px rgba(0,0,0,0.25);
}

#appswitcher {
	background: #F0F4F8;
	border-radius: 2px;
	box-shadow: 1px 2px 3px 0px rgba(0,0,0,0.25), -1px 0px 3px 0px rgba(0,0,0,0.25);
	margin-top: -40px;
	margin-right: 10px;
	margin-bottom: -10px;
	float: right;
	width: 60%;
}

#appswitcher h2 {
	color: #4C4A54;
	color: #8C9DA7;
	font-size: 2em;
	font-weight: 500;
	line-height: 1.8em;
	text-shadow: 0 1px 0 #fff;
	margin-left: 1em;
}

#app-list {
	background: #F0F4F8;
}

#app-list li {
	background: url('http://colmjude.tiddlyspace.com/double_angle_lightblue_42x42.png') no-repeat 88% #F0F4F8;
	border-top: 1px solid #fff;
	border-bottom: 1px solid #C3D3DD;
	height: 4.25em;
	line-height: 3.125em;
	-webkit-transition: background 0.4s linear;
	-moz-transition: background 0.4s linear;
	-o-transition: background 0.4s linear;
	-ms-transition: background 0.4s linear;
	transition: background 0.4s linear;
}

#app-list li:hover {
	background: url('http://colmjude.tiddlyspace.com/double_angle_darkpink_bevel_42x42.png') no-repeat 90% #F3F9FF;
	border-top: 1px solid #F0F4F8;
	cursor: pointer;
	line-height: 3.25em;
}

#app-list li:hover:last-child {
	line-height: 3.125em;
}

#app-list li a {
	display: block;
	color: #BC4378;
	font-size: 2.5em;
	text-decoration: none;
	height: 100%;
	width: 100%;
	-webkit-transition: color 0.4s linear;
	-moz-transition: color 0.4s linear;
	-o-transition: color 0.4s linear;
	-ms-transition: color 0.4s linear;
	transition: color 0.4s linear;
}

#app-list li:hover a {
	color: #E56AA0;
}

#app-list li a img {
	position: relative;
	top: 0.2125em;
	margin: 0 1em;
	height: 1.25em;
	width: 1.25em;
}

#app-list li a span.comingsoon {
	color: #B8B6BD;
	font-size: 0.5em;
}

#app-list li a span.comingsoon.highlight {
	color: #BC4378;
}

#app-desc {
	float: left;
	width: 35%;
}

#app-desc ul {
	/* use as faded color ? */
	color: #C3D3DD;
	color: #8C9DA7;
	font-size: 0.9em;
	font-style: italic;
	margin-top: 18px;
	margin-right: -1em;
	text-align: right;
}

#app-desc ul li {
	display: table;
	border-bottom: 1px dashed #F0F4F8;
	height: 70px;
	padding-left: 1em;
	-webkit-transition: color 0.4s linear;
	-moz-transition: color 0.4s linear;
	-o-transition: color 0.4s linear;
	-ms-transition: color 0.4s linear;
	transition: color 0.4s linear;
}

#app-desc ul li.highlightdesc {
	color: #D65C8C;
}

#app-desc ul li:first-of-type {
	border-top: 1px dashed #F0F4F8;
}

#app-desc ul li p {
	display: table-cell;
	vertical-align: middle;
}

#addapp {
	margin: 1.5em 0 1em;
	padding: 10px;
	text-align: center;
}

#addapp button {
	background: #E7DFE3;
	background: rgba(206,199,203, 0.8);
	color: #F0F4F8;
	border: none;
	border-radius: 4px;
	font-size: 2em;
	padding: 16px 24px 12px;
	-webkit-transition: all 0.4s ease-in-out;
	-moz-transition: all 0.4s ease-in-out;
	-o-transition: all 0.4s ease-in-out;
	-ms-transition: all 0.4s ease-in-out;
	transition: all 0.4s ease-in-out;
}

#addapp:hover button {
	background: #BC4378;
}

#addapp button:hover {
	cursor: pointer;
}

#footer {
	background: #1A1F1E;
	margin-top: 3em;
	padding: 0.3em 0;
	clear: both;
}

#footer-content {
	color: #B2AAA4;
	font-size: 0.8em;
	line-height: 1.3em;
	margin: 0 auto;
	width: 960px;
}

#footer .links {
	float: right;
}

#footer .links a {
	margin-left: 10px;
}

#footer-content a {
	color: #B2AAA4;
	text-decoration: none;
}

#footer-content a:hover {
	color: #80a7c1;
	text-decoration: underline;
}
(function($){
	
	$(function(){
		
		$('#app-list li').mouseover(function() {
		  	var me = $(this),
				appname = me.attr("class"),
				descEl = '.' + appname + 'desc';
			$(descEl).addClass("highlightdesc");
		}).mouseout(function() {
		  	var me = $(this),
			appname = me.attr("class"),
			descEl = '.' + appname + 'desc';
			$(descEl).removeClass("highlightdesc");
		});
		
		$(".inactive").click(function() {
			var me = $(this),
				oldtext = me.text();
			me.text("coming soon").animate({'color':'#fff'}, 400, function() {
				setTimeout(function(){
					me.text(oldtext);
				}, 2000);
			});
			return false;
		});
		
		$(".soon").click(function() {
			var me = $(this),
				comingsoon = $('.comingsoon', me);
			comingsoon.addClass("highlight");
			// won't work until jquery ui is included
			comingsoon.animate({'color':'#BC4378'}, 600, function() {
				comingsoon.animate({'color':'#B8B6BD'}, 600);
			});
			return false;
		});
		
	});
	
})(jQuery);
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="lG3826" x1="7.0996" gradientUnits="userSpaceOnUse" y1="18.829" gradientTransform="matrix(1.5858347,0,0,1.8078238,1098.1851,351.13716)" x2="1.5461" y2="-0.95166"><stop stop-color="#000" offset="0"/><stop stop-color="#9c9b99" offset="1"/></linearGradient><linearGradient id="lG3828" y2="372.44" gradientUnits="userSpaceOnUse" y1="375.7" x2="1111.7" x1="1097.7"><stop style="stop-color:#ac9393;" offset="0"/><stop style="stop-color:#c8b7b7;" offset="1"/></linearGradient></defs><g transform="translate(-1080.9375,-357.3329)"><path style="stroke-width:0;stroke-miterlimit:4;fill:url(#lG3826);" d="m1080.9,357.32,39.996-0.0426-0.01,40.008c-15.507-25.519-15.36-25.95-39.988-39.965z"/><path style="stroke-dashoffset:0;stroke:#7aa3be;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.49999988;fill:#c1e6fd;" d="m1091.9,363.55c6.5716-6.4925,16.576-7.3925,23.147-0.90003,6.5717,6.4925,6.5717,17.019,0,23.511-4.4424-8.6113-12.288-15.713-23.147-22.611z"/><path style="stroke-dashoffset:0;stroke:#ce81b0;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.5;fill:#f4c4e2;" d="m1110.2,367.62c3.217,3.2168,3.217,8.4323,0,11.649-3.8194-4.2357-8.3307-8.1824-11.649-11.649,3.217-3.2168,8.4325-3.2168,11.649-0.00002z"/><path style="stroke-linejoin:bevel;stroke:#000000;stroke-linecap:round;stroke-dasharray:none;stroke-miterlimit:4;stroke-width:0.80000001;fill:url(#lG3828);" d="m1081,357.34c18.79,6.4752,32.53,16.56,39.894,39.892-11.19-17.028-14.878-19.19-27.352-14.96,6.2984-12.098,3.9371-13.19-12.542-24.932z"/></g></svg>
<html>
<head>
<title>Bulk Deletion Application</title>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css">
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="container">
	<div id="header">
		<h1>Bulk Deletion Application</h1>
	</div>
	<div class="main section">
	Please take care when using this space as it can delete everything in your private and public bags. To use simply select the tiddlers you want to delete and click the delete all button.

	<form id="filter" style="display:none;">
		<p>Note you can filter this list using <a href="http://tweb-filters.tiddlyspace.com/GettingStarted">tiddlyweb filters</a>.</p>
		<h2>Filter this list:</h2>
		<input name="value" type='text' placeholder='select=tag:systemConfig'>
		<button>Apply Filter</button>
	</form>
	<h2>Select tiddlers to delete</h2>
	<table id='bulk'>
	</table>
	</div>
</div>
<script type='text/javascript'>
var space = window.location.host.split(".")[0];
var tableObj = {};
var url = "/recipes/" + space + "_private/tiddlers";
var hash = window.location.hash;
if(hash.indexOf("?") === 1) {
	url += hash.substr(1, hash.length);
}
$("#filter").submit(onSubmit).show();
var onSubmit = function(ev) {
	var filterVal = $("#filter [name=value]").val();
	if(filterVal.indexOf("?") === 0) {
		filterVal = filterVal.substr(1, filterVal.length);
	}
	window.location.hash = "#?" + filterVal;
	window.location.reload();
	ev.preventDefault();
};
if(window.location.hash.indexOf("#?") > -1) {
	$("#filter [name=value]").val(window.location.hash.substr(2));
}
$("#filter button").click(onSubmit);
$.ajax({ url: url,
	dataType: "json", success: function(tiddlers) {
		var table = $("#bulk")[0];
		$("<tr><th>Title</th><th>Status</th><th>Select <input type='checkbox' class='batchSelect' /></th></tr>").appendTo(table);
		$(".batchSelect").click(function(ev) {
			var ch = $(ev.target).attr("checked") ? true : false;
			$("input.tidCheckBox:visible").attr("checked", false).each(function(i, el) {
				$(el).attr("checked", ch);
			});
		});
		$("<button />").text("delete all selected tiddlers").insertBefore(table).click(function(ev) {
			if(!confirm("DELETE all the tiddlers that have been selected before? Be warning that this is irreversable!")) {
				return;
			}
			var tiddlers = [];
			$("input.tidCheckBox:checked:visible").each(function(i, el) {
				var tid = $(el).data("tiddler");
				if(tid) {
					tiddlers.push(tid);
				}
			});
			function deletetid(tid) {
				$.ajax({ url: "/bags/" + tid.bag + "/tiddlers/" + encodeURIComponent(tid.title),
					type: "DELETE",
					success: function(r) {
						var el = tableObj[tid.title];
						$(el).animate({ opacity: 0}, {
							complete: function(el) {
								$(this).remove();
								}
							});
					}
				});
			}
			for(var i = 0; i < tiddlers.length; i++) {
				var tid = tiddlers[i];
				deletetid(tid);
			}
		});
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			if(tiddler.bag.indexOf(space) === 0) {
				var row = $("<tr />").appendTo(table)[0];
				$("<td />").text(tiddler.title).appendTo(row);
				var status = tiddler.bag.split("_")[1];
				$("<td />").text(status).appendTo(row);
				var deletecol = $("<td />").appendTo(row)[0];
				tableObj[tiddler.title] = row;
				$("<input />").addClass("tidCheckBox").attr("type", "checkbox").data("tiddler", tiddler).appendTo(deletecol);
			}
		}
	}
});
</script>
</body>
</html>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/*{{{*/

function createTiddlyButtonButton(parent,text,tooltip,action,className,id,accessKey,attribs) {
		
		var btn = document.createElement("button");
		btn.setAttribute("type", "button");
		if(tooltip)
			btn.setAttribute("title",tooltip);
		if(text)
			btn.appendChild(document.createTextNode(text));
		btn.className = className || "";
		if(id)
			btn.id = id;
		if(attribs) {
			for(var i in attribs) {
				btn.setAttribute(i,attribs[i]);
			}
		}
		if(parent)
			parent.appendChild(btn);
		if(action) {
			jQuery(btn).click(action);
		}
		if(accessKey)
			btn.setAttribute("accessKey",accessKey);
		return btn;
}

config.macros.buttonPermaviewMacro = {
	handler: function(place, macroName, params) {
		var tooltip = "Click this button to generate a link in the address bar that will open exactly what is open in your manual right now";
		createTiddlyButtonButton(place, this.label, tooltip, this.onClick, 'jsIgnore', 'snapshot');
	},
	label: "snapshot",
	onClick: config.macros.permaview.onClick
};

/*}}}*/
<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>
/***
https://raw.github.com/tiddlyweb/chrjs/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.14.3

/*jslint vars: true, unparam: true, nomen: true, white: true */
/*global jQuery */

var tiddlyweb = (function($) {

"use strict";

var tw = {
	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/{revision}",
		search   : "{host}/search?q={query}"
	}
};

var convertTimestamp, supplant;

// host (optional) is the URI of the originating TiddlyWeb instance
tw.Resource = function(type, host) {
	if(arguments.length) { // initialization
		this._type = type;
		if(host !== false) {
			this.host = host !== undefined ? host.replace(/\/$/, "") : null;
		}
	}
};
$.extend(tw.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 an optional 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);
				resource.etag = xhr.getResponseHeader("Etag");
				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 self = this;
		var options = {
			url: this.route(),
			type: "PUT",
			contentType: "application/json",
			data: JSON.stringify(this.baseData()),
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// 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 self = this;
		var options = {
			url: this.route(),
			type: "DELETE",
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// returns an object carrying only the essential information of the resource
	baseData: function() {
		var data = {},
			self = this;
		$.each(this.data, function(i, item) {
			var value = self[item];
			if(value !== undefined) {
				data[item] = value;
			}
		});
		return data;
	},
	// returns corresponding instance from a raw object (if applicable)
	parse: function(data) {
		return data;
	},
	// list of accepted keys in serialization
	data: [],
	// returns resource's URI
	route: function() {
		return supplant(tw.routes[this._type], this);
	}
});

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

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

tw.TiddlerCollection = function(container, tiddler) {
	if(arguments.length) { // initialization
		tw.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
		this.container = container || null;
		this.tiddler = tiddler || null;
	}
};
tw.TiddlerCollection.prototype = new tw.Collection();
$.extend(tw.TiddlerCollection.prototype, {
	parse: function(data) {
		var container = this.container;
		return $.map(data, function(item, i) {
			var tiddler = new tw.Tiddler(item.title, container),
				bag = item.bag;
			tiddler = tw.Tiddler.prototype.parse.apply(tiddler, [item]);
			if(!tiddler.bag && bag) { // XXX: bag always present!?
				tiddler.bag = new tw.Bag(bag, container.host);
			}
			if(!tiddler.recipe && item.recipe) {
				tiddler.recipe = new tw.Recipe(item.recipe, container.host);
			}
			delete item.recipe;
			return $.extend(tiddler, item);
		});
	},
	route: function() {
		var params = this.container;
		if(this.tiddler) {
			var container = this.tiddler.bag || this.tiddler.recipe;
			params = {
				_type: container._type,
				host: container.host,
				name: container.name,
				title: this.tiddler.title
			};
		}
		return supplant(tw.routes[this._type], params);
	}
});

tw.Search = function(query, host) {
	tw.Collection.apply(this, ["search", host]);
	this.query = query;
};
tw.Search.prototype = new tw.Collection();
$.extend(tw.Search.prototype, {
	parse: function(data) {
		this.container = { // XXX: hacky
			_type: "bag",
			host: this.host
		};
		var tiddlers = tw.TiddlerCollection.prototype.parse.apply(this, arguments);
		delete this.container;
		return tiddlers;
	}
});

// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
// optionally accepts a single object representing tiddler attributes
tw.Tiddler = function(title, container) {
	tw.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
	});
	if(title && title.title) { // title is an object of tiddler attributes
		$.extend(this, title);
	}
};
tw.Tiddler.prototype = new tw.Resource();
$.extend(tw.Tiddler.prototype, {
	revisions: function() {
		return new tw.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(tw.routes[this._type], params);
	},
	parse: function(data) {
		var tiddler = new tw.Tiddler(this.title),
			container = this.bag || this.recipe;
		if(data.bag) {
			tiddler.bag = new tw.Bag(data.bag, container.host);
			delete data.bag;
		}
		delete data.recipe;
		tiddler.created = data.created ? convertTimestamp(data.created) : new Date();
		delete data.created;
		tiddler.modified = data.modified ? convertTimestamp(data.modified) : new Date();
		delete data.modified;
		if(this.recipe) {
			tiddler.recipe = this.recipe;
		}
		return $.extend(tiddler, data);
	},
	data: ["created", "creator", "modifier", "modified", "tags", "type", "text",
			"fields"],
	ajaxSetup: function(options) {
		var self = this;
		if(this.etag && (options.type === "PUT" || options.type === "DELETE")) {
			options.beforeSend = function(xhr) {
				xhr.setRequestHeader("If-Match", self.etag);
			};
		}
		if(options.type === "PUT") {
			var callback = options.success;
			options.success = function(data, status, xhr) {
				var loc = xhr.getResponseHeader("Location"),
					etag = xhr.getResponseHeader("Etag");
				if(loc && etag) {
					self.etag = etag;
					if(!self.bag) {
						var bag = loc.split("/bags/").pop().split("/")[0];
						self.bag = new tw.Bag(bag, self.recipe.host);
					}
					callback(self, status, xhr);
				} else { // IE
					self.get(callback, options.error);
				}
			};
		}
	}
});

tw.Revision = function(id, tiddler) {
	var container = tiddler.bag || tiddler.recipe;
	tw.Tiddler.apply(this, [tiddler.title, container]);
	this._type = "revision";
	this.revision = id;
};
tw.Revision.prototype = new tw.Tiddler();
$.extend(tw.Revision.prototype, {
	revisions: false,
	data: false,
	put: false,
	"delete": false
});

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

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

tw.Policy = function(constraints) { // TODO: validation?
	var self = this;
	$.each(this.constraints, function(i, item) {
		self[item] = constraints[item];
	});
};
tw.Policy.prototype.constraints = ["read", "write", "create", "delete",
	"manage", "accept", "owner"];

/*
 * utilities
 */

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

// convert YYYYMMDDhhmmss timestamp to Date instance
convertTimestamp = function(t) {
	if (t.match(/^\d{12,17}$/)) {
		return new Date(Date.UTC(
			parseInt(t.substr(0, 4), 10),
			parseInt(t.substr(4, 2), 10) - 1,
			parseInt(t.substr(6, 2), 10),
			parseInt(t.substr(8, 2), 10),
			parseInt(t.substr(10, 2), 10),
			parseInt(t.substr(12, 2) || "0", 10),
			parseInt(t.substr(14, 3) || "0", 10)
		));
	} else {
		return new Date(Date.parse(t));
	}
};

// adapted from Crockford (http://javascript.crockford.com/remedial.html)
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 $.inArray(b, ["host", "query"]) !== -1 ? r : encodeURIComponent(r); // XXX: special-casing
	});
};

return tw;

}(jQuery));
//}}}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   version="1.1"
   width="14pt"
   height="14pt"
   viewBox="918 510 14 14"
   id="svg3070">
  <metadata
     id="metadata3089">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs3072">
    <radialGradient
       cx="0"
       cy="0"
       r="1"
       id="Gradient"
       gradientUnits="userSpaceOnUse">
      <stop
         id="stop3075"
         style="stop-color:#ffffff;stop-opacity:1"
         offset="0" />
      <stop
         id="stop3077"
         style="stop-color:#2b2b2b;stop-opacity:1"
         offset="1" />
    </radialGradient>
    <radialGradient
       id="Obj_Gradient"
       xlink:href="#Gradient"
       gradientTransform="matrix(11.473944,0,0,11.473944,922.3752,513.7837)" />
  </defs>
  <g
     id="g3080"
     style="fill:none;stroke:none">
    <g
       id="g3082">
      <path
         d="m 929.6952,512.9018 c -2.5384,-2.53843 -6.654,-2.53843 -9.1924,0 -2.5384,2.5384 -2.5384,6.654 0,9.19238 2.5384,2.53839 6.654,2.53839 9.1924,0 2.5384,-2.53838 2.5384,-6.65398 0,-9.19238 m -4.5962,2.8407 2.07733,-2.07734 1.75547,1.75549 -2.0773,2.07735 2.0773,2.07732 -1.75547,1.75548 -2.07733,-2.07732 -2.07733,2.07732 -1.75547,-1.75548 2.0773,-2.07732 -2.0773,-2.07735 1.75547,-1.75549 z"
         id="path3084"
         style="fill:url(#Obj_Gradient)" />
      <path
         d="m 927.61447,515.38354 a 4.51205,4.2590378 0 1 1 -9.0241,0 4.51205,4.2590378 0 1 1 9.0241,0 z"
         transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
         id="path2394"
         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;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="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>
Unless you're delighted with the default theme you can make some quick changes by generating a new random color palette, hit this button to cycle through some alternatives.

<<RandomColorPaletteButton saturation_pale:0.67 saturation_light:0.53
saturation_mid:0.43 saturation_dark:0.06 pale:0.99 light:0.85 mid:0.5 dark:0.31>>

You can also change the look and feel completely by installing a new theme. To do this, find one you like in the @themes space, note down the name, and include it in this space by going to the space menu. You can reach the space menu by clicking on the blue and pink circle at the top-right of the page and chooshing "THIS SPACE". Here are a few to check out:
* @pip
* @caspian-ii
* @basalt
* @simplicity
* @cheesecake
* @jelly-doughnut

(//Note that if you are using a custom TiddlySpace install, these themes may not be present.//)
<!DOCTYPE html>
<html manifest="/manifest.mf">
	<head>
		<title>takenote</title>
		<link type="text/css" rel="stylesheet" href="/notabene.css" />
		<link type="text/css" rel="stylesheet" href="/bags/common/tiddlers/jquery-ui.custom.css">
		<link rel="apple-touch-icon" href="/touchicon_takenote.png"/>
		<link rel="apple-touch-icon-precomposed" href="/touchicon_takenote.png"/>
		<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=0,initial-scale=1.0">
	</head>
	<body>
		<ul id="backstage">
			<!-- no not add a newline between li elements or you will get a margin with inline blocks -->
			<li><a href="/dashboard">dashboard</a></li><li><a href="/takenote">takenote</a></li>
			<li><a class='connectionStatus'></a></li>
		</ul>
		<div class="takenotedashboard">
		  <div class='messageArea'></div>
			<div class="header">
				<div class="siteheading">
					<h1>Dashboard</h1>
				</div>
				<div class='siteicon'></div>
			</div>
			<div class="toolpanel viewer">
				<div class='section searchSection requiresConnection'>
					<h2>find note:</h2>
					<input class="findnote" type="search" placeholder="type search term" />
					<ul>
						<li>Access all your notes from <a href="/tiddlers?select=tag:!excludeLists">tiddlers</a></li>
					</ul>
				</div>
				<div class="section incompleteSection">
					<h2>Incomplete notes:</h2>
					<ul id="incomplete"></ul>
					<a class='syncButton' title="save all notes in the list to the web">sync these notes</a>
				</div>
				<div class="section recentSection">
					<h2>Recently created</h2>
					<ul id="recentnotes"></ul>
				</div>
			</div>
			<div class='footer'>
				<span class='version'>v. 0.6.4</span>
			</div>
		</div>
		<noscript>
			Takenote requires javascript to work correctly. Sorry!
		</noscript>
		<script src="/bags/common/tiddlers/backstage.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/bookmark_bubble.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/jquery-ui.custom.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/chrjs-store.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
		<script src="/notabene.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			var space = window.location.hostname.split(".")[0];
			dashboard($(".takenotedashboard")[0], {
			  space: space,
				bag: space + "_public",
				host: "/"
			});
		</script>
	</body>
</html>
<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>
<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>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="506 234 68 36" width="30" height="30"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-09-16 14:51Z</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"><rect width="1118" height="783"/><g><path d="M 538.68195 244.31807 C 540.43927 246.07547 540.43927 248.9247 538.68195 250.68204 C 536.92456 252.4394 534.07532 252.4394 532.318 250.68204 C 530.5606 248.9247 530.5606 246.07547 532.318 244.31807 C 534.07532 242.56075 536.92456 242.56075 538.68195 244.31807 M 511.12607 257.99356 C 511.26108 258.13019 511.39728 258.26608 511.53473 258.40121 C 527.2556 273.86606 552.74414 273.86606 568.46515 258.40121 C 568.60248 258.26617 568.73853 258.13037 568.87354 257.9938 C 568.8736 257.99374 568.8736 257.99371 568.8736 257.99362 C 568.87366 257.99371 568.87366 257.9938 568.87372 257.9939 C 570.72504 256.12051 572.35046 254.11153 573.74994 252 C 573.74994 251.99997 573.74994 251.99994 573.74994 251.99992 C 572.35046 249.8884 570.72504 247.87938 568.87372 246.00606 C 568.87366 246.00613 568.87366 246.00621 568.8736 246.00627 C 568.73865 245.86966 568.60254 245.73383 568.46515 245.5987 C 552.74414 230.13387 527.2556 230.13387 511.53473 245.5987 C 511.39728 245.73383 511.26108 245.86974 511.12613 246.00635 C 511.126 246.00624 511.126 246.00616 511.12595 246.00606 C 509.2748 247.87938 507.64954 249.88837 506.24994 251.9998 L 506.24994 251.99983 C 506.24994 251.9999 506.25 251.99992 506.25 251.99997 C 506.25 252 506.24994 252.00005 506.24994 252.00009 L 506.24994 252.00012 C 507.64954 254.11157 509.2748 256.12051 511.12595 257.9939 C 511.126 257.99377 511.126 257.99365 511.12607 257.99359 Z M 515.44916 252 C 515.8548 251.55469 516.27502 251.11778 516.71014 250.68985 C 522.16632 245.32257 529.06055 242.23206 536.17273 241.41824 C 534.6662 241.96199 533.2525 242.83762 532.04498 244.04512 C 527.65155 248.43852 527.65155 255.56163 532.04498 259.95502 C 533.2522 261.16226 534.6656 262.03778 536.17175 262.58154 C 529.05988 261.76761 522.16608 258.6771 516.71014 253.31009 C 516.2751 252.88219 515.85486 252.44528 515.44922 252 Z M 564.55054 251.99995 C 564.14502 252.44525 563.7248 252.88217 563.28973 253.31009 C 557.83368 258.67712 550.93988 261.76764 543.828 262.58157 C 545.33423 262.03781 546.74756 261.1623 547.9549 259.95502 C 552.34833 255.56163 552.34833 248.43852 547.9549 244.04512 C 546.74744 242.83765 545.33374 241.96202 543.82715 241.41824 C 550.9394 242.23206 557.83356 245.3226 563.28973 250.68985 C 563.7248 251.11775 564.14502 251.55467 564.55054 251.99995 Z M 568.8736 257.99362 C 570.7249 256.12033 572.35028 254.11139 573.74988 252.00002" fill="black" class="glyph"/></g></g></svg>
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AP8zZgAAAGYA//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/
var user, userbag;
var friends = [];
var host = "http://tiddlyspace.com";

$.ajaxSetup({
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	}
});

function printMessage(txt) {
	alert(txt);
}

function printError(txt) {
	alert(txt);
}

var simpleDate = (function() {

	var measures = {
		second: 1,
		minute: 60,
		hour: 3600,
		day: 86400,
		week: 604800,
		month: 2592000,
		year: 31536000
	};

	var chkMultiple = function(amount, type) {
		return (amount > 1) ? amount + " " + type + "s":"a " + type;
	};

	return function(thedate) {

		var dateStr, amount,
			current = new Date().getTime(),
			diff = (current - thedate.getTime()) / 1000; // work with seconds

		if(diff > measures.year) {
			amount = Math.round(diff/measures.year);
			dateStr = "about " + chkMultiple(amount, "year") + " ago";
		} else if(diff > measures.month) {
			amount = Math.round(diff/measures.month);
			//if(typeof amount == "")
			dateStr = "about " + chkMultiple(amount, "month") + " ago";
		} else if(diff > measures.week) {
			amount = Math.round(diff/measures.week);
			dateStr = "about " + chkMultiple(amount, "week") + " ago";
		} else if(diff > measures.day) {
			amount = Math.round(diff/measures.day);
			dateStr = "about " + chkMultiple(amount, "day") + " ago";
		} else if(diff > measures.hour) {
			amount = Math.round(diff/measures.hour);
			dateStr = "about " + chkMultiple(amount, "hour") + " ago";
		} else if(diff > measures.minute) {
			amount = Math.round(diff/measures.minute);
			dateStr = "about " + chkMultiple(amount, "minute") + " ago";
		} else {
			dateStr = "a few seconds ago";
		}

		return dateStr;

	};
})();

function prettyDate(t) {
	var date = new Date(Date.UTC(
		parseInt(t.substr(0, 4), 10),
		parseInt(t.substr(4, 2), 10) - 1,
		parseInt(t.substr(6, 2), 10),
		parseInt(t.substr(8, 2), 10),
		parseInt(t.substr(10, 2), 10),
		parseInt(t.substr(12, 2) || "0", 10),
		parseInt(t.substr(14, 3) || "0", 10)
	));
	return simpleDate(date);
}

function endsWith(str, suffix) {
	return str.indexOf(suffix) == str.length - suffix.length;
}

function isShadow(tid) {
	var shadows = ["MarkupPreHead", "DefaultTiddlers", "PageTemplate", "SideBarTabs",
		"GettingStarted", "MainMenu", "SiteTitle", "SiteSubtitle", "ColorPalette",
		"SiteIcon", "ViewTemplate", "EditTemplate", "ServerSettings", "MarkupPostHead",
		"MarkupPostBody", "MarkupPreBody"];
	return tid.title.indexOf("StyleSheet") === 0 ||
		tid.title.indexOf("SideBar") === 0 ||
		shadows.indexOf(tid.title) > -1 || endsWith(tid.title, "SetupFlag") ? true : false;
}

function isPlugin(tid) {
	return tid.tags.indexOf("systemConfig") > -1 ? true : false;
}

function isArtifact(tid) {
	var follow = tid.tags.indexOf("follow") > -1;
	var type = tid.type;
	if(follow || type) {
		return true;
	} else {
		return false;
	}
}

function chooseTiddlers(tiddlers) {
	var _tiddlers = [];
	for(var i = 0; i < tiddlers.length; i++) {
		var tid = tiddlers[i];
		if(!isPlugin(tid) && !isShadow(tid) && !isArtifact(tid)) {
			_tiddlers.push(tid);
		}
	}
	return _tiddlers;
}

function bubbleDown() {
	var friends = $(".friend");
	friends.css({ position: "relative" });
	var target;
	friends.each(function(i, el) {
		if(!target && $(el).hasClass("silentFriend") &&
			$(el).next(".friend").hasClass("noisyFriend")) {
			target = el;
		}
	});
	if(target) {
		var other = $(target).next(".friend");
		// we want to move target above the prev element
		// target is an element which has the class noisy and the previous node is quiet
		var swapDuration = 50;
		var otherHeight = other.height();
		var thisHeight = $(target).height();
		$(target).animate({ top: + otherHeight }, { duration: swapDuration });
		$(other).animate({ top:  - thisHeight }, { duration: swapDuration,
				complete: function() {
					var newTarget = $(target).clone(true).insertAfter(other)[0];
					$(target).remove();
					$(other).css({ top: 0 });
					$(newTarget).css({ top: 0 });
					bubbleDown();
				}
		});
	}
}

function renderTiddlerList(container,friend) {
	var tidList = $("<ul />").appendTo(container)[0];
	$("<li />").text("loading").appendTo(tidList);
	var oncompletion = function() {
		if($(".errorFriend,.silentFriend,.noisyFriend").length === $(".friend").length) {
			bubbleDown();
		}
	}
	$.ajax({ dataType: "json",
		url: "/search?q=modifier:" + friend + "&select=modified:>3d&sort=-modified",
		error: function() {
			$(container).addClass("errorFriend");
			oncompletion();
		},
		success: function(tiddlers) {
			$(tidList).empty();
			tiddlers = chooseTiddlers(tiddlers);
			if(tiddlers.length === 0) {
				$(container).addClass("silentFriend");
				$("<li />").text("No recent activity.").appendTo(tidList);
				oncompletion();
				return;
			} else {
				$(container).addClass("noisyFriend").removeClass("inactiveFriend");
				oncompletion();
			}
			for(var i=0; i < tiddlers.length; i++) {
				var tiddler = tiddlers[i];
				var item = $("<li />").appendTo(tidList)[0];
				var win;
				var space = tiddler.bag.split("_")[0];
				var spaceUrl = "http://" + space + ".tiddlyspace.com";
				var path = "/bags/" + tiddler.bag + "/tiddlers/" + encodeURIComponent(tiddler.title);
				var link = $("<a />").text(tiddler.title).
					attr("href", spaceUrl + path).
					data("path", path).
					click(function(ev) {
						var win = $(ev.target).data("win");
						if($(ev.target).hasClass("active")) {
							$(win).toggle(1000);
						} else {
							$(ev.target).addClass("active");
							$(".text", win).text("loading...");
							$(win).show();
							$.ajax({
								url: $(ev.target).data("path"),
								data: {
									render: "y"
								},
								dataType: "json",
								success: function(tiddler) {
									$(".text",win).html(tiddler.render);
									$(win).show(1000);
								},
								error: function() {
									$(".text", win).text("error loading that tiddler");
								}
							});
						}
						ev.preventDefault();
					}).
					appendTo(item)[0];
				var space = tiddler.bag.split("_")[0];
				$("<span />").text(" in ").appendTo(item);
				$("<a />").attr("href", spaceUrl).text(space).appendTo(item);
				$("<span />").text(" (" + prettyDate(tiddler.modified) + ")").appendTo(item);
				win = $("<div />").addClass("tiddler").appendTo(item)[0];
				$("<div />").addClass("text").appendTo(win);
				var toolbar = $("<div />").addClass("toolbar").appendTo(win)[0];
				var extra = $("<div />").addClass("extra").appendTo(win)[0];
				$("<button />").data("bag", tiddler.bag).data("title", tiddler.title).text("give feedback").
					data("revision", tiddler.revision).click(function(ev) {
					var title = $(ev.target).data("title");
					var revision = $(ev.target).data("revision");
					var bag = $(ev.target).data("bag");
					var revisionURL = host + "/bags/" + bag + "/tiddlers/" + encodeURIComponent(title) + "/revisions/" + revision;
					var space = bag.split("_")[0];
					var area = $(ev.target).parents(".tiddler").children(".extra")[0];
					$(area).hide();
					$("<textarea />").appendTo(area);
					$("<button />").text("save feedback").click(function(ev) {
						var tid = new tiddlyweb.Tiddler("Feedback for " + title, userbag);
						tid.tags = ["feedback", "@" + space];
						tid.text = ["In reply to [[", title, "]]@", space,
							" (revision [[", revision, "|", revisionURL, "]])\n\n"].join("") + $("textarea", area).val();
						tid.put(function(tiddler) {
							$(area).empty();
							$("<span />").text("your comment: ").appendTo(area);
							$("<a />").attr("href", "/" + encodeURIComponent(tiddler.title)).text(tiddler.title).appendTo(area);
						}, function() {
							printError("error commenting!");
						});
					}).appendTo(area);
					$(area).show(1000);
					ev.preventDefault();
					$(ev.target).remove();
					return false;
				}).appendTo(toolbar);

				$(win).hide();
				$(link).data("win", win);
			}
		}
	})
}

function removeFriend(friend) {
	var tiddler = new tiddlyweb.Tiddler("@" + friend, userbag);
	var success = function() {
		printMessage("User removed from friends");
		var newFriends = [];
		for(var i = 0; i < friends.length; i++) {
			var f = friends[i];
			if(f !== friend) {
				newFriends.push(f);
			}
		}
		friends = newFriends;
		$("#friend-" + friend).hide(2000);
	};
	tiddler["delete"](success, function() {
		var old = new tiddlyweb.Tiddler(friend, userbag);
		old["delete"](success, function() {
			printError("Unable to remove friend " + friend);
		})
	})
}

function renderFriend(list, friend) {
	var bag = friend + "_public";
	var item = $("<li />").addClass("friend").attr("id", "friend-" + friend).addClass("inactiveFriend").appendTo(list)[0];
	$("<img />").attr("alt", friend).attr("title", friend).
		attr("src", host + "/bags/" + bag + "/tiddlers/SiteIcon").css({ width: 48, height: 48 }).appendTo(item);
	var heading = $("<h2>").appendTo(item)[0];
	$("<a />").attr("href", "#friend-" + friend).attr("name", "friend-" + friend).text(friend).appendTo(heading);
	$("<button />").data("who", friend).text("remove from friends").
		click(function(ev) {
			if(confirm("Are you sure you want to remove " + friend + " as a friend?")) {
				removeFriend($(ev.target).data("who"));
			}
		}).appendTo(item)[0];
	renderTiddlerList(item,friend);
}

function renderFriends() {
	var list = $("<ul />").appendTo("#friends")[0];
	$("<li />").text("Activity of your friends will appear below when available").appendTo(list);
	for(var i = 0; i < friends.length; i++) {
		var friend = friends[i];
		renderFriend(list, friend);
	}
}

function followWidget() {
	$("#friends").empty();
	var container = $("<div />").addClass("addfriends").appendTo("#friends")[0];
	$("<input />").attr("name", "friend").appendTo(container);
	$("<button />").text("add friend").click(function(ev) {
		var friend = $(ev.target).parent().children("[name='friend']").val();
		if(friends.indexOf(friend) > -1) {
			return printError("You already follow " + friend + "!");
		}

		var title;
		if(friend.indexOf("@") !== 0) {
			title = "@" + friend;
		} else {
			title = friend;
		}

		$.ajax({ dataType: "text", url: "/users/" + friend,
			success: function() {
				var tid = new tiddlyweb.Tiddler(title, userbag);
				tid.tags = ["follow", "excludeLists"];
				tid.put(function(tiddler) {
					printMessage("Added friend " + friend);
					renderFriend($("#friends ul")[0], friend);
					window.location.hash = "#friend-" + friend;
				}, function() {
					printError("Failed to add friend " + friend);
				})
			},
			error: function() {
				printError("No one with name " + friend + " exists!");
			}
		});
	}).appendTo(container);
	renderFriends();
}
$.ajax({
	url: "/status",
	dataType: "json",
	success: function(status) {
		user = status.username;
		userbag = new tiddlyweb.Bag(user + "_public", "/");
		$.ajax({ url: "/bags/" + user + "_public/tiddlers?select=tag:follow", dataType: "json", success: function(tiddlers) {
				for(var i = 0; i < tiddlers.length; i++) {
					var title = tiddlers[i].title;
					if(title.indexOf("@") === 0) {
						title = title.substr(1, title.length);
					}
					friends.push(title);
				}
				friends.sort();
				followWidget();
			}
		});
	}
})
<html>
<head>
	<title>Friends</title>
	<style type='text/css'>
		ul {
			list-style: none;
		}
		ul .friend {
			border-bottom: solid 1px black;
		}
		ul .friend .tiddler {
			margin-left: 10px;
			margin-bottom: 30px;
			padding: 10px;
			border: dotted 2px #CCC;
			color: #006100;
		}
		textarea {
			width: 100%;
			height: 150px;
		}
		.friend h2 {
			display: inline-block;
		}
		button {
			display: inline-block;
		}
		.inactiveFriend {
			background-color: #ccc;
			opacity: 0.1;
		}
	</style>
	<link rel="stylesheet" href="/HtmlCss" type="text/css">
</head>
<body>
<div id="container">
<div id="header">
<h1>Your friends</h1>
</div>
<noscript>
	javascript is required to see friend's activity
</noscript>
<div id='friends' class="section">loading...</div>
</div>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript' src='/friendjs'></script>
</body>
</html>
iVBORw0KGgoAAAANSUhEUgAAAmwAAAFaCAIAAAAsPJZfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMjgwMTE3NDA3MjA2ODExOERCQkFEMEM1MjhFMjQyQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozRjM2QjY2NDFEQTkxMUUxQUI2Rjg4OEE0QjI4REMyMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozRjM2QjY2MzFEQTkxMUUxQUI2Rjg4OEE0QjI4REMyMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA4OTRCRUVCQzgyMTY4MTE4REJCQUQwQzUyOEUyNDJDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjAyODAxMTc0MDcyMDY4MTE4REJCQUQwQzUyOEUyNDJDIi8+IDwvcmRmOkRlc2NyaXB0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96CjJkrR2lubE2biNjeRArNnz7a3T/nyyy9hISGodlMATYrKAJxChhRbuHBhsP0+6whEgwtB+HcoIlYDBw6cNGlSjKNXpzSITVF44YUXQu8KQCF48cUXoaMrVqwYPHhwjcv1paenDx8+fPXq1XBkCwsLe/ToEWInLVezi+6OtULUI7Z5DRtUOoQT3jrJtQIa+frrr48YMWLr1q2o9cHa36jdENE5c+ZAa7lDCMQvIyMj8gXI4nn1FYgl0sexARlsqWM2CxxQx4L+SLGXX345llGFt/PUU0/BP67xlRyaSshriCgXVZaIhkTYy65CCNFIRM2BNEIghw0b5phj1KpVq1GjRv3iF7/49a9/jbZq165dw4jehQsX5s2bJ+MrkoPIN6hHLevWrZvxaFENO3fuPHTo0E6dOtWF+7J27dpHH32Uk32B54oBsLwrV64cOXIkIvP2229PnjwZAh+ViS7x3IAuKSlx79L6hz/8ITs72/yEoLZt29Z9Glx2+322w6kIYyCI482xIwT4oEePHg09tCNHjqxZs0YiGipchjjCQLhJOsQSkol267hx41DCUM+nTp0a+RpgKG1oHMn+iiTgmWee6dixYyQhPPTQQ/jkAq1w+375y1+i0hUWFqLGwRGsi10cTp8+/fTTT+MWiDluh9rt+doMwpmfn//SSy898sgjkNK//OUvkYtonz594jYr7RefBtjSpk2bcuwrvvzLv/zLoUOHPCe82kvs3nvvvWZiDL7gp+cdP/nkk4ULF3r+1bt3b9sa252x586dC2PG4L/9279Fvh5InFC370SR5a+//noUA+wcIOrxXL58eU5OTq02thUiDoEfCanbs2cPfJGDBw+GEcLAgQMhV3DR4HzA/zt//vyQIUPgKaJ2wMIuXbp0woQJgwYNuueee2688caPPvooWks5whCjOVtQUDBp0qS8vLxFixZ59rVCWnBH+DFZWVm33XYbXLHwZrLiQjxF3C5aBB/dc9dVduy9/PLL8B/SAqMjp0yZ4hmCrawsFWgG4TsaIvhZ280JkCNXr14tLy9HuwohODIujAFoeECEFvqyySkqoijcyO+EWHYc5eP555/fuHFjMr3uFqkJ3LjcALDCZWVlUNPQx+vCF+RLR7hoLQKMHTuWu0QcP34cziJcwJ07d8IKo32Mqr1s2TKYwpkzZ3br1m306NFoiX799dfbtm1bv369v58Bf8h9Ao4sWbIEEZ4zZw7cX0QerVt3jyuOQDl+9atfNWjQoEePHrXaSBFNAfivuCrOF871eWV45MiRH/7wh0j5kydP+qwh7DC8aHMUFRVFEqXBAdzHzRhp5OmAAQMQvWBv07mn7Hvvvce4oZGXHCJah925L7zwQgItrAVDU6fLhAoRY1q1ajVu3Lh3330XLsjQoUNDWRmOfblg+vTpsJhwDe19lvgmEl8efvjhJ5988qmnnsJpXbt2Xb169YoVK3AmPKQNGzbgQkigz0wGRAYCOWrUKM+Xc5WVlY899hhc3gceeKC0tNRz408YFmpwKD26aBn36tULwoybbt68Gc5uYi09P2zYsN/+9reOqZbuwcyep9U19n44yAs0s3yKGdpeOMG8XOeGdPJEg1IXW3bUNahjnF0q+yuSiU4Bnn322U8//RSFPNj0ysaNG5t5I60CONZtaN68OUwkvEOz2hfc0C5dugwfPhzauXLlSh7cs2cPqv+QIUOCDTVAsLfeeuukSZOCbc0N27ply5bdu3cjzjC7CGrBggX28JnWrVtzkCp8Sqi1p9+Gc/r163ffffeFOOFNhIEthDCe/nvMHT58GCfjNI6S4ckJt5dOjDzRkydP/vznP0/E5EjN5QBlYlIBLqEAl/HXv/41BMw9jrdv376O6RM33nij/ZNun2MUyfnz52EZN27caI6cOXPmwIEDEFeUq+zsbPeSQGZQbnV1Nbxk93qwBK4tFHTixIktWrR46623IKiMHtQRT2F0ffTo0eYSCCpkderUqb8KMHny5NAnvIkwMA0ydq37O5fwnqGadudBIq68GAtP1LG8X2LB5QDXrVuXfMtq+JCZmQmTF5VVy0X8k56ePi4ALBocU4gifAKuaeA4c9iwYdu3b2fPIbSQl9gdvGmBl2046H5ziRL1ySefNG3aFFYVt1i0aJHjJSgH5ebl5UHz+vTpY6+lYHPw4EHIJJzaEQGqqqocPZYFBQW4F5S7ZcuW8DtTZ1hDvTcOuBmA6e1Ag6ZGUeQOdGYnu0TckC4WIrp06dJQNteNW44ePbpmzRq0YVPHqqLFkEzTtkSIsJvXZyFWeKvr168vLS3F9yFDhrRr184xkoX+x4YNGxwHc3Jy8Al38/Dhw3fccQcMZVFR0ZQpU9xuClR87969qG7z5s0LtjU3FHrPnj1QdHz3fOeXauuOde3aNTc3F44KmjiRr/IYNsgpMzQa/qWtqf4iipO5gB03pEv0lXWjLKJocm7bti3Ek5EBv/nNb86ePctWyS233NK7d+8IZ7kZKioqzMKBt99++2233da9e/cQr4VRwMlaDlAICOezzz5rG0H7327dusH/cHTw0imZPn16eXl5WmCg0LFjx95+++0XXnjBc7QtPFRo586dOwsLC0PcmjvFYVd848aNkTv1KKJ2YYAucqtX/0uomp07dzarwCIQNo8kov8fpE7oA1zPnDnTr18/R8u0pKQELSzUpUj6ZBDy7Nmz3StooMyFPhgMIaDa18XUciESFPdi8b169cIRxzACVGGYAiqocVlwWl5eHs4vLi72HHAEE2w2bxkwYMCSJUuMjW7durWG+9nAAeUcoU8//bQeo2EyCG0myDmaPiFehdxs0KABrXESiGjUetVru7wfWpqekrZr165HH3007LkxqK5jx471XIMKdwx9wUYtByiEgyZNmtitWy7M6X4N5nkQRn/Dhg3wP5577rmNGzfaa9fZNgTnjBo1CjdasWLF6tWr8X3ChAnr1q1zjHhKcWDK4G+gLVKPU0TsgbgcvRXioIqDBw8iN81EF1yV6BNdoiair776auTL+xE0bKHHMRByf/bv3+942SNEKtOoUaNZs2aZ0bZPPPFERkaGQy+zsrLcB9u0aQNvcu/evatWrYK7ibYsdHTGjBmeg3LPnDmzfv36tMCbv6lTp44fP75Vq1ZK/HijVpNbbD777DNOdDENghAvTHIRRWuC5T5aQI/DGCxaXl7uXos5EtasWROVbTGESA7y8vI2b95cWFiIT/iIsIYOCwjjyH067YN9+vQxRpZL4C5YsCA3N/fdd9/17Kd1DAAWcUitJre4XdhkmugSBRFFosybNy/qLrn9TiVEov6GAE1muLaRbxIuRNIAt3Lo0KFcaBoGtGXLlg6VhYI6hgXBYjqM7Pbt2x955JGDBw8WFRWhqeqYtBrejkwilpjVd0Oc3OIQYPZY8GdCz+aIjoi+8MILnmslR0gYix7UxUA1LQcohA/2Sm+DBw9u166dY6kyvgBzG1k0vufOnbtp06YuXbq8/fbbnD4INZ01a1ZyLKkakV225oDWaj5ozCaP/uQnP2kcID8/P5TJLW4vdsKECYgtCk+qj86tu+X94medkbKysm7duqGJLYsphAN4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ERVCCCEkokIIIYREVAghhJCICiGEEBJRIYQQQkhEhRBCCImoEEIIIREVQgghJKJCCCGERFQIIYQQElEhhBBCIiqEEEJIRIUQQgiJqBBCCCEkokIIIYREVAghhJCICiGEEBJRIYQQQiIqhBBCCImoEEIIIREVQgghJKJCCCGERFQIIYRIPRoqCYQQIrm5fPny4cOHz507d+LEiZMnT165cuXbb789fvw4/kpPT2/VqhW+tG7dOjNA586d8alEC5Ebrl27plQQQojko7q6et++feXl5QcOHLh69WroF0JQBwwY0LNnz5ycHCWjRFQIIVKICxcu7Nq1a//+/QcPHowwKPipvXv3fuCBB3r06KGElYgKIUQyU1VVVVJSsmPHjlr5naGQlZU1bty43NxcJbJEVAghko2LFy8WFxdv37496vJp06ZNm0mTJvXp00cJLhEVfpw7d+79998/ePBgVYD27dtnZGSg5vTt27dp06ZKn5QFBroiwJkzZ06dOmUGp8BNadSo0R133JGZmZkTAD+VXDEDrufSpUsvXboUm9v16NGjsLAQNkEpLxEVTlAPV65c+d57712/ft39b4sWLZ5++umhQ4cqoVKN/fv379y589NPP71y5UqNJzdu3Lh3794DBw7Ui7QYVNi5c+fu3bs3xvdFY3revHloVSsLJKLi/4B7MXHiRLih/qeh5vzsZz9r0ECTjFPFy9m4cePJkyfDuLZdu3ajR48eNGiQkrEuqKysnDlzZo0Vtu4YPnz41KlTU7zXQSIq/kZ1dXV+fj50tMYzn3322REjRijFkp4TJ04sWLDg6NGjnv+2b9/+xhtvxCe+Hz9+3HTtuunYseOcOXOysrKUpFGkvLx89uzZoXQMGDp37ty2bdsOHTpkZmY2a9bM/uv06dOo+/g8fPjw+fPnaxXmihUrUvktj0RU/I1p06aF0ikkBU0dB7SoqMgxSgWS2a9fv65du0IXPa+C4h48ePCjjz5yCCqclcLCQrmk0WL79u0vvfSS5zsXB5C3Bx54YMCAAVC7EKUOagqFLisrQysqlPNRKv71X/81PT1dIipSFzQ/n3rqKSmoADDNy5cv37Jli30wNzd31KhR2dnZIQZSWVm5adOmXbt22QdReKZOnaoXARGybds2tG9qPK1Vq1b5+fl5eXlhu4loCW3YsMGRiZ60adNm3bp1LVq0kIiK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
/***
!Description
Updates the html serialization in TiddlySpace to provide routes to the takenote tool
***/
$(document).ready(function() {
	var place = $("#container").length > 0 ? $("#container")[0] : document.body;
	var space = window.location.host.split(".")[0]
	var bag = $(".bag").first().text() || space + "_public";
	var title = $("#title").text();
	// add edit link to notabene
	$.ajax({ url: "/spaces/" + space + "/members",
		success: function(r) {
			var isTiddler = $(".tiddler").length > 0;
			if(r) {
				if(bag == space + "_public") {
					if(isTiddler) {
						$("<a id='editLink' />").attr("href", "/takenote#!/quickedit/tiddler/" + title).
							text("edit note").prependTo(place);
					} else { // when viewing a collection add link to create new note in collection
						$("<a id='editLink' />").attr("href", "/takenote").
							text("take note").prependTo(place);
					}
				} else if(bag == space + "_private") {
					if(isTiddler) {
						$("<a id='editLink' />").attr("href", "/takenote#!/quickedit/bags/" + bag + "/tiddler/" + title).
							text("edit note").prependTo(place);
					}
				}
				if($("#backstage").length === 0) {
					$(['<ul id="backstage">',
						'<li><a href="/dashboard">dashboard</a></li><li><a href="/takenote">takenote</a></li>',
						'</ul>'].join("")).prependTo(document.body);
				}
			}
		}
	});
});
(function($){$.jQTouch=function(_2){$.support.WebKitCSSMatrix=(typeof WebKitCSSMatrix=="object");$.support.touch=(typeof Touch=="object");$.support.WebKitAnimationEvent=(typeof WebKitTransitionEvent=="object");var _3,$head=$("head"),hist=[],newPageCount=0,jQTSettings={},hashCheck,currentPage,orientation,isMobileWebKit=RegExp(" Mobile/").test(navigator.userAgent),tapReady=true,lastAnimationTime=0,touchSelectors=[],publicObj={},extensions=$.jQTouch.prototype.extensions,defaultAnimations=["slide","flip","slideup","swap","cube","pop","dissolve","fade","back"],animations=[],hairextensions="";init(_2);function init(_4){var _5={addGlossToIcon:true,backSelector:".back, .cancel, .goback",cacheGetRequests:true,cubeSelector:".cube",dissolveSelector:".dissolve",fadeSelector:".fade",fixedViewport:true,flipSelector:".flip",formSelector:"form",fullScreen:true,fullScreenClass:"fullscreen",icon:null,touchSelector:"a, .touch",popSelector:".pop",preloadImages:false,slideSelector:"body > * > ul li a",slideupSelector:".slideup",startupScreen:null,statusBar:"default",submitSelector:".submit",swapSelector:".swap",useAnimations:true,useFastTouch:true};jQTSettings=$.extend({},_5,_4);if(jQTSettings.preloadImages){for(var i=jQTSettings.preloadImages.length-1;i>=0;i--){(new Image()).src=jQTSettings.preloadImages[i];}}if(jQTSettings.icon){var _7=(jQTSettings.addGlossToIcon)?"":"-precomposed";hairextensions+="<link rel=\"apple-touch-icon"+_7+"\" href=\""+jQTSettings.icon+"\" />";}if(jQTSettings.startupScreen){hairextensions+="<link rel=\"apple-touch-startup-image\" href=\""+jQTSettings.startupScreen+"\" />";}if(jQTSettings.fixedViewport){hairextensions+="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;\"/>";}if(jQTSettings.fullScreen){hairextensions+="<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />";if(jQTSettings.statusBar){hairextensions+="<meta name=\"apple-mobile-web-app-status-bar-style\" content=\""+jQTSettings.statusBar+"\" />";}}if(hairextensions){$head.append(hairextensions);}$(document).ready(function(){for(var i in extensions){var fn=extensions[i];if($.isFunction(fn)){$.extend(publicObj,fn(publicObj));}}for(var i in defaultAnimations){var _a=defaultAnimations[i];var _b=jQTSettings[_a+"Selector"];if(typeof (_b)=="string"){addAnimation({name:_a,selector:_b});}}touchSelectors.push("input");touchSelectors.push(jQTSettings.touchSelector);touchSelectors.push(jQTSettings.backSelector);touchSelectors.push(jQTSettings.submitSelector);$(touchSelectors.join(", ")).css("-webkit-touch-callout","none");$(jQTSettings.backSelector).tap(liveTap);$(jQTSettings.submitSelector).tap(submitParentForm);_3=$("body");if(jQTSettings.fullScreenClass&&window.navigator.standalone==true){_3.addClass(jQTSettings.fullScreenClass+" "+jQTSettings.statusBar);}_3.bind("touchstart",handleTouch).bind("orientationchange",updateOrientation).trigger("orientationchange").submit(submitForm);if(jQTSettings.useFastTouch&&$.support.touch){_3.click(function(e){var _d=$(e.target);if(_d.attr("target")=="_blank"||_d.attr("rel")=="external"||_d.is("input[type=\"checkbox\"]")){return true;}else{return false;}});_3.mousedown(function(e){var _f=(new Date()).getTime()-lastAnimationTime;if(_f<200){return false;}});}if($("body > .current").length==0){currentPage=$("body > *:first");}else{currentPage=$("body > .current:first");$("body > .current").removeClass("current");}$(currentPage).addClass("current");location.hash=$(currentPage).attr("id");addPageToHistory(currentPage);scrollTo(0,0);dumbLoopStart();});}function goBack(to){if(hist.length>1){var _11=Math.min(parseInt(to||1,10),hist.length-1);if(isNaN(_11)&&typeof (to)==="string"&&to!="#"){for(var i=1,length=hist.length;i<length;i++){if("#"+hist[i].id===to){_11=i;break;}}}if(isNaN(_11)||_11<1){_11=1;}var _13=hist[0].animation;var _14=hist[0].page;hist.splice(0,_11);var _15=hist[0].page;animatePages(_14,_15,_13,true);return publicObj;}else{console.error("No pages in history.");return false;}}function goTo(_16,_17){var _18=hist[0].page;if(typeof (_16)==="string"){_16=$(_16);}if(typeof (_17)==="string"){for(var i=animations.length-1;i>=0;i--){if(animations[i].name===_17){_17=animations[i];break;}}}if(animatePages(_18,_16,_17)){addPageToHistory(_16,_17);return publicObj;}else{console.error("Could not animate pages.");return false;}}function getOrientation(){return orientation;}function liveTap(e){var $el=$(e.target);if($el.attr("nodeName")!=="A"){$el=$el.parent("a");}var _1c=$el.attr("target"),hash=$el.attr("hash"),animation=null;if(tapReady==false||!$el.length){console.warn("Not able to tap element.");return false;}if($el.attr("target")=="_blank"||$el.attr("rel")=="external"){return true;}for(var i=animations.length-1;i>=0;i--){if($el.is(animations[i].selector)){animation=animations[i];break;}}if(_1c=="_webapp"){window.location=$el.attr("href");}else{if($el.is(jQTSettings.backSelector)){goBack(hash);}else{if(hash&&hash!="#"){$el.addClass("active");goTo($(hash).data("referrer",$el),animation);}else{$el.addClass("loading active");showPageByHref($el.attr("href"),{animation:animation,callback:function(){$el.removeClass("loading");setTimeout($.fn.unselect,250,$el);},$referrer:$el});}}}return false;}function addPageToHistory(_1e,_1f){var _20=_1e.attr("id");hist.unshift({page:_1e,animation:_1f,id:_20});}function animatePages(_21,_22,_23,_24){if(_22.length===0){$.fn.unselect();console.error("Target element is missing.");return false;}$(":focus").blur();scrollTo(0,0);var _25=function(_26){if(_23){_22.removeClass("in reverse "+_23.name);_21.removeClass("current out reverse "+_23.name);}else{_21.removeClass("current");}_22.trigger("pageAnimationEnd",{direction:"in"});_21.trigger("pageAnimationEnd",{direction:"out"});clearInterval(dumbLoop);currentPage=_22;location.hash=currentPage.attr("id");dumbLoopStart();var _27=_22.data("referrer");if(_27){_27.unselect();}lastAnimationTime=(new Date()).getTime();tapReady=true;};_21.trigger("pageAnimationStart",{direction:"out"});_22.trigger("pageAnimationStart",{direction:"in"});if($.support.WebKitAnimationEvent&&_23&&jQTSettings.useAnimations){_22.one("webkitAnimationEnd",_25);tapReady=false;_22.addClass(_23.name+" in current "+(_24?" reverse":""));_21.addClass(_23.name+" out"+(_24?" reverse":""));}else{_22.addClass("current");_25();}return true;}function dumbLoopStart(){dumbLoop=setInterval(function(){var _28=currentPage.attr("id");if(location.hash==""){location.hash="#"+_28;}else{if(location.hash!="#"+_28){try{goBack(location.hash);}catch(e){console.error("Unknown hash change.");}}}},100);}function insertPages(_29,_2a){var _2b=null;$(_29).each(function(_2c,_2d){var _2e=$(this);if(!_2e.attr("id")){_2e.attr("id","page-"+(++newPageCount));}_2e.appendTo(_3);if(_2e.hasClass("current")||!_2b){_2b=_2e;}});if(_2b!==null){goTo(_2b,_2a);return _2b;}else{return false;}}function showPageByHref(_2f,_30){var _31={data:null,method:"GET",animation:null,callback:null,$referrer:null};var _32=$.extend({},_31,_30);if(_2f!="#"){$.ajax({url:_2f,data:_32.data,type:_32.method,success:function(_33,_34){var _35=insertPages(_33,_32.animation);if(_35){if(_32.method=="GET"&&jQTSettings.cacheGetRequests&&_32.$referrer){_32.$referrer.attr("href","#"+_35.attr("id"));}if(_32.callback){_32.callback(true);}}},error:function(_36){if(_32.$referrer){_32.$referrer.unselect();}if(_32.callback){_32.callback(false);}}});}else{if($referrer){$referrer.unselect();}}}function submitForm(e,_38){var _39=(typeof (e)==="string")?$(e):$(e.target);if(_39.length&&_39.is(jQTSettings.formSelector)&&_39.attr("action")){showPageByHref(_39.attr("action"),{data:_39.serialize(),method:_39.attr("method")||"POST",animation:animations[0]||null,callback:_38});return false;}return true;}function submitParentForm(e){var _3b=$(this).closest("form");if(_3b.length){evt=jQuery.Event("submit");evt.preventDefault();_3b.trigger(evt);return false;}return true;}function addAnimation(_3c){if(typeof (_3c.selector)=="string"&&typeof (_3c.name)=="string"){animations.push(_3c);$(_3c.selector).tap(liveTap);touchSelectors.push(_3c.selector);}}function updateOrientation(){orientation=window.innerWidth<window.innerHeight?"profile":"landscape";_3.removeClass("profile landscape").addClass(orientation).trigger("turn",{orientation:orientation});}function handleTouch(e){var $el=$(e.target);if(!$(e.target).is(touchSelectors.join(", "))){var _3f=$(e.target).closest("a");if(_3f.length){$el=_3f;}else{return;}}if(event){var _40=null,startX=event.changedTouches[0].clientX,startY=event.changedTouches[0].clientY,startTime=(new Date).getTime(),deltaX=0,deltaY=0,deltaT=0;$el.bind("touchmove",touchmove).bind("touchend",touchend);_40=setTimeout(function(){$el.makeActive();},100);}function touchmove(e){updateChanges();var _42=Math.abs(deltaX);var _43=Math.abs(deltaY);if(_42>_43&&(_42>35)&&deltaT<1000){$el.trigger("swipe",{direction:(deltaX<0)?"left":"right"}).unbind("touchmove touchend");}else{if(_43>1){$el.removeClass("active");}}clearTimeout(_40);}function touchend(){updateChanges();if(deltaY===0&&deltaX===0){$el.makeActive();$el.trigger("tap");}else{$el.removeClass("active");}$el.unbind("touchmove touchend");clearTimeout(_40);}function updateChanges(){var _44=event.changedTouches[0]||null;deltaX=_44.pageX-startX;deltaY=_44.pageY-startY;deltaT=(new Date).getTime()-startTime;}}$.fn.unselect=function(obj){if(obj){obj.removeClass("active");}else{$(".active").removeClass("active");}};$.fn.makeActive=function(){return $(this).addClass("active");};$.fn.swipe=function(fn){if($.isFunction(fn)){return this.each(function(i,el){$(el).bind("swipe",fn);});}};$.fn.tap=function(fn){if($.isFunction(fn)){var _4a=(jQTSettings.useFastTouch&&$.support.touch)?"tap":"click";return $(this).live(_4a,fn);}else{$(this).trigger("tap");}};publicObj={getOrientation:getOrientation,goBack:goBack,goTo:goTo,addAnimation:addAnimation,submitForm:submitForm};return publicObj;};$.jQTouch.prototype.extensions=[];$.jQTouch.addExtension=function(_4b){$.jQTouch.prototype.extensions.push(_4b);};})(jQuery);
*{margin:0;padding:0;}a{-webkit-tap-highlight-color:rgba(0,0,0,0);}body{overflow-x:hidden;-webkit-user-select:none;-webkit-text-size-adjust:none;font-family:Helvetica;-webkit-perspective:800;-webkit-transform-style:preserve-3d;}.selectable,input,textarea{-webkit-user-select:auto;}body>*{-webkit-backface-visibility:hidden;-webkit-box-sizing:border-box;display:none;position:absolute;left:0;width:100%;-webkit-transform:translate3d(0,0,0) rotate(0) scale(1);min-height:420px!important;}body.fullscreen>*{min-height:460px!important;}body.fullscreen.black-translucent>*{min-height:480px!important;}body.landscape>*{min-height:320px;}body>.current{display:block!important;}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms;}.slide.in{-webkit-animation-name:slideinfromright;}.slide.out{-webkit-animation-name:slideouttoleft;}.slide.in.reverse{-webkit-animation-name:slideinfromleft;}.slide.out.reverse{-webkit-animation-name:slideouttoright;}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%);}to{-webkit-transform:translateX(0);}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%);}to{-webkit-transform:translateX(0);}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0);}to{-webkit-transform:translateX(-100%);}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0);}to{-webkit-transform:translateX(100%);}}@-webkit-keyframes fadein{from{opacity:0;}to{opacity:1;}}@-webkit-keyframes fadeout{from{opacity:1;}to{opacity:0;}}.fade.in{z-index:10;-webkit-animation-name:fadein;}.fade.out{z-index:0;}.dissolve.in{-webkit-animation-name:fadein;}.dissolve.out{-webkit-animation-name:fadeout;}.flip{-webkit-animation-duration:.65s;}.flip.in{-webkit-animation-name:flipinfromleft;}.flip.out{-webkit-animation-name:flipouttoleft;}.flip.in.reverse{-webkit-animation-name:flipinfromright;}.flip.out.reverse{-webkit-animation-name:flipouttoright;}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8);}to{-webkit-transform:rotateY(0) scale(1);}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8);}to{-webkit-transform:rotateY(0) scale(1);}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1);}to{-webkit-transform:rotateY(-180deg) scale(.8);}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1);}to{-webkit-transform:rotateY(180deg) scale(.8);}}.slideup.in{-webkit-animation-name:slideup;z-index:10;}.slideup.out{-webkit-animation-name:dontmove;z-index:0;}.slideup.out.reverse{z-index:10;-webkit-animation-name:slidedown;}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove;}@-webkit-keyframes slideup{from{-webkit-transform:translateY(100%);}to{-webkit-transform:translateY(0);}}@-webkit-keyframes slidedown{from{-webkit-transform:translateY(0);}to{-webkit-transform:translateY(100%);}}@-webkit-keyframes dontmove{from{opacity:1;}to{opacity:1;}}.swap{-webkit-transform:perspective(800);-webkit-animation-duration:.7s;}.swap.out{-webkit-animation-name:swapouttoleft;}.swap.in{-webkit-animation-name:swapinfromright;}.swap.out.reverse{-webkit-animation-name:swapouttoright;}.swap.in.reverse{-webkit-animation-name:swapinfromleft;}@-webkit-keyframes swapouttoright{0%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);-webkit-animation-timing-function:ease-in-out;}50%{-webkit-transform:translate3d(-180px,0px,-400px) rotateY(20deg);-webkit-animation-timing-function:ease-in;}100%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(70deg);}}@-webkit-keyframes swapouttoleft{0%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);-webkit-animation-timing-function:ease-in-out;}50%{-webkit-transform:translate3d(180px,0px,-400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in;}100%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(-70deg);}}@-webkit-keyframes swapinfromright{0%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(70deg);-webkit-animation-timing-function:ease-out;}50%{-webkit-transform:translate3d(-180px,0px,-400px) rotateY(20deg);-webkit-animation-timing-function:ease-in-out;}100%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);}}@-webkit-keyframes swapinfromleft{0%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(-70deg);-webkit-animation-timing-function:ease-out;}50%{-webkit-transform:translate3d(180px,0px,-400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in-out;}100%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);}}.cube{-webkit-animation-duration:.55s;}.cube.in{-webkit-animation-name:cubeinfromright;-webkit-transform-origin:0 50%;}.cube.out{-webkit-animation-name:cubeouttoleft;-webkit-transform-origin:100% 50%;}.cube.in.reverse{-webkit-animation-name:cubeinfromleft;-webkit-transform-origin:100% 50%;}.cube.out.reverse{-webkit-animation-name:cubeouttoright;-webkit-transform-origin:0 50%;}@-webkit-keyframes cubeinfromleft{from{-webkit-transform:rotateY(-90deg) translateZ(320px);opacity:.5;}to{-webkit-transform:rotateY(0deg) translateZ(0);opacity:1;}}@-webkit-keyframes cubeouttoright{from{-webkit-transform:rotateY(0deg) translateX(0);opacity:1;}to{-webkit-transform:rotateY(90deg) translateZ(320px);opacity:.5;}}@-webkit-keyframes cubeinfromright{from{-webkit-transform:rotateY(90deg) translateZ(320px);opacity:.5;}to{-webkit-transform:rotateY(0deg) translateZ(0);opacity:1;}}@-webkit-keyframes cubeouttoleft{from{-webkit-transform:rotateY(0deg) translateZ(0);opacity:1;}to{-webkit-transform:rotateY(-90deg) translateZ(320px);opacity:.5;}}.pop{-webkit-transform-origin:50% 50%;}.pop.in{-webkit-animation-name:popin;z-index:10;}.pop.out.reverse{-webkit-animation-name:popout;z-index:10;}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove;}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0;}to{-webkit-transform:scale(1);opacity:1;}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1;}to{-webkit-transform:scale(.2);opacity:0;}}
<!doctype html>
<html>
	<head>
		<title>TiddlyApp Share</title>

		<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css"/>
		<script src="/bags/common/tiddlers/jquery.js" type="text/javascript"></script>
		<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript"></script>
		<script src="/bags/common/tiddlers/chrjs-store.js" type="text/javascript"></script>
		<script src="/bags/tiddlyspace/tiddlers/chrjs.users" type="text/javascript"></script>
		<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
		<script>
			// The templates of the links to display on the page
			var links = [
				{
					title: "Tiddlers",
					info: "Show a list of all the tiddlers in this space that a visitor currently has access to.",
					href: "{host}/tiddlers"
				}, {
					title: "Public Tiddlers",
					info: "Show a list of all the public tiddlers in this space in alphabetical order.",
					href: "{host}/bags/{subdomain}_public/select=tag:!excludeLists;sort=title"
				}, {
					title: "Atom Feed",
					info: "Get the Atom feed of the most recently changed tiddlers.",
					href: "{host}/tiddlers.atom?select=tag:!excludeLists;sort=-modified;limit=20"
				}, {
					title: "Specific Tiddler",
					info: "Show a specific tiddler in your space (GettingStarted in this example) as HTML, JSON or just plain text.",
					href: ["{host}/GettingStarted", "{host}/GettingStarted.json", "{host}/GettingStarted.txt"],
					more: "http://tiddlyweb.peermore.com/wiki/"
				}, {
					title: "Search for text",
					info: "Search tiddlers for some text contained inside a tiddler.",
					href: "{host}/search?q={subdomain}"
				}, {
					title: "List tiddlers with a tag",
					info: "Display all the tiddlers that have the tag specified (here the tag is systemConfig).",
					href: "{host}/tiddlers?select=tag:systemConfig"
				}
			];

			$(function() {

				var subdomain = document.location.host.split(".")[0];

				// Filter curly braces to display information
				for (var i in links) {
					var href = links[i].href;

					if (typeof href === "string")
						href = [href];

					for (var j in href) {

						href[j] =  href[j].replace("{host}", (document.protocol || "http:") + "//" + document.location.host);
						href[j] =  href[j].replace("{subdomain}", subdomain);
					}

					links[i].href = href;
				}

				// Display links to user
				var insertInto = $('#share_links');

				for (var i in links) {

					var linkBody = $('<div class="share_link"></div>');

					var linkDisplay = $('<div class="link_display"></div>');

					for (var j in links[i].href) {

						var a = $('<a class="link_href" target="_blank"/>');
						a.html(links[i].href[j]);
						a.attr('href', links[i].href[j]);

						linkDisplay.append(a);
						linkDisplay.append("<br/>");
					}
					
					var linkTitle = $('<b class="link_title"/>');
					linkTitle.html(links[i].title);

					var linkInfo = $('<div class="link_info"/>');
					linkInfo.html(links[i].info);

					linkBody.append(linkTitle);
					linkBody.append('<br/>');
					linkBody.append(linkInfo);
					linkBody.append(linkDisplay);

					if (links[i].more) {
						var linkMore = $('<a class="link_more">Learn more</a>');
						linkMore.attr('href', links[i].more);
						linkBody.append(linkMore);
					}

					insertInto.append(linkBody);
				}
			});
		</script>
		<style type="text/css">
			.link_display {
				display: block;
				background: #f2f2f2;
				border: 1px solid #aaa;
				padding: 10px;
				margin-top: 4px;
				word-wrap: break-word;
			}
			.link_more {
				display: block;
				text-align: right;
			}
			.share_link {
				margin-bottom: 10px;
			}
		</style>
	</head>
	<body>
		<div id="container">
			<div id="header">
				<h1>Share Space</h1>
			</div>
			<p>Here are a number of methods that you can use to share this Space and its content in different ways.</p>
			<span id="share_links"></span>
		</div>
	</body>
</html>
CACHE MANIFEST
# version 0.6.4

CACHE:
/takenote
/dashboard
/bags/common/tiddlers/jquery-ui.custom.css
/bags/common/tiddlers/jquery-ui.custom.js
/notabene.css
/notabene.js
/bags/common/tiddlers/jquery-json.js
/bags/common/tiddlers/jquery.js
/bags/tiddlyspace/tiddlers/chrjs
/bags/common/tiddlers/chrjs-store.js
/touchicon_takenote.png
/bags/common/tiddlers/cancelTiddler.png
/bags/common/tiddlers/saveTiddler.png
/bags/common/tiddlers/deleteTiddler.png
/bags/common/tiddlers/HtmlBackground
/bags/common/tiddlers/icon-search.png
/bags/common/tiddlers/icon-incomplete.png
/bags/common/tiddlers/icon-recent.png
/bags/common/tiddlers/bookmark_bubble.js
NETWORK:
*

iVBORw0KGgoAAAANSUhEUgAAAmwAAAGNCAIAAAAjB7rIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNTgwMTE3NDA3MjA2ODExOERCQkFEMEM1MjhFMjQyQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MDI1NERERDFERkIxMUUxQUI2Rjg4OEE0QjI4REMyMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MDI1NEREQzFERkIxMUUxQUI2Rjg4OEE0QjI4REMyMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjBBOTRCRUVCQzgyMTY4MTE4REJCQUQwQzUyOEUyNDJDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA1ODAxMTc0MDcyMDY4MTE4REJCQUQwQzUyOEUyNDJDIi8+IDwvcmRmOkRlc2NyaXB0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
<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>
noscript {
	border: 5px solid red;
	display: block;
	margin: auto;
	padding: 50px;
	text-align: center;
	width: 300px;
}

.syncButton {
	font-size: 2em;
	border: solid 1px #CCC;
	padding: 5px;
	-moz-border-radius: 5px 5px 5px;
	-webkit-border-radius: 5px 5px 5px;
	width: 48px;
	height: 48px;
	background-image: url(/bags/common/tiddlers/icon-sync.png);
	background-repeat: no-repeat;
	background-position: center;
	text-indent: -999px;
	overflow: hidden;
	display: block;
	text-align: center;
	cursor: pointer;
	right: 120px;
	top: 80px;
	position: absolute;
}

#note.active #deletenote {
	display: none;
}

body {
	font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
	margin: 0;
	background-image: url(/bags/common/tiddlers/HtmlBackground);
}

#backstage {
	width: 100%;
	padding: 0px;
	background-color: black;
	margin: 0px 0px 0px 0px;
	height: 32px;
	text-align: center;
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	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%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F5555, endColorstr=#F2222);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#F5555, endColorstr=#F2222)";
}

#backstage a {
	color: white;
	padding: 4px;
	display: block;
	text-decoration: none;
}

#backstage li:first-child {
	border-right: solid 1px #777;
}

#backstage li:nth-child(2) {
	border-left: solid 1px #555;
}

#backstage a:hover {
	background-color: #FFA500;
}

#backstage li {
	display: inline-block;
	line-height: 18px;
	margin-top: 2px;
	padding: 0px 10px;
}

#backstage .status {
	color: #CCC;
	float: right;
	font-size: 0.8em;
}

#backstage .status.nonmember {
	color: #666;
	opacity: 0.5;
}

h2,h3,h4,h5 {
	margin-bottom: 0px;
}

a {
	color: royalBlue;
}

a:hover {
	color:#4169C8;
}

.header {
	border-bottom: 7px solid rgba(26, 31, 30, 0.95);
	padding-bottom: 20px;
	position: relative;
}

.siteheading {
	position: relative;
}

.header h1 {
	color: #4C4A54;
	font-size: 4em;
	line-height: 48px;
	text-shadow: 0px 2px 2px white;
	padding-top: 10px;
	margin-top: 0px;
	padding-left: 72px;
}

.toolpanel .info,
.toolpanel input,
.toolpanel h2,
.toolpanel ul {
	margin-left: 120px;
}

.toolpanel h2 {
	text-shadow: 0px 1px 1px white;
}

.toolpanel .section {
	border-bottom: 1px solid #DCE7F1;
	border-top: 1px solid #F8F8F8;
	padding: 24px;
	position: relative;
}

.section.searchSection {
	background-image: url(/bags/common/tiddlers/icon-search.png);
	background-position: 80px 15px;
	background-repeat: no-repeat;
}

.section.recentSection {
	background-image: url(/bags/common/tiddlers/icon-recent.png);
	background-position: 80px 15px;
	background-repeat: no-repeat;
}

.section.incompleteSection {
	background-image: url(/bags/common/tiddlers/icon-incomplete.png);
	background-position: 80px 15px;
	background-repeat: no-repeat;
	min-height: 100px;
}

.toolpanel .section ul {
	list-style: none;
}

.siteicon {
	background-image: url(SiteIcon);
	height: 56px;
	width: 56px;
	background-repeat: no-repeat;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	-o-border-radius: 10px;
	border-radius: 10px;
	background-size: 56px 56px;
	position: absolute;
	left: 6px;
	top: 8px;
}

.toolbar {
	position: absolute;
	top: -40px;
	width: 100%;
}


.takenotedashboard .footer {
	text-align: center;
	font-style: italic;
	font-size: 0.8em;
	color: gray;
	font-weight: bold;
	border-top: solid 1px #CCC;
}

.takenotedashboard .footer,
#note,
.messageArea {
	width: 500px;
}

.note_title {
	font-family: Georgia;
	line-height: 48px;
	color: #4C4A54;
	width: 468px; /* 500 - 32 padding */
}

.takenotecontainer {
	width: 540px;
	background: rgba(255,255,255, 0.7);
}

.takenotedashboard {
	width: 540px;
	background-color: #F0F4F8;
	padding-bottom: 40px;
}

.note_title_container {
	width: 556px;
	margin-left: -28px;
	-webkit-box-shadow: 0px 1px 1px rgb(96,106,115);
	position:relative;
	background-color: #DCE7F1;
}

@media all and (min-width: 480px) {
	.note_title_container:before {
		content: "";
		position: absolute;
		bottom: -8px;
		left: 0px;
		border-width: 0px 8px 8px 0px;
		border-style: solid;
		border-color: rgba(0,0,0,0) #3A4955 rgba(0,0,0,0) #3A4955;
		background: rgba(0,0,0,0);
		display: block;
		width: 0;
	}

	.note_title_container:after {
		content: "";
		position: absolute;
		bottom: -8px;
		right: 0px;
		border-width: 8px 8px 0px 0px;
		border-style: solid;
		border-color: #3A4955 rgba(0,0,0,0) rgba(0,0,0,0) #3A4955;
		background: rgba(0,0,0,0);
		display: block;
		width: 0;
	}
}

.note_title {
	background: none;
	width: 500px;
	margin-left: 10px;
}

.takenotedashboard,
.takenotecontainer {
	margin: auto;
	margin-top: 20px;
	position: relative;
	display: none;
}

.takenotedashboard,
.takenotecontainer.ready {
	display: block;
}

#note {
	position: relative;
}

.takenotedashboard .footer,
#note,
.messageArea {
	margin: 0 auto;
}

.messageArea {
	position: relative;
	margin-bottom: 20px;
	font-family: monospace;
	border: solid 1px #ccc;
	color: #333;
	padding: 10px 0px 20px 0px;
	text-indent: 4px;
	color: green;
	opacity: 0;
}

.messageArea.warning {
	color: #B38600;
}

.messageArea.error {
	color: red;
}

.messageArea.displayed {
	opacity: 1;
	-webkit-transition: opacity 0.4s ease-in;
}

.takenotecontainer h1 {
	font-size: 3em;
}

#notebody {
	position: relative;
	border: 1px solid gray;
	background: rgba(255,255,255, 0.7);
	margin-top: 18px;
	padding: 16px;
	box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5), -1px -1px 2px rgba(0, 0, 0, 0.5);
}

#newnote {
	height: 24px;
	width: 30px;
	position: absolute;
	top: 6px;
	right: 4px;
	padding: 5px;
	background-repeat: no-repeat;
	background-image: url(/bags/common/tiddlers/saveTiddler.png);
}

.notedate {
	float: right;
	color: rgba(0,0,0, 0.5);
	margin-left: 32px;
}

#notebody .note_text {
	color: #1A1F1E;
	background: transparent;
	width: 100%;
	border: none;
	outline: none;
	clear: both;
	font-family: Georgia;
	font-size: 1.3em;
	line-height: 1.3em;
}

#tips {
	padding: 8px;
	background-color: #DDD;
}

.imageTip img {
	width: 16px;
	height: 16px;
}

.boldTip, .underlineTip, .italicTip {
	margin-left: 2px;
	margin-right: 2px;
}

.boldTip {
	font-weight: bold;
}

.underlineTip {
	text-decoration: underline;
}

.italicTip {
	font-style: italic;
}

#metabutton {
	background: gray;
	width: 32px;
	height: 32px;
	background-repeat: no-repeat;
	background-position: center;
	opacity: 0.3;
	border-radius: 0 0 5px 5px;
	padding: 10px;
	position: absolute;
	bottom: -52px;
	left: 224px;
	-webkit-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
	-moz-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
	-o-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
	-ms-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
	transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
}

#metabutton:hover {
	opacity: 0.7;
	height: 35px;
	bottom: -55px;
}

#newnote:hover,
#metabutton:hover {
	cursor: pointer;
}

#notemeta .paddedbox {
	padding: 10px;
}

#notemeta ul {
	list-style: none;
}

.removeTag {
	background-image: url(/bags/common/tiddlers/deleteTiddler.png);
	background-size: 12px 16px;
	background-repeat: no-repeat;
	text-indent: -999px;
	overflow: hidden;
	width: 12px;
	height: 16px;
	display: inline-block;
	margin-left: 8px;
	margin-right: 8px;
	cursor: pointer;
}

.note_title {
	border: none;
	font-size: 3em;
	outline: none;
	padding: 0px 16px;
	text-align: center;
	text-shadow: 0px 1px 1px white;
}

.note_title:focus {
	text-shadow: none;
}

#deletenote {
	position: absolute;
	top: 4px;
	left: 4px;
	background-image: url(/bags/common/tiddlers/deleteTiddler.png);
	background-repeat: no-repeat;
	height: 30px;
	width: 20px;
}

#cancelnote {
	position: absolute;
	top: 4px;
	visibility: hidden;
	right: 235px; /* 500 / 2 - 15px (half width of cancel button) */
	background-image: url(/bags/common/tiddlers/cancelTiddler.png);
	background-repeat: no-repeat;
	height: 30px;
	width: 30px;
}

.validatedNote #cancelnote {
	visibility: visible;
}

#cancelnote,
#deletenote,
#newnote {
	cursor: pointer;
	opacity: 0.3;
	overflow: hidden;
	text-indent: -9999px;
}

#cancelnote:hover,
#newnote:hover,
#deletenote:hover {
	opacity: 1;
}

#backstage a.connectionStatus:hover,
.connectionStatus {
	display: block;
	position: relative;
	-webkit-border-radius: 5px;
	background-color: red;
}

.online #backstage a.connectionStatus:hover,
.online .connectionStatus {
	display: block;
	background-color: green;
}

.connectionStatus:after {
	content: "offline";
	position: absolute;
	top: -6px;
	left: 15px;
	color: #ccc;
}
.online .connectionStatus:after {
	content: "online";
	position: absolute;
	top: -6px;
	left: 15px;
	color: #eee;
}

.requiresConnection {
	display: none;
}

.online .requiresConnection {
	display: block;
}


/* iphone mode */
@media screen and (orientation:portrait) and (max-width: 320px) {
	.note_title {
		padding: 0px;
	}

	#backstage {
		font-size: 0.8em;
	}

	.takenotedashboard,
	.takenotecontainer {
		width: 320px;
		font-size: 0.7em;
	}

	.header h1 {
		font-size: 2em;
	}

	.takenotedashboard .footer,
	#note,
	.messageArea {
		width: 300px;
	}

	#cancelnote {
		right: 145px; /* 320 / 2 - 15px (half width of cancel button) - 16px (padding on note_title) */
	}

	.note_title,
	.note_title_container {
		width: 300px;
		margin: auto;
	}
}

/* portrait mode */
@media screen and (orientation:portrait) and (min-width: 480px) {
	.note_title {
		padding: 0px;
	}

	.takenotedashboard,
	.takenotecontainer {
		width: 480px;
	}

	.takenotedashboard .footer,
	#note,
	.messageArea {
		width: 460px;
	}

	#cancelnote {
		right: 199px; /* 460 / 2 - 15px (half width of cancel button) - 16px (padding on note_title) */
	}

	.note_title,
	.note_title_container {
		width: 460px;
		margin: auto;
	}
}
/*!
|''Name''|notabene|
|''Version''|0.6.4|
|''License''|BSD (http://en.wikipedia.org/wiki/BSD_licenses)|
|''Source''|https://github.com/jdlrobson/notabene/blob/master/src/notabene.js|
!*/
var APP_PATH = "/takenote";
var RESERVED_TITLES = ["takenote", "dashboard", "manifest.mf",
	"notabene.css", "jquery-ui.min.js", "jquery-json.min.js"];

var config;

// some helper functions
var notabene = {
	defaultFields: {},
	loadConfig: function() {
		config = localStorage.getItem("_takeNoteConfig") ? JSON.parse(localStorage.getItem("_takeNoteConfig")) : {};
		if(config.noGeoTiddlers) {
			if(new Date().getTime() - config.noGeoTiddlers > 1000*60*60*24) {
				// more than a day old so flush
				notabene.saveConfig("noGeoTiddlers", false);
			}
		}
	},
	saveConfig: function(name, value) {
		if(typeof(name) != "undefined" && typeof(value) != "undefined") {
			config[name] = value;
		}
		localStorage.setItem("_takeNoteConfig", JSON.stringify(config));
	},
	watchPosition: function(handler) {
		if(!!navigator.geolocation && !config.noGeoTiddlers) {
			navigator.geolocation.watchPosition(handler, function() {
				notabene.saveConfig("noGeoTiddlers", new Date().getTime());
			});
		}
	},
	supports_local_storage: function() {
		try {
			return 'localStorage' in window && window['localStorage'] !== null;
		} catch(e) {
			return false;
		}
	},
	getRecentChanges: function(bag) {
		var recentLocalStorageId = "takenote-recent-" + bag;
		var recent = localStorage.getItem(recentLocalStorageId);
		recent = recent ? $.parseJSON(recent) : [];
		return recent;
	},
	addRecentChange: function(bag, title) {
		var recent = notabene.getRecentChanges(bag);
		var newrecent = [];
		for(var i = 0; i < recent.length; i++) {
			var thisTitle = typeof(recent[i]) === "string" ? recent[i] : recent[i].title;
			if(thisTitle !== title) {
				newrecent.push(recent[i]);
			}
		}
		newrecent.push({ title: title, bag: bag });
		newrecent = newrecent.length > 5 ?
			newrecent.slice(newrecent.length - 5) : newrecent;
		localStorage.setItem("takenote-recent-" + bag, $.toJSON(newrecent));
	}
};
notabene.loadConfig();

function autoResize(el, options) {
	options = options || {};
	var resize = function(ev) {
		el = ev.target;
		var div = $('<div />').addClass($(el).attr("class")).hide().
			css({ "word-wrap": "break-word" }).insertBefore($(el)[0]);
		var value = $(el).val() || "";
		var lines = value.split("\n");
		for(var i = 0; i < lines.length; i++) {
			$("<span />").text(lines[i]).appendTo(div);
			$("<br />").appendTo(div);
		}
		var h = $(div).height();
		if(options.minHeight && h < options.minHeight) {
			h = options.minHeight;
		}
		if(options.buffer) {
			h += options.buffer;
		}
		$(ev.target).height(h);
		$(div).remove();
	};
	$(el).focus(resize).keyup(resize).blur(resize);
	$(el).focus();
}


function setup_store(options) {
	// configure notabene
	options = options || {};
	var bagname = options.bag;
	var host = options.host;
	var bag = new tiddlyweb.Bag(bagname, host);
	var store =  new tiddlyweb.Store();

	// retrieve last created note
	store.retrieveCached();
	return {
		store: store,
		bag: bag,
		host: host
	}
}

function notes(container, options) {
	backstage();

	// setup onleave event
	window.onbeforeunload = function() {
		// TODO: chrjs.store should probably provide a helper method for this situation
		if(!notabene.supports_local_storage() && store().dirty().length) {
	  	return ["There are unsynced changes. Are you sure you want to leave?\n\n",
				"Please upgrade your browser if possible to make sure you never lose a note."
				].join("");
		}
	}
	var instance = setup_store(options);
	var store = instance.store;
	var bag = instance.bag;
	var host = instance.host;
	var tiddlers = store().sort(function(a, b) {
		return a.fields._modified < b.fields._modified ? 1 : -1;
	});
	var note, tempTitle;

	// print the fields associated with the current note
	function printMetaData(tiddler) {
		// print meta information
		var fieldInfo = {
			_created: { label: "created on" },
			_modified: { label: "last modified on" }
		};
		$("#notemeta").empty();
		var container = $('<div class="paddedbox" />').appendTo("#notemeta")[0];
		var list = $("<ul />").appendTo(container)[0];
		for(var fieldname in tiddler.fields) {
			if(fieldname.indexOf("_") !== 0) {
				var val = tiddler.fields[fieldname];
				if(val) {
					var label = fieldInfo[fieldname] ? fieldInfo[fieldname].label : fieldname;
					$("<li />").text(label + ": " + val).appendTo(list);
				}
			}
		}
		var tags = tiddler.tags || [];
		if(tags.length > 0) {
			var tagArea = $("<li />").appendTo(list);
			$("<span />").text("tags : ").appendTo(tagArea);
			for(var i = 0; i < tags.length; i++) {
				$("<span />").text(tags[i]).appendTo(tagArea);
				$('<a class="removeTag">remove</a>').data("tag", tags[i]).click(function(ev) {
					var tag = $(ev.target).data("tag");
					removeTag(tag);
					storeNote();
					ev.preventDefault();
				}).appendTo(tagArea);
			}
		}
	}

	// load the current note into the display
	function loadNote() {
		$(".note_text").val(note.text);
		if(note.title != tempTitle && note.fields._title_set) {
			$(".note_title").val(note.title);
		}
		if(note.fields._title_validated) {
			$(".note_title").blur().attr("disabled", true);
			$(document.body).addClass("validatedNote");
		} else {
			$(document.body).removeClass("validatedNote");
		}

		printMetaData(note);

		notabene.watchPosition(function(data) {
			// if note has existing geo data exit to prevent overwriting
			if(note.fields['geo.lat'] && note.fields['geo.long']) {
				return;
			}
			if(data) {
				var coords = data.coords;
				note.fields['geo.lat'] = String(coords.latitude);
				note.fields['geo.long'] = String(coords.longitude);
			}
		});
	}

	function getTitle() {
		return "untitled note " + Math.random();
	}

	// creates a new note with a randomly generated title and loads it into the ui
	function newNote() {
		tempTitle = getTitle();
		note = new tiddlyweb.Tiddler(tempTitle, bag);
		note.fields = {};
		note.tags = [];
		note.fields._created = new Date();
		loadNote();
	}

	// prints a message to the user. This could be an error or a notification.
	function printMessage(html, className, fadeout) {
		var area = $(".messageArea", container);
		area = area.length > 0 ? area : $("<div class='messageArea' />").appendTo(container);
		area.attr("class", "messageArea displayed").html("<div>" + html + "</div>");
		$(".messageArea div").stop(false, false).show();
		if(fadeout) {
			$(".messageArea div").css({ opacity: 1 }).fadeOut(3000);
		}
		if(className) {
			$(area).addClass(className);
		}
	}

	// tell the user what the current state of the store is
	function syncStatus() {
		var area = $(".syncButton");
		var unsynced = store().dirty();
		$(area).text(unsynced.length);
		renderIncomplete(store, bag.name);
	}

	// this loads the note with the given title from the active bag and loads it into the display
	function loadServerNote(title, bagname) {
		note = new tiddlyweb.Tiddler(title);
		note.fields = {};
		note.bag = new tiddlyweb.Bag(bagname || bag.name, host);
		store.get(note, function(tid, msg, xhr) {
			var is404 = xhr ? xhr.status === 404 : false;
			if(tid) {
				delete tid.fields.created;
				delete tid.fields.modified;
				note = tid;
			} else if(!is404) {
				resetNote();
			}
			// TODO: replace with chrjs-store method i.e. store.isPresent(tid)
			if(!localStorage.getItem(bag.name + "/" + encodeURIComponent(note.title))) {
				if(is404 || tid) {
					note.fields._title_validated = "yes";
				}
			}
			if(is404 || tid) {
				note.fields._title_set = "yes";
			}
			$(container).addClass("ready");
			loadNote();
		});
	}

	// this initialises notabene, loading either the requested note, the last worked on note or a new note
	function init() {
		var syncButton = $(".syncButton");
		syncButton = syncButton.length > 0 ? syncButton :
			$("<div class='syncButton' />").prependTo(container);
		syncStatus();
		syncButton.click(function(ev) {
			var error, synced = 0, invalid = [];
			var dirty = store().dirty();

			printMessage("Syncing to server");
			var giveFeedback = function(tid) {
				if(tid) {
					notabene.addRecentChange(tid.bag.name, tid.title);
				}
				if(synced === 0) {
					if(dirty.length > 0) {
						printMessage("Finish your note '" + note.title + "' before syncing.", "warning");
					} else {
						printMessage("Nothing to sync.", "warning");
					}
				} else {
					if(invalid.length > 0) {
						printMessage("Sync failed. Please rename some of your notes.", "error");
					} else if(tid && !error) {
						printMessage("Sync completed.", "", true);
					} else {
						error = true;
						printMessage("Unable to fully sync at current time.", "warning");
					}
				}
				syncStatus();
			};
			var currentNote = $(".note_title").val();
			dirty.each(function(tid) {
				if(tid.title !== currentNote) {
					synced += 1;
					validateNote(tid, function(newtid, isValid) {
						if(isValid) {
							store.save(newtid, giveFeedback);
						} else {
							invalid.push(newtid);
							giveFeedback(false);
						}
					});
				} else {
					giveFeedback(false);
				}
			});
		});
		var currentUrl = decodeURIComponent(window.location.hash);
		var match = currentUrl.match(/tiddler\/([^\/]*)$/);
		if(match && match[1]) {
			var matchbag = currentUrl.match(/bags\/([^\/]*)\//);
			var noteBag = matchbag && matchbag[1] ? matchbag[1] : undefined;
			if(currentUrl.indexOf("quickedit/") > -1) {
				$("#newnote").addClass("quickedit");
			}
			loadServerNote(match[1], noteBag);
		} else {
			if(tiddlers[0]) {
				note = tiddlers[0];
				loadNote();
			} else {
				newNote();
			}
			$(container).addClass("ready");
		}
	}

	// this stores the note locally (but not on the server)
	function isEmpty(note) {
		var emptyText = !note.text ? true : false;
		var noTitle = note.fields && note.fields._title_set ? false : true;
		return noTitle && emptyText ? true: false;
	}

	function storeNote() {
		note.fields._modified = new Date();
		if(!isEmpty(note)) {
			store.add(note);
		}
		syncStatus();
	}

	function renameNote(newtitle) {
		var old = note.title;
		if(newtitle !== old && !isEmpty(note)) {
			note.title = newtitle;
			store.add(note);
			store.remove(new tiddlyweb.Tiddler(old, bag));
		}
	}

	/* the callback is passed true if the title is unique on the server,
	false if the title already exists and null if it is not known */
	function validateNote(tiddler, callback) {
		var tid = new tiddlyweb.Tiddler(tiddler.title, bag);
		if(RESERVED_TITLES.indexOf(tiddler.title) > -1) {
			callback(tiddler, false, true);
		} else if(tiddler.fields._title_validated) {
			callback(tiddler, true);
		} else {
			tid.get(function() {
				callback(tiddler, false);
			}, function(xhr) {
				if(xhr.status == 404) {
					tiddler.fields._title_validated = "yes";
					callback(tiddler, true);
				} else {
					callback(tiddler, null, null, xhr);
				}
			});
		}
	}

	var renaming;
	function validateCurrentNoteTitle(title, callback) {
		callback = callback || function() {};
		var fixTitle = function() {
			if(renaming) {
				printMessage("Note title set.", "", true);
				renaming = false;
			}
			$(".note_title").attr("disabled", true);
		};

		validateNote(note, function(tiddler, valid, reserved, xhr) {
			//note = tiddler;
			if(valid) {
				fixTitle();
			} else if(valid === false) {
				renaming = true;
				var msg = reserved ? "This name is reserved and cannot be used. Please provide another."
					: "A note with this name already exists. Please provide another name."
				printMessage(msg, "error");
			}
			callback(valid, xhr);
		});
	}

	$(document).ready(function() {
	autoResize($("textarea.note_title")[0], { buffer: 0 });
	autoResize($(".note_text")[0], { minHeight: 250 });

	// on a blur event fix the title.
	$(".note_title").blur(function(ev){
		var val = $(ev.target).val();
		var trimmed = $.trim(val);
		if(trimmed.length > 0) {
			note.fields._title_set = "yes";
			renameNote(trimmed);
			storeNote();
		} else {
			delete note.fields._title_set;
			renameNote(getTitle());
		}
	}).keydown(function(ev) {
		if(ev.keyCode === 13) {
			ev.preventDefault();
		}
	});
	});

	function removeTag(tag) {
		var tags = note.tags || [];
		var newtags = [];
		for(var i = 0; i < tags.length; i++) {
			if(tags[i] !== tag) {
				newtags.push(tags[i]);
			}
		}
		note.tags = newtags;
		printMetaData(note);
	}
	function addTagToCurrentNote(tag) {
		var tags = note.tags || [];
		tag = tag.toLowerCase();
		if(tags.indexOf(tag) === -1) {
			tags.push(tag);
		}
		note.tags = tags;
		printMetaData(note);
	}
	function findTags(note) {
		var tags = note.text.match(/#([^ \n#]+)/gi);
		var unique = [];
		for(var i = 0; i < tags.length; i++) {
			var tag = tags[i].substr(1);
			if(unique.indexOf(tag) === -1) {
				unique.push(tag);
			}
		}
		return unique;
	}
	function addTags() {
		var newtags = findTags(note);
		for(var i = 0; i < newtags.length; i++) {
			addTagToCurrentNote(newtags[i]);
		}
	}
	// every key press triggers a 'local' save
	var tag = [];
	var tagHandler = function(key) {
		if(key === 8) {
			tag.pop();
		} else if(key === 32 || key === 13) { // space or new line terminates tag
			if(tag.length > 1) {
				addTags();
			}
			tag = [];
		} else if(key === 35) { // hash symbol
			if(tag.length > 1) {
				addTags();
				tag = ["#"];
			} else {
				tag = ["#"];
			}
		} else if(tag.length > 0) {
			tag.push(String.fromCharCode(key));
		}
	};

	$(".note_text").keydown(function(ev) {
		note.text = $(ev.target).val();
		if(ev.keyCode === 8) {
			tagHandler(ev.keyCode);
		}
		storeNote();
	}).keypress(function(ev) {
		note.text = $(ev.target).val();
		tagHandler(ev.keyCode);
	}).keyup(function(ev) {
		note.text = $(ev.target).val();
		storeNote();
	}).blur(function(ev) {
		if(tag.length > 0) {
			addTags();
		}
		tag = [];
	}).click(function(ev) {
		tag = [];
	}).focus(function(ev) {
		tag = [];
	});

	function resetNote() {
		$("#note").removeClass("active");
		$(".note_title, .note_text").val("").attr("disabled", false);

		// reset url
		window.location.hash = "";
		newNote();
		syncStatus();
	}

	// on clicking the "clear" button provide a blank note
	$("#newnote").click(function(ev) {
		printMessage("Saving note...");
		var quickedit = $(ev.target).hasClass("quickedit");

		validateCurrentNoteTitle(note.title, function(valid, xhr) {
			if(valid) {
				store.save(note, function(tid, options) {
					if(tid) {
						notabene.addRecentChange(tid.bag.name, note.title);
						$("#note").addClass("active");
						if(quickedit) { // if quick edit has been signalled
							window.location = "/" + encodeURIComponent(note.title);
						} else {
							printMessage("Saved successfully.", null, true);
						}
						resetNote();
					} else {
						// TODO: give more useful error messages (currently options doesn't provide this)
						if(xhr && xhr.status === 403) {
							printMessage("You are not logged into takenote." +
								"Please <a href='/challenge'>login</a> to post notes to the web.", "warning");
						} else {
							printMessage("Saved locally. Unable to post to web at current time.", "warning");
						}
						resetNote();
					}
				});
			} else if(valid == null) {
				printMessage("Saved locally. Unable to post to web at current time.", "warning");
				resetNote();
			}
		});
	});

	//tie delete button to delete event
	$("#deletenote").click(function(ev) {
		var ok = confirm("Delete this note?");
		if(!ok) {
			return;
		}
		printMessage("Deleting note...");
		if(note) {
			var _server = note.fields._title_validated ? true : false;
			store.remove({ tiddler: note, server: _server }, function(tid, msg, xhr) {
				syncStatus();
				if(xhr && xhr.status === 0) {
					printMessage("Could not delete from server at current time.", "warning", true);
					storeNote();
					resetNote();
				} else if(tid) {
					$("#note").addClass("deleting");
					printMessage("Note deleted.", null, true);
					$("#note").removeClass("deleting");
					$(".note_title, .note_text").val("").attr("disabled", false);
					resetNote();
				} else {
					printMessage("Error deleting note. Please try again.", "error");
				}
			}); // TODO: ideally I would like to call store.removeTiddler(note) and not worry about syncing
		}
	});
	$("#cancelnote").click(function(ev) {
		var ok = confirm("Cancel editing this note and revert to previous online version?");
		if(ok) {
			store.remove(note.title);
			resetNote();
		}
	});
	init();
	return {
		init: init,
		resetNote: resetNote,
		findTags: findTags,
		tagHandler: tagHandler,
		printMessage: printMessage,
		newNote: newNote,
		loadNote: loadNote,
		addTag: addTagToCurrentNote,
		removeTag: removeTag,
		store: store,
		printMetaData: printMetaData,
		validateCurrentNoteTitle: validateCurrentNoteTitle,
		getNote: function() {
			return note;
		},
		tempTitle: tempTitle,
		loadServerNote: loadServerNote
	};
}

function backstage() {
	var internet, _checking, initialised;
	function checkConnection() {
		if(_checking) {
			return;
		} else {
			_checking = true;
			$.ajax({ url: "/status",
				success: function(status) {
					internet = true;
					_checking = false;
					$("body").addClass("online");
					if(!initialised) {
						initialised = true;
					}
				},
				error: function() {
					internet = false;
					_checking = false;
					$("body").removeClass("online");
				}
			});
		}
	}
	checkConnection();
	window.setInterval(checkConnection, 60000);
}

function renderIncomplete(store, bagname) {
	var tiddlers = store().dirty().sort(function(a, b) {
		return a.title < b.title ? -1 : 1;
	});
	var listIncomplete = $("#incomplete").empty()[0];
	if(listIncomplete) {
		for(var i = 0; i < tiddlers.length; i++) {
			var item = $("<li />").appendTo(listIncomplete)[0];
			var title = tiddlers[i].title;
			$("<a />").attr("href", APP_PATH + "#!/tiddler/" + title).
				text(title).appendTo(item);
		}
		if(tiddlers.length === 0) {
			$("<li />").text("None.").appendTo(listIncomplete)[0];
		}
	}
}

function dashboard(container, options) {
	notes(container, options);

	var list = $("#recentnotes");

	if(list.length > 0) {
		var sortRecent = function(a, b) {
			var title1 = typeof(a) === "string" ? a : a.title;
			var title2 = typeof(b) === "string" ? b : b.title;
			return title1 < title2 ? -1 : 1;
		};
		var recent = options.space ? notabene.getRecentChanges(options.space + "_private").
			concat(notabene.getRecentChanges(options.space + "_public")) :
			notabene.getRecentChanges(options.bag);
		function printRecentItems(recent) {
			if(recent.length === 0) {
				$("<li />").text("No recently created notes.").appendTo(list)[0];
			}
			for(var i = 0; i < recent.length; i++) {
				var li = $("<li />").appendTo(list)[0];
				var tid = recent[i];
				if(typeof(tid) === "string") {
					tid = { title: tid };
				}
				var bag = tid.bag || options.bag;
				$("<a />").attr("href",
					"/bags/" + bag + "/tiddlers/" + encodeURIComponent(tid.title)).
					text(tid.title).appendTo(li);
			}
		}
		printRecentItems(recent.sort(sortRecent));
	}

	var throbspeed = 500;
	var throb = window.setInterval(function() {
		var searching = $(".searching");
		if(searching.length > 0) {
			var opacity = searching.css("opacity");
			opacity = opacity ? parseFloat(opacity, 10) : 1;
			if(opacity > 0.7) {
				searching.animate({ opacity: 0.6 }, throbspeed)
			} else {
				searching.animate({ opacity: 1 }, throbspeed)
			}
		}
	}, throbspeed);

	var terms = {}, all_note_titles = [];
	// preload titles
	$.ajax({
		dataType: "text",
		url: "/bags/" + options.bag + "/tiddlers?select=tag:!excludeLists",
		success: function(r) {
			all_note_titles = r.split("\n");
		}
	});

	function matchNotes(term, exclude) {
		term = term.toLowerCase();
		var results = [];
		for(var i = 0; i < all_note_titles.length; i++) {
			var title = all_note_titles[i];
			if(title.toLowerCase().indexOf(term) > -1 && exclude.indexOf(title) === -1) {
				results.push({ value: title, label: title, bag: options.bag });
			}
		}
		return results;
	}

	// allow user to search for a tiddler
	$(".findnote").autocomplete({
		source: function(req, response) {
			var el = $(this.element);
			el.addClass("searching");
			var term = req.term;
			if(terms[term]) {
				return response(terms[term]);
			}
			response(matchNotes(term, []));
			$.ajax({
				url: "/search?q=bag:" + options.bag + " \"" + term + " \"&select=tag:!excludeLists",
				dataType: "json",
				success: function(r) {
					el.removeClass("searching").css({ opacity: 1 });
					var data = [];
					var exclude = [];
					for(var i = 0; i < r.length; i++) {
						var tiddler = r[i];
						var bag = tiddler.bag;
						var space = bag.split("_");
						var spacename = space[0];
						var spacetype = space[1];
						var type = tiddler.type;
						exclude.push(tiddler.title);
						if(!type) { // only push "tiddlers" without a type
							data.push({ value: tiddler.title, label: tiddler.title, bag: tiddler.bag })
						}
					}
					data = data.concat(matchNotes(term, exclude));
					if(data.length === 0) {
						data.push({ label: "No notes found" });
					}
					terms[term] = data;
					response(data);
				},
				error: function() {
					var data = [];
					data.concat(matchNotes(term, []));
					if(data.length === 0) {
						data.push({ label: "Unable to search at current time" });
					}
					el.removeClass("searching").css({ opacity: 1 });
					response(data);
				}
			});
		},
		select: function(event, ui) {
			if(ui.item.value && ui.item.bag) {
				window.location = "/bags/" + ui.item.bag + "/tiddlers/" + encodeURIComponent(ui.item.value);
			}
		}
	});

	// TODO: refactor - some of this code is a repeat of that in the notes function
	var instance = setup_store(options);
	renderIncomplete(instance.store, instance.bag.name);
}

// show bookmark bubble if supported
window.addEventListener('load', function() {
	window.setTimeout(function() {
		var bubble = new google.bookmarkbubble.Bubble();

		var BUBBLE_STORAGE_KEY = 'bubble';

		bubble.setHashParameter = function() {
			localStorage.setItem(BUBBLE_STORAGE_KEY, "yes");
		};

		bubble.hasHashParameter = function() {
			return localStorage.getItem(BUBBLE_STORAGE_KEY) ? true : false;
		};

		bubble.getViewportHeight = function() {
			return window.innerHeight;
		};

		bubble.getViewportScrollY = function() {
			return window.pageYOffset;
		};

		bubble.registerScrollHandler = function(handler) {
			window.addEventListener('scroll', handler, false);
		};

		bubble.deregisterScrollHandler = function(handler) {
			window.removeEventListener('scroll', handler, false);
		};

		bubble.showIfAllowed();
	}, 1000);
}, false);

addEventListener("load", function() {
	setTimeout(hideURLbar, 0);
}, false);

function hideURLbar() {
	window.scrollTo(0, 1);
}
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
User-agent: *
Disallow: /bags
Disallow: /recipes
<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="30" height="30"><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path class="glyph" 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>
<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>
Once you have some content then you may choose to determine a tiddler, or set of tiddlers to display each time you load ~TiddlySpace. This is determined by the [[DefaultTiddlers]].
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
A [[SiteIcon|SiteIcon tiddler]]@glossary helps provide some identity to your space.  Ideally it'd be a square and a minimum of 48*48 pixels size.  You can upload your site icon using the uploader below.

<<binaryUploadPublic title:SiteIcon>>
The title and subtitle of your space are visible to visitors and are also displayed in your browser's tabs. Click on the SiteTitle and SiteSubtitle tiddler links below to make changes.
* [[SiteTitle]]
* [[SiteSubtitle]]
<!DOCTYPE html>
<html manifest="/manifest.mf">
	<head>
		<title>takenote</title>
		<link rel="stylesheet" href="/notabene.css" />
		<link rel="apple-touch-icon" href="/touchicon_takenote.png"/>
		<link rel="apple-touch-icon-precomposed" href="/touchicon_takenote.png"/>
		<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=0,initial-scale=1.0">
	</head>
	<body>
		<ul id="backstage">
			<!-- no not add a newline between li elements or you will get a margin with inline blocks -->
			<li><a href="/dashboard">dashboard</a></li><li><a href="/takenote">takenote</a></li>
			<li><a class='connectionStatus'></a></li>
		</ul>
		<div class="takenotecontainer">
			<div class='messageArea'></div>
			<div id="note">
				<div class="toolbar">
					<a id="cancelnote" title="cancel this note">cancel</a>
					<a id="deletenote" title="delete this note">delete</a>
					<a id="newnote" title="complete this note">complete</a>
				</div>
				<div class="note_title_container">
					<textarea class="note_title" placeholder="Note Title"></textarea>
				</div>
				<div id="notebody">
					<span class="notedate"></span> 
					<textarea class="note_text" placeholder="Write here..."></textarea>
				</div>
				<div id="tips">
				<div>Tips for cleverer notes:
				''<span class="boldTip">bold</span>'' //<span class="italicTip">italic</span>// _<span class="underlineTip">underline</span>_ #tag</div>
				<div>[[<a href="http://tiddlyspace.com">Link Name</a>|http://tiddlyspace.com]]
				[[<a href="/Note title">Note title</a>]] <span class="imageTip">[img[/SiteIcon<img src="/SiteIcon" />]]</span></div>
				</div>
				<div id="notemeta"></div>
				<div style="display:none">
				  <a class="syncButton"></a>
				</div>
			</div>
		</div>
		<noscript>
			Takenote requires javascript to work correctly. Sorry!
		</noscript>
		<script src="/bags/common/tiddlers/backstage.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/bookmark_bubble.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/chrjs-store.js" type="text/javascript" charset="utf-8"></script>
		<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
		<script src="/notabene.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			var takenote, space = window.location.hostname.split(".")[0];
			takenote = notes($(".takenotecontainer")[0], {
				bag: space + "_public",
				host: "/"
			});
		</script>
	</body>
</html>
Type the text for 'New Tiddler'
<html>
<head></head>
<body>
<img src='/SiteIcon' />
Welcome to the Robson family tree.
The following links may be helpful.
<ul>
<li><a href="http://robsontree.tiddlyspace.com/bags/robsontree_public/tiddlers">list of members of the Robson family tree</a></li>
<li><a href="http://robsontree.tiddlyspace.com/recipes/robsontree_public/tiddlers">a wiki to explore the tree (note this will take time to load)</a></li>
</ul>

<script type='text/javascript' src='http://tiddlyspace.com/bags/console/tiddlers/jquery.min.js'></script> 
</body>
</html>
iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAHTklEQVR4Ae2dT0gVXRTAx0+pBLEwTEGolQZRCoJLo1wZLnQTRK5UQg0SIVy5kDbuahWWWrkRC3Ih4kIEaaEl4soWtamFJVKChRjk3/x+MnK7zbz5997MvDvz3iweZ+7cue+cn3fuPfecN9ecw8NDzfo4ODhYWFiYnJxcXFz8/v37t2/fdnZ2zp07V1JSUlFR0dDQcOPGjTNnzlg3EK8rwEp4bG5u9vX1nT171t7cvLy8xsbG5eXlhI3ErFAz2/Pnz5+HDx86YpIh5uTk3Lp1a3V11dxanEqMsLa2tugpMgj3cmlp6bt37+JEx2DLP7C+fPly5coV93TMNU+ePDkxMWH4jtic/oVFn0qRFOxoYX19PTZ0DIYcw2KcSvrpE/0r3qQAdwyLEV3YnJwQe1LHsPASPM19ZpqZQApY/2H5o0ePNjY2zAhclkBqdna2uLjYZf0IV9vf30+lW2VIn9JHem1ubi7pP7UbUkwdd+/eHRgY0L8v0p9aT09PcrBckurs7KR9XPwnT55EmhTKa1evXk0ClidSevsx4KVdvHjRK6wkSMWDl3b69GlPsJImFQNe2qlTp9zDSpFU1Hlp58+fdwnLF1KR5qXV1NS4geUjqejy0pqbmx1h+U5K8Hr69GmE/AltbGzMHlZApKLIS/v58ydxdCtegZKKHK+jEI1VJCsEUtHidQSL3AzutaFzhUYqQryOg3/kZmRYIZOKCq9jWGSxyM3oSqeFVCR4HcPiYSSLRW4mjaQEr8HBQTX9ib+w0I8slmNuhviUHnXRbQvikwFUTV7/wHL8e4ZASuX+5QFWaKSU5eUWVsik1OTlClZaSCnIyxlWGkmpxssZFrkZXek0fjI/Dg0NOc4/QVc4SrLaH5cvXzYvhuxv8f0qFNrb24eHh31v2VuDbv4aZLHSzgur0t6/nB9DnWaWFxzcwqJqlpcHWFle3mBlOC/PsJTixfyIPqEdycBCOXXGrzB5JQkLXmSxFPEnQuOVPKwM5JUSrEzjlSqsjOLlA6zM4eUPLKV4PXv2DH2COHyDhXLqzI8B8fITFrzIyijiTwTBy2dY8eblP6wY8woEVlx5BQUrlrwChKUUr+fPn6NPikewsFBOnfkxdV6Bw4IXWSxF/IkUeYUBKza8QoIVD17hwYoBr1BhKcXrxYsX6OPpCBsWyiky3ufn5//48UN1WOrw4k36CMBCRbIMYfoTbA5w+/ZtnD46lPgxSHl5OT+ocs8rDY+hUC4cXtXV1byftLu7q39vS0uLgIUwMzMj9HEU0gkL5QLlxTtJDx48YC8GmcLS0pIMq6mpSb5qL6cZVqC8rPZHkF+xzM3NZW8ne0biavphBcQLIuzBJ+yUhZGREblz9fb2yldtZCVgoZ/vzyNbEVmZ/fv376KiIsGL/QvFiGZ1i16uCizfeU1NTdlYfv/+fQEL4eXLlzaVxSWFYKETWQa//Inp6WlhpFn49OmT/EW1tbXmOuYStWChn1+8HN/+qa+vlzvX+/fvzXQMJZYv/MoNhSm3tbXxdXfu3EFRT9/LiM5bk2yAgsewsrLy9etX+9v5yTq9T9Rh6uR3VOI0sWCAp8ipp/4FHUy1mvusLKL+hQsXBJSCggI2XbOqrJcr9xgKdd3zwvMUd3kS+vv7BSyEx48f29+uLiz0dsOL1YzBR7c3WL7KBsgnTpwQvC5duiRfNctKw0JdR16jo6Nmq9yXsLoWsBDevHljc6/qsFCdLIM8zcu2sQEfG2PbmOd4aX5+Xm7w5s2bNrdEAJYNL6Y/G9tcXqqsrBS8mCvW1tasbnR+0Uk0lEahtbU14fN47dq11LWSX3tj+GPhZdmmFUUFy83PI5E84lNEXVLR9tevX4WFhQJQWVnZ3t5ewgaj8RgK1c28dCPxSIklsEIWNT0J9+7dE7AQxsfHE94eMVjYYMULI4klsEJm3ZfQVJvCDx8+yLDq6uoSVo4eLMwgiyWH0mU7kZk6WffxryQ8+fTXr1+X2/n48aOZVyRhYQZZLHIzZBxkCw0yqxl8dDxPs9nmktevX8u3d3V1metEFZZuCbkZMg7E0YkOy6bKMj46nif+lNl4uYT4n7yxJjIDv1wBOdqwhDHE0YkOE/OUMRlk/Cl+T21GoDfS3d1tqG8O8sQElm4wvYOYJ5E8g9nyKV4Ccx8jugCNYCbFLVVVVXId5FjBErYRyevo6CDqImMyyIzojFPwTUhKr/z27VvRZmxh6RYSnyLqQizBgEk+lccpuVyX2WozU2AJO4klsEJm3WfGYV/C5CDvkRXPx1BgkgVWyIQJWc3YAzJcxfkQjWQQLN1m1n2sZvDRDVCsTnHWhHObcbBEN8FHx/O0H7N0giwG9LsyF5ZuP24X/hReglXPopzFUxaW6GRHAl4Cc58ckhf4WGzqi/NM71n/ADs8ZO5jRJdTZDoyghnUzMIy4Do6ZURnnOLpE7F/gj8Ey3KOgGUPCwKfP38mTU1YkSAHn1lYFpyk4u3t7VevXhG8/h/x+YTd3b0e1AAAAABJRU5ErkJggg==
/***
|''Name''|tsScanCountPlugin|
|''Description''|Provides ability to count tiddlers at a given tiddlyspace url and display a button that when clicked lists them. Also upgrades tsScan to replace any options containing with $1 with the current space|
|''Version''|0.2.0|
***/
//{{{
(function($) {

var tsScan = config.macros.tsScan;
var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.tsScanCount = {
	cache: true,
	countCache: {},
	handler: function(place, macroName, params, w, paramString, tiddler) {
		var container = $("<a href='#' class='button' />").attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
		$(container).data("params", paramString);
		macro.refresh(container);
	},
	refresh: function(container) {
		var paramString = $(container).data("params");
		var options = tsScan.getOptions(paramString, tiddler);
		var url = options.url;
		options.cache = macro.cache;
		options.callback = function(tiddlers) {
				options.cache = true;
				macro.cache = true;
				var count = tiddlers[0] ? tiddlers[0].fields['server.page.revision'] : 0;
				var lastCount = macro.countCache[url] || 0;
				if(lastCount != count) {
					var interval, step = 0;
					interval = window.setInterval(function() {
						var last = step;
						step += 1;
						$(container).removeClass("step" + last);
						if(step > 10) {
							macro.countCache[url] = count;
							window.clearInterval(interval);
						} else {
							$(container).addClass("step" + step);
						}
					}, 500)
				}
				$(container).empty().addClass("enabled").text(tiddlers.length).click(function(ev) {
				$(ev.target).addClass("active");
				var target = options.popupSelector ? $(options.popupSelector)[0] : ev.target;
				var p = Popup.create(target, "div");
				var container;
				if(options.heading) {
					container = $("<div />").addClass("heading").appendTo(p)[0];
					wikify(store.getTiddlerText(options.heading) || "", container);
				}
				container = $("<div />").addClass("followTiddlersList").appendTo(p)[0];
				tsScan.scan(container, options);
				Popup.show();
				ev.stopPropagation();
				return false;
			});
		};
		tsScan.scan(container, options);
	}
}

var _getOptions = tsScan.getOptions;
config.macros.tsScan.getOptions = function(paramString, tiddler) {
	var options = _getOptions.apply(this, arguments);
	var optionsClone = {};
	for(var i in options) {
		if(typeof(options[i]) == "string") {
			optionsClone[i] = options[i].format(tiddlyspace.currentSpace.name);
		} else {
			optionsClone[i] = options[i];
		}
	}
	return optionsClone;
}

// every 5 minutes make tsScan update.
window.setInterval(function() {
	macro.cache = false;
	$("[macroName=tsScanCount]").each(function(i, el) {
		macro.refresh(el);
	});
}, 1000 * 60 * 5);
})(jQuery);
//}}}
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CcCcWX7KSifHZp/X5bjIpRaGsWSyZCyZmHG0i/vsBsmuX2z96oRQNOHEoUr1OSAD0N7ZNT0wEOt6boxd0NQ4dZEe8NsWzA1xuTKrykdFuR0uy2nDSzSjWPKxS/tNAH5k663twDNg79ILvYV9OdX/DumhdgCqF4QcqHyyYnk5DXXFVFZMuuFyZNnYhAUW89l/7pHvbDhZEBhAdxs7kAwAfNLZRSI5OZsBIE3iXTsB0DSFJQ2FS9J/7L+Ttne+xfUrK6fsU1zsZt7cAAAB8fn8l3ZtvGla4ObNGwekkA8ApAyDo20fkk5PDnOJc38lk+gBoKGuGF2fOqWPxtIsvfFFwrXP8+rrpwtOrCknJCpCeWJaYIDHtmx4XiCeADvzHTv+EWZObpeWQfy0fQjweV3U1hQVhHjnyHlOtA8wPGLw4suF94bP62JRVt+al/94+x3TAgM8umXdgyBfAtufD7971Ikc5uAJZNq+XlrcUIKqFL5ou/Wm2dxy0yzmzPZz39bFBfuCvWJO4snI9bltU17nSJAtprLVcEkv8LV4IsGR94/RsKiGSjW7Gf2+6W+EvF4XB/9217T9xkXTFHRNIZnKIATzZgQM0LxtXVLAHQ/vbn0YKVssy1LbO7s45xbUoQAWxz6IUL0whK5fu79L+vsTJFO2C4qxomxcZnyhveOFAxssIZ4H5gNUi9cp5cQ1g5xCzohM+vq77n3TOUfN2CyPbN1wQHdH6oSU3wPOdsuN9Mi1pAl8EaASOCIVuSkXFq70T5m9e3UjVXEvyDsF1q06Q0Fh1/+FJK2SOuiRA69VqUda3SIyRYAHN+7Iprv3RfK1XRFwrrS0trpSZzM3IJRbBLISIYJIAgipC5QzlrA6sUSn5cm0TXe7PhO5auD/tvwHQhyDgtGxXlsAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAAB4AAATiCAYAAACtL1PTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGODdGMTE3NDA3MjA2ODExOEY2MkMyQTZBMzNBRTY4MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0QURGRDg5MjA1OUExMUUyQTU0Qzg5RTFFQzJDMjZGNiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0QURGRDg5MTA1OUExMUUyQTU0Qzg5RTFFQzJDMjZGNiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkY3N0YxMTc0MDcyMDY4MTFBQ0U2REU3M0E1OEQxQ0UyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY4N0YxMTc0MDcyMDY4MTE4RjYyQzJBNkEzM0FFNjgwIi8+IDwvcmRmOkRlc2NyaXB0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J1N91dhe8+X3+hjrguCGj7P1uYsklvmCcTdgpBTxEZBefW6Fie4u+ZiJcpkDPhoXaveohcblfhOt1zPFV6seZdLv9ItcJXLWYw6pfvyY7k58GOdvEvs10LLf0L1xo8R01zDWasIl6kiM28tdjdZjW9c2MJFDJmHCjeDegtvucQnjJHGkPsawOM56vFOxbh81tqf4dmqE+QuE806ECRMmTJgwYcKECRMmfPDCB0XaGPksrFf9R4mPTLTM+1zfuxroUhNl9zaZaGVn/FP+a4nv+4RxzTTuh4sFla+SWCRxnn7FmxnrC56tKYeuxOv3mCiPPd0XjERpT8rrcWpi9CHTndoKbHO9+fQaTsHgxb5qjImQqXoc39DnR2h3svNcy1IaX1MwbkxgJ9aSpdNqgF1DvnERJnzowejHp5oDy9hN0rNRPIDgxBEvgL/ZNYxfGi/StyFUjZkoJ0yYMGHChAkTJkyYMGHC6f+mGjNzZnO/ZfVq7zWeZkreH9UFDBT33lzjAq+VRJFWPM4FXgTutNC4AF9umliYpFYAXW4GLzCDxAzmLgZ8wFkoruPERMlrPnZ1Hnq+cZCxr7UCTYODoBF8YNQKhto1jlOI/SFQG37GRNN4aK09vtEYxicGMLf4vIVv84nG8Bwdgdot/FSfaHxavERHIHzo5kUF+43nAniJDn89zZ5jq8DBC/PVhAkTJkyYMGHChAkTJkyYsPx/fPaysyr/8Opvrm+qxo9LXGmK3dIQ21ytP9NUQSoCqT1cxv5zcyABg+ixsLkauPI8/tB708cYibTjJWaYaNnoOyX+aaL04nJ9jOe26DbHm+JLABRqXEgz3WKihfBn6HP9+hjPzTcOc19ZF3YDwO0udxmPKUUOIIS9wUgXTyvxM9NMxRsbJGEMuGsk3pP4sUm/zQM+C/OQbrNGf6bpfoyU8U0mSpgjd71Kh0UsqYQ89u0m+gzFSh1gVmj/djKA4Bc9rTFax+TLFb5fsV6Xxzht5MKbeE7D3/mY+WrChAkTJkyYMGHChAkTJkyYcLjyfwEGAKAIIg/ZEa18AAAAAElFTkSuQmCC
/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAyAAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgTWFjaW50b3NoIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc0RjUxRUQxRkQwNTExRTA4NEU2QjgyNkUwMzgxMjVEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc0RjUxRUQyRkQwNTExRTA4NEU2QjgyNkUwMzgxMjVEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzRGNTFFQ0ZGRDA1MTFFMDg0RTZCODI2RTAzODEyNUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzRGNTFFRDBGRDA1MTFFMDg0RTZCODI2RTAzODEyNUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAIBgYGBgYIBgYIDAgHCAwOCggI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
// settings
config.options.chkBackstage = false;
readOnly = true;
/*{{{*/
// this needs to be called after TiddlySpaceInit, otherwise the click handler ends up not working, so the file has 'x' appended to it
// disabled 12/12/11 and brought into app.js
config.options.chkBackstage = false;
jQuery(document).bind("startup", function() {
	//jQuery('#backstageButton').empty();
	jQuery('#statusPanel a.advanced').live("click", function(e) {
		e.preventDefault();
		backstage.isVisible() ? backstage.hide() : backstage.show();
		return true;
	});
});
/*}}}*/

/*{{{*/
/*
v2 - Dec 2011

Summary:
It turns out that syncing via a queue is more complicated than it appears at first glance. The unexpected problem comes from the choice of where in the AJAX function stack you choose to intercept and queue; the problem itself is with AJAX callback functions. This is down to the nature of JavaScript functions - references from functions to properties sitting outside the function (and closures) mean that a round-trip stringification and re-evaluation of a function does not necessarily give you back what you started with. Couple this with local storage that only stores strings, and you have the problem: storage does not store function state. In this implementation, I chose to intercept at $.ajax, which is several levels down the call stack from where the AJAX journey starts - this means the callbacks that are expected to be called on a successful or failed AJAX request have to be re-created in this plugin. An alternative implementation could intercept at a different level in the stack - it is tempting to experiment with intercepting at the very first function call in the AJAX journey, effectively just storing the new data, before the asynchronous dance of functions and callbacks has begun.

TO-DO:
- showing the stored changes when you reload a manual and view an unsynced tiddler (at the moment, it just shows you whatever the manual contains)
- putting the notification messages into tiddlers
- handle what happens if the storage gets full up (5MB on pretty much everything except IE6&7, which have 128kB. 128kB is about 64 pages of text) - I suggest we alert people when they are getting close to their limit of offline changes... this needs looking into
- make it so that if sync is called while a sync is ongoing, don't sync again (or if you let multiple syncs happen, make sure things don't get messed up) (and if there is a pending fade, that this is cancelled)

Procedure:
- hijack $.ajax and store the resource in a queue
- the queue is incrementally synced
- no functions are stored, so callbacks have to be provided by binding to the sync events

Requires:
- jQuery
- jQuery-JSON
- jStorage

tests for flow - PUT only

- override $.ajax

app logic
- given a save, it should add the resource to the unsynced queue and trigger a sync
-- override ServerSideSavingPlugin.reportSuccess and reportFailure so they don't show messages
- given a syncStart event, it should show a status bar and any unsynced list
- given a syncFail event, it should show an error message and show the list of unsynced things
- if offline, it should show an offline notification
- if online, it should trigger another sync attempt
-- if determining offlineness is not implemented, can just wait for manual syncs
- given a syncSuccess event, refresh the unsynced list to clear the synced resource
- given a syncComplete event, show a success message

SYNC module
- on load, it should check the unsynced list; if there is something in it, it should trigger a syncFail event
- sync:
- given a sync trigger, it should attempt to sync the first element in the sync queue
- it should fire a syncStart event when starting syncing
- on fail, it should fire a syncFail event
- on success, it should fire a syncSuccess event; if there are more resources to sync, it should trigger another sync attempt; if not, it should fire a syncComplete event
- getUnsynced: it should return the unsynced list

*/
(function($) {

	var SyncPlugin = function() {
			var plugin = this,
				_ajax = $.ajax;
			plugin.addToQueue = function(options) {
				// storage doesn't store functions, so remove them
				$.each(options, function(key, value) {
					if(typeof value==="function") {
						delete options[key];
					}
				});
				$.jStorage.set(options.url,options);
				//console.log('addToQueue',options);
			};
			plugin.getUnsynced = function() {
				return $.jStorage.index() || [];
			};
			plugin.getFromQueue = function(key) {
				var item = $.jStorage.get(key);
				item.success = function() {
					//console.log('put success',arguments);
					$(document).trigger("syncSuccess", [item]);
					$.jStorage.deleteKey(item.url);
					if(plugin.nextUnsynced()) {
						plugin.sync();
					} else {
						$(document).trigger("syncComplete");
					}
				};
				item.error = function(jqXHR, textStatus, errorThrown) {
					$(document).trigger("syncFail",[item ,jqXHR, textStatus, errorThrown]);
					//console.log('put fail',arguments);
				};
				return item;
			};
			plugin.clearStorage = function() {
				$.jStorage.flush();
				return $(document).trigger("syncFlush");
				
			};
			plugin.nextUnsynced = function() {
				var key = plugin.getUnsynced()[0];
				if(key) {
					return plugin.getFromQueue(key);
				}
			};
			plugin.sync = function() {
				var item = plugin.nextUnsynced();
				if(item) {
					//console.log('sync', item);
					$(document).trigger("syncStart",[item]);
					plugin.putItem(item);
				}
			};
			plugin.putItem = function(item) {
				//console.log('PUTing',item);
				return _ajax(item);
			};
			$.ajax = function(options) {
				if(options.type && options.type.toLowerCase()==="put" && options.url.indexOf("/tiddlers/")!==-1) {
					plugin.addToQueue(options);
					plugin.sync();
				} else {
					_ajax.apply(this,arguments);
				}
			};
			return plugin;
		};

	// now for the Tiddly bits and app logic - you would normally have this in a separate file
	var statusMessage = {
		messages: {
			syncing: store.getTiddlerSlice('SyncPluginMessages', 'syncing'),
			error: store.getTiddlerSlice('SyncPluginMessages', 'error'),
			flush: store.getTiddlerSlice('SyncPluginMessages', 'flush'),
			complete: store.getTiddlerSlice('SyncPluginMessages', 'complete'),
			unsyncedNote: store.getTiddlerSlice('SyncPluginMessages', 'unsyncedNote')
		},
		// all tiddlers will show the same message box
		getStatusBoxes: function() {
			return $('#syncPanel').show();
		},
		getTiddlerFromURL: function(url) {
			return url && decodeURIComponent(url.substring(url.lastIndexOf('/')+1));
		},
		updateStatusBox: function(status) {
			var $boxes = this.getStatusBoxes();
			//console.log('uSB boxes',$boxes);
			switch(status) {
				case "syncing":
					$boxes.removeClass('error success').addClass('pending')
						.children('h3').text(statusMessage.messages.syncing).end()
						.children('button').hide().end()
						.show();
					this.updateSyncList();
					//console.log('syncing',$boxes.children('h3').text());
					break;
				case "error":
					$boxes.removeClass('pending success').addClass('error')
						.children('h3').text(statusMessage.messages.error).end()
						.children('p').show().end()
						.children('button').show().end()
						.show();
					this.updateSyncList();
					break;
				case "flush":
					$boxes.removeClass("pending error").addClass("success")
						.children('h3').text(statusMessage.messages.flush).end()
						.children('p').hide().end()
						.children('button').hide().end()
						.show();
					this.updateSyncList();
					window.setTimeout(function() {
						$boxes.fadeOut();
					}, 1500);
					break;
				case "complete":
					$boxes.removeClass('pending error').addClass('success')
						.children('h3').text(statusMessage.messages.complete).end()
						.children('p').hide().end()
						.children('button').hide().end()
						.show();
					this.updateSyncList();
					window.setTimeout(function() {
						$boxes.fadeOut();
					}, 3000);
					break;
				default:
					break;
			}
		},
		updateSyncList: function() {
			var unsynced = config.extensions.syncPlugin.getUnsynced(),
				$boxes = this.getStatusBoxes(),
				syncNote = unsynced.length ? statusMessage.messages.unsyncedNote : '',
				unsyncedList = [];
			$(unsynced).each(function() {
				unsyncedList.push("<li>"+statusMessage.getTiddlerFromURL(this)+"</li>");
			});
			unsyncedList = unsyncedList.join("\n");
			//console.log('um',unsyncedList,syncNote,unsynced);
			$boxes.children('p').text(syncNote).end()
				.children('ul').html(unsyncedList);
		},
		syncing: function(tiddler) {
			//console.log('statusMessage.syncing');
			this.updateStatusBox('syncing');
		},
		error: function(tiddler) {
			//console.log('statusMessage.error');
			this.updateStatusBox('error');
		},
		flush: function() {
			this.updateStatusBox('flush');
		},
		complete: function(tiddler) {
			//console.log('statusMessage.complete');
			this.updateStatusBox('complete');
		}
	};
	
	jQuery(document).ready(function() {
		config.extensions.syncPlugin = new SyncPlugin();
		var plugin = config.extensions.syncPlugin,
			sssP = config.extensions.ServerSideSavingPlugin;

		// override SSSP reporting methods so we don't show messages
		sssP.reportSuccess = function() {
			//console.log('reportSuccess',arguments);
		};
		sssP.reportFailure = function() {
			//console.log('reportFailure',arguments);
		};

		$(document).bind("syncStart", function(e, item) {
			//console.log("I am a message about starting sync!",item);
			statusMessage.syncing();
		});
		
		$(document).bind("syncFail", function(e, item, jqXHR, textStatus, errorThrown) {
			statusMessage.error();
			//console.log("I am a message about the sync failing!",item);
			if(!item) {
				return;
			}
			var tiddlerName = statusMessage.getTiddlerFromURL(item.url),
				tiddler = store.getTiddler(tiddlerName),
				error = jqXHR.status;
			if(error == 412) {
				sssP.reportFailure("saveConflict", tiddler);
			} else {
				sssP.reportFailure("saveError", tiddler);
			}
		});
		
		$(document).bind("syncSuccess", function(e, item) {
			//console.log("I am a message about the sync success!",item);
			var url = item.url,
				tiddlerName = decodeURIComponent(url.substring(url.lastIndexOf('/')+1)),
				tiddler = store.getTiddler(tiddlerName);
			// these lines taken from ServerSideSavingPlugin
			tiddler.clearChangeCount(); // cannot check for changes since save was triggered, because the context object is not passed through
			sssP.reportSuccess("saved", tiddler);
			store.setDirty(false);
			// this line taken from TiddlySpaceBackstage
			backstage.tiddlyspace.checkSyncStatus(tiddler);
		});

		$(document).bind("syncComplete", function() {
			statusMessage.complete();
			//console.log("I am a message about the sync completing!");
		});
		
		$(document).bind("syncFlush", function() {
			statusMessage.flush();
		});
		
		$('#syncPanel .affirmative').live('click', function() {
			plugin.sync();
			return false;
		});
		$('#syncPanel .negative').live('click', function() {
			plugin.clearStorage();
			return false;
		});
	});
	
	$(document).bind('startup', function() {
		// on load, check to see if there is anything in storage
		var plugin = config.extensions.syncPlugin;
		if(plugin.nextUnsynced()) {
			$(document).trigger("syncFail");
		}
	});

	/*
	var html = '<div class="statusBoxWrapper">' +
			'<div class="statusBox">' +
				'<strong class="syncTitle"></strong>' +
				'<p class="syncNote"></p>' +
				'<ul class="statusList"></ul>' +
				'<button class="syncButton">Sync Now</button>' +
				'<button class="syncCancelButton">Discard changes</button>' +
			'</div>' +
		'</div>';
	*/
	
}(jQuery));
/*}}}*/