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>
<!--}}}-->
!Manualizing buttons:
''How to create buttons that automatically generate new pages'' that have pre-prepared content, tags, etc.  
Here is a button that will generate a new page for creating new content in but with some pre-defined content and tags, etc:
<<newJournal label:"This is the label on the button" focus:title text:"This is the pre-formed text that will appear in the new page you create" title:"This is the Title of the page that you will create (and which users can edit)" tag:"The page is tagged with this""And also with this""And this too, etc"">>

And just below is the "code" used to create the above button (usually hidden unless you are in [[Edit mode]]), that you easily can [[Edit]] to define different pre-set pages you want to create.  (N.B. change the TEXT, but leave all the punctuation marks and other symbols exactly as they are!):
|bgcolor(lightgray): {{{<<newJournal label:"This is the label on the button" focus:title text:"This is the pre-formed text that will appear in the new page you create" title:"This is the Title of the page that you will create (and which users can edit)" tag:"The page is tagged with this""And also with this""And this too, etc"">>}}} |

!!Some examples in pretty coloured boxes:
|bgcolor(pink): <<newJournal label:"Manage RISK item" focus:title text:"Add your content here. Check you are not duplicating content; search for existing pages with your intended title!" title:"Type brief title here" tag:"Manage RISK""Local Protocols">> |bgcolor(pink): New item about how we manage RISK |
|bgcolor(pink): <<newJournal label:"Manage CLIENT RELATIONSHIP item" focus:title text:"Add your content here. Check you are not duplicating content; search for existing pages with your intended title!" title:"Type brief title here" tag:"Manage CLIENT RELATIONSHIP""Local Protocols">> |bgcolor(pink): New item about managing the relationship |
|bgcolor(pink): <<newJournal label:"Manage CLINICAL PROBLEM item" focus:title text:"Add your content here. Check you are not duplicating content; search for existing pages with your intended title!" title:"Type brief title here" tag:"Manage CLINICAL PROBLEM""Local Protocols">> |bgcolor(pink): New item about face to face "field work" |
|bgcolor(lightgreen): <<newJournal label:"Working with NETWORK item" focus:title text:"Add your content here. Check you are not duplicating content; search for existing pages with your intended title!" title:"Type brief title here" tag:"Working with your NETWORKS""Local Protocols">> |bgcolor(lightgreen): New item about multi-agency or multi-professional working |
|bgcolor(lightblue): <<newJournal label:"Blank Page" focus:title text:"Add your content here. THINK HOW YOU WANT TO TAG THIS PAGE TO LINK IT TO EXISTING CONTENT! Check you are not duplicating content; search for existing pages with your intended title!" title:"Type brief title here" tag:"Local Protocols">> |bgcolor(lightblue): A new blank page (think how you will [[Tag|Tags]] this) |
!@@color(purple):WHERE ARE MY BUTTONS?!@@
>@@color(purple):You must be both [[logged in|Log in]] as a ''MEMBER of this space'', __and__ the manual must be switched to ''EDITING MODE'' (see the [[Mode and Login panel]] top right), in order to see any of the content editing buttons displayed above!@@
>@@color(purple):If you have switched to [[edit mode|Mode and Login panel]] //after this page was already opened//, then you will just need to //close and re-open this page// to reveal the editing buttons.  (Hint, you can use the [[History recorder]] to find this page again!)@@
Type the text for 'new sub-topic'
At the end of module 2 trainees will be able to:

*Comprehend the nature and symptoms of mild depression in children and young people and differentiate from other mental health presentations
*Critically understanding  the research evidence relating to humanistic counselling for mild depression
*Comprehend the theoretical origins of a humanistic counselling approach to treating mild depression in children and young people
*Conceptualise mild depression in children and young people from a humanistic counselling standpoint
*Critically compare a humanistic understanding of mild depression against cognitive-behavioural, interpersonal and psychodynamic understandings
*Understand how, with the humanistic model, emotion is seen as foundational in the construction of the self and is a key determinant of self-organization and the development of depressive symptoms
*Assist children and young people to access their emotions using a range of techniques
*Help children and young people articulate their emotions: finding words for their feeling
*Facilitate children and young people to reflect on emotions and develop new emotional meanings/understandings
*Apply creative methods and resources to help young people express, reflect on, and make sense of their experiences and emotions
*Demonstrate therapeutic flexibility in work with children and young people 
*Work creatively to meet the needs of the full age range of children and young people 
*Understand the use and effects of anti-depressant medication for children and young people
*Use supervision effectively to help monitor and develop humanistic counselling practice for mild depression
*Be able to recognise the limits of a humanistic counselling approach and be able to arrange for appropriate alternative help to be offered
*Comprehend the process of therapeutic work in groups, and with parents and carers

''Learning and teaching strategy''

There will be a minimum of 8 days of study at the institute. This will include workshops, skills classes and other activities. In addition, students will be expected to participate in independent study (including e-learning), supervision and clinical practice. 

There will be an initial self-assessment of prior learning and competency. 

''Assessment strategy''

Evaluation of competences will take the form of a range of methods, but must include assessment of an actual piece of humanistic counselling work with a child or young person with mild depression (preferably video or at the very least audio recorded). Additional assessment may include: 

Evaluation of competences will take the form of a range of methods. This may include: 
•	Written assignments, which may include case studies and/or transcripts 
•	Examined recording of actual clinical practice with a child or young person
•	Observation of skills – recording of clinical practice
•	Supervisor report
•	Clinical portfolio
•	Reflective journal. 

A standardized measure of required competences (the Person-Centred and Experiential Psychotherapy Scale (PCEPS), adapted for children and young people) will be used to aid learning and form a basis for assessment.

''Duration''

The eight days for this module will take place over one term.  Students will be expected to dedicate approximately 115 hours of independent study to successfully complete this module. 

''Module outline (indicative)''

//Topic 1//: Theoretical underpinnings, mild depression in children and young people -- What it is and how it can be assessed.  [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[Core 410-121 Sad, Bored or Isolated|https://www.minded.org.uk/course/view.php?id=81]]
#*[[Specialist 414-004 Depression|https://www.minded.org.uk/course/view.php?id=324]]

//Topic 2//: Humanistic theory of depression -- self-concept and self-discrepancy, models of intervention with depression; alternative perspectives on the aetiology of depression -- e.g., neurobiological, cognitive, systemic.  Evidence for humanistic approaches.  [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[The Evidence for Counselling Children and Young People|https://www.minded.org.uk/course/view.php?id=347]]

//Topic 3//: Emotion theory -- a humanistic perspective, working with emotions in children and young people, emotion regulation. [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[CMD 412-032 Facilitating Emotional Expression with CYP|https://www.minded.org.uk/course/view.php?id=166]]

//Topic 4//: Emotional processes associated with depression; working with emotional processes. [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[CMD 412-033 Working with Emotional Meanings in Counselling with CYP|https://www.minded.org.uk/course/view.php?id=116]]

//Topic 5//: The range of creative methods and resources I; drawing on creative methods and resources in working with mild depression. [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[CMD 412-034 Introducing Creative and Symbolic Methods with CYP|https://www.minded.org.uk/course/view.php?id=135]]
#*[[CMD 412-035 The Range of Creative and Symbolic Methods with CYP|https://www.minded.org.uk/course/view.php?id=230]]

//Topic 6//: The range of creative methods and resources II. [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[CMD 412-036 Creating Methods in Action: Case Study|https://www.minded.org.uk/course/view.php?id=250]]
#*[[Core 410-086 Working with Strong Emotions|https://www.minded.org.uk/course/view.php?id=162]]

//Topic 7//: Working with groups, parents and carers. [[MindEd|https://www.minded.org.uk/]] sessions: 
#*[[Specialist 413-048 Group Work or Individual Work|https://www.minded.org.uk/course/view.php?id=298]]

//Topic 8//: Reflection and integration of learning from the training -- how this will look in practice, using process and outcome feedback to enhance work with depression, holding an overall perspective. 
At the end of the module, trainees will be able to:

•	Understand the principles of cognitive-behavioural interventions with children and young people experiencing anxiety, and how this can be integrated with humanistic counselling principles and practices
•	Understand, and apply, diagnostic classification systems for anxiety in children and young people
•	Understand the phenomenology, aetiology and epidemiological characteristics of anxiety problems in children and young people
•	Assess, in collaboration with a child or young person, whether they are experiencing anxiety at an excessive level
•	Identify the clinical research literature on CBT for anxiety in children and young people (clinical trials and outcome studies)
•	Understand when it is indicated, and when contraindicated, to apply generic CBT anxiety principles
•	Construct, carry out and evaluate exposure exercises and behavioural experiments 
•	Recognise online CBT programmes that can help children and young people address anxiety problems, such as Coping Cat and FRIENDS
•	Assess, in collaboration with the child or young person, the reasons they might have for experiencing anxiety, and to the level that they are experiencing it
•	Assess whether a CBT intervention would be suitable for the child or young person
•	Collaboratively develop a treatment plan for a child or young person who is experiencing generalised anxiety disorder, specific phobia, or separation anxiety
•	Explain the principles and general procedures of CBT for anxiety problems to children and young people
•	Understand the factors relevant to whether and to what extent parents/guardians should be involved in treatment sessions
•	Work with children and young people to elicit and evaluate key cognitions and images in anxiety
•	Provide psychoeducation to children and young people on the nature of anxiety
•	Help children and young people understand the link between anxiety and depression
•	Sensitively adapt CBT for anxiety to ensure equitable access, taking into account the age of the child or young person, and cultural and social differences and values among the children, young people and their parents/guardians
•	Use clinical measurement with specific anxiety disorders to monitor CBT process and outcome
•	Effectively integrate CBT methods for anxiety into their established counselling practice
•	Use supervision effectively to help monitor and develop CBT practice for anxiety
•	Know when it is appropriate to involve the family as a support, and working with the whole family. 

Learning and teaching strategy

There will be 8 days of study at the institute. This will include workshops, skills classes and other activities. In addition, students will be expected to participate in independent study (including e-learning), supervision and clinical practice.

There will be an initial self-assessment of prior learning and competency. 

''Assessment''

Evaluation of competences may take the form of a range of methods, but must include assessment of an actual piece of CBT work/exposure with a child or young person with an anxiety disorder (audio or video recorded). Additional assessment may include: 
•	Written assignments, which may include case studies and/or transcripts 
•	Observation of skills
•	Supervisor report
•	Clinical portfolio
•	Reflective journal.

''Duration''

The eight days for this module will take place over one term.  Students will be expected to dedicate approximately 115 hours of independent study to successfully complete this module. 

''Module outline (indicative)''

//Topic 1//: Basic principles of CBT, CBT understanding of anxiety, how CBT can be integrated within a counselling approach. 

//Topic 2//: Systematic methods for identifying anxiety disorders in children and young people, Identifying and assessing generalised anxiety disorder, specific phobia, and separation anxiety; distinguishing these anxiety problems from other anxiety problems, the appropriateness of a CBT approach for anxiety, developing a treatment plan. 

//Topic 3//: Psychoeducation for anxiety, integrating CBT methods into a counselling practice.

//Topic 4//: Exposure exercises, behavioural experiments in CBT for anxiety. 

//Topic 5//: Evaluating and eliciting key cognitions in anxiety.
/*{{{*/
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;
				};
			}
		}
	}
};
/*}}}*/
Here you will find (as sub-topics in the [[Show references and info]] panel) explanations of the various [[Tabs]] that make up the [[Index]] allowing you to sort and sift the many pages in the manual in different ways
* This is a TiddlyManual
* Information on [[Using the Manual]]
** How to navigate around it easily
** How find content you seek
** How to compare what is in this version, and those of other teams
* This manual contains [[Licensed]] content:
** Information about how content in this manual is released under license to maximise sharing and wide dissemination.
* [[Recent changes]] in the manual (it is designed to adapt and improve, rather than as a static document)
* [[Authors]]
* [[Sponsors]]
* [[Feedback please!]]
* [[List LOCAL EDITS to the manual]] - if this is a LOCAL TEAM's version, check to see their own local edits. 
!What's here?
# The purpose of the page explained
# Groundrules for embedding material
# Link to material on embedding IMAGES
# A video introduction to embedding VIDEO
#Where to store (or "host") material for embedding
!1. Purpose of this page?
Your TiddlyManual is a "multimedia" site - that means there are [[Videos]] and [[Slides]] and [[Audio clips]] embedded in the pages.  We assume this material enriches the content and improves the likelihood that it will influence practice in positive ways.

We want local teams to [[Manualize|Manualization]] their own work - adding documentation of local adaptations, improvements and attunements that will better support their local team to do the work it does.  There is more basic information on how to [[Edit]] these [[Wiki]]s.  The point of //this// page is to show you how to add "the fancy stuff" like video clips, audio clips, pictures, or downloadable documents.  

This is very easy... honest... try it!  

!2. Groundrules:
|bgcolor(red): ''N.B. - NO CONFIDENTIAL CLIENT VIDEO MATERIAL SHOULD EVER BE UPLOADED TO AN ONLINE SOURCE, AND THE STREAMING VIDEO USED IN THE AMBIT MANUAL INVOLVING ~ROLE-PLAYS SHOULD ONLY BE DISPLAYED WITH APROPRIATE CONSENT.  TEAMS ARE RESPONSIBLE FOR THE MATERIAL THAT THEY UPLOAD THEMSELVES, NOT THE AMBIT PROJECT!'' |


!3. EMBEDDING IMAGES
See [[Embedding Images in your TiddlyManual]]

<<image [[New AMBIT WHEEL]] width:100 height:100>> 

!4.Video introducing "how to embed VIDEO":
<html><iframe width="480" height="360" src="http://www.youtube.com/embed/I_5Cqd3gvkA?rel=0" frameborder="0" allowfullscreen></iframe></html>

!5. Understanding how it works
First, this is called a //~Mash-Up// - what is that?!

This is what --geeks-- programmers refer to when a single website actually uses functions and pieces of information that are drawn from different places across the internet - the //mash-up// brings these disparate elements together to produce something quite specific and 'fit-for-purpose'.  [[TiddlyManual]]s work like this.  Video, audio, pictures and documents can all be stored in different online places, but can be accessed through (or "embedded within") the one tiddlymanual.

!6.Where/how to store (or "host") material for embedding?
Where can you upload material online, so that you can embed it and display it in your manual?

Here are a few examples of ''"hosting resources"'' that are in use in the manual - all of them are FREE - you just have to register to set up an account:

