Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:wrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

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

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

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

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

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and 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;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></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'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
Type the text for ' ImportTiddlers'
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with browsers"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","category":"Scientific and mathematical notation","description":"This is an adaptation of Jeremy Ruston's TiddlyWiki (version 2.0.2) that is suitable for writing scientific notes (e.g. research notes, lecture notes, projects, homework, ...). TiddlyWiki is an amazing JavaScript program that lets you read, edit, save and share infomation conveniently in a single html file using a familiar browser even without an internet connection. ASciencePad extends this by integrating a what-you-see-is-what-you-get editor where one can easily type mathematical formulas (displayed with MathML) and produce 2D cartesian, parametric and polar graphs (displayed with SVG). The HTMLArea editor was originally developed by www.interactivetools.com, now maintained by Mihai Bazon at www.dynarch.com, and the plugins that provide the math extensions were developed by Peter Jipsen and David Lippman. See AsciiMath and AsciiSvg for a brief description of the additional scripts that enable the display and WYSIWYG editing of math formulas and graphs.","twversion":"2.0.2","link":"http://math.chapman.edu/~jipsen/asciencepad/asciencepad.html","author":"Peter Jipsen"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","category":"Formatting and viewing text","description":"This is an adaptation of Jeremy Ruston's TiddlyWiki (version 2.0.2) that is suitable for writing scientific notes (e.g. research notes, lecture notes, projects, homework, ...). TiddlyWiki is an amazing JavaScript program that lets you read, edit, save and share infomation conveniently in a single html file using a familiar browser even without an internet connection. ASciencePad extends this by integrating a what-you-see-is-what-you-get editor where one can easily type mathematical formulas (displayed with MathML) and produce 2D cartesian, parametric and polar graphs (displayed with SVG). The HTMLArea editor was originally developed by www.interactivetools.com, now maintained by Mihai Bazon at www.dynarch.com, and the plugins that provide the math extensions were developed by Peter Jipsen and David Lippman. See AsciiMath and AsciiSvg for a brief description of the additional scripts that enable the display and WYSIWYG editing of math formulas and graphs.","twversion":"2.0.2","link":"http://math.chapman.edu/~jipsen/asciencepad/asciencepad.html","author":"Peter Jipsen"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Ocat","link":"http://oldcat.googlegroups.com/web/AccordionEffect.html","format":"Plugin","description":"This is the new version of AccordionEffect. I use a small CSS tweak plus a plugin written by BramChen to perform this more interesting AccordionEffect. The sliders expand one at a time. Every time you click a different slider bar, the last expanded one will collapse first, then the new one expands.","category":"Menus and sliders","twversion":"--"}</data>
<<formTiddler NewPluginTemplateInput>><data>{"author":"Tobias Beer","link":"http://lastfm.tiddlyspot.com/#cycleTagsInfo","format":"Plugin","twversion":"2.1","category":"Tagging","description":"Allows to add a tag via clicking a button, optionally removing another tag"}</data>
!!!Add your option in the right order

<option>Daniel Baird
<option>Dawn Ahukanna
<option>Doug Compton
@@color:#c06;<option>Duh! Your Option@@
<option>Eric Shulman (~TiddlyTools)
<<options>>
<<option chkSortTags>> Sort byTags
<<option chkHoldSearches>> Hold search results
<<option chkSearchTitles>> Search in tiddler titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tiddler tags
<<option chkSearchFields>> Search in tiddler data fields
<<option chkSearchShadows>> Search in shadow tiddlers
<<option chkSearchTitlesFirst>> Search results show title matches first
<<option chkSearchList>> Search results show list of matching tiddlers
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Aids for website visitors"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Formatting and viewing text","description":"Define macros for abbreviations and other \"aliases\", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing."}</data>
!!!!!&nbsp;[[AllNotes]]
@@color:#C06;''&raquo; &raquo;'' @@   Notes/comments attached to tabs: see note below
----
<script>
// get all tiddlers tagged with "allnotes"
var tids=store.getTaggedTiddlers("allnotes");
// keep only tiddlers *also* tagged with New
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("allnotes")) list.push(tids[t]);
// create output list of tiddler titles, one per line
var out="";
for (var t=0; t<list.length; t++) out+="#[["+list[t].title+"]]\n";
return out;
</script> 
!!!!!&nbsp;AllTabs
<<list all>>
<<formTiddler NewPluginTemplate>><data>{"author":"Clint Checketts","format":"Macro","twversion":"--","category":"Searching and indexing tiddlers","description":"Shows all tags except those you specify in the macro.","link":"http://tiddlystyles.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Other","description":"Alternating colors for the items in tabbed lists in the right hand sidebar.","category":"Colors","twversion":"--","author":"Joeraii","link":"http://www.cs.utexas.edu/~joeraii/siglet/"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","twversion":"2.0","category":"Popups","description":"Inline annotations for tiddler text."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"George Brackett","link":"http://luceatlux.net/macros/answer","format":"Macro","twversion":"1.2","category":"Aids for website visitors","description":"Displays answers and feedback for online questions."}</data>
*[[Colors]]
*[[Themes]]
*[[Toggling page elements]]
*[[Other style changes]]
*[[Formatting and viewing text]]
*[[Icons, smileys]]
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","twversion":"--","description":"The archive plugin allows you to store tiddler text outside of the tiddlywiki file. Typically you would tag bulky tiddlers or those with infrequently needed content as \"Archive\" and these would then be archived as separate html files in the sub folder called \"archive\".","category":"Saving and reviewing changes"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","category":"Time and calendars","description":"Timeline archived monthly.","twversion":"2.0.11"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","category":"Aids for website visitors","twversion":"2.1","description":"Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage. Store or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content. Binary file content can be stored in three different locations:<br>1. embedded in the attachment tiddler (encoded as base64)<br>2. on your filesystem (a 'local link' path/filename)<br>3. on a web server (a 'remote link' URL)<br>The plugin creates an \"attachment tiddler\" for each file you attach. Regardless of where you store the binary content, your document can refer to the attachment tiddler rather than using a direct file or URL reference in your embedded image or external links, so that changing document locations will not require updating numerous tiddlers or copying files from one system to another."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D","format":"Plugin","twversion":"--","category":"Images and presentations","description":"An audio player."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Auto-corrects a list of mistyped or misspelled words. The list of words can be in any tiddler tagged with autoCorrectWords.","twversion":"2.x","category":"Formatting and viewing text","format":"Plugin","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Automatically open the last 5 tiddlers when TW loads. The number of tiddlers opened can be specifed by the user. //[Note from Dave: I put this in this category assuming its main purpose is for bloggers - ?]//","twversion":"2.x","category":"Aids for website visitors","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Saving and reviewing changes","description":"Enable/disable auto-refresh of selected content to force/prevent re-rendering when tiddler changes occur."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Tagging","description":"Automatically tag tiddlers with their creation date, modification date, author, etc. and/or scan and tag the tiddler with any tags that are embedded in the content."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Automatically adds brackets to nonwikiwords on saving a tiddler.","category":"Links","twversion":"2.1.0","format":"Plugin","author":"Laurence Man","link":"http://weave.tiddlyspot.com"}</data>
config.messages.backstage = {
	open: {text: " ", tooltip: "Open the backstage tools."},
	close: {text: " ", tooltip: "Close the backstage area"},
	prompt: " ",
	decal: {
		edit: {text: "edit", tooltip: "Edit the tiddler '%0'"}
	}
};
<<formTiddler NewPluginTemplate>><data>{"category":"Tiddler manipulation","author":"Jonathan Lister (jayfresh)","twversion":"2.4","link":"http://jnthnlstr.googlepages.com/BackstageSidebarPlugin.html","description":"Moves the right sidebar into the backstage area.","format":"Plugin"}</data>
config.tasks.sidebaroptions = {
	text: "SideBarOptions",
	tooltip: "A custom backstage tab",
	content: "|width:30em;<<tiddler SideBarOptions>><<tiddler SideBarTabs>>|"
};
config.backstageTasks.push("sidebaroptions");
config.tasks.slantedMenu = {
	text: "SlantedMenu",
	tooltip: "A custom backstage tab",
	content: "|width:30em;<<tiddler SlantedMenu>><<tiddler MoreTools>><<tiddler ViewTabs>>|"
};
config.backstageTasks.splice(config.backstageTasks.indexOf("save")+0,0,"slantedMenu");
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Behind the scenes","description":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","format":"Macro","twversion":"Not compliant with 2.0","category":"Saving and reviewing changes","description":"This Batch Processing Utility (BPU) allows you to select a group of tiddlers by title, tag, author, or date and perform an action on the entire group (open, edit, add/remove a tag, delete, etc.). Other features include renaming a tag across all the tiddlers that use it and importing/exporting tiddlers via copy/paste."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Behind the scenes"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Make the formatters more flexible: <br>* Allows white-space before the block formatters<br>* Allows more than 4 dashes to make an HR<br>* Handles number lists pasted from the web - these have \" 1.\" etc. at the start of each line and this changes that into a level 1 ordered list.<br>* Allows a leading dash as an unordered list (only 1 level though to avoid clash with HR rule","category":"Formatting and viewing text","twversion":"2.0.0 or higher","format":"Plugin","author":"Julian Knight","link":"http://knighjm.googlepages.com/knightnet-default-tw.html#PlugIn-Knightnet"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Replacement for the core timeline macro, with more options and features.","twversion":"2.x","category":"Time and calendars","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
/***
|Name|BetterTimelineMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#BetterTimelineMacro|
|Version|0.5 beta|
|Requires|~TW2.x|
!!!Description:
A replacement for the core timeline macro that offers more features:
*list tiddlers with only specfic tag
*exclude tiddlers with a particular tag
*limit entries to any number of days, for example one week
*specify a start date for the timeline, only tiddlers after that date will be listed.

!!!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Edit the ViewTemplate to add the fullscreen command to the toolbar.

!!!Syntax:
{{{<<timeline better:true>>}}}
''the param better:true enables the advanced features, without it you will get the old timeline behaviour.''

additonal params:
(use only the ones you want)
{{{<<timeline better:true  onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30>>}}}

''explanation of syntax:''
onlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.
excludeTag: tiddlers with this tag will not be listed.
sortBy: sort tiddlers by date modified or date created. Possible values are modified or created.
firstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006
maxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.
maxEntries: limit the total number of entries in the timeline.


!!!History:
*28-07-06: ver 0.5 beta, first release

!!!Code
***/
//{{{
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
          var results = [];
          this.forEachTiddler(function(title,tiddler)
          {
          if(excludeTag == undefined || tiddler.tags.find(excludeTag) == null)
                        if(includeTag == undefined || tiddler.tags.find(includeTag)!=null)
                                      results.push(tiddler);
          });
          if(field)
                   results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
          return results;
}



//this function by Udo
function getParam(params, name, defaultValue)
{
          if (!params)
          return defaultValue;
          var p = params[0][name];
          return p ? p[0] : defaultValue;
}

window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
          var args = paramString.parseParams("list",null,true);
          var betterMode = getParam(args, "better", "false");
          if (betterMode == 'true')
          {
          var sortBy = getParam(args,"sortBy","modified");
          var excludeTag = getParam(args,"excludeTag",undefined);
          var includeTag = getParam(args,"onlyTag",undefined);
          var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
          var firstDayParam = getParam(args,"firstDay",undefined);
          var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";
          var lastDay = "";
          var field= sortBy;
          var maxDaysParam = getParam(args,"maxDays",undefined);
          var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
          var maxEntries = getParam(args,"maxEntries",undefined);
          var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
          for(var t=tiddlers.length-1; t>=last; t--)
                  {
                  var tiddler = tiddlers[t];
                  var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
                  if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))
                     {
                     if(theDay != lastDay)
                               {
                               var theDateList = document.createElement("ul");
                               place.appendChild(theDateList);
                               createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
                               lastDay = theDay;
                               }
                  var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);
                  theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
                  }
                  }
          }

          else
              {
              window.old_timeline_handler.apply(this,arguments);
              }
}
//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","format":"Plugin","twversion":"--","description":"--","category":"Working with other codes and formats"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Theme","twversion":"2.1","category":"Themes","description":"Alternative stylesheet theme: black/blue-gray/gray backgrounds w/light text."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"FND","link":"http://devpad.tiddlyspot.com","format":"Macro","twversion":"2.1","description":"Macro for collapsing/expanding block elements' height on click.","category":"Toggling page elements"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Anshul Nigham","link":"http://www.anshul.info/blogwiki.html","format":"Plugin","category":"Aids for website visitors","twversion":"2.1.3","description":"Posts the most recently edited tiddlers when the TiddlyWiki is opened, similar to a blog. (Adapted from an earlier plugin by ClintChecketts)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","twversion":"2.x","category":"Working with websites, incl IFrames","description":"Provides a quick way to create a pretty link to a TiddlySpot, LiveJournal, Xanga or MySpace site.","format":"Plugin","link":"http://conflation.org/#BlogUserPlugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Toolbar button for bookmarks services.","category":"Working with websites, incl IFrames","twversion":"2.2","author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Paulo Soares","link":"http://www.math.ist.utl.pt/~psoares/addons.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Formatting and viewing text","description":"This plugin lets you create custom numbered environments that can be decorated through CSS. [Note from Dave: what he's trying to say is that you can create all kinds of cool boxes around your text. See the various examples he gives and you will be convinced]"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","twversion":"--","category":"Searching and indexing tiddlers","description":"This plugin creates an area at the top of the tiddler area that displays \"breadcrumbs\" of where you've been. This is especially useful forTWs using SinglePageMode by Eric Schulman. Original author Alan Hecht."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Searching and indexing tiddlers","description":"Author: Alan Hecht (with 2.0 update from 'jack' and revisions by Bram Chen)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Show a list of tiddlers viewed during this session. Also defines \"back\" (previousTiddler) toolbar button and macro.","category":"Searching and indexing tiddlers","twversion":"2.1","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Supplemental CSS adjusts font colors for use with dark backgrounds.","category":"Colors","twversion":"2.1","format":"Other","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
/***
!!!<<gradient horiz #fc3 #fff >><<tiddler RefreshStyles>>&nbsp;ButtonStyle>>/%==================================================%/
***/


input.btn{
   color:#008;
   font-family:Trebuchet MS,aerial,helvetica,sans-serif;
   font-size:100%;
   font-weight:normal;
   background-color:#eee;
   background:url("http://img520.imageshack.us/img520/8688/mainmenugray7ef.gif") repeat-x top left;top left;
   border:1px solid;
   border-top-color:#009;
   border-left-color:#009;
   border-right-color:#009;
   border-bottom-color:#009;
   -moz-border-radius : .25em 0.25em 0.25em 0.25em;
}


input.btnhov{
   color:#a00;
   background:#fff;
   background:url("http://img520.imageshack.us/img520/8688/mainmenugray7ef.gif") repeat-x top left;top left;
   border-top-color:#c06;
   border-left-color:#c06;
   border-right-color:#c06;
   border-bottom-color:#c06;
   -moz-border-radius : .25em 0.25em 0.25em 0.25em;
}
{{scroll{
<<forEachTiddler
 where
'tiddler.tags.containsAny(["excludeLists","excludeSearch"])'
write
 '"|"+(index+1)+"|[["+tiddler.title+"]] |@@color:#c06;&raquo;@@ |("+tiddler.tags+")|\n"'
>>
}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Unknown","link":"http://fire.atspace.org/","format":"Macro","twversion":"--","category":"Calculators","description":"A calculator!"}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.1","category":"Time and calendars","description":"Monthly and yearly calendars.","link":"http://www.tiddlytools.com","author":"Steve Rumsby"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","twversion":"--","category":"Working with keyboards","description":"Makes an easy way to capture a key and stop the browser from doing its default action."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"ccTiddly","link":"http://cctiddly.sourceforge.net/","format":"Other","twversion":"--","category":"Uploading TiddlyWikis to a server","description":"ccTiddly is a tiddly adaptation based on PHP and MySQL to store tiddlers. This is a server side adaptation which allow its user to change their TiddlyWiki over HTTP. It is also possible to generate a standalone version with this!"}</data>
merge(config.macros.saveChanges,{
	label: "save",
	prompt: "Save all tiddlers to create a new TiddlyWiki",
	accessKey: "S"});
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Forms and databases","description":"Add checkboxes to your tiddler content."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Forms and databases","description":"Demonstration using CheckboxPlugin to create simple tag-based daily checklist."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A skinnable, sizeable analog clock.","category":"Time and calendars","format":"Plugin","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open.","category":"Tiddler manipulation","twversion":"--","format":"Plugin","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Menus and sliders","description":"Embed a 'close' link floating in upper right corner of slider. closes current slider panel."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","format":"Plugin","description":"Show/hide content of a tiddler while leaving tiddler title visible.","category":"Tiddler manipulation"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Menus and sliders","author":"Unknown","link":"http://du180.n77.queensu.ca/TW/ToC.html","format":"Other","twversion":"--","description":"Seems to be a series of tables of contents, different ways of handling a table of contents."}</data>
Background: #fff
Foreground: #000
PrimaryPale: #ddaaff
PrimaryLight: #bb3333
PrimaryMid: #550099
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #8844aa
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Colors"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","category":"Tables","format":"Plugin","twversion":"2.1","description":"Calculate values from table cells in a column. ALPHA - DO NOT DISTRIBUTE - USE AT YOUR OWN RISK."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Probably works badly if you have tags containing commas. :-)","category":"Tagging","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Aids for website visitors","description":"Form to enter feedback/comments that are automatically added to tiddler content."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Uncategorized tools","description":"TidIDE: show color-coded differences between two selected tiddlers."}</data>
<<option pasUploadPassword>>
<<configOptions
chkAutoSave=false
txtUserName=MsgRay
chkSaveBackups=true
chkRegExpSearch=true
chkCaseSensitiveSearch=
chkAnimate=false
chkGenerateAnRssFeed=
chkCaseSensitiveSearch=
chkHttpReadOnly=
chkSearchTitles=true
chkSearchText=true
chkSearchTags=true
chkSearchTitlesFirst=false
chkSearchList=true
chkHoldSearches=false
chkOpenInNewWindow=true
chkSaveEmptyTemplate=false
chkSinglePageMode=false
chkToggleLinks=false
txtMaxEditRows=30
txtBackupFolder=SideSnipsBackup
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","description":"This plugin allows you to store TiddlyWiki options in a tiddler. This means the options are part of the store and are not shared among TiddlyWiki files. The options are also more robust and persist when cookies are loaded.","category":"Behind the scenes"}</data>
/***
|''Name:''|ConfigOptionsMacro|
|''Version:''|0.1 (31 May 2007)|
|''Source''|http://jackparke.googlepages.com/jtw.html#ConfigOptionsMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23ConfigOptionsMacro]])|
|''Author:''|Jack|
!Description
This plugin allows you to store TiddlyWiki options in a tiddler. This means the options are part of the store and are not shared among TiddlyWiki files. The options are also more robust and persist when cookies are loaded.
!Usage
*After installation, enter the options you want persisted into the [[ConfigOptions]] tiddler
*In view mode of this tiddler you can see and modify the options
*Changes are effective and written immediately to the ConfigOptions tiddler as you modify them
*The options are loaded from ConfigOptions on startup of TiddlyWiki overriding any cookie settings
!Revision History
* Original by Jack 31 May 2007

!Code
***/
//{{{
version.extensions.configOptions = {major: 0, minor: 0, revision: 1, date: new Date('May 31, 2007')};

config.shadowTiddlers.ConfigOptions = '<<configOptions\nchkAutoSave=false\ntxtUserName=Your Name\n>>'

config.macros.configOptions = {};
config.macros.configOptions.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
 var resultText = this.parseOptions(paramString);
 if (resultText) {
  resultText = '|!Option|!Value|\n' + resultText;
  wikify(resultText, place)
  //createTiddlyButton(place,'Update','Saves your current options to the ConfigOptions tiddler.',this.update);
  applyHtmlMacros(place,tiddler)
 }
}

config.macros.configOptions.init = function() {
 var txtConfigOptions = store.getValue('ConfigOptions', 'text') || config.shadowTiddlers.ConfigOptions; 
 txtConfigOptions = txtConfigOptions.substr(txtConfigOptions.indexOf('\n')).substr(0, txtConfigOptions.length-2);
 this.parseOptions(txtConfigOptions);
}
config.macros.configOptions.parseOptions = function (paramString) {
 var resultText = ''
 var options = paramString.split(/\n/);
 for(var i=0; i < options.length; i++) {
  var opt = options[i].split('=');
  if(opt.length > 1) {
   if (opt[1] != 'true' && opt[1] != 'false' && !opt[1].match(/^\d+$/))
    opt[1] = '\'' + opt[1].replace(/'/, '\\\'') + '\'';
    resultText += '|' + opt[0].replace(/^[a-z]{2,3}/,'') + '|<<option ' + opt[0] + '>>|\n'
   try {
    eval('config.options.' + opt[0] + ' = ' + opt[1] + ';');
    //alert('config.options.' + opt[0] + ' = ' + opt[1] + ';')
   } catch (e) {
    debugger
   }
  }
 }
 return resultText;
}
config.macros.option.propagateOption = function(opt,valueField,value,elementType)
{
	config.options[opt] = value;
//	saveOptionCookie(opt);
	//if (opt=='txtUserName') debugger;
	if ((new RegExp('\n' + opt + '=','g')).test(store.getValue('ConfigOptions','text'))) {
	 config.macros.configOptions.updateOption(opt, decodeCookie(config.optionHandlers[opt.substr(0,3)].get(opt)))
	}
	
	var nodes = document.getElementsByTagName(elementType);
	for(var t=0; t<nodes.length; t++) {
		var optNode = nodes[t].getAttribute("option");
		if(opt == optNode)
			nodes[t][valueField] = value;
		}

}
config.macros.configOptions.updateOption = function(name, value) {
 var txtConfigOptions = store.getValue('ConfigOptions', 'text'); 
 var t1 = txtConfigOptions.indexOf('\n' + name + '=');
 var t2 = txtConfigOptions.indexOf('\n', t1+1);
 txtConfigOptions = txtConfigOptions.substr(0,t1) + '\n' + name + '=' + value + txtConfigOptions.substr(t2)
 store.setValue('ConfigOptions', 'text', txtConfigOptions)
}
//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"--","category":"Behind the scenes","description":"Simon Baird's favorite tweaks, having to do with online user experimentation, tabs, and the text that appears upon creating a new tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","category":"Working with browsers","description":"Review/add/delete option cookies and save current option values to CookieJar tiddler for 'sticky' settings.","twversion":"2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Uncategorized tools","description":"Quickly create a copy of any existing tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Script","twversion":"--","category":"Working with other codes and formats","description":"Covert Unicode to UTF8 for Markup* chunks."}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.2.4 only","category":"Behind the scenes","description":"This tiddler contains some quick tweaks and modifications to TW core functions to provide minor changes in standard features or behavior. It is hoped that some of these tweaks may be incorporated into later versions of the TW core, so that these adjustements will be available without needing these add-on definitions.","format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"small overrides to TW core functions - FOR TW 2.1.3 OR EARLIER.","twversion":"2.1.3 or earlier","category":"Behind the scenes","format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0","category":"Non-English languages","description":"Extension of TiddlyWiki syntax to support Creole text formatting."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Tiddler manipulation","description":"Custom Hover Dates lets you change the hover text for tiddler titles to a custom format. For instance, you can customize the hover text so that minutes and seconds are excluded from the last modified date. For example, hover over any tiddler title on this page to see the modified date without the hours and minutes.","twversion":"2.0 compatible","format":"Plugin","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","author":"Alan Hecht"}</data>
/***
!!!<<tiddler RefreshStyles>>&nbsp;CustomCSS/%==================================================%/
***/

/***CustomCSS is a style sheet that contains the "custom class" CSS to customize special features in TW Help.  It is placed in StyleSheet as a [[NestedStyleSheet|NestedStyleSheets]] and is an essential component.***/

/***There may be extra nested stylesheets at the end of this stylesheet***/


/*{{{*/


body {background: url("http://img299.imageshack.us/img299/9844/vaulttabbarbgvc6.gif"); background-repeat: repeat;
background-color:#008;
}


#backstageArea {background-color:#00a;font-size:8pt;}

.tuduSlider .button{ 
display: block; 
color: #fff; 
text-align: left;
font-weight: bold;
border-top: solid 1px #bbb;
border-left: solid 1px #bbb;
border-right: solid 1px #888;
border-bottom: solid 1px #888;
margin-left: -0.3em;
padding: 0 1px 1px 20px;
background:#509;
}

.tuduSlider .button:hover{
border-top: solid 1px #777;
border-left: solid 1px #777;
border-right: solid 1px #bbb;
border-bottom: solid 1px #bbb;
background: #fff;
color:#a00;
padding: 1px 0 0 21px;
}

.systemcontents {
 height: 350px; 
 width: 100%; 
 position:relative;
 overflow: auto;
 margin:auto;
 }

.popup {
 max-height:275px;
 min-height:auto;
 width: auto; 
 overflow: auto;
 margin:auto;
-moz-border-radius : 0.65em 0.2em 0.2em 0.65em;

}

.scroll{overflow: scroll}
.scrollauto {overflow: auto}

.wrap {white-space:wrap;}
.wrap{wrap;}

.liststyleNone{list-style:none;}

.doubleborder {
    border: 4px double #fcf;
    margin: 8px;
}

/***
!!!&nbsp;~CustomTable/%==================================================%/
***/


.tableright  table {border:0 !important;td.vertical-align:top;margin-left:auto ; margin-right:0  auto !important; text-align:left; padding:0px;}


.tablecenter  table { border:0 !important;td.vertical-align:top;margin-left: auto; margin-right: auto; text-align:left; padding:0px;}
.tablecenterpad17 table { td.vertical-align:top;margin-left: auto; margin-right: auto; text-align:
left; padding:17px;}

.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody
	{ border:0 !important; margin:0 !important; padding:3px !important; td.vertical-align:top !important;margin-left: auto !important; margin-right: auto !important;}

.borderless5px, .borderless5px table, .borderless5px td, .borderless5px tr, .borderless5px th, .borderless5px tbody { border:0 !important; margin:0 !important; padding:5px !important; td.vertical-align:top !important;margin-left: auto !important; margin-right: auto !important;}

.borderlessL, .borderlessL table, .borderlessL td, .borderlessL tr, .borderlessL th, .borderlessL tbody
	{ border:0 !important; margin:0 !important; padding:7px !important; td.vertical-align:top !important;margin-left: 0 !important; margin-right: auto !important;}

.borderlessL0, .borderlessL 0table, .borderlessL0 td, .borderlessL0 tr, .borderlessL0 th, .borderlessL0 tbody
	{ border:0 !important; margin:0 !important; padding:0px !important; td.vertical-align:top !important;margin-left: 0 !important; margin-right: auto !important;}

.borderlessR, .borderlessR table, .borderlessR td, .borderlessR tr, .borderlessR th, .borderlessR tbody
	{ border:0 !important; margin:0 !important; padding:7px !important; td.vertical-align:top !important;margin-left: auto !important; margin-right: 0 !important;}


.viewer tr.oddRow { background-color: #eaeaea;}
.viewer tr.evenRow { background-color:#fff; } 

/%row code for html%/
tr.d0 td {background-color: #ccc; color: black;}
tr.d1 td {background-color: #eaeaea; color: black;}


/*}}}*/
/***
!!!&nbsp;~CustomText/%==================================================%/
***/
/*{{{*/

.c06 {color:#c06;}
.gray9 {color:#999;}

.fontsize40 {font-size:0.5em}
.fontsize80 {font-size:0.75em}


.textleft { display:block;text-align:left; }
.textright { display:block;text-align:right; }
.textcenter { display:block;text-align:center; }
.textjustify { display:block;text-align:justify; }
.textindent { display:block;margin:0;padding:0;border:0;margin-left:2em; }

.wrap { white-space:normal; }
.wrap	{ white-space:wrap; }

.headingcolor{color:#FFF;background:#ff8888;}
.wrappingClass{padding: 0px 0.5em 0px 0.5em;color: #FFF; background: #06f;}



.firstletter{
display:block;
float:left;
width:1.0em;
font-size:400%;
font-family:times,courier;
line-height:80%;
}

.firstletterK{
display:block;
float:left;
width:0.75em;
font-size:400%;
font-family:times,courier;
line-height:80%;
}

.firstletterT{
display:block;
float:left;
width:0.65em;
font-size:300%;
font-family:times,courier;
line-height:95%;
}

.headline{
color:#c06;
font-size:180%;
font-family:times,arial;
line-height:60%;
}



/*}}}*/
/***
!!!&nbsp;Layout/%==================================================%/
***/
/*{{{*/

.twocolumns { display:block; -moz-column-count:2; -moz-column-gap:1em; -moz-column-
width:50%;}
.threecolumns { display:block; -moz-column-count:3; -moz-column-gap:1em; -moz-column-
width:33%}
.fourcolumns { display:block; -moz-column-count:4; -moz-column-gap:1em; -moz-column-
width:25%}

.doubleborder {
    border: 4px double #fcf;
    margin: 8px;
}

.floatboxright {
    float: right;
    width: 20em;
    border: solid 1px;
    padding:3px;
    background-color:#fcf;
    /* whatever other styling you want.. */
} 


.floatboxleft {
    float: left;
    width: 20em;
    border: solid 1px;
    padding:3px;
    background-color:#fcf;
    /* whatever other styling you want.. */
} 

.floatleft{ float:left; }
.floatright{ float:right; }

.moveovermainmenu{margin-left:7px;}
.textleftpad5{text-align:left;padding: 0px 5px 0px 5px;}
.textindent25 {text-indent:25px;}
.smallform{ white-space:wrap; }

.imgfloatright{display:block;float:right;padding:1em;}
.imgfloatleft{display:block;float:left;padding:1em;}
.imgfloatcenter{display:block;margin-left: auto;margin-right: auto;padding:0.3em;}

.alt { background-color:#abf; }
.fdfbackground {background:#fdf;} 

/*}}}*/
/***
!!!&nbsp;Links/%==================================================%/
***/
/*{{{*/




.boldLink a {font-weight:bold;}
.unboldLink a {font-weight:normal;}

.bigLink a { font-size:10pt;font-weight:bold;}
.whiteLink a { color: #fff;font-weight:normal; } 
.twLink a { color: #090;font-weight:normal; }
.locLink a { color: #f6f;font-weight:normal; }
.remLink a { color: #c06;font-weight:normal; } 
.blueLink a {color:#00f;}
.grayLink a {color:#ccc;}
.darkgrayLink a {color:#999;}
.editLink a {color:#ccc;font-size:0.01em}

.wrappingLinks{color: #000; background: #B3FFB3;}
.wrappingLinksAlt{color: #000; background: #C0FFFF;}

/*}}}*/
/***
!!!Specific Tiddler Custom CSSCSS/%=================================================%/
***/
/*{{{*/

{{{
For tiddler titles with spaces
#tiddlerNew\000020Tiddler a {color: #f00;}
}}}


#tiddlerSilverHeader a {color:#009;}
#tiddlerSilverHeader .button {color:#009;}
#tiddlerSilverHeader a:hover{
	background: #FFF;
	color: #F00;
}


#tiddlerIndex  {
 padding:5px;
 margin-left;0px;
 width:auto;
 overflow: auto;
 margin:auto;
}

#tiddlerIndex .button:visited {
color:#fff;
}

#tiddlerIndex .button:hover {
background:#ccc;
color:#a00;
}

#tiddlerIndex .button:active {color:[[ColorPalette::Background]]; background:#509; border:1px solid [[ColorPalette::SecondaryDark]];}

#tiddlerSlantedMenu .button:active {color:[[ColorPalette::Background]]; background:#ccc; border:1px solid [[ColorPalette::SecondaryDark]];}




#tiddlerSystemContents .tabContents {padding 0.5em;margin:auto;}

#tiddlerTabTimeline {list-style:none;}

#tiddlerScience .firstletter{
float:left;
width:0.75em;
margin-right:0.2em;
font-size:400%;
font-family:times,arial;
line-height:70%;
}


#tiddlerWelcome {
width:350px; }


#tiddlerEditTemplate .button {color: #000;text-decoration:none;}


#tiddlerTWHelp-SearchResults .viewer {
overflow: auto;
}

#tiddlerTranslate .viewer {
overflow: auto;
}

#tiddlerSideBarOptions {
color:#ffc;
background: transparent;
}

#tiddlerNewWelcome .viewer .tabContents {
background: transparent;
border-top: 1px solid #999;
border-right: 0px solid #999;
border-bottom: 0px solid #999;
border-left: 0px solid #999;
}

#tiddlerTWHelpSiteLinks ol { list-style-type: decimal }


#tiddlerBorderlessIframe .viewer {
background:#fff;
}


#mainMenu a:hover{
	background: #FFF;
	color: #F00;
}

#tiddlerMargin_Properties.viewer th{
        border: 1px solid #000;
	padding: 0px;
        vertical-align:top;
}

#tiddlerFormattingPageIntro .viewer th, .viewer td, .viewer tr,.viewer caption{
        border: 1px solid #F6F;
	padding: 0px;
        vertical-align:top;
}

#tiddlerTWHelp-SearchResults .viewer table, .viewer td{
border: 1px solid #F6F;
padding-left: 5px;
padding-right: 5px;
vertical-align:top;
td.vertical-align:top;
margin-left: auto;
margin-right: auto;
}

#tiddlerTables .viewer td.even{
background:#ccc;
}

#tiddlerTWHelp-SearchResults .viewer a {
color:#04b;
text-decoration:none;
}

#tiddlerAlpha .viewer tr.oddRow { background-color: #abf;}
#tiddlerAlpha .viewer tr.evenRow { background-color:#eaeaea; } 

#tiddlerNewWelcome .viewer tr.oddRow { background-color: #eaeaea;}
#tiddlerNewWelcome .viewer tr.evenRow { background-color:#fff; } 

#tiddlerImages img {
    border: 5px double #999;
    margin: 4px;

} 

#searchBar {
	float: right;
	font-size: 0.9em;
        padding-right: 1.5em;
        padding-bottom: 0em;
}

#searchBar .button {
	padding-right: 0.5em;
	border: none;
}

.gotoBar {
	float: right;
	font-size: 0.9em;
        padding-right: 1.5em;
        padding-top: 1.0em;
}


/*}}}*/
/***
!!!Footer /%==================================================%/
***/
/*{{{*/

#ContentFooter {
  text-align: center;
 clear: both;
 color:#ccc;
 background: transparent;
 padding: 1em 2em;
 font-weight:normal;
}


#ContentFooter a {
 color:#ccc;
}

/*}}}*/
/***
!!!&nbsp;@@color:#fff;End@@/%==================================================%/
***/
/*{{{*/

<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.0.11, 2.1.0","description":"HTTP support including field encoding and post for forms. Loosely patterned after ~.BidiX.Ajax.","category":"Forms and databases"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","format":"Plugin","twversion":"2.1.x","category":"Images and presentations","description":"This plugin implements a lightbox widget for TiddlyWiki. Via Javascript, you can display any HTML div in the lightbox, or use \"canned\" divs for displaying HTML message in a box or an alert with icon. The lightbox is closed by either clicking the X-icon or anywhere outside the lightbox. Only one lightbox can be active at a time. See the usage section below."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Working with other codes and formats","description":"Set DOM element IDs, add/remove classes and/or reposition rendered elements."}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Theme","twversion":"--","category":"Themes","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","author":"Bram Chen (~PrinceTW)","description":"A dark blue theme from the Prince himself."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Forms and databases"}</data>
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).
***/
//============================================================================
//============================================================================
//                           DataTiddlerPlugin
//============================================================================
//============================================================================

// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {



version.extensions.DataTiddlerPlugin = {
    major: 1, minor: 0, revision: 6,
    date: new Date(2006, 7, 26), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) {
	TiddlyWiki.prototype.getTiddler = function(title) { 
		var t = this.tiddlers[title]; 
		return (t !== undefined && t instanceof Tiddler) ? t : null; 
	};
}

//============================================================================
// DataTiddler Class
//============================================================================

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

function DataTiddler() {
}

DataTiddler = {
    // Function to stringify a JavaScript value, producing the text for the data section content.
    // (Must match the implementation of DataTiddler.parse.)
    //
    stringify : null,
    

    // Function to parse the text for the data section content, producing a JavaScript value.
    // (Must match the implementation of DataTiddler.stringify.)
    //
    parse : null
};

// Ensure access for IE
window.DataTiddler = DataTiddler;

// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------


// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};


// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler+ "("+t+")";
    }

    DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};


// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...) 
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataObject(t);
};

// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned 
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.readDataSectionText(t);
};


// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------

// Internal.
//
// The original JSONError is not very user friendly, 
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
	if (ex.name == 'JSONError') {
        ex.toString = function() {
			return ex.name + ": "+ex.message+" ("+ex.text+")";
		};
	}
	return ex;
};

// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
    if (t.dataObject === undefined) {
        var data = DataTiddler.readData(t);
        t.dataObject = (data) ? data : {};
    }
    
    return t.dataObject;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
    var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
    return (value === undefined) ? defaultValue : value;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    var oldValue = data[field];
	
    if (value == defaultValue) {
        if (oldValue !== undefined) {
            delete data[field];
            DataTiddler.save(tiddler);
        }
        return;
    }
    data[field] = value;
    DataTiddler.save(tiddler);
};

// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
    var matches = DataTiddler.getDataTiddlerMatches(tiddler);
    if (matches === null || !matches[2]) {
        return null;
    }
    return matches[2];
};

// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
    var text = DataTiddler.readDataSectionText(tiddler);
	try {
	    return text ? DataTiddler.parse(text) : null;
	} catch(ex) {
		throw DataTiddler.extendJSONError(ex);
	}
};

// Internal.
// 
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    return DataTiddler.stringify(data);
};


// Internal.
// 
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
	var index = s.indexOf(subString, startIndex);
	while ((index > 0) && (s[index-1] == '~')) { 
		index = s.indexOf(subString, index+1);
	}
	return index;
};

// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
	// Special care must be taken to handle "<data>" and "</data>" texts inside
	// a data section. 
	// Also take care not to use an escaped <data> (i.e. "~<data>") as the start 
	// of a data section. (Same for </data>)

    // NOTE: we are explicitly searching for a data section that contains a JSON
    // string, i.e. framed with braces. This way we are little bit more robust in
    // case the tiddler contains unescaped texts "<data>" or "</data>". This must
    // be changed when using a different stringifier.

	var startTagText = "<data>{";
	var endTagText = "}</data>";

	var startPos = 0;

	// Find the first not escaped "<data>".
	var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
	if (startDataTagIndex < 0) {
		return null;
	}

	// Find the *last* not escaped "</data>".
	var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
	if (endDataTagIndex < 0) {
		return null;
	}
	var nextEndDataTagIndex;
	while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
		endDataTagIndex = nextEndDataTagIndex;
	}

	return {
		prefixEnd: startDataTagIndex, 
		dataStart: startDataTagIndex+(startTagText.length)-1, 
		dataEnd: endDataTagIndex, 
		suffixStart: endDataTagIndex+(endTagText.length)
	};
};

// Internal.
// 
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
	var text = tiddler.text;
	var info = DataTiddler.getDataSectionInfo(text);
	if (!info) {
		return null;
	}

	var prefix = text.substr(0,info.prefixEnd);
	var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
	var suffix = text.substr(info.suffixStart);
	
	return [text, prefix, data, suffix];
};


// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change). 
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. 
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send. 
//
// This method should only be called when the data really has changed. 
//
// @param tiddler
//             the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {

    var matches = DataTiddler.getDataTiddlerMatches(tiddler);

    var prefix;
    var suffix;
    if (matches === null) {
        prefix = tiddler.text;
        suffix = "";
    } else {
        prefix = matches[1];
        suffix = matches[3];
    }

    var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
    var newText = 
            (dataText !== null) 
                ? prefix + "<data>" + dataText + "</data>" + suffix
                : prefix + suffix;
    if (newText != tiddler.text) {
        // make the change in the tiddlers text
        
        // ... see DataTiddler.MyTiddlerChangedFunction
        tiddler.isDataTiddlerChange = true;
        
        // ... do the action change
        tiddler.set(
                tiddler.title,
                newText,
                config.options.txtUserName, 
                config.options.chkForceMinorUpdate? undefined : new Date(),
                tiddler.tags);

        // ... see DataTiddler.MyTiddlerChangedFunction
        delete tiddler.isDataTiddlerChange;

        // Mark the store as dirty.
        store.dirty = true;
 
        // AutoSave if option is selected
        if(config.options.chkAutoSave) {
           saveChanges();
        }
    }
};

// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
    // Remove the data object from the tiddler when the tiddler is changed
    // by code other than DataTiddler code. 
    //
    // This is necessary since the data object is just a "cached version" 
    // of the data defined in the data section of the tiddler and the 
    // "external" change may have changed the content of the data section.
    // Thus we are not sure if the data object reflects the data section 
    // contents. 
    // 
    // By deleting the data object we ensure that the data object is 
    // reconstructed the next time it is needed, with the data defined by
    // the data section in the tiddler's text.
    
    // To indicate that a change is a "DataTiddler change" a temporary
    // property "isDataTiddlerChange" is added to the tiddler.
    if (this.dataObject && !this.isDataTiddlerChange) {
        delete this.dataObject;
    }
    
    // call the original code.
	DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};


//============================================================================
// Formatters
//============================================================================

// This formatter ensures that "~<data>" is rendered as "<data>". This is used to 
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
    name: "data-escape",
    match: "~<\\/?data>",

    handler: function(w) {
            w.outputText(w.output,w.matchStart + 1,w.nextMatch);
    }
} );


// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
    name: "data",
    match: "<data>",

    handler: function(w) {
		var info = DataTiddler.getDataSectionInfo(w.source);
		if (info && info.prefixEnd == w.matchStart) {
            w.nextMatch = info.suffixStart;
		} else {
			w.outputText(w.output,w.matchStart,w.nextMatch);
		}
    }
} );


//============================================================================
// Tiddler Class Extension
//============================================================================

// "Hijack" the changed method ---------------------------------------------------

DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;

// Define accessor methods -------------------------------------------------------

// Returns the value of the given data field of the tiddler. When no such field 
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See 
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
    return (field) 
         ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
         : DataTiddler.getTiddlerDataObject(this);
};

// Sets the value of the given data field of the tiddler to the value. When the 
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
    DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};


//============================================================================
// showData Macro
//============================================================================

config.macros.showData = {
     // Standard Properties
     label: "showData",
     prompt: "Display the values stored in the data section of the tiddler"
};

config.macros.showData.handler = function(place,macroName,params) {
    // --- Parsing ------------------------------------------

    var i = 0; // index running over the params
    // Parse the optional "JSON"
    var showInJSONFormat = false;
    if ((i < params.length) && params[i] == "JSON") {
        i++;
        showInJSONFormat = true;
    }
    
    var tiddlerName = story.findContainingTiddler(place).id.substr(7);
    if (i < params.length) {
        tiddlerName = params[i];
        i++;
    }

    // --- Processing ------------------------------------------
    try {
        if (showInJSONFormat) {
            this.renderDataInJSONFormat(place, tiddlerName);
        } else {
            this.renderDataAsTable(place, tiddlerName);
        }
    } catch (e) {
        this.createErrorElement(place, e);
    }
};

config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
    var text = DataTiddler.getDataText(tiddlerName);
    if (text) {
        createTiddlyElement(place,"pre",null,null,text);
    }
};

config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
    var text = "|!Name|!Value|\n";
    var data = DataTiddler.getDataObject(tiddlerName);
    if (data) {
        for (var i in data) {
            var value = data[i];
            text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
        }
    }
    
    wikify(text, place);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.showData.createErrorElement = function(place, exception) {
    var message = (exception.description) ? exception.description : exception.toString();
    return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
    ".showDataError{color: #ffffff;background-color: #880000;}",
    "showData");


} // of "install only once"
// Used Globals (for JSLint) ==============

// ... TiddlyWiki Core
/*global 	createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global 	DataTiddler */
// ... JSON
/*global 	JSON */
			

/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org

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 shall be used for Good, not Evil.

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.
*/

/*
    The global object JSON contains two methods.

    JSON.stringify(value) takes a JavaScript value and produces a JSON text.
    The value must not be cyclical.

    JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
    throw a 'JSONError' exception if there is an error.
*/
var JSON = {
    copyright: '(c)2005 JSON.org',
    license: 'http://www.crockford.com/JSON/license.html',
/*
    Stringify a JavaScript value, producing a JSON text.
*/
    stringify: function (v) {
        var a = [];

/*
    Emit a string.
*/
        function e(s) {
            a[a.length] = s;
        }

/*
    Convert a value.
*/
        function g(x) {
            var c, i, l, v;

            switch (typeof x) {
            case 'object':
                if (x) {
                    if (x instanceof Array) {
                        e('[');
                        l = a.length;
                        for (i = 0; i < x.length; i += 1) {
                            v = x[i];
                            if (typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(v);
                            }
                        }
                        e(']');
                        return;
                    } else if (typeof x.toString != 'undefined') {
                        e('{');
                        l = a.length;
                        for (i in x) {
                            v = x[i];
                            if (x.hasOwnProperty(i) &&
                                    typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(i);
                                e(':');
                                g(v);
                            }
                        }
                        return e('}');
                    }
                }
                e('null');
                return;
            case 'number':
                e(isFinite(x) ? +x : 'null');
                return;
            case 'string':
                l = x.length;
                e('"');
                for (i = 0; i < l; i += 1) {
                    c = x.charAt(i);
                    if (c >= ' ') {
                        if (c == '\\' || c == '"') {
                            e('\\');
                        }
                        e(c);
                    } else {
                        switch (c) {
                            case '\b':
                                e('\\b');
                                break;
                            case '\f':
                                e('\\f');
                                break;
                            case '\n':
                                e('\\n');
                                break;
                            case '\r':
                                e('\\r');
                                break;
                            case '\t':
                                e('\\t');
                                break;
                            default:
                                c = c.charCodeAt();
                                e('\\u00' + Math.floor(c / 16).toString(16) +
                                    (c % 16).toString(16));
                        }
                    }
                }
                e('"');
                return;
            case 'boolean':
                e(String(x));
                return;
            default:
                e('null');
                return;
            }
        }
        g(v);
        return a.join('');
    },
/*
    Parse a JSON text, producing a JavaScript value.
*/
    parse: function (text) {
        var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
            token,
            operator;

        function error(m, t) {
            throw {
                name: 'JSONError',
                message: m,
                text: t || operator || token
            };
        }

        function next(b) {
            if (b && b != operator) {
                error("Expected '" + b + "'");
            }
            if (text) {
                var t = p.exec(text);
                if (t) {
                    if (t[2]) {
                        token = null;
                        operator = t[2];
                    } else {
                        operator = null;
                        try {
                            token = eval(t[1]);
                        } catch (e) {
                            error("Bad token", t[1]);
                        }
                    }
                    text = text.substring(t[0].length);
                } else {
                    error("Unrecognized token", text);
                }
            } else {
                token = operator = undefined;
            }
        }


        function val() {
            var k, o;
            switch (operator) {
            case '{':
                next('{');
                o = {};
                if (operator != '}') {
                    for (;;) {
                        if (operator || typeof token != 'string') {
                            error("Missing key");
                        }
                        k = token;
                        next();
                        next(':');
                        o[k] = val();
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next('}');
                return o;
            case '[':
                next('[');
                o = [];
                if (operator != ']') {
                    for (;;) {
                        o.push(val());
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next(']');
                return o;
            default:
                if (operator !== null) {
                    error("Missing value");
                }
                k = token;
                next();
                return k;
            }
        }
        next();
        return val();
    }
};

/***
!Setup the data serialization
***/

DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;

//}}}

<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Time and calendars","description":"Formatted dates plus popup menu with 'journal' link, changes and (optional) reminders. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content. This plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if theRemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes. Each item in the table of contents can be clicked on to jump to that heading. It can be used either inside of select tiddlers or inside a system wide template.","author":"Doug Compton","link":"http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin","category":"Navigating within a tiddler","format":"Plugin","twversion":"--"}</data>
function onClickDefaultHome(e) {
story.closeAllTiddlers();
config.options.txtDefaultTiddlers = "";
saveOptionCookie('txtDefaultTiddlers');
var start = store.getTiddlerText("DefaultTiddlers");
if(start)
story.displayTiddlers(null,start.readBracketedList()).reverse();
}
config.macros["defaultHome"] = {label: "Home", prompt: "Close all open tiddlers show the home page", title: "Home"};
config.macros.defaultHome.handler = function(place) {
createTiddlyButton(place,this.label,this.prompt,onClickDefaultHome);
}
[[Index]]
[[Help]]
[[HowTo]]
[[Welcome]]



[[History]]
[[Help]]
[[Index]]

<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","category":"Formatting and viewing text","description":"Allow definitions of glossary terms to be easily visible via mouseover."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Tagging","description":"Deletes all tiddlers with the specified tag."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"An adaptation of DeleteDoneTasks (Simon Baird) by Ido Magal.","link":"http://ido-xp.tiddlyspot.com/","author":"Ido Magal","format":"Plugin","twversion":"2.1.0","category":"Tagging"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Embed a del.icio.us \"play tagger\" next to mp3 URLs embedded in tiddler content","format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","category":"Images and presentations"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","category":"Tagging","description":"Allows easy 'del.icio.us'-like tagging in the EditTemplate by showing all tags as a list of link-buttons.","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"FND","link":"http://www.tiddlywiki.com/coreplugins.html","format":"Plugin","category":"Behind the scenes","description":"Provides support for functions removed from the TiddlyWiki core."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Daniel Baird","link":"http://danielbaird.com/tiddlywinks/","format":"Other","twversion":"--","category":"Games","description":"Roll the dice and see what turns up."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1","description":"Allows you to disable TiddlyWiki's automatic linking of WikiWords.","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin allows you to disable TiddlyWiki's automatic WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links. To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","format":"Plugin","twversion":"2.1","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","author":"Daniel Baird","twversion":"2.1x","category":"Tagging","description":"Make the tag chooser ignore tags that are themselves tagged with 'excludeLists'.","link":"http://discerningtags.tiddlyspot.com/"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Searching and indexing tiddlers","description":"Onclick script that opens ALL tiddler in the document.  Can be slow if document is large."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Displays similar to the popular BreadCrumbsPlugin by AlanHecht, this plugin instead keeps a list of currently open tiddlers.","category":"Searching and indexing tiddlers","twversion":"--","format":"Plugin","author":"Walt Woods","link":"http://oregonstate.edu/~woodswa/tiddlywikiplugs.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Greg Walker","link":"http://gwsyzygy.googlepages.com/creator.html","format":"Plugin","twversion":"--","category":"Formatting and viewing text","description":"A macro for displaying glyphs according to the tags on a particular tiddler. Glyphs are defined in DisplayTiddlerGlyphData and don't have to be just a glyph (graphic character). They can be any wiki content, including images, text, buttons, popups, etc."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Creates a button which allows you to backup your TiddlyWiki on demand.","category":"Saving and reviewing changes","twversion":"--","format":"Macro","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A script to download a TiddlyWiki in one click.","category":"Working with websites, incl IFrames","twversion":"--","format":"Script","author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"--","category":"Tagging","description":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","category":"Tagging","description":"Dropdown version of core tagging macro.","twversion":"2.07","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Dropdown version of core tags macro.","category":"Tagging","twversion":"2.07","format":"Macro","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","author":"Yann Perrin","link":"http://yann.perrin.googlepages.com/twkd.html","twversion":"2.x","category":"Formatting and viewing text","description":"Create custom text formatting menus available in the edit mode of your tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"The slice command allows you to create microcontent tiddlers from bigger ones. It turns selected text into a new independent tiddler, and replace it in the original tiddler with a reference to the newly created tiddler.","category":"Tiddler manipulation","twversion":"2.x","format":"Plugin","link":"http://yann.perrin.googlepages.com/twkd.html","author":"Yann Perrin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Using the E.A.S.E. plugin, easyTongue allows you to mark selection as being from the chosen language. (if you open his tiddler into edit mode you can see that you can switch from English to French and back. ","category":"Non-English languages","twversion":"2.x","format":"Plugin","author":"Yann Perrin","link":"http://yann.perrin.googlepages.com/twkd.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Macro debugging. Echo will echo back all params passed to it, including each parameter's #, type, value, and literal value (unwikified). Useful for debugging exactly what is getting passed to a macro.","category":"Behind the scenes","twversion":"--","format":"Macro","link":"http://gwsyzygy.googlepages.com/creator.html","author":"Greg Walker"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Theme","description":"Alternative stylesheet theme: dark blue sunset photo background.","category":"Themes","twversion":"2.1","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<script label="edit a tiddler">
   var title=prompt("Enter the title of a tiddler to edit (case sensitive)");
   while (title && title.length && !store.tiddlerExists(title)) {
      displayMessage("The tiddler '%0' doesn't exist".format([title]));
      var title=prompt("Please enter a tiddler title",title);
   }
   if (!title||!title.length) return; /* cancelled by user */
   story.displayTiddler(null,title,2);
</script> 
<<formTiddler NewPluginTemplate>><data>{"description":"Extend core edit macro for use in ViewTemplates or direct embedding in tiddler content.<br><br>Normally, when you edit a tiddler, any changes you make are only saved (or discarded) when you press the \"done\" (or \"cancel\") command in the tiddler editor's toolbar. However, when in a 'view mode' context, these command items are not available, and so cannot be used to trigger the 'save/discard' handling once you have decided that your input activities are complete. Instead, you will be automatically prompted to save/discard your changes (if any) as soon as you move away from a text edit field or multi-line text area. Alternatively, pressing ENTER while in an edit field will save your input, while pressing ESCAPE will abandon your input (after prompting for confirmation).","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","category":"Forms and databases"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Listbox fields for ~TiddlyWiki.","category":"Forms and databases","author":"? (VisualTW)","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Macro","twversion":"2.2.x"}</data>
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div class="editLabel">&ensp;</div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<div class='editor' macro='edit text'></div>
<!--}}}-->
<<formTiddler NewPluginTemplate>><data>{"description":"Embed an 'edit' link in tiddler content to invoke edit on any specified tiddler title.","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","format":"Plugin","category":"Tiddler manipulation"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","format":"Macro","twversion":"2.0 compliant","category":"Aids for website visitors","description":"Email lets you list a \"email\" address without displaying it as readable text. This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words \"at\" and \"dot\" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Unknown","link":"http://fire.atspace.org/","format":"Macro","twversion":"--","category":"Working with files and programs","description":"Sends an e-mail, I'm assuming."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Enables editing on an online TiddlyWiki without the need to reload. Also disables animations, and enables backstage functionalities.","category":"Uploading TiddlyWikis to a server","format":"Bookmarklet","twversion":"2.0","author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Encrypted fields for TiddlyWiki","twversion":"2.2.x","category":"Forms and databases","format":"Plugin","link":"http://visualtw.ouvaton.org/VisualTW.html","author":"? (VisualTW)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Pascal","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Plugin","twversion":"2.2.0","category":"Security","description":"Create an encrypted vault where all tiddlers are password protected. By default, only the system tiddlers aren't encrypted.Even shadow tiddlers (MainMenu, SiteTitle, PageTemplate, StyleSheet, ...) can be encrypted. The shadow version is used until unlocking."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Excludes any tiddlers from timeline that have been tagged with excludeTimeline.","author":"Soloport","link":"http://soloport.tiddlyspot.com/#ExcludeTimelinePlugin","format":"Plugin","twversion":"--","category":"Searching and indexing tiddlers"}</data>
 @@color:#C06;''&raquo; &raquo;'' @@ Tabs excluded From Lists
----
<script>
// get all tiddlers tagged with "excludeLists"
var tids=store.getTaggedTiddlers("excludeLists");
// keep only tiddlers *also* tagged with New
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("excludeLists")) list.push(tids[t]);
// create output list of tiddler titles, one per line
var out="";
for (var t=0; t<list.length; t++) out+="#[["+list[t].title+"]]\n";
return out;
</script> 
 @@color:#C06;''&raquo; &raquo;'' @@ Tabs excluded from searches.
----
<script>
// get all tiddlers tagged with "excludeSearch"
var tids=store.getTaggedTiddlers("excludeSearch");
// keep only tiddlers *also* tagged with New
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("excludeSearch")) list.push(tids[t]);
// create output list of tiddler titles, one per line
var out="";
for (var t=0; t<list.length; t++) out+="#[["+list[t].title+"]]\n";
return out;
</script> 
<<formTiddler NewPluginTemplate>><data>{"author":"Jon Scully","link":"http://soloport.tiddlyspot.com/#ExcludeTimelinePlugin","description":"Provide an 'expand' button in edit mode that increases the textarea by 10 rows per click.","twversion":"2.1.2","category":"Tiddler manipulation","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Menus and sliders","description":"Simulateously expand/collapse all nested sliders in a tiddler (or ID'd DOM element)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Select and extract tiddlers from your TiddlyWiki documents and save them to a local file. When many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version ofTiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)","category":"Working with multiple TiddlyWikis","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin lets you export tiddlers into dfwiki pages of a moodle 1.6.X with the nwiki module installed.","category":"Working with websites, incl IFrames","twversion":"2.1.2","format":"Plugin","author":"Oriol Nieto , Alejandro Moreno, Dídac Calventus & Ludo (Marc Alier)","link":"http://moodle.tiddlyspot.com/"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"2.2.1","category":"Tagging","description":"Adds a New tiddler button in the tag drop down"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Aids for website visitors","description":"Select and display FAQ tiddlers from a droplist, sorted by date."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Aids for website visitors","description":"FAQ List lets you compile a list of Frequently Asked Questions and present them in a cascading style for the viewer. Each question is turned into a link that will toggle the view of the answer text. The list can be compiled either from all tiddlers containing a certain tag or from a single tiddler that contains all the needed questions and answers. A pre- 'version 2.0' version is also available.","twversion":"2.0","format":"Plugin","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","author":"Alan Hecht"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","format":"Plugin","twversion":"2.0 compatible","category":"Icons","description":"Favicon allows you to stipulate the location of a webpage icon (also known as a favorite icon or favicon) for your TiddlyWiki. The location of the icon is absolute (meaning that you need to give the full URL path, including the \"http:\"). This allows you to use any favicon icon that exists on the Web -- even if it is on a totally different server."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"? (VisualTW)","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Plugin","twversion":"2.2.x","category":"Forms and databases","description":"Edit, rename, delete, create fields commands."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","format":"Plugin","twversion":"--","category":"Working with files and programs","description":"Drag a file onto the TW to have it be made into a tiddler."}</data>
{{borderlessL{
|>|<<search>>|
|<<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags<<option chkHoldSearches>> Hold |
----
|>|@@color:#04b;font-weight:bold;goto ''&raquo; &raquo;'' @@<<gotoTiddler>>|
}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Paul Downey","description":"","twversion":"2.4","link":"http://whatfettle.com/2008/07/FixedDisplayPlugin","format":"Plugin","category":"Tiddler manipulation"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"It replicates the random greeting messages from Flickr in a TiddlyWiki macro.","format":"Macro","twversion":"--","category":"Aids for website visitors","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Upon initial display, tiddler is shown \"folded\".","category":"Tiddler manipulation","twversion":"2.1","format":"Script","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com"}</data>
/***
|Name|FontSizePlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#FontSizePlugin|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Resize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.
You can customize the maximum and minimum allowed sizes.
(only affects tiddler content text, not any other text)

Also, you can load a TW file with a font-size specified in the url.
Eg: http://tw.lewcid.org/#font:110

!Demo:
Try using the font-size buttons in the sidebar, or in the MainMenu above.

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Then put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.

!Usage
{{{<<fontSize>>}}} results in <<fontSize>>
{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>

!Customizing:
The buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.
To change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.

!Notes:
This plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.

!History:
*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.
*25-07-06,  version 0.9

!Code
***/

//{{{
config.fontSize={};

//configuration settings
config.fontSize.settings =
{
            defaultSize : 100,  // all sizes in %
            maxSize : 200,
            minSize : 40,
            stepSize : 5
};

//startup code
var fontSettings = config.fontSize.settings;

if (!config.options.txtFontSize)
            {config.options.txtFontSize = fontSettings.defaultSize;
            saveOptionCookie("txtFontSize");}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
setStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\n .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");

//macro
config.macros.fontSize={};
config.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{

               var sp = createTiddlyElement(place,"span",null,"fontResizer");
               sp.ondblclick=this.onDblClick;
               if (params[0])
                           createTiddlyText(sp,params[0]);
               createTiddlyButton(sp,"+","increase font-size",this.incFont);
               createTiddlyButton(sp,"=","reset font-size",this.resetFont);
               createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}

config.macros.fontSize.onDblClick = function (e)
{
             if (!e) var e = window.event;
             e.cancelBubble = true;
             if (e.stopPropagation) e.stopPropagation();
             return false;
}

config.macros.fontSize.setFont = function ()
{
               saveOptionCookie("txtFontSize");
               setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}

config.macros.fontSize.incFont=function()
{
               if (config.options.txtFontSize < fontSettings.maxSize)
                  config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
               config.macros.fontSize.setFont();
}

config.macros.fontSize.decFont=function()
{

               if (config.options.txtFontSize > fontSettings.minSize)
                  config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
               config.macros.fontSize.setFont();
}

config.macros.fontSize.resetFont=function()
{

               config.options.txtFontSize=fontSettings.defaultSize;
               config.macros.fontSize.setFont();
}

config.paramifiers.font =
{
               onstart: function(v)
                  {
                   config.options.txtFontSize = v;
                   config.macros.fontSize.setFont();
                  }
};
//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","twversion":"2.0","category":"Formatting and viewing text","description":"Create automated tiddler footnotes."}</data>
//~~(Part of the [[ForEachTiddlerPlugin]])~~//

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


''Using JavaScript''

To give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples]] and adapt them to your needs.

''The Elements of the Macro''

The arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.

<<slider chkFETInClause [[inClause]] "inClause" "inClause">>
<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>
<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>
<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>
<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>

''Using Macros and ">" inside the forEachTiddler Macro''

You may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.

In addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.

''Using {{{<<tiddler ... with: ...>>}}} to re-use ForEachTiddler definitions''

Sometimes you may want to use a certain ForEachTiddler definition in slight variations. E.g. you may want to list either the tiddlers tagged with "ToDo" and in the other case with "Done". To do so you may use "Tiddler parameters". Here an example:

Replace the variable part of the ForEachTiddler definition with $1 ($2,... $9 are supported). E.g. you may create the tiddler "ListTaggedTiddlers" like this
{{{
<<forEachTiddler 
 where 
 'tiddler.tags.contains("$1")'
>>
}}}

Now you can use the ListTaggedTiddlers for various specific tags, using the {{{<<tiddler ...>>}}} macro:
{{{
<<tiddler ListTaggedTiddlers with: "systemConfig">>
}}}
{{{
<<tiddler ListTaggedTiddlers with: "Plugin">>
}}}


See also [[ForEachTiddlerExamples]].
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Searching and indexing tiddlers","description":"Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.","twversion":"1.2.38+, 2.0"}</data>
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
***/
//============================================================================
//============================================================================
//		   ForEachTiddlerPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

if (!window.abego) window.abego = {};

version.extensions.ForEachTiddlerPlugin = {
	major: 1, minor: 0, revision: 8, 
	date: new Date(2007,3,12), 
	source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};

// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
	TiddlyWiki.prototype.forEachTiddler = function(callback) {
		for(var t in this.tiddlers) {
			callback.call(this,t,this.tiddlers[t]);
		}
	};
}

//============================================================================
// forEachTiddler Macro
//============================================================================

version.extensions.forEachTiddler = {
	major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
	 // Standard Properties
	 label: "forEachTiddler",
	 prompt: "Perform actions on a (sorted) selection of tiddlers",

	 // actions
	 actions: {
		 addToList: {},
		 write: {}
	 }
};

// ---------------------------------------------------------------------------
//  The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	var title = e ? e.getAttribute("tiddler") : null; 
	return title ? store.getTiddler(title) : null;
};

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

	if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params
	// Parse the "in" clause
	var tiddlyWikiPath = undefined;
	if ((i < params.length) && params[i] == "in") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "TiddlyWiki path expected behind 'in'.");
			return;
		}
		tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the where clause
	var whereClause ="true";
	if ((i < params.length) && params[i] == "where") {
		i++;
		whereClause = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the sort stuff
	var sortClause = null;
	var sortAscending = true; 
	if ((i < params.length) && params[i] == "sortBy") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "sortClause missing behind 'sortBy'.");
			return;
		}
		sortClause = this.paramEncode(params[i]);
		i++;

		if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
			 sortAscending = params[i] == "ascending";
			 i++;
		}
	}

	// Parse the script
	var scriptText = null;
	if ((i < params.length) && params[i] == "script") {
		i++;
		scriptText = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the action. 
	// When we are already at the end use the default action
	var actionName = "addToList";
	if (i < params.length) {
	   if (!config.macros.forEachTiddler.actions[params[i]]) {
			this.handleError(place, "Unknown action '"+params[i]+"'.");
			return;
		} else {
			actionName = params[i]; 
			i++;
		}
	} 
	
	// Get the action parameter
	// (the parsing is done inside the individual action implementation.)
	var actionParameter = params.slice(i);


	// --- Processing ------------------------------------------
	try {
		this.performMacro({
				place: place, 
				inTiddler: tiddler,
				whereClause: whereClause, 
				sortClause: sortClause, 
				sortAscending: sortAscending, 
				actionName: actionName, 
				actionParameter: actionParameter, 
				scriptText: scriptText, 
				tiddlyWikiPath: tiddlyWikiPath});

	} catch (e) {
		this.handleError(place, e);
	}
};

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

	var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

	var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
	context["tiddlyWiki"] = tiddlyWiki;
	
	// Get the tiddlers, as defined by the whereClause
	var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
	context["tiddlers"] = tiddlers;

	// Sort the tiddlers, when sorting is required.
	if (parameter.sortClause) {
		this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
	}

	return {tiddlers: tiddlers, context: context};
};

// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
	return this.getTiddlersAndContext(parameter).tiddlers;
};

// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
//				  The following properties are supported:
//
//						place
//						whereClause
//						sortClause
//						sortAscending
//						actionName
//						actionParameter
//						scriptText
//						tiddlyWikiPath
//
//					All properties are optional. 
//					For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
	var tiddlersAndContext = this.getTiddlersAndContext(parameter);

	// Perform the action
	var actionName = parameter.actionName ? parameter.actionName : "addToList";
	var action = config.macros.forEachTiddler.actions[actionName];
	if (!action) {
		this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
		return;
	}

	var actionHandler = action.handler;
	actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};

// ---------------------------------------------------------------------------
//  The actions 
// ---------------------------------------------------------------------------

// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;

	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
		return;
	}

	// Perform the action.
	var list = document.createElement("ul");
	place.appendChild(list);
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		var listItem = document.createElement("li");
		list.appendChild(listItem);
		createTiddlyLink(listItem, tiddler.title, true);
	}
};

abego.parseNamedParameter = function(name, parameter, i) {
	var beginExpression = null;
	if ((i < parameter.length) && parameter[i] == name) {
		i++;
		if (i >= parameter.length) {
			throw "Missing text behind '%0'".format([name]);
		}
		
		return config.macros.forEachTiddler.paramEncode(parameter[i]);
	}
	return null;
}

// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;
	if (p >= parameter.length) {
		this.handleError(place, "Missing expression behind 'write'.");
		return;
	}

	var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
	p++;

	// Parse the "begin" option
	var beginExpression = abego.parseNamedParameter("begin", parameter, p);
	if (beginExpression !== null) 
		p += 2;
	var endExpression = abego.parseNamedParameter("end", parameter, p);
	if (endExpression !== null) 
		p += 2;
	var noneExpression = abego.parseNamedParameter("none", parameter, p);
	if (noneExpression !== null) 
		p += 2;

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		p++;
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
			return;
		}
		
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		p++;
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			p++;
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
				return;
			}
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
			p++;
		}
	}
	
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
		return;
	}

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	}
	
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

	if (count == 0 && noneExpression) 
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
		

	if (filename) {
		if (lineSeparator !== undefined) {
			lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
			text = text.replace(/\n/mg,lineSeparator);
		}
		saveFile(filename, convertUnicodeToUTF8(text));
	} else {
		var wrapper = createTiddlyElement(place, "span");
		wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
	}
};


// ---------------------------------------------------------------------------
//  Helpers
// ---------------------------------------------------------------------------

// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
	return {
		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
	};
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


	
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
//	 (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
			result.push(tiddler);
		}
	});
	return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	}
	this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
	}

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;
	}
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
	displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	}
	message += ">>";
	displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;
	}
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
	"forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
		}
	}
	return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
		}
	}
	return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
		}
	}
	return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/

The [[FormTiddlerPlugin]] allows you to enter your data in a form and store the form's data in your tiddlers.

(For more information on tiddler data see the [[DataTiddlerPlugin]].)

//''Define ~FormTemplate''//

When you want to enter data in a form you first have to define a [[FormTemplate]] tiddler. A FormTemplate tiddler is a tiddler that contains named HTML INPUT elements (such as textfields, password fields, lists etc.) that define the stuff that should be edited in the form. E.g. you may have a FormTemplate that looks like this:

<html>
 <b>Name:</b><br/>
 <input name=userName type=text /><br/>
 <b>Password:</b><br/>
 <input name=pwd type=password /><br/>
</html>

The correspond HTML text looks like this
{{{
<html>
 <b>Name:</b><br/>
 <input name=userName type=text /><br/>
 <b>Password:</b><br/>
 <input name=pwd type=password /><br/>
</html>
}}}

The name of the INPUT element is also the name of the data field it is editing. E.g. a text field defined like this: 
{{{
<input name=userName type=text />
}}}
will edit the data field "userName" of the tiddler.


You are free to layout the INPUT elements as you like, but don't add a "form" element around them and don't define 'onchange' handlers, since this will be done automatically by the {{{<<formTiddler ...>>}}} macro.


//''Use ~FormTemplates (through the {{{<<formTiddler ...>>}}} macro)''//

In a second step you add the {{{<<formTiddler ...>>}}} macro to tiddlers that should be edited. In the macro you are referencing the [[FormTemplate]] that should be used to edit the tiddler's data. You may refer to the same FormTemplate tiddler in as many tiddlers as you like. Every such tiddler displays the same INPUT elements as the FormTemplate, but with the "data" of each individual tiddler.

In addition you may more than one {{{<<formTiddler...>>}}} macro call in one tiddler. Just make sure that the names of the elements in the referenced FormTemplate tiddlers do not collide. This feature may be useful if you want to construct a larger input form from a set of smaller FormTemplates.

You can easily create tiddlers with an embedded {{{<<formTiddler...>>}}} macro call using the [[<<newTiddlerWithForm...>>|NewTiddlerWithFormMacro]] macro. The macro shows a button similar to the "new tiddler" button and creates the requested tiddler, ready to enter data. For details see NewTiddlerWithFormMacro.


//''"Structured" and "Free" Data''//

Typically you will edit a tiddler that uses the {{{<<formTiddler...>>}}} macro through the form. But you are free to also edit the tiddler "as usual", through the build-in edit feature. I.e. you may mix "structured data" (as entered through the form) with "free data". I.e. on a "Contact" tiddler you may add an image to the tiddler, or add extra links to related persons. Or you add more tags. Just make sure that you don't modify the {{{<data>...</data>}}} section of the tiddler, since this contains the data maintained by the form.

Also notice that since the data entered in the forms is stored in the tiddler's text (in the {{{<data>...</data>}}} section) using the "search" feature will also find the texts you entered in the forms (even though it will not hilite the texts in the fields).


//''Applications''//

Using the [[FormTiddlerPlugin]] it is easy to manage things like:
* [[Contacts]]
* [[Bugreports]]
* ~ToDo Lists
* and many more.

Since a FormTemplate is typically used for many tiddlers of the same kind you may also consider using the ForEachTiddlerMacro to collect data across multiple tiddlers (e.g. to get a list of all contacts, a summary page for the bug reports etc.)

(See also [[FormTiddler Examples]])


//''HTML Elements''//

For those not that familiar with the HTML INPUT elements here a short overview with HTML snippets. 
|!Type|!HTML Example|!Comment|
|button|{{{<input name=btn type=button value="Just a button" />}}}|no data|
|checkbox|{{{<input name=isVIP type=checkbox />is VIP}}}||
|file|{{{<input name=attachment type=file />}}}|The "file" input element typically does not restore the path of the previously selected file. Nevertheless the path of the file is stored in the tiddler.|
|hidden|{{{<input name=hiddenValue type=hidden value="This is a hidden value" />}}}||
|password|{{{<input name=pwd type=password />}}}|The data entered in a "password" field is stored as clear text in the tiddler.|
|radio|{{{<input name=level type=radio value="Beginner" />Beginner<input name=level type=radio value="Expert" />Expert<input name=level type=radio value="Guru" />Guru}}}||
|reset|{{{<input name=btnReset type=reset />}}}|no data|
|select-one|{{{<select name=browser ><option>Firefox<option>Internet Explorer<option>Opera<option>Other</select >}}}||
|select-multiple|{{{<select name=music MULTIPLE ><option> R&B <option> Jazz <option> Blues <option> New Age</select >}}}||
|submit|{{{<input name=btnSubmit type=submit />}}}|no data|
|text|{{{<input name=userName type=text/>}}}||
|textarea|{{{<TEXTAREA name=notes rows=4 cols=80 ></TEXTAREA>}}}||

For details consult the Web or a textbook on HTML editing.
The {{{<<formTiddler ...>>}}} macro defined by the FormTiddlerPlugin. 

When a tiddler T1 references the (FormTemplate) tiddler T2 in the FormTiddlerMacro, the data of T1 can be edited through the INPUT elements defined by T2.
/***
<<checkForDataTiddlerPlugin>>
|''Name:''|FormTiddlerPlugin|
|''Version:''|1.0.6 (2007-06-24)|
|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|
|''Requires:''|DataTiddlerPlugin|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).

''Syntax:'' 
|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|
|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|

|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|
|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|
|//buttonLabel//|The label of the button|
|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|
|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

For details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].

!Revision history
* v1.0.6 (2007-06-24)
** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)
* v1.0.5 (2006-02-24)
** Removed "debugger;" instruction
* v1.0.4 (2006-02-07)
** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)
* v1.0.3 (2006-02-05)
** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)
* v1.0.2 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.1 (2005-12-22)
** Features: 
*** Support InternetExplorer
*** Added newTiddlerWithForm Macro
* v1.0.0 (2005-12-14)
** initial version

!Code
***/
//{{{

//============================================================================
//============================================================================
//						FormTiddlerPlugin
//============================================================================
//============================================================================

if (!window.abego) window.abego = {};

abego.getOptionsValue = function(element,i) {
	var v = element.options[i].value;
	if (!v && element.options[i].text)
		v = element.options[i].text;
	return v;
};

version.extensions.FormTiddlerPlugin = {
	major: 1, minor: 0, revision: 5,
	date: new Date(2006, 2, 24), 
	type: 'plugin',
	source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } 

//============================================================================
// formTiddler Macro
//============================================================================

// -------------------------------------------------------------------------------
// Configurations and constants 
// -------------------------------------------------------------------------------

config.macros.formTiddler = {
	// Standard Properties
	label: "formTiddler",
	version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},
	prompt: "Edit tiddler data using forms",

	// Define the "setters" that set the values of INPUT elements of a given type
	// (must match the corresponding "getter")
	setter: {  
		button:				function(e, value) {/*contains no data */ },
		checkbox:			function(e, value) {e.checked = value;},
		file:				function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},
		hidden:				function(e, value) {e.value = value;},
		password:			function(e, value) {e.value = value;},
		radio:				function(e, value) {e.checked = (e.value == value);},
		reset:				function(e, value) {/*contains no data */ },
		"select-one":		function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},
		"select-multiple":	function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},
		submit:				function(e, value) {/*contains no data */},
		text:				function(e, value) {e.value = value;},
		textarea:			function(e, value) {e.value = value;}
	},

	// Define the "getters" that return the value of INPUT elements of a given type
	// Return undefined to not store any data.
	getter: {  
		button:				function(e, value) {return undefined;},
		checkbox:			function(e, value) {return e.checked;},
		file:				function(e, value) {return e.value;},
		hidden:				function(e, value) {return e.value;},
		password:			function(e, value) {return e.value;},
		radio:				function(e, value) {return e.checked ? e.value : undefined;},
		reset:				function(e, value) {return undefined;},
		"select-one":		function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},
		"select-multiple":	function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},
		submit:				function(e, value) {return undefined;},
		text:				function(e, value) {return e.value;},
		textarea:			function(e, value) {return e.value;}
	}
};


// -------------------------------------------------------------------------------
// The formTiddler Macro Handler 
// -------------------------------------------------------------------------------

config.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {
		return;
	}
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params

	// get the name of the form template tiddler
	var formTemplateName = undefined;
	if (i < params.length) {
		formTemplateName = params[i];
		i++;
	}

	if (!formTemplateName) {
		config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
		return;
	}


	// --- Processing ------------------------------------------

	// Get the form template text. 
	// (This contains the INPUT elements for the form.)
	var formTemplateTiddler = store.getTiddler(formTemplateName);
	if (!formTemplateTiddler) {
		config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");
		return;
	}
	var templateText = formTemplateTiddler.text;
	if(!templateText) {
		// Shortcut: when template text is empty we do nothing.
		return;
	}

	// Get the name of the tiddler containing this "formTiddler" macro
	// (i.e. the tiddler, that will be edited and that contains the data)
	var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);

	// Append a "form" element. 
	var formName = "form"+formTemplateName+"__"+tiddlerName;
	var e = document.createElement("form");
	e.setAttribute("name", formName);
	place.appendChild(e);

	// "Embed" the elements defined by the templateText (i.e. the INPUT elements) 
	// into the "form" element we just created
	wikify(templateText, e);

	// Initialize the INPUT elements.
	config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));
}


// -------------------------------------------------------------------------------
// Form Data Access 
// -------------------------------------------------------------------------------