!!!(a) Video
We mainly use [[YouTube|http://www.youtube.com/]] but another good hosting site is [[Vimeo|http://vimeo.com/]].   You will need to find the "EMBED" code from the website, and use that pasted into place within this extra bit of code:

|bgcolor(beige): {{{<html>}}}~ADD_YOUR_EMBED_CODE_HERE{{{</html>}}} |

!!!(b) Audio
A good site is [[Soundcloud|http://soundcloud.com]] - you can upload Mp3 tracks (lots of musicians use this site, but it works equally well for the spoken voice) and then "embed" the player for that track in your page (as above).
!!!(c) Pictures
See [[Embedding Images in your TiddlyManual]].  The easiest place to upload to is to TiddlySpace itself.  We also use [[Google Picasa|http://picasaweb.google.com/]]  or [[Flickr|http://www.flickr.com/]] to host pictures (but increasingly the IT red tape in NHS or Social care settings blocks these).
!!!(d) Documents
We use [[Google Docs|http://www.google.com/google-d-s/b1.html]] or the more recent [[Google Drive|https://drive.google.com]].  Annoyingly, some dinosaur organisations (mentioning no names) still block Google Documents via their IT departments - this kind of problem will surely die off eventually... See [[Organisational support for the technology to run TiddlyManuals]] for advice on how to tackle this nuisance.

In Google docs you open the document, look for the "Share" button (top right of the screen) and then select Publish/Embed, and that will offer you a range of options so for slides you can choose to automatically start a slide show running and looping every time the site is accessed, etc (see [[Thinking Together]] for an example of this).  Google docs offers a bit of code, which you copy.
!!!(e) For PowerPoint slides
You can display slides so that others can see them as a slideshow, or can DOWNLOAD them from your page in your manual

* You can do this via Google Docs, Google Drive, or one of many other "web-hosting" services for PowerPoint slides
* Alternatively, you can actually save individual PowerPoint slides as JPEG files (essentially these are just digital photos) and then upload these to a photo hosting site (see just above for examples) and mount them in your page as a straightforwards picture (simpler, nicer "feel", but a bit fiddlier if you have loads of pictures! - the photo above is actually taken from a PowerPoint slide that was saved as a JPEG.)  
** By the way, ancient versions of PowerPoint make it a bit more complicated to save slides as JPEGs, but modern versions make it easy... (open the slide, click "Save as", then select what kind of file (JPEG) you want to save it as from the drop-down list that appears beneath all the file locations you could save it into...

!!!EMBEDDING CODE
* Find the "Embed code" from the site where you are hosting the image/document/etc
* Slap this embed code INSIDE the code given below (cut and paste it from here):

|bgcolor(beige): {{{<html>}}}~ADD_YOUR_EMBED_CODE_HERE{{{</html>}}} |

|bgcolor(red): ''Do note'' the little //forwards slash// that must sit before the second "html"... it is fiddly, but once you know it, simple! |

!! iFRAMES - a whole "web-page-within-a-page"!

An iFrame simply opens a "port-hole" onto another part of the web from within a [[Tiddler]].  If you want to 'embed' a ''whole web-page'' inside a page of your manual, you can easily make one of these 'windows', using a similar little bit of code (called an "iFrame").  Here is the code that you need to this... you can __cut and paste the code for this from here__:

|bgcolor(beige): {{{<html><div align="center"><iframe src="PASTE_YOUR_WEBPAGE_URL_HERE" frameborder="0" width="100%" height="600"></iframe></div></html>}}} |

## Now go to the web-page you want to embed in your manual page
## Copy the web address ("URL") for that web-page
## Go back to the [[Tiddler]] you are editing, and paste the web-page URL just where the code says "~PASTE_YOUR_WEBPAGE_URL_HERE" (''//be sure to leave the speech marks in place so that they bracket your URL//'')
## Done!  Click "Done" (or the tick) on your [[Tiddler]] page - top right, and the page will switch back to ordinary viewing mode... if you got it right, you'll see your other web-page within that one.  Here is an example (probably the most boring blog in the blogosphere):

<html><div align="center"><iframe src="http://dickonb.blogspot.co.uk/" frameborder="0" width="100%" height="600"></iframe></div></html>
 
!!Notes:

#If you are viewing a downloaded //copy// of the manual then it will still fish out the web-based content //so long as your computer is hooked up to the internet//, but if you are not online, obviously no image will show. 
#If you are wanting to put a bit of YouTube video up, you will see on the You Tube page that there are actually two bits of code displayed that can be cut and pasted - one is titled "URL" - this is what you would use for the iFrame technique, the other is titled "Embed" and is a neater way of doing things (see "embedding code" above - but essentially, just sandwich the Youtube embed code in between these two extra bits of code: {{{<html>}}} and {{{</html>}}} (again, do note that there is an extra "forward slash" in the second of these.)  If you use an "Embed" code then you will ONLY get the video image in its own little "player", rather than the whole You Tube page - much neater.
!What is it and where is it?
* This is one of the options on the [[Mode and Login panel]].  
* You can only access this option if you are [[logged in|Log in]] as a member of the space.

Via an extra set of [[Menus]] on the black [[Top menu bar]] that appears right across the top of your desktop screen (you may need to scroll to the top of the page to reveal this) you can find:
* Extra information about the site
* How to add or subtract members (given that you have the appropriate permissions), etc.  
* Additional ways to [[Index]] and [[Search]] material, or to make changes to "batches" of pages.
* Etc
!It //is// only for advanced users!
As the name suggests, most team members or visitors will either not have access to this menu, or would have no use for it.







!Purpose
To find ways around large organisations' bans on staff accessing to the ~YouTube video clips.

!The easy way:
The ''best'' way to do this is to persuade your organisation to make an exception so that members of your team are given permission to access Youtube, Vimeo, Google Docs and Picasa (where most of the multimedia content is hosted, and then accessed by the manual.)

The problem that you //may// have is that your IT Dept is mixing its technical/facilitating role with a MANAGEMENT role.  (Most definitions of the role of an IT dept is that it is there to make IT work for the benefit of the organisation.)  If members of your team were to access //inappropriate material// or to //waste the hours they are being paid to work// by watching tedious or crass videos instead, then this would be a //management// issue, and should be dealt with accordingly by line management.  Asking for a technological fix for human behaviour is not great management, and not very 21st century!  

!The harder way: permissions for each //individual// ~YouTube clip
This is a bit fiddly, so you I suggest that you ask your IT dept to do this for you if this is what is being asked for!

Note that everytime a new videoclip is added to the manual (and we hope that lots of new video will be being added!) they will have to go and make a new exception - which is a drag.  Many large organisations, including in the NHS, are now beginning to grant blanket permission for certain users to access Youtube, etc, and then managing infringements in more grown up ways.

There is some good material in the manual about marshalling this kind of argument for senior managers in an organisation: see [[Organisational support for the technology to run TiddlyManuals]].

If in spite of all this the organisation still insists on approving each individual video clip then this is how to find the URL's (that is the web address that the IT system will have to enter into their system to "Allow" it):

1. Go to [[Videos]] - this page has all the video content listed as sub-topics find this when you click the "[[Show references and info]]" panel.

2. Open each page with video embedded in it, and then get the URL for that filmclip as follows:

3. Within each embedded youtube screen on the page there are buttons that will appear when you mouse over the screen.  These allow you :

(a) to minimise the film screen and reveal beside this the "URL" for that bit of film (select and copy it!), or 
(b) to "watch this film in ~YouTube" which opens the youtube page in a separate tab or window (which also gives you the URL - select and copy it.)

4. Give a list of the ~YouTube clip URL's to your IT department.  Warn them that you will be supplying them with a regular supply of new URL's as new video continues to be added.

!But...
Obviously if you were to try to do this yourself at work you would struggle as you can't get the films to show!  But there is still a way...

5. You need to [[Log in]] and then switch the manual to [[Edit mode]].

6. Open up a page that has video in it, and click the Edit button to "open the hood" of that page to look at the workings...

>(tip: NB - IF YOU DO THIS, THEN WHEN YOU CLOSE THE PAGE UP AGAIN, USE THE X, RATHER THAN THE TICK, SO THAT YOU "UNDO CHANGES TO THIS TIDDLER" - that way the system doesn't assume you have been busily editing your content and log all the pages you do this with as different versions from the core manual)....

7. Once you are inside the workings of the page, what you then look for is a bit of gobbledegook code that will be placed where the video window occurs in the page.  This is what we call an iFrame - it consists of two lumps of code that sandwich the URL and tell the page to make a window and to show the URL inside it.  It will look something like this:

>{{{<html><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/jlmDRbXttcw?hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/jlmDRbXttcw?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>}}}

8.  All you have to do now (I warned you it was fiddly!) is find the URL and copy it out of this - it will always start with {{{http://}}} and will always be bracketted with speech marks - I have highlighted this one:

>{{{<html><object width="425" height="344"><param name="movie" value="}}}http://www.youtube.com/v/jlmDRbXttcw?hl=en&fs=1{{{"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/jlmDRbXttcw?hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></html>}}}

I hope that is helpful.  Many large organisations are now making ~YouTube and Facebook, etc, open to all their staff, which is felt to be more respectful, and does not change the fact that if there is evidence of misuse then this is may be evidenced easily enough with help from the IT dept, and then managed through line management.  That way IT gets to do what it is good at, and managers too...
This button/heading is found on one of the Tabs, in the [[Index]].  It lists all the [[Tiddler]]s in the whole manual, in alphabetical order. You can also use the [[Search]] facility to look for the information you want.
/*{{{*/
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'
The NHS [[Armchair Involvement project]], is an official NHS site called the Armchair Involvement project describes itself as "Helping you to use new technology to engage people in service improvement" which ticks a lot of boxes.  the direct weblink is [[here|http://www.institute.nhs.uk/building_capability/armchair_no_comment/armchair_involvement.html]]

It references a site called [[Social Strategy - breaking down the barriers]], which lists 50 hurdles or barriers to large public organisations making best use of web 2.0 technology.

<html><div align="center"><iframe src="http://webarchive.nationalarchives.gov.uk/20100809193706/https://www.institute.nhs.uk/images//documents/BuildingCapability/Armchair/armchair%20involvement%20report.pdf" frameborder="0" width="100%" height="600"></iframe></div></html>
Assessment for the course should primarily focus on attainment of competences for clinical practice.  It should include: 

*Minimum of two, 2500 word assignments; one of which should be a case study
*Examined recording of actual clinical practice with a child or young person
*Supervisor(s) report(s), confirming a minimum of 100 hours of supervised practice and attainment of competences
*Clinical portfolio, including a log of counselling sessions, clinical supervision attended and how supervision informed practice
*Completion of a reflective journal
*Minimum of 80% attendance at the training institute. 

''Qualifications''

The EBCP curriculum is equivalent to 60 credits; and is open to staff with graduate level qualification and staff who do not have graduate qualifications. Staff may be awarded a Graduate or Post Graduate Certificate in Evidence Based Counselling Practice depending on their qualifications at entry.

Through successful completion of the course, staff will have met BACP accreditation standards for counselling work with young people. 
!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);
//}}}
!!!What you type in the edit box...
{{{
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

<<<
blockquote
<<<
}}}
!!!...and what you see in the ordinary "viewing mode"...
<<<
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

> blockquote
<<<
/***
|Name|BreadcrumbsPlugin|
|Author|Eric Shulman|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|Documentation|http://www.TiddlyTools.com/#BreadcrumbsPluginInfo|
|Version|2.0.0|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler,TiddlyWiki.prototype.deleteTiddler|
|Options|##Configuration|
|Description|list/jump to tiddlers viewed during this session plus "back" button/macro|
This plugin provides a list of links to all tiddlers opened during the session, creating a "trail of breadcrumbs" from one tiddler to the next, allowing you to quickly navigate to any previously viewed tiddler, or select 'home' to reset the display to the initial set of tiddlers that were open at the start of the session (i.e., when the document was loaded into the browser).
!!!!!Documentation
<<<
see [[BreadcrumbsPluginInfo]]
<<<
!!!!!Configuration
<<<
<<option chkCreateDefaultBreadcrumbs>> automatically create breadcrumbs display (if needed)
<<option chkShowBreadcrumbs>> show/hide breadcrumbs display
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
<<option chkBreadcrumbsHideHomeLink>> omit 'Home' link from breadcrumbs display
<<option chkShowStartupBreadcrumbs>> show breadcrumbs for 'startup' tiddlers
<<option chkBreadcrumbsReverse>> show breadcrumbs in reverse order (most recent first)
<<option chkBreadcrumbsLimit>> limit breadcrumbs display to {{twochar{<<option txtBreadcrumbsLimit>>}}} items
<<option chkBreadcrumbsLimitOpenTiddlers>> limit open tiddlers to {{twochar{<<option txtBreadcrumbsLimitOpenTiddlers>>}}} items

<<<
!!!!!Revisions
<<<
2008.05.01 [2.0.0] added 'limit open tiddlers' feature (with safety check for tiddler in edit mode)
| Please see [[BreadcrumbsPluginInfo]] for previous revision details |
2006.02.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.breadCrumbs = {major: 2, minor: 0, revision: 0, date: new Date("May 1, 2008")};

var co=config.options; // abbreviation

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

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

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

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

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

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

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

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

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

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

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

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

// hijack store.removeTiddler() so crumbs can be refreshed when a tiddler is deleted
if (TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined)
	TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler= function(title)
{
	this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);
	config.macros.breadcrumbs.refresh();
}
//}}}
If you are not [[logged in|Log in]] then you only have access to the ''BROWSING'' mode.  

This is the simplest way to use the manual.  It is just a website to all intents and puposes - you can open and close pages, and that is it.
!!@@color(blue):Lists@@
!!!What you type in the edit box...
{{{
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

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

; definition list, term
: definition list, description
}}}
!!!...and what you see in the ordinary "viewing mode"...
<<<
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

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

; definition list, term
: definition list, description
<<<
!To make more space:

On your browser (different browsers all phrase this slightly differently, but they all do it) click on the "View" menu, and then select "Full screen" - this will get rid of the whole top browser menu, which tends to take up a lot of screen, and does very little once you are working in the TiddlyManual itself.  

Many (Windows PC) computers do this if you just press F11.

!To make typeface bigger.

if you press CTRL and the (+) sign together, the typeface will get larger, if you press CTRL and the (-) sign together, the typeface will get smaller

!Change Titles, Icons, etc
You can make changes to the following things:

* ''__Upload a SiteIcon__''. A SiteIcon gives your manual an identity to make it recognisable to others. ''Try to keep your SiteIcon 40px or less in height.''

<<binaryUploadPublic title:SiteIcon>>

If you can't make this work, you can also do this via the [[Space menu]] which you will find in the [[Top menu bar]].

* ''__Change Titles__'': The [[SiteTitle]] & [[SiteSubtitle]] can both be changed. After saving and refreshing your browser, they will appear in the browser title bar.
* ''__Change the main menu:__'' - click and then edit the [[MainMenu]]: this is the menu that appears in the [[Sidebar]].
* ''__Change which Tiddlers automatically open on start-up:__'' You can decide which tiddlers you want 'ready-opened' (if any) on start-up by going to [[DefaultTiddlers]] - Whichever titles of other tiddlers are recorded in the text of that tiddler, those are the ones that will be automatically opened when you first open the TiddlyManual.

----

* Many other features of TiddlySpace are accessed via the [[Top menu bar]] located at the top of the page, accessed when you are in the [[Advanced mode]].


<!--{{{-->
<h2><!--<<view title>>--></h2>
<!--<<view text wikified>>-->
<hr/>
<!--}}}-->
<!--{{{-->
<h1 style="page-break-before:always"><!--<<view title>>--></h1>
<!--<<view text wikified>>-->
<!--}}}-->
!What is it?
This "Button" is one of the [[Comparing and Sharing functions]] of a TiddlyManual.  It is at the heart of the ideas about [[Community of Practice]] that support AMBIT; 

It enables you to make a copy of a page that //another local team// have developed, that would have value for //your local team// - in other words, to [[Go shopping for freely shared material]] that other members of the AMBIT Community of Practice have created.

<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/xGoXRgCkddY?hl=en_GB&amp;version=3&amp;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/xGoXRgCkddY?hl=en_GB&amp;version=3&amp;rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>

!Where is it?
Look at the [[+ Getting started]] page, and click the ''"Browse the Community of Practice"'' button.  This will reveal a list of all the local pages that have been authored recently.

* [[Log in]] to your own local manual
* Get your manual switched to [[Edit mode]]

* Click on a page you are interested in 
** You will open a panel that has a ''"Go To"'' button, and beside that (''//only// visible if you are in [[Edit mode]]'') you will see the Clone and Customise button
//{{{
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
		}
	};
});
//}}}
This is one of the options you have on the individual [[Tiddler]] menu; unless you are using a very old browser it is usually represented by the symbol 'X'. 

Clicking this option on a specific [[Tiddler]] menu will close that specific Tiddler: for instance, click the (X) button on this tiddler and it will be gone!

!Other ways to close

You can ALSO close individual tiddlers by clicking the little X that you will see beside them in the [[Currently Open]] list on the [[Sidebar]] in the left hand margin.
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

	handler: function(event,src,title) {
		this.handler_mptw_orig_closeUnsaved(event,src,title);
		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
			story.closeTiddler(title,true);
	 	return false;
	}

});

//}}}
/*{{{*/
Background: #dcf6f8
Foreground: #062022
PrimaryPale: #fafdfe
PrimaryLight: #c4eaed
PrimaryMid: #48b0b6
PrimaryDark: #4a5353
SecondaryPale: #fefdfa
SecondaryLight: #edeac4
SecondaryMid: #b6af48
SecondaryDark: #53534a
TertiaryPale: #fefafd
TertiaryLight: #edc4e6
TertiaryMid: #b648a4
TertiaryDark: #534a52
Error: #f88
ColorPaletteParameters: HSL([183|53], [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);
	}
};*/

/*}}}*/
There are a number of different ways that [[TiddlyManual]]s help and encourage workers who consult them to //compare// and //share// their local expertise with that of others...  getting curious about how other teams are solving problems and sharing our own learning with them is key to AMBIT's goal to support the development and dissemination of best practice for excluded and disadvantaged youth. 

<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/02QyMFIQRNY?hl=en_GB&amp;version=3&amp;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/02QyMFIQRNY?hl=en_GB&amp;version=3&amp;rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>

* This is part of the effort to build and sustain what has been referred to as a [[Community of Practice]].

* Sub-topics of this page give explanations for all of these functions.
** See the [[Show references and info]] panel... 
<<slider chkMainMenuSlider [[MainMenu]] "See what's in this CYP-IAPT manual (or look in the Contents section on the sidebar)»" "Click here to see the contents of this manual">> 
Core Templates refer to the broader templates that are made available for new teams planning to work to AMBIT principles to download and start off with.  

At this early stage there is only one Core Template.

In due course, a differentiated array of Core Templates should be available - with basic adaptations attuned for:
*Different target groups
*Different geographic settings
*Different cultural milieux.
These differentiated Core Templates will be [[TeamTemplate]]s that have been adapted and evaluated so that their target group, and local details will be available alongside the outcome data.
This is a bit more complex, and fiddly, but it works!...
!!!What you type in the edit box...
{{{
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
}}}
''Annotation:''
* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.
* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.
!!!...and what you see in the ordinary "viewing mode"...
<<<
|CssClass|k
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c
<<<
This is a key place in the manual - you find it on the lefthand [[Sidebar]], and it shows you the titles of all the pages ([[Tiddler]]s) that are currently opened on your desktop.

!"Self-service" chapters
When you are reading content in a tiddler, if you click on an interesting [[link|Links]], you will NOT immediately flick from the material you are reading into this new material...  Instead, you will see that the links you click ''open at the bottom of your "Currently Open" list'': it is as if you are "ordering up" the chapter that you want to read //as you read.//  We have set the manual to behave in this way as [[Feedback|Feedback please!]] suggested that readers struggled to stay on task if they were clicking on lots of links.
!Navigating with the Currently Open List
Sometimes you may find you have opened lots of tiddlers (like having loads of 'flashcards' spread around your desk), and the "Currently Open" list helps you manage and navigate around them.
*''You can click on any title in this list to jump straight to that tiddler.''
*''You can close any tiddler in the list by clicking the X next to it.''
[[+ Getting started]]
To DELETE a [[Tiddler]]:

First open your tiddler in [[Edit]]ing mode by clicking the "edit" button ('pencil' icon).

You will now see a "delete" option in the Tiddler menu - in most browsers this is represented by an icon of a wastebin.

!What happens if I delete?

It depends what you are deleting!

If you have edited content in a tiddler that exists in the "core" manual then you have effectively been "over-writing" material that is independently curated by the originators.  When you delete YOUR local manualized content, the //original material// under that same tiddler title will 'pop back' in its place (this happens once you reload the manual, by clicking the refresh button on your browser.) 

If you have written entirely NEW material (tiddlers with titles that do not exist in the original core manual) then this material is YOURS and will be deleted for ever.

You can look back at REVISIONS (i.e. past versions) of any tiddler, by looking at [[Show references and info]] - so that past versions can be recovered, so long as you don't delete the whole tiddler.

, If you delete content from a TiddlyManual that was a LOCAL VERSION of core content (i.e. if a tiddler from the core AMBIT manual had previously been edited to 

See [[Menus]] if you need more information.
This is the main area on your screen: to the left is the [[Sidebar]], to the right at the top is the [[Mode and Login panel]] and if you switch in [[Advanced mode]] you reveal the [[Top menu bar]] across the top. 

The [[Desktop]] is the main space on your screen - where you open [[Tiddler]]s, the 'pages' within this document.  A TiddlyManual is just a large collection of these 'notes' (pieces of '[[MicroContent]]'), that can be used, and sorted, in many different ways.  

As you open [[Tiddler]]s you will notice that their titles appear in the [[Currently Open]] list in the [[Sidebar]].  If you have clicked on [[Links]] to open those tiddlers then they will have opened at the ''bottom of your list''  - this is so that you do not lose the page you are currently reading.  Instead of jumping from page to page, this way the reader selects and 'lines up' the "chapter" that she requires.

Each Tiddler has its own [[menu|Menus]] that allows you to edit it, close it, etc.

Each Tiddler also has a section that slides open called "[[Show references and info]]" - and this is important as it helps the reader place this material in a wider context (//"How does THIS piece of information fit alongside all of THAT information?... and what related areas to this content might also be of interest and value to me.//)
/***
|''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";

})();
//}}}
!Downloading is not fully functional at present (spring 2012)

We are working on other aspects for now - so although you can download a copy, it is not as fully functional as it will be in due course.

!What are you downloading?

Unlike ordinary Websites, this manual is what is known as a "TiddlyWiki". It is easy to download and save a copy of the whole manual so you can run it from your computer, a secure server, or even from a USB stick - without having to be connected to the internet at all.

!How do I download a copy?

#Go to the [[TiddlySpace menu]] (found via the [[Top menu bar]] when you have switched the menu to [[Advanced mode]]).
#Find your way to the ''Export'' tab
*Having opened the Export tab, click the big "download" button.
*When you click the "download" link, a copy of the whole manual (manual.html) will automatically be downloaded to your computer to wherever your computer usually saves downloads (sometimes this is to a "Downloads" folder, sometimes the desktop).  
*Be patient as it is a file of about 2Mb - not huge, but not instantaneous.
*You may get an automatic warning sign asking you if you are sure you want to download this - click ''Yes'' to allow the download to proceed.

!Using a downloaded manual to record notes:

See [[Start a new patient file]] for additional advice.

You will need to:
*Rename the downloaded file to mark it out as that particular client's file.''N.B. Do not change the extension at the end of the file name from ".html"'' as this is how the computer knows to use your browser to open and read it.
*Store it in a way that conforms to DataSecurity policies in your workplace.
*Note the [[Licensed]] nature of this manual and the restrictions that this places upon its use without prior agreement from the authors.

!Problems

Downloaded copies of the manual do not require any additional software in your computer to run - they work from inside your web-browser.  They work best in [[Firefox|http://www.mozilla-europe.org/en/firefox/]] a freely downloadeable internet browser, but they also work fine in Internet Explorer and Safari as well as others.  

Sometimes these browsers need a little extra setting up, especially to allow you to edit and save content in your manual - once you have done this once, it doesn't need repeating.  There is guidance for this available at: [[TiddlyWiki installation instructions|http://www.tiddlywiki.com/#Installation]]
''Introduction''

The Evidence Based Counselling Practice (EBCP) curriculum has been developed as part of the Child and Young People Improving Access to Psychological Therapies programme (CYP IAPT). The EBCP curriculum complements existing CYP IAPT curricula in specialist psychological therapies and the Enhanced Evidence Based Practice (EEBP) curriculum. It focuses on enhancing counselling practices with children and young people to ensure that they are evidence-based, collaborative, and at an appropriate level of competence. 

The EBCP curriculum covers the learning outcomes set out in the British Association for Counselling and Psychotherapy’s (BACP’s) Evidence-Informed Curriculum Framework for Counselling Young People (11-18 Years) (EICF CYP).

''Rationale for EBCP Curriculum''

Children and young people access mental health services in a variety of settings. In England, every year, approximately 100,000 young people and young adults access counselling in a voluntary sector context [1], 60,000 young people access counselling in a secondary school [2], and thousands more children attend counselling in a primary school context [3]. However, there is a great deal of heterogeneity in counselling practice in England [4, 5], with limited evidence that feedback measures, principles of participatory practice, or evidence-based interventions are widely applied [1-3, 6].  

The aim of CYP IAPT is to ensure that children and young people’s mental health services, wherever delivered, offer safe and effective treatment that is designed around the wishes and needs of service users and their families. The aim of the EBCP curriculum, therefore, is to optimise the effectiveness of counselling practice, as delivered across a range of contexts. 

During the period of training, students will be required to be practising counselling with children and/or young people; to be receiving regular clinical supervision; to be able to video (wherever possible) or, at the very least, audio record their sessions; and to be using a range of CYP IAPT-compliant routine outcome and process measures. Students should be working in services that have access to colleagues in specialist CAMHS for consultation, and where they can refer children and young people for specialist multidisciplinary care as necessary. 

''Purpose''

The aim of the EBCP curriculum is to develop care and treatment for children and young people that is:

•	Evidence based
•	Delivered in partnership with children, young people and their families
•	Guided by feedback from the regular monitoring of outcomes, goals and the therapeutic process
•	Based on a collaborative, comprehensive assessment
•	Supported through a facilitative supervisory system
•	Delivered as part of a collaborative network with other mental health professionals and agencies.

The EBCP programme aims to develop advanced evidence-based competences in counselling, for practitioners who have already developed standard counselling competences. This will be assessed by submitting a KSA (Knowledge, Skills & Attitudes) portfolio. The EBCP curriculum is not intended as an entry-level counselling skills training.

The clinical skills taught are suitable for delivery in a range of settings including schools, the voluntary and community sector, and the NHS.

''Learning Outcomes''

At the end of the programme, successful students will be able to:

•	Understand the core components of a successful CYP IAPT programme
•	Demonstrate how these core components are incorporated into their work with children and young people
•	Conduct a comprehensive assessment of a child/young person considering elements of risk, development, mental health diagnosis 
•	Successfully implement an evidence based counselling intervention for mild depression in children and young people
•	Successfully implement a cognitive-behavioural intervention for anxiety problems (generalised anxiety disorder, specific phobia, and separation anxiety) in children and young people
•	Use clinical supervision and demonstrate evidence of self-reflection in relation to their counselling work. 

''Learning Methods''

The EBCP curriculum will be delivered through a range of teaching and learning methods. 

Over the course of the programme, students should spend a minimum of 24 days at a training institute: attending workshops, skills classes and other activities. 

Students will be expected to undertake approximately 340 hours of further independent study. A key component of this will be e-learning through the MindEd programme, primarily sessions from Counselling MindEd and the CYP IAPT Core Curriculum. In addition, there will be the completion of assignments, background reading, and preparation for therapy sessions.

Students will need to complete a total of 100 hours of relevant clinical practice, with a minimum of 1.5 hours of individual supervision (or equivalent group supervision) for every month of practice. This must include appropriately supervised clinical practice in humanistic counselling for clients with mild depression (Module 2 – minimum of 30 hours), and CBT for client with anxiety problems (Module 3 – minimum of 30 hours).  

The period of study should be equivalent to an academic year. 
!Purpose
To help the user understand the basics of editing content in a TiddlyManual.
!Video introductions

*[[Video introduction to editing a tiddlymanual]] - basics of how to do it.
*[[Video introduction to editing conventions ("Mark-up")]] - how to lay out text and //make it look nice//.
*[[Adding IMAGES, DOCUMENTS or VIDEO clips]] - including adding DOCUMENTS that you can view and download from within a page of the manual.
!Other material

See [[Customising your local TeamTemplate]] and [[Understanding TiddlyManual format]] for more technical knowledge and skills (simple, honest!) on how to add new material to your team's local version of the AMBIT manual (your "TeamTemplate")
!Authority?

To edit your team's local version of the manual (your "TeamTemplate") online, you must have the right permissions and passwords (see [[I am authorized to edit to our local team's manual]] and [[Manualization Boundaries]]).  Your manual must be switched to [[Edit mode]], rather than the browsing mode.
!Start editing

Once your manual is in [[Edit mode]], rather than just seeing the X that closes the page (top right) you also get an icon of a little page with a + sign which stands for //"edit the content of this page"// (or you can understand this as //"write a local version of this page which will sit on top of the inherited version from the original AMBIT manual"//).  Click this to start editing content of an existing tiddler.

You can open a brand new blank new page ([[Tiddler]]) by clicking: ''@@color(red):|<<newTiddler>>|@@''  (button only visible if you are in Edit mode.)

!Editing the online version ("Customising")

This is called [[Manualization]].  Instructions on how to do this are at [[Customising your local TeamTemplate]], or:

Mostly you see ''//tiddlers//'' in their standard ''"viewing"'' mode.  When you click on [[Edit]] in the Tiddler menu (the pen icon) this opens the Tiddler up in its ''"editing mode"''; what you see in that situation is three boxes, where you can add text:
 
*The __''//top box//''__ is narrow and whatever you type in here will give you the ''Title'' of your Tiddler.
*The __''//middle box//''__ is fatter, and is where the ''Text or other Content'' for your Tiddler goes. Certain simple EditingConventions allow you to place links, or [[Tags]], or other stylistic additions like headings, sub headings, italics, bold, etc.  It is worth understanding these to make the text you type look pleasant on teh page.
*The __''//bottom box//''__ is narrow (like the top one) and you can add [[Tags]] (think of these as "Topic headings" under which the content of this page should sit.) You may type as many ''tag words'' in as you want, each one separated by a space.  Alternatively, you can click the button ''"tags"'' which is found right underneath this tags editing box: this opens a drop-down 'pick-list' of all the existing tags in the manual; click on any of these tags and it will automatically be added to the tag box.

When you have finished editing, click 'done' on the Tiddler menu to return to the normal view.

![[ICR]]

Using the manual as an [[ICR]] is an advanced use of editing //@@color(red):(not in use at present - September 2011)@@// - using downloaded copies of the manual as wiki-based workbooks to record thinking about a case.  The [[ICR]] function will need to be negotiated and agreed locally.

Whenever you ''Make a client note'' you are effectively editing.  Or, for instance, you might wish to add additional content in the form of [[Our Resources]] [[Local Contacts]], [[Local Protocols]], etc, etc, or to modify the suggested interventions if the developing evidence base changes.  You may wish to form new [[Tags]] to link Tiddlers around a new theme of your choosing.
This is one of the modes which you can switch the manual into via the [[Mode and Login panel]], assuming you have the authority to do so and are logged in.

Unsurprisingly, it allows you to [[Edit]] content in your version of the manual.
<!--{{{-->

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

<!--}}}-->
!What's this page about?
Mostly this helps you use simple tricks to make text and pictures you want in your wiki look nice an shiny.

There is also a page of [[Top tips for editing content]] that is more about style, using links and tags constructively, etc... so that your wiki hangs together well and (more important) so other people can find stuff you have written about!

!Making new text look smart on the page

If you do write in a TiddlyWiki then it is worth knowing some of this stuff.  Learning a few of these very simple "conventions" (the programmers call these conventions //"Mark-up"//) means you can turn text in tiddlers into something much easier on the eye and easier to read! 

!Introductory video:

Rather than reading all the notes below, there is a quick [[Video introduction to editing conventions ("Mark-up")]] that you might find simpler...

!Formating

Tiddlers use a very simple "language" (known as the 'syntax'.)   This language tells your browser how to display text when the page (or [[Tiddler]]) is switched from its [[Edit]]ing mode (what I describe as "having the bonnet/hood up, so you can see the workings") back to the standard 'viewing' mode.

The ''"syntax"'' is just "what you type in the Content box of a tiddler" that is switched to [[Edit]] mode.  The ''"Output"'' is what you see when the tiddler is switched back into the ordinary viewing mode.

!Basic syntax
By ''"syntax"'' we just mean //"what you type into the page in order to make it display the way you want it to"//
|!Option|!Syntax|!Output|
|bold font|{{{''bold''}}}|''bold''|
|italic type|{{{//italic//}}}|//italic//|
|underlined text|{{{__underlined__}}}|__underlined__|
|coloured text|{{{@@color(blue):text in blue@@}}}|@@color(blue):text in blue@@|
|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|
|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|
|superscript text|{{{^^super^^script}}}|^^super^^script|
|subscript text|{{{~~sub~~script}}}|~~sub~~script|
|preformatted text|<html><code>{{{preformatted}}}</code></html>|{{{preformatted}}}|

!Other stuff you might like to use:
[[Headings and Sub-headings]]
[[Bullet points and Numbered Lists]]
[[Adding IMAGES, DOCUMENTS or VIDEO clips]]
[[Links and Shortcuts to making them]]
[[BlockQuotes]]
[[Creating Tables]]
[[Special Markers and clever tricks]]



!The easy way
1. Use the Uploader, which uploads your image to the TiddySpace server; this creates a page (a "[[Tiddler]]") that is a picture.  
2. You can then embed that picture in as many other pages, or in as many different sizes, as you wish.

|bgcolor(lightblue): Clear the existing text (Please enter a title... ''Think about your title!'' - make it clear, easy to search, and check there isn't already a page with the same title in existence!) and type the name of your image (to be the IMAGE TITLE) here:<br><<binaryUploadPublic edit:title>>Then select the image file you want to upload, click Upload, and you will create a tiddler which is an IMAGE |
|bgcolor(pink): Note you will only see the uploader if you are a [[member|Making someone a member of a space]] of this space, are [[logged in|Log in]] and are in [[Edit mode]] |

|bgcolor(lightblue): Now, to EMBED that image in any OTHER page, you just use this code: <br> {{{<<image [[Paste the IMAGE TITLE here]] width:48 height:48>>}}} <br> You can set the ''Width'' and ''Height'' according to how big you want the photo to display (48x48 is quite small, 480x480 is middle sized, 600x600 is large, for instance) |

EXAMPLES (different sizes to give you an idea of the pixels you might want to set the size you want for your image)...
!!!The OLD AMBIT wheel
__height=100, width=100__
<<image [[Old AMBIT wheel]] width:100 height:100>>
!!!The NEW AMBIT Wheel
__height=48, width=48__
<<image [[New AMBIT WHEEL]] width:48 height:48>>

__height=200, width=200__
<<image [[New AMBIT WHEEL]] width:200 height:200>>

__height=400, width=400__
<<image [[New AMBIT WHEEL]] width:400 height:400>>

!2. Another way - embedding pictures hosted elsewhere:
!!!Understanding how it works
First, this manual is called a //~Mash-Up// - what is that?!

This is what --geeks-- programmers refer to when a single website actually uses functions and pieces of information that are drawn from different places across the internet - the //mash-up// brings these disparate elements together to produce something quite specific and 'fit-for-purpose'.  [[TiddlyManual]]s work like this.  Video, audio, pictures and documents can all be stored in different online places, but can be accessed through (or "embedded within") the one tiddlymanual.
!How to embed a picture that is hosted elsewhere:
## Open the photo you want to embed in the hosting site where you have uploaded it.
## Right click the photo, and select "COPY PICTURE URL" to copy the URL (web address) of that picture
## Go to your "[[Tiddler]]" and make sure it is in [[Edit]]ing mode...
## Select where you want to post the photo and then type the following code in to your page and paste that URL in just where it says so:

|{{{[img[paste_your_photo_URL_right_here]]}}}|
 - it will work like a dream... see here:

[img[https://lh4.googleusercontent.com/-ovJdn_fOy8c/UQYmZLMRQBI/AAAAAAAAGlY/1OfohPedcBM/s960/Outreach%2520-%2520mountain%2520ridge.jpg]]
The EBCP curriculum has the primary objective of expanding and enhancing the skill set of the child and adolescent mental health workforce, irrespective of professional backgrounds or regulating bodies. 

At entry level, applicants will need to demonstrate a basic level of competence in counselling assessed by submitting a KSA (Knowledge, Skills & Attitudes) portfolio. Knowledge and practice, including those required to meet the learning outcomes of Module 2 (Therapeutic Relationships) and Module 3 (The Therapeutic Alliance) of the BACP’s EICF CYP. This would include such skills as building therapeutic rapport, conveying non-judgmental empathy, managing ruptures and preparing for endings. However, trainees may or may not have experience of working with children and young people, and they may or may not have acquired a formal counselling qualification. Successful applicants to the course may be:

*Qualified counsellors (to diploma level or above, typically two year part-time), with or without experience of working with children and young people

*Professionals who have experience of working in a counselling role with children and young people, to a level commensurate with exit from a diploma in counselling.  

Applicants who do not have a relevant recognised core professional training/qualification in counselling must evidence how they meet the prerequisite criteria through submitting a KSA (Knowledge, Skills & Attitudes) portfolio.  This consists of the submission of a series of documents to demonstrate equivalence.  

Staff/counsellors embarking on the course must be:

*In a position to use the newly acquired skills in their day to day routine work with children and young people
*Committed to continuing their personal professional development and to using the skills and outcome framework during and after the course is finished
*Prepared to invest time in study and reflection 
*Able and willing to participate in regular supervision

Services wishing to send staff/counsellors on the course must: 

*Ensure that staff can video (or audio) record their sessions and review recordings with supervisors, university staff and colleagues (ensuring that appropriate policies and procedures are in place with regard to consent and confidentiality).
*Ensure that the staff -- employed or voluntary -- embarking on the course are given protected time, as indicated above, for independent study, supervision, and HEI-based learning
*Ensure that appropriate supervision will be continued after the course is over to help practitioners embed their new skills.

The delivery of this curriculum must be:

*Within the overall delivery of the full CYP IAPT curriculum. That is, training providers must also provide the postgraduate diplomas, certificate level supervision and transformational leadership to support employers to develop the appropriate environment for staff undergoing this course. This includes ensuring that the clinical supervision provided in service settings meets CYP IAPT requirements (see Supervision and Supervisor Training, below).
*Facilitated fully by the HEI. The HEI must work closely with partnerships in selection of candidates and support and assess students’ development of practice competences for each module. Staff delivering Module 2 must be appropriately qualified (diploma in person centred or humanistic counselling) with minimum experience of 2 years in delivering humanistic interventions with children and young people. Those delivering Module 3 must be appropriately qualified (BABCP accredited in CBT) and experienced (minimum of 2 years) in cognitive-behavioural interventions with children and young people).
/***
|''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);
		}
	}
};
//}}}
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
	window.onClickTag_mptw_orig.apply(this,arguments);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	// Thanks Saq, you're a genius :)
	var popup = Popup.stack[Popup.stack.length-1].popup;
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	wikify("<<newTiddler label:'Create new page as a sub topic of this one' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
	return false;
}

//}}}
/*!**
|''Name''|ExtraFilters|
|''Author''|Jon Robson|
|''Version''|0.6.8|
|''Status''|@@experimental@@|
|''Requires''|TiddlySpaceFilters ImageMacroPlugin|
|''CodeRepository''|<...>|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Notes
* Updates shadow tiddlers to known TiddlySpace shadow tiddlers
* adds the following filters 
{{{
[is[tiddler]] - allows you to match all tiddlers - useful for applying the isnot filter (see later)
[is[image]] - returns only image tiddlers (e.g. png, jpeg, gif etc..)
[is[shadow]] - returns if the tiddler is a known shadow tiddler
[is[svg]] - returns only svg tiddlers
[is[tagged]] - returns tiddlers with tags
[isnot[image]] - filters result of previous filters for ones that are not images
[notag[<tag>]] - filters result of previous filters for ones without a tag
[nofield[<field>]] - check for absence of field or field value in previous filters
[has[<field or attribute>]] - match tiddlers which have a field or attribute set.
[and[<filter expression>]] - e.g.[and[tag:foo]] checks all tiddlers from previous filters for a tag foo.
[nobag[foo]] - removes any tiddlers previously returned by a previous filter that belong to the given bag
[is[open]]
[startsWith[title,Foo]] returns all tiddlers who's titles start with Foo.

}}}
***/
//{{{
(function($) {
var _display = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function() {
	var res =  _display.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};
var _close = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function() {
	var res =  _close.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};

config.shadowTiddlers.SiteIcon = "";
config.shadowTiddlers.SiteInfo = "";
config.shadowTiddlers.SystemSettings = "";
config.shadowTiddlers[config.extensions.tiddlyspace.currentSpace.name + "SetupFlag"] = "";

config.filterHelpers["is"].image = config.macros.image.isImageTiddler;
config.filterHelpers["is"].svg = config.macros.image.isSVGTiddler;
config.filterHelpers["is"].tiddler = function(tiddler) {
	return tiddler ? true : false;
}
config.filterHelpers["is"].open = function(tiddler) {
	return story.getTiddler(tiddler.title) ? true : false;
}
config.filterHelpers["is"].shadow = function(tiddler) {
	return tiddler && tiddler.title && tiddler.title in config.shadowTiddlers ? true : false;
}
config.filterHelpers["is"].tagged = function(tiddler) {
	return tiddler && tiddler.tags.length > 0 ? true : false;
};
config.filterHelpers["is"].external = function(tiddler) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	var fields = tiddler.fields;
	var bag = fields["server.bag"] || "";
	var local = config.filterHelpers["is"].local(tiddler);
	if(!local && endsWith(bag, "_public") || bag.indexOf("_") === -1) {
		return true;
	} else {
		return false;
	}
};

config.filterHelpers["is"].privateAndExternal = function(tiddler) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	var fields = tiddler.fields;
	var bag = fields["server.bag"] || "";
	return !config.filterHelpers["is"].local(tiddler) && endsWith(bag, "_private");
};

config.filters.isnot = function(candidates, match) {
	var type = match[3];
	var results = [];
	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;
};

config.filters.nobag = function(results, match) {
	var bag = match[3];
	var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    if(tiddler.fields["server.bag"] !== bag) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};

config.filters.linksTo = function(results, match) {
	var name = match[3];
	results = this.getTiddlers();
  var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    var links = tiddler.getLinks("title", "excludeLists");
    if(links.contains(name)) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};

config.filters.notag = function(results, match) {
  var tag = match[3];
  var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    if(!tiddler.tags.contains(tag)) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};
config.filters.nofield = function(results, match) {
  var fieldname = match[3];
  var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    if(!tiddler.fields[fieldname]) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};

config.filters.and = function(results, match) {
	var args = match[3].split(":");
	var negationMode = false;
	var handler = args[0];
	if(handler.indexOf("!") === 0) {
		handler = handler.substr(1);
		negationMode = true;
	}
	var value = args[1];
	if(config.filters[handler]) {
		var titles = [];
		var matches = config.filters[handler].call(this, [], [null, null, handler, value]); // note some filters require second argument :(
		for(var i = 0; i < matches.length; i++) {
			titles.push(matches[i].title);
		}
		var newResults = [];
		for(var i = 0; i < results.length; i++) {
			var tid = results[i];
			if(!negationMode && titles.contains(tid.title)) {
				newResults.push(tid);
			} else if(negationMode && !titles.contains(tid.title)) {
				newResults.push(tid);
			}
		}
		return newResults;
	} else {
		return results;
	}
};

config.filters.has = function(results, match) {
	var field = match[3];
	var results = [];
	this.forEachTiddler(function(title, tid) {
		if(tid[field] || tid.fields[field]) {
			results.push(tid);
		}
	});
	return results;
};

config.filters.startsWith = function(results, match) {
	var args = match[3].split(",");
	var field, str;
	if(args.length === 1) {
		field = "title";
		str = args[0]
	} else {
		field = args[0];
		str = args[1];
	}
	var newResults = [];
	// use this to keep the current store context
	this.forEachTiddler(function(i, tid) {
		var val = this.getValue(tid, field);
		if(val && val.indexOf(str) === 0) {
			newResults.push(tid);
		}
	})
	return newResults;
}

var scanMacro = config.macros.tsScan;
config.filterHelpers.loadingTiddler = new Tiddler("Loading...");
config.filterHelpers.loadingTiddler.text = "loading...";
config.filterHelpers.loadingTiddler.fields["msg.loading"] = "loading...";
config.filterHelpers.url = {};
config.filters.url = function(results, match) {
	var url = match[3];
	var tiddlers = config.filterHelpers.url[url];
	if(tiddlers) {
		return tiddlers;
	} else if(!status) {
		config.filterHelpers.url[url] = [ config.filterHelpers.loadingTiddler ];
		$.ajax({type:"get", url: url, dataType: "json", success: function(jstiddlers) {
			var tiddlers = scanMacro._tiddlerfy(jstiddlers, {});
			config.filterHelpers.url[url] = tiddlers;
			refreshDisplay();
		}, error: function() {
			displayMessage("unable to connect to %0".format(url));
		}
		});
	}
	return config.filterHelpers.url[url];
};

}(jQuery));
//}}}
Supply a link to a feedback form such as survey monkey or constant contact here.
/***
|''Name:''|FilterTiddlersPlugin|
|''Description:''|Filter the tiddlers in a TiddlyWiki|
|''Author''|JonathanLister|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/plugins/FilterTiddlersPlugin.js |
|''Version:''|0.4|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.4|

! Usage
{{{
store.filterTiddlers(filter)
}}}
where "filter" is a filter expression, as explained below

Returns an array of Tiddler() objects that match the filter expression

! Filter expressions
Filter expressions are of the form:
{{{
filterStep | filterStep | ... // only one filterStep is required
}}}
where filterStep is of the form:
{{{
[filterElements]
}}}
where filterElements is one or more of the following:
* [TiddlerName]
* tag[TagName]
* sort[SortField]
* limit[NoOfResults]

***/

//{{{
if(!version.extensions.FilterTiddlersPlugin) {
version.extensions.FilterTiddlersPlugin = {installed:true};

TiddlyWiki.prototype.filterTiddlers = function(filter) {
	var makeStore = function(tiddlers) {
		if(tiddlers && tiddlers.length===0) {
			return store;
		}
		var TW = new TiddlyWiki();
		for(var i=0;i<tiddlers.length;i++) {
			TW.addTiddler(tiddlers[i]);
		}
		return TW;
	};
	var findRawDelimiter = function(delimiter,text,start)
	{
		var d = text.indexOf(delimiter,start);
		if(d==-1)
			return -1;
		var b = {start:-1,end:-1};
		var bs = text.indexOf('[',start);
		if(bs==-1 || bs >d)
			return d;
		var s1 = -1;
		if(bs!=-1 && bs <d) {
			var be = text.indexOf(']',bs);
			if(be!=-1) {
				b.start = bs;
				b.end = be;
			}
		}
		if(b.start!=-1 && d>b.start)
			s1 = b.end+2;
		return s1==-1 ? d : findRawDelimiter(delimiter,text,s1);
	};
	var filterTiddlers = function(filter,tiddlers)
	{
		var store = makeStore(tiddlers);
		var results = [];
		var accumulator = [];
		var addToResults = function(results,tiddlers) {
			for(var i=0;i<tiddlers.length;i++) {
				results.pushUnique(tiddlers[i]);
			}
		};
		var addAllToResults = function(results,toExclude) {
			if(toExclude && toExclude.length) {
				var titles = [];
				for(var i=0;i<toExclude.length;i++) {
					titles.push(toExclude[i].title);
				}
				store.forEachTiddler(function(title,tiddler) {
					if(titles && !titles.contains(title)) {
						results.pushUnique(tiddler);
					}
				});
			} else {
				store.forEachTiddler(function(title,tiddler) {
					results.pushUnique(tiddler);
				});
			}
		};
		var removeFromResults = function(results,tiddlers) {
			for(var i=0;i<tiddlers.length;i++) {
				var n = results.indexOf(tiddler[i]);
				if(n!=-1)
					results.splice(n,1);
			}
		};
		var tiddlerSort = function(field) {
			// if the accumulator is empty, sort the results array
			if(accumulator.length==0)
				results = store.sortTiddlers(results,field);
			else
				accumulator = store.sortTiddlers(accumulator,field);
		};
		var limitResults = function(limit) {
			// if the accumulator is empty, limit the results array
			var arrayToSplice = accumulator.length==0 ? results : accumulator;
			if(arrayToSplice.length>limit) {
				arrayToSplice.splice(limit,arrayToSplice.length-limit);
			}
		};
		if(filter) {
			var tiddler, tiddlers;
			var re = /([^ \[\]]+)|(?:\[((?:[ \w-+!]+\[[^\]]+\])+)\])|(?:\[\[([^\]]+)\]\])/mg;
			var re_inner = /([ \w-+!]+)\[([^\]]+)]/mg;
			var match = re.exec(filter);
			while(match) {
				if(match[1] || match[3]) {
					var title = match[1] ? match[1] : match[3];
					if(title=="*") {
						addAllToResults(results);
					} else {
						tiddler = store.fetchTiddler(title);
						if(tiddler) {
							addToResults(results,[tiddler]);
						} else if(store.isShadowTiddler(title)) {
							tiddler = new Tiddler();
							tiddler.set(title,store.getTiddlerText(title));
							addToResults(results,[tiddler]);
						}
					}
				} else if(match[2]) {
					// loop through the nested matches of the form 'tag[word]'
					var match_inner = re_inner.exec(match[2]);
					while(match_inner) {
						switch(match_inner[1]) {
						// Note: all 'tag' case fall-through are intentional
						case "-tag":
							tiddlers = store.getTaggedTiddlers(match_inner[2]);
							removeFromResults(accumulator,tiddlers);
							break;
						case "tag":
						case "+tag":
							tiddlers = store.getTaggedTiddlers(match_inner[2]);
							addToResults(accumulator,tiddlers);
							break;
						case "!tag":
							tiddlers = store.getTaggedTiddlers(match_inner[2]);
							addAllToResults(accumulator,tiddlers);
							break;
						case "-sort":
							// this is a syntax error
							displayError(config.messages.filterSortError);
							break;
						case "+sort":
							// this fall-through is intentional
						case "sort":
							tiddlerSort(match_inner[2]);
							break;
						case "limit":
							limitResults(match_inner[2]);
							break;
						}
						match_inner = re_inner.exec(match[2]);
					}
				}
				// push accumulator onto results stack
				for (var i=0; i<accumulator.length; i++) {
					results.pushUnique(accumulator[i]);
				}
				accumulator = [];
				match = re.exec(filter);
			}
		}
		return results;
	};
	var results = [];
	if(filter) {
		var delimiter = "|";
		var inc = delimiter.length;
		var start = 0;
		var end = findRawDelimiter(delimiter,filter,start);
		while(end!=-1) {
			results = filterTiddlers(filter.substr(start,end),results);
			start = end+inc;
			end = findRawDelimiter(delimiter,filter,start);
		}
		results = filterTiddlers(filter.substr(start),results);
	}
	return results;
};

// Move this to config.messages once approved
merge(config.messages,{
	filterSortError:"Error in tiddler filter expression: '[-sort[field]]' is invalid; use '[sort[-field]]' instead"
});

} //# end of 'install only once'
//}}}
!Purpose
For more general learning about this manual see [[Using the Manual]].  This page is to explain how to find your way around the manual (the AMBIT theme) so you can locate what you want quickly, and share it with others ([[SNAPSHOT]].)

!Finding what you want: the [[Sidebar]]
Most of what you need is located on the [[Sidebar]] to the left of the screen... Learn how to use this!

* There is a [[Search]] function.
* There is a [[History recorder]] that tracks content you have previously opened in a session.
* There is a [[Currently Open]] list, that records all the pages open on your [[Desktop]] right now
** Beside this is the [[SNAPSHOT]] button to record these as a single URL (web address), so they can be reopened at a later date (or shared with a colleague if you send the web address to them by email.)
* There is a [[Contents/Sitemap]] 
!Other useful contents and functions:
* There is an [[Index]] to sort and list content in different ways
* There is a [[Glossary]] to list and explain jargon
* Some versions of these manuals make it easy for local teams to make local, adapted versions.  If this is so, you may want to FIND YOUR OWN STUFF: go to [[List LOCAL EDITS to the manual]] to find just the pages that you have written listed out.

ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
!Welcome!
Click on where you want to go (or scroll down for more content.)
[img[AMBIT Manual Front Door|http://ambit-theme-v3-test.tiddlyspace.com/getting-started-icons.png]]<<imageMap MapFrontDoor>>
!Explore AMBIT in a diagram 

(click me!)

[img[AMBIT Core Features|http://ambit-theme-v3-test.tiddlyspace.com/mentalizing-cross.png]]<<imageMap MapWheel>>
!@@color(red):Who is this manual for?@@

This manual is primarily for WORKERS, but it is OPEN SOURCE so that if clients or other interested parties are interested they are welcome to look, too.  See [[Who is this manual for?]] and [[Current versions of the AMBIT manual]].

!@@color(red):Specific tasks@@

*''[[I want a brief introduction to AMBIT|AMBIT: an overview]]''
*''[[I want to learn about using this TiddlyManual|Using the Manual]]''
*''[[I am just starting work with a client|INITIAL PHASE]]''
*''[[I am already working with a client; where next?|INTERVENTION PHASE]]''
*''[[I want to look up a specific piece of information, or surf and browse|Find your way around]]''
*''[[I just want to fill an AIM questionnaire|AIM Form]]''
*''[[I am authorized to edit to our local team's manual]]''
*''[[None of the above!]]''

!Work in Progress

The content of this manual and its layout is continually being updated and improved (your [[Feedback please!]] will help this.)  The [[Authors]] see this as a dynamic, working document, not a product set in stone; feedback helps us to improve its shape and coherence.  If needed (e.g. for formal intervention trials) it is possible to separate out a 'fixed' version.  You can keep a track of recent changes (last 21 days) in content here: <<recentChanges 21>>

!Important Legal stuff:

There are important issues relating to [[Security and authorization]] to use this manual, and by going on into the manual you are agreeing to abide by the rules laid out.

!Feedback:

You are invited to give [[Feedback please!]] 

Related content in the manual can be found using the button on the top left of this tiddler. 
/%

Hello,

If you choose to change this GettingStarted tiddler, you may wish to add the following to your new content if you expect you space to be included:

<<<
----
Hello,
''This ~GettingStarted tiddler has been customized.''
If you want to see the original system tiddler just click the following link: GettingStarted@system-info at system-info.
<<<
%/

Welcome to your brand new [[TiddlySpace|http://docs.tiddlyspace.com/TiddlySpace]].

You're almost ready to go, there are just a couple of things left to do.

!Customise your space
Go to [[SpaceSettings]] to finish customising  your space. When you're done, come back here (just scroll up). Don't worry though, this will still be open when you've finished.

!Further Customisation

For advanced options, the [[ServerSettings]] tiddler is used to enable the following features:

#index: The value is the name of a tiddler that will be presented when loading the space.  For example, when set to {{{Hello}}} for the space hello.tiddlyspace.com, navigating to that URL will present the Hello tiddler. If there is no {{{Hello}}} you will get an error.
#editor: The name of an [[editor application|http://docs.tiddlyspace.com/Example%20Tiddler%20Editors]] to edit tiddlers with.  Applications come from [[included spaces|http://docs.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F]]

//If you do not need or understand these features there is no need to create a ServerSettings tiddler.//

To edit these options: 

* click [[here|ServerSettings]] to open the [[ServerSettings]] tiddler
* click on the edit button (the pencil icon)
* add the options you wish to set 
* click on the save button (the tick icon).

An example [[ServerSettings]] tiddler:
{{{
index: HelloThere
editor: /edit#{tiddler}
}}}

The additional text after /edit allows a tiddler to be opened in edit mode e.g:
{{{http://hello.tiddlyspace.com/edit#MyTiddler}}}

!!See Also

* [[ServerSettings shadow tiddler|http://docs.tiddlyspace.com/ServerSettings%20shadow%20tiddler]]
* [[Choosing a non-TiddlyWiki Default Application for your Space|http://docs.tiddlyspace.com/Choosing%20a%20non-TiddlyWiki%20Default%20Application%20for%20your%20Space]]

!Finished customising?
You can [[Start writing]] some [[tiddlers|http://docs.tiddlyspace.com/Tiddler]].
If you're not done tweaking yet though, you can always [[Customise this space|SpaceSettings]] a bit more.

You can also [[access and read other tiddlers in various ways|http://docs.tiddlyspace.com/Viewing%20Tiddlers]].

!Administration
If you'd like to change your password or create another space, visit "Your Account" from the [[Universal Backstage|http://docs.tiddlyspace.com/UniversalBackstage]] (the blue dot in the upper right of the page). If you'd like to add a member or [[include a space|http://docs.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F]] visit "This Space" from the [[Universal Backstage|http://docs.tiddlyspace.com/UniversalBackstage]].

You can have as many spaces as you like and each space can have as many members as you or your group need.

!Stuck?
If you're stuck, and would like some help, please visit the [[help|http://help.tiddlyspace.com]] space, which can point you in the right direction.
/***
|''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));
//}}}
!!@@color(blue):Headings@@
!!!What you type in the edit box...
{{{
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
}}}
!!!...and what you see in the ordinary "viewing mode"...
<<<
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
<<<
!What is help?!
Delivering therapy is all about //finding ways to help//, and for our clients to find ways to //be helped//.  In the @ambit manual there is a lot of material relating to the [[Relationship to help]] that you can explore.

!Help with this *!?$&*%ing web manual!

There is lots of help for the user of a TiddlyManual at [[Using the Manual]] - have a look there first.

Give us [[Feedback please!]] if you are still stuck; we will try to respond asap but bear with us, the AMBIT project is not resourced to be a full scale IT support service!

!SOURCES OF TECHNICAL HELP

!!!Tiddlymanuals discussion group

There is a (currently not much used, but the more the merrier) Google Group for discussion of tiddlymanuals and ambit.  You will need to request an invitation to join this group when you first go there.  Click on the link below, and you will be able to do this.

[[Visit the ambit-tiddlymanuals Google Group|http://groups.google.com/group/ambit-tiddlymanuals]]

!NOT a helpline!

The ambit project does not have the resources to run a technical helpline, although we will try to be helpful wherever we can - contact us at the [[Anna Freud Centre]].  If you get stuck with a technical problem you can generally find the solution inside the manual under [[Using the Manual]] or [[Understanding TiddlyManual format]], and we'd prefer you to try first with these other sources of help:

!!!Answers to Technical problems - Tiddlyspace Google Group:

TiddlyWiki is driven by a large and extremely helpful community of programmers, who are generally very happy to share their expertise and via the [[TiddlyWiki Google group|http://groups.google.com/group/tiddlywiki]] they are usually quick to respond to even the simplest and least technically-adept questions!  If you are not a "techie" don't worry, just say so; the tiddlyspace project is trying very hard to simplify things so that more non-technical users can use it with ease, so your experience is extremely valuable feedback for the community.

If you post to this group:

* ''Title'' your help request as clearly as you can (it's like [[Marking the Task]] for @ambit!)
* Tell them ''who you are'' and that ''this relates to the AMBIT project'' (the AMBIT community is an important group of "end-users"for the Tiddlyspace community.) 
* Remember that ''the TiddlySpace community is a voluntary group'', and will mostly be helping you fix things just because they are being helpful - so hold back if you are frustrated!
* Tell them briefly what you are stuck with, and give them the website URL (the address in your browser bar) so they can have a look.
*  If you can, tell them what browser you are using (Internet Explorer, Firefox, Safari, etc) and better still which VERSION you are using (look under the Help in your browser, and select "About Windows Explorer" etc, to find this.
* Tell them whether you are on a Mac or a PC and if you can what operating system (eg windows XP, or Windows 7, etc) this will all be helpful.
* in general questions get answered amazingly quickly as the Tiddlyspace community is worldwide, and lots of the common glitches are well understood.

!More technical advice:

You can also go to the [[TiddlyWiki website|http://www.tiddlywiki.com]] which has lots of links to other sources of help, as an open source project.

Well done! You now see how quickly and easily a new chunk of MicroContent (known In TiddlyWiki language as a [[Tiddler]]) appears, and how easy it is to get rid of it once you have read it. As you pass your computer cursor over this Tiddler, its own one of a set of different [[Menus]] appears on the right hand side, just above it.  Click on "[[Close]]" and this Tiddler will disappear.
Remember that all the pages ([[Tiddler]]s) in this manual are actually part of ONE single web-page, so the "Backwards", "Forwards" and "History" buttons on your BROWSER are of no use to you in a tiddlymanual.  (Incidentally, clicking F11, or selecting View > Full Screen to hide the browser and make more room for the manual is a useful trick.)  
So, instead of accessing the History via the browser you do it from the the left hand [[Sidebar]], where you will see a panel titled "History": this records and lists the title of each [[Tiddler]] you open during a session in the manual.  
Think of this as //the piece of thread that you unravel as you go into the labyrinth// - it can be useful to remember where you have been during a session, and to re-trace your steps or revisit any content you have closed earlier.  When you click on any title stored in the history widget, you will re-open that tiddler.
!Use [[SNAPSHOT]] to remember/share history
When you close the whole manual (or click "refresh" on your browser) the history will be lost, so if you want to share a page or collection of pages that you have opened, use the [[SNAPSHOT]] button (in the [[Currently Open]] panel, just beneath the History recorder.)
/*{{{*/
(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);
			};
		}
	};
}());

/*}}}*/

It is worth spending a little time to familiarise yourself with this material.  

!Video tour

[[Video tour of the AMBIT manual]] gives you a quick look around the main features of the manual.

Beginners will particularly want to check they understand the [[Sidebar]], how to use [[Links]], and to open and close [[pages|Tiddler]] in this [[TiddlyManual]], and how to use the various [[Menus]] that are available.

!Links don't open pages?!

You will notice that if you click a link the page you are after doesn't automatically open straight away: instead the link appears to fly off towards the sidebar, and nothing else much happens:
>//Grrrrrr! Where's my page?!//
This is the most obvious difference between a TiddlyManual and a conventional website.  Your page HAS opened, but it hasn't immediately flipped you out of the page you are reading - instead it has joined an orderly queue - your 'reading list', if you like, or your //Chapter-for-today//...
>//So where IS it?!//
The link you clicked actually //has// already opened on your [[Desktop]], but it has opened at the //bottom of the list// of pages that you have opened so far... If you scroll down to the bottom of this [[page|Tiddler]] you'll find it there waiting for you, or if you click its title in the '[[Currently Open]]' list in the [[Sidebar]], you'll jump straight there.
>//What is the POINT of that?!  It's irritating!//
We found that people reported getting less sense out of what they were reading if clicking a link immediately "threw" them out of the page they were reading and onto a completely new page... 

Arranging things the way we have means that you can focus on what you are currently reading, and //simply 'line up' what you want further detail on for later...//  It is as though you generate the chapter you are interested in reading //as you go//.  

You can jump direct from page to page in 'your' individually-selected chapter by clicking the links to pages in your [[Currently Open]] list.  It takes a bit of getting used to but we hope that once you have got used to it, you actually find the reading experience less 'dizzying', and that it is easier to absorb material.

!Show me round!

Have a quick look at the screen you are faced with.  There are three main bits - the ''Title bar'' at the top, the [[Sidebar]], and the main area, the [[Desktop]]. It is worth spending a little time to understand how these work if you plan to spend any time referring to tiddlymanuals.

!To the LEFT: the Sidebar
The [[Sidebar]] is the right hand border of your screen, it is there to help you [[Find your way around]], and //share useful material// that you find in the manual.  working down from the top, you will find:
*The [[SNAPSHOT]] helps you share content you've opened here with other people.
*The [[Search]] box - one of of the key ways to [[Find your way around]]
*The [[History recorder]] to track and revisit where you have been.
*The [[Currently Open]] list shows what pages (or "[[Tiddler]]s") you currently have open.
*The [[Contents/Sitemap]] lays out the content - click the [+] to show sub-topics.

!The [[Desktop]]
The [[Desktop]] is the main space on your screen - where you open [[Tiddler]]s, the 'pages' within this document.  It behaves in ways that are worth understanding.

!TOP: the Top Menu bar

The [[Top menu bar]] offers extra [[Menus]] for functions that are mostly for more advanced users, for instance if you want to [[Download a copy!]] or to [[Switch the "status" of tiddlers from Private to Public, or vice versa]]
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
A hyperlink is a link that you can click on which points your browser at another web page outside the manual itself - most browsers nowadays open hyperlinks in a separate window, or a separate "tab" on your browser.

To place a hyperlink in a [[Tiddler]] you are [[Edit]]ing just follow these directions:

The simplest way is just to copy the URL (the "address") of the page you want to hyperlink to from the address bar at the top of your browser, and paste it into your Tiddler!

To do it in a slightly fancier way (good if the URL is very long and doesn't really describe what the page is that it refers to) you can open double square brackets with the name or your own description of the page you are linking to, followed by a vertical line ( | ) and then paste in the URL, and close the double square brackets.  So in the [[Edit]] mode of the tiddler it would look like this:

@@{{{[[The website of the Royal College of Psychiatrists|http://www.rcpsych.ac.uk/]]}}}@@ 

Once you have clicked "done" it will look (and work) like this:

[[The website of the Royal College of Psychiatrists|http://www.rcpsych.ac.uk/]]
/***
|''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|ImageMapPlugin|
|Source|http://www.TiddlyTools.com/#ImageMapPlugin|
|Documentation|http://www.TiddlyTools.com/#ImageMapPluginInfo|
|Version|1.2.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|apply image maps ('hotspots') with links to tiddlers|
!!!!!Documentation
>see [[ImageMapPluginInfo]]
!!!!!Revisions
<<<
2009.05.27 [1.2.2] improved autoscroll for {{{<<mapMaker>>}}} textarea
2009.05.14 [1.2.1] added cursor changes
see [[ImageMapPluginInfo]] for additional revision details
2009.05.09 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImageMapPlugin= {major: 1, minor: 2, revision: 2, date: new Date(2009,5,27)};
//}}}
//{{{
config.macros.imageMap = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		// image element must immediately precede macro
		var img=place.lastChild; if (!img||img.nodeName!='IMG') return;
		var map=params[0]; var items=store.getTiddlerText(map,'').split('\n----\n'); if (!items) return;
		var out=['<MAP NAME="'+map+'">'];
		var fmt='<AREA SHAPE="POLY" TIDDLER="%0" COORDS="%1" TITLE="%2" ALT="%2" ONCLICK="%3" STYLE="%4">';
		var click="story.displayTiddler(story.findContainingTiddler(this),this.getAttribute('tiddler'));";
		var style='cursor:pointer';
		for (var i=0; i<items.length; i++) {
			var lines=items[i].split('\n'); var tid=lines.shift(); var coords=lines.join('');
			var tip=store.tiddlerExists(tid)?store.getTiddler(tid).getSubtitle():tid;
			out.push(fmt.format([tid,coords,tip,click,style]));
		}
		out.push('</MAP>');
		createTiddlyElement(place,'span').innerHTML=out.join('');
		img.setAttribute('isMap',true);
		img.setAttribute('useMap','#'+map);
		img.style.border=0;
	}
}
//}}}
//{{{
config.macros.mapMaker= {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var img=place.lastChild; // image element must immediately precede macro
		if (!img||img.nodeName!='IMG') return;
		img.onmousemove=function(ev){ ev=ev||window.event;
			var mX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var mY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var ta=this.nextSibling.getElementsByTagName('textarea')[0];
			var lines=ta.value.split('\n'); var last=lines.length?lines.length-1:0;
			var vals=lines[last].split(','); vals.pop(); vals.pop(); lines[last]=vals.join(',');
			lines[last]+=(lines[last].length?',':'')+(mX-findPosX(this))+','+(mY-findPosY(this));
			ta.value=lines.join('\n');
			ta.scrollTop=ta.scrollHeight-ta.offsetHeight+this.emH*2;
			ta.scrollLeft=lines[last].length*this.emW-ta.offsetWidth;
			ta.focus();
		};
		img.onmouseout=function(ev){ ev=ev||window.event;
			var ta=this.nextSibling.getElementsByTagName('textarea')[0];
			var lines=ta.value.split('\n'); var last=lines.length?lines.length-1:0;
			var vals=lines[last].split(','); vals.pop(); vals.pop(); lines[last]=vals.join(',');
			ta.value=lines.join('\n');
			ta.scrollTop=ta.scrollHeight-ta.offsetHeight+this.emH*2;
			ta.scrollLeft=lines[last].length*this.emW-ta.offsetWidth;
		};
		img.onmouseover=img.onclick=function(ev) { ev=ev||window.event;
			var mX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var mY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var ta=this.nextSibling.getElementsByTagName('textarea')[0];
			ta.value+=(ta.value.length?',':'')+(mX-findPosX(this))+','+(mY-findPosY(this));
			var lines=ta.value.split('\n'); var last=lines.length?lines.length-1:0;
			ta.scrollTop=ta.scrollHeight-ta.offsetHeight+this.emH*2;
			ta.scrollLeft=lines[last].length*this.emW-ta.offsetWidth;
			ta.focus();
		}
		img.style.border='1px solid #999';
		img.style.cursor='crosshair';
		var map=params[0]||'';
		var s=createTiddlyElement(place,'div');
		s.style.height=s.style.width='1em';
		img.emW=s.offsetWidth; img.emH=s.offsetHeight; // get font metrics (for auto scrolling)
		s.style.height=s.style.width='';
		s.innerHTML+='<div class="toolbar">'
			+'<a href="javascript:;" '
			+'onclick="config.macros.mapMaker.load(this.parentNode.nextSibling)">load map</a>'
			+'<a href="javascript:;" '
			+'onclick="config.macros.mapMaker.save(this.parentNode.nextSibling)">save map</a>'
			+'</div>'
			+'<textarea rows="8" style="display:block;clear:both;width:100%;" tiddler="'+map+'">'
			+store.getTiddlerText(map,'')
			+'</textarea>';
	},
	load: function(ta) {
		var tid=prompt('Enter a tiddler title:',ta.getAttribute('tiddler')||'');
		if (!tid||!tid.length) return; // cancelled by user
		ta.value=store.getTiddlerText(tid,''); ta.setAttribute('tiddler',tid);
		return false;
	},
	save: function(ta) {
		var tid=prompt('Enter a tiddler title:',ta.getAttribute('tiddler')||'NewImageMap');
		while (tid && tid.length && store.tiddlerExists(tid)) {
			if(confirm(config.messages.overwriteWarning.format([tid]))) break;
			var tid=prompt('Enter a different tiddler title:',tid);
		}
		if (!tid||!tid.length) return; // cancelled by user
		store.saveTiddler(tid,tid,ta.value,config.options.txtUserName,new Date(),['imageMap'],{});
		story.displayTiddler(null,tid);
		displayMessage('image map saved to: '+tid);
		ta.setAttribute('tiddler',tid);
		return false;
	}
}
//}}}
/***
|Name|ImageMapPluginInfo|
|Source|http://www.TiddlyTools.com/#ImageMapPlugin|
|Documentation|http://www.TiddlyTools.com/#ImageMapPluginInfo|
|Version|1.2.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for ImageMapPlugin|
!!!Usage
<<<
{{{
[img[...]]<<imageMap MapName>>
}}}
applies an image map to the embedded image immediately preceding the macro.   ''~MapName'' is the title of a tiddler (or a tiddler section) that contains an ''~HR-separated list'' of items, where the first line of each item is the ''tiddler to link to'' and the second line is a ''list of polygon coordinates'' using standard HTML <AREA COORDS="..."> syntax (e.g., a ''comma-separated series of X,Y pairs'': "x1,y1,x2,y2,x3,y3,...", that trace out the desired shape).
{{{
[img[...]]<<mapMaker MapName>>
}}}
adds interactive point-and-click calculation of X,Y map coordinates that are automatically entered into a text input field that you can then edit and save to a tiddler to create an ~HR-separated map definition.
<<<
!!!imageMap Example
<<<
{{{
[img[images/california.gif]]<<imageMap ImageMapPluginInfo##county_map>>
}}}
~~//(click a county to open a tiddler)//~~
[img[images/california.gif]]<<imageMap ImageMapPluginInfo##county_map>>
<<<
!!!mapMaker example
<<<
{{{
[img[images/california.gif]]<<mapMaker ImageMapPluginInfo##county_map>>
}}}
~~//(click anywhere inside image to record x,y coordinates)//~~
[img[images/california.gif]]<<mapMaker ImageMapPluginInfo##county_map>>
<<<
!!!Revisions
<<<
2009.05.14 1.2.1 added cursor changes
2009.05.13 1.2.0 add MAP/AREA elements using innerHTML
2009.05.12 1.1.1 fixed mapMaker event handling for IE
2009.05.10 1.1.0 added {{{<<mapMaker>>}}}
2009.05.10 1.0.1 open tiddlers following current tiddler instead of at top of story column
2009.05.09 1.0.0 initial release
<<<
!!!Sample Map
<<<
{{{
!county_map
San Francisco
50,231,51,225,54,222,55,226,55,231,50,231,50,231
----
San Mateo
59,252,60,242,58,239,55,238,54,232,49,233,50,240,50,244,50,249,54,253,59,252,59,252
----
Santa Clara
94,242,90,244,80,243,75,242,66,243,60,243,58,251,63,255,70,258,75,270,79,268,95,268,97,260,97,254,94,254,93,252,97,250,94,248,95,246,94,242,94,242
----
Alameda
94,223,95,242,90,243,80,242,75,241,65,242,66,235,63,225,70,224,80,226,94,221,94,224,95,225,95,231,94,223,94,223
----
Contra Costa
97,213,97,221,83,226,69,224,63,224,62,220,67,214,73,217,79,214,98,214,96,214,97,213,97,213
----
Santa Cruz
53,254,59,251,63,255,70,258,75,268,73,273,68,273,67,266,53,254,53,254
----
San Benito
117,292,116,302,114,304,110,302,111,307,104,304,101,306,91,292,91,288,87,288,87,285,73,273,75,271,78,269,96,270,116,292,117,292,117,292
----
Monterey
128,325,86,325,83,319,83,313,78,309,78,305,64,286,64,283,67,282,67,273,73,273,87,284,86,288,90,287,91,292,101,305,104,303,110,306,113,303,126,318,128,325,128,325
----
Fresno
123,266,133,278,149,271,164,269,170,261,176,261,176,257,181,258,182,254,190,252,194,245,203,237,211,243,213,248,211,253,218,267,221,276,215,276,214,278,195,278,195,282,179,282,177,285,166,285,162,289,154,291,152,294,146,294,146,302,126,318,116,304,118,302,116,299,117,290,106,278,123,265,123,266,123,266
----
Merced
114,249,117,245,142,238,145,245,148,249,153,251,152,256,143,256,136,258,130,262,125,263,106,278,96,269,97,261,99,255,113,250,114,249,114,249
----
Madera
167,243,173,243,174,239,178,238,179,234,192,227,194,228,193,235,198,232,203,236,192,245,188,252,180,254,180,258,172,257,175,261,168,260,163,269,146,270,132,278,122,266,124,263,130,262,135,258,142,256,151,256,152,252,167,243,167,243
----
Kings
162,324,161,303,164,302,164,295,162,294,162,289,153,291,151,295,146,295,146,303,128,318,128,325,161,324,162,324,162,324
----
Tulare
232,324,233,316,234,314,229,310,229,303,228,299,230,296,219,276,213,276,212,279,193,278,193,282,177,282,176,286,164,285,161,289,163,295,164,303,160,304,161,325,232,324,232,324
----
Mono
183,182,183,188,185,194,181,200,181,209,185,211,185,213,191,218,191,224,196,227,194,235,198,233,203,236,211,243,243,243,183,182,183,182
----
Inyo
241,243,320,324,233,324,233,317,235,314,229,310,229,303,228,299,231,295,220,276,217,267,211,253,213,247,211,242,242,244,241,243,241,243
----
San Luis Obispo
111,348,97,340,86,325,127,325,129,332,139,341,144,343,145,346,150,348,156,354,156,358,159,360,161,368,157,371,153,364,136,358,133,354,131,360,126,362,126,366,120,363,112,364,111,356,106,353,112,348,111,348,111,348
----
Santa Barbara
121,387,117,383,111,381,111,365,121,362,127,367,125,362,132,360,135,353,137,359,154,365,157,372,161,368,164,372,163,394,143,390,126,384,121,387,121,387
----
Ventura
186,402,175,401,163,395,163,372,166,369,172,371,177,376,186,376,193,397,186,402,186,402
----
Los Angeles
205,409,184,402,193,397,186,376,234,376,236,388,238,408,232,416,222,420,217,424,211,420,205,409,205,409
----
Kern
240,325,128,325,130,334,139,342,150,348,159,359,162,370,167,368,176,377,235,375,237,374,239,343,241,341,241,325,240,325,240,325
----
San Bernardino
392,401,320,324,240,325,241,342,238,345,236,374,234,377,237,407,256,422,264,413,290,414,303,417,386,414,390,409,392,401,392,401
----
Riverside
379,441,388,429,387,412,303,417,289,414,263,413,255,421,260,424,260,428,265,428,265,436,271,438,275,443,352,444,379,442,379,441,379,441
----
Orange
258,441,221,421,232,415,237,407,255,421,259,424,260,428,266,428,265,438,258,443,258,441,258,441
----
San Diego
322,482,284,484,280,475,276,464,270,451,258,440,264,437,272,438,275,443,283,445,321,444,321,483,322,482,322,482
----
Imperial
378,480,321,482,322,445,378,443,382,451,378,461,383,468,382,475,378,480,378,480
----
Stanislaus
113,229,95,240,98,257,113,249,118,244,141,237,132,228,127,214,124,230,112,229,113,229,113,229
----
Mariposa
168,228,154,225,151,228,148,227,147,231,144,231,145,236,141,237,143,245,151,254,165,242,172,243,172,238,177,238,177,234,191,227,194,226,189,224,184,221,181,223,178,220,169,229,157,226,153,226,151,229,152,229,168,228,168,228
----
Alpine
173,172,172,176,164,180,164,192,179,201,185,194,183,181,173,173,173,172,173,172
----
Calaveras
125,203,127,214,132,223,144,220,165,195,163,191,158,194,150,194,135,203,125,203,125,203
----
San Joaquin
108,205,97,213,97,222,94,225,95,240,113,229,124,229,127,215,125,203,120,206,107,206,108,205,108,205
----
Amador
125,189,126,194,125,203,135,203,150,194,158,194,163,191,164,179,154,186,142,189,124,189,125,189,125,189
----
Sacramento
83,212,96,213,107,205,118,205,124,203,125,195,123,188,120,180,104,180,106,189,103,197,102,203,94,206,93,210,79,212,83,212,83,212
----
Yolo
102,174,98,174,97,170,92,165,68,164,74,178,79,181,81,189,91,190,93,187,97,187,99,197,104,197,106,189,104,180,102,174,102,174
----
Solano
79,197,72,204,73,209,82,211,94,210,95,205,103,203,104,196,98,196,97,186,91,187,90,190,80,189,78,193,79,197,79,197
----
Napa
58,177,59,183,65,192,65,205,71,204,79,197,77,192,80,188,78,181,73,178,67,164,64,166,64,173,58,177,58,177
----
Sonoma
24,168,48,165,56,175,57,182,64,192,64,203,45,198,43,191,32,180,31,176,23,168,24,168,24,168
----
Marin
44,210,50,212,52,216,57,218,60,217,59,212,62,210,64,203,46,199,43,209,44,210,44,210
----
Tuolumne
165,195,144,219,131,223,132,227,142,237,146,236,145,230,149,230,149,226,154,228,155,225,169,228,178,220,182,222,185,221,190,225,190,218,185,213,185,210,180,209,180,200,165,193,164,196,165,195,165,195
----
Mendocino
10,107,16,116,16,126,15,132,20,151,21,161,24,169,50,165,43,158,46,155,46,150,43,145,45,137,53,132,53,114,56,109,11,108,10,107,10,107
----
Humboldt
21,38,17,50,19,59,12,70,9,70,1,85,2,92,10,107,31,108,33,73,32,65,39,65,39,59,45,53,43,51,44,42,33,43,30,37,21,37,21,38,21,38
----
Del Norte
24,14,19,24,20,37,29,37,32,43,37,42,38,37,35,34,42,31,43,21,50,15,24,14,24,14
----
Siskiyou
130,19,51,15,44,21,43,31,36,33,39,37,38,43,43,42,42,50,45,53,54,57,55,61,59,61,59,65,64,61,69,63,67,54,71,52,76,54,80,48,90,46,90,55,131,57,132,31,129,30,130,19,130,19
----
Modoc
183,22,130,19,131,57,179,60,182,22,183,22,183,22
----
Trinity
56,98,57,102,55,105,55,109,31,108,33,72,31,65,39,65,40,58,44,52,54,57,55,61,58,61,58,65,65,61,69,63,67,53,71,52,76,55,79,47,90,46,90,55,90,59,75,70,70,84,56,98,56,98
----
Shasta
124,95,120,96,115,94,111,96,94,96,83,97,78,95,71,98,67,96,57,98,69,84,74,70,90,59,89,54,131,57,132,93,124,95,124,95
----
Tehama
130,105,125,110,109,116,104,122,93,122,93,124,53,122,53,114,57,108,55,106,56,101,56,97,65,96,71,98,77,95,84,98,94,97,112,96,116,94,120,96,123,95,126,98,126,101,130,105,130,105
----
Lake
64,150,67,162,64,167,64,173,58,178,50,164,42,159,46,154,46,149,43,145,45,137,52,133,55,131,61,132,61,141,55,141,54,143,57,149,63,151,64,151,64,150,64,150
----
Colusa
95,143,92,149,92,156,94,164,67,163,64,151,57,149,53,143,56,141,83,142,84,140,87,141,89,143,95,143,95,143
----
Glenn
99,131,97,133,97,137,101,139,96,143,89,143,86,141,82,140,82,142,60,142,61,132,55,131,53,123,92,123,99,131,99,131
----
Sutter
113,166,111,170,111,179,103,180,102,174,97,173,97,169,93,164,92,156,91,149,108,151,108,157,113,166,113,166
----
Butte
120,143,115,144,115,146,107,151,91,149,95,143,101,139,96,137,96,132,99,131,92,123,102,122,109,116,125,109,128,117,126,124,130,128,132,135,126,140,121,138,120,143,120,143
----
El Dorado
170,160,163,160,157,164,149,164,148,167,131,166,122,177,126,188,143,188,155,185,162,180,172,176,173,172,170,169,170,160,170,160
----
Placer
171,152,146,151,138,158,135,158,129,163,121,161,113,165,111,170,111,179,120,179,122,177,131,166,146,168,150,164,157,164,163,161,171,160,171,153,171,152,171,152
----
Yuba
135,145,131,145,129,148,124,150,122,159,113,166,108,157,108,151,115,146,115,143,122,143,120,139,127,140,133,135,135,134,135,145,135,145
----
Nevada
172,143,150,142,146,139,136,144,131,144,129,148,124,150,122,161,130,164,136,157,138,158,146,151,170,152,171,143,171,144,172,143,172,143
----
Sierra
172,131,145,130,139,126,134,134,134,145,145,139,150,143,172,144,173,131,172,131,172,131
----
Plumas
141,94,124,94,126,102,130,105,125,110,128,117,126,124,130,129,132,134,140,126,145,130,168,131,171,124,169,117,154,102,149,103,148,106,141,102,141,93,141,94,141,94
----
Lassen
177,93,174,130,167,131,170,124,169,115,153,101,148,104,148,106,141,103,141,93,132,93,131,59,179,60,176,94,177,93,177,93
!end county_map
}}}
<<<
***/
 
/***
|''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);
//}}}
This is for advanced users only.

!!!If you want to include a separate space in your space:
*Ensure you are [[logged in|Log in]]
*You can only include a separate space into one that you are a [[member|Making someone a member of a space]] of. 
*Go to the [[Space menu]]
*Select the tab ''"Includes"''
*Write the name of the space that you want to //include// in the textbox there:
**You need to stick to lower case text
**preface the name of the space with an @ sign (so for instance {{{@ambit}}})
*click the button ''"Include space"'' - the wiki will need to reload (refresh) for the new space to appear.
!!!If you want to remove a previously included space
*You will see the list of included spaces (usually these are just 'systems' spaces, to make the wiki behave in predictable ways, so beware un-including these!) - click the red X beside the space you want to remove.  Done.
!!About the Index
Learn [[About the Index]]
!!As well as the Index...
There is a [[Glossary]] of technical terms that we use, and because all the pages have [[Links]] (or "references") to one another, we can list out the 30 ''most-referenced pages'' here (the bigger the page title, the more references to it).  Click on any of the page titles to see a drop-down list of all the references to it in the manual:
|bgcolor(lightblue): <<cloud references action:popup limit:30>> |
!Now here's the Index:
Pages listed as "Public" are the ones YOUR TEAM has authored in ''this local version'' of the manual
<<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
>>
Put some text introducing the reader to the CYP-IAPT manual, and the resources it contains.  

!Useful links:
* [[Using the Manual]]
* [[Index]]

!Note to site developers
Follow the <<tag [[NeedsWork]]>> tags for areas that need work!
/*
    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.$);
When you select "Jump" in the [[menu|Menus]] for a tiddler, a drop down list will appear - of all of the //other tiddlers// that you currently have open on your desktop.  Selecting one of these titles will immediately jump you to that tiddler.
Consider how you want the content that you wish to add to be licensed.

For instance, AMBIT uses a Creative Commons License (see an external link to its terms [[Here|https://creativecommons.org/licenses/]]) but your ~CYP-IAPT material may be released under different terms than these?

A Link is what has opened this new [[Tiddler]] from within the last one; Links take the form of HighlightedWords, and anyone familiar with the internet will know what they are.  A single click on the word opens the linked Tiddler ( think of it as a 'page' or 'note').

In general a Link denotes an immediate and specific association between material in one Tiddler and material in the other one, whereas [[Tags]] denote thematic connections under which a whole range of sub-topics may sit (think of Tags as chapter-headings, and Links as footnotes, if you like.)

You can check which other Tiddlers have Links to the one you are reading by clicking on the [[References]] section of the individual Tiddler menu (see the additional or related information section.)
!More about links
There is a bit more detail on making links and cleverer ways of making links at [[Links and Shortcuts to making them]]
* A WikiWord (with a capital in the middle of it) is automatically transformed into a [[Link|Links]] to a tiddler with the same title.  
** We used these quite a lot in the early stages of writing content, but it makes for an odd reading experience (words apparently jammed together) so we are slowly removing them and using ordinary language links...
** this automatic transformation can be //suppressed// by preceding the respective WikiWord with a "tilde" (i.e. one of these: ~ ): so if I type the letters: {{{~WikiWord}}} ...then it WON'T become an automatic link in the page (look: ~WikiWord.)
* [[Pretty Links]] that can include spaces and look like "ordinary" text are just ''text that is enclosed in double square brackets'' which contain the desired tiddler name
**e.g.: {{{[[Pretty Links]]}}}
** That makes a link to [[Pretty Links]]...
* Optionally, a custom title or description can be added, separated by a "pipe character" ( the vertical line - {{{|}}})): {{{[[page title that shows in the text|target page that opens when you click]]}}}<br>'''N.B.:''' In this case, the target can also be any website (i.e. URL) - i.e. you can make an external link to the tiddlymanuals site like [[this|http://www.tiddlymanuals.com]] by using this code: {{{[[this|http://www.tiddlymanuals.com]]}}}.
!What's here?
|bgcolor(lightgray):''1.'' NEW local content sorted by TOPICS |
|bgcolor(lightgray):''2.'' ALL local material (including pre-existing pages that have been edited locally) listed alphabetically |
|bgcolor(lightgray):''3.'' Notes on how to edit this page |
!!!1. New local content sorted by topics
Below (this is for for AMBIT services using these manuals - others will want to edit these drop down menus) is a colour-coded list of some of the main topic headings under which your team "files" its new entries if you work from the [[+ Manualize our work]] page. 
Of course there are already pre-existing pages [[tagged|Tags]] with these topic headings, but this still makes it easier to find a page you have previously authored. At the bottom of this page you can find instructions if you want to change the topic headings to suit you needs better.
|bgcolor(pink):<<tag [[Manage RISK]]>> Notes on how we do ''RISK management'' |
|bgcolor(pink):<<tag [[Manage CLIENT RELATIONSHIP]]>> Notes on how we ''manage relationships with clients'' |
|bgcolor(pink):<<tag [[Manage CLINICAL PROBLEM]]>> Notes on how we do ''"field-work" with our clients'' |
|bgcolor(lightgreen):<<tag [[Manage NETWORK PROBLEM]]>> Notes on how we ''work effectively with the network'' |

!!!2. List ALL local edits, alphabetically
Listed below are all the local Edits that YOUR team has made so far.  @@color(green):Note that local edits may be ''__PUBLIC__'' (visible to all) or ''__PRIVATE__'' (only visible if you are MEMBER of the space, and are logged in).  If you have editing rights (are a [[member|Making someone a member of a space]] of this [[Space|Spaces]]), then it is easy to [[Switch the "status" of tiddlers from Private to Public, or vice versa]].  We advise that teams just publish publicly ("private" is just "out of sight" and NOT encrypted.) You can toggle between the lists of PUBLIC and PRIVATE pages by clicking on the two tabs below.@@
<<tabs
	txtMainTab
	"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
	"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
>>
!!!3. How to edit the content on this page
If you open his page to [[Edit]] it, it does look rather "scary" - don't panic!
* If it all goes wrong, just DELETE your version of this page, and our original one will pop back in its place once you "refresh" the whole manual - you can't break it!
* Don't fiddle with no. ''2. List ALL local edits, alphabetically'' unless you are very clever with coding!
* You can add/delete the topic headings ([[Tags]]) that you want in section ''1. New local content sorted by topics'' quite easily.
** To create a clickable button that generates a "drop down list" of all the pages that are [[Sub-topic]]s of a Particular page (let's call it ''Title of Topic'' - you will have [[tagged|Tags]] all the subtopics with this code: ''{{{[[Title of Topic]]}}}'')  ...you use a simple bit of code:
|bgcolor(pink): <br>''{{{<<tag [[Title of Topic]]>>}}}''<br> |
** Once you finish editing, you will see you have created a new drop down list button!
** ''The other stuff you see'' (stuff like ''|bgcolor(pink):'' and an upright stroke | at the end of the line) is just layout code, to make the pretty pink boxes - //just copy the way this is done in the existing table, but replace the button code as described above.
If you are part of a team that has its own TeamTemplate online (for instance as part of the AMBIT project run from the [[Anna Freud Centre|http://www.annafreud.org/]]), and are [[authorised|Making someone a member of a space]] to make edits to your local version of the manual, then you will have a username and password for TiddlySpace, which allows you to log in and make [[Edit]]s to your online version.

To get a username and password you need to [[Register on TiddlySpace]]

!Logging in

To log on go to the [[Mode and Login panel]], add your user name and password, and click log in
The whole manual will "reload" when you log in.

Once you have logged in, you can access the [[Edit mode]] and [[Advanced mode]] via the [[Mode and Login panel]].
Marn I'm af ndasd a?
<<tree "Introduction [[EBCP Curriculum for Child and Adolescent Mental Health]] [[Index]]">>
This is for advanced users and is not required for day to day use of [[TiddlyManual]]s.

It involves starting an an entirely separate wiki - that you can use for lots of different things (see @dickon for an example) but which are separate from //this// wiki!

*Ensure you are [[Logged in|Log in]] as a user.
*Go to your [[User menu]]
*You will see a button saying ''"Create Space"'' and a box above to give your new space a name.  If the name you choose is already taken then you'll need to choose a new one!

*If you want to work on the current space that you have opened //with someone else//, but you //don't want to make them a member// (which would give them completely equal rights over the content with you) then check the box that says ''"Include the current space in the new space"'' - this will make a new space that [[includes|Including spaces]] the original - you can then make your colleague a member of that space and while your original material remains untouched, the two of you can hack away at the new version to your heart's content.
All [[Web browser]]s allow you to set the homepage - that is the page(s) that open when you first open your browser.  Below we show you how to set which page(s) your browser will automatically open on starting up.
!!!Getting round the corporate homepage
If you are in a corporate system (eg most NHS Trusts, or most organisations, full stop!) it is not uncommon that your web browser will already be set to open with the corporate homepage as your "starting point", and that this will be fixed.

This is fine, and we wouldn't wish to alter this, but most modern browsers can have a number of different "Tabs" open, so that you can have several websites open simultaneously.  What we suggest is that you add your AMBIT manual as an additional tab that will open automatically on start-up.  If your browser has a ''//corporate//'' homepage, then you will probably find it is "locked", and that you have to request permission to add another tab to your homepage from your I.T. department.  If this is awkward, then there is advice on getting [[Organisational support for the technology to run TiddlyManuals]] which might help you argue your case, though in most cases I.T. departments are only too happy to be able to help.

!How to set the homepage

This is slightly different according to what browser you are using, but the principles are the same.
* __First__:  Open up exactly the page(s) that you want to open //automatically// on starting up your browser.
* __Second__:  Look for a menu that is to do with "Settings" or "Options" in one of the drop-down menus on your browser's menu bar.  It may also be signified by a little spanner or cogwheel or list icon. 
* __Third__:  Look for options in that menu to do with //"on start up"// or //"set home page"// etc and select the item about setting new homepages, or "pages to open on start-up"
* __Fourth__:  Find the option "use //current// pages" and select it!
* __Fifth__:  ''Sit back and relax''.  Perhaps close your browser, and then re-open it to check that your work is done.
* __Sixth__:  Offer to show your colleague how to do this, avoiding all outward signs of smug satisfaction, but knowing inwardly that you have achieved yet another of many steps towards mastery.

You can only make changes to a [[Space|Spaces]] if you are member of that space.

!If you are a member of a Space, then you can:

* Make [[Edit]]s to the content of that space
* Add or remove OTHER members to/from that Space
* Do more advanced things such as [[Include|Including spaces]] the public content from other [[Spaces]] in this space, or remove previously included spaces. 

!Adding a new member:

To make someone a member of a space, ensure you are a member of that space yourself, and that you are [[logged in|Log in]].

Obviously, to add a member to your space, they must FIRST have a username to add, which means they have to [[Register on TiddlySpace]].

Then go to the [[Space menu]] (which you find by selecting the [[Advanced mode]] from the [[Mode and Login panel]].)

The [[Space menu]] reveals simple instructions for how to add a member - type their username into the box and click "ADD MEMBER"! 
<script type="text/javascript">
	function yo() {
		alert('yo');
	}
</script>
<!--{{{-->
<link href="/bags/cypiapt_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="cypiapt's public feed" />
<link rel="canonical" href="http://cypiapt.tiddlyspace.com/" />
<!--}}}-->
There are a variety of different menus on the computer screen to help the user navigate around and manage the material in the manual. 

!Individual Tiddler Menus

Each page ([[Tiddler]]) has two of its own menus:

!!!1. Related Information
The [[Show references and info]] menu is accessed by clicking the black box beside the page title, and helps you see how this tiddler fits in to the wider context, listing revisions, references, sub-topics, headings, etc.

!!!2. Tiddler Menu
You find this on the top right corner of each tiddler: 
*[[Edit]] (usually a page with a + sign on it, or a 'pen logo') is only visible if you are logged in, and have the manual switched to "[[Edit]] @@color(red):''mode''@@"
*[[Close]] (an ''X'')

!Menus on the Sidebar

See [[Sidebar]] - these are the functions that help you find your way around, and organise contnet , as well as links to content.

!Menus on the [[Top menu bar]]

The [[Top menu bar]] is only revealed when you switch to [[Advanced mode]] via the [[Mode and Login panel]] - it reveals extra menus that help you organise your wiki, which are rarely required for everyday use: for instance if you wanted to [[Download a copy!]] of your manual, or to [[Switch the "status" of tiddlers from Private to Public, or vice versa]].


MicroContent is a collection of meaningful information delivered in a chunk of about a paragraph's length: It is argued that if an IDEA takes more space than this to explain 'in a nutshell' ...then it is unlikely to be of much practical use to the clinician on the ground. 

The TiddlyWiki format refers to one of these these chunks of MicroContent as a [[Tiddler]].

In the digital world of the web, a collection of 'pages' that are interlinked and which cover a specific area is known as a 'Wiki'- for instance see the online encyclopaedia www.wikipedia.com . Hence the term 'TiddlyWiki'.
This [[Tab|Tabs]] within the [[Index]] lists [[Tiddler]]s that //have links to them, but have not got any content written//.  

For instance [[This one right here...]] - if you click that link it will offer the philosophical conundrum, telling you that "this tiddler does not exist - in that nobody has given it any content - it is 'just a link'!!

Being able to list "missing" tiddlers is quite useful for authors/editors.

|bgcolor(pink): ''NOTE: when you open a "missing" page (tiddler) you will see a message saying //"double click this page to open it for editing"// - THIS WONT WORK in the AMBIT or MBTF manuals, as we have "switched off" the "double-click to edit" function (people got confused when they double clicked by accident and found themselves looking at an editing page!) - INSTEAD switch to [[Edit mode]] and click the "edit icon" in the right hand corner of your page... |
!Where is it?
This is the panel at the top right of your screen.  You will see it as you first open the manual and then it will fold itself away leaving just a small icon:
* a ''@@color(lightgreen):Green reading book@@'' - to denote BROWSING MODE
* a ''@@color(red):Red pen@@'' - to denote EDITING or ADVANCED modes
Tapping on that icon (top right corner of your screen) will make the hidden panel unfold and reveal itself again.
<html><iframe width="640" height="480" src="http://www.youtube.com/embed/BNE2EnOTYPU?rel=0" frameborder="0" allowfullscreen></iframe></html>
!What is it for?
It is where you can [[Log in]] as a member of a particular manual (or "[[space|Spaces]]") and you can set the "mode" to determine how the manual behaves (how much you want to interact with the content).  It is also one place from which you can open a page to give [[Feedback please!]]
!Logging in
See [[Log in]]
!Modes
There are three "modes".
* 1. [[Browsing mode]]: 
If you are not [[logged in|Log in]] then you only have access to the ''BROWSING'' mode.  This is the simplest way to use the manual.  It is just a website to all intents and puposes - you can open and close pages, and that is it.
* 2. [[Edit mode]]: 
If you have logged in then this option will appear.  When you select it you will see that each page ([[Tiddler]]) that opens now has an "edit" icon in the top right corner; clicking this will allow you to start to [[Edit]] content in your manual.
** ''__NOTE__'': Some pages have buttons embedded in the middle of their content to start you off on [[Edit]]ing brand new material (for instance [[+ Manualize our work]], which will generate new pages ready for you to edit...)
**  if you //already// have a page (such as [[+ Manualize our work]]) open when you switch to EDIT MODE, then these buttons won't appear until you have CLOSED that page, and then reopen it (you can look in the [[History recorder]] to find it again.) 
* 3. [[Advanced mode]]: 
This mode opens the [[Top menu bar]] across the very top of the page (//you may have to scroll up to see it.//) for more advanced actions.
** The [[Top menu bar]] gives access to additional menus that allow you to:
*** make other people [[members|Making someone a member of a space]] of this space
*** manipulate content in more complex ways
*** browse content in the wider TiddlySpace (beyond just [[TiddlyManual]]s), etc...

* 4. [[Feedback please!]]:
We also include this link, as we do want you to see it often and think of giving us feedback often!  We rely on this to shape and improve the manual.  Feedback can be very quick to give:
** From very quick reports of broken links, or glitches (if you can use the [[SNAPSHOT]] to send us a link to the broken bit, that would be fantastic!)
** To spending just a few minutes to fill in a short questionnaire.
** Or you can tell us we are doing OK, and make our day.
''Induction Day''

Course overview including introduction to core values, registration, library, allocation of study advisor, use of equipment.


''Scope''

This module covers the core skills of CYP IAPT work, including the fundamental elements of safe and effective working with children, young people and families. It provides an introduction to the CYP IAPT programme and shows how the EBCP training course links with other elements of the CYP IAPT programme. The curriculum builds on trainees’ existing clinical skills and knowledge.

This module covers content for the following subject areas from BACP’s EICF CYP:
•	#4 (Professional and Ethical Working)
•	#5 (Legislation)
•	#6 (Child Protection and Safeguarding)
•	#7 (Using Measures and Outcome Monitoring)
•	#8 (Endings and Supervision)
•	#9 (Collaborative Assessments)
•	#10 (Risk Assessments)
•	#11 (Developments and Transition)
•	#12 (Communication with Young People)
•	#14 (Working with Cultural Diversity)
•	#15 (Engagement with Young People, Parents and Carers)
•	#18 (Working within and Across Agencies)
•	#20 (Working within a School Context)
•	#21 (Emotional Health Promotion in Schools)
•	#22 (Working in a Voluntary and Community Sector)

''Aims''

The aims of the module are to engage practitioners with the core principles of CYP IAPT and to equip them with essential training necessary to enhance their counselling practice with children, young people and parents. This module will underpin Modules 2 (counselling for mild depression) and 3 (CBT for generalised anxiety). 

''Key Learning Outcomes''

At the end of module 1 trainees will:

•	Understand key principles of mental health work with children and young people, as developed within CYP IAPT
•	Be able to practice in a way that is consistent with CYP IAPT principles and values. 
''Scope''

This module covers the counselling competences necessary to treat mild depression, as recommended in Nice Guidelines CG18. It draws on competences for counselling for depression [7], and specific competences for humanistic counselling with young people [8]. 

This module covers content for the following subject areas from BACP’s Evidence-Informed Curriculum Framework for Counselling Young People: 
•	#1 (Assumptions and Principles of Humanistic Counselling)
•	#13 (Working with Emotions)
•	#16 (Mental Health, Pharmacology and Young People)
•	#17 Models of Intervention
•	#19 Working with Groups, Parents and Carers
•	#24 Holding an Overall Perspective

''Aims''

This curriculum will build upon participants’ existing counselling knowledge and competences to provide a firm foundation of practice and understanding in counselling for depression for children and young people. It will also equip participants with awareness and knowledge of the current links to research evidence. 

''Key learning outcomes''

At the end of module 2 trainees will:
•	Know how to conceptualise depression from a humanistic counselling standpoint
•	Understand the evidence for humanistic counselling with children and young people
•	Be competent in assisting children and young people in accessing, expressing and reflecting on their emotions, as appropriate to their developmental stages
•	Be able to apply a humanistic model of counselling to treating depression in children and young people.
This module covers the evidence base for CBT assessment and treatment strategies for anxiety problems in children and young people (generalised anxiety disorder, specific phobia, and separation anxiety). NICE provides guidance for generalised anxiety disorder in adults (CG22, updated by CG113), and CBT is strongly recommended. For children and young people, the most substantial evidence base for CBT for generalised anxiety disorder -- as well as separation anxiety and social phobia -- in children and young people comes from trials of the Coping Cat manual (Kendall & Hedtke, 2006) and related manuals. Working with social anxiety and OCD/PTSD are not covered in this module as they require specific forms of intervention. 

This module covers content for the following subject areas from BACP’s Evidence-Informed Curriculum Framework for Counselling Young People: 

•	#16 (Mental Health, Pharmacology and Young People)
•	#17 Models of Intervention
•	#19 Working with Groups, Parents and Carers
•	#23 Use of Self-help Materials and Behavioural Methods

''Aims''

This module aims to help counselling practitioners extend their skills so that they can work more effectively with children and young people experiencing a range of anxiety problems: generalised anxiety disorder, specific phobia, and separation anxiety. It specifically aims to help trainees: 

•	Develop knowledge of the theoretical and research literature of CBT for anxiety problems in children and young people
•	Develop practical competency in evidence-based CBT methods for generalised anxiety disorder, specific phobia, and separation anxiety in children and young people
•	Develop skills in effectively integrating CBT methods into their established counselling practice. 

''Key learning outcomes''

At the end of the module, trainees will: 

•	Understand the core theoretical principles for delivering CBT methods for children and young people experiencing generalised anxiety disorder, specific phobia, and separation anxiety, and how this can be integrated into humanistic models of psychological distress
•	Be able to effectively integrate a range of CBT methods for children and young people experiencing anxiety problems into their counselling work. 
NICE (2005). Depression in children and young people identification and management, [[CG28 https://www.nice.org.uk/guidance/cg28|https://www.nice.org.uk/guidance/cg28]]

NICE (2011). Generalised anxiety disorder and panic disorder in adults: management, [[CG113 https://www.nice.org.uk/guidance/cg113|https://www.nice.org.uk/guidance/cg113]]
Type the text for 'National Curriculum'
This is just a tag that gathers any pages that require further editing/authoring together under its topic heading.

Once a page is finished, before you save it and switch to "view mode", delete the ''~NeedsWork'' tag!
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
This is overwriting the NewHerePlugin contained in @ambit-plugins
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{

String.prototype.getNextFreeName = function() {
       var numberRegExp = / \(([0-9]+)\)$/;
       var match = numberRegExp.exec(this);
       if (match) {
               var num = parseInt(match[1]) + 1;
               return this.replace(numberRegExp," ("+num+")");
       }
       else {
               return this + " (1)";
       }
}

config.macros.newTiddler.checkForUnsaved = function(newName) {
	var r = false;
	story.forEachTiddler(function(title,element) {
		if (title == newName)
			r = true;
	});
	return r;
}

config.macros.newTiddler.getName = function(newName) {
       while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
               newName = newName.getNextFreeName();
       return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		var now = new Date();
		title = now.formatString(title.trim());
	}

	title = config.macros.newTiddler.getName(title); // <--- only changed bit

	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = document.getElementById(story.idPrefix + title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string")
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

//}}}
/*
	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]));
};
/*}}}*/
|bgcolor(pink):  Take a few minutes to learn about [[Using the Manual]]... this is //similar but different// to other websites.  Pages you open by clicking [[Links]] will appear in your "Currently Open" list in the left hand margin (or scroll down to find them at the bottom of your desktop, where they will have already opened.  You can see how many pages you have opened on the left hand margin - a little number on the pages icon for your "Currently open" list.)<br><html><iframe width="480" height="360" src="http://www.youtube.com/embed/TJ4WFQ1ov7g?rel=0" frameborder="0" allowfullscreen></iframe></html> |
//{{{
config.filters.numbersort = function(results,match) {
	var field = match[3];
	results = results.sort(function(a, b) {
		var val1 = a[field] || a.fields[field];
		var val2 = b[field] || b.fields[field];
		return parseFloat(val1, 10) < parseFloat(val2, 10) ? -1 : 1;
	});
	return results;
};
//}}}
Marn I'm af ndasd a?
iVBORw0KGgoAAAANSUhEUgAAAp4AAAJbCAMAAAB6jWSmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTEwOUY5OTBCQ0YxRjM1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEMkE2OTFFOTRBMTYxMUUxQkI0ODgzMDJGMDFGM0M0OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEMkE2OTFFODRBMTYxMUUxQkI0ODgzMDJGMDFGM0M0OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNGODRBODgyNjAyMDY4MTE5MTA5Rjk5MEJDRjFGMzUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MTA5Rjk5MEJDRjFGMzUwIi8+IDwvcmRmOkRlc2NyaXB0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
It can be difficult to persuade large organisations such as the NHS or Social Services to make the I.T. changes to allow the full use of [[TiddlyManual]]s.

We have worked hard to ensure the manuals will work even in quite old (ancient) versions of not-particularly-great browsers such as internet explorer (many NHS organisations still use Internet Explorer 6 in 2011!)

!Simple fixes

!!!Use a better browser
It may be possible to make a specific case for a team using tiddlymanuals to be allowed to download and use the freely available [[Firefox browser|http://www.mozilla.org/en-US/firefox/new/]], which is a much better browser than Internet Explorer, especially in its earlier versions, and which works much better with the simple technology that [[TiddlyManual]]s use.  [[Google Chrome|http://www.google.com/chrome]] would be another free option.

!!!Permit streaming video
Apply for an exception for a team using Tiddlymanuals so that they are allowed to access Youtube or other streaming video content.  Many large organisations are anxious about "everyone" using streaming video resources, as these are demanding on "bandwidth", but in reality, staff in a tiddlymanual are not going to be spending all day watching the [[Videos]]!  There is further [[Advice on getting permissions to view YouTube clips]].

!!!Upgrade Flash player
Some Trusts do not update the Flash Player that they supply, and this can make it hard to access video content in the manual.

!Strategic approaches

Find a friendly senior member of the I.T. department in your organisation - many of these people are only too aware of the limitations of the systems they are paid to maintain, and are looking for interesting, creative ways to improve the organisation's use of IT, in wayys that are not too expensive.  It is important to emhasise the fact that this is a "future-facing" approach, and that it is free.  The UK government has recently published [[guidelines|http://www.cabinetoffice.gov.uk/resource-library/open-source-procurement-toolkit]] advising offices to look at open source solutions as a first port of call.

Ideally, broker a meeting between senior managers in your organisation with a more strategic outlook, and the IT department, to consider how the organisation wishes to move forwards using IT to support its aims.  Suggest that your team might be seen as a small test case for this kind of approach.

See also some of the external resources laid out below.

!External resources

There are some helpful online resources to show to managers in the NHS, that may help to allay concerns or overcome common barriers to change that occur:

An official NHS site called the [[Armchair Involvement project]] describes itself as //"Helping you to use new technology to engage people in service improvement"// which ticks a lot of boxes.

A site, referenced from the above site, called [[Social Strategy - breaking down the barriers]] lists 50 hurdles or barriers to large public organisations making best use of web 2.0 technology.

!Keep up, the world is changing!
Finally, the [[UK government|http://www.cabinetoffice.gov.uk/resource-library/open-source-procurement-toolkit]] itself is recommending that opensource solutions are looked at by its various offices before they commit to old-style 'closed-source' resources - See [[UK Government support for Open Source]]
This is a description of a phrase used in the technical workings of the manual, rather than (in this instance) referring to children whose parents have died.

The [[tab|Tabs]] that you will find in the [[Index]] lists any Tiddlers ''that are not [[linked|Links]] to from any other Tiddlers.  This is quite useful to know if you are an author/editor, but otherwise quite boring.
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 -->
<!--}}}-->
List of plugins used by ambit, and the reason for their inclusion.

!!Other
SyncPlugin
JStorage
CloseOnCancelPlugin
ExtendTagButtonPlugin
ExtraFiltersPlugin
hijackCreateTagButton
NewHerePlugin
NewMeansNewPlugin
PrettyDatesPlugin
PrintClientNotesPlugin
QuickOpenTagPlugin
RecentChangesPlugin
RenameTagsPlugin
resetPlugin
SelectThemePlugin
SimpleSearchPlugin
StorySaverPlugin
TagglyTaggingPlugin
TemplateFormatterPlugin
TemplatePlugin
ValueSwitcherPlugin
zAutoUpdater
zConfigTweaks


!!Standard TiddlySpace plugins
BinaryTiddlersPlugin
BinaryUploadPlugin
BreadcrumbsPlugin
chrjs
chrjs.space
chrjs.users
DiffFormatter
ErrorHandler
GroupByPlugin
ImageMacroPlugin
LazyTiddlersPlugin
RandomColorPalettePlugin
RevisionsCommandPlugin
ServerSideSavingPlugin
TiddlyFileImporter
TiddlySpaceBackstage
TiddlySpaceChangePassword
TiddlySpaceCloneCommand
TiddlySpaceConfig
TiddlySpaceFilters
TiddlySpaceFollowingPlugin
TiddlySpaceIdentities
TiddlySpaceInclusion
TiddlySpaceInit
TiddlySpaceLinkPlugin
TiddlySpaceMembers
TiddlySpacePublishingCommands
TiddlySpaceRevertRevision
TiddlySpaceRevisionView
TiddlySpaceSpaces
TiddlySpaceTiddlerIconsPlugin
TiddlySpaceToolbar
TiddlySpaceUserControls
TiddlySpaceViewTypes
TiddlyWebAdaptor
TiddlyWebConfig
ToggleTiddlerPrivacyPlugin
Well known Microsoft Slide program.  As in "death by power point".

Consider other ways of organizing your information to speak about it - why not a TiddlyManual!
It may have been a Pretty Link that you clicked to find your way here, but the content is pretty boring.

* [[Pretty Links]] allow you to include spaces and can look like "ordinary" text; they are just ''text that is enclosed in double square brackets'' which contain the desired tiddler name:
** e.g.: {{{[[Pretty Links]]}}} makes a link to [[Pretty Links]]...

* Optionally, a custom title or description can be added, separated by a "pipe character" ( the vertical line - {{{|}}})):
** {{{[[page title that shows in the text|target page that opens when you click]]}}}
** '''N.B.:''' In this case, the target can also be any website (i.e. URL) - i.e. you can make an external link to the tiddlymanuals site like [[this|http://www.tiddlymanuals.com]] by using this code: {{{[[this|http://www.tiddlymanuals.com]]}}}.
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
	var diff = (((new Date()).getTime() - this.getTime()) / 1000);
	var day_diff = Math.floor(diff / 86400);

	if (isNaN(day_diff))      return "";
	else if (diff < 0)        return "in the future";
	else if (diff < 60)       return "just now";
	else if (diff < 120)      return "1 minute ago";
	else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
	else if (diff < 7200)     return "1 hour ago";
	else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
	else if (day_diff == 1)   return "Yesterday";
	else if (day_diff < 7)    return day_diff + " days ago";
	else if (day_diff < 14)   return  "a week ago";
	else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
	else if (day_diff < 62)   return "a month ago";
	else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
	else if (day_diff < 730)  return "a year ago";
	else                      return Math.ceil(day_diff/365) + " years ago";
}

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
	return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)'; 
config.mptwDateFormat = 'pppp'; 

//}}}
This is easy.

If you press the Print button on your Browser then all [[Tiddler]]s //that are currently open on your desktop// will print out.

!!!!NB the following content NOT yet working (as at Oct 2012):
If you are using downloaded copies of the manual in its most interactive mode - as workbooks to keep notes on client work ([[ICR]]) - then in order to print out all notes related to your client, you should use the [[Print ClientNotes]] function.
PrintClientNotes = {
	tiddlers: {},
	getSince: function() {
		var t = store.getTiddler("Print ClientNotes");
		var since = t.fields.since;
		return since || "";
	},
	storeSince: function(since) {
		if(typeof since!=="string") {
			since = since.convertToYYYYMMDDHHMM();
		}
		var t = store.getTiddler("Print ClientNotes");
		t.fields.since = since;
		return since;
	},
	addToLog: function() {
		var now = new Date();
		var head = "| !date | !type | !print since |\n";
		var tiddler = store.getTiddler("PrintHistory");
		if (!tiddler) {
			tiddler = new Tiddler();
			tiddler.title = "PrintHistory";
			tiddler.text = head;
			tiddler.created = now;
		}
		if(tiddler.text.indexOf(head)===-1) {
			tiddler.text = head + tiddler.text;
		}
		var since = this.getSince();
		if(!since) {
			type = "Print all";
		} else {
			type = since;
		}
		var text ="| "+now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") + " (" + now.convertToYYYYMMDDHHMM() + ")"+" | "+type+" | <<chkPrintSince>> |\n";
		tiddler.text = tiddler.text + text;
		tiddler.modifier = config.options.txtUserName;
		tiddler.modified = now;
		store.addTiddler(tiddler);
		// refresh and notify for immediate update
		// goal is to get the Print ClientNotes tiddler to update
		//story.refreshTiddler(tiddler.title);
		//store.notify(tiddler.title, true);
	},
	print: function(str) {
		var srcWindow = window.open("", "sourceWindow", "width=700,height=600");
		var srcDocument = srcWindow.document;
		srcDocument.write("<html><head></head><body>" + str + "</body></html>");
		srcDocument.close();
		//srcDocument.print(); - there is a command for this, but it's not this
	}
};

config.macros.printClientNotes = {
	onclick: function() {
		PrintClientNotes.addToLog();
		if(PrintClientNotes.tiddlers) {
			// this only gets section tiddlers, change later to deal with all tiddlers - probably shape the templates somehow
			var str = "";
			var section, notes, note;
			for(var i in PrintClientNotes.tiddlers) {
				section = store.getTiddler(i);
				notes = PrintClientNotes.tiddlers[i];
				str += expandTemplate("ClientNotesSectionTemplate",[section]);
				for(var j=0;j<notes.length;j++) {
					note = store.getTiddler(notes[j]);
					str += expandTemplate("ClientNotesNoteTemplate",[note]);
				}
			}
			PrintClientNotes.print(str);
		} else {
			displayMessage('no tiddlers to print');
		}
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		createTiddlyButton(place, "Print", "Print ClientNotes", config.macros.printClientNotes.onclick, "button");
	}
};

config.macros.chkPrintSince = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var dateField = place.parentNode.getElementsByTagName('td')[0];
		var start = dateField.innerHTML.indexOf('(');
		var end = dateField.innerHTML.indexOf(')',start);
		var mySince;
		if(start && end) {
			// assumes dateField has (YYYYMMDDHHMM) after the human-readable date
			mySince = dateField.innerHTML.substring(start+1,end);
		}
		if(!mySince) {
			throw new Error('could not find date field for this row');
		}
		var change = function() {
			// update since and refresh Print ClientNotes tiddler
			return true;
		};
		var c = document.createElement("input");
		c.setAttribute("type","checkbox");
		c.className = "chkPrintSince";
		c.onclick = change;
		var since = PrintClientNotes.getSince();
		if(since === mySince) {
			c.checked = true;
		} else {
			c.checked = false;
		}
		place.appendChild(c);
		return c;
	}
};

config.macros.createTagGroup = {

	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var title = params[0];
		var list = store.getTaggedTiddlers(title);
		var sortBy = "title";
		var sortOrder = "asc";

		var leftOvers = [];
		for (var i=0;i<list.length;i++) {
			leftOvers.push(list[i].title);
		}

		PrintClientNotes.tiddlers = {};
		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (!allTagsHolder[list[i].tags[j]]) {
						allTagsHolder[list[i].tags[j]] = "";
						PrintClientNotes.tiddlers[list[i].tags[j]] = [];
					}

					allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]\n";
					PrintClientNotes.tiddlers[list[i].tags[j]].push(list[i].title);

					leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder) {
			allTags.push(t);
		}

		var sortHelper = function(a,b) {
			if (a == b) { return 0; }
			if (a < b) { return -1; }
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") { return sortHelper(a,b); }
			else if (!tidA && !tidB) { return 0; }
			else if (!tidA) { return -1; }
			else if (!tidB) { return +1; }
			else { return sortHelper(tidA[sortBy],tidB[sortBy]); }
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++) {
			leftOverOutput += "*[["+leftOvers[i]+"]]\n";
		}

		var output = "";

		if (sortOrder == "desc") {
			allTags.reverse();
		} else if (leftOverOutput != "") {
			// leftovers first...
			output += leftOverOutput;
		}

		for (var i=0;i<allTags.length;i++) {
			if (allTagsHolder[allTags[i]] != "") {
				output += "*[["+allTags[i]+"]]\n" + allTagsHolder[allTags[i]];
			}
		}

		if (sortOrder == "desc" && leftOverOutput != "") {
			// leftovers last...
			output += leftOverOutput;
		}

		wikify(output,place);
	}
};
One of the [[Tabs]] from the [[Index]] lists [[Tiddler]]s, that are ''Private'' as opposed to [[Public]].

In TiddlySpace [[Tiddler]]s can exist in one of two states - you can see the state indicated when you are in the [[Edit]] mode for a particular tiddler. A blue circle, with white in the centre, signifies "Public", a pink centre, with white around the circumference, signifies "private".

You can [[Switch the "status" of tiddlers from Private to Public, or vice versa]] very easily.

You will see that you (or at least anyone who is a MEMBER of the SPACE - see [[Space menu]]) can [[Switch the "status" of tiddlers from Private to Public, or vice versa]].
/*{{{*/
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);
	}
};
/*}}}*/
One of the [[Tabs]] from the [[Index]] lists [[Tiddler]]s that are ''Public'' as opposed to [[Private]].

In TiddlySpace [[Tiddler]]s can exist in one of two states - you can see the state indicated when you are in the [[Edit]] mode for a particular tiddler.  A blue circle, with white in the centre, signifies "Public", a pink centre, with white around the circumference, signifies "private".

You can [[Switch the "status" of tiddlers from Private to Public, or vice versa]] very easily.

You (or at least anyone who is a MEMBER of the SPACE - see [[Space menu]]) can [[Switch the "status" of tiddlers from Private to Public, or vice versa]].
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags(params[0]);
		var filter = params[1]; // new feature
		var ul = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
		for(var t=0; t<tags.length; t++) {
			var title = tags[t][0];
			if (!filter || (title.match(new RegExp('^'+filter)))) {
				var info = getTiddlyLinkInfo(title);
				var theListItem =createTiddlyElement(ul,"li");
				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
				var theCount = " (" + tags[t][1] + ")";
				theLink.appendChild(document.createTextNode(theCount));
				var theDropDownBtn = createTiddlyButton(theListItem," " +
					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
				theDropDownBtn.setAttribute("tag",tags[t][0]);
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}
/***
|''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''|RandomSortFilter|
|''Version''|0.1.2|
!Description
Updates the sort filter to take a keyword *random
!Usage
{{{
[sort[*random]]
}}}
***/
//{{{
(function() {
var _sort = config.filters.sort;
config.filters.sort = function(results,match) {
	if(match[3] === "*random") {
		results = results.sort(function(a, b) {
			var r = Math.random();
			return r < 0.5 ? -1 : 1;
		});
		return results;
	} else {
		return _sort.apply(this, arguments);
	}
};
})();
//}}}
This is the title of one of the [[Tabs]] in the [[Index]].

It is of particular use if material is being added frequently, as it lists all the [[Tiddler]]s in date order ''according to which ones have been most recently edited/worked upon'' (N.B. NOT in the order in which they have most recently been opened for reading.)
!Work in Progress

The content of this [[Dynamic, adaptive Manualization]] and its layout is ''continually being updated and improved'' by the [[Authors]], as well as by the [[Manualizing|Manualization]] efforts by local teams in the many [[local versions|http://tiddlymanuals.tiddlyspace.com/#AMBIT]] that are now being adapted.  (Your [[Feedback please!]] helps to improve things.)   If needed (e.g. for formal intervention trials) it is possible to separate out a 'fixed' version.  

|bgcolor(lightblue): Keep a track of recent changes (last 100 days) in content here (select from the drop-down list, and then click "go to"): <br> <br> <<recentChanges 100>> <br> |

<<tabs
	txtMainTab
	"Pages listed in order of recent changes" "Recently edited tiddlers" TabTimeline
        "All pages listed alphabetically" "All tiddlers" TabAll
>>
/***
|Name|RecentChangesPlugin|
|Source|http://www.TiddlyTools.com/#RecentChangesPlugin|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|display droplist of recently changed tiddlers with goto, edit, and preview buttons|
!!!!!Usage
<<<
The {{{<<recentChanges>>}}} macro displays a droplist of all tiddlers that have been changed within the last N days (default=10 days).  
<<<
!!!!!Examples
<<<
{{{<<recentChanges>>}}}
<<recentChanges>>
or
{{{<<recentChanges #ofdays previewheight previewclass>>}}}
where:
* #ofdays specifies the time limit for list changed tiddlers.  Use 0 (zero) to list all tiddlers in the document
* previewheight is a CSS height measurement and sets the FIXED height of the tiddler preview area (default is 15em)
* previewclass is any CSS classname, and can be used to apply custom styles to the preview area (default is to use the standard 'viewer' class)
<<recentChanges 14 10em groupbox>>
<<<
!!!!!Revisions
<<<
2008.05.01 [2.0.1] fixup for titles with double-quotes
2007.07.26 [2.0.0] re-written as plugin
2006.10.02 [1.0.0] initial release (as inline script ShowRecentChanges)
<<<
!!!!!Code
***/
//{{{
version.extensions.recentChanges= {major: 2, minor: 0, revision: 1, date: new Date(2008,5,1)};

config.shadowTiddlers.RecentChanges="<<recentChanges>>";

config.macros.recentChanges = {
	layout: '<form><!--\
		--><select size=1 name="list" style="width:69.5%" \
			onchange=" \
				this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length; \
				var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				if (!this.value.length) \
					{ target.style.display=\'none\'; this.form.preview.value=\'preview\'; } \
				else if (target.style.display==\'block\') { \
					wikify(\'<\'+\'<tiddler [[\'+this.value+\']]>\'+\'>\',target); \
					target.style.display=\'block\'; \
					this.form.preview.value=\'done\'; \
				} \
			"><!--\
		-->%options%<!--\
		--></select><!--\
		--><input type="button" name="goto" value="goto" disabled title="view selected tiddler" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value); \
			"><!--\
		--><input type="button" name="edit" value="edit" disabled title="edit selected tiddler" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE); \
			"><!--\
		--><input type="button" name="preview" value="preview" disabled title="show/hide tiddler preview" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; \
				if (this.value==\'preview\') { \
					removeChildren(target); \
					wikify(\'<\'+\'<tiddler [[\'+this.form.list.value+\']]>\'+\'>\',target); \
					target.style.display=this.form.list.value.length?\'block\':\'none\'; this.value=\'done\'; \
				} else { \
					removeChildren(target); \
					target.style.display=\'none\'; this.value=\'preview\'; \
				} \
			"><!--\
		--></form>',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var days=10; if (!isNaN(params[0])) days=parseInt(params[0]); // time limit in days (use 0 for all tiddlers)
		var height='15em'; if (params[1]) height=params[1]; // preview area fixed height
		var previewclass='viewer'; if (params[2]) previewclass=params[2]; // preview area CSS class
		var tiddlers=store.getTiddlers('modified','excludeLists').reverse();
		var count=tiddlers.length;
		if (days) {
			var timelimit=(new Date()).getTime()-86400000*days;
			for (var count=0; count<tiddlers.length && tiddlers[count].modified>timelimit; count++);
		}
		var opts="";
		opts+='<option value="">';
		opts+=count+' tiddlers have changed since ';
		opts+=new Date(timelimit).formatString("DDD, MMM DDth YYYY 0hh:0mm");
		opts+=' ('+days+' days ago)';
		opts+='</option>';
		for (var i=0; i<count; i++) { var t=tiddlers[i];
			opts+='<option value="'+t.title.replace(/"/g,"&#x22;")+'">';
			opts+=t.modified.formatString('YYYY.0MM.0DD 0hh:0mm')+' - '+t.title;
			opts+='</option>';
		}
		createTiddlyElement(place,"div").innerHTML=this.layout.replace(/%options%/,opts);
		var preview=createTiddlyElement(place,"div",null,previewclass);
		preview.style.display='none';
		preview.style.whiteSpace='normal';
		preview.style.overflow='auto';
		preview.style.height=height;
	}
}
//}}}
This is one of the options contained in the [[Show references and info]] panel that is accessible for every page ([[Tiddler]].)

This menu option opens a drop down pick-list of all/any  related Tiddlers that link to (or 'reference') the one you are currently studying.

For example, clicking on the [[References]] option from menu for //this// Tiddler right here will show a list of all the other Tiddlers that have [[Links]] to this one. 

!Why?

This is more obviously useful in a clinical/learning framework.  A worker might read a Tiddler about a particular subject, and use the [[References]] button to locate //associated// material from a wide variety of areas. 

Sometimes, referenced associations discovered in this way will be //unexpected//, or will have been //overlooked//, so that fostering a habit of checking for [[Integrative]] links in this way is a helpful KeyWorker practice.
#Street, C., Voluntary and community sector (VCS) counselling provision for children, young people and young adults in England, 2013, BACP/Counselling MindEd: Lutterworth.
#Cooper, M., School-based counselling in UK secondary schools: A review and critical evaluation, 2013, BACP/Counselling MindEd: Lutterworth.
#Thompson, W., School-based counselling in UK primary schools, 2014, BACP/Counselling MindEd: Lutterworth.
#Cooper, M., Counselling in UK secondary schools: A comprehensive review of audit and evaluation studies Counselling and Psychotherapy Research, 2009. 9(3): p. 137-150.
#Hill, A., et al., Evaluation of the Welsh School-based Counselling Strategy, 2011, Welsh Government Social Research: Cardiff.
#Street, C., Online counselling provision for children, young people and young adults, 2013, BACP/Counselling MindEd: Lutterworth.	
#Sanders, P. and A. Hill, Counselling for depression: A person-centred and experiential approach to practice2014, London: Sage.
#Hill, A., A. Roth, and M. Cooper, The competences required to deliver effective humanistic counselling for young people, 2013, BACP: Lutterworth.
/***
|''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);
//}}}
If you are not yet registered, go to http://tiddlyspace.com, and follow the instructions there.

This will give you a username and a password.  

In addition you get a TiddlySpace of your own.

>//NB: You don't have to do anything with that space (wiki) at all if you don't want to (just leave it blank) - it is just a personal wiki that you could use if you want one.  Some people use TiddlyWiki's as blogs, or personal websites, or - indeed - treatment manuals!//

Once you are registered, you can:
 
(a) Open/create new spaces (see the [[User menu]] for instructions on how to do this, or go straight to [[Make a new space]].) 
(b) Make other people members of spaces (if you are a member yourself!)

!Getting editing rights

If you want to be able to edit your team's local tiddlymanual, then you need to give your username (just your username, not your password!) to another person who is already a member of that space, who can add you as a member, using the [[Space menu]] for that manual.  See [[Making someone a member of a space]].
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

	prompts: {
		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
		remove: "Remove the tag '%0' from %1 tidder%2?"
	},

	removeTag: function(tag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,tag);
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	renameTag: function(oldTag,newTag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
			if (title != newTitle) {
				var tagged = this.getTaggedTiddlers(title);
				if (tagged.length > 0) {
					// then we are renaming a tag
					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
						config.renameTags.renameTag(title,newTitle,tagged);

					if (!this.tiddlerExists(title) && newBody == "")
						// dont create unwanted tiddler
						return null;
				}
			}
			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
		},

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

		removeTiddler: function(title) {
			var tagged = this.getTaggedTiddlers(title);
			if (tagged.length > 0)
				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
					config.renameTags.removeTag(title,tagged);
			return this.removeTiddler_orig_renameTags(title);
		}

	},

	init: function() {
		merge(TiddlyWiki.prototype,this.storeMethods);
	}
}

config.renameTags.init();

//}}}
<!--{{{-->
<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);
//}}}
!What is this for?
The Snapshot is a simple and immediate way to make a record of a page or a set of pages that you have opened and want to be able to share...   It allows you to generate a link (a "URL") that you can email to anyone, which will open just those pages that you have got opened on your [[Desktop]] at this time.   

This is one of a number of [[Comparing and Sharing functions]] that [[TiddlyManual]]s contain.

!What do I do?
1. Get the page or pages that you are interested in opened up on your [[Desktop]].
2. Open the [[Sidebar]] and find the little Camera icon beside the [[Currently Open]] list:

<html><a href="https://picasaweb.google.com/lh/photo/wScWtP2SLM_Y_qQpeqI5t9MTjNZETYmyPJy0liipFm0?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-7DBn-KiG2js/T2DZuajleJI/AAAAAAAAEC0/rrx_sX9DYZ4/s800/SnapshotButton.jpg" height="414" width="575" /></a></html>

3. Click the SNAPSHOT button 
4. Have a look at your browser's Address box (where the web address or "URL" goes that sends the browser to the right web page.)
5. Copy the new URL (web address) that is in the browser's address box.
6. Paste that address into the body of an email (or anywhere you want to save it).
7. Next time you or the person who receives the email click that link, it will open the manual with exactly those same pages already opened up.

!Why?
This can be very helpful in [[Team Meetings]] or in supervision sessions: case discussion may involve looking at content from the manual and this can be emailed directly to the worker.
This function is also known as "permaview" - clicking here <<permaview>> does exactly the same thing (try it!)
My children:
SampleTagChild
AnotherTag
MainMenu
When you are editing your ''online'' version of the manual saving of any changes you make is AUTOMATIC - this will happen as long as you are;

(a) ''__REGISTERED__'' as a user of Tiddlyspace (you will need to define a username and a password to do this - [[Register on TiddlySpace]].)
(b) ''__A MEMBER__'' of the space you are editing (this will require someone who is ALREADY a member of the space to make you a member.  See the [[Space menu]] for more details. 
(c) ''__LOGGED__'' in as a user (see [[Log in]].)

!Saving in downloaded versions

If you are playing with a DOWNLOADED version of the manual, then at present you will not be able to edit and save content - this is because the developers are working to make local saving of a downloaded copy robust and simple enough to support the use of downloaded copies of the manual as "workbooks".  When this is done (later in 2011) working notes on the client will be able to be made within the wiki, stored securely on a local server (not online!) and will easily export notes to other settings such as paper (print-outs) or other secure databases.  This will bring manualized content into direct proximity with day-to-day notekeeping (we refer to this //developing// function as [[ICR]] - interactive case recording.)


!What?
The Search facility is simple, but cleverer than it looks at first.  In particular it lets you search for a word or phrase either just in your OWN manual, or //across all the different versions// of (the AMBIT or other) [[TiddlyManual]]s that are included in the "[[Community of Practice]]" that AMBIT in particular seeks to foster.  It is one of the ways that the AMBIT manual encourages workers and separate teams with [[Comparing and Sharing functions]].

<html><iframe width="480" height="360" src="http://www.youtube.com/embed/1fkROEXtaI8?rel=0" frameborder="0" allowfullscreen></iframe></html>
!Where?
Find the search box at the top of the [[Sidebar]] on the left of your screen (you may need to toggle the sidebar into view if it has been tucked away.) 
!How?
Just type in the word or phrase you are looking for and it will automatically open up a list of all the [[Tiddler]]s which contain it, with the word highlighted in each one - if it is a long list, then there will be a little scroll bar to help to scan up and down the list to select the title tat you are interested in.
//''NB'' - It searches only for the precise phrase you type in, not the same words but in different combinations (if you search for "red apples" you won't turn up "green apples and red tomatoes".)
!!Searching across OTHER team's versions
If you click the little checkbox just above the main search box that is labelled ''//"search all manuals"//'' you will see additional titles of other versions of the manual listed.
!Why?
This makes it easy to search for content in your own manual, but is also designed to foster curiosity in workers from //one// team, about the ways that workers from //another// team manage particular areas of practice
/*{{{*/
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();
};



/*}}}*/
This is a note to help the ~CYP-IAPT web manual developers to work out how to do this!
You can ''change the names of your main sections'' (listed in the [[Contents/Sitemap]] menu in the sidebar) by:
*  open up the MainMenu page
*  switch to [[Edit mode]]
* edit the text inside the double square brackets (leave these, the spaces, other punctuations marks, etc, and the rest well alone!) that you will see... 
** it will look like this: {{{<<tree "Introduction [[Section 1 - learn how to rename me in the MainMenu]] [[Section 2]] [[Section 3]] [[Section 4]] [[Index]]">>}}})
** Add as many other sections as you wish, with the titles enclosed in double square brackets.
/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware. 
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{

config.macros.selectTheme = {
	label: {
      		selectTheme:"select theme",
      		selectPalette:"select palette"
	},
	prompt: {
		selectTheme:"Select the current theme",
		selectPalette:"Select the current palette"
	},
	tags: {
		selectTheme:'systemTheme',
		selectPalette:'systemPalette'
	}
};

config.macros.selectTheme.handler = function(place,macroName)
{
	var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
	// want to handle palettes and themes with same code. use mode attribute to distinguish
	btn.setAttribute('mode',macroName);
};

config.macros.selectTheme.onClick = function(ev)
{
	var e = ev ? ev : window.event;
	var popup = Popup.create(this);
	var mode = this.getAttribute('mode');
	var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
	// for default
	if (mode == "selectPalette") {
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',"(default)");
		btn.setAttribute('mode',mode);
	}
	for(var i=0; i<tiddlers.length; i++) {
		var t = tiddlers[i].title;
		var name = store.getTiddlerSlice(t,'Name');
		var desc = store.getTiddlerSlice(t,'Description');
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'),name ? name : title,desc ? desc : config.macros.selectTheme.label['mode'],config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',t);
		btn.setAttribute('mode',mode);
	}
	Popup.show();
	return stopEvent(e);
};

config.macros.selectTheme.onClickTheme = function(ev)
{
	var mode = this.getAttribute('mode');
	var theme = this.getAttribute('theme');
	if (mode == 'selectTheme')
		story.switchTheme(theme);
	else // selectPalette
		config.macros.selectTheme.updatePalette(theme);
	return false;
};

config.macros.selectTheme.updatePalette = function(title)
{
	if (title != "") {
		store.deleteTiddler("ColorPalette");
		if (title != "(default)")
			store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
					config.options.txtUserName,undefined,"");
		refreshAll();
		if(config.options.chkAutoSave)
			saveChanges(true);
	}
};

config.macros.applyTheme = {
	label: "apply",
	prompt: "apply this theme or palette" // i'm lazy
};

config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	var useTiddler = params[0] ? params[0] : tiddler.title;
	var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
	btn.setAttribute('theme',useTiddler);
	btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}

config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;

config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
	createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};

//}}}
/***
|''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);
//}}}
Knowing about these is of little use to the everyday Tiddlymanual user.

The "Shadows" [[tab|Tabs]] in the [[Index]] lists all of the [[Tiddler]]s that are '''built in''', to make the TiddlyWiki format run properly - you can write over them but this will generally break stuff, so it is not recommended!  (If you do by accident, then you can always just delete your local version and "our" original version which yours had overwritten will just "pop back" into place - so you can't break anything permanently!)  

Mostly shadow tiddlers do the boring but necessary work of making the tiddlywiki run properly - but an example that you can (and generally do) change is, say, the SiteTitle.  
!A //"Mentalize this!"// function for each page...
Here you can look at "what lies beneath" a page; its "meta-data" - i.e.  its ''context'' (how it fits in to the whole), its ''connections'' (''references'' to this page from others in the form of [[Links]], and its [[Topic]]s and [[Sub-topic]]s), and its history -  how it has been developed over time, other versions, etc...  This kind of musing about the content has lots in common with our core theory of [[Mentalization]].

!How do I find this on a page?
You will find that every page ([[Tiddler]]) has an additional panel that you reveal by clicking in the black box (titled "Show references and info") just to the right of the main title.  When you click on this, the panel slides open up to reveal a number of headings, that give you information about this page and how it fits together with the rest of what is in the manual:

!Headings in the "Show references and info" panel:

!!!@@color(blue):Information@@
Under this heading you can look at:
* Who has ''Edited'' the content of the tiddler
* ''When'' it was edited last
* You can browse the history of ''revisions'' that led to it arriving in its present form (note that [[TiddlyManual]]s emphasise the fact that all treatments are "works in progress".)
* Any ''References'' to this tiddler in the form of [[Links]] to it from other tiddlers - ''this is a useful way to look for other material that is likely to be covering similar or neighbouring territory.''

!!!@@color(blue):Elsewhere - Comparing@@
[[TiddlyManual]]s are designed to provide a platform //for teams to work out their own implementation of best practice//, and they provide a number of [[Comparing and Sharing functions]] so that workers from one team can easily compare/contrast their methods of working with those of other teams, and can //share best practice// among a geographically and culturally diverse [[Community of Practice]]. 

You can see also [[Manualization]], which explains how a //locally-adapted// [[TeamTemplate]] is produced, that describes how //THIS team, working with THESE problems, in THIS setting// is working.  This adds up to a [[Dynamic, adaptive Manualization]] that grows and differentiates over time, as experience and evidence accumulates, while best new practices can be shared more widely and more quickly as required.

Using the buttons in the ''__Elsewhere__'' menu, content that diverges between different versions of the manual (different [[TeamTemplate]]s) can be ''compared'':
  
*If there are different versions available, you can click on the 'Compare' button, and you will see a drop-down list of other versions of the same tiddler in different "spaces" (tiddlymanuals).  
*Click on any item within this list that you want to compare to your own page.
*A new tab will immediately open in your browser, that shows //both versions of the page// you are comparing, side-by-side, with changes (deletions, additions, etc) highlighted in colours (the user interface of this comparing is due to improve in late 2012.)
 
!!!@@color(blue):Sub-topics@@
[[Tiddler]]s in a TiddlyManual are arranged in flexible hierarchies.  Under ''"This topic contains these sub-topics:"'' you will find links to any tiddlers that are classified as "[[Sub-topic]]s" of the tiddler you are looking at.  For instance, if the tiddler you were looking at was titled "Birds" you might find as sub-topics "Sparrows", "Hawks", "Crows".  

However, "Hawks" might //itself// have sub-topics, too.  If you looked at its own "Show Related Information" menu these would show up ("Kestrels", Sparrowhawks", etc).  

If you are [[Edit]]ing content, it is worth knowing that to produce [[Sub-topic]]s of Tiddler "A" you would [[tag|Tags]] them with the title of the [[Topic]] ("A", in this case.)  The same tiddler can thus be a Sub-topic, as well as being a Topic heading itself (with its own sub-topics.)

!!!@@color(blue):Topics@@
The heading ''"This topic is a sub-topic of:"'' shows you which other tiddlers are [[tagging|Tags]] //this particular Tiddler// - these are the 'Topic headlines' that this tiddler stands beneath.
<<closeAll>><<permaview>><<newTiddler>>
<<tiddler Backstage##Tiddlers>>
This is to the left of your screen.  You can make it appear or slide out of view by clicking the triangle on the little tab at the top.

The Sidebar is where you can navigate and order the material in the manual so that on your [[Desktop]] you have gathered only what you are interested in, and you can jump from page to page.  The following tools are here:

!SEARCH

[[Search]] box

!HISTORY

[[History recorder]]

!CURRENTLY OPEN

The [[Currently Open]] list shows you the pages you have opened on your [[Desktop]], and includes the camera icon button for the [[SNAPSHOT]] function.

!CONTENT

Here you will see an unfolding 'tree' view of all the contents of the manual.  Click on the + sign by a heading, and the sub-headings under that topic will open out - click on the words and the page will open on your [[Desktop]].  You can also look at this on a separate page ([[Contents/Sitemap]].)

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
Space cypiapt
a wiki manual
@@color(lightblue):~CYP-IAPT@@
this website site, referenced by the NHS [[Armchair Involvement project]] site, lists 50 hurdles or barriers to large public organisations making best use of web 2.0 technology.  It is a helpful resource in negotiating for large organisations to allow for simple changes to I.T. systems to support the best use of the unfolding capabilities of the web.

<html><div align="center"><iframe src="http://web.archive.org/web/20091107041114/http://www.practicalparticipation.co.uk/socialstrategy/barriers:start" frameborder="0" width="100%" height="600"></iframe></div></html>

Most of what is here is ''only useful to advanced users'', and it is only available if you are using the manual in [[Advanced mode]].  

!Finding the Space menu

The Space menu is found on the [[Top menu bar]], that you can access in [[Advanced mode]] (click the little "target" symbol, and select ''"THIS SPACE"'').

!Menu contents

In the panel that opens, you can see:
* ''//information about the space//'', 
* information about ''//members of the space//'' (and you can [[add or subtract members|Making someone a member of a space]] if you are a member yourself).
* you can ''//[[include|Including spaces]] (or exclude) other spaces//'' here, too (but this is definitely a "high level" interaction, not for beginners, and is likely to interfere with the functioning of other bits of the manual, even though it is perfectly reversible!)

!To GET OUT of SPACE Menu

Click the button (top right) in the menu panel that says "HOME".

!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
A Space is what the web-based 'TiddlySpace' provides to host your [[Wiki]].

Read about TiddlySpace to understand the broader picture.
A Space can belong to a single member, or that member can make other people members (see [[Making someone a member of a space]]). 
If there is more than one person as members of a particular Space this is what the TiddlySpace developers call a 'small trusted group' - all of whom have equal rights (just as giving someone a key to the door of the office or your home would entail some trust.)

!Spaces can include other spaces!
What is neat about TiddlySpace is that ''one Space can include OTHER spaces'' (that is, the [[Public]] content from wikis that are curated by other people.)
These included Spaces might add //content//, //themes// (which determine how the wiki looks and behaves), or extra //functions//.
In the [[Index]], one of the [[Tabs]] you will see is Spaces, adn this lists all the Spaces that are INCLUDED in the present one to give you the nd reulst you are looking at.
If you are an advanced user, you may want to know about [[Including spaces]] to add further content/functions to your own wiki.
* To prevent the wiki 'markup syntax' (what we are calling the "EditingConventions") from taking effect for a particular section, that section can be enclosed in three double curly brackets: e.g. {{{"""WikiWord"""}}}.
* {{{<br>}}} forces a manual line break in a block of text
* {{{----}}} at the beginning of a line creates a horizontal ruler across the whole page - like this:
----
* [[HTML entities|http://www.tiddlywiki.com/#HtmlEntities]]
* {{{<<macroName>>}}} calls the respective [[macro|Macros]]
* ''To hide text within a tiddler so that it is not displayed'', it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.
----
CSS programming for really fancy formating (complicated!)
* {{{@@CssProperty:value;CssProperty:value;…@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.
* <html><code>{{customCssClass{…}}}</code></html>
* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> … </html>}}}
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]].
/***
|''Name''|StoryFilters|
|''Author''|Jon Robson|
|''Version''|0.6.7|
|''Status''|@@experimental@@|
|''Source''|https://raw.github.com/jdlrobson/TiddlyWikiPlugins/master/plugins/Filters/StoryFiltersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Notes
Adds the following filters
{{{
[story[open]]
[story[sort]]
}}}
***/
//{{{
(function($) {
var _display = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function() {
	var res =  _display.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};
var _close = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function() {
	var res =  _close.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};

config.storyFilters = {
	open: function(tiddler) {
		return story.getTiddler(tiddler.title) ? true : false;
	},
	sort: function(a, b) {
		var i = $(story.getTiddler(a.title)).index();
		var j = $(story.getTiddler(b.title)).index();
		return i < j ? -1 : 1;
	}
};
config.filters.story = function(results, match) {
	var arg = match[3];
	var newresults = [];
	var handler = config.storyFilters[arg];
	if(arg == "sort") {
		return results.sort(handler);
	} else {
		var tiddlers = store.getTiddlers();
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			if(handler && handler(tiddler)) {
				newresults.push(tiddler);
			}
		}
	}
	return newresults;
}

}(jQuery));
//}}}
/***
|Name|StorySaverPlugin|
|Source|http://www.TiddlyTools.com/#StorySaverPlugin|
|Documentation|http://www.TiddlyTools.com/#StorySaverPluginInfo|
|Version|1.4.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|MarkupPostBody|
|Overrides|confirmExit(), getParameters()|
|Description|save/restore current tiddler view between browser sessions|
This plugin automatically saves a list of the currently viewed tiddlers (the "story") in a local cookie, {{{txtSavedStory}}} and then opens those tiddlers when the document is subsequently reloaded... the tiddlers you were viewing in the last browser session are automatically redisplayed in the next session, allowing you to quickly resume working with the document from the same place you left off!!

In addition to automatic cookie-based story tracking, the plugin also provides {{{<<saveStory>>}}} and {{{<<openStory>>}}} macros that allow you to quickly save the current story definition to a tiddler, and then re-display saved stories using simple, one-click command links or droplists.
!!!!!Documentation
>see [[StorySaverPluginInfo]]
!!!!!Revisions
<<<
2008.09.07 [1.4.3] added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.07.11 [1.4.2] in confirmExit(), corrected bracketing for titles containing spaces
2008.03.10 [*.*.*] plugin size reduction: documentation moved to [[StorySaverPluginInfo]]
|please see [[StorySaverPluginInfo]] for additional revision details|
2007.10.05 [1.0.0] initial release.   Moved [[SetDefaultTiddlers]] inline script and rewrote as a {{{<<saveStory>>}}} macro.
<<<
!!!!!Code
***/
//{{{
version.extensions.StorySaverPlugin= {major: 1, minor: 4, revision: 3, date: new Date(2008,9,7)};
//}}}
// // ''save or clear story cookie on exit:''
//{{{
// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

if (config.options.chkSaveStory==undefined) config.options.chkSaveStory=false; 
if (window.coreTweaks_confirmExit==undefined) {
	window.coreTweaks_confirmExit=window.confirmExit;
	window.confirmExit=function() {
		if (config.options.chkSaveStory) { // save cookie
			var links=[];
			story.forEachTiddler(function(title,element){links.push('[['+title+']]');});
			config.options.txtSavedStory=links.join(" ");
			saveOptionCookie("txtSavedStory");
		} else removeCookie("txtSavedStory");
		return window.coreTweaks_confirmExit.apply(this,arguments);
	}
}
//}}}
/***
''apply saved story on startup:'' //important note: the following code is actually located in [[MarkupPostBody]].  This is because it needs to supercede the core's getParameters() function, which is called BEFORE plugins are loaded, preventing the normal plugin-based hijack method from working, while code loaded into [[MarkupPostBody]] will be processed as soon as the document is read, even before the TW main() function is invoked.//
<<tiddler MarkupPostBody>>
***/
// // MACRO definitions
//{{{
config.macros.saveStory = {
	label: "set default tiddlers",
	defaultTiddler: "DefaultTiddlers",
	prompt: "store a list of currently displayed tiddlers in another tiddler",
	askMsg: "Enter the name of a tiddler in which to save the current story:",
	tag: "story",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tid=params[0]?params[0]:"DefaultTiddlers";
		var label=params[1]?params[1]:this.label;
		var tip=params[2]?params[2]:this.prompt;
		var btn=createTiddlyButton(place,label,tip,this.setTiddler,"button");
		btn.setAttribute("tid",tid);
	},
	setTiddler: function() {
		// get list of current open tiddlers
		var tids=[];
		story.forEachTiddler(function(title,element){tids.push("[["+title+"]]")}); // always put titles in brackets
		// get target tiddler
		var tid=this.getAttribute("tid");
		if (!tid || tid=="ask") {
			tid=prompt(config.macros.saveStory.askMsg,config.macros.saveStory.defaultTiddler);
			if (!tid || !tid.length) return; // cancelled by user
		}
		if(store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid]))) return;
		tids=tids.join("\n"); // separate tiddler links by newlines for easier reading
		var t=store.getTiddler(tid); var tags=t?t.tags:[]; tags.push(config.macros.saveStory.tag);
		store.saveTiddler(tid,tid,tids,config.options.txtUserName,new Date(),tags,t?t.fields:null);
		story.displayTiddler(null,tid); story.refreshTiddler(tid,null,true);
		displayMessage(tid+" has been "+(t?"updated":"created"));
	}
}
//}}}

//{{{
if (config.options.chkStoryFold==undefined) config.options.chkStoryFold=true;
if (config.options.chkStoryClose==undefined) config.options.chkStoryClose=true;
config.macros.openStory = {
	label: "open story: %0",
	prompt: "open the set of tiddlers listed in: '%0'",
	popuplabel: "stories",
	popupprompt: "view a set of tiddlers",
	tag: "story",
	selectprompt: "select a story...",
	optionsprompt: "viewing options...",
	foldcmd: "[%0] fold story",
	foldprompt: "fold story tiddlers when opening a story",
	closecmd: "[%0] close others",
	closeprompt: "close other tiddlers when opening a story",
	addcmd: "add a story...",
	addprompt: "create a new story",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if (params[0].toLowerCase()=="list") return this.createList(place,params);
		else if (params[0].toLowerCase()=="popup") return this.createPopup(place,params);
		else this.createButton(place,params);
	},
	showStory: function(tid) {
		var tids=[];
		var tagged=store.getTaggedTiddlers(tid,"title");
		if (tagged.length) // if tiddler IS a tag, use tagged tiddlers as story
			for (var t=0; t<tagged.length; t++) tids.push(tagged[t].title);
		else { // get tiddler list from content
			var t=store.getTiddler(tid);
			if (t) { if (!t.linksUpdated) t.changed(); tids=t.links; }
		}
		// see [[CollapseTiddlersPlugin]] for more info, re: folding tiddlers
		var template=null;
		if (config.options.chkStoryFold) template="CollapsedTemplate";
		if (!store.tiddlerExists("CollapsedTemplate")) template=null;
		if (config.options.chkStoryClose) story.closeAllTiddlers();
		story.displayTiddlers(null,tids,template);
	},
	createButton: function(place,params) {
		var tid=params[0]?params[0]:"";
		var label=params[1]?params[1]:this.label; label=label.format([tid]);
		var tip=params[2]?params[2]:this.prompt; tip=tip.format([tid]);
		var fn=function(){config.macros.openStory.showStory(this.getAttribute("tid"))};
		var btn=createTiddlyButton(place,label,tip,fn,"button");
		btn.setAttribute("tid",tid);
	},
	createPopup: function(place,params) {
		var label=params[1]?params[1]:this.popuplabel;
		var tip=params[2]?params[2]:this.popupprompt;
		var btn=createTiddlyButton(place,label,tip,this.showPopup,"button");
	},
	showPopup: function(ev) { var e=ev||window.event;
		var indent="\xa0\xa0";
		var p=Popup.create(this); if (!p) return false;
		createTiddlyText(createTiddlyElement(p,"li"),config.macros.openStory.selectprompt);
		var stories=store.getTaggedTiddlers("story","title");
		for (var s=0; s<stories.length; s++) {
			var label=indent+stories[s].title;
			var tip=config.macros.openStory.prompt.format([stories[s].title]);
			var fn=function(){config.macros.openStory.showStory(this.getAttribute("tid"))};
			var btn=createTiddlyButton(createTiddlyElement(p,"li"),label,tip,fn,"button");
			btn.setAttribute("tid",stories[s].title);
		}
		createTiddlyText(createTiddlyElement(p,"li"),config.macros.openStory.optionsprompt);
		if (store.tiddlerExists("CollapsedTemplate")) {
			var label=indent+config.macros.openStory.foldcmd.format([config.options.chkStoryFold?"x":"\xa0\xa0"]);
			var tip=config.macros.openStory.foldprompt;
			var fn=function(){config.options.chkStoryFold=!config.options.chkStoryFold;saveOptionCookie('chkStoryFold')};
			var btn=createTiddlyButton(createTiddlyElement(p,"li"),label,tip,fn,"button");
		}
		var label=indent+config.macros.openStory.closecmd.format([config.options.chkStoryClose?"x":"\xa0\xa0"]);
		var tip=indent+config.macros.openStory.closeprompt;
		var fn=function(){config.options.chkStoryClose=!config.options.chkStoryClose;saveOptionCookie('chkStoryClose')};
		var btn=createTiddlyButton(createTiddlyElement(p,"li"),label,tip,fn,"button");
		if (!readOnly) {
			var label=config.macros.openStory.addcmd;
			var tip=config.macros.openStory.addprompt;
			var fn=config.macros.saveStory.setTiddler;
			createTiddlyElement(createTiddlyElement(p,"li"),"hr");
			var btn=createTiddlyButton(createTiddlyElement(p,"li"),label,tip,fn,"button");
		}
		Popup.show(p,false);
		e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();
		return false;
	},
	createList: function(place,params) {
		var s=createTiddlyElement(place,"select",null,"storyListbox");
		s.size=1;
		s.onchange=function() {
			if (this.value=="_fold") {
				config.options.chkStoryFold=!config.options.chkStoryFold; saveOptionCookie('chkStoryFold');
				config.macros.openStory.refreshList();
			} else if (this.value=="_close") {
				config.options.chkStoryClose=!config.options.chkStoryClose; saveOptionCookie('chkStoryClose');
				config.macros.openStory.refreshList();
			} else if (this.value=="_add")
				config.macros.saveStory.setTiddler.apply(this,arguments);
			else config.macros.openStory.showStory(this.value);
		}
		setStylesheet(".storyListbox { width:100%; }", "StorySaverStyles");
		store.addNotification(null,this.refreshList); this.refreshList();
		return;
	},
	refreshList: function() {
		var indent="\xa0\xa0\xa0\xa0";
		var lists=document.getElementsByTagName("select");
		for (var i=0; i<lists.length; i++) { if (lists[i].className!="storyListbox") continue;
			var here=lists[i];
			while (here.length) here.options[0]=null; // remove current list items
			here.options[here.length]=new Option(config.macros.openStory.selectprompt,"",true,true);
			var stories=store.getTaggedTiddlers("story","title");
			for (var s=0; s<stories.length; s++)
				here.options[here.length]=new Option(indent+stories[s].title,stories[s].title,false,false);
			if (!readOnly)
				here.options[here.length]=new Option(config.macros.openStory.addcmd,"_add",false,false);
			here.options[here.length]=new Option(config.macros.openStory.optionsprompt,"",false,false);
			if (store.tiddlerExists("CollapsedTemplate")) {
				var msg=config.macros.openStory.foldcmd.format([config.options.chkStoryFold?"x":"\xa0\xa0"]);
				here.options[here.length]=new Option(indent+msg,"_fold",false,false);
			}
			var msg=config.macros.openStory.closecmd.format([config.options.chkStoryClose?"x":"\xa0\xa0"]);
			here.options[here.length]=new Option(indent+msg,"_close",false,false);
		}
	}
}
//}}}
/* 

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-color: #F1F1F1;
	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: #FFF;
	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]]
A Sub-topic is what we call a page ([[Tiddler]]) that has been [[tagged|Tags]] with the title of another tiddler; being tagged by 'A' denotes 'B' as standing //underneath// Topic A in the hierarchy 

That other tiddler (if you are [[Edit]]ing it is the title you type in the "tags" box) is known as the [[Topic]], and is the 'headline' over any other tiddlers that it tags.

See the [[Show references and info]] panel to reveal lists of topics and sub topics.
Scroll to the top of your page, and look for the menu bar that runs right across the top of the page.  If it is hidden, select the "Advanced" mode in the right hand corner.  (In the original version of the manual, click the blue and pink 'target' that is in the topmost right corner of the page - this should "toggle" the top menu in and out of view.)

Once you have the top menu in view, click on the CENTRAL word, "TiddlySpace".

This reveals a drop-down menu that looks like a set of "tabs" in a file (Search, tiddlers, Batch, Tweaks, Import/Export) - click on the ''"Batch"'' tab...

This reveals two more "tabs" titled ''"Public"'' and ''"Private"'' - clicking on either one will list all your locally authored material that is either Public or private.

If you want to change the status of any of these tiddlers, just tick the box beside it, and click the command that you find right below the list.  (So if you want to make a //private// tiddler become //public//, go to the ''"Private"'' tab, select the tiddler you want to change, and then click "make public" at the bottom of that list.
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
<html>
<input name=TIDscore type=radio value="1" />bad
<input name=TIDscore type=radio value="2" />ok
<input name=TIDscore type=radio value="3" />ace
</html>
The following headings are found on each of the 'tabs' in the [[Index]]: 

[[Recent]], [[All]], [[Public]], [[Private]], [[Tags]], [[Spaces]], [[Missing]], [[Orphans]], [[Shadows]].
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.7.0|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|present a 'cloud' of tags (or links) using proportional font display|
!Usage
<<<
{{{
<<cloud type action:... limit:... tag tag tag ...>>
<<cloud type action:... limit:... +TiddlerName>>
<<cloud type action:... limit:... -TiddlerName>>
<<cloud type action:... limit:... =tagvalue>>
}}}
where:
* //type// is a keyword, one of:
** ''tags'' (default) - displays a cloud of tags, based on frequency of use
** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler
** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler
* ''action:popup'' (default) - clicking a cloud item shows a popup with links to related tiddlers<br>//or//<br> ''action:goto'' - clicking a cloud item immediately opens the tiddler corresponding to that item
* ''limit:N'' (optional) - restricts the cloud display to only show the N most popular tags/links
* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters
* ''+TiddlerName''<br>show only tags/links read from a space-separated, bracketed list stored in a separate tiddler.
* ''-TiddlerName''<br>show all tags/links //except// those read from a space-separated, bracketed list stored in a separate tiddler.
* ''=tagvalue'' (//only if type=''tags''//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//
<<<
!Examples
<<<
//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud systemConfig excludeMissing script>>}}}
//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}
//tags listed in// [[FavoriteTags]]
{{{<<cloud +FavoriteTags>>}}}
{{groupbox{<<cloud +FavoriteTags>>}}}
//tags NOT listed in// [[FavoriteTags]]
{{{<<cloud -FavoriteTags>>}}}
{{groupbox{<<cloud -FavoriteTags>>}}}
//links to tiddlers tagged with 'package'//
{{{<<cloud action:goto =package>>}}}
{{groupbox{<<cloud action:goto =package>>}}}
//top 20 most referenced tiddlers//
{{{<<cloud references limit:20>>}}}
{{groupbox{<<cloud references limit:20>>}}}
//top 20 tiddlers that contain the most links//
{{{<<cloud links limit:20>>}}}
{{groupbox{<<cloud links limit:20>>}}}
<<<
!Revisions
<<<
2009.07.17 [1.7.0] added {{{-TiddlerName}}} parameter to exclude tags that are listed in the indicated tiddler
2009.02.26 [1.6.0] added {{{action:...}}} parameter to apply popup vs. goto action when clicking cloud items
2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.
2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error
2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations
2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular
2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler
2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] added 'segments' property to macro object.  Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.TagCloudPlugin= {major: 1, minor: 7 , revision: 0, date: new Date(2009,7,17)};
//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman
//Currently maintained and enhanced by Eric Shulman
//}}}
//{{{
config.macros.cloud = {
	tagstip: "%1 tiddlers tagged with '%0'",
	refslabel: " (%0 references)",
	refstip: "%1 tiddlers have links to '%0'",
	linkslabel: " (%0 links)",
	linkstip: "'%0' has links to %1 other tiddlers",
	groups: 9,
	init: function() {
		config.macros.tagCloud=config.macros.cloud; // for backward-compatibility
		config.shadowTiddlers.TagCloud='<<cloud>>';
		config.shadowTiddlers.StyleSheetTagCloud=
			'/*{{{*/\n'
			+'.tagCloud span {line-height: 3.5em; margin:3px;}\n'
			+'.tagCloud1{font-size: 80%;}\n'
			+'.tagCloud2{font-size: 100%;}\n'
			+'.tagCloud3{font-size: 120%;}\n'
			+'.tagCloud4{font-size: 140%;}\n'
			+'.tagCloud5{font-size: 160%;}\n'
			+'.tagCloud6{font-size: 180%;}\n'
			+'.tagCloud7{font-size: 200%;}\n'
			+'.tagCloud8{font-size: 220%;}\n'
			+'.tagCloud9{font-size: 240%;}\n'
			+'/*}}}*/\n';
		setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');
	},
	getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows
		if (!tiddler.linksUpdated) tiddler.changed();
		var list=[]; for (var i=0; i<tiddler.links.length; i++) {
			var title=tiddler.links[i];
			if (store.isShadowTiddler(title)||store.tiddlerExists(title))
				list.push(title);
		}
		return list;
	},
	handler: function(place,macroName,params) {
		// unpack params
		var inc=[]; var ex=[]; var limit=0; var action='popup';
		var links=(params[0]&&params[0].toLowerCase()=='links'); if (links) params.shift();
		var refs=(params[0]&&params[0].toLowerCase()=='references'); if (refs) params.shift();
		if (params[0]&&params[0].substr(0,7).toLowerCase()=='action:')
			action=params.shift().substr(7).toLowerCase();
		if (params[0]&&params[0].substr(0,6).toLowerCase()=='limit:')
			limit=parseInt(params.shift().substr(6));
		while (params.length) {
			if (params[0].substr(0,1)=='+') { // read taglist from tiddler
				inc=inc.concat(store.getTiddlerText(params[0].substr(1),'').readBracketedList());
			} else if (params[0].substr(0,1)=='-') { // exclude taglist from tiddler
				ex=ex.concat(store.getTiddlerText(params[0].substr(1),'').readBracketedList());
			} else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags
				var tagged=store.getTaggedTiddlers(params[0].substr(1));
				for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);
			} else ex.push(params[0]); // exclude params
			params.shift();
		}
		// get all items, include/exclude specific items
		var items=[];
		var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();
		for (var t=0; t<list.length; t++) {
			var title=(links||refs)?list[t].title:list[t][0];
			if (links)	var count=this.getLinks(list[t]).length;
			else if (refs)	var count=store.getReferringTiddlers(title).length;
			else 		var count=list[t][1];
			if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))
				items.push({ title:title, count:count });
		}
		if(!items.length) return;
		// sort by decending count, limit results (optional)
		items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});
		while (limit && items.length>limit) items.pop();
		// find min/max and group size
		var most=items[0].count;
		var least=items[items.length-1].count;
		var groupSize=(most-least+1)/this.groups;
		// sort by title and draw the cloud of items
		items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});
		var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);
		for (var t=0; t<items.length; t++) {
			cloudWrapper.appendChild(document.createTextNode(' '));
			var group=Math.ceil((items[t].count-least)/groupSize)||1;
			var className='tagCloudtag tagCloud'+group;
			var tip=refs?this.refstip:links?this.linkstip:this.tagstip;
			tip=tip.format([items[t].title,items[t].count]);
			if (action=='goto') { // TAG/LINK/REFERENCES GOTO
				var btn=createTiddlyLink(cloudWrapper,items[t].title,true,className);
				btn.title=tip;
				btn.style.fontWeight='normal';
			} else if (!links&&!refs) { // TAG POPUP
				var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);
				btn.setAttribute('tag',items[t].title);
			} else { // LINK/REFERENCES POPUP
				var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,
					function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;
						var popup = Popup.create(this);
						var title = this.getAttribute('tiddler');
						var count = this.getAttribute('count');
						var refs  = this.getAttribute('refs')=='T';
						var links = this.getAttribute('links')=='T';
						var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);
						createTiddlyLink(popup,title,true);
						createTiddlyText(popup,label);
						createTiddlyElement(popup,'hr');
						if (refs) {
							popup.setAttribute('tiddler',title);
							config.commands.references.handlePopup(popup,title);
						}
						if (links) {
							var tiddler = store.fetchTiddler(title);
							var links=config.macros.cloud.getLinks(tiddler);
							for(var i=0;i<links.length;i++)
								createTiddlyLink(createTiddlyElement(popup,'li'),
									links[i],true);
						}
						Popup.show();
						e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();
						return false;
					}, className);
				btn.setAttribute('tiddler',items[t].title);
				btn.setAttribute('count',items[t].count);
				btn.setAttribute('refs',refs?'T':'F');
				btn.setAttribute('links',links?'T':'F');
				btn.title=tip;
			}
		}
	}
};
//}}}
My children:
[[TagTwoChild]]
[[OtherTiddler]]
My child

ThirdLevel 
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|use alternative ViewTemplate/EditTemplate for specific tiddlers|
This plugin extends the core function, story.chooseTemplateForTiddler(), so that any given tiddler can be viewed and/or edited using alternatives to the standard tiddler templates.
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.09.02 [1.6.1] apply field-based template (if any) *before* tag-based template
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 6, revision: 1, date: new Date(2009,9,2)};

if (!config.options.txtTemplateTweakFieldname)	
	config.options.txtTemplateTweakFieldname='template';

Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// get core template and split into theme and template name
	var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
	var theme=""; var template=coreTemplate;
	var parts=template.split(config.textPrimitives.sectionSeparator);
	if (parts[1]) { theme=parts[0]; template=parts[1]; }
	else theme=config.options.txtTheme||""; // if theme is not specified
	theme+=config.textPrimitives.sectionSeparator;

	// look for template using title as prefix
	if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
		if (store.getTiddlerText(theme+title+template))
			{ return theme+title+template; } // theme##TitleTemplate
		if (store.getTiddlerText(title+template))
			{ return title+template; }	 // TitleTemplate
	}

	// look for templates using custom field value as prefix
	var v=store.getValue(title,config.options.txtTemplateTweakFieldname);
	if (store.getTiddlerText(theme+v+template))
		{ return theme+v+template; }	// theme##valueTemplate
	if (store.getTiddlerText(v+template))
		{ return v+template; }		// valueTemplate

	// look for template using tags as prefix
	var tiddler=store.getTiddler(title);
	if (!tiddler) return coreTemplate; // tiddler doesn't exist... use core result
	for (i=0; i<tiddler.tags.length; i++) {
		var t=tiddler.tags[i]+template; // add tag prefix to template
		var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
		if (store.getTiddlerText(theme+t))	{ return theme+t; } // theme##tagTemplate
		if (store.getTiddlerText(theme+c))	{ return theme+c; } // theme##TagTemplate
		if (store.getTiddlerText(t)) 		{ return t; }	    // tagTemplate
		if (store.getTiddlerText(c))		{ return c; }	    // TagTemplate
	}
	
	// no match... use core result
	return coreTemplate;
}
//}}}
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.1 ($Rev: 4092 $)|
|Date:|$Date: 2008-03-24 12:32:33 +1000 (Mon, 24 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			excerpts:   "excerpts",
			descr:      "descr",
			slices:     "slices",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only"
		},

		tooltips: {
			title:    "Click to sort by title",
			modified: "Click to sort by modified date",
			created:  "Click to sort by created date",
			show:     "Click to show tagging list",
			hide:     "Click to hide tagging list",
			normal:   "Click to show a normal ungrouped list",
			group:    "Click to show list grouped by tag",
			commas:   "Click to show a comma separated list",
			numCols:  "Click to change number of columns",
			excerpts: "Click to show excerpts",
			descr:    "Click to show the description slice",
			slices:    "Click to show all slices",
			contents: "Click to show entire tiddler contents",
			sliders:  "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		}
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/"
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
		// if value is default then remove it to save space
		return store.setValue(title,
			this.config.valuePrefix+opt,
			value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title); break;
			case "normal": return this.createTagglyListNormal(place,title,false); break;
			case "commas": return this.createTagglyListNormal(place,title,true); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title); break;
		}
	},

	getTaggingCount: function(title) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = store.getTaggedTiddlers(title).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
		if (!indent)
			indent = 1;

		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
		var t = store.getTiddler(title);

		if (t && displayMode == "excerpts") {
			var text = t.text.replace(/\n/," ");
			var marker = text.indexOf(this.config.excerptMarker);
			if (marker != -1) {
				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
			}
			else if (text.length < this.config.excerptSize) {
				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
			}
			else {
				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
			}
		}
		else if (t && displayMode == "contents") {
			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		}
		else if (t && displayMode == "sliders") {
			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		}
		else if (t && displayMode == "descr") {
			var descr = store.getTiddlerSlice(title,'Description');
			return descr ? " {{excerpt{" + descr  + "}}}" : "";
		}
		else if (t && displayMode == "slices") {
			var result = "";
			var slices = store.calcAllSlices(title);
			for (var s in slices)
				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas) {

		var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = store.getTaggedTiddlers(title,sortBy);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder) {

		var list = store.getTaggedTiddlers(title,sortBy);
		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";
		for (var i=0;i<list.length;i++)
			if (list[i].title != title)
				if (this.notHidden(list[i].title,this.config.inTiddler))
					childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var refreshContainer = createTiddlyElement(place,"div");
				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);
				if (params[0])
					refreshContainer.setAttribute("title",params[0]);
				else {
        			refreshContainer.setAttribute("title",tiddler.title);
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				removeChildren(place);
				addClass(place,"tagglyTagging");
				if (store.getTaggedTiddlers(title).length > 0) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
			wikify(lookaheadMatch[3],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}
!What are they?
If you are editing a page, you will see a box underneath the main content box titled "tags".  If there is the title of any other page ([[Tiddler]]) in that box then it will act as a "tag" for that page.  Think of Tags as pieces of string that connect all the pages that are related to a particular subject area.

So a tag is really just a [[Topic]] heading, and any pages ([[Tiddler]]s) that are //tagged// with say "Birds" would be [[Sub-topic]]s under that heading heading (so pages on Sparrows, Eagles, Seagulls and Dodo's might all be tagged with "Birds".)

Many individual tiddlers will be tagged with a //variety// of tags, allowing for multiple links across different areas and different themes - Dodo's might __also__ be tagged with "Extinct" or "Dead", for instance. 

One of the interesting features of this format is that a page can be both a chunk of MicroContent in its own right __and also__ a [[Tag|Tags]] gathering up other pages under its heading.

!What's the big deal?

There isn't one, really.  Tags = subject headings and pages in their own right.

However, because pages can be tagged with multiple other headings, a single page can be a [[Sub-topic]] under a whole variety of different headings - as if you could have a page in a book that could fit in a range of different chapters simultaneously.

This fosters [[Integrative]] practice...

!How do I USE this stuff?
Click on the [[Show references and info]] panel for this page (or any page in the manual.)  Look at the Topics and Sub-topics.

This [[Tiddler]] is ''tagged'' as a sub-topic of [[Understanding TiddlyManual format]], i.e. it is one of a set of thematically-connected tiddlers that collectively explain the TiddlyWiki format of the manual.  If you click on the 'understanding tiddlymanual format' title in the "Topics" list, you can see all the other [[Sub-topic]]s listed out.  Clicking on any item in this drop-down 'pick-list' opens that specific tiddler.  This way you can quickly see how any single page in the manual relates to other material here.


!To Add or change a tag

If you are editing a tiddlywiki, it is important to think not aonly about the content of the tiddler, but also how it integrates with (fits into) the wider whole - you can help this by adding the right tags.  You can add tags when you [[Edit]] a Tiddler - it is very easy, and is described in the section on how to [[Edit]].  If you click on the ''edit'' button on this tiddler, you will see the tiddler in [[Edit]] mode, and any tag(s) in the bottom box.  When adding tags it is important to get the spelling and capitalisation correct.  For existing tags you can use the button "tags" right underneath the tags box - it will list off all the tags in the document - select the one you want to add, and it will automatically be added.
/***
|''Name:''|TemplateFormatterPlugin|
|''Author:''|Martin Budden ( mjbudden [at] gmail [dot] com)|
|''Description:''|Plug to demonstrate template formatter|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/experimental/TemplateFormatterPlugin.js |
|''Version:''|0.0.3|
|''Date:''|Mar 19, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |
|''~CoreVersion:''|2.3.0|

!!Description
Provides a formatter that can be used to expand templates

!!Usage
Then include this plugin and tag it systemConfig in the normal way. Templates can include:
{{{
<!--<<macroname macroparameters>>--> : macro that is expanded into the template
<!--comment--> : comment that is included in the output
<!--@@comment@@-->> : comment that is not included in the output (can be used to document the template itself)
}}}

***/

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

config.templateFormatters = [
{
	name: 'templateElement',
	match: '<!--(?:<<|@@)',
	lookaheadRegExp: /<!--<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>-->|<!--@@([^@]*)@@-->/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			w.nextMatch = this.lookaheadRegExp.lastIndex;
			if(lookaheadMatch[1]) {
				invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
			}
		}
	}
}
];

config.parsers.templateFormatter = new Formatter(config.templateFormatters);
config.parsers.templateFormatter.format = 'template';
config.parsers.templateFormatter.formatTag = 'TemplateFormat';
} //# end of 'install only once'
//}}}
/***
|''Name:''|TemplatePlugin |
|''Description:''|Collection of functions to support rendering of tiddlers through HTML templates |
|''Author:''|JonathanLister |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/plugins/TemplatePlugin.js |
|''Version:''|0.0.4 |
|''Date:''|25/3/08 |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.3|

The templateTiddlers macro finds a set of tiddlers and renders them once each through a template. The template can contain additional
calls to the macro to allow for e.g. looping inside a template (think RSS items). It needs to be able to support recursion, so that sub-templates make sense.

Usage:
{{{
<<templateTiddlers template:RssTemplate filter:"[tag[!excludeLists]]" [wikitext:true]>>
<<templateTiddlers RssTemplate filter:"[tag[!excludeLists]]">> // template qualification is optional
}}}

Parameters can be:
template - the name of the template
filter - a tiddler filter
wikitext - if true, renders the target tiddler's text as wikitext instead of using the special template formatter

If a parameter does not have a qualifier, it is assumed to be the template name

|''Name:''|templateTagsMacro |
|''Description:''|Renders a tiddler's tags through a template |

Usage:
{{{
<<templateTags template:RssItemCategoryTemplate>>
<<templateTiddlers RssTemplate>> // template qualification is optional
}}}

The templateTags macro renders a tiddler's tags through a template in an analagous way to how templateTiddlers renders a set of tiddlers. Future development might offer support for other data items other than tags, but this is what is needed for RSS, the use-case driving the development.

|''Name:''|PermalinkMacro |
|''Description:''|Creates a permalink to the tiddler |

Usage:
{{{
<<permalink>>
}}}
***/