// Internal.
//
// Initialize the INPUT elements of the form with the values of their "matching"
// data fields in the tiddler. Also setup the onChange handler to ensure that
// changes in the INPUT elements are stored in the tiddler's data.
//
config.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {
	// config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");

	// find the form
	var form = config.macros.formTiddler.findForm(formName);
	if (!form) {
		return;
	}

	try {
		var elems = form.elements;
		for (var i = 0; i < elems.length; i++) {
			var c = elems[i];
		
			var setter = config.macros.formTiddler.setter[c.type];
			if (setter) {
				var value = data[c.name];
				if (value != null) {
					setter(c, value);
				}
				c.onchange = onFormTiddlerChange;
			} else {
				config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");
			}
		}
	} catch(e) {
		config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);
	}
}


// Internal.
//
// @return [may be null]
//
config.macros.formTiddler.findForm = function(formName) {
	// We must manually iterate through the document's forms, since
	// IE does not support the "document[formName]" approach

	var forms = window.document.forms;
	for (var i = 0; i < forms.length; i++) {
		var form = forms[i];
		if (form.name == formName) {
			return form;
		}
	}

	return null;
}


// Internal.
//
config.macros.formTiddler.setSelectOneValue = function(element,value) {
	var n = element.options.length;
	for (var i = 0; i < n; i++) {
		element.options[i].selected = abego.getOptionsValue(element,i) == value;
	}
}

// Internal.
//
config.macros.formTiddler.setSelectMultipleValue = function(element,value) {
	var values = {};
	for (var i = 0; i < value.length; i++) {
		values[value[i]] = true;
	}
	
	var n = element.length;
	for (var i = 0; i < n; i++) {
		element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);
	}
}

// Internal.
//
config.macros.formTiddler.getSelectOneValue = function(element) {
	var i = element.selectedIndex;
	return (i >= 0) ? abego.getOptionsValue(element,i) : null;
}

// Internal.
//
config.macros.formTiddler.getSelectMultipleValue = function(element) {
	var values = [];
	var n = element.length;
	for (var i = 0; i < n; i++) {
		if (element.options[i].selected) {
			values.push(abego.getOptionsValue(element,i));
		}
	}
	return values;
}



// -------------------------------------------------------------------------------
// Helpers 
// -------------------------------------------------------------------------------

// Internal.
//
config.macros.formTiddler.checkForExtensions = function(place,macroName) {
	if (!version.extensions.DataTiddlerPlugin) {
		config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");
		return false;
	}
	return true;
}

// Internal.
//
// Displays a trace message in the "TiddlyWiki" message pane.
// (used for debugging)
//
config.macros.formTiddler.trace = function(s) {
	displayMessage("Trace: "+s);
}

// Internal.
//
// Display some error message in the "TiddlyWiki" message pane.
//
config.macros.formTiddler.displayFormTiddlerError = function(s) {
	alert("FormTiddlerPlugin Error: "+s);
}

// Internal.
//
// Creates an element that holds an error message
// 
config.macros.formTiddler.createErrorElement = function(place, message) {
	return createTiddlyElement(place,"span",null,"formTiddlerError",message);
}

// Internal.
//
// Returns the name of the tiddler containing the given element.
// 
config.macros.formTiddler.getContainingTiddlerName = function(element) {
	return story.findContainingTiddler(element).id.substr(7);
}

// -------------------------------------------------------------------------------
// Event Handlers 
// -------------------------------------------------------------------------------

// This function must be called by the INPUT elements whenever their
// data changes. Typically this is done through an "onChange" handler.
//
function onFormTiddlerChange (e) {
	// config.macros.formTiddler.trace("onFormTiddlerChange "+e);

	if (!e) var e = window.event;

	var target = resolveTarget(e);
	var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);
	var getter = config.macros.formTiddler.getter[target.type];
	if (getter) {
		var value = getter(target);
		DataTiddler.setData(tiddlerName, target.name, value);
	} else {
		config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");
	}
}

// ensure that the function can be used in HTML event handler
window.onFormTiddlerChange = onFormTiddlerChange;


// -------------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// -------------------------------------------------------------------------------

setStylesheet(
	".formTiddlerError{color: #ffffff;background-color: #880000;}",
	"formTiddler");


//============================================================================
// checkForDataTiddlerPlugin Macro
//============================================================================

config.macros.checkForDataTiddlerPlugin = {
	// Standard Properties
	label: "checkForDataTiddlerPlugin",
	version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},
	prompt: "Check if the DataTiddlerPlugin exists"
}

config.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {
	config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);
}



//============================================================================
// newTiddlerWithForm Macro
//============================================================================

config.macros.newTiddlerWithForm = {
	// Standard Properties
	label: "newTiddlerWithForm",
	version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},
	prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"
}

config.macros.newTiddlerWithForm.handler = function(place,macroName,params) {
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params

	// get the name of the form template tiddler
	var formTemplateName = undefined;
	if (i < params.length) {
		formTemplateName = params[i];
		i++;
	}

	if (!formTemplateName) {
		config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");
		return;
	}

	// get the button label
	var buttonLabel = undefined;
	if (i < params.length) {
		buttonLabel = params[i];
		i++;
	}

	if (!buttonLabel) {
		config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");
		return;
	}

	// get the (optional) tiddlerName script and "askUser"
	var tiddlerNameScript = undefined;
	var askUser = false;
	if (i < params.length) {
		tiddlerNameScript = params[i];
		i++;

		if (i < params.length && params[i] == "askUser") {
			askUser = true;
			i++;
		}
	}

	// --- Processing ------------------------------------------

	if(!readOnly) {
		var onClick = function() {
			var tiddlerName;
			if (tiddlerNameScript) {
				try {
					tiddlerName = eval(tiddlerNameScript);
				} catch (ex) {
				}
			}
			if (!tiddlerName || askUser) {
				tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");
			}
			while (tiddlerName && store.getTiddler(tiddlerName)) {
				tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\n\n"+"Please specify a tiddler name.", tiddlerName);
			}

			// tiddlerName is either null (user canceled) or a name that is not yet in the store.
			if (tiddlerName) {
				var body = "<<formTiddler [["+formTemplateName+"]]>>";
				var tags = [];
				store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);
				story.displayTiddler(null,tiddlerName,1);
			}
		}

		createTiddlyButton(place,buttonLabel,buttonLabel,onClick);
    }
}

//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Forms and databases","description":"Use form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).","twversion":"1.2.38+, 2.0"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Formatting and viewing text"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Forms and databases"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Toggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.","category":"Toggling page elements","twversion":"2.x","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Games"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","format":"Plugin","twversion":"--","category":"Working with websites, incl IFrames","description":"GenerateRssByTagPlugin overwrites the core generateRSS() function and defines a txtRssTag option to specify the tag to use (defaulted to \"toRSS\" )."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"View any tiddler by entering it's title - displays list of possible matches.","category":"Searching and indexing tiddlers","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.5.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|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press //escape// to close the listbox to resume typing.  When the listbox is ''//not//'' being displayed, press //escape// to clear the current text input and start over.
!!!!!Documentation
>see [[GotoPluginInfo]]
!!!!!Revisions
<<<
2008.02.17 [1.5.0] ENTER key always displays tiddler based on current input regardless of whether input matches any existing tiddler
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!!!Code
***/
//{{{
version.extensions.gotoTiddler = {major: 1, minor: 5, revision: 0, date: new Date(200,2,17)};

// automatically tweak shadow SideBarOptions to add <<gotoTiddler>> macro above <<search>>
config.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\n<<gotoTiddler>><<search>>");

config.macros.gotoTiddler= { 
	handler:
	function(place,macroName,params) {
		var quiet=(params[0] && params[0]=="quiet"); if (quiet) params.shift();
		var insert=(params[0] && params[0]=="insert"); if (insert) params.shift();
		var instyle=params.shift(); if (!instyle) instyle="";
		var liststyle=params.shift(); if (!liststyle) liststyle="";
		var keyevent=window.event?"onkeydown":"onkeypress";
		createTiddlyElement(place,"span").innerHTML
			=this.html.replace(/%keyevent%/g,keyevent).replace(/%insert%/g,insert).replace(/%quiet%/g,quiet).replace(/%instyle%/g,instyle).replace(/%liststyle%/g,liststyle);
	},

	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
			value="type tiddler name" title="enter a tiddler title"\
			onclick="this.form.list.style.display=\'none\';"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list);"\
			onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,this.form.list,%quiet%,%insert%);">\
		<select name=list style="%liststyle%;display:none;position:absolute"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=\'none\';"\
			%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%insert%);"\
			onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%insert%);">\
		</select>\
	</form>',

	getItems:
	function(val) {
		if (!this.items.length || val.length<2) { // starting new search, refresh cached list of tiddlers/shadows/tags
			this.items=new Array();
			var tiddlers=store.getTiddlers("title","excludeLists");
			for(var t=0; t<tiddlers.length; t++) this.items.push(tiddlers[t].title);
			for (var t in config.shadowTiddlers) this.items.pushUnique(t);
			var tags=store.getTags();
			for(var t=0; t<tags.length; t++) this.items.pushUnique(tags[t][0]);
		}
		var found = [];
		var match=val.toLowerCase();
		for(var i=0; i<this.items.length; i++)
			if (this.items[i].toLowerCase().indexOf(match)!=-1) found.push(this.items[i]);
		return found;
	},
	items: [], // cached list of tiddlers/shadows/tags

	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag 
	},

	keyProcessed:
	function(ev) { // utility function: exits handler and prevents browser from processing the keystroke
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},

	inputEscKeyHandler:
	function(event,here,list) {
		var key=event.keyCode;
		// escape... hide list (2nd esc=clears input)
		if (key==27) {
			if (list.style.display=="none")
				here.value=here.defaultValue;
			list.style.display="none";
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},

	inputKeyHandler:
	function(event,here,list,quiet,insert) {
		var key=event.keyCode;
		// non-printing chars... bubble up, except: backspace=8, enter=13, space=32, down=40, delete=46
		if (key<48) switch(key) { case 8: case 13: case 32: case 40: case 46: break; default: return true; }
		// blank input... if down/enter... fall through (list all)... else, and hide list
		if (!here.value.length && !(key==40 || key==13))
			{ list.style.display="none"; return this.keyProcessed(event); }
		// find matching items...
		var found = this.getItems(here.value);
		// non-blank input... enter key... show/create tiddler
		if (key==13) return this.processItem(here.value,here,list,insert);
		// make sure list is shown/hidden
		list.style.display=(!quiet && found.length)?"block":"none";
		// no matches, key bubbles up
		if (!found.length) return true;
		// down key... shows/moves to list...
		if (key==40)  { list.style.display="block"; list.focus(); }
		// finally, if list is showing, fill it with found results...
		if (list.style.display!="none") {
			while (list.length > 0) list.options[0]=null; // clear list
			found.sort(); // alpha by title
			var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
			list.options[0]=new Option(hdr,"",false,false);
			for (var t=0; t<found.length; t++)  // fill list...
				list.options[list.length]=new Option(found[t]+this.getItemSuffix(found[t]),found[t],false,false);
			list.size=(found.length<this.listMaxSize?found.length:this.listMaxSize)+1; // resize list...
			list.selectedIndex=(key==40 || key==13)?1:0;
		}
		return true; // key bubbles up
	},
	listMaxSize: 10,
	listHeading: 'Found %0 matching title%1:',

	selectKeyHandler:
	function(event,list,editfield,insert) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display="none"; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,insert); return this.keyProcessed(event); }
		return true; // key bubbles up
	},

	processItem:
	function(title,here,list,insert) {
		if (!title.length) return; here.value=title; list.style.display='none';
		if (insert) {
			var tidElem=story.findContainingTiddler(here); if (!tidElem) { here.focus(); return false; }
			var e=story.getTiddlerField(tidElem.getAttribute("tiddler"),"text");
			if (!e||e.getAttribute("edit")!="text") return false;
			var txt=prompt(this.askForText,title); if (!txt||!txt.length) { here.focus(); return false; }
			e.focus(); // put focus on target field before setting selection
			replaceSelection(e,"[["+txt+"|"+title+"]]"); // insert selected tiddler as a PrettyLink
		}
		else
			story.displayTiddler(null,title); // show selected tiddler
		return false;
	},
	askForText: "Enter the text to display for this link"
}
//}}}
/***
''GrayTestEverSearch'' for TiddlyWiki 2.0
^^author: Morris S. Gray
source: http://tiddlyspot.com/twhelp/
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^
|>|bgcolor:#eaeaea;@@color:#509;<<search>> ver: <<version>>@@|
|bgcolor(#509):@@color:#fff;<<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tag<<option chkHoldSearches>> Hold@@|

''A Plugin Tweak for:'' SearchOptionPlugin
!!!!!Description
<<<
This plugin defines an alternative format for the SearchResults tiddler that is generated by the SearchOptionsPlugin  Ver: ''2006.01.20 [2.1.7]'' or greater.
<<<
!!!!!Installation
<<<
Import (or copy/paste) the following tiddlers into your document:
''GrayTestEverSearch'' (tagged with <<tag systemConfig>>) 
<<<
!!!!!Revision History
<<<
''2006.02.03  [1.0.5]''
Added facility for holding the results of multiple searches with tick box on dashboard.
''2006.02.02  [1.0.4]''
Added several options, cleaned up design.Planning one version basic and one with added options this is the added options version.
''2006.01.27  [1.0.3''
Added a column for the size of the text in each tiddler, this does not include the size of the title or tags.  Added overall TW statistics button requires TiddlerStatsPlugin.
''2006.01.23 [1.0.2 ]''
''a)''Changed function reportSearchResults(text,matches) to  window.reportSearchResults=function(text,matches)
''b)''Added a line so that Incremental Search is automatically disabled config.options.chkSearchIncremental=false; turn off key-by-key searching
''c)''Removed space inside parens. bgcolor(#fe8 )" to "bgcolor(#fe8)".  This
is what was causing IE to 'crap out' halfway through drawing the table
headings.
''d)''Added {{{config.options.chkSearchList=true;}}}
''2006.01.20 [1.0.1]''
ELS: reportSearchResults() definition moved to this Plugin Tweak tiddler and removed extranous code
''2006.01.19 [1.0.0]''
This is an adaptation of Eric Shulman's SearchOptionsPlugin. Adapted by MorrisGray to provide search results in table form. All the necessary controls for refining the search is provided within the table including slide-down access to AdvancedOptions.
<<<
!!!!!Code
***/
//{{{


//{{{
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkRegExpSearch==undefined) config.options.chkRegExpSearch=true;
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=false;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=false;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=true;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=true;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=false;
if (config.options.chkToggleLinks==true) config.options.chkToggleLinks=false;
if (config.options.chkHoldSearches==undefined) config.options.chkHoldSearches=false;
if (config.options.chkSortTags==undefined) config.options.chkSortTags=false;

config.options.chkToggleLinks=false;
config.options.chkSinglePageMode=false;
config.options.chkHoldSearches=false;
config.options.chkSearchIncremental=false;
config.options.chkHttpReadOnly = false;
config.options.chkRegExpSearch=true;
config.options.chkSearchList=true;
config.options.chkToggleLinks=true;

config.shadowTiddlers.AdvancedOptions += "\n<<option chkSortTags>> Sort byTags";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkHoldSearches>> Hold search results";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchText>> Search in tiddler text";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTags>> Search in tiddler tags";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitlesFirst>> Search results show title matches first";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchList>> Search results show list of matching tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchIncremental>> Incremental searching";
//}}}


// Give the report a custom name
config.macros.search.reportTitle="TWHelp-SearchResults";

// Override default SearchOptionsPlugin formatting for SearchResults tiddler
window.reportSearchResults=function(text,matches)

{
        var title=config.macros.search.reportTitle
	config.macros.search.reportTitle;
	var q = config.options.chkRegExpSearch ? "/" : "'";
        if (!config.options.chkHoldSearches)  body="";
body+="\n Search Adapter Compliments of http://twhelp.tiddlyspot.com\n";
body+="\n|>|bgcolor(#eaeaea):@@color(#509):''"+config.macros.search.successMsg.format([matches.length,q+text+q])+"''@@|bgcolor(#509):  @@color(#fff): TW ver: <<version>>@@ "+"|"+"\n";
        body+="|>|>|bgcolor(#eaeaea):@@color(#509):<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold @@|"+"\n";
        body+="\n|bgcolor(#509):&nbsp;|bgcolor(#509): @@color(#fff):''Titles''@@ |bgcolor(#509): @@color(#fff): ''Size''@@ |bgcolor(#509): @@color(#fff): ''Tags''@@ |h";
	for(var t=0;t<matches.length;t++) 
        body+="\n"+"| "+(t+1)+"|[["+matches[t].title+"]]| "+matches[t].text.length+"|"+"@@"+matches[t].tags+"@@"+"|";
        body+="\n";
       


	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch killbookmark");
	store.addTiddler(tiddler); story.closeTiddler(title);


	// render tiddler
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again"; // use alternate "search again" label
        story.displayTiddler(null,title,1); // force refresh
	config.macros.search.label=oldprompt;	// restore standard search label
}

//}}}

/*
config.macros.lastSearchText = "";
config.lastSearchText = "";
*/
<<formTiddler NewPluginTemplate>><data>{"author":"Potto","link":"http://www.potto.client.jp/htmlslidymaker/index.html","format":"Plugin","twversion":"--","category":"Menus and sliders","description":"A slider."}</data>
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.2.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|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2008.09.19 [2.2.0] in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 2, revision: 0, date: new Date(2008,9,19)};

// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		if (!this.lookaheadRegExp)  // fixup for TW2.0.x
			this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var html=lookaheadMatch[1];
			// if <hide linebreaks> is present, suppress wiki-style literal handling of newlines
			if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\n/g,' ');
			// remove all \r's added by IE textarea and mask newlines and macro brackets
			html=html.replace(/\r/g,'').replace(/\n/g,'\\n').replace(/<</g,'%%(').replace(/>>/g,')%%');
			// create span, let browser parse HTML
			var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;
			// re-render text nodes as wiki-formatted content
			wikifyTextNodes(e);
			// continue parsing
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
}

// wikify text nodes remaining after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode)
{
	function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
	switch (theNode.nodeName.toLowerCase()) {
		case 'style': case 'option': case 'select':
			theNode.innerHTML=unmask(theNode.innerHTML);
			break;
		case 'textarea':
			theNode.value=unmask(theNode.value);
			break;
		case '#text':
			var txt=unmask(theNode.nodeValue);
			var newNode=createTiddlyElement(null,"span");
			theNode.parentNode.replaceChild(newNode,theNode);
			wikify(txt,newNode);
			break;
		default:
			for (var i=0;i<theNode.childNodes.length;i++)
				wikifyTextNodes(theNode.childNodes.item(i)); // recursion
			break;
	}
}
//}}}
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Version|2.1.4|
|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|Use wiki syntax formatting inside of HTML content|

The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.

When HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML.  However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain.  This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
!!!!!Usage
<<<
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.

When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags.  This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content.  Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.
<<<
!!!!!Line breaks
<part Linebreaks hidden>
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.

Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.

If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead.  Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.

Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.
<<<
</part>
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block.  Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.  Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html.  It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.

However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.

Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward.  Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(

As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).

After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements.  The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node.  At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for HTMLFormatting handling^^
<<<
!!!!!Revision History
<<<
''2006.09.10 [2.1.4]'' update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children.  (thanks to "ayj" for bug report)
''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content.  This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
''2005.11.06 [2.0.1]'' code cleanup
''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler
''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers
''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 4, date: new Date(2006,9,10)};

// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		if (!this.lookaheadRegExp)  // fixup for TW2.0.x
			this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var html=lookaheadMatch[1];
			// optionally suppress wiki-style literal handling of newlines
			// strip any carriage returns added by Internet Explorer's textarea edit field
			// encode newlines as \n so Internet Explorer's HTML parser won't eat them
			// encode macro brackets (<< and >>) so HTML parser won't eat them
			if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(regexpNewLine,' ');
			html=html.replace(regexpCarriageReturn,'');
			html=html.replace(regexpNewLine,'\\n');
			html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');
			// create span to hold HTML
			// parse HTML and normalize the results
			// walk node tree and call wikify() on each text node
			var e = createTiddlyElement(w.output,"span");
			e.innerHTML=html;
			e.normalize(); 
			wikifyTextNodes(e);
			// advance to next parse position
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
}

// wikify text nodes remaining after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode)
{
	// textarea node doesn't get wikified, just decoded... 
	if (theNode.nodeName.toLowerCase()=='textarea')
		theNode.value=theNode.value.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(regexpBackSlashEn,'\n');
	else for (var i=0;i<theNode.childNodes.length;i++) {
		var theChild=theNode.childNodes.item(i);
		if (theChild.nodeName.toLowerCase()=='option') continue;
		if (theChild.nodeName.toLowerCase()=='select') continue;
		wikifyTextNodes(theChild);
		if (theChild.nodeName=='#text') {
			var txt=theChild.nodeValue;
			// decode macro brackets and newlines
			txt=txt.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(regexpBackSlashEn,'\n');
			// replace text node with wikified() span
			var newNode=createTiddlyElement(null,"span");
			theNode.replaceChild(newNode,theChild);
			wikify(txt,newNode);
		}
	}
}
//}}}
<<formTiddler NewPluginTemplate>><data>{"category":"Aids for website visitors","description":"The HaloscanMacro enables readers to post comments and trackbacks to your TiddlyWiki entries. It works by using the Haloscan service, which is currently free (for a basic account). Currently, you must have a Haloscan account to use this macro, but it should be easy to adapt to other systems.","author":"Speth","link":"http://end.com/~speth/HaloscanMacro.html","format":"Macro","twversion":"2.x"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"It's a Hello World TiddlyWiki macro. [Dave: Whatever that means!]","category":"Formatting and viewing text","twversion":"--","format":"Macro","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins"}</data>
----
{{systemcontents{
<<tabs " " [[Help ]] "" [[HelpIntro]]  [[Add plugin]] "Add plugin to Database" [[Instructions]]  [[Install in sidebar]] "Put plugin vault into sidebar" [[HowTo]] >>
}}}
!!Help
----
!!!!!&nbsp;Tips  @@color:#C06;''&raquo; &raquo;'' @@
|>|bgcolor:#509;color:#fff;''The Menu'' |
|bgcolor:#fcb;''« Load'' |@@color:#c06;loads this page into FF sidebar@@|
|bgcolor:#fcb;''~NoTabs'' |@@color:#c06;toggles the tabs to hidden@@|
|bgcolor:#fcb;''Edit'' |@@color:#c06;toggles the toolbars to visible@@|
|bgcolor:#fcb;''View'' |@@color:#c06;all tabs by category@@|
|bgcolor:#fcb;''Tools''|@@color:#c06; for saving-admin-@@|
|bgcolor:#fcb;''Options'' |@@color:#c06; Search titles text tags@@|
|bgcolor:#fcb;''Font Size''|@@color:#c06; (''+ = –'') changes size +/– times 8@@|

 @@color:#C06;''&raquo; &raquo;'' @@ Both toggles ''Edit'' and ''~NoTabs''can be set to default to either ''show'' or ''hide'' upon startup; in the SlantedMenu.  Tabs can be put into edit mode by double-clicking on them and can be saved by clicking on the exclamation-mark (!) in the tab itself. See more on editing below.

 @@color:#C06;''&raquo; &raquo;'' @@ When first clicking on a toggle it usually takes a second click to get it into synch. after that one click should suffice per session.

 @@color:#C06;''&raquo; &raquo;'' @@ ''An important note about tabs!'' TiddlersBarPlugin has a default option in it that closes all other tabs if you click on the already 'selected tab'  i.e. (the tab showing the brightest color).If you find this happening and don't want to accidentally close all your open tabs then got to TiddlersBarPlugin and where it says "close all" type in "jump".

 @@color:#C06;''&raquo; &raquo;'' @@ The ideal ''minimum'' width of the sidebar is to narrow it with the tabs showing until the Menu just starts to wrap then relax it back a fraction. The tabs will continue to wrap before the menu does. The ideal ''maximum'' is what makes you happy regardless of how the sidebar feels about how it looks. 

 @@color:#C06;''&raquo; &raquo;'' @@ You can specify what size font you want when you load into the sidebar. Go to the bookmark, right click on it, and in the properties of the bookmark at the end of the URL add ''/#font:size'' with size being anything from 40 to 200. http://sidebarnotes.tiddlyspot.com/#font:40 is the smallest font.

----
''Copying between main wIndow and sidebar''
{{c06{
~Control-C to copy
~Control-V to paste
}}}
''Copy from main window to sidebar''
{{c06{
Highlight in main window: Right-click and copy
Paste in sidebar: ~Control-V
}}}
''Copying from sidebar to main window''
{{c06{
~Control-C to copy
~Control-V to paste Or Right-click and paste
}}}
''Editing''
When editing Sidebar Plugin Vault :

Tabs can be put into edit mode by double-clicking on them and can be saved by clicking on the exclamation-mark (!) in the tab itself. See below.