//{{{
if(!version.extensions.templatePlugin) {
version.extensions.templatePlugin = {installed:true};

expandTemplate = function(template,tiddlers,wikitext)
{
	var defaultTemplate = "<<view text>>";
	var t = template;
	template = template ? store.getTiddlerText(template,template) : defaultTemplate;
	if(!tiddlers) {
		// no tiddlers provided, so create a temporary tiddler
		tiddlers = [];
		tiddlers.push(new Tiddler("temp"));
	}
	var output = "";
	// decide whether to parse as wikitext or simple template
	var format = wikitext ? null : 'template';
	for(var i=0; i<tiddlers.length; i++) {
		output += wikifyStatic(template,null,tiddlers[i],format).htmlDecode();
		// wikifyStatic returns html; htmlDecode is used so that nesting of templates doesn't cause encoded characters to be wikified
	}
	return output;
};

config.macros.templateTiddlers = {};
config.macros.templateTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	p = paramString.parseParams("anon",null,true,false,false);
	var template = getParam(p,"template",null);
	if(!template)
		template = getParam(p,"anon",null);
	var filter = getParam(p,"filter",null);
	var wikitext = getParam(p,"wikitext",null);
	var tiddlers = [];
	if(filter) {
		tiddlers = store.filterTiddlers(filter);
	} else {
		// no filter provided, so inherit or create temp tiddler
		tiddlers.push(tiddler ? tiddler : new Tiddler("temp"));
	}
	var output = expandTemplate(template,tiddlers,wikitext);
	// NOTE: the line below is contentious - should the .htmlEncode() be used?
	// if you don't use it, it seems that output is not always added in a format suitable for innerHTML
	// this is only an apparent problem when templateTiddlers is nested inside other templates (at two levels deep!)
	// this requires tests writing to iron this out once and for all
	// ALSO: HTMLPreviewTemplate uses the output of expandTemplate directly, but hasn't hit this problem yet (possibly because the nesting only goes one level deep on templates tested so far)
	//place.innerHTML += output;
	var newcontent = document.createElement('div');
	newcontent.innerHTML = output;
	while (newcontent.firstChild) {
        	place.appendChild(newcontent.firstChild);
	}
};

config.macros.templateTags = {};
config.macros.templateTags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	p = paramString.parseParams("anon",null,true,false,false);
	var template = getParam(p,"template",null);
	var tiddlers = [];
	if(!template)
		template = getParam(p,"anon",null);
	for(var i=0;i<tiddler.tags.length;i++) {
		var t = new Tiddler(tiddler.title);
		t.tags = [tiddler.tags[i]];
		tiddlers.push(t);
	}
	var output = expandTemplate(template,tiddlers);
	place.innerHTML += output;
};

config.macros.permalink = {};
config.macros.permalink.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var t = encodeURIComponent(String.encodeTiddlyLink(tiddler.title));
	createTiddlyText(place,window.location+"#"+t);
};

config.macros.view.views.slice = function(value,place,params,wikifier,paramString,tiddler) {
	var slice = "";
	if(params && params[2]) {
		slice = store.getTiddlerSlice(tiddler.title,params[2]);
		if(slice) {
			createTiddlyText(place,slice);
		}
	}
};

config.macros.view.views.section = function(value,place,params,wikifier,paramString,tiddler) {
	var section = "";
	if(params && params[2]) {
		section = store.getTiddlerText(tiddler.title+"##"+params[2]);
		if(section) {
			createTiddlyText(place,section);
		}
	}
};

} //# end of 'install only once'
//}}}
HEEHEE
You are reading a Tiddler right now.  