For space and appearence reasons the normal toolbar( jump close close others edit permalink references) and the editing toolbar (done cancel delete) are hidden from view by default.  They can be toggled on and off with the ''Edit'' button on the menu.  When in editing mode the button changes to ''Editing''. (''Note:'' Certain conditions while editing Opening and closing other tabs can cause the toolbar to toggle back off, simply click the button again to restore it.')To change the default to normally ''on''edit the SlantedMenu.  The code {{{<<toggleToolyBars "" "" hide>>}}} should be changed from ''hide'' to ''show''

 @@color:#C06;''&raquo; &raquo;'' @@ Saving changes via the ''backstage toolbar'' by passes the alert box warning of tiddlers opened for editing. Saving through ''<save changes>'' is preferred.

 @@color:#C06;''&raquo; &raquo;'' @@ If you get an Alert when clicking on a link in the sidebar it is probably trying to load into the main Main Window. In any case it is safest to click cancel and check for unsaved ~TiddlyWikis.  

 @@color:#C06;''&raquo; &raquo;'' @@ You should be consistent where you edit Sidebar Plugin Vault .  Whether in the sidebar or main window always save and refresh immediately thereafter.  If you edit in the sidebar and even if you save and refresh probably the next action you perform , say clicking on another page will result in an alert box saying there are unsaved changes. clicking cancel will only result delaying the inevitable.  What it's trying to do is reload in the main window, click OK and let it.

!!!!!&nbsp;On Comments

The TiddlerNotesPlugin allows you to add notes/comments to tiddlers, without needing to edit the original tiddler. This means that your original content will remain unaltered, and if you update it in the future, you won’t lose your notes. Notes are stored in separate tiddlers, but can be viewed and edited from within the original tiddler.

For a tiddler titled "~MySlide", the notes are by default saved in a tiddler titled "~MySlide-Notes" and is given a tag of "Notes". The suffix and tags of the notes tiddlers are customizable. You can have one or multiple notes per tiddlers. So it is possible to have for example, teacher's notes and student's notes in the same file.

Notes can be configured to start off blank, or pre-filled with the contents of the original tiddler. See more details in TiddlerNotesPlugin. 

!!!!!&nbsp;About  hosting Sidebar Plugin Vault on ~TiddlySpot

''If you wish to have your Sidebar Plugin Vault hosted on Tiddlyspot ''
----
# Goto http://tiddlyspot.com and obtain a new ~TiddlyWiki
# Download it and save it in a convenient place
# If you don't already have a copy of Sidebar Plugin Vault get a new one by clicking here or here http://sidebarnotes.tiddlyspot.com and then click the download button under Tools 
# Open backstage in the copy of Sidebar Plugin Vault that you have downloaded to your hard disk.
# Import the TspotSetupPlugin ''From:'' your New ~TiddlyWiki ''To:''  Sidebar Plugin Vault when asked to overwrite it say yes.
# Save and reload

!!End
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Other style changes","description":"Hide a tiddler's background and border (if any)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Hide a tiddler's subtitle (dates/created by) display.","category":"Tiddler manipulation","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Tiddler manipulation","description":"Hide a tiddler's tagged/tagging display elements.","twversion":"-","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Tiddler manipulation","description":"Hide a tiddler's title display elements (name, dates, and author)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Tiddler manipulation","description":"Hide a tiddler's toolbar display."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"--","category":"Tiddler manipulation","description":"Allows conditional inclusion/exclusion in templates. In other words, you can hide or reveal certain content of your tiddler under certain conditions. For example, when the tiddler is tagged Bart Simpson, it will show an image of Bart Simpson. Or in edit mode only it will show an address form with fields. Or if tagged task, will show a task toolbar, etc."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Riccardo Gherardi","link":"http://rgplugins.tiddlyspot.com/#%5B%5BhideIfshowIf%20plugin%5D%5D","format":"Plugin","twversion":"--","description":"Allows conditional inclusion/exclusion. Portions from:\tHideWhenPlugin (Simon Baird), Silently macro (Gimcrack'd) and WebView (AlanHecht).","category":"Tiddler manipulation"}</data>
@@padding-left:0.7em;@@<html><input class="btn" type="button" value="Display most recent entries now" onClick="location.reload()" onmouseover="this.className='btn btnhov'" onmouseout="this.className='btn'"/></html>
{{systemcontents{
<<tabs "" [[UpdatesTimeline]] "Chronological listing of plugin entries by creation date" [[UpdateHistory]] [[SideBarTabs]] "Chronological listing of  ALL tiddlers by modified date" [[SideBarTabs]] [[Find ]] "Find a tiddler " [[Find]]>>
}}}
<html><a href="javascript:;" onclick="story.closeAllTiddlers();restart();">home</a></html>
<<formTiddler NewPluginTemplate>><data>{"description":"Creates a hovering menu that scrolls with the page and is always accessible.","category":"Toggling page elements","twversion":"2.x","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
!!HowTo Install in sidebar
''Here is how to get Sidebar Plugin Vault into your Firefox sidebar.''
#The easy way is by clicking @@''«Load''@@ on the top menu. (This may not work in Firefox 3 yet)
#''Or'' bookmark it then go to the bookmark, right click on it, and in the properties of the bookmark tick "Load this bookmark in the sidebar" Then click on the bookmark.
# ''Or'' the fastest loading (and you can customise it). Save it to your hard disk by going to ''Tools'' and click ''download''
##''Then'' open with Firefox and bookmark where you saved it.
##''Then'' go to the bookmark, right click on it, and in the properties of the bookmark tick "Load this bookmark in the sidebar" Then click on the bookmark.
Hint: @@color:#C06;''&raquo; &raquo;'' @@  You can specify what size font you want when you load into the sidebar.
<<<
Go to the bookmark, right click on it, and in the properties of the bookmark at the end of the URL add "/#font:size" with size being anything from 40 to 200. It can be resized manually but always defaults to what is appended to the link whenever you load it; unless you remove it. You can get the smallest font by clicking here too.
http://sidebarnotes.tiddlyspot.com/#font:40
<<<

''Note:''
 @@color:#C06;''&raquo; &raquo;'' @@ The toolbar and the titles for tiddlers are hidden for space reasons and can be toggled with ''Edit'' on the top menu (It can be set to either show or be hidden on startup)

 @@color:#C06;''&raquo; &raquo;'' @@ If you get lost ''Home'' or ''View''.
 
 @@color:#C06;''&raquo; &raquo;'' @@ If you want your Sidebar Plugin Vault hosted on Tiddlyspot see [[Help]]


|bgcolor:#fcf;~~Sidebar Plugin Vault was designed and built by Morris Gray the designer of [[TW Help|http://twhelp.tiddlyspot.com]] Please send inquiries here<<tiddler [[Email]]>>~~|


<<formTiddler NewPluginTemplate>><data>{"author":"Dawn Ahukanna","link":"http://dahukanna.net/wiki/tiddlywiki.htm","format":"Plugin","twversion":"2.1.3","category":"Searching and indexing tiddlers","description":"Use it to navigate the document and open tiddlers based on selecting graph nodes. See example [[here|http://project.dahukanna.net/tiddlywiki/twextensions-206.htm]]."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Macro","category":"Icons","description":"Replace macro buttons with icons.","twversion":"--"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Icons"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","twversion":"2.0 compliant","category":"Images and presentations","description":"Inserts an external image file as a hyperlink to a URL, a tiddler, or a javascript function."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Images and presentations","description":"Tell TiddlyWiki where to look for image files. Permits multiple 'fallback' locations."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Images and presentations"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"category":"Working with websites, incl IFrames","description":"Import pages from your Moodle NWiki to TiddlyWiki Tiddlers.","twversion":"2.1.2","author":"Oriol Nieto , Alejandro Moreno, Dídac Calventus & Ludo (Marc Alier)","link":"http://moodle.tiddlyspot.com/","format":"Plugin"}</data>
/***

This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents.  An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles.  Automatically add tags to imported tiddlers so they are easy to find later on.  Generates a detailed report of import 'history' in ImportedTiddlers.
!!!!!Usage
<<<

Press ''[browse]'' to select a TiddlyWiki document file to import, and then press ''[open]''.  Alternatively, you can type in the path/filename or a remote document URL (starting with http://).  When you have entered the desired source location, press ''[load]'' to retrieve the tiddlers from the remote source.  //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//

Select one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items).  You can press ''[select all]'' to quickly highlight all tiddler titles in the list.  Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time.  When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.

''select: all, new, changes, or differences''

You can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:
>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.
>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document
>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document
>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)

''Import Tagging:''

Tiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document.  New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.

''Skip, Rename, Merge, or Replace:''

When importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.

To bypass importing this tiddler, press ''[skip]''.  To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''.   Press ''[merge]'' to combine the content from both tiddlers into a single tiddler.  Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.

//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//

''Import Report History''

When tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.

When the import process is completed, the ImportedTiddlers report is automatically displayed for your review.  If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.

If a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.

Note: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.
<<<
!!!!!Revisions
<<<
2008.04.13 [3.9.0] added 'apply to all' checkbox for collision processing
2008.03.26 [3.8.0] added support for selecting pre-defined systemServer URLs
!!!&nbsp;ImportTiddlers
Update your ~SidebarPluginVault by using this import facility 
''See instructions below.'' ''See last import [[here.|ImportedTiddlers]]''

<<importTiddlers inline>>
<<tiddler ImportInfo>>

<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Working with multiple TiddlyWikis","description":"This plugin lets you selectively combine tiddlers from any two ~TiddlyWiki documents. An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Automatically add tags to imported tiddlers so they are easy to find later on. Generates a detailed report of import 'history' in ~ImportedTiddlers."}</data>
/***
|Name|ImportTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ImportTiddlersPluginInfo|
|Version|3.8.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|config.macros.importTiddlers.handler|
|Options|##Configuration|
|Description|interactive controls for import/export with filtering.|

This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents.  An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles.  Automatically add tags to imported tiddlers so they are easy to find later on.  Generates a detailed report of import 'history' in ImportedTiddlers.

{{headline{
This plugin is not installed.
}}}

You may install it yourself if you are not using Opera 9.5
On Monday, 14 April, 2008 04:53:32, YourName imported 2 tiddlers from
[[F:\TiddlyWiki2.3\SideBarProjects\MySidebarProjects\sidebarprojects.html|F:\TiddlyWiki2.3\SideBarProjects\MySidebarProjects\sidebarprojects.html]]:
<<<
#[[TiddlerNotesPlugin]] - skipped after asking
#[[ViewTemplate]] - replaces ViewTemplate - 4/12/2008 04:10:00 by YourName
#[[nonotesViewTemplate]] - replaces nonotesViewTemplate - 4/11/2008 11:19:00 by YourName
<<<

----
On Monday, 14 April, 2008 04:52:40, YourName imported 1 tiddler from
[[F:\TiddlyWiki2.3\SideBarProjects\MySidebarProjects\sidebarprojects.html|F:\TiddlyWiki2.3\SideBarProjects\MySidebarProjects\sidebarprojects.html]]:
<<<
#[[TiddlerNotesPlugin]] - skipped after asking
#[[ViewTemplate]] - skipped after asking
#[[nonotesViewTemplate]] - added
<<<

----
On Monday, 14 April, 2008 03:37:16, YourName imported 9 tiddlers from
[[F:\TiddlyWiki2.3\sidebarpluginvault\Workingsidebarpluginvault\tiddlyvault.html|F:\TiddlyWiki2.3\sidebarpluginvault\Workingsidebarpluginvault\tiddlyvault.html]]:
<<<
#[[Twab]] - replaces Twab - 2/26/2008 10:42:00 by tiddlyvault
#[[UploadLog]] - skipped after asking
#[[Forms and databases]] - replaces Forms and databases - 9/1/2007 23:14:00 by giffmex
#[[TiddlerEncryptionPlugin]] - added
#[[Security]] - replaces Security - 8/31/2007 08:30:00 by giffmex
#[[Searching and indexing tiddlers]] - replaces Searching and indexing tiddlers - 4/12/2008 07:47:00 by YourName
#[[ImprovedSlicesPlugin]] - added
#[[NewPluginTemplate]] - replaces NewPluginTemplate - 12/6/2007 00:57:00 by tiddlyvault
#[[Aids for website visitors]] - replaces Aids for website visitors - 4/12/2008 07:49:00 by YourName
#[[TWHelp-SearchResults]] - replaces TWHelp-SearchResults - 4/13/2008 08:25:00 by YourName
<<<
<<formTiddler NewPluginTemplate>><data>{"author":"Lyall Pearce","link":"http://remotely-helpful.com/TiddlyWiki/ImprovedSlicesPlugin.html#ImprovedSlicesPlugin","twversion":"2.2","category":"Searching and indexing tiddlers","description":"Corrects defects in the searching of Slices. Additionally, adds the capability to return a selected range of cells from a slice contained within a Table.<br><br>If you don't use Slices, you probably do not need this Plugin. If you do, I think you will find this plugin well worth the effort to install."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Working with multiple TiddlyWikis","description":"„Include“ other TiddlyWikis in your „main“ TiddlyWiki, link to included tiddlers, view them in your „main“ TiddlyWiki (without opening another TiddlyWiki). Even „search“ looks for included tiddlers. A great way to share tiddlers, to speed up \"save changes\" and to keep your TiddlyWikis small.","twversion":"2.1.3"}</data>
@@color:#509;font-size:8pt;line-height:.5em;The world's largest squeezable collection of ~TiddlyWiki addons, plugins, macros, and themes listed by function.@@
{{tuduSlider{<<slider chkAppearance Appearance 'Appearance »'>>}}}{{tuduSlider{<<slider chkNavigation Navigation 'Navigation »'>>}}}{{tuduSlider{<<slider chkTools Tools 'Tools »'>>}}}{{tuduSlider{<<slider chkWorkingWith WorkingWith 'Working with... »'>>}}}
<html><hide linebreaks><div style="font-size:8pt;padding-left:3px;"><A HREF="http://www.symbex.net.au/Wiki/SidebarPluginVaultLastUpdate.htm" target="ifsample1" title="Last Update">~LastUpdate</A>&nbsp;|&nbsp;<A HREF="http://www.whatismyip.com/automation/n09230945.asp" target="ifsample1" title="Your IP Address">Your IP Address</A><td></div><div style="padding:0px;"><iframe id="ifsample1" name="ifsample1" src="http://www.symbex.net.au/Wiki/SidebarPluginVaultLastUpdate.htm" frameborder="0" width="230" height="60" marginheight="2px" marginwidth="2px"></iframe></div></td></html>
<html><a href="http://tiddlyspot.com/?action=download&site=sidebarpluginvault" target="_blank">^^Save it to your ^^[img[http://img356.imageshack.us/img356/3598/disksmmwm0.gif]]^^ local disk here ^^</a></html>
----
*@@color:#C06;''NEW!''@@[[TiddlyWiki Version Archives Here|http://www.tiddlywiki.com/archive/]]
*__Direct Links__ to ''~TiddlyTools plugins''  along with descriptions[[here|TiddlyToolsPlugins]]
*New (beta) plugin directory [[TiddlyHub|http://dev.squize.org/plugins/ ]]
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Working with other codes and formats","description":"Insert Javascript executable code directly into your tiddler content. Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output into tiddler content, or perform any other programmatic actions each time the tiddler is rendered."}</data>
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Version|1.6.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|Insert Javascript executable code directly into your tiddler content.|

''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.

''Deferred execution from an 'onClick' link''
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text

''External script source files:''
You can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}).  This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins.  The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.

''Display script source in tiddler output''
By including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.

''Defining javascript functions and libraries:''
Although the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed.  Thus, you cannot load a library and //immediately// use it's functions within the same tiddler.  However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).

To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened.  For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.

Since the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines.  Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.

''Creating dynamic tiddler content''
An important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:
* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.
* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.
* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.

If your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display.  For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.

//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//

''Accessing the ~TiddlyWiki DOM''
The plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.

Access to this DOM element allows you to create scripts that can:
* vary their actions based upon the specific location in which they are embedded
* access 'tiddler-relative' information (use findContainingTiddler(place))
* perform direct DOM manipulations (when returning wikified text is not enough)
<<<
!!!!!Examples
<<<
an "alert" message box:
><script show>
	alert('InlineJavascriptPlugin: this is a demonstration message');
</script>
dynamic output:
><script show>
	return (new Date()).toString();
</script>
wikified dynamic output:
><script show>
	return "link to current user: [["+config.options.txtUserName+"]]";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
   if (!window.story) window.story=window;
   var title=story.findContainingTiddler(place).id.substr(7);
   return title+" is using "+store.getTiddlerText(title).length+" bytes";
</script>
creating an 'onclick' button/link that runs a script:
><script label="click here" title="clicking this link will show an 'alert' box" show>
   if (!window.story) window.story=window;
   alert("Hello World!\nlinktext='"+place.firstChild.data+"'\ntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");
</script>
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}
>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}
><script src="demo.js" show>
	return "loading demo.js..."
</script>
><script label="click to execute demo() function" show>
	demo()
</script>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output
''2006.01.05 [1.4.0]'' added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax
''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access 
''2005.11.08 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 6, revision: 0, date: new Date(2007,2,19)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			if (lookaheadMatch[1]) { // load a script library
				// make script tag, set src, add to body to execute, then remove for cleanup
				var script = document.createElement("script"); script.src = lookaheadMatch[1];
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (lookaheadMatch[5]) { // there is script code
				if (lookaheadMatch[4]) // show inline script code in tiddler output
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (lookaheadMatch[2]) { // create a link to an 'onclick' script
					// add a link, define click handler, save code in link (pass 'place'), set link attributes
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);
					link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}
					link.code="function _out(place){"+lookaheadMatch[5]+"\n};_out(this);"
					link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");
					link.setAttribute("href","javascript:;");
					link.style.cursor="pointer";
				}
				else { // run inline script code
					var code="function _out(place){"+lookaheadMatch[5]+"\n};_out(w.output);"
					code=code.replace(/document.write\(/gi,'place.innerHTML+=(');
					try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","twversion":"2.0 compatible","category":"Icons","author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","description":"Inserts a small smiley graphic at the location of the macro and does not require any external graphics. The method used should work on most current browser platforms."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.2","category":"Themes","description":"Automatically install specified theme pack and backup the old."}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.x","category":"Time and calendars","description":"If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler.","format":"Plugin","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins"}</data>
!!!Instructions for adding to the template
To add a new author, link, format or category to the master input template; edit NewPluginTemplateInput keeping things in alphabet order<<slider "addOption" "AddToTemplate" "like this" "tooltip" >> then save.

!!!Instructions for adding to the database
''__NOTE: Do not put linebreaks in Description!__'' (it breaks tables)

1: To add a new plugin to the database click 'new plugin' in top menu.  
2: While still in edit mode change the tiddler title to plugin name and 'close'.  
3: Now fill in the form fields with the drop-downs as required and ''save''.
4: Now go back into edit mode and change NewPluginTemplateInput to NewPluginTemplate
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Tagging","description":"Speed up tagging tiddlers using tag autocompletion and correction, tag suggestions and context sensitive tag guessing, \"Edit Tags only\" mode and many more. Especially when you are working with a lot of tags this is the plugin you are looking for.","twversion":"2.0.8"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"When the TiddlyWiki needs to be saved the tiddler named IsDirty contains {{{' * '}}} else it is empty. IsDirty tiddler is also appended in front of the browser page title. Hint: Put it in front of your SiteTitle in your PageTemplate or in your MainMenu as an indicator.","category":"Saving and reviewing changes","author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","format":"Plugin","twversion":"2.2.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adaptor for moving and converting data to and from JSP Wikis.","author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.2","category":"Working with other codes and formats"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Allows Tiddlers to use JSPWiki text formatting.","category":"Working with other codes and formats","twversion":"2.1.0","format":"Plugin","link":"http://www.martinswiki.com","author":"Martin Budden"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","description":"TidIDE: enter and invoke javascript in a command line.","category":"Working with other codes and formats"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)","twversion":"2.x","category":"Searching and indexing tiddlers","description":"Macro version of the core jump command, that also provides an optional 'jump to top' button."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A macro and a command for jumping to the top of the screen.","category":"Searching and indexing tiddlers","twversion":"2.x","author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Macro"}</data>
config.options.chkAnimate=false;

<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Language tools"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]]<br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com/#LaunchApplicationPlugin","format":"Plugin","twversion":"--","category":"Working with files and programs","description":"Authors: Lyall Pearce, modified by Bradley Meck. Launch an application from within TiddlyWiki using a button. <br><br>[Please note the authors' warning about security]."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Lyall Pearce","link":"http://remotely-helpful.com/TiddlyWiki/LaunchApplication.html#LaunchApplicationPlugin","format":"Plugin","twversion":"2.2.4","category":"Working with files and programs","description":"Launch an application from within ~TiddlyWiki using a button."}</data>
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

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

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.tiddlywiki.com/coreplugins.html","format":"Plugin","description":"Provides support for legacy (pre-v2.1) strikethrough formatting.","twversion":"2.1.0","category":"Behind the scenes"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","description":"Intelligently limit the number of backup files you create. You end up with just backup one per year, per month, per weekday, per hour, minute, and second. So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array.<br>Coauthors Daniel Baird and Saq Imtiaz.","twversion":"--","category":"Saving and reviewing changes"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Alternative stylesheet theme: dark blue fishtank photo background.","twversion":"2.1","category":"Themes","format":"Theme","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Macro","twversion":"--","description":"A one-liner that automatically makes a link to the current TiddlyWiki file. Helps visitors know they need to right-click to save.","category":"Aids for website visitors"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Links"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","twversion":"--","description":"It's a macro for listing by creator or modifier.","category":"Searching and indexing tiddlers","author":"Greg Walker","link":"http://gwsyzygy.googlepages.com/creator.html"}</data>
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></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'></span></div>
<!--}}}-->
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Forms and databases","description":"Set tiddler fields by selecting enumerated values from a listbox or droplist."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"LoadExtPlugin allows you to load external extensions from the file lists (named .js) within those tiddlers taged with \"ExtList\".","twversion":"2.1.0","category":"Working with files and programs","author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Macro for automated updates or one-click installations of tiddlers from remote sources.","format":"Plugin","twversion":"2.1","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
Get the plugin here:
http://firefoxprivileges.tiddlyspot.com/

Get bookmarklet here:
Go to http://icanhaz.com/firefoxprivileges to grab it

The code for making a link to the bookmarklet:
{{{
 <html><a href='javascript:void(eval(decodeURIComponent("(function()%250A%257B%250Avar%2520script%253Ddocument.createElement(%2522script%2522)%253B%250Ascript.src%253D%2522http%253A%252F%252Ftrac.tiddlywiki.org%252Fbrowser%252FTrunk%252Fcontributors%252FXavierVerges%252Fplugins%252FFirefoxPrivilegesPlugin.js%253Fformat%253Draw%2522%253B%250Ascript.onload%253Dfunction()%257Bvar%2520b%253Dbackstage%253B%2520var%2520fp%253D%2522firefoxPrivileges%2522%253B%250Avar%2520bt%253DcreateTiddlyButton(b.toolbar%252C%2522security%2522%252Bglyph(%2522downTriangle%2522)%252C%2522%2522%252Cb.onClickTab%252C%2522backstageTab%2522)%253B%250Abt.setAttribute(%2522task%2522%252Cfp)%253Bb.switchTab(fp)%253B%257D%253B%250Adocument.getElementsByTagName(%2522head%2522)%255B0%255D.appendChild(script)%253B%250A%257D)()")))'>FirefoxPrivileges</a> </html>
}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Searching and indexing tiddlers","description":"List tiddlers with specific tag and let you manage the multiple selected tiddlers."}</data>
<!-- Start of StatCounter Code -->
<script type="text/javascript">
sc_project=3608827; 
sc_invisible=1; 
sc_partition=41; 
sc_security="49e401e8"; 
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script><noscript></noscript>
<!-- End of StatCounter Code -->
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>
<link rel="shortcut icon" href="http://img99.imageshack.us/img99/1614/kittyiconrc9.jpg">
<!--}}}-->
<<formTiddler NewPluginTemplate>><data>{"description":"MathCell is a TW plugin to allow for excel like spreadsheet capabilities inside of TW.","category":"Tables","twversion":"--","format":"Plugin","author":"Bradley Meck (~PeachTW)","link":"http://genisis329.googlepages.com/TWMath.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Morris Gray","link":"http://twmath.tiddlyspot.com/","format":"Plugin","twversion":"2.4","category":"Scientific and mathematical notation","description":"Allows you to use the CodeCogs Equation Editor to insert equations directly into a tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Embedded multi-type player for winmedia, real, quicktime, flash, and JPG/GIF images.","category":"Images and presentations","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adaptor for moving and converting data from MediaWikis.","category":"Working with other codes and formats","twversion":"2.2","format":"Plugin","link":"http://www.martinswiki.com","author":"Martin Budden"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0","category":"Working with other codes and formats","description":"Allows you to insert MediaWiki formated text into a TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adds 'doubleclick to edit source' to the MainMenu, SideBarOptions, and SideBarTabs.","category":"Menus and sliders","twversion":"2.x","author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Ocat","link":"http://oldcat.googlegroups.com/web/MenuMoreEn.html","format":"Theme","category":"Menus and sliders","twversion":"--","description":"A TiddlyWiki theme plus a highly flexible multi-switch menu system. "}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Menus and sliders"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Use an 'inline frame' to display another site inside a tiddler with navigation buttons and a dropdown list of favorite URLs.","category":"Working with websites, incl IFrames","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Uploading TiddlyWikis to a server","twversion":"--","format":"Other","author":"Unknown","link":"http://www.minitiddlyserver.com/","description":"MTS is a versatile serverside environment for TiddlyWiki, unique in that it requires no plugins or hacks to your tiddlywiki at all. It uses (and requires) a php server, but doesn't need any database or fancy configuration. All it needs is to be uploaded to a folder on your server and run through a web browser. It is like a \"Docking Station\" for your TiddlyWiki. It doesn't change your TiddlyWiki at all, but just gives it more functionality, and allows it to plug in to the internet."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Daniel Baird","link":"http://danielbaird.com/tiddlywinks/","format":"Other","twversion":"--","category":"Games","description":"As if we really needed this for ~TiddlyWiki... :-)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","description":"Drop down list that toggles tags tagged by given tag, see demo for better understanding. (aimed at task management).","twversion":"2.07","category":"Tagging"}</data>
<<tabs " " [[Save/Options ]] "" [[ToolTabsIntro]] [[Options ]] "" [[OptionsPanel]]  [[AdvancedOptions ]] "" [[AdvancedOptions]]  [[TspotControls ]] "" [[TspotControls]]  [[SideBarTabs ]] "" [[SideBarTabs]] >>
+++[MoreTools]
<<tiddler MoreTools>>
===
<<formTiddler NewPluginTemplate>><data>{"category":"Toggling page elements","description":"Add move, size, max/restore mouse event handling and fold/unfold, hover/scroll, and close/dock toolbar command items to any floating slider panel or tiddler.","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A package containing templates and css for the MonkeyPirate TiddlyWiki layout.","category":"Themes","format":"Plugin","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin enables the addition and deletion of tags from sets of tiddlers.","category":"Tagging","author":"Ido Magal","link":"http://ido-xp.tiddlyspot.com/","format":"Plugin","twversion":"2.1.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Allows you to define named shortcuts to your own macros with parameters and simplifies calling them. The {{{<<defineMyMacro>> }}}statements should go in your MainMenu or some other tiddler which displayed at startup.","category":"Uncategorized tools","twversion":"--","format":"Macro","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Yann Perrin","link":"http://yann.perrin.googlepages.com/twkd.html","format":"Plugin","twversion":"2.x","category":"Aids for website visitors","description":"This plugin ensure that tiddlers with the chosen tag that were modified since your last visit are displayed. It also lists the tiddlers it manages as new or archived in a new ~shadowTiddler called ~NewsManager."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin ensures that tiddlers with the chosen tag that were modified since your last visit are displayed. It also lists the tiddlers it manages as new or archived in a new shadowTiddler called NewsManager.","category":"Aids for website visitors","twversion":"2.x","format":"Plugin","link":"http://yann.perrin.googlepages.com/twkd.html","author":"Yann Perrin"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Navigating within a tiddler"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
*[[Navigating within a tiddler]]
*[[Searching and indexing tiddlers]]
*[[Tagging]]
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Macro","twversion":"2.08","category":"Searching and indexing tiddlers","description":"Creates Next and Previous buttons to allow navigating through tiddlers in order."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Macro","twversion":"2.08","category":"Tiddler manipulation","description":"Creates Next and Previous buttons to allow navigating through tiddlers in order."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"RodneyGomes","link":"http://devpad.tiddlyspot.com","description":"Creates a browser pane inside a tiddler for viewing external pages.","category":"Uncategorized tools"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","category":"Formatting and viewing text","description":"This plugin's purpose is to produce a formatter that will allow for it to have nested structures. Included in this macro is an example at the bottom using parenthesis to give a font size increasing effect.","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel.","category":"Menus and sliders","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","description":"Code originally by ArphenLin. Small tweak by SimonBaird. Creates a new tiddler or journal 'here' - that is, at this point in a hierarchy of tags.","category":"Tiddler manipulation","twversion":"2.x","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"--","category":"Tiddler manipulation","description":"Creates the 'new here' and 'new journal' macros in a tiddler. These macros create tiddlers and journals that reference the parent tiddler in various ways."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"--","category":"Tiddler manipulation","description":"If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on."}</data>
<html><hide linebreaks>
<style> .rolodex table {border: 0px solid; background-color:#eeeff;}
.rolodex tr, .rolodex td {border: 0px solid;}
</style><span class="rolodex">
<table><tr><td align="right"><b>Author:</b></td><td colspan="3"><input name=author style="width:100%" /></td></tr><tr><td align="right"><b>Link:</b></td><td colspan="3"><input name=link style="width:100%" /></td></tr><tr><td align="right"><b>Format:</b></td><td colspan="3"><input name=format style="width:100%" /></td></tr><tr><td align="right"><b>For TW version:</b></td><td colspan="3"><input name=twversion type=text  width:100%;" /></td></tr><tr><td align="right"><b>Category:</b></td><td colspan="3"><input name=category style="width:100%" /></td></tr><tr><td align="right" valign="top"><b>Description:</b></td><td colspan="3"><textarea name=description rows="7" cols="40" style="width:100%" ></textarea></td></tr></table></span></html>
<html><hide linebreaks>
<style> .rolodex table {border: 0px solid; background-color:#eeeff;}
.rolodex tr, .rolodex td {border: 0px solid;}
</style><span class="rolodex">
 <table>
<tr>
<td align="right"><b>Author:</b></td>
 <td colspan="3"><select name=author style="width:100%" />
<option>Alan Hecht
<option>Arphen Lin
<option>Anshul Nigham
<option>BidiX
<option>Bob Denny (Red Mt. Vista)
<option>Bob McElrath (Bob's)
<option>Bradley Meck (~PeachTW)
<option>Bram Chen (~PrinceTW)
<option>Bram Chen 
<option>ccTiddly
<option>"Chris" (Gimcrack'd)
<option>Clint Checketts
<option>Conal Elliott
<option>Daniel Baird
<option>Dawn Ahukanna
<option>Doug Compton
<option>Eric Shulman (~TiddlyTools)
<option>Fabrice
<option>Frank Dellaert
<option>FND
<option>George Brackett
<option>Greg Walker
<option>Ido Magal
<option>Jack Parke (Jack's)
<option>Jonathan Lister (jayfresh)
<option>Jeremy Harper
<option>Jeremy Ruston
<option>Jeremy Sheeley
<option>Joeraii
<option>Jon Scully
<option>Julian Knight
<option>Laurence Man
<option>Luke Blanshard
<option>Lyall Pearce
<option>Marc Castejon
<option>Martin Budden
<option>Mike Miller
<option>Morris Gray
<option>Ocat
<option>Pascal
<option>Paul Downey
<option>Paulo Soares
<option>Peter Jipsen
<option>Potto
<option>Riccardo Gherardi 
<option>Richard Hobbis
<option>RodneyGomes
<option>Rodrigo Fonseca
<option>Saq Imtiaz (Lewcid)
<option>Simon Baird (~MonkeyPirate)
<option>Simon Baird
<option>Soloport
<option>Speth
<option>Udo Borkowski (Abego)
<option>Steve Rumsby
<option>Tobias Beer
<option>Unknown
<option>Vincent DiBartolo
<option>Walt Woods
<option>Yann Perrin
<option>Oriol Nieto , Alejandro Moreno, Dídac Calventus & Ludo (Marc Alier)
<option>? (VisualTW)
</select></td></tr>
<tr>
<td align="right"><b>Link:</b></td>
 <td colspan="3"><select name=link style="width:100%" />
<option>http://aiddlywiki.sourceforge.net/wikibar_demo_2.html
<option>http://bob.mcelrath.org/plugins.html#systemConfig
<option>http://bradleymeck.tiddlyspot.com
<option>http://cctiddly.sourceforge.net/
<option>http://conflation.org/#BlogUserPlugin
<option>http://dahukanna.net/wiki/tiddlywiki.htm
<option>http://danielbaird.com/tiddlywinks/
<option>http://devpad.tiddlyspot.com
<option>http://discerningtags.tiddlyspot.com/
<option>http://du180.n77.queensu.ca/TW/ToC.html
<option>http://end.com/~speth/HaloscanMacro.html
<option>http://fnd.lewcid.org/tmp/ToDoTogglePlugin.html#Tasks%20ToDoTogglePlugin
<option>http://fire.atspace.org/
<option>http://genisis329.googlepages.com/TWMath.html
<option>http://gimcrackd.com/etc/src/#%5B%5BWhat's%20this%3F%5D%5D
<option>http://gwsyzygy.googlepages.com/creator.html
<option>http://ido-xp.tiddlyspot.com/
<option>http://jackparke.googlepages.com/jtw.html
<option>http://jnthnlstr.googlepages.com/RelatedTagsPlugin.html 
<option>http://jnthnlstr.googlepages.com/BackstageSidebarPlugin.html 
<option>http://journal.conal.net/#%5B%5Bsite%20map%5D%5D
<option>http://knighjm.googlepages.com/knightnet-default-tw.html#PlugIn-Knightnet
<option>http://labwiki.sourceforge.net/
<option>http://lastfm.tiddlyspot.com/#cycleTagsInfo 
<option>http://lewcid.googlepages.com/presentation_empty_full.html#Documentation
<option>http://lewcid.org/tiddlywiki-bookmarklets/
<option>http://luceatlux.net/macros/answer
<option>http://math.chapman.edu/~jipsen/asciencepad/asciencepad.html
<option>http://moodle.tiddlyspot.com/
<option>http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D
<option>http://mptw2.tiddlyspot.com/#Plugins
<option>http://mptw.tiddlyspot.com/#PrettyDatesPlugin
<option>http://oldcat.googlegroups.com/web/AccordionEffect.html
<option>http://oldcat.googlegroups.com/web/MenuMoreEn.html
<option>http://oldcat.googlegroups.com/web/Simple2.html
<option>http://oregonstate.edu/~woodswa/tiddlywikiplugs.html
<option>http://paularodrigo.homeip.net/stickydate.html#StickyDatePlugin
<option>http://project.dahukanna.net/tiddlywiki/timeline/sampletimeline220b5.html
<option>http://ptw.sourceforge.net/ptwe.html#Plugins
<option>http://sourceforge.net/project/showfiles.php?group_id=150646&package_id=169974
<option>http://remindermacros.tiddlyspot.com/
<option>http://remotely-helpful.com/TiddlyWiki/ImprovedSlicesPlugin.html#ImprovedSlicesPlugin
<option>http://remotely-helpful.com/TiddlyWiki/LaunchApplication.html#LaunchApplicationPlugin
<option>http://remotely-helpful.com/TiddlyWiki/TiddlerEncryptionPlugin.html#TiddlerEncryptionPlugin
<option>http://rgplugins.tiddlyspot.com/#%5B%5BhideIfshowIf%20plugin%5D%5D
<option>http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D
<option>http://soloport.tiddlyspot.com/#ExcludeTimelinePlugin
<option>http://syncoutlooknotes.tiddlyspot.com/#SyncOutlookNotes
<option>http://tiddlysnip.com/#About
<option>http://tiddlystyles.com
<option>http://tiddlythemes.com/#Home
<option>http://www.tiddlywiki.com/coreplugins.html
<option>http://tiddlywiki.abego-software.de/#Plugins
<option>http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D
<option>http://tiddlywiki.ouvaton.org/Demo.html#RichTextPlugin
<option>http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D
<option>http://twmath.tiddlyspot.com/
<option>http://umibozu.org/en/index.html#Features
<option>http://visualtw.ouvaton.org/VisualTW.html
<option>http://visualtw.ouvaton.org/VisualTW.html#TagsTreePlugin
<option>http://whatfettle.com/2008/07/FixedDisplayPlugin
<option>http://weave.tiddlyspot.com
<option>http://www.anshul.info/blogwiki.html
<option>http://www.blogjones.com/TiddlyWikiTutorial.html#smiley
<option>http://www.cs.utexas.edu/~joeraii/pytw/
<option>http://www.cs.utexas.edu/~joeraii/siglet/
<option>http://www.martinswiki.com
<option>http://www.martinswiki.com/timeline/
<option>http://www.math.ist.utl.pt/~psoares/addons.html#Plugins
<option>http://www.minitiddlyserver.com/
<option>http://www.minormania.com/tiddlylock/tiddlylock.html#TiddlyLockPlugin
<option>http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm
<option>http://www.potto.client.jp/htmlslidymaker/index.html
<option>http://www.superphysique.net/#%5B%5BSEO%20TiddlyWiki%20Plugin%5D%5D
<option>http://www.tiddlytools.com
<option>http://www.tiddly-twab.com
<option>http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin
<option>http://www-static.cc.gatech.edu/~dellaert/dhtml/tiddly.html
<option>http://yann.perrin.googlepages.com/twkd.html
</select></td></tr>
<tr>
<td align="right"><b>Format:</b></td>
<td colspan="3"><select name=format style="width:100%" />
<option>Plugin
<option>Macro
<option>Script
<option>Theme
<option>Firefox extension
<option>Bookmarklet
<option>Other
</select></td></tr>
<tr>
<td align="right"><b>For TW version:</b></td>
<td colspan="3"><input name=twversion type=text  width:100%;" /></td></tr>
<tr>
<td align="right"><b>Category:</b></td>
<td colspan="3"><select name=category style="width:100%" />
<option>Aids for website visitors
<option>Behind the scenes
<option>Calculators
<option>Colors
<option>Dates
<option>Formatting and viewing text
<option>Forms and databases
<option>Games
<option>Icons
<option>Images and presentations
<option>Links
<option>Menus and sliders
<option>Navigating within a tiddler
<option>Non-English languages
<option>Other style changes
<option>Popups
<option>Saving and reviewing changes
<option>Scientific and mathematical notation
<option>Searching and indexing tiddlers
<option>Security
<option>Statistics
<option>Tabbed folders
<option>Tables
<option>Tagging
<option>Themes
<option>Tiddler manipulation
<option>Time and calendars
<option>ToDo
<option>Toggling page elements
<option>Uncategorized tools
<option>Uploading TiddlyWikis to a server
<option>Working with browsers
<option>Working with files and programs
<option>Working with keyboards
<option>Working with multiple TiddlyWikis
<option>Working with other codes and formats
<option>Working with websites, incl IFrames
</select></td></tr>
 <tr>
 <td align="right" valign="top"><b>Description:</b></td>
 <td colspan="3"><textarea name=description rows="7" cols="40" style="width:100%" ></textarea></td></tr>
</table></span> </html>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Searching and indexing tiddlers","description":"Insert a link that, when clicked, closes the current tiddler and opens another one in its place."}</data>
For translations of ~TiddlyWiki into other languages, see http://trac.tiddlywiki.org/wiki/Translations.
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Non-English languages"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]]<br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Deletes all cookies for the current document.","author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Working with browsers"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Restores all shadow tiddlers to their default values.","category":"Security","twversion":"2.0","format":"Bookmarklet","link":"http://lewcid.org/tiddlywiki-bookmarklets/","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Go to the most recently modified tiddler.","category":"Searching and indexing tiddlers","twversion":"--","author":"Eric Shulman (~TiddlyTools)","format":"Script","link":"http://www.tiddlytools.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Open multiple tagged tiddlers with a single click.","category":"Tagging","twversion":"--","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","description":"Open multiple tiddlers with a single click.","category":"Searching and indexing tiddlers","twversion":"2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Macro","twversion":"2.x","description":"Allows creation of tiddlyLinks that open multiple tiddlers. Also useful for creating links to shadowTiddlers, which if normally created are not in bold.","category":"Links"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)","twversion":"2.x","category":"Tiddler manipulation","description":"Open new tiddlers at the top of the screen."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Other style changes"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0","category":"Working with other codes and formats","description":"This is an early release of the PBWikiFormatterPlugin, which allows you to insert PBWiki formated text into a TiddlyWiki."}</data>
/***
!!!<<tiddler RefreshStyles>>&nbsp;PageCSS/%==================================================%/
***/

body {background:#099;}



#hdr {
 height:100%;
background:url("http://img261.imageshack.us/img261/8603/navbargrayhw1.png") repeat-x top left;top left;
background-color:#eee; 
color: #333333;
white-space:nowrap;
 }

#slantedmenu {height:100%;}



#outer {
align:center;
 max-width:920px;
 min-width:250px
 margin:auto;
 }

#bar {
 height:0px;
 line-height:2.2em;
 background:#c0c0c0;
}

#bodyblock {
 position:relative;
 background: #dcdcdc;
 color: #333333;
 width:650px;
 padding:0;
 }

#l-col {
 float:left;
 background:#dcdcdc;
 color: #333333;
 width:145px;
 }

#cont {
 width:100%;
 background:#ffffff;
 color: #333333;
 text-align:left;
 margin:auto;
 }

#systemcontents {
 height: 350px; 
 width: 100%; 
 position:relative;
 overflow: auto;
 margin:auto;
 }


#ftr {
 height:100%;
 background:#fff;
 color: #333333;
 border:solid black;
 border-width:1px 0 0 0;
 margin-top:1em;
 margin-bottom:1em;
 }


/* Presentation Stylesheet */ 

h3, p {
 margin:0;
 padding:15px;
 }

h4 {
 margin:0; 
 padding: 5px 0;
 }
 
p:first-letter {
 font-size: 80%; 
 font-weight: bold;
 color:blue;
 }
<!--{{{-->
<div id="outer"><div id='hdr' align='left' refresh='content'  tiddler='SilverHeader'></div>
<div id='slantedmenu' refresh='content'  tiddler='SlantedMenu'></div><div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div><div id="cont">
<div id='displayArea'><div id='tiddlerDisplay'></div>
<div id='messageArea'></div>
</div><div id="ftr" align="center" refresh='content'  tiddler='contentFooter''>>Copyright (c) You 2003</div><div id='sidebar'></div></div></div

<!--}}}-->
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","twversion":"2.1.3","category":"Tiddler manipulation","description":"With the <part aPartName> ... </part> feature you can structure your tiddler text into separate parts. Each part can be referenced as a \"normal\" tiddler, using the \"tiddlerName/partName\" syntax."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","format":"Plugin","description":"~PasswordOptionPlugin extends the core Options with a non encrypted password type.","category":"Security","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Create a prompt for masked password inputs. Contributors: Lewcid, BidiX, Loic.","category":"Security","twversion":"2.1","format":"Plugin","author":"FND","link":"http://devpad.tiddlyspot.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","format":"Plugin","twversion":"2.0.11, 2.1.0","category":"Forms and databases","description":"This macro adds field persistence to HTML forms embedded in tiddlers, and an optional reset button to clear the form and erase any persisted field values. See the PostFormPlugin. Persistence is done using the same scheme that TiddlyWiki's options use, cookies."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Frank Dellaert","link":"http://www-static.cc.gatech.edu/~dellaert/dhtml/tiddly.html","format":"Plugin","twversion":"--","category":"Links","description":"A TiddlyWikiMacro to create aliases (similar to AliasPlugin) that refer to people. The macro takes the following (mandatory) arguments: <br><br>* macro name, e.g. \"FDE\"<br><br>* person name, e.g. \"Frank Dellaert\"<br><br>* url: a url to a web-page<br><br>A second macro, \"personLookup\" supports reverse lookup, which is used in the BibTexPlugin."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Paulo Soares","link":"http://www.math.ist.utl.pt/~psoares/addons.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Images and presentations","description":"This plugin is a small companion to the SlideShowPlugin. It automates the creation of a gallery of numbered pictures from a directory that will be ready for a slide show."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Alternative stylesheet theme: white backgrounds with minimal adjustments.","category":"Themes","twversion":"2.1","format":"Theme","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin creates custom Gregorian calendars and is based on previous work by TiagoDionízio.","category":"Time and calendars","twversion":"2.1.0","format":"Plugin","link":"http://www.math.ist.utl.pt/~psoares/addons.html#Plugins","author":"Paulo Soares"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Embed a media player in a tiddler.","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Images and presentations"}</data>
/%
|Name|PluginIdentifierScript|
|Source|http://twhwelp.tiddlyspot.com#PluginIdentifierScript|
|Version|1.0.0|
|Author|Morris Gray credits: Eric Shulman|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin (for in TW use) |
|Overrides||
|Description|List plugin header information|
%/<script label="PluginIdent" title="create a list of all installed plugins">
	var plugins=window.store.getTaggedTiddlers('systemConfig','title');
	var out='|>|>|>|>|>|bgcolor:#abf;color:#006;Delete this tiddler - recommended\<\<toolbar deleteTiddler>>? |h\n';
out+='|bgcolor:#abf;!Plugin|bgcolor:#abf;!Modified|bgcolor:#abf;!Size|bgcolor:#abf;!Author|bgcolor:#abf;!Version|bgcolor:#abf;!CoreVersion|h\n|sortable|k\n';
	out+=plugins.map(function(t) {
		return '|'+'[['+t.title+']]'
		+'|'+t.modified.formatString('YYYY.0MM.0DD')
		+'| '+t.text.length
		+'|'+store.getTiddlerSlice(t.title,'Author')
		+'|'+store.getTiddlerSlice(t.title,'Version')
		+'|'+store.getTiddlerSlice(t.title,'CoreVersion')+'|'; 
	}).join('\n');
	config.shadowTiddlers.PluginIdent=out;
	story.displayTiddler(null,'PluginIdent');
        config.shadowTiddlers.PluginIdent=null; // « To keep shadow tiddler remove this line