Tiddlers contain the content in a Tiddlywiki - they are like pages, only they are much more flexible than paper.  They are like paragraphs, only they can be longer, they can contain video clips, or pictures.  They are like 'notes' or cards in a card-index... but again, they are slightly different from these, too.  if you are puzzled about the name there is a bit of explanation/apology below!
!Integrating information
Tiddlers are where you display information in your [[Wiki]], but they are also concerned with //linking// or //integrating// information with other relevant content.  They can be [[tagged|Tags]], linking them together as [[Sub-topic]]s under a particular heading.  The same tiddler can be a sub-topic under multiple different topic headings (like a page that belongs in multiple chapters), and a tiddler can itself act as a topic heading (which is what a [[tag|Tags]] is.)  Confused?  Please don't be - it is simpler than it sounds, and really its just a database of content that can be organised in masses of different ways.
!Tiddler menus
Tiddlers have their own [[Menus]] that allow you to do all kinds of things like compare them, sort them, edit them, etc

!Show references and info
Tiddlers are where you read or watch information, but they are also grouped in lots of ways that help you read around a subject.  An important menu that you find (top right, beside the title) on every tiddler is the [[Show references and info]] menu - clicking the black sign opens a panel that helps you see how //this material// relates to the wider content.  Try it with this tiddler.

!About Tiddlers
!!!What you can do with them:
You can [[Edit]] Tiddlers very easily, as well as write your own ones to add to your local version of this Manual.
In general we find it helps to use the [[+ Manualize our work]] page to generate brand new content, as it helps ensure that your new tiddler has some appropriate [[Tags]] that will help others locate it, but you can also start from scratch!
''__To generate a new [[Tiddler]] click here:__'' 
<<newTiddler>>

!Tiddlers - just web-pages?
Unlike other web - based '[[Wiki]]s' the TiddlyWiki consists not of multiple //web pages// (that each have to "load" separately via your internet connection) but instead it is formed of multiple [[Tiddler]]s, that can be manipulated ''within a single web page'' - so as you read a tiddlywiki you are opening and closing series of separate Tiddlers that are part of a single file, a 'non-linear document'.  This is generally quicker than having to load whole new web-pages with each click on the many [[Links]] between different parts of the text. It also means that you actually download the whole thing into your local computer when you open the manual, so if you disconnect the internet after you have opened the manual, you can still keep reading and flicking through pages (though you wont get streaming video and pretty pictures!)

!Opening Tiddlers on my [[Desktop]]
The manual allows you to open as many tiddlers as you want on your [[Desktop]], and you can see what you have opened at any one time using your [[Currently Open]] list.

!About that name:
The [[designer of the software|JeremyRuston]] that powers Tiddlymanuals (called TiddlyWiki) refer to the chunks of MicroContent that make up a larger wiki document as "Tiddlers".  

In developing the manual we first tried to minimise the 'shock of the new' and stick to naturalistic language where possible.  We thought about 'pages', notes' 'cards' but found that none of these names quite captured the more dynamic quality of tiddlers.  So for a while we referred to tiddlers as "Thoughts".  A "Thought" and a "Tiddler" were synonymous.  We have since 'recanted' from this, and find that the neologism 'Tiddler' is more effective and less confusing.

[[JeremyRuston]], the original author of tiddlywiki described some deliberate intention behind the playfulness in his naming; "as though leaving the door open for purposeful renaming/reclaiming of this very plastic software form".  It was in this spirit that we originally decided to change the name "Tiddlers" to "Thoughts" for this manual; on the basis that it avoided the neologising that frightens/repels many non-technologically minded users.  In the end, though, we have returned to Tiddlers, as we decided our use of the word Thought was equally uncomfortable and forced.  Let us know what you think at [[Feedback please!]]
This is one of the options contained in the [[Show references and info]] panel that is accessible for every page ([[Tiddler]].)

This menu option opens a drop down pick-list of all/any  related Tiddlers that link to (or 'reference') the one you are currently studying.

For example, clicking on the [[References]] option from menu for //this// Tiddler right here will show a list of all the other Tiddlers that have [[Links]] to this one. 

!Why?

This is more obviously useful in a clinical/learning framework.  A worker might read a Tiddler about a particular subject, and use the [[References]] button to locate //associated// material from a wide variety of areas. 