</script>
''This script creates a shadow tiddler which is deleted after viewing.  
To retain the tiddler for copying delete the last line as shown below.''
{{{
/%
|Name|PluginIdentifierScript|
|Source|http://twhwelp.tiddlyspot.com#PluginIdentifierScript|
|Version|1.0.0|
|Author|Morris Gray credits: Eric Shulman|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin (for in TW use) |
|Overrides||
|Description|List plugin header information|
%/<script label="PluginIdent" title="create a list of all installed plugins">
	var plugins=window.store.getTaggedTiddlers('systemConfig','title');
	var out='|>|>|>|>|>|bgcolor:#abf;color:#006;Delete this tiddler - recommended\<\<toolbar deleteTiddler>>? |h\n';
out+='|bgcolor:#abf;!Plugin|bgcolor:#abf;!Modified|bgcolor:#abf;!Size|bgcolor:#abf;!Author|bgcolor:#abf;!Version|bgcolor:#abf;!CoreVersion|h\n|sortable|k\n';
	out+=plugins.map(function(t) {
		return '|'+'[['+t.title+']]'
		+'|'+t.modified.formatString('YYYY.0MM.0DD')
		+'| '+t.text.length
		+'|'+store.getTiddlerSlice(t.title,'Author')
		+'|'+store.getTiddlerSlice(t.title,'Version')
		+'|'+store.getTiddlerSlice(t.title,'CoreVersion')+'|'; 
	}).join('\n');
	config.shadowTiddlers.PluginIdent=out;
	story.displayTiddler(null,'PluginIdent');
        config.shadowTiddlers.PluginIdent=null; // « To keep shadow tiddler remove this line
</script>
}}}
<<gradient horiz #509 #fff>>&nbsp;@@color:#fff;Plugin Servers@@>>There is a proxy method that overcomes the built-in security that normally prevents cross domain importing of tiddlers. 
@@color:#C06;''&raquo; &raquo;'' @@ [[BidiXTW's ProxyService|http://tiddlywiki.bidix.info/#ProxyService]] 
@@color:#C06;''&raquo; &raquo;'' @@[[Proxy service for Tiddlyspot sites|http://tinyurl.com/29x8wk]]
<html><span style="padding-left:2em;"><input type='button' title="these are contributors who have deposits at tiddlywiki.org svn" style='cursor:pointer;' value='SVN Contributors' onclick='window.open("http://svn.tiddlywiki.org/Trunk/contributors/","_blank")'></span></html>
<html><span style="padding-left:2em;"><span style="cursor:pointer;"><input type='button' title="Links at tiddlywiki.org" style='cursor:pointer;' value='Other Repositories' onclick='window.open("http://www.tiddlywiki.org/wiki/Plugin_Repositories","_blank")'></span></html>
<html><span style="padding-left:2em;"><span style="cursor:pointer;"><input type='button' title="Popular Plugin Sites" style='cursor:pointer;' value='Popular Plugin Sites' onclick='window.open("http://www.tiddlywiki.org/wiki/Popular_Plugin_Sites","_blank")'></span></html>
<html><span style="padding-left:2em;"><span style="cursor:pointer;"><input type='button' title="TiddlyWiki Core Archive" style='cursor:pointer;' value='TiddlyWiki Core Archive' onclick='window.open("http://web.archive.org/web/*/http://www.tiddlywiki.com/empty.html","_blank")'></span></html>
|bgcolor:#509; !Plugin Servers |
|bgcolor:#fbf;@@color:#C06;''&raquo; &raquo;'' @@[[TiddlyVault List|http://tiddlyvault.tiddlyspot.com]] (Database)|
|bgcolor:#fbf;@@color:#C06;''&raquo; &raquo;'' @@[[SidebarPluginVault|http://sidebarpluginvault.tiddlyspot.com]] (Database)|
|[[AbegoExtensions|http://tiddlywiki.abego-software.de]]|
|[[BidiXTWServer|http://tiddlywiki.bidix.info]]|
|[[BobsPluginsServer|http://bob.mcelrath.org/plugins.html]]|
|[[Core(legacy)Plugins|http://www.tiddlywiki.com/coreplugins.html]]|
|[[FND's DevPad|http://devpad.tiddlyspot.com]]|
|[[Gimcrack'dServer|http://gimcrackd.com/etc/src]]|
|[[GoogleGroups|http://groups.google.com/group/TiddlyWiki/topics]]|
|[[JacksTiddlyWikiServer|http://jackparke.googlepages.com/jtw.html]]|
|[[LewcidTWServer|http://tw.lewcid.org]]|
|[[Lyall Pearce|http://remotely-helpful.com/TiddlyWiki/]]|
|[[MartinsPluginsServer|http://www.martinswiki.com]]|
|[[MonkeyPirateTWServer|http://mptw.tiddlyspot.com]]|
|[[PeachTWServer	|http://bradleymeck.tiddlyspot.com]]|
|[[Paul Soares|http://www.math.ist.utl.pt/~psoares/addons.html#Plugins]]|
|[[PrinceTiddlyWikiExtensionsServer|http://ptw.sourceforge.net/ptwe.html]]|
|[[RedMountainVistaServer|http://solo.dc3.com/tw]]|
|[[TiddlySpot|http://www.TiddlySpot.com]]|
|[[TiddlyStylesServer|http://tiddlystyles.com]]|
|[[TiddlyToolsServer|http://www.tiddlytools.com]]|
|[[TiddlyWikiServer|http://www.TiddlyWiki.com]]|
|[[VisualTW|http://visualtw.ouvaton.org/VisualTW.html]]|
*''There is a bit of duplication here''


<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","twversion":"--","category":"Links","description":"This plugin ensures links to tiddlers in plural or singular form without the need to create duplicate tiddlers or resort to pretty linking."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0","category":"Working with other codes and formats","description":"This is an early release of the PmWikiFormatterPlugin, which allows you to insert PmWiki formated text into a TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"--","category":"Non-English languages","twversion":"Requires 2.0.7","format":"Plugin","link":"http://yann.perrin.googlepages.com/twkd.html","author":"Yann Perrin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Create popups with custom content.","twversion":"2.0.8","category":"Popups","format":"Macro","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Searching and indexing tiddlers","description":"Create a popup list of tiddlers modified by a given author."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","format":"Plugin","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","twversion":"2.2.0","category":"Popups","description":"Display tips and alias from a pre-defineded tiddler."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Popups"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","category":"Forms and databases","twversion":"2.0.11, 2.1.0","description":"This macro replaces the normal submit button for an HTML form contained in a tiddler. More than one form may appear in the tiddler, and this macro may be invoked on any of them. In addition, multiple invocations of this macro may appear in a tiddler, allowing you to provide posting from more than one form in a tiddler.","format":"Plugin"}</data>
/***
|''Name:''|PreferenceSaverLib|
|''Description:''|Support library for saving configuration options for plugins.|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#PreferenceSaverLib|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.1.3|
***/
// /%
//!BEGIN-PLUGIN-CODE
function PreferenceSaver (plugin)
{
	this.container = tiddler;
}

PreferenceSaver.prototype.get = function(title,userprefs)
{
	var field = store.getValue(this.container,"pref."+title);
	field = (field == undefined )? userprefs[title]["defaults"] : field;
	switch(userprefs[title]["type"]){
		case "array":
			field = field.split(",");
			break;
		case "int":
			field = parseInt(field);
			break;
		case "bool":
			field = (field == "true")? true : false;
			break;
	}
	return field;
};

PreferenceSaver.prototype.set = function(title,val,prefmap){
	prefmap[title] = val;
	store.setValue(this.container,"pref."+title,val);
};

PreferenceSaver.prototype.loadAllPrefs = function(plugin){
	prefs = {};
	for (var n in plugin["userprefs"]){
		prefs[n] = this.get(n,plugin["userprefs"]);
	}
	return prefs;
};

SetupPrefs = function(plugin){
	plugin._saver = new PreferenceSaver(plugin);
	plugin.prefs = plugin._saver.loadAllPrefs(plugin);
};

config.macros.prefs={
	handler : function(place,macroName,params,wikifier,paramString,tiddler){
		var plugin = eval(params[0]);
		var table = '';
		table += "|>|!~%0|\n".format([store.getTiddlerSlice(plugin._saver.container.title,"Name") + " Preferences"]);
		for (var n in plugin.userprefs){
			table+= "|%0| %1 |\n".format([plugin.userprefs[n]["guiLabel"],"<<_pref {{"+params[0]+"}} "+n+">>"]);
		}
		wikify(table,place);
	}
};

config.macros._pref={
	handler : function(place,macroName,params,wikifier,paramString,tiddler){
		var plugin = params[0];
		var pref = params[1];
		this["create"+plugin.userprefs[pref]["gui"]](place,plugin,pref);
	},
	
	createinput : function(place,plugin,prefName){
		var elem = createTiddlyElement(place,"input");
		elem.value = plugin.prefs[prefName];
		elem.onchange = function(e){
			plugin._saver.set(prefName,this.value,plugin.prefs);
		};
	},

	createcheckbox : function(place,plugin,prefName){
		var cb = createTiddlyCheckbox(place,null,plugin.prefs[prefName], function (e){
			plugin._saver.set(prefName,this.checked,plugin.prefs);
			});
	},
	
	createselect : function(place,plugin,prefName){
		var choices = [];
		var selects = plugin.userprefs[prefName]["selectOptions"];
		for(var i=0; i<selects.length; i++){
			choices.push({name:selects[i], caption:selects[i]});
		}
		createTiddlyDropDown(place,function(e){
			plugin._saver.set(prefName,this.value,plugin.prefs);
			},choices,plugin.prefs[prefName]);
	}	
};
//!END-PLUGIN-CODE
// %/
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.googlepages.com/presentation_empty_full.html#Documentation","format":"Other","twversion":"--","category":"Images and presentations","description":"A full presentation package with separate modes for authors and viewers."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird","link":"http://mptw.tiddlyspot.com/#PrettyDatesPlugin","format":"Plugin","category":"Dates","description":"Provides a new date format ('pppp') that displays times such as '2 days ago'","twversion":"2.1"}</data>
!!!!!&nbsp;[[Programs]]
@@color:#C06;''&raquo; &raquo;'' @@ Tabs containing programs (plugins) written in ~JavaScript (if tagged as systemConfig begin running at startup.)
----
<script>
// get all tiddlers tagged with "systemConfig"
var tids=store.getTaggedTiddlers("systemConfig");
// keep only tiddlers *also* tagged with New
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("systemConfig")) list.push(tids[t]);
// create output list of tiddler titles, one per line
var out="";
for (var t=0; t<list.length; t++) out+="#[["+list[t].title+"]]\n";
return out;
</script> 
<<formTiddler NewPluginTemplate>><data>{"format":"Other","twversion":"--","author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","description":"Access a remote url even if TiddlyWiki is viewed over HTTP.","category":"Working with websites, incl IFrames"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Frank Dellaert","link":"http://www-static.cc.gatech.edu/~dellaert/dhtml/tiddly.html","format":"Plugin","twversion":"--","description":"A simple plugin to format publication references. This macro takes the following (mandatory) arguments in order: <br><br>* title: title of the publication <br><br>* url: url to publication <br><br>* authors: a comma separated list of author names or aliases defined using AliasPlugin<br><br>* citation: booktitle or journal or institution, will become a Tiddler link<br><br>* year: publication year<br><br>The publication is then rendered using a link to the paper, with author aliases substituted (if defined), and the citation rendered as a Tiddler link.","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","description":"Publish tiddlers tagged with the tags you place in the window (comma separated) as HTML pages to the subfolder 'publish' (you must create this). Use the PublishTemplateHead and PublishTemplateBody templates to style your pages and the PublishIndexTemplate to define an index page.","category":"Saving and reviewing changes"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Behind the scenes","description":"For use with PublisherPlugin; reloads file in specified viewing/editing mode."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Unknown","link":"http://www.cs.utexas.edu/~joeraii/pytw/","format":"Other","category":"Uploading TiddlyWikis to a server","twversion":"--","description":"Using pytw, changes made to tiddlers are saved on the server, so you don't have to download the html file and carry it with you. Compared to other server side packages for Tiddly Wiki, I maintain that pytw is one of the simplest (about 200 lines of code, gratuitously commented)."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Formatting and viewing text","description":"Quickly insert TiddlyWiki tiddler links or common formatting sequences directly into tiddler content.","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","description":"Changes tag links to make it easier to open tags as tiddlers","category":"Tagging","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","author":"Simon Baird (~MonkeyPirate)","twversion":"2.2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Display a randomly selected \"quote of the day\" from a list defined in a separate tiddler.","category":"Aids for website visitors","twversion":"2.1","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","format":"Plugin","twversion":"2.2.0","category":"Working with websites, incl IFrames","description":"An RSS reader for ~TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Select a stylesheet theme at random.","category":"Themes","format":"Script","twversion":"2.1","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Images and presentations","description":"This plugin contains a compressed copy of the Raphaël v.0.6.3 SVG/VML Vector Graphics Library, which currently supports Firefox 3.0+, Safari 3.0+, Opera 9.5+ and Internet Explorer 6.0+."}</data>
Raphaël (http://raphaeljs.com) is a small javascript function library that enables you to create and manipulate vector graphic objects. Raphaël was created by Dmitry Baranovskiy and has been distributed under a Creative Commons 3.0 BY-SA license. Dmitry writes:

    Raphaël uses the SVG W3C Recommendation and VML (mostly equivalent Internet Explorer implementation) as a base for creating graphics. This means every graphical object you create is also a DOM object, so you can attachJavaScript event handlers or modify them later. Raphaël’s goal is to provide an adapter that will make drawing vector art (similar to Flash) compatible cross-browser and easy.
<<formTiddler NewPluginTemplate>><data>{"author":"Joeraii","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","description":"Drag tiddlers by title to re-order story column display. Adapted by Eric Shulman.","category":"Searching and indexing tiddlers"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Saving and reviewing changes","description":"Display droplist of recently changed tiddlers with goto, edit, and preview buttons."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This macro tells TW to find all instances of a word and makes it point to a different link. For example, whenever I put the word 'Clint' in a tiddler I want TiddlyWiki to turn it into a link that points to a tiddler titled 'Clint Checketts' Or the word 'TW' could point to a tiddler called 'TiddlyWiki' It even matches clint (which is lowercase) Clint leet lEEt LEET.","author":"Clint Checketts","link":"http://tiddlystyles.com","format":"Macro","twversion":"--","category":"Links"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","description":"Display a list of tiddlers linking to this plugin.","category":"Searching and indexing tiddlers"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Tiddler manipulation","description":"A toolbar button that refreshes your tiddler.","format":"Plugin","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","format":"Plugin","twversion":"2.0.11, 2.1.0","category":"Working with websites, incl IFrames","description":"This macro provides a tiddler with an <iframe> refresh control. This permits refreshing just the iframe, avoiding flashing due to refreshing the entire tiddler. Normally, a refresh button appears at the location of the macro invocation. Clicking this button causes the contents of the tiddler to be refreshed. Optionally, a checkbox may also be displayed with which the user can enable and disable automatic periodic refresh of the tiddler at an interval specified by the third parameter. Finally, for special applications, a fourth parameter may be given, and if \"true\" both the button and the checkbox will be hidden, and the tiddler will simply refresh periodically at the interval given by the third parameter."}</data>
<html><input type="button" value="Refresh Styles" onClick="javascript:refreshStyles('StyleSheet');" name="button" class="btn" onmouseover="this.className='btn btnhov'" onmouseout="this.className='btn'"/></html>
<<formTiddler NewPluginTemplate>><data>{"description":"Link that forces a refresh of the current tiddler.","category":"Saving and reviewing changes","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","format":"Plugin","twversion":"2.0.11, 2.1.0","category":"Tiddler manipulation","description":"This macro provides a tiddler with refresh control. Why would you want this? Perhaps for a webcam feed which is updated every 15, 30, 60 secs etc... or RSS feed from an active news site etc. At a minimum, a refresh button appears at the location of the macro invocation. Clicking this button causes the contents of the tiddler to be refreshed. Optionally, a checkbox may also be displayed with which the user can enable and disable automatic periodic refresh of the tiddler at a specified interval."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jonathan Lister (jayfresh)","link":"http://jnthnlstr.googlepages.com/RelatedTagsPlugin.html","twversion":"2.4","category":"Tagging","description":"When you click on a tag name, creates an option to 'Show related tags'. ","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","format":"Plugin","twversion":"2.1","category":"Searching and indexing tiddlers","description":"Starting from a selected tiddler, display a list and/or tree of linked or transcluded tiddlers."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Creates PrettyLinks relative to the current tiddler.","category":"Links","twversion":"2.1","author":"FND","link":"http://devpad.tiddlyspot.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jeremy Sheeley","link":"http://remindermacros.tiddlyspot.com/","format":"Macro","twversion":"2.0+","category":"Time and calendars","description":"This plugin provides macros for tagging a date with a reminder. Use the reminder macro to do this. The showReminders and displayTiddlersWithReminder macros automatically search through all available tiddlers looking for upcoming reminders."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Bookmarklet","twversion":"2.0","category":"Tagging","description":"Renames all occurrences of a tag."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","category":"Tagging","twversion":"2.2.1","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","description":"Allows you to easily rename or delete tags across multiple tiddlers","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Uncategorized tools","description":"Disable doubleclick-to-edit-tiddler or replace doubleclick with shift/ctrl/alt+singleclick."}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.1","category":"Tiddler manipulation","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","description":"Replace tiddler's title text with other content - may include wiki syntax."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jeremy Ruston","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Behind the scenes","description":"Opens a new window containing the raw content of the current document."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adds a handle below the textarea of a tiddler, in edit mode, that the user can drag with the mouse to resize the textarea.","category":"Tiddler manipulation","twversion":"2.1.2","format":"Plugin","link":"http://soloport.tiddlyspot.com/#ExcludeTimelinePlugin","author":"Jon Scully"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","format":"Plugin","twversion":"--","category":"Saving and reviewing changes","description":"This plugin allows people to save multiple revisions of tiddlers and view the changes of tiddlers over time with the ability to restore previous versions of a tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Automatically replace strings with others. The replacement string gets wikified as well, allowing for cascading rewrites. (No check for cycles, so watch out.) If you want to use a string that has a replacement rule, prefix it with a backslash.","category":"Formatting and viewing text","author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D","format":"Plugin","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Some rewrites to make math/Haskell notation look prettier and easier to write.","category":"Working with other codes and formats","twversion":"--","format":"Plugin","author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Pascal","format":"Plugin","category":"Formatting and viewing text","twversion":"2.1.x","description":"Integrate tinyMCE richtext editor in TiddlyWiki.","link":"http://tiddlywiki.ouvaton.org/Demo.html#RichTextPlugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Frank Dellaert","link":"http://www-static.cc.gatech.edu/~dellaert/dhtml/tiddly.html","format":"Plugin","twversion":"--","description":"A TiddlyWikiMacro that inserts an image with a rollover backup image. It takes three mandatory arguments: <br><br>* a unique name to identify the img tag. If not unique, none of the rollover macros will work.<br><br>* the default image<br><br>* the secondary image<br><br>and two optional arguments: <br><br>* the url the image points to when clicked. If not given, the second image will be the target. <br><br>* optional arguments passed to the image tag","category":"Images and presentations"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"No clue what this does...","category":"Tagging","format":"Macro","twversion":"2.x","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Fabrice","link":"http://www.superphysique.net/#%5B%5BSEO%20TiddlyWiki%20Plugin%5D%5D","description":"I wrote this Search Engine Optimization plugin to improve TiddlyWiki website's ranking on Google, Yahoo, etc. Basically, it does two things:<br><br>1) For each tiddler and each tag of this one, it creates a html file with the tiddler's content and named according to the tiddler's title. The html file is written in a way that it can be easily crawled by a search engine (short and with html format, notTiddlyWiki's format), but if it is opened (which will be the case if it appears in the results of a search engine), it redirects to the TiddlyWiki with the corresponding tiddler opened.<br><br>2) It creates the sitemap.xml and urllist.txt files for Google and Yahoo which included generated html files.","format":"Plugin","category":"Working with websites, incl IFrames","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"SHA1UnwoundPlugin is a faster (but larger) SHA-1 hash algorithm with unwound loops.","category":"Working with other codes and formats","twversion":"2.1","format":"Plugin","link":"http://www.martinswiki.com","author":"Martin Budden"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Query a SQL database (defined in SQLConfig) and display results in a tiddler.","category":"Working with other codes and formats","twversion":"--","format":"Plugin","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Security","twversion":"2.0","format":"Bookmarklet","author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","description":"Reloads the current document in safe mode."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Creates a button that saves and reloads your TW.","format":"Macro","category":"Saving and reviewing changes","twversion":"2.x","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.3","category":"Saving and reviewing changes","description":"Automatically add \"saveAs\" to backstage commands"}</data>
/***
|Name|SaveAsPlugin|
|Source|http://www.TiddlyTools.com/#SaveAsPlugin|
|Documentation|http://www.TiddlyTools.com/#SaveAsPlugin|
|Version|1.0.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Save current document to a different path/filename|
!!!!!Documentation
<<<
Syntax: {{{<<saveAs>>}}}
<<saveAs>>
<<<
!!!!!Revisions
<<<
2008.04.12 [1.0.1] automatically add "saveAs" to backstage commands
2008.04.12 [1.0.0] initial release - derived from [[NewDocumentPlugin]]
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveAsPlugin= {major: 1, minor: 0, revision: 1, date: new Date(2008,4,12)};

config.macros.saveAs = {
	label: "save as...",
	prompt: "Save current document to a different path/file",
	filePrompt: "Please select or enter a target path/filename",
	defaultFilename: "new.html",
	okmsg: "%0 tiddlers written to %1",
	failmsg: "An error occurred while creating %0",
	handler: function(place,macroName,params)
		{ var btn=createTiddlyButton(place,this.label,this.prompt,this.go); },
	go: function() {
		// make sure we are local
		if (window.location.protocol!="file:") {
			alert(config.messages.notFileUrlError); 
			if (store.tiddlerExists(config.messages.saveInstructions))
				story.displayTiddler(null,config.messages.saveInstructions);
			return;
		}
		// get current saved file
		var currPath=getLocalPath(window.location.href);
		var original=loadFile(currPath);
		if (!original) {
			alert(config.messages.cantSaveError); 
			if (store.tiddlerExists(config.messages.saveInstructions))
				story.displayTiddler(null,config.messages.saveInstructions);
			return;
		}

		// get new target path/filename
		var newPath=currPath;
		var slashpos=newPath.lastIndexOf("/"); if (slashpos==-1) slashpos=newPath.lastIndexOf("\\"); 
		if (slashpos!=-1) newPath=newPath.substr(0,slashpos+1); // trim filename
		var newFile=currPath.substr(newPath.length); // trim path
		if (!newFile.length) newFile=config.macros.saveAs.defaultFilename;
		var target=config.macros.saveAs.ask(config.macros.saveAs.filePrompt,newPath,newFile);
		if (!target) return; // cancelled by user
		// if specified file does not include a path, assemble fully qualified path and filename
		var slashpos=target.lastIndexOf("/"); if (slashpos==-1) slashpos=target.lastIndexOf("\\");
		if (slashpos==-1) target=target+config.macros.saveAs.defaultFilename;
		var link="file:///"+target.replace(/\\/g,'/'); // link for message text

		// write target
		if (saveFile(target,updateOriginal(original)))
			var msg=config.macros.saveAs.okmsg.format([store.getTiddlers("title").length,target]);
		else
			var msg=config.macros.saveAs.failmsg.format([target]);
		clearMessage(); displayMessage(msg,link);
	},
	ask: function(msg,path,file) {
		if(window.Components) { // moz
			try {
				netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
				var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
				var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
				picker.init(window, msg, nsIFilePicker.modeSave);
				var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
				thispath.initWithPath(path);
				picker.displayDirectory=thispath;
				picker.defaultExtension='html';
				picker.defaultString=file;
				picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
				if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
			}
			catch(e) { alert('error during local file access: '+e.toString()) }
		}
		else { // IE
			try { // XP/Vista only
				var s = new ActiveXObject('UserAccounts.CommonDialog');
				s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
				s.FilterIndex=3; // default to HTML files;
				s.InitialDir=path;
				s.FileName=file;
				if (s.showOpen()) var result=s.FileName;
			}
			catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
		}
		return result;
	}
};
//}}}
//{{{
// automatically add saveAs to backstage
config.tasks.saveAs = {
	text: "saveAs",
	tooltip: config.macros.saveAs.prompt,
	action: function(){ clearMessage(); config.macros.saveAs.go(); }
}
config.backstageTasks.splice(config.backstageTasks.indexOf("save")+1,0,"saveAs");
//}}}
<<formTiddler NewPluginTemplate>><data>{"description":"Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler.","category":"Tiddler manipulation","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Normally, when you are viewing a TiddlyWiki document over the web (i.e., not via file://) and you select the \"save changes\" (or \"save to disk\") command, an error message is displayed: \"You need to save this TiddlyWiki to a file before you can save changes.\" This plugin extends the use of <<saveChanges>> so that when you are viewing and/or editing a remote TiddlyWiki document, instead of receiving this somewhat confusing and unhelpful message, you can still click the \"save changes\" (or \"save to disk\") command to store a copy of the remote document directly onto your local filesystem, including any unsaved tiddler changes/additions you have made while working on-line. BETA/EXPERIMENTAL - USE WITH CAUTION - VERIFY ALL SAVED CHANGES - RETAIN BACKUPS.","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Working with websites, incl IFrames"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"As of TW 2.0.5, when exiting from a TW session with unsaved tiddler changes, an \"onbeforeunload\" event handler calls upon confirmExit() to display a message box with a warning message and options to stay on the current page or continue exiting and lose all changes.<br><br>However, not all browsers support the use of the \"onbeforeunload\" event, so TW still supports the previous \"onunload\" event handler, which offers a \"save-or-discard-before-exiting\" option, but cannot stop the browser from exiting the TW session. Normally, when the newer confirmation message is used, the older message box is suppressed, so that only one confirmation message will be displayed.<br><br>This plugin prevents the \"Save or Discard\" confirmation message from being suppressed, so that the 'save-on-exit' option is still available, even after responding to the default \"Exit or Cancel\" message. This double check procedure adds just a bit more \"data safety\" to the TW exit process.","category":"Saving and reviewing changes","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","description":"Save tiddler SOURCE text to a local file.","category":"Working with files and programs"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Saving and reviewing changes"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob McElrath (Bob's)","link":"http://bob.mcelrath.org/plugins.html#systemConfig","format":"Plugin","twversion":"2.03","category":"Scientific and mathematical notation","description":"This plugin will render numbers expressed in scientific notation, such as 3.5483e12 using the jsMath plugin to display it in an intuitive way such as 3551012 . You may customize the number of significant figures displayed, as well as \"normalize\" numbers so that 47392.387e9 is displayed as 4741013 ."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Scientific and mathematical notation"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
!!!!![[Script]]
 @@color:#C06;''&raquo; &raquo;'' @@ These are tabs containing ~JavaScript
----
<script>
// get all tiddlers tagged with "script"
var tids=store.getTaggedTiddlers("script");
// keep only tiddlers *also* tagged with ?
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("script")) list.push(tids[t]);
// create output list of tiddler titles, one per line
var out="";
for (var t=0; t<list.length; t++) out+="#[["+list[t].title+"]]\n";
return out;
</script> 
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Navigating within a tiddler","description":"Display the contents of a tiddler in a fixed-height scrolling area."}</data>
Display the contents of a tiddler in a fixed-height scrolling area.  It's like an <iframe> but is used with tiddlers.
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin will reel in those tabs on the side that stretch on forever. Basically, it makes the tabgroup fit the screen and/or the content (display area).","category":"Toggling page elements","twversion":"--","format":"Plugin","link":"http://gwsyzygy.googlepages.com/creator.html","author":"Greg Walker"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Deletes all extended fields from a TiddlyWiki. ","category":"Forms and databases","twversion":"2.0","format":"Bookmarklet","link":"http://lewcid.org/tiddlywiki-bookmarklets/","author":"Jeremy Ruston"}</data>
<<tiddler Find>>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Searching and indexing tiddlers","description":"This plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags. It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated \"SearchResults\" tiddler), rather than actually displaying all matching tiddlers. You can also enable/disable the \"incremental search\" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the \"search:\" prompt text."}</data>
/***
|''Name:''|SearchOptionsPlugin|
|''Source:''|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|''Author:''|Eric Shulman - ELS Design Studios|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion:''|2.0.10|

The TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text').  However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases.  In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.

!!!!!Usage
<<<
This plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags.  It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers.  You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.
<<<
!!!!!Configuration
<<<
In additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:
<<option chkSearchTitles>> Search tiddler titles
<<option chkSearchText>> Search tiddler text
<<option chkSearchTags>> Search in tiddler tags
<<option chkSearchFields>> Search in tiddler data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchList>> Show list of matching tiddlers
<<option chkSearchIncremental>> Incremental searching
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for SearchOptionsPlugin handling^^

When installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior.  However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}},  {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}}  (with suitable prompt text) to your customized tiddler.
<<<
!!!!!Revision History
<<<
''2007.01.17 [mgray]'' disabled 'no search on empty box' by adding Alert to doSearch() from older version.
''2006.10.10 [2.4.0]'' added support for "search in tiddler data" (tiddler.fields)  Default is to search extended data.
''2006.04.06 [2.3.0]'' added support for "search in shadow tiddlers".  Default is *not* to search in the shadows (i.e.standard TW behavior).  Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.
''2006.02.03 [2.2.1]'' rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes.  note that core no longer permits "blank=all" searches, so neither does this plugin.  To search for all, use "." with text patterns enabled.
''2006.02.02 [2.2.0]'' in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars.  Prevents searching on shorter text when shortened by rapid backspaces (<500msec)
''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching
also, blank search text now presents "No search text.  Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.
''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank
''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.
''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)
define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title
''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.
''2006.01.17 [2.1.4]'' Use regExp.search() instead of regExp.test() to scan for matches.  Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.
''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output
''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers.  This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.
''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()
''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.
''2005.12.30 [2.0.0]'' Upgraded to TW2.0
when rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.
''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags
''2005.12.21 [1.3.7]'' use \\ to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link.  Also, added access key: "O", to trigger "open all" link.
Based on a suggestion by UdoBorkowski.
''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon
''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.
''2005.12.17 [1.3.4]'' use {/%%/{/%%/{  and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered 
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.
Based on a suggestion by UdoBorkowski.
''2005.12.10 [1.3.1]'' added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.
''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).
added handling for Enter key so it can be used to start a search.
Based on a suggestion by LyallPearce
''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin
''2005.11.25 [1.2.0]'' added chkSearchList option
Based on a suggestion by RodneyGomes
''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.
Based on a suggestion by ChristianHauck
''2005.10.18 [1.0.0]'' Initial Release
Based on a suggestion by LyallPearce.
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.SearchTitleOrText = {major: 2, minor: 4, revision: 0, date: new Date(2006,10,12)};
//}}}

//{{{
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=false;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;

config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchText>> Search in tiddler text";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTags>> Search in tiddler tags";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchFields>> Search in tiddler data fields";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchShadows>> Search in shadow tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitlesFirst>> Search results show title matches first";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchList>> Search results show list of matching tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchIncremental>> Incremental searching";
//}}}

//{{{
if (config.macros.search.reportTitle==undefined)
	config.macros.search.reportTitle="SearchResults";
//}}}

//{{{
config.macros.search.handler = function(place,macroName,params)
{
	var lastSearchText = "";
	var searchTimeout = null;
	var doSearch = function(txt)
		{
		if (!txt.value.length && !confirm("No search text.  Continue anyway?")) { txt.focus(); return; }
			{
			story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
			lastSearchText = txt.value;
			}
		};
	var clickHandler = function(e)
		{
		doSearch(this.nextSibling);
		return false;
		};
	var keyHandler = function(e)
		{
		if (!e) var e = window.event;
		switch(e.keyCode)
			{
			case 13: // ELS: handle enter key
				doSearch(this);
				break;
			case 27:
				this.value = "";
				clearMessage();
				break;
			}
		if (config.options.chkSearchIncremental)
			{
			if(this.value.length > 2)
				{
				if(this.value != lastSearchText)
					{
					if(searchTimeout) clearTimeout(searchTimeout);
					var txt = this;
					searchTimeout = setTimeout(function() {doSearch(txt);},500);
					}
				}
			else
				if(searchTimeout) clearTimeout(searchTimeout);
			}
		};
	var focusHandler = function(e)
		{
		this.select();
		};
	var btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);
	var txt = createTiddlyElement(place,"input",null,null,null);
	if(params[0])
		txt.value = params[0];
	txt.onkeyup = keyHandler;
	txt.onfocus = focusHandler;
	txt.setAttribute("size",this.sizeTextbox);
	txt.setAttribute("accessKey",this.accessKey);
	txt.setAttribute("autocomplete","off");
	if(config.browser.isSafari)
		{
		txt.setAttribute("type","search");
		txt.setAttribute("results","5");
		}
	else
		txt.setAttribute("type","text");
}
//}}}

//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack,"title","excludeSearch");
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (config.options.chkSearchList) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (config.options.chkSearchList) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}

//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
	var candidates = this.reverseLookup("tags",excludeTag,false,sortField);

	// scan for matching titles first...
	var results = [];
	if (config.options.chkSearchTitles) {
		for(var t=0; t<candidates.length; t++)
			if(candidates[t].title.search(searchRegExp)!=-1)
				results.push(candidates[t]);
		if (config.options.chkSearchShadows)
			for (var t in config.shadowTiddlers)
				if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
					results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
	}
	// then scan for matching text, tags, or field data
	for(var t=0; t<candidates.length; t++) {
		if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)
			results.pushUnique(candidates[t]);
		if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)
			results.pushUnique(candidates[t]);
		if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above
			store.forEachField(candidates[t],
				function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },
				true); // extended fields only
	}
	// then check for matching text in shadows
	if (config.options.chkSearchShadows)
		for (var t in config.shadowTiddlers)
			if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
				results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));

	// if not 'titles first',  re-sort results to so titles, text, tag and field matches are mixed together
	if(!sortField) sortField = "title";
	var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }
	if (!config.options.chkSearchTitlesFirst) results.sort(bySortField);

	return results;
}
//}}}

// // ''REPORT GENERATOR''
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	var body="\n";

	// summary: nn tiddlers found matching '...', options used
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	body+="^^//searched in:// ";
	body+=(config.options.chkSearchTitles?"''titles'' ":"");
	body+=(config.options.chkSearchText?"''text'' ":"");
	body+=(config.options.chkSearchTags?"''tags'' ":"");
	body+=(config.options.chkSearchFields?"''fields'' ":"");
	body+=(config.options.chkSearchShadows?"''shadows'' ":"");
	if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
		body+=" //with options:// ";
		body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
		body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
	}
	body+="^^";

	// numbered list of links to matching tiddlers
	body+="\n<<<";
	for(var t=0;t<matches.length;t++) body+="\n# [["+matches[t].title+"]]";
	body+="\n<<<\n";

	// open all matches button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.displayTiddlers(null,["
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" ";
	body+="accesskey=\"O\" ";
	body+="value=\"open all matching tiddlers\"></html> ";

	// discard search results button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
	body+="value=\"discard "+title+"\"></html>";

	// search again
	body+="\n\n----\n";
	body+="<<search \""+text+"\">> ";
	body+="<<option chkSearchTitles>>titles ";
	body+="<<option chkSearchText>>text ";
	body+="<<option chkSearchTags>>tags";
	body+="<<option chkSearchFields>>fields";
	body+="<<option chkSearchShadows>>shadows";
	body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
	body+="<<option chkRegExpSearch>>text patterns";

	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");
	store.addTiddler(tiddler); story.closeTiddler(title);

	// use alternate "search again" label in <<search>> macro
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again";

	// render/refresh tiddler
	story.displayTiddler(null,title,1);
	store.notify(title,true);

	// restore standard search label
	config.macros.search.label=oldprompt;

}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
/***
|''Name:''|SearchPlusPlugin|
|''Description:''|A simple intuitive search replacement, ideal for websites and blogs|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#SearchPlusPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Requires:''|PreferenceSaverLib|
|''~CoreVersion:''|2.2.3|
!!Requirements:
* [[PreferenceSaverLib|http://tw.lewcid.org/#PreferenceSaverLib]]
!!Usage:
* Just type into the search field like normal
* Optionally you may include only tiddlers with a given tag in the search. To enable this:
** change config.macros.search.includeByTagMode to true
** change config.macros.search.includeByTag to the tag you want to use.
<<prefs config.macros.search>>
***/
// /%
//!BEGIN-PLUGIN-CODE
if(!window.SetupPrefs)
	alertAndThrow("Missing requirements: PreferenceSaverLib (http://tw.lewcid.org/#PreferenceSaverLib)");

config.macros.search.userprefs = {
	excludeTag:{
		defaults : "excludeSearch",
		gui : "input",
		guiLabel : "Tiddlers with this tag are not searched",
		type : "string"
		},
		
	includeByTagMode:{
		defaults : "false",
		gui : "checkbox",
		guiLabel : "Limit search to tiddlers with a given tag (alt. mode)",
		type : "bool"
		},

	includeTag:{
		defaults : "Public",
		gui : "input",
		guiLabel : "Only search tiddlers with this tag (in alt. mode)",
		type : "string"
		}
};

config.macros.search.doSearch = function(txt)
{
	highlightHack = new RegExp(config.options.chkRegExpSearch ?	 txt.value : txt.value.escapeRegExp(),config.options.chkCaseSensitiveSearch ? "mg" : "img");
	var matches = store.search(highlightHack,"title",this.prefs["includeByTagMode"]?this.prefs["includeTag"]:this.prefs["excludeTag"],this.prefs["includeByTagMode"]);
	var popup = Popup.create(txt);
	if(matches.length>0){
		createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),"Search found "+ matches.length +" matches:");
		var titles = [];
		for (var i=0;i<matches.length;i++){
			createTiddlyLink(createTiddlyElement(popup,"li"),matches[i].title,true,"tiddlyLink",false,false,false);
			titles.push(matches[i].title);
		}
		createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
		var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),"Open all results","Open all search results",onClickSearchOpenAll);
		openAll.tiddlers = titles;
	}
	else{
		createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),"Search found no matches.");
	}
	Popup.show();
	return false;
};

config.macros.search.onClick = function(e)
{
	if (!e)var e = window.event;
	config.macros.search.doSearch(this.nextSibling);
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	return false;
};

onClickTiddlerLink_websitesearch = onClickTiddlerLink;
onClickTiddlerLink = function(e)
{
	onClickTiddlerLink_websitesearch.apply(this,arguments);
	highlightHack = null;
};

function onClickSearchOpenAll(e)
{
	if(!e) var e = window.event;
	var titles = this.tiddlers;
	story.displayTiddlers(null,titles);
	highlightHack = null;
	return false;
};

TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
	var candidates = this.reverseLookup("tags",excludeTag,!!match);
	var results = [];
	for(var t=0; t<candidates.length; t++) {
		if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
			results.push(candidates[t]);
	}
	if(!sortField)
		sortField = "title";
	results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
	return results;
};

SetupPrefs(config.macros.search);
//!END-PLUGIN-CODE
// %/
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Searching and indexing tiddlers"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Allows you to create collapsable sections just like the slider macro but without needing to create new tiddlers for these sections.","category":"Menus and sliders","twversion":"--","format":"Macro","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Security"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","author":"Simon Baird (~MonkeyPirate)","twversion":"--","description":"Lets you easily change colour palette","category":"Colors"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Themes","description":"Select alternative TiddlyWiki template/stylesheet 'themes' from a droplist."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Plugin","category":"Themes","description":"On the fly switching between various TW layouts (themes).","twversion":"2.x"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This framework allows you to easily create macros that produce links referring to the current tiddler.","category":"Tagging","twversion":"2.x","format":"Plugin","link":"http://yann.perrin.googlepages.com/twkd.html","author":"Yann Perrin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adds sendTiddler toolbar command to submit individual tiddler source content to remote URLs for server-side processing. Useful for posting tiddler content to on-line blog services or custom-built server-side storage mechanisms.","category":"Uploading TiddlyWikis to a server","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Set contents of DefaultTiddlers list to match currently displayed tiddlers.","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Saving and reviewing changes"}</data>
/%
|Name|SetSidebarTabsHeight|
|Source|http://www.TiddlyTools.com/#SetSidebarTabsHeight|
|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|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|use CSS to set a scrolling, fixed or percentage height for popups (e.g. tags display)|

usage: <<tiddler SetPopupsHeight with: height>>

where 'height' is an *optional* param to override the current value (if any)

%/<script>
	if (config.options.txtPopupsHeight==undefined) config.options.txtPopupsHeight="auto";
	if ('$'+'1'!='$1') config.options.txtPopupsHeight='$1';
	window.setPopupsHeight=function() {
		var h=config.options.txtPopupsHeight; if (!h.length) h='auto';
		if (!h.replace(/[0-9]*/,"").length) h+="px"; // add "px" suffix if only numeric value
		this.value=h; // update field content
		if (h.indexOf("%")!=-1)
			h=(findWindowHeight()*parseInt(h.replace(/%/,""))/100)+"px"; // % of window
		var heightParam=(config.browser.isIE?"height":"max-height")+":"+h;
		var overflowParam='overflow:'+(h!='auto'?'auto':'hidden')+' !important'; 
		var css='.popup { '+heightParam+'; '+overflowParam+'; }';
		setStylesheet(css,"popupStyles");
		// sync any option field that is showing txtPopupsHeight value
		var nodes = document.getElementsByTagName("input");
		for(var t=0; t<nodes.length; t++) 
			if(nodes[t].getAttribute("option")=="txtPopupsHeight")
				nodes[t].value=this.value;
	}
	setTimeout('window.setPopupsHeight()',1); // initialize height
	if (window.addEventListener) window.addEventListener("resize",window.setPopupsHeight,false);
</script>popups height: {{smallform{<<option txtPopupsHeight>><script>
	var t=place.lastChild
	t.style.width="4em";
	t.style.textAlign="center";
	t.title="enter height using CSS dimensions (px, em, in, cm, %) or 'auto'";
	t.onfocus=function(){this.select();};
	// hijack onchange for this field so CSS can be updated on the fly
	t.coreOnChange=t.onchange;
	t.onchange=function() {
		if (this.coreOnChange) this.coreOnChange();
		window.setPopupsHeight();
	};
</script>}}}
<<formTiddler NewPluginTemplate>><data>{"description":"Set tiddler background and font color CSS attributes.","category":"Other style changes","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Tiddler manipulation","description":"Use CSS3 \"-moz-column-count\" to set single or multi-column tiddler layout."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Tiddler manipulation","description":"Use CSS to set a fixed height for each tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Tiddler manipulation","description":"Changes all tiddlers’ “modifier” to the specified value."}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.1","description":"If you are using the default (shadow) EditTemplate definition, it will be updated to invoke this macro, so that whenever a user attempts to edit/create a tiddler AND the username is \"YourName\", they will be automatically prompted to enter a new username.","category":"Security","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","twversion":"2.0.7","category":"Working with multiple TiddlyWikis","description":"Manage your option settings' scope: keep settings private to a TiddlyWiki or share them with other TiddlyWikis."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"For each tag, show a numbered list of all tiddlers with that tag.","category":"Tagging","twversion":"--","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","description":"Generate a list containing permalinks for every tiddler in the document.","category":"Searching and indexing tiddlers"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Macro","category":"Time and calendars","description":"Shows clock, including options for other time zones.","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Show local filesystem directory using an IFRAME.","category":"Working with files and programs","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Time and calendars","description":"Display current date, linked to moveable floating panel containing flash-based analog clock."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This is a little utility useful for demonstrating markup and macro usage. There are two versions, one puts the example code and the wikified output in two columns of a table. The other puts the example code above the wikified output. Use \\ to escape > for closing macros.","category":"Formatting and viewing text","twversion":"2.x","format":"Macro","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","category":"Uncategorized tools","description":"Simply lists the parameters it is given. Used for testing named params."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Searching and indexing tiddlers","description":"View values for all tiddler slices."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","description":"Where 'TiddlerName' is any existing tiddler and 'ClipMarker' (optional) is a unique text string for delimiting the end of the clip.  Embed the clip marker in a tiddler (using a TW comment so it doesn't appear in that tiddler when displayed).  The script will display the tiddler source content up to the marker.","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Statistics","description":"Display document summary / tiddler stats (newest, oldest, largest, smallest, etc.)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"List updates to a TW since the users last visit","category":"Aids for website visitors","twversion":"2.x","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Displays current username, Click for prompt box to change name.","category":"Security","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<tiddler TWHelpSearchBox>>
<<closeAll>><<permaview>><<newTiddler>><<newTiddler label:'new plugin' text:{{"<<formTiddler NewPluginTemplate\>\>"}} tag:"list">><<newJournal "DD MMM YYYY">><<upload http://tiddlyvault.tiddlyspot.com/store.cgi index.html . .  tiddlyvault>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
#container {
position: relative;
margin: 0 auto;
padding: 0;width: 770px;	
text-align: left;
background: #F1EFE2 url(container-bg.gif) no-repeat 0px 185px;}

#detail-left
 {position: absolute;
top: 185px;left: 0;
margin: 0;
padding: 0;
width: 10px;
height: 65px;
background: url(detail-left.gif) no-repeat;
}

#detail-right {
position: absolute;top:
 185px;right: 0;
margin: 0;
padding: 0;
width: 10px;
height: 65px;
background: url(detail-right.gif) no-repeat;
}
<html><hide linebreaks>
<div class="container">
<div class="left" macro='tiddler SideBarOptions'></div>
<div class="content" macro='tiddler SideBarTabs'></div>
<div
<div  class="footer" macro='tiddler ToolTabs'></div>
</html>

<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
----
@@padding-left:1.5em;color:#C06;''&raquo;'' <html><a href="file:../Sideminder/sideminder-twab.html" target="_top">~SideMinder</a></html>@@@@padding-left:1em;color:#C06;'&raquo;'' <html><a href="file:../SideSnips\sidesnips-try.html" target="_top">~SideSnips</a></html>@@
----
<<formTiddler NewPluginTemplate>><data>{"description":"Siglets are bits of CSS code that correspond to a specific tag. In the sidebar at left, the small colored squares are siglets generated from the first tag of each tiddler, note how the color is preserved in the Tiddler title, and the body as well. The shape is preserved across the sidebars and the popups, and the color is preserved everywhere. Using many colors and shapes helps your brain to develop associations faster, as well as makes it easier to scan the page for important information (e.g. TODO entries).<br><br>Siglets help you keep track of some kind type or class information associated with a certain Tiddly entry, for example a TODO item tiddly, or a tiddly about Work, etc. They allow you to quickly scan a list of tiddlys and pick out what is necessary for a certain task. For example you can tag TODO tiddlies with an obnoxious color so that you make them want to go away.","category":"Colors","twversion":"--","format":"Other","link":"http://www.cs.utexas.edu/~joeraii/siglet/","author":"Joeraii"}</data>
<html><span style="color:#009;font-variant:small-caps;line-height:1.9em;font-size:10pt;font-weight:normal;letter-spacing: 0.2em;padding-left:0.5em;"><a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('DefaultTiddlers').readBracketedList())"><span title="Close all tiddlers and go Home" style="cursor:pointer">Sidebar Plugin Vault</span></span></a><br><span style='letter-spacing: 0.0em;font-size:7pt;'>&nbsp;&nbsp;<a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('DefaultTiddlers').readBracketedList())"><span title="Close all tiddlers and go Home" style="cursor:pointer">home</span></a>@@color:#C06;&nbsp;|&nbsp;@@[[view|ViewTabs]] @@color:#C06; &nbsp;|&nbsp;@@<<saveChanges>>@@color:#C06;&nbsp;|&nbsp;@@<<toggleslantedmenu "" "" hide>></span></span></html>{{span{@@color:#C06;&nbsp;|&nbsp;@@@@font-size:7pt;<<slider "" "SidebarLinks" "SidebarLinks" SidebarLinks">>@@&nbsp;[[»|Index]]<script>
  if (document.location.protocol!='file:')place.style.display='none';</script>}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com/timeline/","format":"Plugin","twversion":"2.2 or better","category":"Time and calendars","description":"Another timeline!"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Dawn Ahukanna","link":"http://project.dahukanna.net/tiddlywiki/timeline/sampletimeline220b5.html","format":"Plugin","category":"Time and calendars","description":"A really cool timeline for ~TiddlyWiki.","twversion":"2.2.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Ocat","link":"http://oldcat.googlegroups.com/web/Simple2.html","format":"Theme","twversion":"--","category":"Themes","description":"A TiddlyWiki theme with a focus on readability."}</data>
<<formTiddler NewPluginTemplate>><data>{"link":"http://ptw.sourceforge.net/ptwe.html#Plugins","author":"Bram Chen (~PrinceTW)","twversion":"2.2","format":"Plugin","description":"A simple clock.","category":"Time and calendars"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"SinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.","category":"Aids for website visitors","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Creates a nice sitemap of your file's tiddlers.","category":"Searching and indexing tiddlers","twversion":"2.x","format":"Macro","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
An index of ~TiddlyWiki plugins and extensions
~SidebarPluginVault
http://tiddlyvault.tiddlyspot.com/
|borderless|k
|<html><div id="slantedmenu" padding:top:2em;><span style='font-weight:bold;white-space:nowrap;'><ul><li><a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('DefaultTiddlers').readBracketedList().reverse()); "><span title="Close all tiddlers and open Welcome" style="cursor:pointer">Home</span></a></li><li><span style="float:center;padding-left:0em;" title="Load this page in sidebar" style="cursor:help"><a href="#" target="_search">« Load</a></span></li><li><<toggleToolyBars "" "" hide>></li><li><<toggleTiddlersBar "" "" show>></li><li>[[Help|Help]]</li><br><li><<search>></li><li>[[options|Search]]</li><br><li>[[View|ViewTabs]]</li><li>{{remLink{<<newTiddler label:'add plugin' text:{{"<<formTiddler NewPluginTemplateInput\>\>"}} tag:"list">>}}}</li><li><<saveChanges>></li><li><<newTiddler>></li><li><span title='open sidebar tools for upload download advanced options'>[[Tools|MoreTools]]</li></span></li><br><li><<fontSize>></li></div></html>|
|borderless|k
|<<gradient vert #eee #eee #eee #eee #abf>><html><div id="slantedmenu" padding:top:2em;white-space:nowrap;align:center;"><span style='font-weight:normal;'><ul><li><a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('DefaultTiddlers').readBracketedList())"><span title="Close all tiddlers and go Home" style="cursor:pointer">Home</span></a></li><li><span style="float:center;padding-left:0em;" title="Load this page in sidebar" style="cursor:help"><a href="#" target="_search">« Load</a></span></li><li><<toggleToolyBars "" "" show>></li><li><<toggleTiddlersBar "" "" show>></li><li><span title='Help on using SideSnips'>[[Help|Help]]</span></li><br><li><<search>></li><li>[[?|Find]]</li><br><li><span title='view all tabs listed by category'>[[View|ViewTabs]]</span></li>&nbsp;<li><<newTiddler>></li>&nbsp;<li><<saveChanges>></li>&nbsp;<li><<newJournal "YYYY.0MM.0DD 0hh:0mm:0ss" "journal">></li>&nbsp;<li><span title='save changes, save as, upload/download'>[[Tools|MoreTools]]</span></li><br></li></div></html>>>|
/***
!!!<<tiddler RefreshStyles>>&nbsp;SlantedStyle/%==================================================%/
***/

/*Credits: Dynamic Drive CSS Library */
/*URL: http://www.dynamicdrive.com/style/ */

#slantedmenu{
  font-size: 95%;
  border-bottom: solid 1px #509;
  border-top: solid 0px #fcb;
}

#slantedmenu:after{ /*Add margin between menu and rest of content in Firefox*/
content: "."; 
display: block; 
height: 0; 
clear: both; 
visibility: hidden;
}

#slantedmenu ul{
text-indent: 10px;
padding: 7px 0;
margin: 0;
background-color: #ccc; 
border: 0px solid #f6f;
text-align: center; /*set value to "center" for example to center items*/
}

#slantedmenu ul li{
display: inline;
}

#slantedmenu ul li a{
font-weight: bold;
color: ##509;
padding: 3px 0;
padding-right: 5px;
padding-left: 5px;
margin: 0;
text-decoration: none;
}


#slantedmenu ul li a:hover{
color: #f00;
background:#fff;
}
<<formTiddler NewPluginTemplate>><data>{"description":"Generate a \"slice grid\" table to get an instant 'birds-eye' overview of your entire document. BETA - should be OK, but may contain bugs - use as your own risk","category":"Searching and indexing tiddlers","twversion":"2.1.3","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin turns a TiddlyWiki tiddler into a simple slide show type display. You can have looping, timed or themed slide shows. It should work in a way that does not interfere with TiddlyWiki. When you close the slide show you get back to your good old TW. This is joint work with Clint Checketts.","category":"Images and presentations","author":"Paulo Soares","link":"http://www.math.ist.utl.pt/~psoares/addons.html#Plugins","format":"Plugin","twversion":"2.1.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Menus and sliders","description":"A slider for ~TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Working with websites, incl IFrames","description":"Simple embedded IFRAME for specified URL with back/forward navigation."}</data>
<<formTiddler NewPluginTemplate>>
<<formTiddler NewPluginTemplate>><data>{"author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D","format":"Plugin","twversion":"--","category":"Formatting and viewing text","description":"Turn regular quotes into “curly quotes”. Or backslashify to get \"straight quotes\"."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jeremy Harper","link":"http://www.blogjones.com/TiddlyWikiTutorial.html#smiley","format":"Script","twversion":"--","category":"Icons","description":"The smiley images are embedded in the code and created 'on the fly."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This macro will produce links to most of the social bookmarking sites. These will allow for quick posting of the current tiddler.","category":"Working with websites, incl IFrames","twversion":"2.x","author":"Yann Perrin","link":"http://yann.perrin.googlepages.com/twkd.html","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This is the SocialtextFormatterPlugin, which allows you to insert Socialtext formated text into a TiddlyWiki.","category":"Working with other codes and formats","author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adaptor for moving and converting data to and from Socialtext Wikis.","category":"Working with other codes and formats","twversion":"2.2","format":"Plugin","link":"http://www.martinswiki.com","author":"Martin Budden"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","format":"Plugin","twversion":"2.0.11 and 2.1.x","category":"Tables","description":"Additional authors: Stuart Langridge, Demian Johnson.<br>This plugin provides live sorting of tables by clicking on a column header. To sort in reverse, click the same column header a second time. An arrow in the sort column shows the direction of sorting."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"FND","link":"http://www.tiddlywiki.com/coreplugins.html","format":"Plugin","twversion":"2.3.0","category":"Behind the scenes","description":"provides support for sparklines http://twhelp.tiddlyspot.com/#Sparklines"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"? (VisualTW)","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Plugin","twversion":"2.2","category":"Searching and indexing tiddlers","description":"Display menus to browse through tiddler links and references."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Plugin","twversion":"2.08","category":"Aids for website visitors","description":"Provides a simple splash screen that is visible while the TW is loading."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Statistics"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"category":"Behind the scenes","description":"No clue what this does. Comes from a Russian site. I'm assuming it gives you statistics for a tiddler or for the file.","author":"Unknown","link":"http://fire.atspace.org/","format":"Macro","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Keep just two tiddlers open a time, the one you clicked on and the one containing the link you just clicked.","category":"Searching and indexing tiddlers","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"2.x"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This is a simple plugin and a macro that allow you to set an arbitrary and permanent modified date to a Tiddler.","category":"Tiddler manipulation","twversion":"2.x","format":"Plugin","author":"Rodrigo Fonseca","link":"http://paularodrigo.homeip.net/stickydate.html#StickyDatePlugin"}</data>
/***
!!!&nbsp;~StyleSheet/%==================================================%/
***/
/*{{{*/

.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a, .popup li a:visited {color:#090; border: none;}

body {background:#fff;
font-size:0.75em;}

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;margin-bottom:0.12em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}



p.first-line 
{
color: #ff0000;
font-variant: small-caps
}

.txtMainTab .tabContents #tiddlertimeline li {list-style:none;}
.popup li {list-style:none;}

.header {position:relative; height:60px;}
.header a:hover {background:transparent;}
/*.headerShadow {position: relative;padding: 0em 0em 0em 1em;left: 0px; top: 0px;}
.headerForeground {position:absolute;padding:0.0em 0em 1em 1em; left:0px; top:0px;}*/

.title {
	color:#c06;
        font-variant:small-caps;
        font-size:1.4em;
        font-weight:normal; 
        padding-top: 0em;
        padding-left: 0.65em;
}

.editorFooter a {color:#f00;}
.editorFooter a:hover {color:#f00;background:#0cc;}

/*}}}*/
/***
!!!&nbsp;Viewer/%==================================================%/
***/
/*{{{*/

.viewer {
      
        padding-left: 0em;
        padding-right: 0em;
	padding-top: 0.0em;
        
}

.viewer a {
color:#509;
padding-left:2px;
padding-right:2px;
text-decoration:none;
}

.viewer a:hover {
	background: #fff;
	color: #f00;
}

.viewer hr {
	border: 0px;
	border-top: solid 1px #c06;
	color: #c06;
}

.viewer .tabSelected {

        background:url("http://img258.imageshack.us/img258/8210/selectedbuttonbggi0.gif") repeat-x top left;top left;
        background-color:#fcb;
        font-size:0.95em;
        font-weight:bold;
        color:#a00;
	text-decoration:none;
        border: 1px1px 0px 1px solid #999;
         -moz-border-radius : 0.4em 0.4em 0 0;
       
}


        .viewer .tabUnselected {
        background:url("http://img520.imageshack.us/img520/8688/mainmenugray7ef.gif") repeat-x top left;top left;
        background-color:#eee;
        font-size:0.95em;
        font-weight:bold;
	color:#008;
        text-decoration:none;
        border:#000;
        border-left: 1px solid #999;
	border-top: 1px solid #999;
	border-right: 1px solid #999;
        -moz-border-radius : 0.4em 0.4em 0 0;

}

.viewer .button {
	border: 0px solid #fff;
}


.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:#0cc;}

.viewer blockquote {
	border-left: 1px solid #c06;
}

.viewer tr.oddRow { background-color: #eaeaea;}
.viewer tr.evenRow { background-color:#fff; } 


.viewer {
background:#fff;
        padding-left: 0.5em;
        padding-right: 0.5em;
	padding-top: 0.5em;
     
}


.button {
	border: 0px solid #fff;
}

.textleft { display:block;text-align:left; }
.textleftM { display:block;text-align:left; margin:0;padding:0;border:0;margin-left:.95em; }

.textright { display:block;text-align:right; }
.textcenter { display:block;text-align:center; }
.textjustify { display:block;text-align:justify; }
.textindent { display:block;margin:0;padding:0;border:0;margin-left:2em; }



.whiteLink a { color: #fff;
font-weight:normal; } 
.unboldlink a {font-weight:normal;}
.twLink a { color: #090;
font-weight:normal; }
.locLink a { color: #c06;
font-weight:normal; }
.remLink a { color: #c90;
font-weight:normal; } 

.floatleft{ float:left; }
.floatright{ float:right; }

.firstletter{ float:left; width:0.40em; font-size:400%; font-family:times,arial; line-height:90%; }

#tiddlerTheBath img {
    border: 5px double #999;
    margin: 4px;} 

.toolbar {
 color: #fff;
}

.selected .toolbar a {
 color: #000;
}

.selected .toolbar a:hover {
 background: #ffd /*#ef9*/;
 color: #F00;
}


/***
!!!&nbsp;Nested Style Sheets/%==================================================%/
***/

/*}}}*/

[[ButtonStyle]]
[[CustomCSS]]
[[SlantedStyle]]
[[BackstageCSS]]
[[StyleSheetTiddlersBar]]
[[WebStyleSheet]]
[[CenterBoxCSS]]
[[WebPageTLCF]]
[[PageCSS]]
[[PresentCSS]]
[[SDCSS]]
[[HTMLStructureTwoColumnCSS]]
[[TabsCSS]]

/*{{{*/

/***
!!!&nbsp;Nested Style Sheets/%==================================================%/
***/
#messageArea {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryMid]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::SecondaryLight]]; background:[[ColorPalette::Secondarymid]]; border:none;}

#messageArea { 
  background-color: #509; 
  border-color: #fab;
  color:#fff; 
  border-width: 4px; 
  border-style: dotted; 
  font-size: 90%; 
  padding: 0.5em; 
margin-right:2em;
  -moz-border-radius: 1em; }
#messageArea a {color:#ffc;}
#messageArea .button { color:#fff;text-decoration:none; font-weight:bold; background:transparent; border:0px; }
#messageArea .button:hover {background: #F00; }


#tiddlerDisplay {padding-right:0em; padding-left:0em;margin:auto;}

.header {display:none;}
#sidebar{display:none;}
#mainMenu{display:none;}

.header {display:none;}
#sidebar{display:none;}
#mainMenu{display:none;}
#tiddlerDisplay {margin:0em 0em 0em 0em !important;padding:0em 0em 0em 0em !important;}
#contentWrapper  {margin:0em 0em 0em 0em !important;padding:0em 0em 0em 0em !important;}
#displayArea {margin:0em -0.5em 0em -0.5em !important;padding:0em 0em 0em 0em !iimportant;}

.button {color: #509;}
.button:hover {color: #509;}
.button:active {color: #509;}
a:visited {color: #509;}

/*}}}*/

<<formTiddler NewPluginTemplate>><data>{"description":"An assortment of CSS overlay to extend/enhance the TiddlyWiki default shadowed stylesheets.","category":"Themes","twversion":"2.1","format":"Theme","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com"}</data>
/*{{{*/
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]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Theme","twversion":"2.1","category":"Themes","description":"The following CSS declarations modify default style classes defined by various plugins and scripts, and/or used in customized Page/View/Edit templates."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Formatting and viewing text","description":"CSS classes for common formatting, alignment, boxes, tables, etc.","twversion":"2.1","format":"Other","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
!!!StyleSheetTiddlersBar

#tiddlersBar .button {border:1px; color:#000;}
#tiddlersBar .tab {white-space:nowrap;}
#tiddlersBar {padding : 0.5em 0.5em 0.0em 1.0em;margin-left:0em;margin-right:0em}
#tiddlersBar {margin-bottom:0px;}

.tabSelected .button:hover {font-size:0.95em;font-weight:bold;color: #f00;background: #fff;padding : 0px 0px 0px 2px;}
.tabUnselected .button:hover {font-size:0.95em;color: #f00;background: #fff; padding : 0px 0px 0px 2px;}

.tabUnselected .button {font-size:0.95em;font-weight:bold;color: #008; padding : 0px 0px 0px 2px;}
.tabSelected .button {font-size:0.95em;font-weight:bold;color: #008;padding : 0px 0px 0px 2px;}

.tabUnselected {
background:url("http://img520.imageshack.us/img520/8688/mainmenugray7ef.gif") repeat-x top left;top left;
background-color:#eee;
border:1px #eee solid; border-bottom:0px;font-size:0.95em; }


.tabSelected {
background:url("http://img258.imageshack.us/img258/8210/selectedbuttonbggi0.gif") repeat-x top left;top left;
background-color:#fcb;
color: #a00;border: 1px #c06 solid;border-bottom:0px; font-size:0.95em;}

.tabUnselected .tabButton {font-weight:bold;font-size:0.75em;color:#333;background:transparent; padding : 0px 2px 0px 2px; margin: 0 0 0 1px;}
.tabSelected .tabButton {font-weight:bold;font-size:0.75em;color:#000;background:transparent;padding : 0px 2px 0px 2px; margin: 0 0 0 1px;}

.tabSelected .tabButton:hover {font-weight:bold;color: #f00;background: #fff;}
.tabUnselected .tabButton:hover {font-weight:bold;color: #f00;background: #fff;}

.tiddler, .tabContents {border-top:0px #fa0 solid;margin-left:0.5em;margin-right:0.5em;}
#tiddlersBar .tab {-moz-border-radius : 0.4em 0.4em 0 0;}
#tiddlersBar  {background:#abf;line-height: 1.45em;}
#tiddlersBar  {background: url("http://img299.imageshack.us/img299/9844/vaulttabbarbgvc6.gif"); background-repeat: repeat;line-height: 1.45em;}


.tiddlerDisplay {margin-top:2.0em;margin-right:1em;}





<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Other style changes","description":"TidIDE: define and apply CSS \"on the fly\"."}</data>
!!!!![[Styling]]
@@color:#C06;''&raquo; &raquo;'' @@   Tabs containing CSS styling code (controls layout and visual style)
----
<script>
// get all tiddlers tagged with "css"
var tids=store.getTaggedTiddlers("css");
// keep only tiddlers *also* tagged with New
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("css")) list.push(tids[t]);
// create output list of tiddler titles, one per line
var out="";
for (var t=0; t<list.length; t++) out+="#[["+list[t].title+"]]\n";
return out;
</script> 
<<formTiddler NewPluginTemplate>><data>{"description":"Reloads the current document in safe mode and reset all shadow tiddlers.","category":"Security","twversion":"2.0","format":"Bookmarklet","link":"http://lewcid.org/tiddlywiki-bookmarklets/","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Suppress tagged box when tiddler is untagged.","category":"Tagging","twversion":"2.1","format":"Plugin","author":"FND","link":"http://devpad.tiddlyspot.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"FND","link":"http://devpad.tiddlyspot.com","format":"Plugin","twversion":"2.1","category":"Tiddler manipulation","description":"Suppress tagged box when tiddler is untagged."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Working with files and programs","format":"Plugin","description":"Synchronizes your entire ~TiddlyWiki with the Notes in your Outlook program.","twversion":"2.1","link":"http://syncoutlooknotes.tiddlyspot.com/#SyncOutlookNotes","author":"Mike Miller"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin lets you synchronize tiddlers with dfwiki pages of a moodle 1.6.X with the nwiki module installed. That is, exporting or importing from a moodle server depending on the last modification date, just by pressing a button.","category":"Working with websites, incl IFrames","author":"Oriol Nieto , Alejandro Moreno, Dídac Calventus & Ludo (Marc Alier)","link":"http://moodle.tiddlyspot.com/","format":"Plugin","twversion":"2.1.2"}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.0.0","format":"Plugin","link":"http://bob.mcelrath.org/plugins.html#systemConfig","author":"Bob McElrath (Bob's)","category":"Scientific and mathematical notation","description":"Performs syntax highlighting on CSS, JavaScript, and HTML/XML."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Add support for Haskell syntax highlighting, as an extension to SyntaxifyPlugin.","author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D","format":"Plugin","twversion":"--","category":"Working with other codes and formats"}</data>
@@color:#C06;''&raquo; &raquo;'' @@ Tabs with reserved names (can be 'over-written' with Tabs of the same name making the originals silent; but, they remain unchanged in the core code)
----
[[nonotesViewTemplate]]
<<list shadowed>>
^^Search Adapter Compliments of http://twhelp.tiddlyspot.com^^

|>|bgcolor(#eaeaea):@@color(#509):''20 tiddlers found matching /mg/''@@|bgcolor(#509):  @@color(#fff): TW ver: <<version>>@@ |
|>|>|bgcolor(#eaeaea):@@color(#509):<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold @@|

|bgcolor(#509):&nbsp;|bgcolor(#509): @@color(#fff):''Titles''@@ |bgcolor(#509): @@color(#fff): ''Size''@@ |bgcolor(#509): @@color(#fff): ''Tags''@@ |h
| 1|[[BetterTimelineMacroMG]]| 4756|@@systemConfig@@|
| 2|[[ButtonStyle]]| 912|@@css,system@@|
| 3|[[ConfigOptionsMacroMG]]| 3518|@@systemConfig@@|
| 4|[[CustomCSS]]| 9441|@@css,system@@|
| 5|[[DataTiddlerPluginMG]]| 25626|@@UdoBorkowski,systemConfig@@|
| 6|[[ForEachTiddlerPluginMG]]| 26375|@@systemConfig@@|
| 7|[[GotoPluginMG]]| 7577|@@systemConfig@@|
| 8|[[HTMLFormattingPlugin]]| 9964|@@systemConfig@@|
| 9|[[HelpIntro]]| 6004|@@@@|
| 10|[[Index]]| 856|@@killbookmark,msgray@@|
| 11|[[LegacyStrikeThroughPlugin]]| 769|@@systemConfig@@|
| 12|[[RolloverPlugin]]| 687|@@list@@|
| 13|[[SaveAsPluginMG]]| 4515|@@systemConfig@@|
| 14|[[StyleSheet]]| 5555|@@css@@|
| 15|[[StyleSheetColors]]| 8510|@@@@|
| 16|[[StyleSheetTiddlersBar]]| 1931|@@css,system@@|
| 17|[[TabsCSS]]| 810|@@css@@|
| 18|[[TiddlerNotesPluginMG]]| 8010|@@systemConfig@@|
| 19|[[TiddlersBarPluginMG]]| 9392|@@systemConfig@@|
| 20|[[Welcome]]| 1547|@@Welcome@@|
|>|>|bgcolor:#509;@@color:#fcf;&nbsp;&nbsp;  ~PathFinder Compliments of {{twhelpLink{[[http://twhelp.tiddlyspot.com|http://twhelp.tiddlyspot.com]]}}}@@|
|>|bgcolor(#eaeaea):@@color(#509):''Find tiddlers matching ?''@@|@@color(#509): This TW=ver: <<version>>@@ |
|>|>|bgcolor(#eaeaea):@@color(#509):<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold @@|
|{{scroll{<<slider "PathFinder" "ByFilesExcluded" "Files Excluded" "tooltip">>}}}|>|>|
|>|>|>|line-height:17pt;<<search>> |
|>|>|{{unboldlink{[[ look for in|TWHelpPathFinder]]}}} |>|>|
| <<option chkSearchTitles>> | <<option chkSearchText>> | <<option chkSearchTags>> | <<option chkHoldSearches>> |
| titles |  text  | tags | hold|
|borderlessL|k
/*{{{*/
#tiddlerTWHelp-SearchResults .viewer table {
border: 1px solid #006;
line-height:90% !important;
}

#tiddlerTWHelp-SearchResults .viewer td, .viewer tr,.viewer caption{
        border: 1px solid #F6F;
	padding: 5px;
        vertical-align:top; 
     
}

#tiddlerTWHelp-SearchResults .viewer th{
        border: 1px solid #000;
	padding: 5px;
        vertical-align:top;
}


#tiddlerTWHelp-SearchResults .viewer {
        background-color:#fdf;
        overflow: auto;
        border:1px solid #509;
        padding-left: 1em;
        padding-right: 1em;
	padding-top: 0.5em;
        -moz-border-radius: 1em;
}

.viewer tr.oddRow { background-color:#eaeaea; }
.viewer tr.evenRow { background-color:#fff; } 

.unboldlink a {font-weight:normal;}

.scroll{overflow: auto}

.borderlessL, .borderlessL table, .borderlessL td, .borderlessL tr, .borderlessL th, .borderlessL tbody
	{ line-height:75% !important; border:0 !important; margin:0 !important; padding:0px !important; td.vertical-align:top !important;margin-left: 0 !important; margin-right: auto !important;}

/*}}}*/
<<formTiddler NewPluginTemplate>><data>{"description":"Adaptor for moving and converting data to and from TWikis.","category":"Working with other codes and formats","twversion":"2.2","format":"Plugin","link":"http://www.martinswiki.com","author":"Martin Budden"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.3","category":"Working with other codes and formats","description":"This the TWikiFormatterPlugin, which allows you to insert TWiki formated text into a TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Plugin","twversion":"2.x","category":"Tabbed folders","description":"Easier tab editing - double click on a tab to edit source tiddler."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Tabbed folders"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Macro for highlighting elements on mouse-over (hover).","format":"Macro","twversion":"2.1","category":"Tables","author":"FND","link":"http://devpad.tiddlyspot.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Searching and indexing tiddlers","description":"When there are many tiddlers in a document, the standard 'tabbed list of tiddlers' in the right-hand sidebar can become very long, occupying a lot of page space and requiring a lot scrolling in order to locate and select a tiddler.<br><br>The TableOfContentsPlugin addresses this problem by replacing the standard tabbed list display with a single listbox/droplist control that uses a very small amount of page space, regardless of the number of tiddlers in the document."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","twversion":"2.0","format":"Plugin","category":"Tables","description":"Dynamically sort tables by clicking on column headers."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Tables"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
.viewer .tabSelected {

        background:url("http://img258.imageshack.us/img258/8210/selectedbuttonbggi0.gif") repeat-x top left;top left;
        background-color:#fcb;
        font-size:0.95em;
        font-weight:bold;
        color:#a00;
	text-decoration:none;
        border: 1px1px 0px 1px solid #999;
         -moz-border-radius : 0.4em 0.4em 0 0;
       
}



        .viewer .tabUnselected {
        background:url("http://img520.imageshack.us/img520/8688/mainmenugray7ef.gif") repeat-x top left;top left;
        background-color:#eee;
        font-size:0.95em;
        font-weight:bold;
	color:#008;
        text-decoration:none;
        border:#000;
        border-left: 1px solid #999;
	border-top: 1px solid #999;
	border-right: 1px solid #999;
        -moz-border-radius : 0.4em 0.4em 0 0;

}
 @@color:#C06;''&raquo; &raquo;'' @@ ''Click on the tabs above to view''
----
*''AllTabs''  @@color:#C06;''&raquo; &raquo;'' @@ All tabs in alphabetical order
*''[[History]]''  @@color:#C06;''&raquo; &raquo;'' @@ Tabs with history of activity in reverse date order
* [[SystemTabs]] @@color:#C06;''&raquo; &raquo;'' @@ Tabs with reserved names (can be 'on top' appended but not changed)
*[[Programs]]  @@color:#C06;''&raquo; &raquo;'' @@  Tabs containing programs written in ~JavaScript (if tagged as systemConfig begin running a startup.)
*[[Styling]]  @@color:#C06;''&raquo; &raquo;'' @@ Tabs containing CSS styling code (controls layout and visual style)
*ExcludedFromSearches  @@color:#C06;''&raquo; &raquo;'' @@ Tabs not required (or desired) in searches
*ExcludedFromLists  @@color:#C06;''&raquo; &raquo;'' @@ Tabs not required (or desired) in lists
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"2.x","category":"Tagging","description":"Not sure what this does. Simon's example claims to flip tiddlers upsidedown based on an upsidedown tag, but it didn't work for me. Illumine us, Simon?"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Clint Checketts","link":"http://tiddlystyles.com","format":"Plugin","twversion":"2.1","category":"Tagging","description":"Visual representation of tags."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Generate a cross-referenced grid of tiddlers, based on tag values","category":"Tagging","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Behind the scenes","description":"Doesn't do anything except provide functions for use in other plugins.","twversion":"2.x","format":"Plugin","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","twversion":"2.1","category":"Tagging","description":"Use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values"}</data>
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Version|1.1.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|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|

The core function, "story.chooseTemplateForTiddler(title,template)" is essentially a "pass-thru" that returns the same template it was given, and is provided by the core so that plugins can customize the template selection logic to select alternative templates, based on whatever programmatic criteria is appropriate.  This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.'' 
!!!!!Usage
<<<
Each alternative template is associated with a specific tiddler tag value by using that tag value as a prefix added to the standard TiddlyWiki template titles, [[ViewTemplate]] and [[EditTemplate]].

For example, any tiddlers that are tagged with ''<<tag media>>'' will look for alternative templates named [[mediaViewTemplate]] and [[mediaEditTemplate]].  Additionally, in order to find templates that have proper WikiWord tiddler titles (e.g., [[MediaViewTemplate]] and [[MediaEditTemplate]]), the plugin will also attempt to use a capitalized form of the tag value (e.g., ''Media'') as a prefix.  //This capitalization is for comparison purposes only and will not alter the actual tag values that are stored in the tiddler.//

If no matching alternative template can be found by using //any// of the tiddler's tags (either "as-is" or capitalized), the tiddler defaults to using the appropriate standard [[ViewTemplate]] or [[EditTemplate]] definition.

''To add your own custom templates:''
>First, decide upon a suitable tag keyword to uniquely identify your custom templates and create custom view and/or edit templates using that keyword as a prefix (e.g., "KeywordViewTemplate" and "KeywordEditTemplate").  Then, simply create a tiddler and tag it with your chosen keyword... that's it!  As long as the tiddler is tagged with your keyword, it will be displayed using the corresponding alternative templates.  If you remove the tag or rename/delete the alternative templates, the tiddler will revert to using the standard viewing and editing templates.
<<<
!!!!!Examples
<<<
|Sample tiddler| tag | view template | edit template |
|[[MediaSample - QuickTime]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[MediaSample - Windows]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[CDSample]]| <<tag CD>> | [[CDViewTemplate]] | [[CDEditTemplate]] |
|<<newTiddler label:"create new task..." title:SampleTask tag:task text:"Type some text and then press DONE to view the task controls">> | <<tag task>> | [[TaskViewTemplate]] | [[EditTemplate]] |

//(note: if these samples are not present in your document, please visit// http://www.TiddlyTools.com/ //to view these sample tiddlers on-line)//
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
[[WikifyPlugin]]
<<<
!!!!!Revision History
<<<
''2007.06.23 [1.1.0]'' re-written to use automatic 'tag prefix' search instead of hard coded check for each tag.  Allows new custom tags to be used without requiring code changes to this plugin.
''2007.06.11 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by Eric L Shulman / ELS Design Studios
<<<
!!!!!Code
***/
//{{{
version.extensions.taggedTemplate= {major: 1, minor: 1, revision: 0, date: new Date(2007,6,18)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// get default template from core
	var template=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);

	// if the tiddler to be rendered doesn't exist yet, just return core result
	var tiddler=store.getTiddler(title); if (!tiddler) return template;

	// look for template whose prefix matches a tag on this tiddler
	for (t=0; t<tiddler.tags.length; t++) {
		var tag=tiddler.tags[t];
		if (store.tiddlerExists(tag+template)) { template=tag+template; break; }
		// try capitalized tag (to match WikiWord template titles)
		var cap=tag.substr(0,1).toUpperCase()+tag.substr(1);
		if (store.tiddlerExists(cap+template)) { template=cap+template; break; }
	}

	return template;
}
//}}}
<<formTiddler NewPluginTemplate>><data>{"description":"Dropdown toggling and management of tiddler tags, your all-in-one plugin for tags","category":"Tagging","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)","twversion":"2.0.8 or better"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Tagging"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"2.x","category":"Tagging","description":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Clint Checketts","link":"http://tiddlystyles.com","format":"Macro","twversion":"--","category":"Tagging","description":"The other tag cloud option from Clint Checketts."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Tagging","author":"Simon Baird (~MonkeyPirate)","twversion":"2.2.1","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","description":"A wonderful tagging plugin that is easier played with than described.","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"? (VisualTW)\\n","link":"http://visualtw.ouvaton.org/VisualTW.html#TagsTreePlugin\\n","twversion":"--","category":"Menus and sliders\\n","description":"Displays tags hierachy as a tree of tagged tiddlers.\nCan be used to create dynamic outline navigation."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Luke Blanshard","link":"http://labwiki.sourceforge.net/","format":"Macro","twversion":"--","description":"The TaskMacroPlugin is a TiddlyWiki plugin that contains macros for managing detailed lists of tasks, especially helpful for work like developing software.<br><br>* The <<task>> macro describes a single task and tracks the time estimated and spent on it.<br><br>* The <<taskadder>> macro provides a box to type into, to simplify the adding of new tasks.<br><br>* The <<tasksum>> macro summarizes a set of tasks to show how much time has been spent and how much time remains to complete them."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin creates a simple task manager with a variable number of tasks' categories. The management of categories and tasks has been automated. There's also some integration with theReminderMacros.<br>This is based on previous work by Jim Barr at http://tiddlywikitips.com/TiddlyWikiTasks.html. (Requires various other plugins to work)","category":"Forms and databases","author":"Paulo Soares","link":"http://www.math.ist.utl.pt/~psoares/addons.html#Plugins","format":"Plugin","twversion":"2.1.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"'Timer' button automatically writes start/end/elapsed time into tiddler content.","category":"Time and calendars","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin replaces the content of the tag popup with the one from TagToolTemplate (a new shadowTiddler). It allows for quick and easy modification of this popup content (including some batchTagTools macros for example).","category":"Tagging","twversion":"2.x","format":"Plugin","link":"http://yann.perrin.googlepages.com/twkd.html","author":"Yann Perrin"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Saving and reviewing changes","description":"When the TW document is saved (either to local disk or remote URL), any tiddlers tagged with \"temporary\" will be skipped over, so that they are not written to the file. To keep a temporary tiddler, simply edit it and remove the tag before saving the file. This feature can be combined with various plugins that can automatically create new tiddlers, such as SearchOptionsPlugin (SearchResults) and ImportTiddlersPlugin (ImportedTiddlers) so that these transient results are not retained when you save you document.","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","twversion":"--","category":"Working with other codes and formats","description":"Enter any javascript reference and click eval to get its value.","author":"Greg Walker","link":"http://gwsyzygy.googlepages.com/creator.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","description":"Adds extra keyboard functions to the standard textarea control in the tiddler editor.","category":"Working with keyboards"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Alternative stylesheet theme: stone/parchment backgrounds.","category":"Themes","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Theme"}</data>
The first place to go for ~TiddlyWiki themes is [[TiddlyThemes|http://www.tiddlythemes.com]] by Saq Imtiaz. ~TiddlyThemes has a large collection of themes, with instructions on how to install them. What follows is a collection of themes found in other locations.
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Themes"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<script>
if (!window.story) window.story=window;
var url=store.getTiddlerText("SiteUrl");
var title=story.findContainingTiddler(place).id.substr(7);
var permalink=encodeURIComponent(String.encodeTiddlyLink(title));
return "[img[Right click to Bookmark or Copy this tiddler Location|http://img117.imageshack.us/img117/6453/socialbookmarkiconcb4.gif]["+url+"#"+permalink+"]]";
</script>
<<formTiddler NewPluginTemplate>><data>{"description":"Use default stylesheet with alternative TidIDE templates.","category":"Themes","twversion":"2.1","format":"Theme","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Tiddler manipulation"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Keeps the tiddlers display looking fresh by opening new tiddlers at the top of the page. This keeps toolbars and menus accessible at all times, while allowing for multiple tiddlers to be open.","format":"Plugin","twversion":"--","author":"Walt Woods","link":"http://oregonstate.edu/~woodswa/tiddlywikiplugs.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.2","category":"Security","author":"Lyall Pearce","link":"http://remotely-helpful.com/TiddlyWiki/TiddlerEncryptionPlugin.html#TiddlerEncryptionPlugin","description":"Encrypt your data to hide it from prying eyes.<br>You decide which tiddlers to encrypt. Once, some or all.<br>You decide what password to use by simply tagging a tiddler with Encrypt(prompt)<br>where prompt is a word or sentence that will remind you of what the password is.<br>All tiddlers tagged with the same Encrypt(prompt) tag will be encrypted using the same password.<br>You are prompted for the password only when you are about to display the tiddler, not when you open your tiddlywiki.<br>Once you have entered the password, it will be re-used until you re-load your tiddlywiki.<br>Tiddlers are encrypted on save. At no point is a tiddler kept in the file in an unencrypted form.<br>Make sure you enter the same password for new tiddlers tagged with an existing prompt, things get confusing if you have multiple passwords with the same prompt! Whilst a tiddler is encrypted, it is not searchable - although that is an option.<br>A handy Macro is supplied which gives you a button to decrypted all encrypted tiddlers at once. If you forget the password, forget your data - there is no way back.<br>If you get the password wrong, you will not lose your data - the plugin knows if you get it wrong - it does not decrypt with the wrong password, leaving you with corrupt data."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Define groups of tiddlers and display an entire group or navigate between tiddlers with first/previous/next/last.","category":"Searching and indexing tiddlers","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Icons","description":"Display icons next to tiddler title, based on tiddler's attributes (tags, fields, slices, etc)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"The TiddlerListMacro lists tiddlers with SQL-Like features: <br>* List tiddlers containing a word in the title or text (case-sensitive),<br>* List tiddlers tagged with given tags or exclude certain tags,<br>* Ascending and descending sorting of single fields,<br>* Limit number of tiddlers displayed,<br>* Specify different HTML formats for the lists,<br>* Grouping of items in a list,<br>* Customizable wiki templates,<br>* Numbering and totals","category":"Searching and indexing tiddlers","twversion":"--","format":"Macro","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Plugin","twversion":"2.0","category":"Tagging","description":"Allows you to add notes to a tiddler without needing to modify the original tiddler."}</data>
/***
|''Name:''|TiddlerNotesPlugin|
|''Description:''|Add notes to tiddlers without modifying the original content|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TiddlerNotesPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.1|
|''Date:''|26/10/07|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|

!!Concept:
*The TiddlerNotesPlugin allows you to add notes to tiddlers, without needing to edit the original tiddler. This means that your original content will remain unaltered, and if you update it in the future, you won’t lose your notes. Notes are stored in separate tiddlers, but can be viewed and edited from within the original tiddler.
*For a tiddler titled "~MySlide", the notes are by default saved in a tiddler titled "~MySlide-Notes" and is given a tag of "Notes". The suffix and tags of the notes tiddlers are customizable. You can have one or multiple notes per tiddlers. So it is possible to have for example, teacher's notes and student's notes in the same file.
*Notes can be configured to start off blank, or pre-filled with the contents of the original tiddler.

!!Usage:
*{{{<<notes>>}}} is the simplest usage form.
* additional optional parameters include:
**{{{heading:}}} the heading to use for the notes box
**{{{tag:}}} the tag to be given to the notes tiddler
**{{{suffix:}}} the suffix to be used when naming the notes tiddler
* a full macro call could look like: {{{<<notes heading:"My Notes" tag:"NoteTiddlers" suffix:"Comments">>}}}
* To avoid adding {{{<<notes>>}}} to each tiddler you want notes for, you could add the macro call to the ViewTemplate
** below the line {{{<div class='viewer' macro='view text wikified'></div>}}} add the following line: <br> {{{<div class='viewer' macro='notes'></div>}}}
** Used in combination with the ~HideWhenPlugin or ~PublisherPlugin, you could have notes be shown only for tiddlers with specific tags. The ~PublisherPlugin would allow you for instance to only have the ~TeachersNotes visible to the teacher, and the ~StudentsNotes for the same tiddler visible to the Student.

!!Configuration
*<<option chkPrefillNotes>> Enable to pre-fill notes with the original tiddler's contents

!!Demo:
* [[MySlide]]

***/
// /%
//!BEGIN-PLUGIN-CODE

if (!config.options.chkPrefillNotes)
	config.options.chkPrefillNotes = false;
	
function createTiddlyElement(theParent,theElement,theID,theClass,theText,attribs)
{
	var e = document.createElement(theElement);
	if(theClass != null)
		e.className = theClass;
	if(theID != null)
		e.setAttribute("id",theID);
	if(theText != null)
		e.appendChild(document.createTextNode(theText));
	if(attribs){
		for(var n in attribs){
			e.setAttribute(n,attribs[n]);
		}
	}
	if(theParent != null)
		theParent.appendChild(e);
	return e;
}

function createTiddlyButton(theParent,theText,theTooltip,theAction,theClass,theId,theAccessKey,attribs)
{
	var theButton = document.createElement("a");
	if(theAction) {
		theButton.onclick = theAction;
		theButton.setAttribute("href","javascript:;");
	}
	if(theTooltip)
		theButton.setAttribute("title",theTooltip);
	if(theText)
		theButton.appendChild(document.createTextNode(theText));
	if(theClass)
		theButton.className = theClass;
	else
		theButton.className = "button";
	if(theId)
		theButton.id = theId;
	if(attribs){
		for(var n in attribs){
			e.setAttribute(n,attribs[n]);
		}
	}
	if(theParent)
		theParent.appendChild(theButton);
	if(theAccessKey)
		theButton.setAttribute("accessKey",theAccessKey);
	return theButton;
}

config.macros.notes={
	
	cancelWarning: "Are you sure you want to abandon changes to your notes for '%0'?",
	editLabel: "edit notes",
	editTitle: "double click to edit",
	saveLabel: "save notes",
	saveTitle: "double click to save",
	cancelLabel: "cancel",
	heading: "Notes",
	suffix: "Notes",
	tag: "Notes",
	
	saveNotes: function(ev){
		e = ev? ev : window.event;
		var theTarget = resolveTarget(e);
		if (theTarget.nodeName.toLowerCase() == "textarea")
			return false;
		var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");
		story.setDirty(title,false);
		var box = document.getElementById("notesContainer"+title);
		var textarea = document.getElementById("notesTextArea"+title);
		if(textarea.getAttribute("oldText")!=textarea.value && !hasClass(theTarget,"cancelNotesButton")){
			var suffix = box.getAttribute("suffix");
			var t = store.getTiddler(title+"-"+suffix);
			store.saveTiddler(title+"-"+suffix,title+"-"+suffix,textarea.value,config.options.txtUserName,new Date(),t?t.tags:box.getAttribute("tag"),t?t.fields:{});
		}
		story.refreshTiddler(title,1,true);
		autoSaveChanges(true);
		return false;
	},
	
	editNotes: function(box,tiddler){
		removeChildren(box);
		story.setDirty(tiddler,true);
		box.title = this.saveTitle;
		box.ondblclick = this.saveNotes;
		createTiddlyButton(box,this.cancelLabel,this.cancelLabel,this.saveNotes,"cancelNotesButton");
		createTiddlyButton(box,this.saveLabel,this.saveLabel,this.saveNotes,"saveNotesButton");
		wikify("!!"+box.getAttribute("heading")+"\n",box);
		addClass(box,"editor");
		var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
		var wrapper2 = createTiddlyElement(wrapper1,"div");
		var e = createTiddlyElement(wrapper2,"textarea","notesTextArea"+tiddler);
		var v = store.getValue(tiddler+"-"+box.getAttribute("suffix"),"text");
		if(!v) 
			v = config.options.chkPrefillNotes? store.getValue(tiddler,"text"):'';
		e.value = v;
		e.setAttribute("oldText",v);
		var rows = 10;
		var lines = v.match(/\n/mg);
		var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);
		if(lines != null && lines.length > rows)
			rows = lines.length + 5;
		rows = Math.min(rows,maxLines);
		e.setAttribute("rows",rows);
		box.appendChild(wrapper1);
	},
	
	editNotesButtonOnclick: function(e){
		var title = story.findContainingTiddler(this).getAttribute("tiddler");
		var box = document.getElementById("notesContainer"+title);
		config.macros.notes.editNotes(box,title);
		return false;
	},
	
	ondblclick : function(ev){
		e = ev? ev : window.event;
		var theTarget = resolveTarget(e);
		var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");
		var box = document.getElementById("notesContainer"+title);
		config.macros.notes.editNotes(box,title);
		e.cancelBubble = true;
		if(e.stopPropagation) e.stopPropagation();
		return false;
	},
	
	handler : function(place,macroName,params,wikifier,paramString,tiddler){
		
		params = paramString.parseParams("anon",null,true,false,false);
		var heading = getParam(params,"heading",this.heading);
		var tag = getParam(params,"tag",this.tag);
		var suffix = getParam(params,"suffix",this.suffix);
		var box = createTiddlyElement(place,"div","notesContainer"+tiddler.title,"TiddlerNotes",null,{"source":tiddler.title,params:paramString,heading:heading,tag:tag,suffix:suffix});
		createTiddlyButton(box,this.editLabel,this.editLabel,this.editNotesButtonOnclick,"editNotesButton");
		wikify("!!"+heading+"\n",box);
		box.title=this.editTitle;
		box.ondblclick = this.ondblclick;
		wikify("<<tiddler [["+tiddler.title+"-"+suffix+"]]>>",box);
	}		
};

Story.prototype.old_notes_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function(title,animate,unused){
	if(story.isDirty(title)) {
		if(!confirm(config.macros.notes.cancelWarning.format([title])))
			return false;
	}
	return this.old_notes_closeTiddler.apply(this,arguments);
}

setStylesheet(".TiddlerNotes {\n"+ " background:#eee;\n"+ " border:1px solid #ccc;\n"+ " padding:3px;\n"+ " margin:15px;\n"+ "}\n"+ "\n"+ ".cancelNotesButton,.editNotesButton, .saveNotesButton {\n"+ " float:right;\n"+ " border:1px solid #ccc;\n"+ " padding:2px 5px;\n"+ "}\n"+ "\n"+ ".saveNotesButton{\n"+ " margin-right:0.5em;\n"+ "}\n"+ "\n"+ ".TiddlerNotes.editor textarea{\n"+ " border:1px solid #ccc;\n"+ "}","NotesPluginStyles");
//!END-PLUGIN-CODE
// %/
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","category":"Security","format":"Plugin","twversion":"2.1","description":"Block viewing of tiddler content by prompting for a password before content is displayed."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Create a table of contents from a tiddler's headings. Contributor: Saq Imtiaz.","category":"Navigating within a tiddler","twversion":"2.1","format":"Plugin","link":"http://devpad.tiddlyspot.com","author":"FND"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Tiddler manipulation","description":"TiddlerTweaker is a tool for TiddlyWiki authors. It allows you to select multiple tiddlers from a listbox, and then modify the author, created, modified and/or tag values of those tiddlers using a compact set of form fields. The values you enter into the fields overwrite the existing values in all tiddlers you have selected."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Adds double-click-to-edit to the core tiddler macro.","author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Plugin","twversion":"2.x","category":"Tiddler manipulation"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","twversion":"--","category":"Tiddler manipulation","description":"The TiddlerWithParamsPlugin extends the build-in {{{<<tiddler...>>}}} macro. It replaces placeholders ($1, $2, ...) in the given tiddler by values passed with the macro. Then it inserts the (replaced) text, just like the original {{{<<tiddler...>>}}} macro."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Pascal","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Plugin","twversion":"2.1.0","category":"Tabbed folders","description":"Shows all open tiddlers as tabs in viewer area (5 star!)"}</data>
/***
|''Name:''|TiddlersBarPlugin|
|''Description:''|A bar to switch between tiddlers through tabs (like browser tabs bar).|
|''Version:''|1.2.5|
|''Date:''|Jan 18,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demos
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], open several tiddlers to use the tabs bar.
!Installation
#import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
#save and reload
#''if you're using a custom [[PageTemplate]]'', add {{{<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>}}} before {{{<div id='tiddlerDisplay'></div>}}}
#optionally, adjust StyleSheetTiddlersBar
!Tips
*Doubleclick on the tiddlers bar (where there is no tab) create a new tiddler.
*Tabs include a button to close {{{x}}} or save {{{!}}} their tiddler.
*By default, click on the current tab close all others tiddlers.
!Configuration options 
<<option chkDisableTabsBar>> Disable the tabs bar (to print, by example).
<<option chkHideTabsBarWhenSingleTab >> Automatically hide the tabs bar when only one tiddler is displayed. 
<<option txtSelectedTiddlerTabButton>> ''selected'' tab command button.
<<option txtPreviousTabKey>> previous tab access key.
<<option txtNextTabKey>> next tab access key.
!Code
***/
//{{{
config.options.chkDisableTabsBar = config.options.chkDisableTabsBar ? config.options.chkDisableTabsBar : false;
config.options.chkHideTabsBarWhenSingleTab  = config.options.chkHideTabsBarWhenSingleTab  ? config.options.chkHideTabsBarWhenSingleTab  : false;
config.options.txtSelectedTiddlerTabButton = config.options.txtSelectedTiddlerTabButton ? config.options.txtSelectedTiddlerTabButton : " ";
config.options.txtPreviousTabKey = config.options.txtPreviousTabKey ? config.options.txtPreviousTabKey : "";
config.options.txtNextTabKey = config.options.txtNextTabKey ? config.options.txtNextTabKey : "";
config.macros.tiddlersBar = {
	tooltip : "see ",
	tooltipClose : "click here to close this tab",
	tooltipSave : "click here to save this tab",
	promptRename : "Enter tiddler new name",
	currentTiddler : "",
	previousState : false,
	previousKey : config.options.txtPreviousTabKey,
	nextKey : config.options.txtNextTabKey,	
	tabsAnimationSource : null, //use document.getElementById("tiddlerDisplay") if you need animation on tab switching.
	handler: function(place,macroName,params) {
		var previous = null;
		if (config.macros.tiddlersBar.isShown())
			story.forEachTiddler(function(title,e){
				if (title==config.macros.tiddlersBar.currentTiddler){
					var d = createTiddlyElement(null,"span",null,"tab tabSelected");
					config.macros.tiddlersBar.createActiveTabButton(d,title);
					if (previous && config.macros.tiddlersBar.previousKey) previous.setAttribute("accessKey",config.macros.tiddlersBar.nextKey);
					previous = "active";
				}
				else {
					var d = createTiddlyElement(place,"span",null,"tab tabUnselected");
					var btn = createTiddlyButton(d,title,config.macros.tiddlersBar.tooltip + title,config.macros.tiddlersBar.onSelectTab);
					btn.setAttribute("tiddler", title);
					if (previous=="active" && config.macros.tiddlersBar.nextKey) btn.setAttribute("accessKey",config.macros.tiddlersBar.previousKey);
					previous=btn;
				}
				var isDirty =story.isDirty(title);
				var c = createTiddlyButton(d,isDirty ?"!":"x",isDirty?config.macros.tiddlersBar.tooltipSave:config.macros.tiddlersBar.tooltipClose, isDirty ? config.macros.tiddlersBar.onTabSave : config.macros.tiddlersBar.onTabClose,"tabButton");
				c.setAttribute("tiddler", title);
				if (place.childNodes) {
					place.insertBefore(document.createTextNode(" "),place.firstChild); // to allow break line here when many tiddlers are open
					place.insertBefore(d,place.firstChild); 
				}
				else place.appendChild(d);
			})
	}, 
	refresh: function(place,params){
		removeChildren(place);
		config.macros.tiddlersBar.handler(place,"tiddlersBar",params);
		if (config.macros.tiddlersBar.previousState!=config.macros.tiddlersBar.isShown()) {
			story.refreshAllTiddlers();
			if (config.macros.tiddlersBar.previousState) story.forEachTiddler(function(t,e){e.style.display="";});
			config.macros.tiddlersBar.previousState = !config.macros.tiddlersBar.previousState;
		}
	},
	isShown : function(){
		if (config.options.chkDisableTabsBar) return false;
		if (!config.options.chkHideTabsBarWhenSingleTab) return true;
		var cpt=0;
		story.forEachTiddler(function(){cpt++});
		return (cpt>1);
	},
	selectNextTab : function(){  //used when the current tab is closed (to select another tab)
		var previous="";
		story.forEachTiddler(function(title){
			if (!config.macros.tiddlersBar.currentTiddler) {
				story.displayTiddler(null,title);
				return;
			}
			if (title==config.macros.tiddlersBar.currentTiddler) {
				if (previous) {
					story.displayTiddler(null,previous);
					return;
				}
				else config.macros.tiddlersBar.currentTiddler=""; 	// so next tab will be selected
			}
			else previous=title;
			});		
	},
	onSelectTab : function(e){
		var t = this.getAttribute("tiddler");
		if (t) story.displayTiddler(null,t);
		return false;
	},
	onTabClose : function(e){
		var t = this.getAttribute("tiddler");
		if (t) {
			if(story.hasChanges(t) && !readOnly) {
				if(!confirm(config.commands.cancelTiddler.warning.format([t])))
				return false;
			}
			story.closeTiddler(t);
		}
		return false;
	},
	onTabSave : function(e) {
		var t = this.getAttribute("tiddler");
		if (!e) e=window.event;
		if (t) config.commands.saveTiddler.handler(e,null,t);
		return false;
	},
	onSelectedTabButtonClick : function(event,src,title) {
		var t = this.getAttribute("tiddler");
		if (!event) event=window.event;
		if (t && config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton])
			config.commands[config.options.txtSelectedTiddlerTabButton].handler(event, src, t);
		return false;
	},
	onTiddlersBarAction: function(event) {
		var source = event.target ? event.target.id : event.srcElement.id; // FF uses target and IE uses srcElement;
		if (source=="tiddlersBar") story.displayTiddler(null,'New Tiddler',DEFAULT_EDIT_TEMPLATE,false,null,null);
	},
	createActiveTabButton : function(place,title) {
		if (config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton]) {
			var btn = createTiddlyButton(place, title, config.commands[config.options.txtSelectedTiddlerTabButton].tooltip ,config.macros.tiddlersBar.onSelectedTabButtonClick);
			btn.setAttribute("tiddler", title);
		}
		else
			createTiddlyText(place,title);
	}
}

story.coreCloseTiddler = story.coreCloseTiddler? story.coreCloseTiddler : story.closeTiddler;
story.coreDisplayTiddler = story.coreDisplayTiddler ? story.coreDisplayTiddler : story.displayTiddler;

story.closeTiddler = function(title,animate,unused) {
	if (title==config.macros.tiddlersBar.currentTiddler)
		config.macros.tiddlersBar.selectNextTab();
	story.coreCloseTiddler(title,false,unused); //disable animation to get it closed before calling tiddlersBar.refresh
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

story.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle){
	story.coreDisplayTiddler(config.macros.tiddlersBar.tabsAnimationSource,tiddler,template,animate,unused,customFields,toggle);
	var title = (tiddler instanceof Tiddler)? tiddler.title : tiddler;  
	if (config.macros.tiddlersBar.isShown()) {
		story.forEachTiddler(function(t,e){
			if (t!=title) e.style.display="none";
			else e.style.display="";
		})
		config.macros.tiddlersBar.currentTiddler=title;
	}
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

var coreRefreshPageTemplate = coreRefreshPageTemplate ? coreRefreshPageTemplate : refreshPageTemplate;
refreshPageTemplate = function(title) {
	coreRefreshPageTemplate(title);
	if (config.macros.tiddlersBar) config.macros.tiddlersBar.refresh(document.getElementById("tiddlersBar"));
}

ensureVisible=function (e) {return 0} //disable bottom scrolling (not useful now)

config.shadowTiddlers.StyleSheetTiddlersBar = "/*{{{*/\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .button {border:0}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .tab {white-space:wrap}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar {padding : 1em 0.5em 2px 0.5em}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tabUnselected .tabButton, .tabSelected .tabButton {padding : 0 2px 0 2px; margin: 0 0 0 4px;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tiddler, .tabContents {border:1px [[ColorPalette::TertiaryPale]] solid;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar +="/*}}}*/";
store.addNotification("StyleSheetTiddlersBar", refreshStyles);

config.refreshers.none = function(){return true;}
config.shadowTiddlers.PageTemplate=config.shadowTiddlers.PageTemplate.replace(/<div id='tiddlerDisplay'><\/div>/m,"<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>\n<div id='tiddlerDisplay'></div>");

//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Statistics","description":"Displays the current document’s version number and last-modified date."}</data>
<<formTiddler NewPluginTemplate>><data>{"link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)","format":"Plugin","twversion":"--","category":"Images and presentations","description":"Lightboxes optimized for TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Richard","link":"http://www.minormania.com/tiddlylock/tiddlylock.html#TiddlyLockPlugin","format":"Plugin","category":"Saving and reviewing changes","description":"Automatically locks and unlocks the TiddlyWiki as required, allowing multiple users to edit the TiddlyWiki without fear of overwriting other users' changes.","twversion":"2.2.4"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","description":"Autoplay music randomly selected from playlist using embedded player.","format":"Plugin","category":"Images and presentations","twversion":"2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tiddlysnip.com/#About","format":"Firefox extension","twversion":"2.1+","category":"Working with websites, incl IFrames","description":"TiddlySnip is a Firefox extension that lets you use your TiddlyWiki as a scrapbook! Simply select text, right click and choose 'TiddlySnip selection'. Next time you open your TiddlyWiki file, your snippets will be there, already tagged and organised."}</data>
{{fontsize80{
|>|>|>|>|>|bgcolor:#abf;color:#006;~TiddlyTools Plugins 11 August 2009  |h
|bgcolor:#abf;!Plugin|bgcolor:#abf;!Modified|bgcolor:#abf;!Size|bgcolor:#abf;!Description|bgcolor:#abf;!Version|bgcolor:#abf;!CoreVersion|h
|sortable|k
|[[AdvancedOptionsPlugin|http://www.tiddlytools.com/#AdvancedOptionsPlugin]]|2009.07.24| 4845|automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler|1.2.0|2.3|
|[[AliasPlugin|http://www.tiddlytools.com/#AliasPlugin]]|2007.03.22| 1558|Create text-substitution macros|1.1.0|2.1|
|[[AnimationEffectsPlugin|http://www.tiddlytools.com/#AnimationEffectsPlugin]]|2008.01.09| 10992|display content with timer-based animations to manipulate multiple CSS attributes|3.1.1|2.2|
|[[AttachFilePlugin|http://www.tiddlytools.com/#AttachFilePlugin]]|2009.06.05| 19966|Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage|4.0.0|2.1|
|[[AttachFilePluginFormatters|http://www.tiddlytools.com/#AttachFilePluginFormatters]]|2009.06.05| 9268|run-time library for displaying attachment tiddlers|4.0.0|2.1.3|
|[[AutoTaggerPlugin|http://www.tiddlytools.com/#AutoTaggerPlugin]]|2008.03.29| 6249|Tag tiddlers with date, author, etc. and/or scan the tiddler for any tags that are embedded in the content|1.7.1|2.1|
|[[BackstageTweaks|http://www.tiddlytools.com/#BackstageTweaks]]|2008.05.13| 1264|undefined|undefined|undefined|
|[[BreadcrumbsPlugin|http://www.tiddlytools.com/#BreadcrumbsPlugin]]|2009.03.23| 10986|list/jump to tiddlers viewed during this session plus "back" button/macro|2.1.0|2.1|
|[[CalendarPlugin|http://www.tiddlytools.com/#CalendarPlugin]]|2009.06.01| 16635|display monthly and yearly calendars|1.5.0|2.1|
|[[CalendarPluginConfig|http://www.tiddlytools.com/#CalendarPluginConfig]]|2008.02.28| 266|undefined|undefined|undefined|
|[[CheckboxPlugin|http://www.tiddlytools.com/#CheckboxPlugin]]|2008.01.09| 10321|Add checkboxes to your tiddler content|2.4.0|2.1|
|[[ClickifyPlugin|http://www.tiddlytools.com/#ClickifyPlugin]]|2009.02.08| 2294|re-compute parameters when a 'command link' macro is clicked|1.0.1|2.1|
|[[CollapseTiddlersPlugin|http://www.tiddlytools.com/#CollapseTiddlersPlugin]]|2008.03.07| 7132|show/hide content of a tiddler while leaving tiddler title visible|2.0.0|2.1|
|[[ColumnCalculatorPlugin|http://www.tiddlytools.com/#ColumnCalculatorPlugin]]|2009.02.06| 4683|calculate values from table cells in a column|0.6.2|2.1|
|[[CommentPlugin|http://www.tiddlytools.com/#CommentPlugin]]|2009.04.11| 5720|automatically insert formatted comments into tiddler content|2.9.3|2.1|
|[[CompareTiddlersPlugin|http://www.tiddlytools.com/#CompareTiddlersPlugin]]|2009.07.27| 10981|show color-coded differences between two selected tiddlers|1.1.0|2.1|
|[[ConfigTweaks|http://www.tiddlytools.com/#ConfigTweaks]]|2008.11.13| 1162|undefined|undefined|undefined|
|[[ConfirmExitPlugin|http://www.tiddlytools.com/#ConfirmExitPlugin]]|2008.09.06| 3824|extra safety when exiting with unsaved changes|2.0.0|2.1|
|[[ConfirmSavePlugin|http://www.tiddlytools.com/#ConfirmSavePlugin]]|2008.03.16| 2388|if tiddlers are being edited, or there are no unsaved changes, ask before saving|1.1.0|2.1|
|[[CookieJar|http://www.tiddlytools.com/#CookieJar]]|2009.08.05| 1839|undefined|undefined|undefined|
|[[CookieManagerPlugin|http://www.tiddlytools.com/#CookieManagerPlugin]]|2009.08.05| 13816|view/add/delete browser-based cookies and "bake" cookies to CookieJar tiddler for 'sticky' settings|2.4.0|2.1|
|[[CookieManagerPluginConfig|http://www.tiddlytools.com/#CookieManagerPluginConfig]]|2008.09.12| 1507|custom settings for [[CookieManagerPlugin]]|undefined|undefined|
|[[CookieSaverPlugin|http://www.tiddlytools.com/#CookieSaverPlugin]]|2009.08.05| 14370|automatically save TiddlyWiki cookie options to [[CookieJar]] tiddler for portable settings|1.1.0|2.1|
|[[CookieSaverPluginConfig|http://www.tiddlytools.com/#CookieSaverPluginConfig]]|2008.09.12| 1985|custom settings for [[CookieSaverPlugin]]|undefined|undefined|
|[[CopyTiddlerPlugin|http://www.tiddlytools.com/#CopyTiddlerPlugin]]|2009.06.08| 10191|Quickly create a copy of any existing tiddler|3.2.5|2.3|
|[[CoreTweaks|http://www.tiddlytools.com/#CoreTweaks]]|2009.01.30| 22005|a small collection of overrides to TW core functions|use with TW2.4.3|2.2.0|
|[[CoreTweaksArchive|http://www.tiddlytools.com/#CoreTweaksArchive]]|2009.03.02| 12083|small overrides to TW core functions - use with TW v2.4.1 or earlier|none|1.2|
|[[DOMTweaksPlugin|http://www.tiddlytools.com/#DOMTweaksPlugin]]|2007.07.21| 3225|set DOM element IDs, add/remove classes and/or reposition rendered elements|1.0.1|2.1|
|[[DOMViewerPlugin|http://www.tiddlytools.com/#DOMViewerPlugin]]|2007.09.28| 5313|display internal Document Object Model for wiki-formatted content|1.8.0|2.1|
|[[DatePlugin|http://www.tiddlytools.com/#DatePlugin]]|2009.06.01| 13469|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|2.7.1|2.1|
|[[DatePluginConfig|http://www.tiddlytools.com/#DatePluginConfig]]|2008.02.01| 3670|formats, background colors and other optional settings for DatePlugin|2.6.0|2.1|
|[[DisableWikiLinksPlugin|http://www.tiddlytools.com/#DisableWikiLinksPlugin]]|2008.07.23| 6566|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|1.6.0|2.1|
|[[DiscussionPlugin|http://www.tiddlytools.com/#DiscussionPlugin]]|2009.01.05| 6151|display tabbed discussion summary with comment input form|1.5.7|2.1|
|[[DragScrollPlugin|http://www.tiddlytools.com/#DragScrollPlugin]]|2008.12.09| 3813|use SHIFT-DRAG to scroll the browser window|1.0.0|2.1|
|[[EditFieldPlugin|http://www.tiddlytools.com/#EditFieldPlugin]]|2007.08.23| 6566|extend core edit macro for use in ViewTemplates or direct embedding in tiddler content|1.0.0|2.1|
|[[EditTiddlerPlugin|http://www.tiddlytools.com/#EditTiddlerPlugin]]|2007.03.23| 1865|embed an 'edit' link in tiddler content to invoke edit on any specified tiddler title|1.2.0|2.1|
|[[ExportTiddlersPlugin|http://www.tiddlytools.com/#ExportTiddlersPlugin]]|2009.07.07| 34374|interactively select/export tiddlers to a separate file|2.9.3|2.1|
|[[ExternalTiddlersPlugin|http://www.tiddlytools.com/#ExternalTiddlersPlugin]]|2008.10.28| 9456|retrieve and wikify content from external files or remote URLs|1.3.1|2.1|
|[[FAQViewerPlugin|http://www.tiddlytools.com/#FAQViewerPlugin]]|2009.06.15| 9141|select and display FAQ tiddlers from a droplist, sorted by date|1.4.3|2.1|
|[[FileDropPlugin|http://www.tiddlytools.com/#FileDropPlugin]]|2007.12.04| 5543|undefined|undefined|undefined|
|[[FileDropPluginConfig|http://www.tiddlytools.com/#FileDropPluginConfig]]|2008.08.12| 7293|Adds drag-and-drop handlers for creating binary attachments or directory lists|1.5.1|2.1|
|[[FoldHeadingsPlugin|http://www.tiddlytools.com/#FoldHeadingsPlugin]]|2009.01.07| 6871|automatically turn headings into slider-like panels that can be folded/unfolded with a single click|1.1.1|2.1|
|[[FramedLinksPlugin|http://www.tiddlytools.com/#FramedLinksPlugin]]|2008.11.15| 5460|clicking an external link opens an IFRAME following the link instead of opening a new tab/window|1.1.1|2.1|
|[[GotoPlugin|http://www.tiddlytools.com/#GotoPlugin]]|2009.05.23| 9206|view any tiddler by entering it's title - displays list of possible matches|1.9.2|2.1|
|[[HTMLFormattingPlugin|http://www.tiddlytools.com/#HTMLFormattingPlugin]]|2009.01.06| 3277|embed wiki syntax formatting inside of HTML content|2.4.0|2.1|
|[[ImageMapPlugin|http://www.tiddlytools.com/#ImageMapPlugin]]|2009.05.27| 5251|apply image maps ('hotspots') with links to tiddlers|1.2.2|2.1|
|[[ImagePathPlugin|http://www.tiddlytools.com/#ImagePathPlugin]]|2007.04.14| 9273|Tell TiddlyWiki where to look for image files.  Permits multiple 'fallback' locations|0.7.1|2.1|
|[[ImageSizePlugin|http://www.tiddlytools.com/#ImageSizePlugin]]|2009.02.27| 6605|adds support for resizing images|1.2.1|2.1|
|[[ImportTiddlersPlugin|http://www.tiddlytools.com/#ImportTiddlersPlugin]]|2009.07.04| 45961|interactive controls for import/export with filtering.|4.5.1|2.1|
|[[ImportTiddlersPluginPatch|http://www.tiddlytools.com/#ImportTiddlersPluginPatch]]|2008.10.01| 8555|backward-compatible function patches for use with ImportTiddlersPlugin and TW2.1.x or earlier|4.4.0|2.1|
|[[InlineJavascriptPlugin|http://www.tiddlytools.com/#InlineJavascriptPlugin]]|2009.04.12| 4469|Insert Javascript executable code directly into your tiddler content.|1.9.5|2.1|
|[[Jash.js|http://www.tiddlytools.com/#Jash.js]]|2007.12.10| 31268|undefined|undefined|undefined|
|[[ListboxPlugin|http://www.tiddlytools.com/#ListboxPlugin]]|2009.06.16| 11057|set tiddler fields by selecting from a listbox or droplist|1.2.3|2.1|
|[[LoadTiddlersPlugin|http://www.tiddlytools.com/#LoadTiddlersPlugin]]|2009.07.04| 12230|macro for automated updates or one-click installations of tiddlers from remote sources|3.7.1|2.1|
|[[LoadTiddlersPluginPatch|http://www.tiddlytools.com/#LoadTiddlersPluginPatch]]|2008.08.06| 6951|backward-compatible function patches for use with LoadTiddlersPlugin and TW2.1.x or earlier|3.6.2|2.1|
|[[LooseLinksPlugin|http://www.tiddlytools.com/#LooseLinksPlugin]]|2009.08.04| 2916|case-folded/space-folded wiki words|1.1.0|2.1|
|[[MatchTagsPlugin|http://www.tiddlytools.com/#MatchTagsPlugin]]|2008.09.05| 10108|'tag matching' with full boolean expressions (AND, OR, NOT, and nested parentheses)|2.0.0|2.1|
|[[MessageLogPlugin|http://www.tiddlytools.com/#MessageLogPlugin]]|2008.12.26| 4545|automatically log TW messages to a [[MessageLog]] tiddler|1.0.2|2.4|
|[[MiniBrowserPlugin|http://www.tiddlytools.com/#MiniBrowserPlugin]]|2009.07.04| 15072|embedded browser-in-browser with favorites lists and media support|1.5.1|2.2|
|[[MissingTiddlersPlugin|http://www.tiddlytools.com/#MissingTiddlersPlugin]]|2009.01.21| 2704|define alternative content for missing tiddlers|1.0.0|2.1|
|[[MoveablePanelPlugin|http://www.tiddlytools.com/#MoveablePanelPlugin]]|2008.12.26| 40472|move/size any tiddler or page element|3.0.3|2.1|
|[[NestedSlidersPlugin|http://www.tiddlytools.com/#NestedSlidersPlugin]]|2008.11.16| 14694|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|2.4.9|2.1|
|[[PanelManagerPlugin|http://www.tiddlytools.com/#PanelManagerPlugin]]|2008.12.26| 62408|Add-on for [[MoveablePanelPlugin]]: Panel Manager Menu, Control Panel, and Map Viewer |1.0.1|2.1|
|[[PlayerPlugin|http://www.tiddlytools.com/#PlayerPlugin]]|2007.10.16| 19907|Embed a media player in a tiddler|1.1.4|2.1|
|[[PopupPreviewPlugin|http://www.tiddlytools.com/#PopupPreviewPlugin]]|2007.11.22| 3697|popup a formatted preview of a linked tiddler's content|1.0.0|2.1|
|[[PreviewPlugin|http://www.tiddlytools.com/#PreviewPlugin]]|2008.01.09| 12162|add key-by-key wikified preview to any textarea input field|1.8.1|2.1|
|[[QuickEditPlugin|http://www.tiddlytools.com/#QuickEditPlugin]]|2009.06.12| 5958|Support functions for ~QuickEdit package: styles, utility functions, and 'toggleQuickEdit' command|2.4.3|2.1|
|[[QuoteOfTheDayPlugin|http://www.tiddlytools.com/#QuoteOfTheDayPlugin]]|2008.03.22| 6610|Display a randomly selected "quote of the day" from a list defined in a separate tiddler|1.4.1|2.1|
|[[RaphaelPlugin|http://www.tiddlytools.com/#RaphaelPlugin]]|2009.01.20| 35449|wrapper for Raphaël library functions - SVG/VML drawing|1.0.1|2.1|
|[[RearrangeTiddlersPlugin|http://www.tiddlytools.com/#RearrangeTiddlersPlugin]]|2008.10.20| 6533|drag tiddlers by title to re-order story column display|2.0.0|2.1|
|[[RecentChangesPlugin|http://www.tiddlytools.com/#RecentChangesPlugin]]|2009.07.02| 5408|display droplist of recently changed tiddlers with goto, edit, and preview buttons|2.2.0|2.1|
|[[RelatedTiddlersPlugin|http://www.tiddlytools.com/#RelatedTiddlersPlugin]]|2007.11.11| 15117|starting from a selected tiddler, display a list and/or tree of linked or transcluded tiddlers|1.1.7|2.1|
|[[RunTiddlerPlugin|http://www.tiddlytools.com/#RunTiddlerPlugin]]|2008.09.03| 2877|command to invoke tiddler content as if tagged with systemConfig (i.e., a plugin)|1.2.1|2.1|
|[[SaveAsPlugin|http://www.tiddlytools.com/#SaveAsPlugin]]|2009.08.05| 15987|Save current document to a different path/filename|2.6.1|2.1|
|[[SaveFromWebConfig|http://www.tiddlytools.com/#SaveFromWebConfig]]|2009.07.26| 2803|configuration settings for SaveFromWebPlugin|1.3.1|2.1|
|[[SaveFromWebPlugin|http://www.tiddlytools.com/#SaveFromWebPlugin]]|2008.09.30| 8807|extend 'save changes' to get remote document contents and save to local filesystem |1.3.1|2.1|
|[[SaveTiddlerToFilePlugin|http://www.tiddlytools.com/#SaveTiddlerToFilePlugin]]|2008.04.24| 7049|toolbar command to save tiddler source definition to an external text file|1.0.0|2.1|
|[[SearchOptionsPlugin|http://www.tiddlytools.com/#SearchOptionsPlugin]]|2009.01.17| 20833|extend core search function with additional user-configurable options|3.0.5|2.1|
|[[SectionLinksPlugin|http://www.tiddlytools.com/#SectionLinksPlugin]]|2009.08.02| 8873|allow tiddler sections in TiddlyLinks to be used as anchor points|1.3.1|2.1|
|[[SendTiddlerPlugin|http://www.tiddlytools.com/#SendTiddlerPlugin]]|2007.02.16| 7824|send tiddler source content or raw storeArea DIVs to remote URLs for server-side storage/processing|0.8.0|2.1|
|[[SetIconPlugin|http://www.tiddlytools.com/#SetIconPlugin]]|2008.05.12| 3269|add an image to a toolbar, macro, or slider link|1.8.0|2.3|
|[[SetUserNamePlugin|http://www.tiddlytools.com/#SetUserNamePlugin]]|2006.12.02| 1886|prompt for TiddlyWiki username|1.0.0|2.1|
|[[SinglePageModePlugin|http://www.tiddlytools.com/#SinglePageModePlugin]]|2008.10.18| 7428|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|2.9.6|2.1|
|[[SliceGridPlugin|http://www.tiddlytools.com/#SliceGridPlugin]]|2008.08.15| 13536|Generate a "slice grid" table to get an instant 'birds-eye' overview of your entire document|1.0.3|2.1.3|
|[[SnapshotPlugin|http://www.tiddlytools.com/#SnapshotPlugin]]|2009.06.05| 11984|save or print HTML+CSS image of rendered document content|1.2.0|2.1|
|[[SplashScreenPlugin|http://www.tiddlytools.com/#SplashScreenPlugin]]|2007.03.28| 2386|undefined|0.21 |undefined|
|[[StickyPopupPlugin|http://www.tiddlytools.com/#StickyPopupPlugin]]|2007.11.26| 2713|allow mouse interactions inside popups without automatically closing them|1.0.1|2.1|
|[[StorySaverPlugin|http://www.tiddlytools.com/#StorySaverPlugin]]|2009.07.28| 13551|save/restore current tiddler view between browser sessions|1.7.1|2.1|
|[[StoryViewerPlugin|http://www.tiddlytools.com/#StoryViewerPlugin]]|2008.06.05| 7617|view tiddlers in a saved story, one at a time, using a droplist or "first/previous/next/last" links|1.2.0|2.1|
|[[SwitchThemePlugin|http://www.tiddlytools.com/#SwitchThemePlugin]]|2008.04.24| 4729|Select alternative TiddlyWiki template/stylesheet 'themes' from a droplist|5.3.0|2.3|
|[[SwitchThemePluginPatch|http://www.tiddlytools.com/#SwitchThemePluginPatch]]|2008.05.10| 3517|Patch core switchTheme() function for backward-compatibility with TW2.3.0 and earlier|5.2.1|2.3|
|[[SystemInfoPlugin|http://www.tiddlytools.com/#SystemInfoPlugin]]|2007.11.01| 10114|view system internal data and settings|1.7.1|2.1|
|[[TableOfContentsPlugin|http://www.tiddlytools.com/#TableOfContentsPlugin]]|2008.04.10| 18075|replace the standard tabbed contents list with a scrolling listbox|2.4.3|2.1|
|[[TableSortingPlugin|http://www.tiddlytools.com/#TableSortingPlugin]]|2008.01.26| 5868|Dynamically sort tables by clicking on column headers|2.02|2.2.3|
|[[TagCloudPlugin|http://www.tiddlytools.com/#TagCloudPlugin]]|2009.07.19| 9662|present a 'cloud' of tags (or links) using proportional font display|1.7.0|2.1|
|[[TagGridPlugin|http://www.tiddlytools.com/#TagGridPlugin]]|2008.04.22| 14979|Generate a cross-referenced grid of tiddlers, based on tag values|1.7.0|2.1|
|[[TaggedTemplateTweak|http://www.tiddlytools.com/#TaggedTemplateTweak]]|2009.08.01| 3028|use alternative ViewTemplate/EditTemplate for specific tiddlers|1.6.0|2.1|
|[[TaskTimerPlugin|http://www.tiddlytools.com/#TaskTimerPlugin]]|2008.11.11| 7567|'timer' button automatically writes start/end/elapsed time into tiddler content|1.4.1|2.1|
|[[TaskTimerPluginConfig|http://www.tiddlytools.com/#TaskTimerPluginConfig]]|2008.03.13| 1491|formats other optional settings for TaskTimerPlugin|1.3.0|2.1|
|[[TemporaryTiddlersPlugin|http://www.tiddlytools.com/#TemporaryTiddlersPlugin]]|2008.11.15| 3304|blocks tiddlers tagged with "temporary" from being saved into the TW file|1.1.2|2.1|
|[[TextAreaPlugin|http://www.tiddlytools.com/#TextAreaPlugin]]|2009.04.09| 11556|Adds Find/Again keyboard search, autosize, and 'stretch bar' resize for textarea controls|2.2.1|2.1|
|[[TidIDEPlugin|http://www.tiddlytools.com/#TidIDEPlugin]]|2008.04.25| 18324|TiddlyWiki Integrated Development Environment - tools for authors and plugin writers|1.8.3|2.1|
|[[TiddlerIconsPlugin|http://www.tiddlytools.com/#TiddlerIconsPlugin]]|2008.10.03| 5233|display icons next to tiddler title, based on tiddler's attributes (tags, fields, slices, etc)|2.1.0|2.1|
|[[TiddlerIconsPluginConfig|http://www.tiddlytools.com/#TiddlerIconsPluginConfig]]|2007.08.02| 1759|configure additional icons for TiddlerIconsPlugin, based on containing tiddler's tags|2.0.0|2.1|
|[[TiddlerPasswordPlugin|http://www.tiddlytools.com/#TiddlerPasswordPlugin]]|2007.09.14| 3455|block viewing of tiddler content by prompting for a password before content is displayed|1.1.3|2.1|
|[[TiddlerPasswordPluginConfig|http://www.tiddlytools.com/#TiddlerPasswordPluginConfig]]|2007.05.08| 307|undefined|undefined|undefined|
|[[TiddlerTweakerPlugin|http://www.tiddlytools.com/#TiddlerTweakerPlugin]]|2009.06.26| 21754|select multiple tiddlers and modify author, created, modified and/or tag values|2.4.2|2.1|
|[[TiddlyLifePlugin|http://www.tiddlytools.com/#TiddlyLifePlugin]]|2008.10.16| 22148|Cellular Automata: Conway's "Game of Life"|1.6.5|2.1|
|[[TiddlyPodPlugin|http://www.tiddlytools.com/#TiddlyPodPlugin]]|2008.03.22| 13109|autoplay music randomly selected from playlist using embedded player|1.4.3|2.1|
|[[TrashPlugin|http://www.tiddlytools.com/#TrashPlugin]]|2009.05.21| 6959|add 'Trash' tag to tiddlers instead of deleting them|1.2.0|2.1.0|
|[[UnsavedChangesPlugin|http://www.tiddlytools.com/#UnsavedChangesPlugin]]|2009.03.03| 11850|show droplist of tiddlers that have changed since the last time the document was saved|3.3.3|2.1|
|[[UploadPlugin|http://www.tiddlytools.com/#UploadPlugin]]|2006.07.31| 18761|undefined|undefined|undefined|
|[[UploadPluginTweak|http://www.tiddlytools.com/#UploadPluginTweak]]|2006.11.09| 331|undefined|undefined|undefined|
|[[WikifyPlugin|http://www.tiddlytools.com/#WikifyPlugin]]|2009.03.30| 3661|substitute fields, slices, or computed values into a wiki-syntax format string and render results dynamically|1.1.4|2.1|
Make sure 'Open external links in a new window' is ticked in AdvancedOptions
i.e., this website...
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","description":"TidIDE (prounounced \"Tie Dyed\") - TiddlyWiki Integrated Development Environment - tools for TiddlyWiki authors and editors. <br><br>Provides a full-featured tiddler editor with key-by-key LIVE PREVIEW of formatted tiddler content!! Also includes diagnostic tools to help you debug your TiddlyWiki problems by letting you view current TiddlyWiki internal option values, messages, shadows, stylesheets, notify and macro functions or display the internal DOM (Document Object Model) tree structure for any specific part of theTiddlyWiki document.","category":"Formatting and viewing text"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Time and calendars"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Automatic countdown timer triggers close of current tiddler and opens another one in its place.","category":"Images and presentations","twversion":"--","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<timeline modified>>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "ToDo"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"FND","link":"http://fnd.lewcid.org/tmp/ToDoTogglePlugin.html#Tasks%20ToDoTogglePlugin","category":"ToDo","twversion":"2.4","description":"Toggles a tiddler's tag based on containing checkboxes' status.  Changes tag from 'todo' to 'done' when all checkboxs are ticked.","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Toggling page elements","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","description":"Dynamically enable/disable BreadcrumbsPlugin display.","twversion":"--"}</data>
/***

|Name|ToggleToolyBarsMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/|
|Version|1.0|
|Requires|~TW2.x|
!Description:

{{c06{Modified by Morris Gray to toggle the Toolbars (don't ask about the name:(}}}

Provides a button for toggling visibility of the ToolyBars. You can choose whether the ToolyBars should initially be hidden or displayed.

!Demo
<<toggleToolyBars "Toggle Sidebar">>

!Usage:
{{{<<toggleToolyBars>>}}} <<toggleToolyBars>>
additional options:
{{{<<toggleToolyBars label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)

You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideToolyBarsButton {float:right;} }}}

!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. 
*20-07-06: version 0.11
*27-04-06: version 0.1: working.

!Code
***/
//{{{
config.macros.toggleToolyBars={};

config.macros.toggleToolyBars.settings={
         styleHide :  ".title, .toolbar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 0em !important;}}\n"+"",
         styleShow : " ",
         arrow1: "Edit    ",
         arrow2: "Editing"
};

config.macros.toggleToolyBars.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
          var tooltip= params[1]||'toggle hidden toolbars and tiddler title';
          var mode = (params[2] && params[2]=="hide")? "hide":"show";
          var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
          var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
          var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleToolyBars,"button HideToolyBarsButton");
          if (mode == "hide")
             { 
             (document.getElementById("sidebar")).setAttribute("toggle","hide");
              setStylesheet(this.settings.styleHide,"ToggleToolyBarsStyles");
             }
};

config.macros.toggleToolyBars.onToggleToolyBars = function(){
          var sidebar = document.getElementById("sidebar");
          var settings = config.macros.toggleToolyBars.settings;
          if (sidebar.getAttribute("toggle")=='hide')
             {
              setStylesheet(settings.styleShow,"ToggleToolyBarsStyles");
              sidebar.setAttribute("toggle","show");
              this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
              }
          else
              {    
               setStylesheet(settings.styleHide,"ToggleToolyBarsStyles");
               sidebar.setAttribute("toggle","hide");
               this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
              }

     return false;
}

setStylesheet(".HideToolyBarsButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleToolyBarsButtonStyles");

//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","format":"Script","category":"Toggling page elements","description":"Show/hide left sidebar (MainMenu)"}</data>
config.options.chkToggleLinks=false;
if (config.options.chkToggleLinks==true) config.options.chkToggleLinks=false;
if (config.options.chkToggleLinks==false) config.options.chkToggleLinks=false;
config.options.chkToggleLinks=false;
<<formTiddler NewPluginTemplate>><data>{"format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","twversion":"--","category":"Toggling page elements","description":"Enable/disable 'minor updates' option to prevent changes to the modification date/author when a tiddler is edited."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","description":"Enable/disable global read-only state without reloading your document.","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Show/hide right sidebar (SideBarOptions)","category":"Toggling page elements","twversion":"2.1","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Enable/disable 'fixed' positioning of left and right sidebars (FireFox only).","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Toggling page elements"}</data>
/***

|Name|ToggleSideBarMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#ToggleSideBarMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Provides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.

!Demo
<<toggleSideBar "Toggle Sidebar">>

!Usage:
{{{<<toggleSideBar>>}}} <<toggleSideBar>>
additional options:
{{{<<toggleSideBar label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)

You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideSideBarButton {float:right;} }}}

!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. 
*20-07-06: version 0.11
*27-04-06: version 0.1: working.

!Code
***/
//{{{
config.macros.toggleSideBar={};

config.macros.toggleSideBar.settings={
         styleHide :  "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
         styleShow : " ",
         arrow1: "«",
         arrow2: "»"
};

config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
          var tooltip= params[1]||'toggle sidebar';
          var mode = (params[2] && params[2]=="hide")? "hide":"show";
          var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
          var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
          var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
          if (mode == "hide")
             { 
             (document.getElementById("sidebar")).setAttribute("toggle","hide");
              setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
             }
};

config.macros.toggleSideBar.onToggleSideBar = function(){
          var sidebar = document.getElementById("sidebar");
          var settings = config.macros.toggleSideBar.settings;
          if (sidebar.getAttribute("toggle")=='hide')
             {
              setStylesheet(settings.styleShow,"ToggleSideBarStyles");
              sidebar.setAttribute("toggle","show");
              this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
              }
          else
              {    
               setStylesheet(settings.styleHide,"ToggleSideBarStyles");
               sidebar.setAttribute("toggle","hide");
               this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
              }

     return false;
}

setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");

//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","format":"Macro","twversion":"2.x","category":"Toggling page elements","description":"Provides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","category":"Toggling page elements","twversion":"2.1","description":"Show/hide low-profile horizontal SiteMenu."}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.1","category":"Toggling page elements","format":"Script","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","description":"show/hide document 'header' area (containing SiteTitle and SiteSubtitle content)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Macro","twversion":"2.x","category":"Tagging","description":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","description":"Makes a checkbox which toggles a tag in a tiddler","category":"Tagging","twversion":"--"}</data>
/***

|Name|ToggleTiddlersBarMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#ToggleTiddlersBarMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:

{{c06{Modified by Morris Gray to toggle the TiddlersBar}}}

Provides a button for toggling visibility of the Toolbars. You can choose whether the Toolbars should initially be hidden or displayed.

!Demo
<<toggleTiddlersBar "Toggle Sidebar">>

!Usage:
{{{<<toggleTiddlersBar>>}}} <<toggleTiddlersBar>>
additional options:
{{{<<toggleTiddlersBar label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)

You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideTiddlersBarButton {float:right;} }}}

!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. 
*20-07-06: version 0.11
*27-04-06: version 0.1: working.

!Code
***/
//{{{
config.macros.toggleTiddlersBar={};

config.macros.toggleTiddlersBar.settings={
         styleHide :  ".title, #tiddlersBar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 0em !important;}}\n"+"",
         styleShow : " ",
         arrow1: "Tabs   ",
         arrow2: "NoTabs"
};

config.macros.toggleTiddlersBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
          var tooltip= params[1]||'toggle hidden toolbars and tiddler title';
          var mode = (params[2] && params[2]=="hide")? "hide":"show";
          var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
          var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
          var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleTiddlersBar,"button HideTiddlersBarButton");
          if (mode == "hide")
             { 
             (document.getElementById("sidebar")).setAttribute("toggle","hide");
              setStylesheet(this.settings.styleHide,"ToggleTiddlersBarStyles");
             }
};

config.macros.toggleTiddlersBar.onToggleTiddlersBar = function(){
          var sidebar = document.getElementById("sidebar");
          var settings = config.macros.toggleTiddlersBar.settings;
          if (sidebar.getAttribute("toggle")=='hide')
             {
              setStylesheet(settings.styleShow,"ToggleTiddlersBarStyles");
              sidebar.setAttribute("toggle","show");
              this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
              }
          else
              {    
               setStylesheet(settings.styleHide,"ToggleTiddlersBarStyles");
               sidebar.setAttribute("toggle","hide");
               this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
              }

     return false;
}

setStylesheet(".HideTiddlersBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleTiddlersBarButtonStyles");

//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Toggling page elements","description":"Adds a floating \"scroll to top\" button in the lower right corner of the window."}</data>
/***

|Name|ToggleslantedmenuMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/|
|Version|1.0|
|Requires|~TW2.x|
!Description:

{{c06{Modified by Morris Gray to toggle the Menu/Search etc. hidden/visible}}}

Provides a button for toggling visibility of the slantedmenu. You can choose whether the slantedmenu should initially be hidden or displayed.

!Demo
<<toggleslantedmenu "Toggle Sidebar">>

!Usage:
{{{<<toggleslantedmenu>>}}} <<toggleslantedmenu>>
additional options:
{{{<<toggleslantedmenu label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)

You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideslantedmenuButton {float:right;} }}}

!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. 
*20-07-06: version 0.11
*27-04-06: version 0.1: working.

!Code
***/
//{{{
config.macros.toggleslantedmenu={};

config.macros.toggleslantedmenu.settings={
         styleHide :  ".title, .toolbar, #slantedmenu { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 0em !important;}}\n"+"",
         styleShow : " ",
         arrow1: "menu",
         arrow2: "menu"
};

config.macros.toggleslantedmenu.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
          var tooltip= params[1]||'toggle menu hidden/visible';
          var mode = (params[2] && params[2]=="hide")? "hide":"show";
          var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
          var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
          var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleslantedmenu,"button HideslantedmenuButton");
          if (mode == "hide")
             { 
             (document.getElementById("sidebar")).setAttribute("toggle","hide");
              setStylesheet(this.settings.styleHide,"ToggleslantedmenuStyles");
             }
};

config.macros.toggleslantedmenu.onToggleslantedmenu = function(){
          var sidebar = document.getElementById("sidebar");
          var settings = config.macros.toggleslantedmenu.settings;
          if (sidebar.getAttribute("toggle")=='hide')
             {
              setStylesheet(settings.styleShow,"ToggleslantedmenuStyles");
              sidebar.setAttribute("toggle","show");
              this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
              }
          else
              {    
               setStylesheet(settings.styleHide,"ToggleslantedmenuStyles");
               sidebar.setAttribute("toggle","hide");
               this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
              }

     return false;
}

setStylesheet(".HideslantedmenuButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleslantedmenuButtonStyles");

//}}}
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Toggling page elements"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<tabs " " [[Intro ]] "" [[ToolTabsIntro]] [[Options ]] "" [[OptionsPanel]]  [[AdvancedOptions ]] "" [[AdvancedOptions]] >>
!!!!!<<gradient horiz #fcb #fff>>&nbsp;[[Save/Options|ToolTabsIntro]]>>
<<saveAs>>
<<saveChanges>>
<<closeAll>>
<<permaview>>
@@<<tiddler TspotSidebar>>@@

<html><td><input class="btn" type="button" value="Refresh Window" onClick="location.reload()" onmouseover="this.className='btn btnhov'" onmouseout="this.className='btn'"/></td></html>

<<tiddler EditATiddler>>

 @@color:#C06;''&raquo; &raquo;'' @@ Duplicated Menu buttons<<toggleToolyBars "" "" hide>>@@color:#C06;''&raquo;'' @@@@color:#c06;Toggles the toolbars@@<<toggleTiddlersBar "" "" show>> @@color:#C06;''&raquo;'' @@@@color:#c06;Toggles tabs on and off@@
<<formTiddler NewPluginTemplate>><data>{"description":"Replace toolbar buttons with icons.","category":"Icons","twversion":"--","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
*[[Aids for website visitors]]
*[[Behind the scenes misc tweaks]]
*[[Forms and databases]]
*[[Games]]
*[[Images, media and presentations]]
*[[Links]]
*[[Menus and sliders]]
*[[Non-English languages]]
*[[Popups]]
*[[Saving and reviewing changes]]
*[[Scientific and mathematical notation]]
*[[Security]]
*[[Statistics]]
*[[Tabbed folders]]
*[[Tables and spreadsheets]]
*[[Tiddler manipulation and configuration|Tiddler manipulation]]
*[[Time and calendars]]
*[[ToDo]]
*[[Uncategorized tools]]
<<formTiddler NewPluginTemplate>><data>{"category":"Images and presentations","format":"Theme","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","description":"Alternative stylesheet theme: show tiddler content only - use for 'kiosk mode' presentations.","twversion":"2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0","category":"Working with other codes and formats","description":"This is an early release of the TracFormatterPlugin, which allows you to insert Trac formated text into a TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin provides trash bin functionality. Instead of being permanently removed, deleted tiddlers are tagged with \"Trash.\" Empty the trash by clicking on the empty trash button in the Trash tiddler. Holding down CTRL while clicking on \"delete\" will bypass the trash.","category":"Saving and reviewing changes","author":"Ido Magal","link":"http://ido-xp.tiddlyspot.com/","format":"Plugin","twversion":"2.1.0"}</data>
|Background:|bgcolor:#fff;width:5em; #fff|
|Foreground:|bgcolor:#000;color:#fff; #000|
|PrimaryPale:|bgcolor:#ddaaff; #ddaaff|
|PrimaryLight:|bgcolor:#bb3333;color:#fff; #bb3333|
|PrimaryMid:|bgcolor:#550099;color:#fff; #550099|
|PrimaryDark:|bgcolor:#014;color:#fff; #014|
|SecondaryPale:|bgcolor:#ffc; #ffc|
|SecondaryLight:|bgcolor:#fe8; #fe8|
|SecondaryMid:|bgcolor:#db4; #db4|
|SecondaryDark:|bgcolor:#8844aa;color:#fff; #8844aa|
|TertiaryPale:|bgcolor:#eee; #eee|
|TertiaryLight:|bgcolor:#ccc; #ccc|
|TertiaryMid:|bgcolor:#999; #999|
|TertiaryDark:|bgcolor:#666;color:#fff; #666|
|Error:|bgcolor:#f88; #f88|
@@font-size:0.95em;<html><div id="slantedmenu" padding:top:2em;><span style='font-weight:normal;float:center;'><ul><li><a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('DefaultTiddlers').readBracketedList())"><span title="Close all tiddlers and open Welcome" style="cursor:pointer">Home</span></a></li><li><span style="float:center;padding-left:0em;" title="Load this page in sidebar" style="cursor:help"><a href="#" target="_search">« Load</a></span></li><li><<toggleToolyBars "" "" hide>></li><li>[[View|ViewTabs]]</li><li><span title='open sidebar tools for upload download advanced options'>[[Tools|MoreTools]]</li></span></li><br><li><<search>></li><li>[[options|Search]]</li><br><li><<newTiddler>></li><li>[[Help|Help]]</li><li><<toggleTiddlersBar "" "" show>></li><li><<newJournal "YYYY.0MM.0DD 0hh:0mm:0ss" "journal">></li><br><li><<fontSize>></li></div></html>@@
| tiddlyspot password:|<<option pasUploadPassword>>|
| site management:|<<upload http://tiddlyvault.tiddlyspot.com/store.cgi index.html . .  tiddlyvault>>//(requires tiddlyspot password)//<<br>>[[control panel|http://tiddlyvault.tiddlyspot.com/controlpanel]], [[download (go offline)|http://tiddlyvault.tiddlyspot.com/download]]|
| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|
/***
Contains the stuff you need to use Tiddlyspot
Note you must also have UploadPlugin installed
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'sidebarpluginvault';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
/***
''TwHelpSearch'' for TiddlyWiki 2.0.x to 2.2.x
^^author: Morris S. Gray
source: http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^

|>|>|>|<<search>> |
|>|>| look for in |>|>|
| <<option chkSearchTitles>> | <<option chkSearchText>> | <<option chkSearchTags>> | <<option chkHoldSearches>> |
| titles |  text  | tags | hold |

''A Plugin Tweak for:'' SearchOptionsPlugin
!!!!!Description
<<<
This plugin defines an alternative format for the SearchResults tiddler that is generated by the SearchOptionsPlugin . It presents the search results in tabular form numbering the rows; and showing the tiddler title, the size in bytes, and the tags.  It is ready to be used with the [[SortableGridPlugin|http://solo.dc3.com/tw/#SortableGridPlugin]] (check versions) so any column can be sorted; such as size in ascending or descending order.
<<<
!!!!!Installation
<<<
Import (or copy/paste) the following tiddlers into your ~TiddlyWiki:
* http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin
*SearchOptionsPlugin from http://www.tiddlytools.com/#SearchOptionsPlugin
* Get more documentation here TwHelpSearchDoc or here:
* http://twhelp.tiddlyspot.com/#TwHelpSearchDoc
<<<
!!!!!Revision History
<<<

''2007.09.12  [1.0.6]''
Added overflow scroll to TWHelp-SearchResults for long titles or tags.
''2006.02.03  [1.0.5]''
Added facility for holding the results of multiple searches with tick box on dashboard.
''2006.02.02  [1.0.4]''
Added several options, cleaned up design.Planning one version basic and one with added options this is the added options version.
''2006.01.27  [1.0.3''
Added a column for the size of the text in each tiddler, this does not include the size of the title or tags.  Added overall TW statistics button requires TiddlerStatsPlugin.
''2006.01.23 [1.0.2 ]''
''a)''Changed function reportSearchResults(text,matches) to  window.reportSearchResults=function(text,matches)
''b)''Added a line so that Incremental Search is automatically disabled config.options.chkSearchIncremental=false; turn off key-by-key searching
''c)''Removed space inside parens. bgcolor(#fe8 )" to "bgcolor(#fe8)".  This
is what was causing IE to 'crap out' halfway through drawing the table
headings.
''d)''Added {{{config.options.chkSearchList=true;}}}
''2006.01.20 [1.0.1]''
ELS: reportSearchResults() definition moved to this Plugin Tweak tiddler and removed extranous code
''2006.01.19 [1.0.0]''
This is an adaptation of Eric Shulman's SearchOptionsPlugin. Adapted by MorrisGray to provide search results in table form. All the necessary controls for refining the search is provided within the table including slide-down access to AdvancedOptions.
<<<
!!!!!Code
***/

//{{{
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkRegExpSearch==undefined) config.options.chkRegExpSearch=true;
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=false;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=false;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=true;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=true;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=false;
if (config.options.chkToggleLinks==true) config.options.chkToggleLinks=false;
if (config.options.chkHoldSearches==undefined) config.options.chkHoldSearches=false;
if (config.options.chkSortTags==undefined) config.options.chkSortTags=false;

config.options.chkToggleLinks=false;
config.options.chkSinglePageMode=false;
config.options.chkHoldSearches=false;
config.options.chkSearchIncremental=false;
config.options.chkHttpReadOnly = false;
config.options.chkRegExpSearch=true;
config.options.chkSearchList=true;
config.options.chkToggleLinks=true;

config.shadowTiddlers.AdvancedOptions += "\n<<option chkHoldSearches>> Hold search results";

//}}}

//{{{

// Give the report a custom name
config.macros.search.reportTitle="TWHelp-SearchResults";

// Override default SearchOptionsPlugin formatting for SearchResults tiddler
window.reportSearchResults=function(text,matches)

{
  
        var title=config.macros.search.reportTitle
	config.macros.search.reportTitle;
	var q = config.options.chkRegExpSearch ? "/" : "'";
        if (!config.options.chkHoldSearches)  body="";
body+="^^Search Adapter Compliments of http://twhelp.tiddlyspot.com^^\n";
body+="\n|>|bgcolor(#eaeaea):@@color(#509):''"+config.macros.search.successMsg.format([matches.length,q+text+q])+"''@@|bgcolor(#509):  @@color(#fff): TW ver: <<version>>@@ "+"|"+"\n";
        body+="|>|>|bgcolor(#eaeaea):@@color(#509):<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold @@|"+"\n";
        body+="\n|bgcolor(#509):&nbsp;|bgcolor(#509): @@color(#fff):''Titles''@@ |bgcolor(#509): @@color(#fff): ''Size''@@ |bgcolor(#509): @@color(#fff): ''Tags''@@ |h";
	for(var t=0;t<matches.length;t++) 
        body+="\n"+"| "+(t+1)+"|[["+matches[t].title+"]]| "+matches[t].text.length+"|"+"@@"+matches[t].tags+"@@"+"|";
        body+="\n";


	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch killbookmark");
	store.addTiddler(tiddler); story.closeTiddler(title);


	// render tiddler
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again"; // use alternate "search again" label
        story.displayTiddler(null,title,1); // force refresh
	config.macros.search.label=oldprompt;	// restore standard search label
}

//}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Vincent DiBartolo","link":"http://www.tiddly-twab.com","format":"Other","description":"The ~TiddlyWiki Address Book (twab) is a system for keeping your Address Book within your ~TiddlyWiki. It supports the addition of contacts via a simple macro that can be placed in any Tiddler. It also supports the import or export of your contacts to and from Google, Yahoo, MSN and Outlook.<br><br>All items tagged as twab are required for the system to work, so please don't delete any of these and expect it to still work.","twversion":"--","category":"Forms and databases"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Uncategorized tools","link":"http://gimcrackd.com/etc/src/#%5B%5BWhat's%20this%3F%5D%5D","author":"\"Chris\" (Gimcrack'd)","twversion":"--","format":"Other","description":"Create your own interactive stories with Tweebox. Write with your favorite word processor; build and test with your Web browser."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Marc Castejon","link":"http://www.download.com/Umibozu/3000-12511_4-10642865.html","format":"Other","twversion":"--","category":"Images and presentations","description":"Umibozu is a cross platform web photo album generator, highly customizable thanks to its embedded TiddlyWiki interface, and designed to scale to repositories of over 10000 photos. Umibozu maps your existing photo directory structure to an online web album. Need to add some photos ? Run Umibozu to synchronize within seconds your public web album. Photo albums can reside on your system or be exported to a CD or USB stick, but it is mainly designed to be published to a web server so it can be accessed and modified online, while you keep feeding in new batches of photos."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Uncategorized tools"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Add extended quotes around specific tiddler content to prevent any embedded formatting syntax from being processed by TiddlyWiki's rendering engine, so the content will appear exactly as entered into the tiddler (i.e., \"raw text\"), even when it contains character sequences that would normally be treated asTiddlyWiki formatting instructions.","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","twversion":"2.1","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Displays a droplist of tiddlers that have changed since the last time the document was saved.","category":"Saving and reviewing changes","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
!!!~~<<gradient horiz #fcb #fff>>&nbsp;[[UpdateHistory]]>>~~
<<timeline better:true onlyTag:list sortBy:created>>
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 30/12/2008 03:12:29 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki2.3/sidebarpluginvault/Workingsidebarpluginvault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 04/01/2009 10:52:32 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki2.3/sidebarpluginvault/Workingsidebarpluginvault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 04/01/2009 12:47:00 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki2.3/sidebarpluginvault/Workingsidebarpluginvault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 07/03/2009 14:51:36 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki2.3/sidebarpluginvault/Workingsidebarpluginvault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . |
| 09/04/2009 17:37:12 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki/SidebarPluginVault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 09/04/2009 17:48:07 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki/SidebarPluginVault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 11/08/2009 12:58:36 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki/SidebarPluginVault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 12/08/2009 02:56:47 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki/SidebarPluginVault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 12/08/2009 03:20:51 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki/SidebarPluginVault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . | ok |
| 30/08/2009 18:32:13 | MsgRay | [[sidebarpluginvault.html|file:///F:/TiddlyWiki/SidebarPluginVault/sidebarpluginvault.html]] | [[store.cgi|http://sidebarpluginvault.tiddlyspot.com/store.cgi]] | . | [[index.html | http://sidebarpluginvault.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}

/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.0|
|''Date:''|May 5, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (#3125)|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 0,
	date: new Date("May 5, 2007"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0 (#3125)'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	refreshOptions: function(listWrapper) {
		var uploadOpts = [
			"txtUploadUserName",
			"pasUploadPassword",
			"txtUploadStoreUrl",
			"txtUploadDir",
			"txtUploadFilename",
			"txtUploadBackupDir",
			"chkUploadLog",
			"txtUploadLogMaxLine",
			]
		var opts = [];
		for(i=0; i<uploadOpts.length; i++) {
			var opt = {};
			opts.push()
			opt.option = "";
			n = uploadOpts[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
}

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,null,null,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		bidix.upload.httpUpload(rssUploadParams,convertUnicodeToUTF8(generateRss()),callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == httpStatus.NotFound)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


/* don't want this for tiddlyspot sites

// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");

*/


//}}}


<<formTiddler NewPluginTemplate>><data>{"author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","format":"Plugin","twversion":"2.2.0","description":"Upload ~TiddlyWikis to your online server.","category":"Uploading TiddlyWikis to a server"}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Uploading TiddlyWikis to a server"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<script>
function dayofyear(d) {   // d is a Date object
var yn = d.getFullYear();
var mn = d.getMonth();
var dn = d.getDate();
var d1 = new Date(yn,0,1,12,0,0); // noon on Jan. 1
var d2 = new Date(yn,mn,dn,12,0,0); // noon on input date
var ddiff = Math.round((d2-d1)/864e5);
return ddiff+1; }

var curdate=new Date(); // gets today's date
var cdnum=dayofyear(curdate);
        var tiddlers=store.getTiddlers("modified");
        var last=tiddlers[tiddlers.length-1];
        var when=last.modified.formatString("YY0hh0mm0ss");
        return "Sidebar Plugin Vault Ver:  "+cdnum+when
</script> 
<<formTiddler NewPluginTemplate>><data>{"description":"Allows you to see a tiddler as HTML or as Javascript.","category":"Working with other codes and formats","twversion":"2.x","format":"Plugin","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Displays the default contents of a shadow tiddler.","category":"Tiddler manipulation","twversion":"2.0","format":"Bookmarklet","author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/"}</data>
<html><div id="systemcontents"><<tabs " " [[UpdateHistory ]] "" [[UpdateHistory]]  [[SideBarTabs ]] "" [[SideBarTabs]] [[Shadowed ]] "" [[SystemTabs]]  [[Plugins ]] "" [[Programs]]  [[Styling ]] "" [[Styling]]  [[SideBarOptions ]] "" [[SideBarOptions]]  [[ExcludedFromSearches ]] "" [[ExcludedFromSearches]]  [[ExcludedFromLists ]] "" [[ExcludedFromLists]]  [[Script ]] "" [[Script]] [[AllNotes ]] "" [[AllNotes]] >></div></html>
<div class='toolbar' macro='toolbar jump top -closeTiddler closeOthers closeAll +editTiddler permalink references newDocument '></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div></div>
<div class='viewer' macro='notes heading:"Notes" tag:"excludeLists allnotes" suffix:"Comments"'></div>
<span macro='tiddler ShiftClickToEdit'></span>
<<formTiddler NewPluginTemplate>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Working with other codes and formats","description":"Displays a tiddler as raw HTML."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Displays a tiddler as a JavaScript string (e.g. for developers to use as shadow tiddler).","author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Working with other codes and formats"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Use cookies to track/show private, personal visit counter and timestamp of last visit.","category":"Aids for website visitors","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D","format":"Plugin","twversion":"--","category":"Working with other codes and formats","description":"Haskell"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D","format":"Plugin","twversion":"--","category":"Uploading TiddlyWikis to a server","description":"The \"save to web\" function without script."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"WebView lets you customize how your TiddlyWiki file will appear when viewed as a website (i.e. when accessed via an \"http:...\" URL). This lets you use TiddlyWiki as a website without it being obvious or confusing to your web visitors. You can selectively set which toolbar buttons appear to visitors as well hide/show the tiddler tag footers, sidebar commands, options, advanced options, and even the sidebar tabs. You can even disable the \"double-click to edit\" feature.","category":"Aids for website visitors","twversion":"not 2.0 compatible","format":"Plugin","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","author":"Alan Hecht"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Clint Checketts","link":"http://tiddlystyles.com","format":"Plugin","twversion":"--","description":"Posts the most recently edited tiddlers when the TiddlyWiki is opened, similar to a blog.","category":"Aids for website visitors"}</data>
!!!&nbsp;Welcome
TiddlyVault is a comprehensive collection of plugins, macros, and other extensions available to enhance your ~TiddlyWiki experience. It is a sequel of sorts to my tutorial [[Tiddlywiki for the rest of us|http://www.giffmex.org/twfortherestofus.html]] and also to [[TiddlyWiki in Action|http://giffmex.tiddlyspot.com]], my showcase of others' ~TiddlyWikis from around the world.

There are over 400 plugins, macros and themes listed. An official repository for plugins (and I assume macro and other extensions) is being developed and when that is ready I will include here a link to the repository for you. So feel free to bookmark this page as your source for ~TiddlyWiki extensions. And bookmark the pages of the extensions you use most.

A very special thanks to {{colory{Morris Gray}}} who converted TiddlyVault into his Sidebar Plugin Vault.so you can always have it by your side.

Dave Gifford
Mexico City

Morris Gray
http://twhelp.tiddlyspot.com
A ~TiddlyWiki help file for beginners
http://sidebarnotes.tiddlyspot.com
All things aside
http://groups.google.com/group/sidebarnews


P.S: If you found TiddlyVault helpful, would you consider helping me buy books via an Amazon gift certificate?  I will give the first 10 to Morris.<br><br><html><a href="https://www.amazon.com/gp/registry/wishlist/1OTJM9IE7SPVS/ref=wl_web/"><img src="https://images-na.ssl-images-amazon.com/images/G/01/gifts/registries/wishlist/v2/web/wl-btn-74-b._V46774601_.gif" width="74" alt="My Amazon.com Wish List" height="42" border="0" /></a></html>
This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.

@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://twvault.tiddlyspot.com/controlpanel]] (your control panel username is //twvault//).
<<tiddler TspotControls>>
See also GettingStarted.

@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.

@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to tiddlyspot.com.

@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].

@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions.
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.0.0","category":"Formatting and viewing text","description":"WikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax. Besides, with WikiBar-addons, users can extend the power of WikiBar.","format":"Plugin","link":"http://aiddlywiki.sourceforge.net/wikibar_demo_2.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Formatting and viewing text","description":"--","twversion":"2.x","format":"Macro","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Substitute fields, slices, or computed values into wiki-syntax source and render results dynamically. ALPHA- USE AT YOUR OWN RISK.","category":"Formatting and viewing text","twversion":"2.1","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A TiddlyWikiMacro to easily create a link to a Wikipedia entry.","category":"Working with websites, incl IFrames","author":"Frank Dellaert","link":"http://www-static.cc.gatech.edu/~dellaert/dhtml/tiddly.html","format":"Plugin","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Theme","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","category":"Themes","description":"Alternative stylesheet theme: dark/med/light wood backgrounds."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Tiddler manipulation","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Macro","twversion":"--","description":"A one-liner that displays a tiddler's word count."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with files and programs"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with keyboards"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with multiple TiddlyWikis"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with other codes and formats"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with websites, incl IFrames"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: wrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
*[[...browsers]]
*[[...files and programs|Working with files and programs]]
*[[...keyboards|Working with keyboards]]
*[[...multiple TiddlyWikis|Working with multiple TiddlyWikis]]
*[[...other codes and formats|Working with other codes and formats]]
*[[...servers|Uploading TiddlyWikis to a server]]
*[[...websites, incl. IFrames|Working with websites, incl IFrames]]
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","description":"Makes use of evalled parameters to write values to the current tiddler or execute code.","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)","twversion":"--","category":"Working with other codes and formats"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"? (VisualTW)","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Plugin","twversion":"2.2.x","category":"Formatting and viewing text","description":"Wysiwyg richtext editor for TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Working with other codes and formats","description":"Once the plugin is installed the existing tiddlers of that TiddlyWiki are automatically converted to the new (XHTML 1.0 compliant) format on the first save. After that all changes are stored in the XHTML format.","twversion":"2.1.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.2.0","category":"Working with websites, incl IFrames","description":"A reader for XML for ~TiddlyWiki."}</data>
<<formTiddler NewPluginTemplate>><data>{"link":"http://tiddlywiki.abego-software.de/#Plugins","author":"Udo Borkowski (Abego)","format":"Plugin","category":"Searching and indexing tiddlers","description":"Search your TiddlyWiki with advanced search features such as result lists, tiddler preview, result ranking, search filters, combined searches and many more.","twversion":"2.1.0"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","category":"Formatting and viewing text","description":"Display text with timer-based font animation to automatically grow/shrink text.","twversion":"2.2"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob McElrath (Bob's)","link":"http://bob.mcelrath.org/plugins.html#systemConfig","format":"Plugin","description":"This formatting plugin will render links to the arXiv preprint system. If you type a paper reference such as hep-ph/0509024, it will be rendered as an external link to the abstract of that paper.","category":"Scientific and mathematical notation","twversion":"2.0.3"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","category":"Working with other codes and formats","description":"Adaptor for moving and converting data to and from ccTiddly wikis.","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.2"}</data>
{{textcenter{
~~<script>var today=new Date();document.write('<font style="color:#666">'+'URL='+window.location+'</font>')</script>~~
@@color:#666;^^<script>
        var tiddlers=store.getTiddlers("modified");
        var last=tiddlers[tiddlers.length-1];
        var when=last.modified.formatString("YYYY/0MM/0DD at 0hh:0mm:0ss");
        return "Last Modified:  " +when
</script>^^@@
^^Symbex Australasia Pty.Ltd. © 2007 - <<today YYYY>>^^
<<formTiddler NewPluginTemplate>><data>{"description":"Returns the date/time that the current TiddlyWiki file was saved.","category":"Saving and reviewing changes","twversion":"2.0.0 or higher","format":"Plugin","link":"http://knighjm.googlepages.com/knightnet-default-tw.html#PlugIn-Knightnet","author":"Julian Knight"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob McElrath (Bob's)","link":"http://bob.mcelrath.org/plugins.html#systemConfig","format":"Plugin","category":"Scientific and mathematical notation","description":"LaTeX is the world standard for specifying, typesetting, and communicating mathematics among scientists, engineers, and mathematicians. For more information aboutLaTeX itself, visit the LaTeX Project. This plugin typesets math using jsMath, which is an implementation of the TeX math rules and typesetting in javascript, for your browser. Notice the small button in the lower right corner which opens its control panel.","twversion":"2.0.3"}</data>
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'><div align="center"></div>
<div class='tagClear'></div>
<!--}}}-->
<script>
        var tiddlers=store.getTiddlers("modified");
        var last=tiddlers[tiddlers.length-1];
        var when=last.modified.formatString("YYYY/0MM/0DD at 0hh:0mm:0ss");
        return "Last Modified:  " +when
</script> 
{{tuduSlider{<<slider chkAppearance Appearance 'Appearance »'>>}}}{{tuduSlider{<<slider chkNavigation Navigation 'Navigation »'>>}}}{{tuduSlider{<<slider chkTools Tools 'Tools »'>>}}}{{tuduSlider{<<slider chkWorkingWith WorkingWith 'Working with... »'>>}}}

 <<toggleSideBar 'toggle sideBar'>>
[[Instructions]]
NewPluginTemplate


^^~TiddlyWiki is © 2007 [[UnaMesa|http://www.unamesa.org/]]^^
<div class='toolbar' macro='toolbar jump top -closeTiddler closeOthers closeAll +editTiddler permalink references newDocument '></div>
<div class='title' macro='view title'></div>
<div macro="gradient horiz #fcb #fff"><div class='viewer' macro='view text wikified'><div align="center"></div></div></div>
<span macro='tiddler ShiftClickToEdit'></span>
<<formTiddler NewPluginTemplate>><data>{"description":"Extends the TiddlyWiki commands for the toolbar macro by adding a button to save and then close the tiddler immediately. It simply duplicates and mashes the code from the two pre-defined commands SaveTiddler and closeTiddler.","author":"Julian Knight","link":"http://knighjm.googlepages.com/knightnet-default-tw.html#PlugIn-Knightnet","format":"Plugin","twversion":"2.0.0 or higher","category":"Saving and reviewing changes"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","twversion":"2.x","description":"A macro allowing for special links not possible with standard formatting.","category":"Links"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Walt Woods","link":"http://oregonstate.edu/~woodswa/tiddlywikiplugs.html","format":"Plugin","twversion":"--","description":"zzDate is an inter-wiki date system for organization of reminders, deadlines, or anything else that needs to be dated (birthdays, Declaration of Independence, etc).<br><br>Why zzDate? zzdate happens to make all tags float to the bottom of the tags list for month and year entries. At first helped cut down on major annoyances. Note also that the \"internal\" date formatting isYYYY-MM-DD so that everything sorts month and year tags properly.","category":"Time and calendars"}</data>