Sometimes, referenced associations discovered in this way will be //unexpected//, or will have been //overlooked//, so that fostering a habit of checking for [[Integrative]] links in this way is a helpful KeyWorker practice.
/***
|''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);
//}}}
What you are reading is a TiddlyManual.  It is a way of manualizing complex interventions that offers multiple additional functions over paper "how-to-do-it" guides, and a lot more than other web-based treatment manuals that do not use the  highly innovative opensource software called TiddlyWiki (hence the name.)

!14 min introduction to the AMBIT Tiddlymanual
By DickonBevington
<html><iframe width="640" height="360" src="//www.youtube.com/embed/-RksN42-G6k" frameborder="0" allowfullscreen></iframe></html>
!Brief narration and animation to explain "Why use Wikis?"
By DickonBevington
<html><iframe width="480" height="360" src="http://www.youtube.com/embed/EZ_yHJ1WLTE?rel=0" frameborder="0" allowfullscreen></iframe></html>
!A tour of the AMBIT "theme" - how to read and navigate in <9 mins
<html><iframe width="480" height="360" src="http://www.youtube.com/embed/TJ4WFQ1ov7g?rel=0" frameborder="0" allowfullscreen></iframe></html>

Tiddlymanuals take much inspiration from the 'OpenSource' movement in computer software development.  They are freely available (though released under a Creative commons [[License|Licensed]]), as the notion of closely guarded, and expensively-marketed, intellectual property in respect of best psychotherapeutic practice seems contradictory in the helping professions.  We acknowledge the support of the [[Anna Freud Centre]] and our [[Sponsors]] in allowing this development.

''@@color(red):Practitioners using Tiddlymanuals remain responsible for their own professional practice.@@''

~TiddlyManuals take the form of [[Wiki]]s, but they function as completely self-contained and easily editable documents, too; they can be downloaded, saved locally, and run from a USB stick, or a local computer without any access to the internet.
 
See [[Using the Manual]] for more details, and go to @tiddlymanuals to see other versions of tiddlymanuals that are available.
~TiddlySpace is the web-based environment that hosts ~TiddlyWiki and [[TiddlyManual]]s, including this manual that you are reading.  

~TiddlySpace uses cunning software in the web-based servers that you link to when you type in the address http://tiddlyspace.com.  Like tiddlymanuals, it is based on [[TiddlyWiki]].  In common with other tiddlywiki, a copy of all public-facing parts of any ~TiddlySpace can be downloaded, and can be run (completely independent from the internet) using no extra software (it runs inside a normal browser) on a desktop computer, laptop, iphone, etc - where it can be edited, stored, and from which it can be emailed, etc.  

Tiddlywiki is an open source software resource that is freely available and supported by a large international community of programmers, most of whom give their time and expertise for free.  

~TiddlySpace is also supported by ~BT-Osmosoft and the original author of ~TiddlyWiki, Jeremy Ruston, and we acknowledge the support of all of these people.

!What's special about ~TiddlySpace?

@@N.B. YOU DO NOT NEED TO UNDERSTAND THIS TO USE THE MANUAL!@@

~TiddlySpace is a place to host and share tiddlywikis - but the way it is set up also allows some pretty unique things to happen that should encourage a respectful and generous sharing and development of ideas between individuals, and small-trusted-groups of people.  

There is a growing body of documentation about ~TiddlySpace, but below are some key points to help the curious understand it:

!!!A "Space"
*A [[Space|Spaces]] is really just a [[Wiki]], that is //hosted// online in the TiddlySpace server.
*It can be run ('hosted' or 'curated') by an individual or by a "small-trusted-group"
*A TiddlySpace can hosts a collection of [[Tiddler]]s in a Wiki.
*There's an emphasis on the wiki as a //clearly-boundaried// collection of information that I (or my group) "curate" in order to share and develop this over time.
!!!Ownership and control
*Any tiddlers held within in my space can be changed by me, ''or by anyone else who I allow to become a member of my Space''.
**''[[Making someone a member of a space]]'' is the equivalent to 'giving them the keys to the door' - not unlike allowing someone access to your office.  
**Do not make people that you do not know and trust well into members of a precious space that carries valuable material.
**If you want to collaborate with them, you can always (at the click of a button) [[Make a new space]] specifically to share with that other person, and by [[Including spaces]] you can still work on material without risking anything.
!!!Public and Private
*Tiddlers have two states: either [[Private]] or [[Public]].  They show their status with the concentric circles icon, which you can see if you look at the tiddler in [[Edit]] mode:
**The pink inner circle denotes "THIS TIDDLER IS PRIVATE"
**The blue outer circle denotes "THIS TIDDLER IS PUBLIC".
*__Changing the status of a tiddler between PUBLIC and PRIVATE__
**Any member of the space that //hosts// these tiddlers can toggle them between 'private' or 'public' status - .
**This is very useful if a team is working on a draft of material that they are yet to all agree upon:
*DRAFTS to FINAL versions: 
**'Unfinished' tiddlers (ones that a team is still working on) can remain 'private' 
**When the group agrees on the content they are ready to 'publish' that tiddler.
!!!Security
**N.B. Although the security levels for private tiddlers are robust, they are certainly NOT sufficient to store any personal data about third parties (clients, etc).
!!!Inclusion
*[[Including spaces]] is easy - I can "include" the public tiddlers from anyone else's space in my own space.
**Once a separately-curated space is included in mine I can [[Edit]] those tiddlers - which is really just over-writing them in my space.  If I then delete my edited version of "their" tiddler, the original tiddler will 'pop back' as their site is still included in mine.  
**It is important to note that when I edit //included material// I am NOT altering the original in any way.
**This is how a local team setting up, say, an AMBIT manual manages to share the common 'Core content' from the Anna Freud Centre, but to be able to add their own material or make edits to the included (copied) tiddlers that have originated from the AFC.
!!!Inclusion to add functions
*A wide range of other spaces exist already that, if you include them, do not add content, but instead add different //functions//, or different //styles and themes//.
**For instance you can include the separate space @simplesearchplugin and this adds a really nice search engine to your wiki.
!!!From Facebook to Mindbook?
*There is a developing social networking function within ~TiddlySpace that makes use of these curious and quite unique capabilities.
**Interacting with other users of tiddlyspace is very different from the //''breadth''// of coverage of, say, Facebook, and is more focussed on the //''depth''// of exchange... Less about the Face, perhaps; more about exploring the mind behind.
!!!Boundaries
*Being a member of a Space means I can see both public and private tiddlers, but if I visit someone else's space, I can only see what they have made public.
Most of the other functions in this area are only for advanced users.

!Finding it:

You find the [[Top menu bar]] by switching the manual to [[Advanced mode]].  On this bar (across the very top of your desktop, soo you may need to scroll up to find it) you'll see a small blue/pink "Target" icon to the right.  Click it.  A drop-down menu is revealed.  Most of this is not relevant to you as a [[TiddlyManual]]s user.

!What's there?

This is a menu provided by the web-based "hosting" site (in [[BT Osmosoft|http://osmosoft.com/#TiddlySpace]]).

Included in this is: 
**The [[Space menu]] - Referred to as "THIS SPACE" - about your wiki (members, content, etc)
**The [[User menu]] - Referred to as "YOUR ACCOUNT" - about YOU as a member of TiddlySpace.









/***
|''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''|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:''|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);
//}}}
!What is it?

TiddlyWiki is an open source software invented by Jeremy Ruston at BT Osmosoft.  We acknowledge the kind and friendly support we have had from our open collaboration with BT Osmosoft, including Jeremy Ruston and his team, the extremely helpful [[open source community|https://groups.google.com/forum/#!forum/tiddlywiki]] which you can find via the link or via {{{https://groups.google.com/forum/#!forum/tiddlywiki}}}).  We also acknowledge Jonathon Lister and Joshua Bradley, who have been the technical wizards behind the development of the new 'ambit theme'.  

!No, but what IS it?!

Tiddlywiki are documents, but they don't work like paper.  They look (superficially) very similar to other websites - you "read" them in a browser, such as Firefox, Google Chrome, Safari, or Internet Explorer (old versions of IE are not so good at handling them).

By clicking on HighlightedWords these function as [[Links]], which instantly open a separate [[Tiddler]].  

What you are reading right now is called a [[Tiddler]]. 

In a tiddlywiki, instead of a link opening a whole new web-page, however, it just opens a new 'note' inside the existing page - think of individual Tiddlers as paragraphs if you like, or 'post-it notes', or 'Thoughts', which can be collected together and sorted quickly and easily in lots of different ways.  Each tiddler can be opened, looked at, closed, a bit like having immediate access to lots of sheets of paper which you can pull out and file away again at the click of a mouse...

The basic architecture of the manual is a large number of these (more or less) brief [[Tiddler]]s - each of which is connected to other Tiddlers - via two kinds of 'connectors':

*[[Links]], as described above, which directly open another tiddler on your desktop (see it listed at the bottom of your [[Currently Open]] list.)
*[[Tags]] - which link up the content of different tiddlers as sub-topics under a topic heading (for instance this tiddler is tagged as one of a set that describe what a practitioner needs to know about [[Using the Manual]].)   

[[Tags]] offer an important way of integrating different levels and areas of information, which a conventional (linear) book format would struggle to do.  A single [[Tiddler]] can easily be tagged with multiple tags - so it is a great way to cross-reference pieces of data.

!I am a techie, what IS IT?!

It is a single ''html'' file, that uses ''javascript'' and ''CSS'' tricks to use the standard web-brower as a platform for editing and saving the self-contained wiki.  Within the single html file, you find tiddlers that are effectively acting as the 'software' that define the behaviour of the wiki, and others that contain the content.

TiddlySpace offers a serverside environment to host multiple tiddlywikis, that have public and private tiddlers, and which allows the public content of one individually-curated wiki to be included within another wiki.

For more information on this wonderful free software resource see [[www.tiddlywiki.com|http://www.tiddlywiki.com]].  To understand how to get the best out of it, see the content tagged as [[Understanding TiddlyManual format]].
/***
|''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|
!What is it?
The Top menu bar is a bar across the top of your [[Desktop]], that contains more advanced menus.  
!Where is it?
''Normally this is hidden, because you don't need it for ordinary use''!  However, you can reveal it by selecting the [[Advanced mode]] in the [[Mode and Login panel]].  You need to be [[logged in|Log in]] as a [[member|Making someone a member of a space]] before you see this option.

Because it sits across the very top of your desktop you may have to scroll to the very top of the page to reveal it.  
!Contents
The Top menu bar reveals more advanced menus:
!!1. The [[TiddlySpace menu]] 

This is a menu provided by the web-based "hosting" site (in [[BT Osmosoft|http://osmosoft.com/#TiddlySpace]]) that you access this via the "target" icon (the TiddlySpace icon) to the right.  Included in this is: 
**The [[Space menu]] - Referred to as "THIS SPACE" - about your wiki (members, content, etc)
**The [[User menu]] - Referred to as "YOUR ACCOUNT" - about YOU as a member of TiddlySpace.

!!2. STATUS, TIDDLERS, PLUGINS, BATCH, TWEAKS, IMPORT/EXPORT, SYNC

*''STATUS'' - whether you are a member of this [[Space]] or not, etc
*''TIDDLERS'' - is a full [[Index]] of all the content, that can be listed in different ways as well as providing another Search box.
>''Recent'' - lists all the tiddlers in this [[Space]]  in ''Date order according to when they were last edited''.
>''All'' - lists all the tiddlers in ''Alphabetical order''
>''Public'' - lists only the tiddlers that are ''Public'', in alphabetical order.
>''Private'' - lists only the tiddlers that are ''Private'', in alphabetical order (note that in TiddlySpace a [[Tiddler]] can either be Private of Public, and if you have authority to edit your team's version, you can select whether a tiddler is Private of Public (in general tiddlers in a local TeamTemplate that are still "under discussion" can be designated as private, but we encourage teams to work as transparently as possible.)
>''Tags'' - lists the [[Tags]] in the manual, and how many sub-topics are tagged with this topic heading.
>''Spaces'' - lists all the Spaces included in the manual and how many tiddlers each one contains.
>''Missing'' - lists all the tiddlers that have links to them in other tiddlers, but which have not actually been written yet (a useful, if persecuting, resource for authors!)
>''Orphans'' - lists all tiddlers in manual that are not linked or tagged to any other content, and so might be seen as disconnected from the whole.
>''Shadows'' - lists all tiddlers that are present in every tiddler 'by default' - generally these have no content of interest, but adjust the look and behaviour of the wiki.  In a TiddlySpace these are 'curated' elsewhere, so even if they are edited by accident, the adapted version can simply be deleted and the original will pop back up to replace it.
*''PLUGINS'' - lists tiddlers that are designed to add functionality to the wiki, rather than content (the odd thing about TiddlyWiki is that in a //single// (html) file you can carry all the 'software' to make it run inside a browser, as well as all the content that the user authors.)
*''BATCH'' - offers the chance to change the status of a whole selcted batch of tiddlers (from Provate to Public, or vice versa)
*''TWEAKS'' - offers options for tweaking how your browser handles the tiddlywiki - not for the casual user.
*''IMPORT/EXPORT'' - offers the registered user the opportunity to import tiddlers from another Tiddlywiki or to [[Download a copy!]] of the manual so that it is a free-standing (html) file on your local computer (or stored on a USB stick, etc).  The Downloading of Tiddlymanuals is not very reliable at present as we have been focusing on getting the online performance working (and there is not a great deal of advantage of being ale to have downloadable versions right now.)  However, the ability to run a tiddlymanual completely free from the internet is what offers the potential for using a tiddlymanuals as a wiki-based note-taking system, and this is in development... watch this space!
* ''SYNC'' is only relevant for a downloaded version that you then want to sync with your web-basd version - not relevant for tiddlymanuals at this stage of development!
!What is this page for?

This is really a scrapbook of thoughts and lessons that have been learned about the "how" of editing and authoring content in tiddlymanuals.

!Top Tips
* Think of [[Tags]] as "chapter headings"
** A page can have multiple tags (ie can exist as part of multiple chapters!)
** There's probably an optimum number - depends on how "core" that page is - but too many tags on a page reduces the specificity (think brains - you need clear connection pathways, but not every cell has to be directly connected to every other cell - that would be chaos!)

* Think very carefully about the TITLE of a new page (Tiddler).
** People might well search for it in the search bar - use either the most likely words people would search for, or alternatively a memorably "off-beat" phrase that people might remember.

* Size matters
** Try to keep one "bitesize chunk" of information to one page ([[Tiddler]]).  
** If you are going off onto a sub-topic, or a different topic, put in a LINK (double square brackets) and make another page for that.

* Balance "centripetal" and "centrifugal" forces in your writing - HUH?!
** A well written page has a balance between:
*** Being very //interesting-and-useful-in-itself// (''"centripetal"'' forces that "draw the reader in") - i.e. great content, succinctly put, doing what it says on the tin (title)
*** Being very //good-at-connecting-me-to-other-related-material// (''"centrifugal"'' forces that "entice the reader outwards") - i.e. great sets of [[Link]]s and well [[Tagged|Tags]] so that related material is within easy reach.
This is what we call a page ([[Tiddler]]) that is the 'Headline' that stands over a number of [[Sub-topic]]s - these are gathered "under" the Topic heading, and you can see this arrangement if you open the [[Show references and info]] panel at the top of each page.  Standing "under" a Topic, you may find [[Sub-topic]]s.
/*{{{*/
(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>
*/
Links to Government Documents about Open Source:


<html><ul><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/All-about-Open-Source-v1.pdf">All about Open Source v1 (pdf, 490kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/All-about-Open-Source-v1.odt">All about Open Source v1 0 (odf, 121kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/ICT-Advice-Note-Procurement-of-Open-Source.pdf">ICT Advice Note - Procurement of Open Source (pdf, 169kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/ICT-Advice-Note-Procurement-of-Open-Source.odt">ICT Advice Note - Procurement of Open Source (odf, 37kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/Open-Source-Option-v1.pdf">Open Source Options v1.0 (pdf, 581kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/Open-Source-Options-v1.odt">Open Source Options v1.0 (odf, 125kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/Total-Cost-of-Ownership-things-to-consider-v1.pdf">Total Cost of Ownership - things to consider v1.0 (pdf, 124kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/Total-Cost-of-Ownership-things-to-consider-v1.odt">Total Cost of Ownership - things to consider v1.0 (odf, 198kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/PPN Open Source (pdf, 122kb).pdf">PPN Open Source (pdf, 122kb)</a></li><li><a href="http://www.cabinetoffice.gov.uk/sites/default/files/resources/PPN Open Source (odf, 14kb).odt">PPN Open Source (odf, 14kb)</a></li></ul></html>
The manual is written in a novel format which is very easy to use; like most things, it takes a little getting used to to get the best out of it.

!What's on my screen?

Look at [[How to read this Manual]] or take a [[Video tour of the AMBIT manual]] for an explanation of all the buttons and features on your screen that will help you navigate and read material.  N.B. IT IS REALLY WORTH LOOKING AT THIS, as the format behaves slightly differently from conventional websites.

!Getting it to work in a big organisation

You may have to make a few calls and changes to get the best out of a TiddlyManual in a large organisation that has old I.T. (such as the NHS!) - these things will get easier over the next year or so, but are surmountable now.  See [[Organisational support for the technology to run TiddlyManuals]].

!Editing  a local version

Local teams can open their own version of a tiddlymanual, which includes all the content curated by a central source (such as the [[AMBIT]] project at the  [[Anna Freud Centre]]) and they are encouraged to [[Edit]] their local version, to "tune" it to local needs, and local culture.  There is a [[Video introduction to editing a tiddlymanual]] as well.

!Technical Glossary

All the technical terms and bits of the TiddlyManual you are likely to wonder about are [[tagged|Tags]] with the title of this tiddler (Understanding TiddlyManual format), so just look at the [[Show references and info]] panel for this tiddler (above, to the right of the title) to see all the [[Sub-topic]]s under this heading.

!Who wrote which bits?

[[TiddlyManual]]s encourage local teams to incorporate the core content of a manual (which is curated centrally) but to add local //customisations and and adaptations// - a process we refer to as [[Manualization]].  

It is worth knowing how to find out [[Who wrote which bits?]]

!Explain ~TiddlyWiki?

Have a look at TiddlyWiki to get more information on what makes it tick.

!Changing the interface

There are almost limitless ways to [[Change the interface]] of a Tiddlywiki to suit tastes, and some of the simpler ways to do this are described.

Most significantly, this is a [[Dynamic, adaptive Manualization]] that is not a static document, delivered "once and for all" from distant authorities, but which functions as a collaborative "work in progress" - integrating local expertise, creativity and service-user feedback into team-based edits to the local TeamTemplate.

Understanding these things will help you get to what you want or need faster.
This is found on what is called the [[Top menu bar]], and it is hidden unless you go into the [[Advanced mode]].

!MENU CONTENTS
!!!Your Identity
You can link your TiddlySpace username and password to other verified web identities such as Open ID
!!!Your Spaces
This is where you can [[Make a new space]] or select and open other spaces (wikis) that you already curate - if you have other spaces they will be listed out here.  For instance, some people use TiddlyWiki's in TiddlySpace to organise notes, project-manage, etc...
!!!Your password
This is where you can opt to change your password to a new one.
!To GET OUT of the menu
Click anywhere OFF the drop-down box, on the dark background.


!Purpose
To help new users find more specific information about how the manual works
!!!About the Manual
The material and this format is released under a [[Creative Commons License|Licensed]] and we ask users to respect this.  Enquiries about the terms of the license can be directed to the Anna Freud Centre. 

Aimed at AMBIT users, there is a [[Video introduction to how AMBIT uses and shares new learning via the TiddlyManual]].  

!!!1. How to read this Manual
[[How to read this Manual]] explains how to get the best out of this novel format as a reader, including a [[Video tour of the AMBIT manual]] theme that shows you round the new 'theme' (Feb 2012.)

!!!2. Find your way around
[[Find your way around]] shows the different ways to find out what you need (indexes, searching, navigating, etc).

!!!3. Learning from other teams manualizing their practice
The manual encourages a [[Community of Practice]] and there are variety of [[Comparing and Sharing functions]] that encourage curiosity about what other teams are doing that might improve our team's work.

!!!4. Add or edit material in your manual
See [[+ Manualize our work]] for information on how to adapt or [[Edit]] your local version of this manual to fit what //you// are doing in //your// setting, working with //your// clients.

!!!5. Understanding ~TiddlyManual format
[[Understanding TiddlyManual format]] explains basic details about how the this software works - it is worth spending a bit of time on this if you are getting started.

!!!6. Organisational support for the technology to run ~TiddlyManuals
[[Organisational support for the technology to run TiddlyManuals]] explains some of the simple manoeuvres that can help get the best out of this material even if your organisation is using ancient browsers and operating systems (which in the NHS is not uncommon.)

!!!7. Print material from the manual
[[Print material from the manual]] explains printing material from the manual, which is easy, and allowed under the terms of the [[Creative Commons License|Licensed]].  Don't expect to be able to just "print the whole thing out", though!

!!!8. Change the interface of your manual.
[[Change the interface]] lets you do things like add an icon to represent your team, change the size of the typeface, change the Title, the Subtitle, etc.

!!!9. Videos
[[Videos]] are being added all the time to [[TiddlyManual]]s: there is also a growing collection of streaming videos (you must be online to access the streaming content) that describe how to use the manual, theoretical foundations, and illustrate a range of therapy techniques (these are being added to quite regularly, so check back occasionally.)

!!!9. Help improve this
See [[Feedback please!]] for how to give feedback on what you like and more particularly what you do //not// like.  There is also information here about to get technical information that you haven't found in the manual.

!!!FUTURE DEVELOPMENT
''__Interactive Case Recording__'' - not in operation yet...

[[Interactive Case Recording|ICR]]  (or [[ICR]]) is only relevant to the AMBIT tiddlymanual (@ambit) - and ''@@color(orange):N.B. - This function is not yet in operation (Winter 2012/13)@@'', but it should be available to try out in due course.  

[[ICR]] involves //downloading// an entire fresh //copy// of the online treatment manual //for each client//, and using this downloaded copy (that then works completely separate from the internet - just any document file that you can store in a secure location) as a 'workbook' //in which the worker(s) can make notes on that young person, which can easily be exported to other databases//; using the wiki adds a lot of functionality to paper notes (searchability, tagging, integrated outcomes measures, etc.)  Watch this space!



 
/***
|''Name:''|ValueSwitcherPlugin|
|''Description:''|Gather values from a definition tiddler, and present the user with a UI for setting a value from those available options as an extende field |
|''Version:''|0.2|
|''Date:''|25 Sept, 2007|
|''Source:''|http://www.hawksworx.com/playground/TeamTasks/#ValueTogglerPlugin|
|''Author:''|PhilHawksworth (phawksworth (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.3|
***/

//{{{
// Ensure that this Plugin is only installed once.
if(!version.extensions.ValueSwitcher) 
{
	version.extensions.ValueSwitcher = {installed:true};
	config.macros.ValueSwitcher = {

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {

			var fieldPrefix = "tt_";
			var params = paramString.parseParams("anon",null,true,false,false);
			var taskTiddler = getParam(params,"tiddler",null);
			if(!taskTiddler)
				taskTiddler = story.findContainingTiddler(place);
			if(!(taskTiddler && taskTiddler != 'undefined')) {
				return;
			}
			var ctrlType = getParam(params,"type",null);
			//var id = taskTiddler.id;
			//var title = id.substr(7);
			var tiddler = store.getTiddler(taskTiddler);

			// build a drop down control
			if(ctrlType == 'dropdown') {
				var showPleaseSelect = getParam(params,"showPleaseSelect", true);
				var valueSrc = getParam(params,"valuesSource", null);
				if(!valueSrc) {
					displayMessage("No definition tiddler defined for a TeamTasks dropdown.");
					return;
				}
				var fieldName = fieldPrefix + valueSrc.toLowerCase().substr(0,valueSrc.length-11);
				var selected = fieldName + '::' + store.getValue(tiddler,fieldName);
				var values = this.getDefValues(valueSrc);
				var options = [];
				if(showPleaseSelect==="true") {
					options.push({'caption': 'Please select', 'name': null});
				}
				for (var i=0; i < values.length; i++) {
					options.push({'caption': values[i], 'name': fieldName + '::' + values[i]});				
				}
				var dd = createTiddlyDropDown(place,this.setDropDownMetaData,options,selected);
				dd.tiddler = tiddler;
			}
			// Build a free text box.
			else if(ctrlType == 'freetext') {
				var metaDataName = getParam(params,"metaDataName", null);
				if(!metaDataName) {
					displayMessage("No metaDataName defined for a TeamTasks free text box.");
					return;
				}	
				var fieldName = fieldPrefix + metaDataName.toLowerCase();
				var text = store.getValue(tiddler,fieldName);
				if(text == undefined) text = "";	
				var i = createTiddlyElement(place,"input",null,null,null,{"value":text, "type":"input", "ttname":fieldName});
				i.onblur = config.macros.ValueSwitcher.changeFreetext;
			}

			/*
				TODO: Build in deadline support
			*/
		},


		//Get definition values for populating UI from definition tiddlers.
		getDefValues: function(src) {
			var text = store.getTiddlerText(src).split('\n');
			var output = [];
			for(var t=0; t<text.length; t++) {
				//support calling the old TaskViewBuilder macro to list the tasks here too.
				var blob = wikifyStatic(text[t],null,tiddler,null);				
				var linktitle = /tiddlylink="[^"]*"/mg;
				var titles = blob.match(linktitle);
				if(titles) {
					for(var n=0; n<titles.length; n++) {
						output.push(titles[n].replace(/tiddlylink="([^"]*)"/,'$1'));
					}
				}
				else {
					output.push(text[t]);
				}
			}
			return (output);	
		},


		// Ensure that changes to a dropdown field are stored as an extended field.
		setDropDownMetaData: function(ev) {
			var e = ev ? ev : window.event;
			//var taskTiddler = story.findContainingTiddler(this);
			var taskTiddler = this.tiddler;
			if(taskTiddler && taskTiddler != undefined) {
				//var title = taskTiddler.getAttribute('tiddler');
				//var tiddler =  store.getTiddler(title);
				var title = taskTiddler.title;
				var tiddler = taskTiddler;

				var option = this[this.selectedIndex].value.split('::');
				var extField = option[0];
				var extFieldVal = option[1];
				store.setValue(tiddler,extField,extFieldVal);
				story.saveTiddler(title);
			}
		},


		// Ensure that changes to a free text field are stored as an extended field.
		changeFreetext: function(ev) {
			var e = ev ? ev : window.event;
			var ttField = this.getAttribute('ttname');
			var value = this.value;
			if(ttField) {
				var t = story.findContainingTiddler(this);
				var title = t.getAttribute('tiddler');
				var tiddler =  store.getTiddler(title);
				store.setValue(tiddler,ttField,value);
				story.saveTiddler(tiddler);
			}
			return false;
		}
	};
}
//}}}
There are more written instructions and detail at [[Edit]] and you can learn about the specific [[EditingConventions]] that help you lay out pages attractively (headings, bold, italics, etc) with great ease.

<html><iframe width="480" height="360" src="http://www.youtube.com/embed/L1_8x1y1CLM?rel=0" frameborder="0" allowfullscreen></iframe></html>
This video gives you a quick tour of the simple rules for laying out text, headings, italics, bullet points, etc - so you can make the text in your pages look clear and readable.  See also EditingConventions and the page on how to [[Edit]]...

<html><iframe width="480" height="360" src="http://www.youtube.com/embed/tWb-UAePQvk?rel=0" frameborder="0" allowfullscreen></iframe></html>
<html><object width="480" height="360"><param name="movie" value="//www.youtube.com/v/02QyMFIQRNY?hl=en_GB&amp;version=3&amp;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/02QyMFIQRNY?hl=en_GB&amp;version=3&amp;rel=0" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></html>
Here is a video tour of the new AMBIT manual that highlights the main features and how to find your way around:

<html><iframe width="480" height="360" src="http://www.youtube.com/embed/TJ4WFQ1ov7g?rel=0" frameborder="0" allowfullscreen></iframe></html>

Here is an animation that explains how multiple tiddlymanuals support collaboration between multiple teams, that share a common (and developing) core and compare and share local innovations:

<html><iframe width="480" height="360" src="http://www.youtube.com/embed/EZ_yHJ1WLTE?rel=0" frameborder="0" allowfullscreen></iframe></html>
<!--{{{-->
<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);
	}
};

/*}}}*/
The web browser is just the program your computer uses to access the internet.  

The commonest ones are:

!Internet Explorer 
This is Microsoft's standard browser - seen as rather "clunky" by those in the know, and is often available in shockingly outdated forms in NHS or other large corporate systems.  Our advice is to try to find a way to convince your IT dept to let you use a more modern browser that automatically updates itself (see examples below) and which handles some of the more recent advances in web-based technology better.  See [[Organisational support for the technology to run TiddlyManuals]] for support in this task!  The manual will work in this browser, but it won't sing and dance as well.
!Google Chrome
This is an open source, fast, modern, free browser - which handles the tiddlymanuals with much greater ease, and automatically updates itself, etc.  Highly recommended.
!Firefox
This is similarly open source, fast, freely downloadable, adaptable and also highly recommended
!Safari
This is the standard Mac browser... Mac users tend to love it in the tribal ways that Mac users love anything Mac (Oh, do I sound jealous?), and there are also versions that run on Windows PC's that can be downloaded for free - it is seen as a good browser.
[[http://www.ucl.ac.uk/CORE|http://www.ucl.ac.uk/CORE]]

Health and Social Care Act 2012: [[http://www.legislation.gov.uk/ukpga/2012/7/contents/enacted/data.htm|http://www.legislation.gov.uk/ukpga/2012/7/contents/enacted/data.htm]]

No Health without Mental Health: [[http://www.dh.gov.uk/en/Publicationsandstatistics/Publications/PublicationsPolicyAndGuidance/DH_123766|http://www.dh.gov.uk/en/Publicationsandstatistics/Publications/PublicationsPolicyAndGuidance/DH_123766]]

Both available at
[[http://www.ucl.ac.uk/clinical-psychology/CORE/competence_frameworks.htm|http://www.ucl.ac.uk/clinical-psychology/CORE/competence_frameworks.htm]]

MindEd: [[https://www.minded.org.uk/|https://www.minded.org.uk/]]
!Welcome!
This is currently (19.09.16) a work in progress - content and functionality will be added in the weeks and months ahead.
Note that the format for this manual was developed as part of the AMBIT project at the Anna Freud National Centre for Children and Families.  There are occasional references to AMBIT that are an artefact from this developmental history of the open source software being used - these can be ignored.
<<slider chkNoteToNewUsersSlider [[Note to NEW USERS]] "Note to NEW USERS »" "Click here to get started learning how to use this website, which is similar - but a bit different - from other ones">>
Contents and pages that are currently open, as well as the search bar, and a history of pages opened during this session, etc, are all accessed in the [[Sidebar]] to the left (if it is folded away, click the little white triangle, top left, or toggle it away if it is taking too much space on your desktop.)

!Key areas of work for ''site developers''
* There is a <<tag NeedsWork>> tag that is used to point developers to areas that need work, but which developers can also use to keep their own developing "to do list" going... Just a tag a page you are working on that is as yet unfinished with NeedsWork !
In addition:
* See the [[Video tour of the AMBIT manual]]
* See [[Video introduction to editing a tiddlymanual]]
* See [[Video introduction to editing conventions ("Mark-up")]]
* See [[Embedding Images in your TiddlyManual]]
* See [[Adding IMAGES, DOCUMENTS or VIDEO clips]]

The wiki ''ambit-help.tiddlyspace.com'' is //not designed to be read on its own//, but as an INCLUSION inside other tiddlyspaces that also include the ambit-theme.

If you are reading this [[Tiddler]] in a tiddlymanual (such as the AMBIT or MBTF manuals) then ignore it! Instead, look for [[Using the Manual]] as a place to get help.

If you have the address: {{{http://ambit-help.tiddlyspace.com}}} in your browser's address bar, then you are just reading the "help" space, rather than reading it in its 'proper habitat' - which is embedded ("included") in a larger tiddlymanual, such as @ambit or one of its local variants (see @tiddlymanuals).

The content in this space provides guidance on TiddlyWiki - the basic software that supports all of this; and TiddlySpace - the server-side environment that supports multiple individually-curated tiddlywikis that can include one another, and which allows a centrally-curated "first draft" manual to be adapted by multiple local users.
If you are reading  LOCAL version of the manual (see them listed out at @tiddlymanuals) then you may want to know:

(a) Is this LOCALLY - CURATED material?
(b) Is this CENTRALLY - CURATED material?
(c) Who actually wrote this material?

This is one of the [[Comparing and Sharing functions]] that the [[TiddlyManual]] format offers.

!!(a) Is it LOCAL or CENTRAL?
If a page ([[Tiddler]]) is ''newly authored'' by a LOCAL team, then a small sub heading that will tell you this will appear beneath the main page heading.

If a page has been ''adapted from the original'' (i.e. the so-called 'AMBIT core content' [found at @ambit], authored and curated by the Anna Freud Centre) then a small sub-heading will appear beneath the main page title to announce this.

!!(b) Who actually wrote this?
* Open the [[Show references and info]] panel on the tiddler.  
* Look at the ''Information'' column, and you will see ''"Edited by"''...  You can also click on the ''Revisions'' heading, too, to see if any other authors wrote or edited earlier versions of this tiddler.
* You can also [[List LOCAL EDITS to the manual]] which reveals a list of all the ~LOCALLY-edited material.

!!(c) How do I //compare// page contents between manuals?
It is easy to compare and contrast pages ("[[Tiddler]]s") that have been adapted by different authors across different manuals.  

These pages may have been //customised// by a local team, adapting (or adding) material in ways that improve the "fit" of what is being delivered to their //local// culture, in response to particular //local// problems, or to their a //local// service ecology, etc...  

See the ''Elsewhere'' column in the [[Show references and info]] panel of any tiddler for this, or look at other ways in which [[Comparing and Sharing functions]] are available in the manual.
Wiki comes originally from the Maori word for "Quick" or "Fast"...

it is used to describe any collection of web-based pages that are related to a particular subject and are open to easy editing by users. Perhaps the best known example is the internet-based encyclopaedia, [[www.wikipedia.org/|http://www.wikipedia.org/]].  There are problems with web-based Wiki's such as this, in that there is little control over the quality of information put into them, and this manualization uses a new technology to get around this so that there are "valves" applied to what content can and cannot be altered. Crucially, the Tiddlymanual is not a web-based application, but a document that can live on a server, a hard disk, a USB stick, etc, rather than being open to the world.

The format of this TiddlyManual is an adaptation of this Wiki format, and the software underpinning this novel format is called TiddlyWiki.
By convention in the TiddlyWiki format, any single word that has a capital letter placed in the middle of it is automatically recognised by the TiddlyWiki (functioning as a kind of 'code')  so that the TiddlyWiki turns that word into a link to another [[Tiddler]].  At the same time the software autimatically forms a new tiddler with its title as that new WikiWord (which will be empty until it is filled with MicroContent...) so, for instance, EmpyThought will be empty unless you choose fill it! (you can click on EmptyThought and see what I mean if you want.)

This is useful if you [[Edit]] the manual - i.e. make new patient notes entries, or compose new [[Tiddler]]s - and wish to place a [[Link]] to another Thought.  

It helps you make quick [[Links]] to new [[Tiddler]]s, however, the WikiWord looks a bit odd in 'ordinary' text so we are slowly trying to replace WikiWord titles with more conventional language forms!

Of course the OTHER way to make [[Links]] is to place double square brackets ( {{{[[Title of tiddler goes here]]}}}) around any word or phrase.  You can learn more about how to [[Edit]] the manual by following the tag [[Understanding TiddlyManual format]].
/*{{{*/
(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));
/*}}}*/
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!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>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
iVBORw0KGgoAAAANSUhEUgAAAp4AAAKeCAMAAAA7qOuhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTEwOUY5OTBCQ0YxRjM1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyQzZBODVGQzQ5RDExMUUxQkI0ODgzMDJGMDFGM0M0OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyQzZBODVGQjQ5RDExMUUxQkI0ODgzMDJGMDFGM0M0OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNFODRBODgyNjAyMDY4MTE5MTA5Rjk5MEJDRjFGMzUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MTA5Rjk5MEJDRjFGMzUwIi8+IDwvcmRmOkRlc2NyaXB0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