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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 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; width:90%; 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 need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 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 [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

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

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

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
{{center{@@font-weight:bold;[[Accordian Menu|AccordianMenuContent]]@@}}}
{{accordianSlider{<<slider "chkTab" [[ShowTabbedMenuPackage]] 'Tabbed Menu Ā»'>>}}}{{accordianSlider{<<slider "chkAcc" [[ShowAccordianMenuPackage]] 'Accordian Menu Ā»'>>}}}{{accordianSlider{<<slider chkTools [[Tools]] 'Tools Ā»'>>}}}
It's my privilege to be able to offer this resource for free. This is possible due to the efforts of various people:
*Jeremy Ruston, the creator of ~TiddlyWiki. ^^ TiddlyWiki <<version>> Ā© 2008 [[UnaMesa|http://www.unamesa.org/]]^^
*The creators of the various piugins used in this adaptation of ~TiddlyWiki. Use the following button to see a list of the plugins used here. Each plugin contains information about its creator. <<tag systemConfig>>
*Morris Gray, who came up with the ~TiddlerBar idea, put a lot of work into perfecting the Treeview  experience, and came up with numerous other helpful tweaks.
-----
^^<html><a rel="license" href="http://creativecommons.org/licenses/by/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /></a><br />~NoteStorm is licensed by Dave Gifford under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a></html>^^

Name: Air
Background: #fff
Foreground: #000
PrimaryPale: #eff3fa
PrimaryLight: #9bd
PrimaryMid: #336699
PrimaryDark: #003366
SecondaryPale: #ffe
SecondaryLight: #ece9d8
SecondaryMid: #baa07b
SecondaryDark: #886655
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
BackgroundImage: url("http://i424.photobucket.com/albums/pp327/pamojja/sky.jpg")

{{tuduSlider{<<slider chkBookSummary Bibliografi 'Andre Ā»'>>}}}
/***
License: [[BSD open source license]] //for all plugins below//
Name: DeprecatedFunctionsPlugin "packed"
Description: Support for deprecated functions removed from core
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin){version.extensions.DeprecatedFunctionsPlugin={installed:true};config.formatterHelpers.charFormatHelper=function(w){w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);};config.formatterHelpers.monospacedByLineHelper=function(w){var _3=new RegExp(this.lookahead,"mg");_3.lastIndex=w.matchStart;var _4=_3.exec(w.source);if(_4&&_4.index==w.matchStart){var _5=_4[1];if(config.browser.isIE){_5=_5.replace(/\n/g,"\r");}createTiddlyElement(w.output,"pre",null,null,_5);w.nextMatch=_3.lastIndex;}};config.macros.br={};config.macros.br.handler=function(_6){createTiddlyElement(_6,"br");};Array.prototype.find=function(_7){var i=this.indexOf(_7);return i==-1?null:i;};Tiddler.prototype.loadFromDiv=function(_9,_a){return store.getLoader().internalizeTiddler(store,this,_a,_9);};Tiddler.prototype.saveToDiv=function(){return store.getSaver().externalizeTiddler(store,this);};function allTiddlersAsHtml(){return store.allTiddlersAsHtml();}function applyPageTemplate(_b){refreshPageTemplate(_b);}function displayTiddlers(_c,_d,_e,_f,_10,_11,_12){story.displayTiddlers(_c,_d,_e,_11);}function displayTiddler(_13,_14,_15,_16,_17,_18,_19){story.displayTiddler(_13,_14,_15,_18);}var createTiddlerPopup=Popup.create;var scrollToTiddlerPopup=Popup.show;var hideTiddlerPopup=Popup.remove;var regexpBackSlashEn=new RegExp("\\\\n","mg");var regexpBackSlash=new RegExp("\\\\","mg");var regexpBackSlashEss=new RegExp("\\\\s","mg");var regexpNewLine=new RegExp("\n","mg");var regexpCarriageReturn=new RegExp("\r","mg");}
//}}}
/***
Name: PreserveSpaceInTitlePlugin "packed"
Author: FND
***/
//{{{
Story.prototype.saveTiddler=function(_1,_2){var _3=document.getElementById(this.idPrefix+_1);if(_3!=null){var _4={};this.gatherSaveFields(_3,_4);var _5=_4.title?_4.title:_1;if(store.tiddlerExists(_5)&&_5!=_1){if(!confirm(config.messages.overwriteWarning.format([_5.toString()]))){return null;}}if(_5!=_1){this.closeTiddler(_5,false);}_3.id=this.idPrefix+_5;_3.setAttribute("tiddler",_5);_3.setAttribute("template",DEFAULT_VIEW_TEMPLATE);_3.setAttribute("dirty","false");if(config.options.chkForceMinorUpdate){_2=!_2;}if(!store.tiddlerExists(_5)){_2=false;}var _6=new Date();var _7=store.tiddlerExists(_5)?store.fetchTiddler(_5).fields:(_5!=_1&&store.tiddlerExists(_1)?store.fetchTiddler(_1).fields:{});for(var n in _4){if(!TiddlyWiki.isStandardField(n)){_7[n]=_4[n];}}var _9=store.saveTiddler(_1,_5,_4.text,_2?undefined:config.options.txtUserName,_2?undefined:_6,_4.tags,_7);autoSaveChanges(null,[_9]);return _5;}return null;};
//}}}
/***
Name: RenameButton "packed" and modified
Author: SaqImtiaz
***/
//{{{
config.macros.rB={};config.macros.rB.handler=function(a,b,c,d,e,f){if(a.lastChild.tagName!="BR"){a.lastChild.firstChild.data=c[0];if(c[1]){a.lastChild.title=c[1]}}};
//}}}
/***
Name: smileyMacro "packed"
Author: AlanHecht
***/
//{{{
version.extensions.smileyMacro={major:0,minor:1,revision:0,date:new Date(2005,7,20)};config.macros.smiley={};config.macros.smiley.handler=function(_1,_2,_3){var _4=["transparent","#000000","#1a1507","#352e18","#464646","#666666","#a3141e","#b06b63","#cc9900","#dd9030","#dddddd","#e89d00","#edc32a","#f3cb3c","#fdf201","#fdf526","#ff3149","#ffac00","#ffbf06","#ffc846","#ffcc66","#ffd758","#ffdd01","#ffea7b","#ffed55","#ffffff"];var _5=_3;var _6=null;if(_5[0]==":-)"||_5[0]==":)"){_6="aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyffyffuujbaadyyyeeyeetttdabppppddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwboooowwwbllbbwwwboooowbrllbacwwwbbbbbrllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa"}else{if(_5[0]==":-("||_5[0]==":("){_6="aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyyyyyyuujbaadyyyeeyeetttdabppppddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwoooooowwrllbbwwwwbbbbbsrllbacwwbwwwwsbllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa"}else{if(_5[0]==";-)"||_5[0]==";)"){_6="aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyxxxxxuujbaadyyyxxxeetttdabppphddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwboooowwwbllbbwwwboooowbrllbacwwwbbbbbrllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa"}else{if(_5[0]==":-|"||_5[0]==":|"){_6="aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyffyffuujbaadyyyeeyeetttdabppppddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwoooooowwrllbbwwwwbbbbbsrllbacwwwwwwwsrllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa"}else{if(_5[0]==":-D"||_5[0]==":D"){_6="aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyeeyeeuujbaadyyyeeyeetttdabppppyyyyypmmlbbwbbbbbbbbbbblbbwbkzzzzzzzkbwbbwbfzzzzzzzfbwbbwbkzzzzzzzkbwbacwbkzzzzzkblcaablsbkzzzkblibaaablsbbbbblibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa"}else{createTiddlyElement(_1,"span",null,"errorNoSuchMacro","unknown smiley")}}}}}if(_6){var _7=createTiddlyElement(_1,"span",null,"smiley",String.fromCharCode(160));_7.style.position="relative";_7.style.width="15px";_7.style.height="15px";_7.style.marginLeft="1px";_7.style.marginRight="1px";_7.style.paddingRight="12px";_7.style.verticalAlign="top";for(r=0;r<15;r++){for(c=0;c<15;c++){var _8=document.createElement("img");_8.className="smileyPixel";_8.style.position="absolute";_8.border=0;_8.style.top=r+"px";_8.style.left=c+"px";_8.style.width="1px";_8.style.height="1px";_8.style.backgroundColor=_4[_6.charCodeAt((r*15)+c)-97];_8.src="data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";_7.appendChild(_8)}}}};
//}}}
/***
Name: BackupCommand (date format modified)
Author: ArphenLin
***/
//{{{
config.commands.backup={text:"copy",tooltip:"copy this tiddler",handler:function(e,a,b){if(readOnly){return false}clearMessage();var t=store.getTiddler(b);var c=b;var d=t.text;var f=t.getTags()+" copy";var g=new Date();c=c+"("+g.formatString("0MM-0DD.0hh:0mm")+")";store.saveTiddler(c,c,d,config.options.txtUserName,g,f);displayMessage("tiddler backup, click link below to view it");var h=document.getElementById("messageArea");createTiddlyButton(h,c,"view backup tiddler",function(){story.displayTiddler(null,c,null,false,false)},"button");return false}};
//}}}
/***
Source: http://mptw.tiddlyspot.com/#SelectPalettePlugin
Author: Simon Baird <simon.baird@gmail.com>

Name: NewMeansNewPlugin "packed"
***/
//{{{
String.prototype.getNextFreeName=function(){var c=/ \(([0-9]+)\)$/;var b=c.exec(this);if(b){var a=parseInt(b[1])+1;return this.replace(c," ("+a+")")}else{return this+" (1)"}};config.macros.newTiddler.checkForUnsaved=function(a){var b=false;story.forEachTiddler(function(d,c){if(d==a){b=true}});return b};config.macros.newTiddler.getName=function(a){while(store.getTiddler(a)||config.macros.newTiddler.checkForUnsaved(a)){a=a.getNextFreeName()}return a};config.macros.newTiddler.onClickNewTiddler=function(){var e=this.getAttribute("newTitle");if(this.getAttribute("isJournal")=="true"){var a=new Date();e=a.formatString(e.trim())}e=config.macros.newTiddler.getName(e);var b=this.getAttribute("params");var i=b?b.split("|"):[];var j=this.getAttribute("newFocus");var f=this.getAttribute("newTemplate");var d=this.getAttribute("customFields");story.displayTiddler(null,e,f,false,null,null);var c=document.getElementById(story.idPrefix+e);if(d){story.addCustomFields(c,d)}var g=this.getAttribute("newText");if(typeof g=="string"){story.getTiddlerField(e,"text").value=g.format([e])}for(var h=0;h<i.length;h++){story.setTiddlerTag(e,i[h],+1)}story.focusTiddler(e,j);return false};
//}}}
/***
Name: SelectPalettePlugin "packed"
***/
//{{{
merge(config.macros,{setPalette:{handler:function(a,e,g,d,f,b){var c=g[0]?g[0]:b.title;createTiddlyButton(a,"apply","Apply this palette",function(h){config.macros.selectPalette.updatePalette(b.title);return false})}},selectPalette:{handler:function(a,d,f,c,e,b){createTiddlyDropDown(a,this.onPaletteChange,this.getPalettes())},getPalettes:function(){var a=[{caption:"-palette-",name:""},{caption:"(Default)",name:"(default)"}];var d=store.getTaggedTiddlers("systemPalette","title");for(var e=0;e<d.length;e++){var c=d[e].title;var b=store.getTiddlerSlice(c,"Name");if(b){c=b}a.push({caption:b,name:d[e].title})}return a},onPaletteChange:function(a){config.macros.selectPalette.updatePalette(this.value);return true},updatePalette:function(a){if(a!=""){store.deleteTiddler("ColorPalette");if(a!="(default)"){store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(a),config.options.txtUserName,undefined,"")}this.refreshPalette();if(config.options.chkAutoSave){saveChanges(true)}}},refreshPalette:function(){config.macros.refreshDisplay.onClick()}}});config.shadowTiddlers.OptionsPanel="<<selectPalette>>\n\n"+config.shadowTiddlers.OptionsPanel;
//}}}
text/plain
.txt .text .js .vbs .asp .cgi .pl
----
text/html
.htm .html .hta .htx .mht
----
text/comma-separated-values
.csv
----
text/javascript
.js
----
text/css
.css
----
text/xml
.xml .xsl .xslt
----
image/gif
.gif
----
image/jpeg
.jpg .jpe .jpeg
----
image/png
.png
----
image/bmp
.bmp
----
image/tiff
.tif .tiff
----
audio/basic
.au .snd
----
audio/wav
.wav
----
audio/x-pn-realaudio
.ra .rm .ram
----
audio/x-midi
.mid .midi
----
audio/mp3
.mp3
----
audio/m3u
.m3u
----
video/x-ms-asf
.asf
----
video/avi
.avi
----
video/mpeg
.mpg .mpeg
----
video/quicktime
.qt .mov .qtvr
----
application/pdf
.pdf
----
application/rtf
.rtf
----
application/postscript
.ai .eps .ps
----
application/wordperfect
.wpd
----
application/mswrite
.wri
----
application/msexcel
.xls .xls3 .xls4 .xls5 .xlw
----
application/msword
.doc
----
application/mspowerpoint
.ppt .pps
----
application/x-director
.swa
----
application/x-shockwave-flash
.swf
----
application/x-zip-compressed
.zip
----
application/x-gzip
.gz
----
application/x-rar-compressed
.rar
----
application/octet-stream
.com .exe .dll .ocx
----
application/java-archive
.jar
/***
|Name|AttachFilePlugin|
|Source|http://www.TiddlyTools.com/#AttachFilePlugin|
|Documentation|http://www.TiddlyTools.com/#AttachFilePluginInfo|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|AttachFilePluginFormatters, AttachFileMIMETypes|
|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.
> Important note: As of version 3.6.0, in order to //render// images and other binary attachments created with this plugin, you must also install [[AttachFilePluginFormatters]], which extends the behavior of the TiddlyWiki core formatters for embedded images ({{{[img[tooltip|image]]}}}), linked embedded images ({{{[img[tooltip|image][link]]}}}), and external/"pretty" links ({{{[[label|link]]}}}), so that these formatter will process references to attachment tiddlers as if a normal file reference had been provided. |
!!!!!Documentation
>see [[AttachFilePluginInfo]]
!!!!!Inline interface (live)
>see [[AttachFile]] (shadow tiddler)
><<tiddler AttachFile>>
!!!!!Revisions
<<<
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
|please see [[AttachFilePluginInfo]] for additional revision details|
2005.07.20 [1.0.0] Initial Release
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePlugin= {major: 4, minor: 0, revision: 0, date: new Date(2009,6,4)};

// shadow tiddler
config.shadowTiddlers.AttachFile="<<attach inline>>";

// add 'attach' backstage task (insert before built-in 'importTask')
if (config.tasks) { // for TW2.2b or above
	config.tasks.attachTask = {
		text: "attach",
		tooltip: "Attach a binary file as a tiddler",
		content: "<<attach inline>>"
	}
	config.backstageTasks.splice(config.backstageTasks.indexOf("importTask"),0,"attachTask");
}

config.macros.attach = {
// // lingo
//{{{
	label: "attach file",
	tooltip: "Attach a file to this document",
	linkTooltip: "Attachment: ",

	typeList: "AttachFileMIMETypes",

	titlePrompt: " enter tiddler title...",
	MIMEPrompt: "<option value=''>select MIME type...</option><option value='editlist'>[edit list...]</option>",
	localPrompt: " enter local path/filename...",
	URLPrompt: " enter remote URL...",

	tiddlerErr: "Please enter a tiddler title",
	sourceErr: "Please enter a source path/filename",
	storageErr: "Please select a storage method: embedded, local or remote",
	MIMEErr: "Unrecognized file format.  Please select a MIME type",
	localErr: "Please enter a local path/filename",
	URLErr: "Please enter a remote URL",
	fileErr: "Invalid path/file or file not found",

	tiddlerFormat: '!usage\n{{{%0}}}\n%0\n!notes\n%1\n!type\n%2\n!file\n%3\n!url\n%4\n!data\n%5\n',

//}}}
// // macro definition
//{{{
	handler:
	function(place,macroName,params) {
		if (params && !params[0])
			{ createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }
		var id=params.shift();
		this.createAttachPanel(place,id+"_attachPanel",params);
		document.getElementById(id+"_attachPanel").style.position="static";
		document.getElementById(id+"_attachPanel").style.display="block";
	},
//}}}
//{{{
	createAttachPanel:
	function(place,panel_id,params) {
		if (!panel_id || !panel_id.length) var panel_id="_attachPanel";
		// remove existing panel (if any)
		var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);
		// set styles for this panel
		setStylesheet(this.css,"attachPanel");
		// create new panel
		var title=""; if (params && params[0]) title=params.shift();
		var types=this.MIMEPrompt+this.formatListOptions(store.getTiddlerText(this.typeList)); // get MIME types
		panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);
		var html=this.html.replace(/%id%/g,panel_id);
		html=html.replace(/%title%/g,title);
		html=html.replace(/%disabled%/g,title.length?"disabled":"");
		html=html.replace(/%IEdisabled%/g,config.browser.isIE?"disabled":"");
		html=html.replace(/%types%/g,types);
		panel.innerHTML=html;
		if (config.browser.isGecko) { // FF3 FIXUP
			document.getElementById("attachSource").style.display="none";
			document.getElementById("attachFixPanel").style.display="block";
		}
		return panel;
	},
//}}}
//{{{
	toggleAttachPanel:
	function (e) {
		if (!e) var e = window.event;
		var parent=resolveTarget(e).parentNode;
		var panel = document.getElementById("_attachPanel");
		if (panel==undefined || panel.parentNode!=parent)
			panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");
		var isOpen = panel.style.display=="block";
		if(config.options.chkAnimate)
			anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
		else
			panel.style.display = isOpen ? "none" : "block" ;
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
		return(false);
	},
//}}}
//{{{
	formatListOptions:
	function(text) {
		if (!text || !text.trim().length) return "";
		// get MIME list content from text
		var parts=text.split("\n----\n");
		var out="";
		for (var p=0; p<parts.length; p++) {
			var lines=parts[p].split("\n");
			var label=lines.shift(); // 1st line=display text
			var value=lines.shift(); // 2nd line=item value
			out +='<option value="%1">%0</option>'.format([label,value]);
		}
		return out;
	},
//}}}
// // interface definition
//{{{
	css:
	".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\
		background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
		border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
		padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em; text-align:left }\
	.attachPanel form { display:inline;border:0;padding:0;margin:0; }\
	.attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\
	.attachPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
	.attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\
	.attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\
	.attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\
	.attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; \
		-moz-border-radius:5px;-webkit-border-radius:5px; }\
	.attachPanel .chk { width:auto;border:0; }\
	.attachPanel .btn { width:auto; }\
	.attachPanel .btn2 { width:49%; }\
	",
//}}}
//{{{
	html:
	'<form>\
		attach from source file\
		<input type="file" id="attachSource" name="source" size="56"\
			onChange="config.macros.attach.onChangeSource(this)">\
		<div id="attachFixPanel" style="display:none"><!-- FF3 FIXUP -->\
			<input type="text" id="attachFixSource" style="width:90%"\
				title="Enter a path/file to attach"\
				onChange="config.macros.attach.onChangeSource(this);">\
			<input type="button" style="width:7%" value="..."\
				title="Enter a path/file to attach"\
				onClick="config.macros.attach.askForFilename(document.getElementById(\'attachFixSource\'));">\
		</div><!--end FF3 FIXUP-->\
		<div class="box">\
		<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			embed data <input type=checkbox class=chk name="useData" %IEdisabled% \
				onclick="if (!this.form.MIMEType.value.length)\
					this.form.MIMEType.selectedIndex=this.checked?1:0; ">&nbsp;\
		</td><td style="border:0">\
			<select size=1 name="MIMEType" \
				onchange="this.title=this.value; if (this.value==\'editlist\')\
					{ this.selectedIndex=this.form.useData.checked?1:0; story.displayTiddler(null,config.macros.attach.typeList,2); return; }">\
				<option value=""></option>\
				%types%\
			</select>\
		</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			local link <input type=checkbox class=chk name="useLocal"\
				onclick="this.form.local.value=this.form.local.defaultValue=this.checked?config.macros.attach.localPrompt:\'\';">&nbsp;\
		</td><td style="border:0">\
			<input type=text name="local" size=15 autocomplete=off value=""\
				onchange="this.form.useLocal.checked=this.value.length" \
				onkeyup="this.form.useLocal.checked=this.value.length" \
				onfocus="if (!this.value.length) this.value=config.macros.attach.localPrompt; this.select()">\
		</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			remote link <input type=checkbox class=chk name="useURL"\
				onclick="this.form.URL.value=this.form.URL.defaultValue=this.checked?config.macros.attach.URLPrompt:\'\';\">&nbsp;\
		</td><td style="border:0">\
			<input type=text name="URL" size=15 autocomplete=off value=""\
				onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\
				onchange="this.form.useURL.checked=this.value.length;"\
				onkeyup="this.form.useURL.checked=this.value.length;">\
		</td></tr></table>\
		</div>\
		<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;vertical-align:top;width:1%;white-space:nowrap">\
			notes&nbsp;\
		</td><td style="border:0" colspan=2>\
			<textarea name="notes" style="width:98%;height:3.5em;margin-bottom:2px"></textarea>\
		</td><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			attach as&nbsp;\
		</td><td style="border:0" colspan=2>\
			<input type=text name="tiddlertitle" size=15 autocomplete=off value="%title%"\
				onkeyup="if (!this.value.length) { this.value=config.macros.attach.titlePrompt; this.select(); }"\
				onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt; this.select()" %disabled%>\
		</td></tr></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
			add tags&nbsp;\
		</td><td style="border:0">\
			<input type=text name="tags" size=15 autocomplete=off value="" onfocus="this.select()">\
		</td><td style="width:40%;text-align:right;border:0">\
			<input type=button class=btn2 value="attach"\
				onclick="config.macros.attach.onClickAttach(this)"><!--\
			--><input type=button class=btn2 value="close"\
				onclick="var panel=document.getElementById(\'%id%\'); if (panel) panel.parentNode.removeChild(panel);">\
		</td></tr></table>\
	</form>',
//}}}
// // control processing
//{{{
	onChangeSource:
	function(here) {
		var form=here.form;
		var list=form.MIMEType;
		var theFilename  = here.value;
		var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();
		// if theFilename is in current document folder, remove path prefix and use relative reference
		var h=document.location.href; folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
		if (theFilename.substr(0,folder.length)==folder) theFilename='./'+theFilename.substr(folder.length);
		else theFilename='file:///'+theFilename; // otherwise, use absolute reference
		theFilename=theFilename.replace(/\\/g,"/"); // fixup: change \ to /
		form.useLocal.checked = true;
		form.local.value = theFilename;
		form.useData.checked = !form.useData.disabled;
		list.selectedIndex=1;
		for (var i=0; i<list.options.length; i++) // find matching MIME type
			if (list.options[i].value.indexOf(theExtension)!=-1) { list.selectedIndex = i; break; }
		if (!form.tiddlertitle.disabled)
			form.tiddlertitle.value=theFilename.substr(theFilename.lastIndexOf('/')+1); // get tiddlername from filename
	},
//}}}
//{{{
	onClickAttach:
	function (here) {
		clearMessage();
		// get input values
		var form=here.form;
		var src=form.source; if (config.browser.isGecko) src=document.getElementById("attachFixSource");
		src=src.value!=src.defaultValue?src.value:"";
		var when=(new Date()).formatString(config.macros.timeline.dateFormat);
		var title=form.tiddlertitle.value;
		var local = form.local.value!=form.local.defaultValue?form.local.value:"";
		var url = form.URL.value!=form.URL.defaultValue?form.URL.value:"";
		var notes = form.notes.value;
		var tags = "attachment excludeMissing "+form.tags.value;
		var useData=form.useData.checked;
		var useLocal=form.useLocal.checked;
		var useURL=form.useURL.checked;
		var mimetype = form.MIMEType.value.length?form.MIMEType.options[form.MIMEType.selectedIndex].text:"";
		// validate checkboxes and get filename
		if (useData) {
			if (src.length) { if (!theLocation) var theLocation=src; }
			else { alert(this.sourceErr); src.focus(); return false; }
		}
		if (useLocal) {
			if (local.length) { if (!theLocation) var theLocation = local; }
			else { alert(this.localErr); form.local.focus(); return false; }
		}
		if (useURL) {
			if (url.length) { if (!theLocation) var theLocation = url; }
			else { alert(this.URLErr); form.URL.focus(); return false; }
		}
		if (!(useData||useLocal||useURL))
			{ form.useData.focus(); alert(this.storageErr); return false; }
		if (!theLocation)
			{ src.focus(); alert(this.sourceErr); return false; }
		if (!title || !title.trim().length || title==this.titlePrompt)
			{ form.tiddlertitle.focus(); alert(this.tiddlerErr); return false; }
		// if not already selected, determine MIME type based on filename extension (if any)
		if (useData && !mimetype.length && theLocation.lastIndexOf('.')!=-1) {
			var theExt = theLocation.substr(theLocation.lastIndexOf('.')).toLowerCase();
			var theList=form.MIMEType;
			for (var i=0; i<theList.options.length; i++)
				if (theList.options[i].value.indexOf(theExt)!=-1)
					{ var mimetype=theList.options[i].text; theList.selectedIndex=i; break; }
		}
		// attach the file
		return this.createAttachmentTiddler(src, when, notes, tags, title,
			useData, useLocal, useURL, local, url, mimetype);
	},
	getMIMEType:
	function(src,def) {
		var ext = src.substr(src.lastIndexOf('.')).toLowerCase();
		var list=store.getTiddlerText(this.typeList);
		if (!list || !list.trim().length) return def;
		// get MIME list content from tiddler
		var parts=list.split("\n----\n");
		for (var p=0; p<parts.length; p++) {
			var lines=parts[p].split("\n");
			var mime=lines.shift(); // 1st line=MIME type
			var match=lines.shift(); // 2nd line=matching extensions
			if (match.indexOf(ext)!=-1) return mime;
		}
		return def;
	},
	createAttachmentTiddler:
	function (src, when, notes, tags, title, useData, useLocal, useURL, local, url, mimetype, noshow) {
		if (useData) { // encode the data
			if (!mimetype.length) {
				alert(this.MIMEErr);
				form.MIMEType.selectedIndex=1; form.MIMEType.focus();
				return false;
			}
			var d = this.readFile(src); if (!d) { return false; }
			displayMessage('encoding '+src);
			var encoded = this.encodeBase64(d);
			displayMessage('file size='+d.length+' bytes, encoded size='+encoded.length+' bytes');
		}
		var usage=(mimetype.substr(0,5)=="image"?'[img[%0]]':'[[%0|%0]]').format([title]);
		var theText=this.tiddlerFormat.format([
			usage, notes.length?notes:'//none//', mimetype,
			useLocal?local.replace(/\\/g,'/'):'', useURL?url:'',
			useData?('data:'+mimetype+';base64,'+encoded):'' ]);
		store.saveTiddler(title,title,theText,config.options.txtUserName,new Date(),tags);
		var panel=document.getElementById("attachPanel"); if (panel) panel.style.display="none";
		if (!noshow) { story.displayTiddler(null,title); story.refreshTiddler(title,null,true); }
		displayMessage('attached "'+title+'"');
		return true;
	},
//}}}
// // base64 conversion
//{{{
	encodeBase64:
	function (d) {
		if (!d) return null;
		// encode as base64
		var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
		var out="";
		var chr1,chr2,chr3="";
		var enc1,enc2,enc3,enc4="";
		for (var count=0,i=0; i<d.length; ) {
			chr1=d.charCodeAt(i++);
			chr2=d.charCodeAt(i++);
			chr3=d.charCodeAt(i++);
			enc1=chr1 >> 2;
			enc2=((chr1 & 3) << 4) | (chr2 >> 4);
			enc3=((chr2 & 15) << 2) | (chr3 >> 6);
			enc4=chr3 & 63;
			if (isNaN(chr2)) enc3=enc4=64;
			else if (isNaN(chr3)) enc4=64;
			out+=keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);
			chr1=chr2=chr3=enc1=enc2=enc3=enc4="";
		}
		return out;
	},
	decodeBase64: function(input) {
		var out="";
		var chr1,chr2,chr3;
		var enc1,enc2,enc3,enc4;
		var i = 0;
		// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
		input=input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
		do {
			enc1=keyStr.indexOf(input.charAt(i++));
			enc2=keyStr.indexOf(input.charAt(i++));
			enc3=keyStr.indexOf(input.charAt(i++));
			enc4=keyStr.indexOf(input.charAt(i++));
			chr1=(enc1 << 2) | (enc2 >> 4);
			chr2=((enc2 & 15) << 4) | (enc3 >> 2);
			chr3=((enc3 & 3) << 6) | enc4;
			out=out+String.fromCharCode(chr1);
			if (enc3!=64) out=out+String.fromCharCode(chr2);
			if (enc4!=64) out=out+String.fromCharCode(chr3);
		} while (i<input.length);
		return out;
	},
//}}}
// // I/O functions
//{{{
	readFile: // read local BINARY file data
	function(filePath) {
		if(!window.Components) { return null; }
		try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
		catch(e) { alert("access denied: "+filePath); return null; }
		var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
		try { file.initWithPath(filePath); } catch(e) { alert("cannot read file - invalid path: "+filePath); return null; }
		if (!file.exists()) { alert("cannot read file - not found: "+filePath); return null; }
		var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
		inputStream.init(file, 0x01, 00004, null);
		var bInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
		bInputStream.setInputStream(inputStream);
		return(bInputStream.readBytes(inputStream.available()));
	},
//}}}
//{{{
	writeFile:
	function(filepath,data) {
		// TBD: decode base64 and write BINARY data to specified local path/filename
		return(false);
	},
//}}}
//{{{
	askForFilename: // for FF3 fixup
	function(target) {
		var msg=config.messages.selectFile;
		if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
		// get local path for current document
		var path=getLocalPath(document.location.href);
		var p=path.lastIndexOf("/"); if (p==-1) p=path.lastIndexOf("\\"); // Unix or Windows
		if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
		var file=""
		var result=window.mozAskForFilename(msg,path,file,true); // FF3 FIXUP ONLY
		if (target && result.length) // set target field and trigger handling
			{ target.value=result; target.onchange(); }
		return result; 
	}
};
//}}}
//{{{
if (window.mozAskForFilename===undefined) { // also defined by CoreTweaks (for ticket #604)
	window.mozAskForFilename=function(msg,path,file,mustExist) {
		if(!window.Components) return false;
		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, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
			var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
			thispath.initWithPath(path);
			picker.displayDirectory=thispath;
			picker.defaultExtension='';
			picker.defaultString=file;
			picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
			if (picker.show()!=nsIFilePicker.returnCancel)
				var result=picker.file.persistentDescriptor;
		}
		catch(ex) { displayMessage(ex.toString()); }
		return result;
	}
}
//}}}
/***
|Name|AttachFilePluginFormatters|
|Source|http://www.TiddlyTools.com/#AttachFilePluginFormatters|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1.3|
|Type|plugin|
|Requires||
|Description|run-time library for displaying attachment tiddlers|

This plugin provides "stand-alone" processing for //rendering// attachment tiddlers created by [[AttachFilePlugin]].   Attachment tiddlers are tagged with<<tag attachment>>and contain binary file content (e.g., jpg, gif, pdf, mp3, etc.) that has been stored directly as base64 text-encoded data or can be loaded from external files stored on a local filesystem or remote web server.

NOTE: This plugin does not include the "control panel" and supporting functions needed to //create// new attachment tiddlers.  Those features are provided by [[AttachFilePlugin]], which can be installed while building your document, and then safely omitted to reduce the overall file size when you publish your finished document (assuming you don't intend to create any additional attachment tiddlers in that document)
!!!!!Formatters
<<<
This plugin extends the behavior of the following TiddlyWiki core "wikify()" formatters:
* embedded images: {{{[img[tooltip|image]]}}}
* linked embedded images: {{{[img[tooltip|image][link]]}}}
* external/"pretty" links: {{{[[label|link]]}}}
''Please refer to AttachFilePlugin (source: http://www.TiddlyTools.com/#AttachFilePlugin) for additional information.''
<<<
!!!!!Revisions
<<<
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.10.29 [3.7.0] more code reduction: removed upload handling from AttachFilePlugin (saves ~7K!)
2007.10.28 [3.6.0] removed duplicate formatter code from AttachFilePlugin (saves ~10K!) and updated documentation accordingly.  This plugin ([[AttachFilePluginFormatters]]) is now //''required''// in order to display attached images/binary files within tiddler content.
2006.05.20 [3.4.0] through 2007.03.01 [3.5.3] sync with AttachFilePlugin
2006.05.13 [3.2.0] created from AttachFilePlugin v3.2.0
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePluginFormatters= {major: 4, minor: 0, revision: 0, date: new Date(2009,6,4)};
//}}}

//{{{
if (config.macros.attach==undefined) config.macros.attach= { };
//}}}
//{{{
if (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {
	var tiddler = store.getTiddler(title);
	if (tiddler==undefined || tiddler.tags==undefined) return false;
	return (tiddler.tags.indexOf("attachment")!=-1);
}
//}}}

//{{{
// test for local file existence - returns true/false without visible error display
if (config.macros.attach.fileExists==undefined) config.macros.attach.fileExists=function(f) {
	if(window.Components) { // MOZ
		try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
		catch(e) { return false; } // security access denied
		var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
		try { file.initWithPath(f); }
		catch(e) { return false; } // invalid directory
		return file.exists();
	}
	else { // IE
		var fso = new ActiveXObject("Scripting.FileSystemObject");
		return fso.FileExists(f);
	}
}
//}}}

//{{{
if (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {

	// extract embedded data, local and remote links (if any)
	var text=store.getTiddlerText(title,'');
	var embedded=store.getTiddlerText(title+'##data','').trim();
	var locallink=store.getTiddlerText(title+'##file','').trim();
	var remotelink=store.getTiddlerText(title+'##url','').trim();

	// backward-compatibility for older attachments (pre 4.0.0)
	var startmarker="---BEGIN_DATA---\n";
	var endmarker="\n---END_DATA---";
	var pos=0; var endpos=0;
	if ((pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1)
		embedded="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\n/g,'');
	if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1)
		locallink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));
	if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1)
		remotelink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));

	// if there is a data: URI defined (not supported by IE)
	if (embedded.length && !config.browser.isIE) return embedded;

	// document is being served remotely... use remote URL (if any)  (avoids security alert)
	if (remotelink.length && document.location.protocol!="file:")
		return remotelink;  

	// local link only... return link without checking file existence (avoids security alert)
	if (locallink.length && !remotelink.length) 
		return locallink; 

	// local link, check for file exist... use local link if found
	if (locallink.length) { 
		locallink=locallink.replace(/^\.[\/\\]/,''); // strip leading './' or '.\' (if any)
		if (this.fileExists(getLocalPath(locallink))) return locallink;
		// maybe local link is relative... add path from current document and try again
		var pathPrefix=document.location.href;  // get current document path and trim off filename
		var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\\"); 
		if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
		if (this.fileExists(getLocalPath(pathPrefix+locallink))) return locallink;
	}

	// no embedded data, no local (or not found), fallback to remote URL (if any)
	if (remotelink.length) return remotelink;

	// attachment URL doesn't resolve, just return input as is
	return title;
}
//}}}
//{{{
if (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {
	if (this.initialized) return;

	// find the formatter for "image" and replace the handler
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link
			{
			var e = w.output;
			if(lookaheadMatch[5])
				{
				var link = lookaheadMatch[5];
				// ELS -------------
				var external=config.formatterHelpers.isExternalLink(link);
				if (external)
					{
					if (config.macros.attach.isAttachment(link))
						{
						e = createExternalLink(w.output,link);
						e.href=config.macros.attach.getAttachment(link);
						e.title = config.macros.attach.linkTooltip + link;
						}
					else
						e = createExternalLink(w.output,link);
					}
				else 
					e = createTiddlyLink(w.output,link,false,null,w.isStatic);
				// ELS -------------
				addClass(e,"imageLink");
				}
			var img = createTiddlyElement(e,"img");
			if(lookaheadMatch[1])
				img.align = "left";
			else if(lookaheadMatch[2])
				img.align = "right";
			if(lookaheadMatch[3])
				img.title = lookaheadMatch[3];
			img.src = lookaheadMatch[4];
			// ELS -------------
			if (config.macros.attach.isAttachment(lookaheadMatch[4]))
				img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);
			// ELS -------------
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
//}}}
//{{{
	// find the formatter for "prettyLink" and replace the handler
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);
	if (i<config.formatters.length)	{
		config.formatters[i].handler=function(w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				var e;
				var text = lookaheadMatch[1];
				if(lookaheadMatch[3]) {
					// Pretty bracketted link
					var link = lookaheadMatch[3];
					if (config.macros.attach.isAttachment(link)) {
						e = createExternalLink(w.output,link);
						e.href=config.macros.attach.getAttachment(link);
						e.title=config.macros.attach.linkTooltip+link;
					}
					else e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))
						? createExternalLink(w.output,link)
						: createTiddlyLink(w.output,link,false,null,w.isStatic);
				} else {
					e = createTiddlyLink(w.output,text,false,null,w.isStatic);
				}
				createTiddlyText(e,text);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	} // if "prettyLink" formatter found
	this.initialized=true;
}
//}}}
//{{{
config.macros.attach.init_formatters(); // load time init
//}}}
//{{{
if (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {
	TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;
	TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {
		return config.macros.attach.isAttachment(title)?
			config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText.apply(this,arguments);
	}
}
//}}}
People who have used ~TiddlyWiki before may wish to access TW features that I have hidden or changed:
#Use the StyleSheet to adjust colors, font-sizes, page layout tweaks and other design features.
#Use [[zzConfigOptions]] to change the settings for saving options, animations, toggle options, single page mode options (to view multiple tiddlers) and search options.
#Use ViewTemplate to restore tiddler subtitles and tagging boxes. Warning: you will need to carefully add lines of code from the original ViewTemplate at http://www.tiddlywiki.com.
[[Efter titel]]
[[Efter forfatter]]
[[Efter tema]]
[[Efter titel|By title]]
[[Efter forfatter|By author]]
[[Efter tema|By topic]]
Our other note-taking ~TiddlyWiki, called BibblyWiki, is better for creating bibliographies. But we include a simple bibliography feature here for those who want it. 
#Click on 'new bib entry' in the right sidebar menu.
#Assign the tiddler a title and click 'done.'
#Fill in any form fields you wish, especially the first four fields. 
##To remove a particular form field from all notes, open [[NewBibEntryTemplate]] and find and carefully remove the appropriate code.
#Open "Bibliography" in the left menu to see your entry in the three bibliographies.
{{tuduSlider{<<slider chkBookSummary Bibliografi 'Bibliografi Ā»'>>}}}<<newTiddler label:"Ny bog/artikel" text:{{"<<formTiddler NewBibEntryTemplate\>\>"}}  tag:"authorbook""BĆøger">>
{{comment{<<tiddler AndreBĆøger&Artikler>>}}}
/***
|Name|BreadcrumbsPlugin ''packed''|
|Author|Eric Shulman|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|Version|2.1.0|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|Description|list/jump to tiddlers viewed during this session plus "back" button/macro|
***/
//{{{
version.extensions.BreadcrumbsPlugin={major:2,minor:1,revision:0,date:new Date("March 2, 2009")};var co=config.options;if(co.chkShowBreadcrumbs===undefined){co.chkShowBreadcrumbs=true}if(co.chkReorderBreadcrumbs===undefined){co.chkReorderBreadcrumbs=true}if(co.chkCreateDefaultBreadcrumbs===undefined){co.chkCreateDefaultBreadcrumbs=true}if(co.chkShowStartupBreadcrumbs===undefined){co.chkShowStartupBreadcrumbs=false}if(co.chkBreadcrumbsReverse===undefined){co.chkBreadcrumbsReverse=false}if(co.chkBreadcrumbsLimit===undefined){co.chkBreadcrumbsLimit=false}if(co.txtBreadcrumbsLimit===undefined){co.txtBreadcrumbsLimit=5}if(co.chkBreadcrumbsLimitOpenTiddlers===undefined){co.chkBreadcrumbsLimitOpenTiddlers=false}if(co.txtBreadcrumbsLimitOpenTiddlers===undefined){co.txtBreadcrumbsLimitOpenTiddlers=3}if(co.chkBreadcrumbsHideHomeLink===undefined){co.chkBreadcrumbsHideHomeLink=false}if(co.chkBreadcrumbsSave===undefined){co.chkBreadcrumbsSave=false}config.macros.breadcrumbs={crumbs:[],askMsg:"Save current breadcrumbs before clearing?\nPress OK to save, or CANCEL to continue without saving.",saveMsg:"Enter the name of a tiddler in which to save the current breadcrumbs",saveTitle:"SavedBreadcrumbs",handler:function(a,f,h,e,g,b){var d=createTiddlyElement(a,"span",null,"breadCrumbs",null);d.setAttribute("homeSep",h[0]?h[0]:this.homeSeparator);d.setAttribute("crumbSep",h[1]?h[1]:this.crumbSeparator);this.render(d)},add:function(d){var b=d;var a=this.crumbs.indexOf(b);if(a===-1){this.crumbs.push(b)}else{if(config.options.chkReorderBreadcrumbs){this.crumbs.push(this.crumbs.splice(a,1)[0])}else{this.crumbs=this.crumbs.slice(0,a+1)}}if(config.options.chkBreadcrumbsLimitOpenTiddlers){this.limitOpenTiddlers()}this.refresh();return false},getAreas:function(){var d=[];var g=document.getElementsByTagName("*");for(var f=0;f<g.length;f++){try{if(hasClass(g[f],"breadCrumbs")){d.push(g[f])}}catch(j){}}var b=document.getElementById("breadCrumbs");if(b&&!hasClass(b,"breadCrumbs")){d.push(b)}if(!d.length&&config.options.chkCreateDefaultBreadcrumbs){var a=createTiddlyElement(null,"span",null,"breadCrumbs",null);a.style.display="none";var h=document.getElementById("tiddlerDisplay");h.parentNode.insertBefore(a,h);d.push(a)}return d},refresh:function(){var a=this.getAreas();for(var b=0;b<a.length;b++){a[b].style.display=config.options.chkShowBreadcrumbs?"block":"none";removeChildren(a[b]);this.render(a[b])}},render:function(d){var h=config.options;var b="";var g=d.getAttribute("homeSep");if(!g){g=this.homeSeparator}var a=d.getAttribute("crumbSep");if(!a){a=this.crumbSeparator}if(!h.chkBreadcrumbsHideHomeLink){createTiddlyButton(d,"Home",null,this.home,"tiddlyLink tiddlyLinkExisting");b+=g}for(c=0;c<this.crumbs.length;c++){if(!store.tiddlerExists(this.crumbs[c])&&!store.isShadowTiddler(this.crumbs[c])){this.crumbs.splice(c,1)}}var e=this.crumbs.length;if(h.chkBreadcrumbsLimit&&h.txtBreadcrumbsLimit<e){e=h.txtBreadcrumbsLimit}var f=[];for(c=this.crumbs.length-e;c<this.crumbs.length;c++){f.push("[["+this.crumbs[c]+"]]")}if(h.chkBreadcrumbsReverse){f.reverse()}b+=f.join(a);wikify(b,d)},home:function(){var d=config.macros.breadcrumbs;if(config.options.chkBreadcrumbsSave&&confirm(d.askMsg)){d.saveCrumbs()}story.closeAllTiddlers();restart();d.crumbs=[];var a=d.getAreas();for(var b=0;b<a.length;b++){a[b].style.display="none"}return false},saveCrumbs:function(){var g=prompt(this.saveMsg,this.saveTitle);if(!g||!g.length){return}var e=store.getTiddler(g);if(e&&!confirm(config.messages.overwriteWarning.format([g]))){return}var f=config.options.txtUserName;var b=new Date();var h="[["+this.crumbs.join("]]\n[[")+"]]";var d=e?e.tags:[];d.pushUnique("story");var a=e?e.fields:{};store.saveTiddler(g,g,h,f,b,d,a);story.displayTiddler(null,g);story.refreshTiddler(g,null,true);displayMessage(g+" has been "+(e?"updated":"created"))},limitOpenTiddlers:function(){var a=config.options.txtBreadcrumbsLimitOpenTiddlers;if(a<1){a=1}for(c=this.crumbs.length-1;c>=0;c--){var d=this.crumbs[c];var b=document.getElementById(story.idPrefix+d);if(b){if(a<=0){if(b.getAttribute("dirty")=="true"){var e="'"+d+"' is currently being edited.\n\n";e+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";if(confirm(e)){story.saveTiddler(d);story.closeTiddler(d)}}else{story.closeTiddler(this.crumbs[c])}}a--}}}};if(config.macros.breadcrumbs.homeSeparator==undefined){config.macros.breadcrumbs.homeSeparator=" | "}if(config.macros.breadcrumbs.crumbSeparator==undefined){config.macros.breadcrumbs.crumbSeparator=" > "}config.commands.previousTiddler={text:"back",tooltip:"view the previous tiddler",hideReadOnly:false,dateFormat:"DDD, MMM DDth YYYY hh:0mm:0ss",handler:function(e,g,f){var d=story.findContainingTiddler(g);if(!d){return}var a=config.macros.breadcrumbs.crumbs;if(a.length>1){var b=a[a.length-2];story.displayTiddler(d,b)}else{config.macros.breadcrumbs.home()}return false}};config.macros.previousTiddler={label:"back",prompt:"view the previous tiddler",handler:function(b,g,i,f,h,e){var d=i.shift();if(!d){d=this.label}var a=i.shift();if(!a){a=this.prompt}createTiddlyButton(b,d,a,function(){var j=config.macros.breadcrumbs.crumbs;if(j.length>1){var k=j[j.length-2];story.displayTiddler(b,k)}else{config.macros.breadcrumbs.home()}})}};if(Story.prototype.breadCrumbs_coreDisplayTiddler==undefined){Story.prototype.breadCrumbs_coreDisplayTiddler=Story.prototype.displayTiddler}Story.prototype.displayTiddler=function(a,d,e,b,f){var g=(d instanceof Tiddler)?d.title:d;this.breadCrumbs_coreDisplayTiddler.apply(this,arguments);if(!startingUp||config.options.chkShowStartupBreadcrumbs){config.macros.breadcrumbs.add(g)}};if(TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined){TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler}TiddlyWiki.prototype.removeTiddler=function(a){this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);config.macros.breadcrumbs.refresh()};
//}}}
/%
FileBrowser by EricShulman - http://www.tiddlytools.com/faq.html#FAQ_LocalFilesWithIFRAME
%/{{floatright{<<tiddler Switch##Nav>>}}}{{whiteGray{<<tabs bRowse
"Web " "show web browser" Browser##web
"File " "show file browser" Browser##file
"System " "show file system - possible when this TW saved to the drive" Browser##system
"Google " "show google browser" Browser##google
"Tiddler " "fast access to all tiddlers" QuickMenu
>>}}}/%
!file
<html><form target="theFrameID"><input type=file name=whichfile><input type=button value="view"onclick="var frame=document.getElementById(this.form.target);this.form.action='file:///'+this.form.whichfile.value;try{frame.style.display='block';this.form.done.disabled=false;this.form.submit();}catch(e){alert(e.description?e.description:e.toString());}"><input type=button name=done value="done" disabledonclick="var frame=document.getElementById(this.form.target);frame.style.display='none';this.disabled=true;"></form><iframe src="" name="theFrameID" id="theFrameID"style="display:none;background:#fff;width:100%;height:500px"></iframe>
</html>
!system
<html><iframe src ="file:./" frameborder="0" width="100%" align="center" height="600"></iframe></html>
@@marginLeft:600px; @@
!web
{{smallform{<<tiddler MicroBrowser>>}}}
!google
@@width:100%;<html><hide linebreaks>
	<iframe src ="http://www.google.com/" frameborder="0" width="100%" align="center" height="600">
	</iframe>
</html>
@@marginLeft:600px; @@
!0
%/
<<tiddler EmnerTemplate with: [["+tiddler.title+"]]$))"'>>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]] wikibar'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div macro='tiddler QuickEditToolbar'></div>
<div class='editor' macro='edit tags'></div>
<div macro='showWhen tiddler.tags.contains(&quot;Topics&quot;) || tiddler.title ==&quot;Enter the name for your new master topic here&quot;'>[[TopicNote]]</div> 
<div macro='showWhen tiddler.tags.contains(&quot;Note&quot;) || tiddler.title ==&quot;New Note&quot;'>[[NoteNote]]</div>
<div class='small'>billede URL (jpg/gif):</div>
<div class='editor' macro='edit billede'></div>
<div class='editor' macro='edit text'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'><span macro='wikify "//@@bgcolor(#99ff33):BogRapport:@@//"'</span><span class macro="checkbox rapport@"></span></span><span class='newbutton' style='padding-right: 0.5em;' macro='newHere title:"Skriv titlen pĆ„ din bog og klik fƦrdig" label:"*Ny bog/artikel*" tag:"BĆøger"'></span><span macro='snapshot print label:print prompt:Udskriv id:story'></span></div>
<div class='title' macro='view title'></div>
<table class='borderless' style='width:70%'><tr>
<td style='width:1%'><div class='small' macro='wikify [<img(182px+,)[%1|%0][%1-note]] billede@here title@here'></div>
<div class macro='formTiddler BogRapportTemplate'></div></div></td>
<td style='width:20%'>
<div class='small' macro='formTiddler NewBibEntry'></div></td></table>
<div class='viewer' macro='view text wikified'><span macro="rating"></span>(Rated <span macro='view average_rating'></span> with <span macro='view votes'></span> votes) <br/></div>
<div <span class='menubox' style='float:center;margin:0em' macro='notes heading:"NoteArkiv" tag:"NoteArkiv" suffix:"note"'> </span></div>
<div class='tagClear'></div>
<!--}}}-->
@@color:#ffc;''&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> 
/***
|Name|CheckboxPlugin|
|Source|http://www.TiddlyTools.com/#CheckboxPlugin|
|Documentation|http://www.TiddlyTools.com/#CheckboxPluginInfo|
|Version|2.4.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|Add checkboxes to your tiddler content|
This plugin extends the TiddlyWiki syntax to allow definition of checkboxes that can be embedded directly in tiddler content.  Checkbox states are preserved by:
* by setting/removing tags on specified tiddlers,
* or, by setting custom field values on specified tiddlers,
* or, by saving to a locally-stored cookie ID,
* or, automatically modifying the tiddler content (deprecated)
When an ID is assigned to the checkbox, it enables direct programmatic access to the checkbox DOM element, as well as creating an entry in TiddlyWiki's config.options[ID] internal data.  In addition to tracking the checkbox state, you can also specify custom javascript for programmatic initialization and onClick event handling for any checkbox, so you can provide specialized side-effects in response to state changes.
!!!!!Documentation
>see [[CheckboxPluginInfo]]
!!!!!Revisions
<<<
2008.01.08 [*.*.*] plugin size reduction: documentation moved to [[CheckboxPluginInfo]]
2008.01.05 [2.4.0] set global "window.place" to current checkbox element when processing checkbox clicks.  This allows init/beforeClick/afterClick handlers to reference RELATIVE elements, including using "story.findContainingTiddler(place)".  Also, wrap handlers in "function()" so "return" can be used within handler code.
|please see [[CheckboxPluginInfo]] for additional revision details|
2005.12.07 [0.9.0] initial BETA release
<<<
!!!!!Code
***/
//{{{
version.extensions.CheckboxPlugin = {major: 2, minor: 4, revision:0 , date: new Date(2008,1,5)};
//}}}
//{{{
config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: "checkbox",
	match: "\\[[xX_ ][\\]\\=\\(\\{]",
	lookahead: "\\[([xX_ ])(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?({[^}]*})?\\]",
	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) {
			// get params
			var checked=(lookaheadMatch[1].toUpperCase()=="X");
			var id=lookaheadMatch[2];
			var target=lookaheadMatch[3];
			if (target) target=target.substr(1,target.length-2).trim(); // trim off parentheses
			var fn_init=lookaheadMatch[4];
			var fn_clickBefore=lookaheadMatch[5];
			var fn_clickAfter=lookaheadMatch[6];
			var tid=story.findContainingTiddler(w.output);  if (tid) tid=tid.getAttribute("tiddler");
			var srctid=w.tiddler?w.tiddler.title:null;
			config.macros.checkbox.create(w.output,tid,srctid,w.matchStart+1,checked,id,target,config.checkbox.refresh,fn_init,fn_clickBefore,fn_clickAfter);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} );
config.macros.checkbox = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one
			var here=story.findContainingTiddler(place);
			if (here) tiddler=store.getTiddler(here.getAttribute("tiddler"))
		}
		var srcpos=0; // "inline X" not applicable to macro syntax
		var target=params.shift(); if (!target) target="";
		var defaultState=params[0]=="checked"; if (defaultState) params.shift();
		var id=params.shift(); if (id && !id.length) id=null;
		var fn_init=params.shift(); if (fn_init && !fn_init.length) fn_init=null;
		var fn_clickBefore=params.shift();
		if (fn_clickBefore && !fn_clickBefore.length) fn_clickBefore=null;
		var fn_clickAfter=params.shift();
		if (fn_clickAfter && !fn_clickAfter.length) fn_clickAfter=null;
		var refresh={ tagged:true, tagging:true, container:false };
		this.create(place,tiddler.title,tiddler.title,0,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter);
	},
	create: function(place,tid,srctid,srcpos,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter) {
		// create checkbox element
		var c = document.createElement("input");
		c.setAttribute("type","checkbox");
		c.onclick=this.onClickCheckbox;
		c.srctid=srctid; // remember source tiddler
		c.srcpos=srcpos; // remember location of "X"
		c.container=tid; // containing tiddler (may be null if not in a tiddler)
		c.tiddler=tid; // default target tiddler 
		c.refresh = {};
		c.refresh.container = refresh.container;
		c.refresh.tagged = refresh.tagged;
		c.refresh.tagging = refresh.tagging;
		place.appendChild(c);
		// set default state
		c.checked=defaultState;
		// track state in config.options.ID
		if (id) {
			c.id=id.substr(1); // trim off leading "="
			if (config.options[c.id]!=undefined)
				c.checked=config.options[c.id];
			else
				config.options[c.id]=c.checked;
		}
		// track state in (tiddlername|tagname) or (fieldname@tiddlername)
		if (target) {
			var pos=target.indexOf("@");
			if (pos!=-1) {
				c.field=pos?target.substr(0,pos):"checked"; // get fieldname (or use default "checked")
				c.tiddler=target.substr(pos+1); // get specified tiddler name (if any)
				if (!c.tiddler || !c.tiddler.length) c.tiddler=tid; // if tiddler not specified, default == container
				if (store.getValue(c.tiddler,c.field)!=undefined)
					c.checked=(store.getValue(c.tiddler,c.field)=="true"); // set checkbox from saved state
			} else {
				var pos=target.indexOf("|"); if (pos==-1) var pos=target.indexOf(":");
				c.tag=target;
				if (pos==0) c.tag=target.substr(1); // trim leading "|" or ":"
				if (pos>0) { c.tiddler=target.substr(0,pos); c.tag=target.substr(pos+1); }
				if (!c.tag.length) c.tag="checked";
				var t=store.getTiddler(c.tiddler);
				if (t && t.tags)
					c.checked=t.isTagged(c.tag); // set checkbox from saved state
			}
		}
		// trim off surrounding { and } delimiters from init/click handlers
		if (fn_init) c.fn_init="(function(){"+fn_init.trim().substr(1,fn_init.length-2)+"})()";
		if (fn_clickBefore) c.fn_clickBefore="(function(){"+fn_clickBefore.trim().substr(1,fn_clickBefore.length-2)+"})()";
		if (fn_clickAfter) c.fn_clickAfter="(function(){"+fn_clickAfter.trim().substr(1,fn_clickAfter.length-2)+"})()";
		c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
	},
	onClickCheckbox: function(event) {
		window.place=this;
		if (this.init && this.fn_init) // custom function hook to set initial state (run only once)
			{ try { eval(this.fn_init); } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
		if (!this.init && this.fn_clickBefore) // custom function hook to override changes in checkbox state
			{ try { eval(this.fn_clickBefore) } catch(e) { displayMessage("Checkbox onClickBefore error: "+e.toString()); } }
		if (this.id)
			// save state in config AND cookie (only when ID starts with 'chk')
			{ config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }
		if (this.srctid && this.srcpos>0 && (!this.id || this.id.substr(0,3)!="chk") && !this.tag && !this.field) {
			// save state in tiddler content only if not using cookie, tag or field tracking
			var t=store.getTiddler(this.srctid); // put X in original source tiddler (if any)
			if (t && this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
				t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);
				if (!story.isDirty(t.title)) story.refreshTiddler(t.title,null,true);
				store.setDirty(true);
			}
		}
		if (this.field) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			// set the field value in the target tiddler
			store.setValue(this.tiddler,this.field,this.checked?"true":"false");
			// DEBUG: displayMessage(this.field+"@"+this.tiddler+" is "+this.checked);
		}
		if (this.tag) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			var t=store.getTiddler(this.tiddler);
			if (t) {
				var tagged=(t.tags && t.tags.indexOf(this.tag)!=-1);
				if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
				if (!this.checked && tagged) { t.tags.splice(t.tags.indexOf(this.tag),1); store.setDirty(true); }
			}
			// if tag state has been changed, update display of corresponding tiddlers (unless they are in edit mode...)
			if (this.checked!=tagged) {
				if (this.refresh.tagged) {
					if (!story.isDirty(this.tiddler)) // the TAGGED tiddler in view mode
						story.refreshTiddler(this.tiddler,null,true); 
					else // the TAGGED tiddler in edit mode (with tags field)
						config.macros.checkbox.refreshEditorTagField(this.tiddler,this.tag,this.checked);
				}
				if (this.refresh.tagging)
					if (!story.isDirty(this.tag)) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
			}
		}
		if (!this.init && this.fn_clickAfter) // custom function hook to react to changes in checkbox state
			{ try { eval(this.fn_clickAfter) } catch(e) { displayMessage("Checkbox onClickAfter error: "+e.toString()); } }
		// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!) (and not when editing container)
		if (!this.init && this.refresh.container && this.container!=this.tiddler)
			if (!story.isDirty(this.container)) story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
		return true;
	},
	refreshEditorTagField: function(title,tag,set) {
		var tagfield=story.getTiddlerField(title,"tags");
		if (!tagfield||tagfield.getAttribute("edit")!="tags") return; // if no tags field in editor (i.e., custom template)
		var tags=tagfield.value.readBracketedList();
		if (tags.contains(tag)==set) return; // if no change needed
		if (set) tags.push(tag); // add tag
		else tags.splice(tags.indexOf(tag),1); // remove tag
		for (var t=0;t<tags.length;t++) tags[t]=String.encodeTiddlyLink(tags[t]);
		tagfield.value=tags.join(" "); // reassemble tag string (with brackets as needed)
		return;
	}
}
//}}}
/%
!info
|Name|CheckboxToggleTag|
|Source|http://www.TiddlyTools.com/#CheckboxToggleTag|
|Version|1.3.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transcluded HTML|
|Requires||
|Overrides||
|Description|toggle between two tag values using an HTML checkbox (no plugins)|
Usage:
<<<
{{{
in tiddler content:
   <<tiddler CheckboxToggleTag with: tag1 tag2 TiddlerName>> label
in ViewTemplate or EditTemplate:
   <span macro='CheckboxToggleTag with: tag1 tag2 TiddlerName'></span> label
}}}
where:
*''tag1'' is the tag to use when the checkbox is set
*''tag2'' //(optional)// is the tag to use when the checkbox is cleared (default=remove ''tag1'')
*''~TiddlerName'' //(optional)// is the tiddler to be tagged (default=current tiddler)
*''label'' //(optional)// is any text you want to display next to the checkbox
//note: to specify a ''~TiddlerName'' while omitting ''tag2'', use {{{""}}} (empty quotes) as a placeholder for ''tag2''//
<<<
Examples:
<<<
{{{
<<tiddler CheckboxToggleTag with: sometag>> set/clear 'sometag'
<<tiddler CheckboxToggleTag with: tagA tagB>> toggle tagA (checked) and tagB (unchecked)
}}}
<<tiddler CheckboxToggleTag with: sometag>> set/clear 'sometag'
<<tiddler CheckboxToggleTag with: tagA tagB>> toggle tagA (checked) and tagB (unchecked)
<<<
Notes:
<<<
*Clicking a checkbox immediately changes the corresponding tag value in the tiddler. This can, in some cases, trigger additional 'side-effect' processing, such as refreshing of page elements, or autosaving of the document (if that option is enabled).
*If you are currently editing the tiddler being tagged, any //unsaved// changes you have made to the contents of the ''tags'' input field will be discarded when the checkbox is clicked.
<<<
!end info
!show
<html><input type="checkbox" onclick="
	store.suspendNotifications();
	var tid=this.getAttribute('tid');
	var ontag=this.getAttribute('onTag');
	var offtag=this.getAttribute('offTag');
	if (ontag && ontag.length)  store.setTiddlerTag(tid,this.checked,ontag);
	if (offtag && offtag.length) store.setTiddlerTag(tid,!this.checked,offtag);
	store.resumeNotifications();
	store.notify(tid,true);
	var here=story.findContainingTiddler(this);
	if (here) { /* refresh current tiddler */
		var title=here.getAttribute('tiddler');
		var template=story.chooseTemplateForTiddler(title,story.isDirty(title)?2:1);
		story.refreshTiddler(title,template,true);
	}
	return false;
"><nowiki></html><<tiddler {{
	var tid="$3";
	if (tid=="$"+"3") {
		var here=story.findContainingTiddler(place);
		if (here) tid=here.getAttribute('tiddler');
	}
	if (store.tiddlerExists(tid)) {
		var c=place.lastChild.firstChild;
		c.setAttribute('onTag','$1');
		c.setAttribute('offTag','$2'!='$'+'2'&&'$2'!='undefined'?'$2':'');
		c.setAttribute('tid',tid);
		c.checked=store.getTiddler(tid).isTagged(c.getAttribute('onTag'));
	}
'';}}>>
!end show

%/<<tiddler {{'CheckboxToggleTag##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]]>>
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

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

});

//}}}

Name: Air
Background: #fff
Foreground: #000
PrimaryPale: #eff3fa
PrimaryLight: #9bd
PrimaryMid: #336699
PrimaryDark: #003366
SecondaryPale: #ffe
SecondaryLight: #ece9d8
SecondaryMid: #baa07b
SecondaryDark: #886655
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
BackgroundImage: url("http://i424.photobucket.com/albums/pp327/pamojja/sky.jpg")

/%
|Name|Compare|
|Source|http://menuflex.tiddlyspot.com/#Compare - abandoned: http://www.TiddlyTools.com/#CompareTiddlers|
|Author|Eric Shulman, modified by Wolfgang|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Type|Html|
|Description|TidIDE: show color-coded differences between two selected tiddlers. - This is a modified version of CompareTiddlers with dependency to InlneJavascriptPlugin eliminated. Important: Don't ask the original author for support to this variant script, before you haven't verified it by installing instead the latest version of the full CompareTiddlersPlugin.|

%/<<tiddler HideTiddlerTags>>{{smallform small{
<html><form action="javascript:;" style="display:inline"><!--
	--><select name=list1 size=1 style="width:30%" onchange="var f=this.form; f.view1.disabled=f.edit1.disabled=f.done.disabled=!this.value.length; f.compare.disabled=!f.list1.value.length||!f.list2.value.length; if (!this.value.length) return; f.text1.style.display=f.text2.style.display='inline'; f.text1.value=store.getTiddlerText(this.value);"></select><!--
	--><input type=button name=view1 style="width:10%" value='view' disabled 
		onclick="if (this.form.list1.value.length) story.displayTiddler(story.findContainingTiddler(this),this.form.list1.value,DEFAULT_VIEW_TEMPLATE)"><!--
	--><input type=button name=edit1 style="width:10%" value='edit' disabled 
		onclick="if (this.form.list1.value.length) story.displayTiddler(story.findContainingTiddler(this),this.form.list1.value,DEFAULT_EDIT_TEMPLATE)"><!--
	--><select name=list2 size=1 style="width:30%" onchange="var f=this.form; f.view2.disabled=f.edit2.disabled=f.done.disabled=!this.value.length; f.compare.disabled=!f.list1.value.length||!f.list2.value.length; if (!this.value.length) return; f.text1.style.display=f.text2.style.display='inline'; f.text2.value=store.getTiddlerText(this.value)"></select><!--
	--><input type=button name=view2 style="width:10%" value='view' disabled 
		onclick="if (this.form.list2.value.length) story.displayTiddler(story.findContainingTiddler(this),this.form.list2.value,DEFAULT_VIEW_TEMPLATE)"><!--
	--><input type=button name=edit2 style="width:10%" value='edit' disabled 
		onclick="if (this.form.list2.value.length) story.displayTiddler(story.findContainingTiddler(this),this.form.list2.value,DEFAULT_EDIT_TEMPLATE)"><br><!--
	--><textarea name=text1 style="width:49.5%;display:none" rows="10" readonly></textarea><!--
	--><textarea name=text2 style="width:49.5%;display:none" rows="10" readonly></textarea><!--
	--><div style='float:left'><!--
	-->The output shows additions in green, and deletions in red<!--
	--></div><!--
	--><div style='text-align:right'><!--
	--><input type=button name=compare style="width:10%" value='compare' disabled 
		onclick="var f=this.form; if (!f.list1.value.length) { f.list1.focus(); return alert('select a tiddler'); } var t1=store.getTiddlerText(f.list1.value); if (!t1) { displayMessage(f.list1.value+' not found');return false; } if (!f.list2.value.length) { f.list2.focus(); return alert('select a tiddler'); } var t2=store.getTiddlerText(f.list2.value); if (!t2) { displayMessage(f.list2.value+' not found');return false; } removeChildren(f.parentNode.nextSibling); var out=diffString(t1,t2); if (!out || !out.length) out='no differences'; f.parentNode.nextSibling.innerHTML=out;  f.parentNode.nextSibling.style.display='block'; f.done.disabled=false;"><!--
	--><input type=button name=done style="width:10%" value='done' disabled 
		onclick="var f=this.form; f.text1.style.display='none'; f.text1.value=''; var list=f.list1; while (list.options[0]) list.options[0]=null; list.options[0]=new Option('select a tiddler...','',false,false); var tids=store.getTiddlers('title','excludeLists'); for (i=0; i<tids.length; i++) list.options[list.length]=new Option(tids[i].title,tids[i].title,false,false); f.text2.style.display='none'; f.text2.value=''; var list=f.list2; while (list.options[0]) list.options[0]=null; list.options[0]=new Option('select a tiddler...','',false,false); var tids=store.getTiddlers('title','excludeLists'); for (i=0; i<tids.length; i++) list.options[list.length]=new Option(tids[i].title,tids[i].title,false,false); f.parentNode.nextSibling.style.display='none'; removeChildren(f.parentNode.nextSibling); f.view1.disabled=f.view2.disabled=f.edit1.disabled=f.edit2.disabled=f.compare.disabled=this.disabled=true;"><!--
	--></div><!--
--></form></html><<tiddler {{

	// initialize form
	var form=place.lastChild.firstChild;
	var tids=store.getTiddlers('title','excludeLists');
	while (form.list1.options[0]) form.list1.options[0]=null; 
	form.list1.options[0]=new Option("select a tiddler...","",false,false);
	for (i=0; i<tids.length; i++)
		form.list1.options[form.list1.length]=new Option(tids[i].title,tids[i].title,false,false);
	while (form.list2.options[0]) form.list2.options[0]=null; 
	form.list2.options[0]=new Option("select a tiddler...","",false,false);
	for (i=0; i<tids.length; i++)
		form.list2.options[form.list2.length]=new Option(tids[i].title,tids[i].title,false,false);

'';}}>>@@display:none;margin-top:1em;border:1px solid;-moz-border-radius:1em;padding:1em;white-space:normal;/%
this will be replaced with output from compare button 
%/@@}}}<html><div style='clear:both'></div></html><<tiddler {{

// returns difference between old and new text, color-formatted additions and deletions
window.diffString=function( o, n ) {
  if (o==n) return ""; // simple check, saves time if true
  var error = 5;
  var reg = new RegExp( "\\n|(?:.{0,"+error+"})", "g" );
  var oarr = o.match( reg ); // dices text into chunks
  var narr = n.match( reg );
  var out = diff(oarr,narr); // compare the word arrays
  var str = ""; // construct output
  for (i=0; i<out.length; i++) {
	switch (out[i].change) {
		case "ADDED":
			str+="<span style='color:green'>";
			str+=narr.slice(out[i].index,out[i].index+out[i].length).join("");
			str+="</span> ";
			break;
		case "DELETED":
			str+="<span style='color:red'>";
			str+=oarr.slice(out[i].index,out[i].index+out[i].length).join("");
			str+="</span> ";
			break;
		default:
			str+="<span>";
			str+=oarr.slice(out[i].index,out[i].index+out[i].length).join("");
			str+="</span> ";
			break;
	}	
  }
  return str;
  return "<html>"+str+"</html>";
}

/***
!About
|Author - Bradley Meck|
|Date - Dec 24, 2006|
|Version - 1.4.1|
This is a simple function to be used to find the differences between one set of objects and another. ''The objects do not need to be Strings''. It outputs and array of objects with the properties value and change. This function is pretty hefts but appears to be rather light for a diff and tops out at O(N^^2^^) for absolute worst cast scenario that I can find.
!History
*December 23, 2006 - Function made to be minimal edit diff, and changed output.
!Code
***/

function diff( oldArray, newArray ) {
	var newElementHash = { };
	for( var i = 0; i < newArray.length; i++ ) {
		if( ! newElementHash [ newArray [ i ] ] ) {
			newElementHash [ newArray [ i ] ] = [ ];
		}
		newElementHash [ newArray [ i ] ].push( i );
	}
	var substringTable = [ ];
	for( var i = 0; i < oldArray.length; i++ ) {
		if(newElementHash [ oldArray [ i ] ] ) {
			var locations = newElementHash [ oldArray [ i ] ] ;
			for( var j = 0; j < locations.length; j++){
				var length = 1;
				while( i + length < oldArray.length && locations [ j ] + length < newArray.length
					&& oldArray [ i + length ] == newArray [ locations [ j ] + length ] ){
					length++;
				}
				substringTable.push( {
					oldArrayIndex : i,
					newArrayIndex : locations [ j ],
					matchLength : length
				} );
			}
		}
	}
	substringTable.sort( function( a, b ) {
		if ( a.matchLength > b.matchLength /* a is less than b by some ordering criterion */ ) {
			return -1;
		}
		if ( a.matchLength < b.matchLength /* a is greater than b by the ordering criterion */ ) {
			return 1;
		}
		// a must be equal to b
		return 0
	} );
	//displayMessage( substringTable.toSource( ) );
	for( var i = 0; i < substringTable.length; i++) {
		for( var j = 0; j < i; j++) {
			var oldDelta = substringTable [ i ].oldArrayIndex + substringTable [ i ].matchLength - 1 - substringTable [ j ].oldArrayIndex;
			var newDelta = substringTable [ i ].newArrayIndex + substringTable [ i ].matchLength - 1 - substringTable [ j ].newArrayIndex;
			//displayMessage( "oldDelta ::: " + oldDelta );
			//displayMessage( "newDelta ::: " + newDelta );
			//displayMessage( "matchLength ::: " + substringTable [ j ].matchLength );
			if( ( oldDelta >= 0 && oldDelta <= substringTable [ j ].matchLength )
			|| ( newDelta >= 0 && newDelta <= substringTable [ j ].matchLength )
			|| ( oldDelta < 0 && newDelta > 0 )
			|| ( oldDelta > 0 && newDelta < 0 ) ) {
				substringTable.splice( i, 1 );
				i--;
				break;
			}
		}
	}
	//displayMessage( substringTable.toSource(  ) );
	substringTable.sort( function( a, b ) {
		if ( a.oldArrayIndex < b.oldArrayIndex /* a is less than b by some ordering criterion */ ) {
			return -1;
		}
		if ( a.oldArrayIndex > b.oldArrayIndex /* a is greater than b by the ordering criterion */ ) {
			return 1;
		}
		// a must be equal to b
		return 0
	} );
	//displayMessage( substringTable.toSource( ) );
	var oldArrayIndex = 0;
	var newArrayIndex = 0;
	var results = [ ];
	for( var i = 0; i < substringTable.length; i++ ) {
		if( oldArrayIndex != substringTable [ i ].oldArrayIndex ) {
			results.push( {
				change : "DELETED",
				length : substringTable [ i ].oldArrayIndex - oldArrayIndex,
				index : oldArrayIndex
			} );
		}
		if( newArrayIndex != substringTable [ i ].newArrayIndex ) {
			results.push( {
				change : "ADDED",
				length : substringTable [ i ].newArrayIndex - newArrayIndex,
				index : newArrayIndex
			} );
		}
		results.push( {
			change : "STAYED",
			length : substringTable [ i ].matchLength,
			index : substringTable [ i ].oldArrayIndex
		} );
		oldArrayIndex = substringTable [ i ].oldArrayIndex + substringTable [ i ].matchLength;
		newArrayIndex = substringTable [ i ].newArrayIndex + substringTable [ i ].matchLength;
	}
	if( oldArrayIndex != oldArray.length ) {
		results.push( {
			change : "DELETED",
			length : oldArray.length - oldArrayIndex,
			index : oldArrayIndex
		} );
	}
	if( newArrayIndex != newArray.length ) {
		results.push( {
			change : "ADDED",
			length : newArray.length - newArrayIndex,
			index : newArrayIndex
		} );
	}
	return results;
}

'';}}>>
/***
|''Description:''|Cookie plugin for Treeview Plugin Usage: (persist: "cookie") means the state of the Treemenu persists and will remain where you left it between sessions.|
***/
/**
 * Cookie plugin
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 * Create a cookie with the given name and value and other optional parameters.
 *
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Set the value of a cookie.
 * @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
 * @desc Create a cookie with all available options.
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Create a session cookie.
 * @example $.cookie('the_cookie', null);
 * @desc Delete a cookie by passing null as value.
 *
 * @param String name The name of the cookie.
 * @param String value The value of the cookie.
 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
 *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
 *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
 *                             when the the browser exits.
 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
 *                        require a secure protocol (like HTTPS).
 * @type undefined
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */

/**
 * Get the value of a cookie with the given name.
 *
 * @example $.cookie('the_cookie');
 * @desc Get the value of a cookie.
 *
 * @param String name The name of the cookie.
 * @return The value of the cookie.
 * @type String
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        var path = options.path ? '; path=' + options.path : '';
        var domain = options.domain ? '; domain=' + options.domain : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};
/***
|''Navn:''|DanishTranslationPlugin|
|''Beskrivelse:''|Translation of TiddlyWiki into Danish|
|''Forfatter:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''Kilde:''|www.example.com |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/association/locales/core/en/locale.en.js |
|''Version:''|0.3.7|
|''Dato:''|Jul 6, 2007|
|''Kommentarer:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''Licens:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]] |
|''~CoreVersion:''|2.4|
***/

//{{{
//--
//-- Translateable strings
//--

// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone

config.locale = "da"; // W3C language tag

if (config.options.txtUserName == 'YourName') // do not translate this line, but do translate the next line
	merge(config.options,{txtUserName: "DitNavn"});

merge(config.tasks,{
	save: {text: "gem", tooltip: "Gem dine Ʀndringer til denne TiddlyWiki", action: saveChanges},
	sync: {text: "synk", tooltip: "SynkronisƩr Ʀndringer med andre TiddlyWiki filer og servere", content: '<<sync>>'},
	importTask: {text: "importƩr", tooltip: "ImportƩr tiddlers og plugins fra andre TiddlyWiki filer og servere", content: '<<importTiddlers>>'},
	tweak: {text: "Tilpas", tooltip: "Tilpas TiddlyWikis udseende og opfĆørsel", content: '<<options>>'},
	upgrade: {text: "upgradƩr", tooltip: "Upgrader TiddlyWikis kerne kode", content: '<<upgrade>>'},
	plugins: {text: "udvidelser", tooltip: "AdministrƩr installerede udvidelser", content: '<<plugins>>'}
});

// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
	txtUserName: "Brugernavn til signering af dine Ʀndringer",
	chkRegExpSearch: "Avend almindelige udtryk til sĆøgninger",
	chkCaseSensitiveSearch: "Forskel pƄ store og smƄ bogstaver",
	chkIncrementalSearch: "Bogstav for bogstav-sĆøgning",
	chkAnimate: "Anvend animationer",
	chkSaveBackups: "Gem en backupfil nƄr der gemmes Ʀndringer",
	chkAutoSave: "Gem automatisk Ʀndringer",
	chkGenerateAnRssFeed: "Lav et RSS feed nƄr der gemmes Ʀndringer",
	chkSaveEmptyTemplate: "Lav en tom skabelon nƄr der gemmes Ʀndringer",
	chkOpenInNewWindow: "ƅben internet links i et nyt vindue",
	chkToggleLinks: "NƄr man klikker pƄ et link i Ƅbne tiddlers lukkes de",
	chkHttpReadOnly: "Skjul redigeringsvƦrktĆøjer nĆ„r den vises over HTTP",
	chkForceMinorUpdate: "OpdatƩr ikke brugernavn og dato nƄr tiddlers bliver Ʀndrede",
	chkConfirmDelete: "Bed om bekrƦftelse fĆør tiddlers slettes",
	chkInsertTabs: "Brug tab tasten til at indsƦtte tab tegn istedet for at hoppe imellem felter",
	txtBackupFolder: "Navn pƄ mappe til brug for backups",
	txtMaxEditRows: "Maximum antal af rƦkker i edit bokse",
	txtFileSystemCharSet: "Default tegnsƦt til at gemme Ʀndringer (Kun i Firefox/Mozilla)"});

merge(config.messages,{
	customConfigError: "Der opstod problemer ved loading af udvidelser. Se PluginManager for detaljer",
	pluginError: "Fejl: %0",
	pluginDisabled: "Ikke udfĆørt fordi det er slĆ„et fra via 'systemConfigDisable' tag",
	pluginForced: "UdfĆørt fordi det er tvunget via 'systemConfigForce' tag",
	pluginVersionError: "Ikke udfĆørt fordi denne udvidelse krƦver en nyere udgave af TiddlyWiki",
	nothingSelected: "Intet er valgt. Du er nĆødt til at vƦlge en eller flere ting fĆørst",
	savedSnapshotError: "Det ser ud som om denne TiddlyWiki er blevet gemt forkert. Se venligst http://www.tiddlywiki.com/#DownloadSoftware for details",
	subtitleUnknown: "(ukendt)",
	undefinedTiddlerToolTip: "Tiddleren '%0' findes ikke endnu",
	shadowedTiddlerToolTip: "Tiddleren '%0' findes ikke endnu, men har en foruddefineret skygge vƦrdi",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Internet link til %0",
	noTags: "Der er ingen taggede tiddlere",
	notFileUrlError: "Du er nĆødt til at gemme denne TiddlyWiki til en fil fĆør du kan gemme Ʀndringer",
	cantSaveError: "Det er ikke muligt at gemme Ʀndringer. Mulige grunde indbefatter:\n- din browser understĆøtter det ikke (Firefox, Internet Explorer, Safari og Opera virker alle fint hvis de er konfigurerede korrekt)\n- stien til din TiddlyWiki fil indeholder ulovlige tegn\n- TiddlyWiki HTML filen er blevet flyttet eller omdĆøbt",
	invalidFileError: "Den originale fil '%0' lader ikke til at vƦre en rigtig TiddlyWiki",
	backupSaved: "Backup gemt",
	backupFailed: "Det lykkedes IKKE at gemme en backup fil",
	rssSaved: "RSS feed gemt",
	rssFailed: "Det lykkedes IKKE at gemme et RSS feed",
	emptySaved: "Tom skabelon gemt",
	emptyFailed: "Det lykkedes IKKE at gemme en tom skabelon",
	mainSaved: "Hoved TiddlyWiki fil gemt",
	mainFailed: "Det lykkedes IKKE at gemme hoved TiddlyWiki filen. Dine Ʀndringer er IKKE blevet gemt",
	macroError: "Fejl i makro <<\%0>>",
	macroErrorDetails: "Fejl ved udfĆørsel af makro <<\%0>>:\n%1",
	missingMacro: "Ingen sƄdan makro",
	overwriteWarning: "En tiddler med navnet '%0' findes allerede. VƦlg OK for at overskrive den",
	unsavedChangesWarning: "ADVARSEL! Der er ugemte Ʀmdringer i TiddlyWikien\n\nVƦlg OK for at gemme\nVƦlg FORTRYD for at afvise",
	confirmExit: "--------------------------------\n\nDer er ugemte Ʀndringer i TiddlyWikien. Hvis du fortsƦtter vil du miste disse Ʀndringer\n\n--------------------------------",
	saveInstructions: "GemƆndringer",
	unsupportedTWFormat: "Ikke understĆøttet TiddlyWiki format '%0'",
	tiddlerSaveError: "Fejl ved forsĆøg pĆ„ at gemme tiddler '%0'",
	tiddlerLoadError: "Fejl ved load af tiddler '%0'",
	wrongSaveFormat: "Kan ikke gemme med formatet '%0'. Bruger standard format til at gemme.",
	invalidFieldName: "Ikke tilladt feltnavn %0",
	fieldCannotBeChanged: "Felt '%0' kan ikke Ʀndres",
	loadingMissingTiddler: "ForsĆøger at hente tiddleren '%0' fra '%1' serveren ved:\n\n'%2' i arbejdsomrĆ„det '%3'",
	upgradeDone: "Opgradering til version %0 er nu fuldfĆørt\n\nKlik 'OK' for at genopfriske den nyligt opgraderede TiddlyWiki"});

merge(config.messages.messageClose,{
	text: "luk",
	tooltip: "luk dette meddelelsesomrƄde"});

config.messages.backstage = {
	open: {text: "bagscenen", tooltip: "ƅben bagsceneomrĆ„det for at Ʀndre pĆ„ nogle grundlƦggende indstillinger"},
	close: {text: "luk", tooltip: "Luk bagsceneomrƄdet"},
	prompt: "bagscenen: ",
	decal: {
		edit: {text: "edit", tooltip: "RedigƩr tiddleren '%0'"}
	}
};

config.messages.listView = {
	tiddlerTooltip: "Klik for at se hele denne tiddlers tekst",
	previewUnavailable: "(forhƄndsvisning er ikke tilgƦngelig)"
};

config.messages.dates.months = ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November","December"];
config.messages.dates.days = ["SĆøndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "LĆørdag"];
config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"];
config.messages.dates.shortDays = ["SĆøn", "Man", "Tir", "Ons", "Tor", "Fre", "LĆør"];
// suffixes for dates, eg "1ste","2den","3die"..."30te","31te"
config.messages.dates.daySuffixes = ["ste","den","die","te","te","te","te","te","te","te",
		"te","te","te","te","te","te","te","te","te","te",
		"ste","den","die","te","te","te","te","te","te","te",
		"te"];
config.messages.dates.am = "formiddag";
config.messages.dates.pm = "eftermiddag";

merge(config.messages.tiddlerPopup,{
	});

merge(config.views.wikified.tag,{
	labelNoTags: "ingen tags",
	labelTags: "tags: ",
	openTag: "ƅben tag '%0'",
	tooltip: "Vis tiddlere der er taggede med '%0'",
	openAllText: "ƅben alle",
	openAllTooltip: "ƅben alle disse tiddlere",
	popupNone: "Ingen andre tiddlere er taggede med '%0'"});

merge(config.views.wikified,{
	defaultText: "Tiddleren '%0' findes ikke endnu. Dobbelt-klik for at lave den",
	defaultModifier: "(mangler)",
	shadowModifier: "(indbygget skygge tiddler)",
	dateFormat: "DD MMM YYYY", // use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D
	createdPrompt: "lavet"});

merge(config.views.editor,{
	tagPrompt: "Skriv tags delt med mellemrum, [[brug 2 dobbelte firkantede klammer]] om nĆødvendigt, eller tilfĆøj allerede eksisterende",
	defaultText: "Skriv teksten til '%0'"});

merge(config.views.editor.tagChooser,{
	text: "tags",
	tooltip: "VƦlg eksisterende tags som tilfĆøjelse til denne tiddler",
	popupNone: "Der er ikke defineret nogen tags",
	tagTooltip: "TilfĆøj tagget '%0'"});

merge(config.messages,{
	sizeTemplates:
		[
		{unit: 1024*1024*1024, template: "%0\u00a0GB"},
		{unit: 1024*1024, template: "%0\u00a0MB"},
		{unit: 1024, template: "%0\u00a0KB"},
		{unit: 1, template: "%0\u00a0B"}
		]});

merge(config.macros.search,{
	label: "sĆøg",
	prompt: "SĆøg i denne TiddlyWiki",
	accessKey: "F",
	successMsg: "Der er fundet %0 tiddlere som matcher %1",
	failureMsg: "Der er ikke fundet nogen tiddlere som matcher %0"});

merge(config.macros.tagging,{
	label: "tagger: ",
	labelNotTag: "tagger ikke",
	tooltip: "Liste over tiddlere der er taggede med '%0'"});

merge(config.macros.timeline,{
	dateFormat: "DD MMM YYYY"});// use this to change the date format for your locale, eg "YYYY MMM DD", do not translate the Y, M or D

merge(config.macros.allTags,{
	tooltip: "Vis tiddlere der er taggede med '%0'",
	noTags: "Der er ingen taggede tiddlere"});

config.macros.list.all.prompt = "Alle tiddlere i alfabetisk orden";
config.macros.list.missing.prompt = "Tiddlere der linkes til men som ikke er definerede";
config.macros.list.orphans.prompt = "Tiddlere som der ikke linkes til fra nogen andre tiddlere";
config.macros.list.shadowed.prompt = "Tiddlere som er skyggede med grundlƦggende indhold";
config.macros.list.touched.prompt = "Tiddlere som er blevet Ʀndret lokalt ";

merge(config.macros.closeAll,{
	label: "luk alle",
	prompt: "Luk alle viste tiddlere (untaget dem som er ved at blive redigerede)"});

merge(config.macros.permaview,{
	label: "vis permalink",
	prompt: "Lav et link til en URL som henter alle de netop nu synlige tiddlere"});

merge(config.macros.saveChanges,{
	label: "gem Ʀndringer",
	prompt: "Gem alle tiddlere for at lave en ny TiddlyWiki",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "ny tiddler",
	prompt: "Lav en ny tiddler",
	title: "Ny Tiddler",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "ny journal",
	prompt: "Lav en ny tiddler ud fra nuvƦrende dato og tid",
	accessKey: "J"});

merge(config.macros.options,{
	wizardTitle: "Tilpas avancerede muligheder",
	step1Title: "Disse muligheder gemmes i cookies i din browser",
	step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Show unknown options</input>",
	unknownDescription: "//(ukendt)//",
	listViewTemplate: {
		columns: [
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'}
			]}
	});

merge(config.macros.plugins,{
	wizardTitle: "Administrer udvidelser",
	step1Title: "Aktive udvidelser",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	skippedText: "(Denne udvidelse er ikke blevet aktiveret fordi den fĆørst er blevet tilfĆøjet efter start)",
	noPluginText: "Der er ikke installeret nogen udvidelser",
	confirmDeleteText: "Er du sikker pƄ at du vil slette disse udvidelser:\n\n%0",
	removeLabel: "Fjern systemConfig tag",
	removePrompt: "Fjern systemConfig tag",
	deleteLabel: "slet",
	deletePrompt: "Slet disse tiddlere permanent",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			]}
	});

merge(config.macros.toolbar,{
	moreLabel: "mere",
	morePrompt: "Vis flere muligheder"
	});

merge(config.macros.refreshDisplay,{
	label: "genopfrisk",
	prompt: "Genopfrisk hele TiddlyWikiens udseende"
	});

merge(config.macros.importTiddlers,{
	readOnlyWarning: "Du kan ikke importere til en lĆ„st TiddlyWiki fil. PrĆøv at Ć„bne den fra en fil:// URL",
	wizardTitle: "Importer tiddlere fra en anden fil eller server",
	step1Title: "Trin 1: Find serveren eller TiddlyWiki filen",
	step1Html: "VƦlg servertypen: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL or pathname here: <input type='text' size=50 name='txtPath'><br>...or browse for a file: <input type='file' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>",
	openLabel: "open",
	openPrompt: "ƅben forbindelsen til denne fil eller server",
	openError: "Der var problemer med at hente tiddlywiki filen",
	statusOpenHost: "Forbinder til hosten",
	statusGetWorkspaceList: "Henter en liste over tilgƦngelige arbejdsomrƄder",
	step2Title: "Trin 2: VƦlg arbejdsomrƄde",
	step2Html: "Indskriv et navn pƄ arbejdsomrƄdet: <input type='text' size=50 name='txtWorkspace'><br>...eller vƦlg et der allerede er der: <select name='selWorkspace'><option value=''>Choose...</option></select>",
	cancelLabel: "fortryd",
	cancelPrompt: "Fortryd denne import",
	statusOpenWorkspace: "ƅben arbejdsomrĆ„det",
	statusGetTiddlerList: "Henter listen over tilgƦngelige tiddlere",
	errorGettingTiddlerList: "Fejl ved hentning af liste over tiddlere, klik Fortryd for at prĆøve igen",
	step3Title: "Trin 3: VƦlg hvilke tiddlere der skal importeres",
	step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Keep these tiddlers linked to this server so that you can synchronise subsequent changes</input><br><input type='checkbox' name='chkSave'>Save the details of this server in a 'systemServer' tiddler called:</input> <input type='text' size=25 name='txtSaveTiddler'>",
	importLabel: "importer",
	importPrompt: "Importer disse tiddlere",
	confirmOverwriteText: "Er du sikker pƄ at du vil overskrive disse tiddlere:\n\n%0",
	step4Title: "Trin 4: Importerer %0 tiddler(e)",
	step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
	doneLabel: "udfĆørt",
	donePrompt: "Luk denne wizard",
	statusDoingImport: "Importerer tiddlere",
	statusDoneImport: "Alle tiddlere er importede",
	systemServerNamePattern: "%2 on %1",
	systemServerNamePatternNoWorkspace: "%1",
	confirmOverwriteSaveTiddler: "Tiddleren '%0' findes allerede. Klik 'OK' for at overskrive den med detaljerne fra denne server, eller 'Fortryd' for at efterlade uƦndret",
	serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nDenne tiddler blev lavet automatisk for at skrive denne servers detaljer",
	serverSaveModifier: "(System)",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			]}
	});

merge(config.macros.upgrade,{
	wizardTitle: "Opgrader TiddlyWikis kerne kode",
	step1Title: "Opdater eller reparer denne TiddlyWiki til sidste nye udgivelse",
	step1Html: "Du er ved at opgradere til sidste nye udgave af TiddlyWikis kerne kode (from <a href='%0' class='externalLink' target='_blank'>%1</a>). Dit indhold vil blive bibeholdt under opgraderinen.<br><br>BemƦrk at opgraderinger kan konfikte med gamle udvidelser. Hvis du fƄr problemer med den opgraderede fil se her <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
	errorCantUpgrade: "Kan ikke opgradere denne TiddlyWiki. Du kan kun opgradere en TiddlyWiki fil som er gemt lokalt pƄ en pc",
	errorNotSaved: "Du skal gemme Ʀndringer fĆør du kan gennemfĆøre en opgradering",
	step2Title: "BekrƦft opgraderingsdetaljer",
	step2Html_downgrade: "Du er ved at nedgradere til TiddlyWiki version %0 fra %1.<br><br>Nedgradering til en Ʀldre udgave af kerne koden er IKKE tilrƄdeligt",
	step2Html_restore: "Denne tiddlyWike bruger allerede den sidste nye kerne kode (%0).<br><br>Du kan fortsƦtte med opgraderingen for at sikre dig at koden ikke er blevet Ćødelagt",
	step2Html_upgrade: "Du er ved at opgradere til TiddlyWiki version %0 fra %1",
	upgradeLabel: "opgrader",
	upgradePrompt: "Forbered opgraderingsprocessen",
	statusPreparingBackup: "Forbereder backup",
	statusSavingBackup: "Gemmer backup fil",
	errorSavingBackup: "Der var problemer med at gemme backup filen",
	statusLoadingCore: "Loader kernekoden",
	errorLoadingCore: "Fejl ved load af kernekoden",
	errorCoreFormat: "Fejl ved den nye kernekode",
	statusSavingCore: "Gemmer den nye kernekode",
	statusReloadingCore: "Genloader den nye kernekode",
	startLabel: "start",
	startPrompt: "Start opgraderingsprocessen",
	cancelLabel: "fortryd",
	cancelPrompt: "Fortryd opgraderingsprocessen",
	step3Title: "Opgradering afbrudt",
	step3Html: "Du har afbrudt opgraderingsprocessen"
	});

merge(config.macros.sync,{
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
			{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
			{name: 'Server Type', field: 'serverType', title: "Server type", type: 'String'},
			{name: 'Server Host', field: 'serverHost', title: "Server host", type: 'String'},
			{name: 'Server Workspace', field: 'serverWorkspace', title: "Server workspace", type: 'String'},
			{name: 'Status', field: 'status', title: "Synchronisation status", type: 'String'},
			{name: 'Server URL', field: 'serverUrl', title: "Server URL", text: "View", type: 'Link'}
			],
		rowClasses: [
			],
		buttons: [
			{caption: "SynkronisƩr disse tiddlere", name: 'sync'}
			]},
	wizardTitle: "Synkroniser med internet servere og filer",
	step1Title: "VƦlg hvilke tiddlere du vil synkronisere",
	step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
	syncLabel: "synk",
	syncPrompt: "SynkronisƩr disse tiddlere",
	hasChanged: "Ɔndret imens den var koblet fra",
	hasNotChanged: "UƦndret imens den var koblet fra",
	syncStatusList: {
		none: {text: "...", color: "gennemsigtig", display:null},
		changedServer: {text: "Ɔndret pĆ„ serveren", color: '#8080ff', display:null},
		changedLocally: {text: "Ɔndret imens den var koblet fra", color: '#80ff80', display:null},
		changedBoth: {text: "Ʀndret imens den var koblet fra ogsƄ pƄ serveren", color: '#ff8080', display:null},
		notFound: {text: "Ikke fundet pƄ serveren", color: '#ffff80', display:null},
		putToServer: {text: "Gemt update pƄ serveren", color: '#ff80ff', display:null},
		gotFromServer: {text: "Hentet update fra serveren", color: '#80ffff', display:null}
		}
	});

merge(config.commands.closeTiddler,{
	text: "luk",
	tooltip: "Luk denne tiddler"});

merge(config.commands.closeOthers,{
	text: "luk andre",
	tooltip: "Luk alle andre tiddlere"});

merge(config.commands.editTiddler,{
	text: "redigƩr",
	tooltip: "RedigƩr denne tiddler",
	readOnlyText: "se",
	readOnlyTooltip: "Se denne tiddlers kilde"});

merge(config.commands.saveTiddler,{
	text: "fƦrdig",
	tooltip: "Gem Ʀndringer til denne tiddler"});

merge(config.commands.cancelTiddler,{
	text: "fortryd",
	tooltip: "Fortryd Ʀndringer til denne tiddler",
	warning: "Er du sikker pƄ at du vil fortryde dine Ʀndringer til  '%0'?",
	readOnlyText: "fƦrdig",
	readOnlyTooltip: "Se tiddlere normalt"});

merge(config.commands.deleteTiddler,{
	text: "slet",
	tooltip: "Slet denne tiddler",
	warning: "Er du sikker pƄ at du vil slette '%0'?"});

merge(config.commands.permalink,{
	text: "permalink",
	tooltip: "Permalink til denne tiddler"});

merge(config.commands.references,{
	text: "referencer",
	tooltip: "Vis tiddlere som linker til denne tiddler",
	popupNone: "Ingen referencer"});

merge(config.commands.jump,{
	text: "spring",
	tooltip: "Spring til en anden tiddler"});

merge(config.commands.syncing,{
	text: "synkroniserer",
	tooltip: "Kontroller synkronisering af denne tiddler med en server eller en fil",
	currentlySyncing: "<div>Currently syncing via <span class='popupHighlight'>'%0'</span> to:</"+"div><div>host: <span class='popupHighlight'>%1</span></"+"div><div>workspace: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
	notCurrentlySyncing: "Sykroniserer ikke lige nu",
	captionUnSync: "Stop synkronisering af denne tiddler",
	chooseServer: "SynkronisƩr denne tiddler med en anden server:",
	currServerMarker: "\u25cf ",
	notCurrServerMarker: "  "});

merge(config.commands.fields,{
	text: "felter",
	tooltip: "Vis denne tiddlers udvidede felter",
	emptyText: "Der er ingen udvidede felter til rƄdighed for denne tiddler",
	listViewTemplate: {
		columns: [
			{name: 'Field', field: 'field', title: "Field", type: 'String'},
			{name: 'Value', field: 'value', title: "Value", type: 'String'}
			],
		rowClasses: [
			],
		buttons: [
			]}});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "[[TranslatedGettingStarted]]",
	MainMenu: "[[TranslatedGettingStarted]]\n\n\n^^~TiddlyWiki version <<version>>\nƂĀ© 2007 [[UnaMesa|http://www.unamesa.org/]]^^",
	TranslatedGettingStarted: "For at komme i gang med denne tomme tiddlywiki, skal du Ʀndre pĆ„ de fĆølgende tiddlere:\n* SiteTitle & SiteSubtitle: Sidens titel og undertitel, som vist Ćøverst (efter de er gemt, vil de ogsĆ„ vise sig i browserens titelmenu)\n* MainMenu: er hovedmenuen (er oftest placeret til venstre)\n* DefaultTiddlers: Indeholder navnene pĆ„ de tiddlere du vilhave skal starte op nĆ„r du Ć„bner TiddlyWiki\nDu skal ogsĆ„ skrive dit brugernavn for at signere dine redigeringer: <<option txtUserName>>",
	SiteTitle: "Min TiddlyWiki",
	SiteSubtitle: "en genbrugelig ikke-liniƦr personlig web notesbog",
	SiteUrl: "http://www.tiddlywiki.com/",
	OptionsPanel: "Disse muligheder for at Ʀndre pƄ TiddlyWiki bliver gemt i din browser\n\nDit brugernavn til at signere dine Ʀndringer. Skriv det som et WikiOrd (f.eks. PerPoulsen)\n<<option txtUserName>>\n\n<<option chkSaveBackups>> Save backups\n<<option chkAutoSave>> Auto save\n<<option chkRegExpSearch>> Regexp search\n<<option chkCaseSensitiveSearch>> Case sensitive search\n<<option chkAnimate>> Enable animations\n\n----\nAlso see [[TranslatedAdvancedOptions|AdvancedOptions]]",
	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "muligheder \u00bb" "Ɔndre pĆ„ TiddlyWikis avancerede muligheder">>',
	SideBarTabs: '<<tabs txtMainTab "Tidslinie" "Tidslinie" TabTimeline "Alle" "Alle tiddlere" TabAll "Tags" "Alle tags" TabTags "Flere" "Flere lister" TabMore>>',
	TabMore: '<<tabs txtMoreTab "Manglende" "Manglende tiddlere" TabMoreMissing "Uden tilknytning" "Tiddlere" TabMoreOrphans "Skyggede" "Skyggede tiddlere" TabMoreShadowed>>'
	});

merge(config.annotations,{
	AdvancedOptions: "Denne skygge tiddler giver adgang til flere avancerede muligheder",
	ColorPalette: "Disse vƦrdier i denne skyggetiddler bestemmer hvilket farveskema, der bliver brugt til ~TiddlyWikis brugerflade",
	DefaultTiddlers: "Tiddlere som er listede i denne skyggetiddler vil automatisk blive vist nƄr ~TiddlyWiki starter op",
	EditTemplate: "HTML skabelonen i denne skyggetiddler bestemmer hvordan tiddlere ser ud nƄr de bliver redigerede",
	GettingStarted: "Denne skyggetiddler giver instruktioner om grundlƦggende anvendelse",
	ImportTiddlers: "Denne skyggetiddler giver mulighed for at importere tiddlere",
	MainMenu: "Denne tiddler bliver brugt til at definere indholdet af hoved menuen i venstre side af skƦrmen",
	MarkupPreHead: "Denne tiddler bliver indsat i toppen af <head> sektionen pƄ TiddlyWiki HTML filen",
	MarkupPostHead: "Denne tiddler bliver indsat i bunden af <head> sektionen pƄ TiddlyWiki HTML filen",
	MarkupPreBody: "Denne tiddler bliver indsat i toppen af<body> sektionen pƄ TiddlyWiki HTML filen",
	MarkupPostBody: "Denne tiddler bliver indsat i slutningen af  <body> sektionen pƄ TiddlyWiki HTML filen umiddelbart efter script blokken",
	OptionsPanel: "Denne skyggetiddler bliver brugt til indholdet af muligheder skydepanelet i hĆøjre side",
	PageTemplate: "HTML skabelonen i denne skyggetiddler bestemmer det overordnede ~TiddlyWiki layout",
	PluginManager: "Denne skyggetiddler giver adgang til udvidelsesadministrationen",
	SideBarOptions: "Denne skyggetiddler bruges til indholdet af muligheder panelet i hĆøjre sidemenu",
	SideBarTabs: "Denne skyggetiddler bruges til indholdet af fanebladspanelet i hĆøjre sidemenu",
	SiteSubtitle: "Denne skyggetiddler bruges som anden del af sidens titel",
	SiteTitle: "Denne skyggetiddler bruges som fĆørste del af sidens titel",
	SiteUrl: "Denne skyggetiddler bĆør sƦttes til den fulde mĆ„l-URL til publikation",
	StyleSheetColors: "Denne skyggetiddler indeholder CSS definitionerne der bestemmer farverne pĆ„ side elementerne. ''REDIGƉR IKKE DENNE TIDDLER'', lav i stedet dine Ʀndringer i StyleSheet skyggetiddleren",
	StyleSheet: "Denne tiddler kan indeholde specialle CSS definitioner",
	StyleSheetLayout: "Denne skyggetiddler indeholder CSS definitioner der bestemmer layoutet pĆ„ side elementer. ''REDIGƉR IKKE DENNE TIDDLER'', lav i stedet dine Ʀndringer i StyleSheet skyggetiddleren",
	StyleSheetLocale: "Denne skyggetiddler indeholder CSS definitioner relateret til lokale oversƦttelser",
	StyleSheetPrint: "Denne skyggetiddler indeholder CSS definitioner til print",
	TabAll: "Denne skyggetiddler indeholder hvad der er i 'Alle' fanen i hĆøjre sidemenu",
	TabMore: "Denne skyggetiddler indeholder  hvad der er i 'Flere' fanen i hĆøjre sidemenu",
	TabMoreMissing: "Denne skyggetiddler indeholder  hvad der er i 'Mangler' fanen i hĆøjre sidemenu",
	TabMoreOrphans: "Denne skyggetiddler indeholder  hvad der er i  'Mangler tilknytning' fanen i hĆøjre sidemenu",
	TabMoreShadowed: "Denne skyggetiddler indeholder  hvad der er i 'Skyggede' fanen i hĆøjre sidemenu",
	TabTags: "Denne skyggetiddler indeholder  hvad der er i 'Tags' fanen i hĆøjre sidemenu",
	TabTimeline: "Denne skyggetiddler indeholder hvad der er i 'Tidslinie' fanen i hĆøjre sidemenu",
	ToolbarCommands: "Denne skyggetiddler bestemmer hvilke vƦrktĆøjer der vises i tiddleres vƦrktĆøjslinier",
	ViewTemplate: "HTML skabelonen i denne skyggetiddler bestemmer hvordan tiddlere ser ud"
	});

//}}}
/***
|''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).

Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. 

''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.




''Access and Modify Tiddler Data''

You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. 

These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|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.|
|{{{data()}}}|{{{t.data()}}}|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.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|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).|

Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|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.|
|{{{DataTiddler.getDataObject(tiddler)}}}|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.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,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).|
//(For details on the various functions see the detailed comments in the source code.)//


''Data Representation in a Tiddler''

The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. 

//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}

The data section is not displayed when viewing the tiddler (see also "The showData Macro").

Beside the data section a tiddler may have all kind of other content.

Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.


''Saving Changes''

The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.


''Notifications''

No notifications are sent when a tiddler's data value is changed through the "setData" methods. 

''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.


''The showData Macro''

By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:

''Syntax:'' 
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


!Revision history
* v1.0.6 (2006-08-26) 
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed: 
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features: 
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed: 
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version

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

//}}}
<data>{"author":"Kim Fupz Aakeson","primtopic":"Science Fiction","wherekept":"De gale - projekt"}</data>
Kim Fupz Aakeson
HĆøst, 2000


I Ƅr 2010 har en virus pludselig gjort de fleste danskere over 25 Ƅr sindssyge. 18-Ƅrige Steff er sammen med Topper og Popsy pƄ en livsfarlig rejse hjem gennem et kaotisk land


Temaer:  Unge, fremtidsfortƦllinger, flugt ā€¦
[[De Gale]] - Grupper pƄ 4
+++[Time 1 - Kap 1,2,3]
1.      Hver person vƦlger et afsnit som har gjort indtryk pƄ ham/hende. LƦs afsnittet op for gruppen og forklar hvorfor du har valgt det.
 
Bliv i gruppen enige om hvilket af afsnittene der har gjort stĆørst indtryk pĆ„ jer, og diskutĆ©r hvad der gjorde dette afsnit sƦrlig interessant/vigtigt/spƦndende.
 
Skriv et kort resumƩ af det valgte afsnit, og giv jeres begrundelse for hvorfor I har valgt det.
 
2.      Bliv i gruppen enige om, hvad der er de vigtigste begivenheder i disse 3 fĆørste kapitler.
Skriv dem ned som stikord.
 
Hvilken betydning har / fĆ„r disse begivenheder for personernes fĆølelser og forhold til hinanden?
 
3.      Hvilke oplysninger fƄr vi om Topper?
(se evt. igen pĆ„ siderne 5, 7, 8, 14, 16ā€¦..osv.)
 
4.      Hvilke oplysninger fƄr vi om Steff?
(se evt. igen pĆ„ siderne 5, 9, 16, 20ā€¦.osv.)
 
5.      Hvor foregĆ„r romanen? Beskriv stedet, stemningen og miljĆøet.
 
6.      Da Steff ringer hjem og taler med sine forƦldre, fƄr vi en mistanke om, at hans mor er smittet. Hvordan?

7.      PƄ det udleverede Danmarkskort skal I sƦtte smƄ sedler op med en kort beskrivelse af hvert kapitels vigtigste begivenhed og dens betydning for Steff.
Disse sedler bliver fulgt op i det fortsatte arbejde med bogen, sƄdan at de tilsammen kommer til at vise Steffs udviklingsrejse.
===
+++[Time 2 - Kapitel 4 & 5]
 [[Link til Pdf|http://dl.getdropbox.com/u/1064531/Kapitel4%265.pdf]]
1.      Hver person vƦlger et afsnit som har gjort indtryk pƄ ham/hende. LƦs afsnittet op for gruppen og forklar hvorfor du har valgt det.
 
Bliv i gruppen enige om hvilket af afsnittene der har gjort stĆørst indtryk pĆ„ jer, og diskutĆ©r hvad der gjorde dette afsnit sƦrlig interessant/vigtigt/spƦndende.
 
Skriv et kort resumƩ af det valgte afsnit, og giv jeres begrundelse for hvorfor I har valgt det. Omskriv herefter det valgte afsnit til nutid.
 
2.      Hvilke oplysninger fƄr Steff og Topper om problemerne?
 
3.      Hvad oplever Steff og Topper ved menneskemylderet pƄ motorvejen, og hvordan reagerer de pƄ det de ser?
 
4.      De fĆ„r et par gode rĆ„d med pĆ„ vejen ā€“ hvilke?
 
5.      De mĆøder Popsy ā€“ hvordan er situationen for hende?
 
6.      Bliv i gruppen enige om hvad der er de vigtigste begivenheder i disse kapitler.
Lav en tegneserie pƄ max. 6 tegninger over det vigtigste i disse kapitler.
 
Hvilken betydning har / fĆ„r disse begivenheder for personernes fĆølelser og forhold til hinanden?
 
7.      Jeg-personens udviklingsvej er en rejse gennem betydningsfulde begivenheder som stationer pĆ„ vejen fra det sydlige Jylland over Fyn til SjƦlland til hans hjem i HelsingĆør.
 
PƄ Danmarkskortet skal I sƦtte smƄ sedler op med en kort beskrivelse af hvert kapitels vigtigste begivenhed og dens betydning for Steff. Disse sedler bliver fulgt op i det videre arbejde med bogen sƄdan at de tilsammen kommer til at vise Steffs udviklingsrejse.===
+++[Time 3 - Kapitel 6 & 7]
 
1.      Hver person vƦlger et afsnit som har gjort indtryk pƄ ham/hende. LƦs afsnittet op for gruppen og forklar hvorfor du har valgt det.
 
Bliv i gruppen enige om hvilket af afsnittene der har gjort stĆørst indtryk pĆ„ jer, og diskutĆ©r hvad der gjorde dette afsnit sƦrlig interessant/vigtigt/spƦndende.
 
Skriv et kort resumƩ af det valgte afsnit, og giv jeres begrundelse for hvorfor I har valgt det.
 
2.      SƦt smƄ sedler op pƄ danmarkskortet med en kort beskrivelse af hvert kapitels vigtigste begivenhed og dens betydning for Steff.
 
3.      Side 65 fĆ„r vi en beskrivelse af Popsy, og pĆ„ de fĆølgende sider lƦrer vi hende nƦrmere at kende. Lav en karakteristik af Popsy som bĆ„de gĆ„r pĆ„ det ydre og det indre.
 
4.      Hvem tager initiativ til at hun slĆ„r fĆølge med Steff og Topper? Hvordan gĆ„r det rent faktisk til at de mĆøder hende?
 
5.      Side 69 gentager Steff at han ikke kunne. Hvad taler han om? Hvorfor mon han reagerer sƄdan og hvad viser det om ham? Hvordan ville I selv reagere i en lignende situation?
 
6.      Popsy har ikke problemer med at huske. PĆ„ side 75 siger hun at hun har det omvendt. Hun prĆøver at glemme et par ting. Hvad kunne det mon vƦre?
 
7.      PƄ slottet beordres Popsy til at klƦde sig af foran kongen. Hvordan klarer hun den situation?
 
8.      Hvad er Kongen for en mand og hvorfor har han udrƄbt sig selv til konge?
 
9.      Da de tre flygter i slutningen af kapitel 7, bliver situationen igen kritisk. Hvordan reagerer Steff? Hvordan reagerer Popsy?===
+++[Time 4 - Kapitel 8 & 9]
 
1.      Hver person vƦlger et afsnit som har gjort indtryk pƄ ham/hende. LƦs afsnittet op for gruppen og forklar hvorfor du har valgt det.
 
Bliv i gruppen enige om hvilket af afsnittene der har gjort stĆørst indtryk pĆ„ jer, og diskutĆ©r hvad der gjorde dette afsnit sƦrlig interessant/vigtigt/spƦndende.
 
Skriv et kort resumƩ af det valgte afsnit, og giv jeres begrundelse for hvorfor I har valgt det.
 
2.      SƦt smƄ sedler op pƄ danmarkskortet med en kort beskrivelse af hvert kapitels vigtigste begivenhed og dens betydning for Steff.
 
3.      Steff fĆøler ansvar for Popsy, hvordan viser forfatteren os det? (s. 85)
 
4.      Popsy aner urƄd, hvad foretager hun sig i slutningen af kapitel 8?
 
5.      PƄ side 94 kommer forklaringen. Hvad er der egentlig sket med Topper og Steff? Hvad tror I formƄlet med det er?
 
6.      Hvilken betydning har det for Steff at Topper tog med?
 
7.      Beskriv forholdene i den lejr som Steff og Topper er havnet i.===
+++[Time 5 - Kapitel 10 & 11]
 
1.      Hver person vƦlger et afsnit som har gjort indtryk pƄ ham/hende. LƦs afsnittet op for gruppen og forklar hvorfor du har valgt det.
 
Bliv i gruppen enige om hvilket af afsnittene der har gjort stĆørst indtryk pĆ„ jer, og diskutĆ©r hvad der gjorde dette afsnit sƦrlig interessant/vigtigt/spƦndende.
 
Skriv et kort resumƩ af det valgte afsnit, og giv jeres begrundelse for hvorfor I har valgt det.
 
2.      SƦt smƄ sedler op pƄ danmarkskortet med en kort beskrivelse af hvert kapitels vigtigste begivenhed og dens betydning for Steff.
 
3.      Hvem er Benjamin?
Hvad bestƄr hans arbejde i?
Hvordan synes I han klarer opgaven?
Forestil jer hvad han tƦnkte, da han blev udnƦvnt. Skriv hans tanker i jeg-form ā€“ altsĆ„ en meddigtningsopgave.
 
4.      Steff skal virkelig tage sig sammen for at styre sig i et par situationer i kapitel 10. Hvorfor?  (beskriv dem og forklar hvorfor.)
 
5.      Hvordan lykkes det Steff og Topper at flygte og hvordan gĆ„r det til at de igen mĆøder Popsy?===
+++[Time 6 - Kapitel 12 & 13]
 
1.      Hver person vƦlger et afsnit som har gjort indtryk pƄ ham/hende.
Skriv et kort resumƩ af det valgte afsnit, og giv jeres begrundelse for hvorfor I har valgt det.
 
2.      SƦt smƄ sedler op pƄ danmarkskortet med en kort beskrivelse af hvert kapitels vigtigste begivenhed og dens betydning for Steff.
 
3.      I de 2 kapitler oplever vi flere gange at Toppers opfĆørsel irriterer Steff. Find eksempler pĆ„ dette. Diskuter hvorfor Steffs syn pĆ„ Topper Ʀndrer sig.
 
4.      FortƦl Popsys historie ā€“ meddigtning.
 
5.      Hvad er den uofficielle forklaring pƄ at folk bliver gale?
 
6.      Skriv de vƦsentligste begivenheder der sker i Roskilde.
Herunder diskuteres bl.a., hvad det er den underlige mand pĆ„ banegĆ„rden forsĆøger at sige til dem? Hvad mener han med det?
 
7.      Beskriv de fĆølelser som Steff gĆ„r og tumler med.===
+++[Time 7 - Kapitel 14 & 15]
 
1.      Beskriv situationen pƄ HovedbanegƄrden (stemning, billetsalg m.v.)
Hvordan skaffer de billetter?
 
2.      Hvordan beskrives turen fra busstoppestedet til Steffs hjem i HelsingĆør?
Hvordan oplever Steff gensynet med sit hjem?
Hvem mĆøder de?
Hvad sker der i hjemmet?
Hvordan oplever Steff det da Topper dĆør?
 
3.      Hvordan reagerer Popsy? Hvordan trĆøster hun Steff? Hvad fĆ„r hun Steff til?
 
4.      SƦt de sidste sedler pĆ„ Danmarkskortet med angivelse af de vigtigste begivenheder i de to kapitler. Med udgangspunkt i kortet og sedlerne skal I lave en samlet beskrivelse af hvordan Steff har udviklet sig gennem bogen fra de fĆørste kapitler, via de centrale begivenheder undervejs frem til afslutningen. Der skal tages hĆøjde for bĆ„de den ydre sĆ„vel som den indre rejse.
 
5.      Hvilke temaer og problemstillinger synes I bogen tager fat pƄ? Hvad mener I om disse problemstillinger / hvad fƄr det jer til at tƦnke pƄ?
Har det der sker I denne fremtidsroman overhovedet noget med jeres liv at gĆøre?===
+++[Analyse] 
<<tiddler [[LƦrerfaglig analyse af de gale]]>>
===
+++[Danmarkskort] 
<<tiddler [[Danmarkskort]]>>
===
/***
|''Name:''|DeliciousTaggingPlugin "packed"|
|''Version:''|0.1|
|''Source''|http://jackparke.googlepages.com/jtw.html#DeliciousTaggingPlugin|
|''Author:''|[[Jack]]|
|''Description:''|Allows easy 'del.icio.us'-like tagging in the EditTemplate by showing all tags as a list of link-buttons.|
***/
//{{{
version.extensions.deliciousTagging={major:0,minor:1,revision:0,date:new Date("June 11, 2007")};config.macros.deliciousTagging={};config.macros.deliciousTagging.onTagClick=function(e){if(!e){var e=window.event}var _3=this.getAttribute("tag");var _4=this.getAttribute("tiddler");if(!readOnly){story.setTiddlerTag(_4,_3,0)}return false};config.macros.deliciousTagging.handler=function(_5,_6,_7,_8,_9,_a){if(_a instanceof Tiddler){var _b=_a.title;if(!e){var e=window.event}var _d=store.getTags();var _e=config.views.editor.tagChooser;for(var t=0;t<_d.length;t++){var _10=createTiddlyButton(_5,_d[t][0],_e.tagTooltip.format([_d[t][0]]),config.macros.deliciousTagging.onTagClick);_10.setAttribute("tag",_d[t][0]);_10.setAttribute("tiddler",_a.title);_5.appendChild(document.createTextNode(" "))}}};
//}}}

/***
|''Name:''|~TaggerPlugin "modified" (dropdown char and shadow definition removed)|
|''Version:''|1.0.1|
|''Source:''|http://tw.lewcid.org//#TaggerPlugin|
|''Author:''|SaqImtiaz|
|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|
***/
//{{{
config.tagger={defaults:{label:"tag",tooltip:"Manage tiddler tags",taglist:"true",excludeTags:"",notags:"tiddler has no tags",aretags:"current tiddler tags:",toggletext:"add tags:"}};config.macros.tagger={};config.macros.tagger.arrow=(document.all?"":"");config.macros.tagger.handler=function(_1,_2,_3,_4,_5,_6){var _7=config.tagger.defaults;var _8=_5.parseParams("tagman",null,true);var _9=((_8[0].label)&&(_8[0].label[0])!=".")?_8[0].label[0]+this.arrow:_7.label+this.arrow;var _a=((_8[0].tooltip)&&(_8[0].tooltip[0])!=".")?_8[0].tooltip[0]:_7.tooltip;var _b=((_8[0].taglist)&&(_8[0].taglist[0])!=".")?_8[0].taglist[0]:_7.taglist;var _c=((_8[0].exclude)&&(_8[0].exclude[0])!=".")?(_8[0].exclude[0]).readBracketedList():_7.excludeTags.readBracketedList();if((_8[0].source)&&(_8[0].source[0])!="."){var _d=_8[0].source[0];}if(_d&&!store.getTiddler(_d)){return false;}var _e=function(e){if(!e){var e=window.event;}var _11=Popup.create(this);var _12=store.getTags();var _13=new Array();for(var i=0;i<_12.length;i++){_13.push(_12[i][0]);}if(_d){var _15=store.getTiddler(_d);_13=_15.tags.sort();}var _16=_6.tags.sort();var _17=function(_18,_19,_1a){var sp=createTiddlyElement(createTiddlyElement(_11,"li"),"span",null,"tagger");var _1c=createTiddlyButton(sp,_18,_1a+" '"+_19+"'",taggerOnToggle,"button","toggleButton");_1c.setAttribute("tiddler",_6.title);_1c.setAttribute("tag",_19);insertSpacer(sp);if(window.createTagButton_orig_mptw){createTagButton_orig_mptw(sp,_19)}else{createTagButton(sp,_19);}};createTiddlyElement(_11,"li",null,"listTitle",(_6.tags.length==0?_7.notags:_7.aretags));for(var t=0;t<_16.length;t++){_17("[x]",_16[t],"remove tag ");}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");if(_b!="false"){createTiddlyElement(_11,"li",null,"listTitle",_7.toggletext);for(var i=0;i<_13.length;i++){if(!_6.tags.contains(_13[i])&&!_c.contains(_13[i])){_17("[ ]",_13[i],"add tag ");}}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");}var _1f=createTiddlyButton(createTiddlyElement(_11,"li"),("Create new tag"),null,taggerOnToggle);_1f.setAttribute("tiddler",_6.title);if(_d){_1f.setAttribute("source",_d);}Popup.show(_11,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};createTiddlyButton(_1,_9,_a,_e,"button","taggerDrpBtn");};window.taggerOnToggle=function(e){var tag=this.getAttribute("tag");var _22=this.getAttribute("tiddler");var _23=store.getTiddler(_22);if(!tag){var _24=prompt("Enter new tag:","");if(_24!=""&&_24!=null){var tag=_24;if(this.getAttribute("source")){var _26=store.getTiddler(this.getAttribute("source"));_26.tags.pushUnique(_24);}}else{return false;}}if(!_23||!_23.tags){store.saveTiddler(_22,_22,"",config.options.txtUserName,new Date(),tag);}else{if(_23.tags.find(tag)==null){_23.tags.push(tag);}else{if(!_24){_23.tags.splice(_23.tags.find(tag),1);}}store.saveTiddler(_23.title,_23.title,_23.text,_23.modifier,_23.modified,_23.tags);}story.refreshTiddler(_22,null,true);if(config.options.chkAutoSave){saveChanges();}return false;};setStylesheet(".tagger a.button {font-weight: bold;display:inline; padding:0px;}\n"+".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\n"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\n"+".popup .listTitle {color:#000;}\n"+"","TaggerStyles");window.lewcidTiddlerSwapTag=function(_27,_28,_29){for(var i=0;i<_27.tags.length;i++){if(_27.tags[i]==_28){_27.tags[i]=_29;return true;}}return false;};window.lewcidRenameTag=function(e){var tag=this.getAttribute("tag");var _2d=prompt("Rename tag '"+tag+"' to:",tag);if((_2d==tag)||(_2d==null)){return false;}if(store.tiddlerExists(_2d)){if(confirm(config.messages.overwriteWarning.format([_2d.toString()]))){story.closeTiddler(_2d,false,false);}else{return null;}}tagged=store.getTaggedTiddlers(tag);if(tagged.length!=0){for(var j=0;j<tagged.length;j++){lewcidTiddlerSwapTag(tagged[j],tag,_2d);}}if(store.tiddlerExists(tag)){store.saveTiddler(tag,_2d);}if(document.getElementById("tiddler"+tag)){var _2f=document.getElementById(story.idPrefix+tag);var _30=story.positionTiddler(_2f);var _31=document.getElementById(story.container);story.closeTiddler(tag,false,false);story.createTiddler(_31,_30,_2d,null);story.saveTiddler(_2d);}if(config.options.chkAutoSave){saveChanges();}return false;};window.onClickTag=function(e){if(!e){var e=window.event;}var _34=resolveTarget(e);var _35=(!isNested(_34));if((Popup.stack.length>1)&&(_35==true)){Popup.removeFrom(1);}else{if(Popup.stack.length>0&&_35==false){Popup.removeFrom(0);}}var _36=(_35==false)?"popup":"nestedtagger";var _37=createTiddlyElement(document.body,"ol",_36,"popup",null);Popup.stack.push({root:this,popup:_37});var tag=this.getAttribute("tag");var _39=this.getAttribute("tiddler");if(_37&&tag){var _3a=store.getTaggedTiddlers(tag);var _3b=[];var li,r;for(r=0;r<_3a.length;r++){if(_3a[r].title!=_39){_3b.push(_3a[r].title);}}var _3d=config.views.wikified.tag;if(_3b.length>0){var _3e=createTiddlyButton(createTiddlyElement(_37,"li"),_3d.openAllText.format([tag]),_3d.openAllTooltip,onClickTagOpenAll);_3e.setAttribute("tag",tag);createTiddlyElement(createTiddlyElement(_37,"li"),"hr");for(r=0;r<_3b.length;r++){createTiddlyLink(createTiddlyElement(_37,"li"),_3b[r],true);}}else{createTiddlyText(createTiddlyElement(_37,"li",null,"disabled"),_3d.popupNone.format([tag]));}createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var h=createTiddlyLink(createTiddlyElement(_37,"li"),tag,false);createTiddlyText(h,_3d.openTag.format([tag]));createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var _40=createTiddlyButton(createTiddlyElement(_37,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);_40.setAttribute("tag",tag);}Popup.show(_37,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};if(!window.isNested){window.isNested=function(e){while(e!=null){var _42=document.getElementById("contentWrapper");if(_42==e){return true;}e=e.parentNode;}return false;};}
//}}}
/***
|''Name''|DeprecatedFunctionsPlugin|
|''Description''|Provides support for functions removed from the TiddlyWiki core|
|''Version''|1.0.0|
|''Status''|stable|
|''Source''|http://www.tiddlywiki.com/coreplugins.html#DeprecatedFunctionsPlugin|
|''~CodeRepository:''|http://svn.tiddlywiki.org/Trunk/association/plugins/DeprecatedFunctionsPlugin/DeprecatedFunctionsPlugin.js |
|''License''|[[BSD open source license]]|
|''~CoreVersion''|2.3.0|
|''Feedback''|[[TiddlyWiki community|http://groups.google.com/group/TiddlyWiki]] |
|''Keywords''|legacySupport|
!Code
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};

//--
//-- Deprecated code
//--

// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
	w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};

// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = 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) {
		var text = lookaheadMatch[1];
		if(config.browser.isIE)
			text = text.replace(/\n/g,"\r");
		createTiddlyElement(w.output,"pre",null,null,text);
		w.nextMatch = lookaheadRegExp.lastIndex;
	}
};

// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
	createTiddlyElement(place,"br");
};

// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
	var i = this.indexOf(item);
	return i == -1 ? null : i;
};

// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
	return store.getLoader().internalizeTiddler(store,this,title,divRef);
};

// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
	return store.getSaver().externalizeTiddler(store,this);
};

// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
	return store.allTiddlersAsHtml();
}

// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
	refreshPageTemplate(title);
}

// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
	story.displayTiddlers(srcElement,titles,template,animate);
}

// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
	story.displayTiddler(srcElement,title,template,animate);
}

// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;

// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");

}
//}}}
Combination of
!SiteTitle
DeskTree
/***
|Name|[[DragScrollPlugin]]|
|Source|http://www.TiddlyTools.com/#DragScrollPlugin|
|Documentation|http://www.TiddlyTools.com/#DragScrollPlugin|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|use SHIFT-DRAG to scroll the browser window|
DragScrollPlugin allows you to use your mouse to scroll the browser window by grabbing anywhere on the background of the document while holding the SHIFT key.
!!!!!Documentation
<<<
Whenever your page contains extra-wide content that does not 'wrap' onto extra lines, in can result in both horizontal and vertical scrollbars.  Unfortunately, using each scrollbar separately to navigate across the page can become very tedious and makes it more difficult to interact with your content in a flexible and effective manner.

''Drag-scrolling allows you to move in both the horizontal and vertical direction at the same time, simply by holding SHIFT while clicking and dragging the mouse across the page.''
<<<
!!!!!Configuration
<<<
<<option chkDragScroll>> enable //drag-scrolling//
<<<
!!!!!Revisions
<<<
2008.12.01 [1.0.0] Initial public release
<<<
!!!!!Code
***/
//{{{
version.extensions.DragScrollPlugin= {major: 1, minor: 0, revision: 0, date: new Date(2008,12,01)};

if (!config.dragscroll) { // only once
	config.dragscroll={
		// use to end event handling for processed events
		processed: function(ev) {
			var ev=ev||window.event;
			if (ev) { ev.cancelBubble=true; if (ev.stopPropagation) ev.stopPropagation(); }
			return false;
		},
		// MOUSE DOWN - SET CURSOR, SAVE SCROLL DATA
		savedMouseDown: document.onmousedown,
		mousedown: function(ev) {
			var ev=ev||window.event; var target=resolveTarget(ev); var d=config.dragscroll;
			var scroll=ev.shiftKey&&config.options.chkDragScroll;
			var skip=['input','option','textarea'].contains(target.nodeName.toLowerCase());
			if (!scroll||skip) { // handle event normally
				if (d.savedMouseDown!=undefined) return d.savedMouseDown.apply(target,arguments);
				else return;
			}
			d.mX=!config.browser.isIE?ev.pageX:ev.clientX; d.sX=findScrollX();
			d.mY=!config.browser.isIE?ev.pageY:ev.clientY; d.sY=findScrollY();
			d.scrolling=true; document.body.style.cursor='move';
			return config.dragscroll.processed(ev);
		},
		// MOUSE MOVE - UPDATE SCROLL DATA AND SCROLL THE WINDOW 
		savedMouseMove: document.onmousemove,
		mousemove: function(ev) {
			var ev=ev||window.event; var target=resolveTarget(ev); var d=config.dragscroll;
			if (!d.scrolling || !ev.shiftKey) { // NOT SCROLLING
				if (d.savedMouseMove!=undefined) return d.savedMouseMove.apply(target,arguments);
				else return;
			}
			// set scroll pos based on diff between new and old (x,y)
			var mx=!config.browser.isIE?ev.pageX:ev.clientX;
			var my=!config.browser.isIE?ev.pageY:ev.clientY;
			var sx=!config.browser.isIE?findScrollX():d.sX;
			var sy=!config.browser.isIE?findScrollY():d.sY;
			window.scrollTo(sx-mx+d.mX,sy-my+d.mY);
			return config.dragscroll.processed(ev);
		},
		// MOUSEUP - CLEAR THE DRAG DATA, RESET THE CURSOR
		savedMouseUp: document.onmouseup,
		mouseup: function(ev) {
			var ev=ev||window.event; var target=resolveTarget(ev); var d=config.dragscroll;
			var wasScrolling=d.scrolling; d.scrolling=false; document.body.style.cursor='auto';
			if (d.savedMouseUp!=undefined) return d.savedMouseUp.apply(target,arguments);
			if (wasScrolling) return config.dragscroll.processed(ev);
			return;
		}
	}
	// DEFAULT SETTING (ENABLED)
	if (config.options.chkDragScroll===undefined) config.options.chkDragScroll=true;
	// HIJACK MOUSE HANDLERS
	document.onmousedown=config.dragscroll.mousedown;
	document.onmousemove=config.dragscroll.mousemove;
	document.onmouseup  =config.dragscroll.mouseup;
}
//}}}
Name: Earth
Background: #fff
Foreground: #000
PrimaryPale: #ece9d8
PrimaryLight: #ccba9c
PrimaryMid: #baa07b
PrimaryDark: #886655
SecondaryPale: #eff3fa
SecondaryLight: #9bd
SecondaryMid: #336699
SecondaryDark: #003366
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
BackgroundImage: url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwODxAPDgwTExQUExMcGxsbHCAgICAgICAgICD/2wBDAQcHBw0MDRgQEBgaFREVGiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICD/wAARCAACBkADASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECB//EABUQAQEAAAAAAAAAAAAAAAAAAAAB/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEDBf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AO6AOE0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQBVgKNRYANKCixYAKoKNKALFBRVAFWAIsUFFaAFWAosaAFaBRYsBRVAFUAWKCiqANAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/9k=")

{{whiteGray{<<tabs eDi
Configuration "configure appearance of TiddlyWiki" Edit##Configuration
Compare "compare diffrences of two tiddlers" Compare
Tweaker "batch changing of field values" Edit##Tweaker
TidIDE "show TidIDEditor panel" Edit##TidIDE
>>}}}/%
!TidIDE
<<tiddler EditBar>>{{fine smallform nowrap tidIDE{<<tidIDE id:displayArea +edit>>}}}
!Tweaker
{{fine smallform{<<tiddlerTweaker>>}}}
!
/%
!Configuration
|>|>|line-height:30%;padding:0 0 0.5em 0;bgcolor(#9bd): <<gradient vert #eff3fa #9bd>>{{tiny{^^<<editSection Groundless##mainToolbar mainToolbar>> <<editSection zconfiguration##Backstage Backstage>>^^}}}\\
<br><br><br>{{floatleft{{{big{&nbsp; <<editSection Groundless##SiteTitle SiteTitle>>&nbsp;}}} - {{small{<<editSection Groundless##SiteSubtitle SiteSubtitle>>}}}}}}>>\\
{{center{<<editSection Groundless##TopMenu TopMenu>>}}}|
|vertical-align:top;width:13%; \\
<<editSection Groundless##MainMenu MainMenu>> |vertical-align:top;width:70%; {{spacer{<<editSection Groundless##ViewTemplate ViewTemplate>> ^^<<editSection Groundless##ViewToolbar ViewToolbar>>^^\\
{{small{<<editSection Groundless##EditTemplate EditTemplate>>}}} ^^<<editSection Groundless##EditToolbar EditToolbar>>^^ }}}\\
{{tiny{[[DefaultTiddlers|__tiddlyDesktopLayout]]&nbsp; ^^[[DefaultTiddlers]]^^\\
<hr>@@display:block;height:20em;overflow:auto;{{left{<<tiddler Edit##LorumIpsum>>}}}@@}}} |width:15%; \\
<<editSection Groundless##SideBarOptions SideBarOptions>> <br><br> |
|~|~|bgcolor(#eff3fa): {{small{<<editSection Groundless##OptionsPanel OptionsPanel>>}}} \\
{{tiny{[[AdvancedOptions]]}}} |
|~|~|bgcolor(#eee): <<tiddler Edit##SideBarTabs>> |
|>|>|padding:0; {{small{[[Footer]]}}} |
{{whiteGray{<<tabs chkplugin
Styles "show all style definitions" Edit##Styles
Plugins "for disabling plugins" Edit##Plugin
"on demand" "enabling remote plugins" Edit##Load
Scripts "inline scripts" Edit##Script
htmls "html scripts" Edit##Html>>}}}/%
!SideBarTabs
[[SideBarTabs]]
|borderless tiny|k
|vertical-align:top; [[Timeline|TabTimeline]] |vertical-align:top; <br><<editSection Groundless##TabTags TabTags>> <br>\\
 |vertical-align:top; <<editSection Groundless##TabAll TabAll>> |<br><<editSection Groundless##TabMore TabMore>> \\
[[Missing|TabMoreMissing]] <br>[[Orphans|TabMoreOrphans]] <br>[[Shadowed|TabMoreShadowed]] |
!Styles
[[SystemTheme|Groundless]]&nbsp; &nbsp;- <<editSection Groundless##PageTemplate PageTemplate>>&nbsp;- <<editSection Groundless##CustomDefinitions CustomDefinitions>>&nbsp;- <<editSection Groundless##tiddlyDesktopStyle tiddlyDesktopStyle>>
<<editSection Groundless##OverflowStyle OverflowStyle>>&nbsp;- <<editSection Groundless##TabStyles TabStyles>>&nbsp;- <<editSection Groundless##MptwStyle MptwStyle>>&nbsp;- <<editSection Groundless##StylesheetShortcuts StylesheetShortcuts>>&nbsp;- &nbsp; [[ColorPalette]]
<<editSection Groundless##StyleSheet StyleSheet>>&nbsp;- [[StyleSheetColors]]&nbsp; - [[StyleSheetLayout]]&nbsp; - [[StyleSheetPrint]]&nbsp; - [[SiteUrl]]
!Plugin
<<tiddler Switch##ListTitle with: systemConfig>>
!Script
<<tiddler Switch##ListTitle with: script>>
!Html
<<tiddler Switch##ListTitle with: htm>>
!LorumIpsum
<html><h1>"heading 1"</h1></html>
Aenean eros arcu, condimentum nec, dapibus ut, tincidunt sit amet, urna. Quisque viverra, eros sed imperdiet iaculis, est risus facilisis quam, id malesuada arcu nulla luctus urna. Nullam et est. Vestibulum velit sem, faucibus cursus, dapibus vestibulum, pellentesque et, urna. Donec luctus. Donec lectus. Aliquam eget eros facilisis tortor feugiat sollicitudin. Integer lobortis vulputate sapien. Sed iaculis erat ac nunc. Etiam eu enim. Mauris ipsum urna, rhoncus at, bibendum sit amet, euismod eget, dolor.
----
<html><h2>"heading 2"</h2></html>
<html><h3>"heading 3"</h3></html>
{{cola{
#This is a numbered list item
##This is a numbered list item
*This is a list item
> This is a blockquote
}}}{{colb{
|>|>| !This is a header |h
|column1|column2|column3|
|row2| row2 |row2|
|column1|column2|column3|
|row2| row2 |row2|
}}}{{clear{
{{floatright{And this an external [[link|http://www.tiddlywiki.com/]].}}}{{floatleft{This is a link to a [[StyleSheet]] tiddler.}}}{{center{<<tag button>>}}}}}}
!
|Name|LoadRemotePlugin "packed"|
|Source|http://www.TiddlyTools.com/#LoadRemotePlugin|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Requires|InlineJavascriptPlugin|
|Description|Load a plugin from a remote .js URL|

Usage:
<<tiddler LoadRemotePlugin with: "label" "tip" "URL" "onloadfunction" "preloadedtest" "onrunfunction" "configoverlay">>

where:
	label/tip
		- command link text and tooltip
	URL
		- location of .js (i.e., the remotely stored plugin file)
	onloadfunction 
		- js code invoked after loading remote plugin (can be used to init values, display tiddlers, etc)
	preloadedtest
		- js expression to test to see if plugin has already been loaded
	onrunfunction
		- js code invoked when plugin was already loaded (instead of onloadfunction)
	configoverlay
		- name of tiddler containing js code with custom settings, tweaks, etc.
examples:
	see [[InstantBookmarklets]]

!LoadRemote
<script label="$1" title="$2">if('$5'!='$'+'5'&&($5)){clearMessage();if('$6'!='$'+'6'&&'$6'.length){$6;}else{$4;}
displayMessage('$1 is already installed.');return false;}
var s=document.createElement('script');s.src='$3';s.onerror=function(){clearMessage();displayMessage('Could not load $1 from');displayMessage(this.src,this.src);};s.onload=function(){clearMessage();{$4;}
if('$7'!='$'+'7'&&'$7'.length){try{eval(store.getTiddlerText('$7',''));}
catch(e){displayMessage(e.description||e.toString());}}
displayMessage('$1 has been loaded from');displayMessage(this.src,this.src);};s.onreadystatechange=function()
{if(this.readyState=='complete')this.onload();};document.getElementsByTagName('head')[0].appendChild(s);return false;</script>
!
/%
|Name|InstantBookmarklets|
|Source|http://www.TiddlyTools.com/#InstantBookmarklets|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatement <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|Description|instantly create bookmarklets by dragging onclick links to the browser toolbar|

See [[InlineJavascriptPluginInfo]] for bookmarklet authoring documentation
!Load
<<tiddler Edit##LoadRemote with: [[UploadPlugin]]
	[[Load UploadPlugin from svn.TiddlyWiki.org repository]]
	[[http://svn.tiddlywiki.org/Trunk/contributors/BidiX/plugins/UploadPlugin.js]]
	[[window.story.displayTiddler(null,'WelcomeToTiddlyspot')]]
	[[version.extensions.UpoadPlugin!=undefined]]>> 
<<tiddler Edit##LoadRemote with: [[ImportTiddlersPlugin]]
	[[Load ImportTiddlersPlugin from svn.TiddlyWiki.org repository]]
	[[http://svn.tiddlywiki.org/Trunk/contributors/EricShulman/plugins/ImportTiddlersPlugin.js]]
	[[window.story.displayTiddler(null,"ImportTiddlers")]]
	[[version.extensions.ImportTiddlersPlugin!=undefined]]
	[[window.story.displayTiddler(null,"ImportTiddlers")]]
	[[ImportTiddlersPluginConfig]]>> 
<<tiddler Edit##LoadRemote with: [[ExportTiddlersPlugin]]
	[[Load ExportTiddlersPlugin from svn.TiddlyWiki.org repository]]
	[[http://svn.tiddlywiki.org/Trunk/contributors/EricShulman/plugins/ExportTiddlersPlugin.js]]
	[[window.story.displayTiddler(null,"ExportTiddlers")]]
	[[version.extensions.ExportTiddlersPlugin!=undefined]]
	[[window.story.displayTiddler(null,"ExportTiddlers")]]
	[[ExportTiddlersPluginConfig]]>> 
<<tiddler Edit##LoadRemote with: [[TiddlerTweakerPlugin]]
	[[Load TiddlerTweakerPlugin from svn.TiddlyWiki.org repository]]
	[[http://svn.tiddlywiki.org/Trunk/contributors/EricShulman/plugins/TiddlerTweakerPlugin.js]]
	[[window.story.displayTiddler(null,'TiddlerTweaker')]]
	[[version.extensions.TiddlerTweakerPlugin!=undefined]]>> 
<<tiddler Edit##LoadRemote with: [[RearrangeTiddlersPlugin]]
	[[Load RearrangeTiddlersPlugin from www.TiddlyTools.com]]
	[[http://www.TiddlyTools.com/plugins/RearrangeTiddlersPlugin.js]]
	[[window.story.forEachTiddler(function(t,e){window.story.refreshTiddler(t,null,true)}); window.refreshDisplay()]]
	[[Story.prototype.rearrangeTiddlersHijack_refreshTiddler!=undefined]]>> 
<<tiddler Edit##LoadRemote with: [[YourSearchPlugin]]
	[[Load YourSearchPlugin from tiddlywiki.abego-software.de]]
	[[http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.1.js]]
	[[window.refreshPageTemplate()]]
	[[version.extensions.YourSearchPlugin!=undefined]]>> 
<<tiddler Edit##LoadRemote with: [[Firefox Privilege Manager]]
	[[Load Firefox Privilege Manager from svn.TiddlyWiki.org repository]]
	[[http://svn.tiddlywiki.org/Trunk/contributors/XavierVerges/plugins/FirefoxPrivilegesPlugin.js]]
	[[config.macros.firefoxPrivileges.onload()]]
	[[config.macros.firefoxPrivileges!=undefined]]
	[[backstage.switchTab("firefoxPrivileges")]]>> 
<<tiddler Edit##LoadRemote with: [[Jash (JAvascript SHell)]]
	[[Load Jash (JAvascript SHell) from www.billyreisinger.com/jash]]
	[[http://www.billyreisinger.com/jash/source/latest/Jash.js]]
	[[window.jash.close()]]
	[[window.jash!=undefined]]>>
!
%/
/%
|Name| EditBar|
|Source| http://menuflex.tiddlyspot.com/#EditBar - originally: http://www.TiddlyTools.com/#QuickEditPackage|
|Version| 2.4.3|
|Modifier| wolfgang|
|Author| Eric Shulman|
|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| Html|
|Requires| EditBarPlugin; optional: EditTools|
|Description| Quickly insert TiddlyWiki tiddler links or common formatting sequences directly into tiddler content. - This is a modified version of QuickEditPackage. Important: Don't ask the original author for support to this variant script, before you haven't verified it by installing instead the latest version of the full QuickEditPackage.| 

Usage (in EditTemplate): <div macro='tiddler EditBar with: show'></div>
where "show" is an OPTIONAL keyword to force the toolbar to be displayed regardless of the current 'toggle' state. see [[QuickEditPackage]] for additional installation options

CUSTOM DEFINITIONS BEGIN HERE...
= = = = = = = = = = = = = = = = = = = =

!customList
enclose bookmarklet
<html><a href="$1"<span></span></a></html>
----
convert inline script
<<tiddler {{ $1 '';}}>>
----
popup - with [[Pop]]
<<tiddler Pop##Show with: label TiddlerName tooltip buttonClass width popupClass>>
----
ā— bulleted list level 1
*$1
----
ā—‹ bulleted list level 2
**$1
----
ā–  bulleted list level 3
***$1
----
timestamp
$[[enter a date|{{new Date().formatString('DDD, MMM DDth, YYYY hh12:0mm:0ssam')}}]]
----
scrollbox
@@display:block;height:10em;overflow:auto;$1@@@@display:block;text-align:right;^^scroll for more...^^@@
----
nested slider
+++[$1]<<tiddler $1>>===
----
big red
@@font-size:28pt;color:red;$1@@
----
!end


TOOLBAR DEFINITIONS BEGIN HERE...
= = = = = = = = = = = = = = = = = = = =

%/{{hidden tiny center quickEdit{
<<tiddler {{ // show/hide toolbar
	var here=story.findContainingTiddler(place); if (here) var tid=here.getAttribute('tiddler');
	var show='$1'!='$'+'1'||config.options.chkShowEditBar||tid=='EditBar'; 
	place.style.display=show?'block':'none';
'';}}>>/%

**** WORD COUNT ****

%/<<tiddler ShowPopup with: "Words" "tool" "" "10em" "">>/%

**** FORMAT ****

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="plain text (remove ALL formatting)" accesskey="P" onclick="var e=config.quickEdit.getField(this); if (e) e.focus(); var txt=config.quickEdit.getSelection(e); config.quickEdit.setSelection(e,wikifyPlainText(txt)); return false;">&nbsp;-&nbsp;</a></html>/%

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="''bold''" accesskey="B" onclick="config.quickEdit.wrapSelection(this,'\x27\x27','\x27\x27'); return false;">&nbsp;B&nbsp;</a></html>/%

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="//italics//" accesskey="I" onclick="config.quickEdit.wrapSelection(this,'//','//'); return false;">&nbsp;I&nbsp;</a></html>/%

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="__underline__" accesskey="U" onclick="config.quickEdit.wrapSelection(this,'__','__'); return false;">&nbsp;U&nbsp;</a></html>/%
%/ &nbsp;/%  SPACER

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title=""quotes"" accesskey="Q" onclick="config.quickEdit.wrapSelection(this,'\x22','\x22'); return false;">&nbsp;Q&nbsp;</a></html>/%

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="@@highlight@@" accesskey="H" onclick="config.quickEdit.wrapSelection(this,'@@','@@'); return false;">&nbsp;H&nbsp;</a></html>/%

%/<html><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="--strikethrough--" accesskey="S" onclick="config.quickEdit.wrapSelection(this,'--','--'); return false;">&nbsp;S&nbsp;</a></html>/%

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="[[forced link]]" accesskey="L" 
onclick="config.quickEdit.wrapSelection(this,'[[',']]'); return false;"
>&nbsp;L&nbsp;</a></html>/%
%/ &nbsp;/%  SPACER

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="format text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select text format...','');
	s.options[s.length]=new Option('CSS class wrapper','{{$1{,}}},Enter a CSS classname');
	s.options[s.length-1].title='CSS class wrapper - {{classname classname etc{...}}}';
	s.options[s.length]=new Option('inline CSS styles','@@$1,@@,Enter CSS (attribute:value;attribute:value;...;)');
	s.options[s.length-1].title='inline CSS styles - @@attr:value;attr:value;...@@';
	s.options[s.length]=new Option('superscript','^^,^^');
	s.options[s.length-1].title='^^superscript^^';
	s.options[s.length]=new Option('subscript','~~,~~');
	s.options[s.length-1].title='~~subscript~~';
	s.options[s.length]=new Option('heading 1','\n!,\n');
	s.options[s.length-1].title='H1 heading - !';
	s.options[s.length]=new Option('heading 2','\n!!,\n');
	s.options[s.length-1].title='H2 heading - !!';
	s.options[s.length]=new Option('heading 3','\n!!!,\n');
	s.options[s.length-1].title='H3 heading - !!!';
	s.options[s.length]=new Option('heading 4','\n!!!!,\n');
	s.options[s.length-1].title='H4 heading - !!!!';
	s.options[s.length]=new Option('heading 5','\n!!!!!,\n');
	s.options[s.length-1].title='H5 heading - !!!!!';
	s.options[s.length]=new Option('HTML','<html><hide linebreaks>,<\x2fhtml>');
	s.options[s.length-1].title='HTML syntax - <html><hide linebreaks>...<\x2fhtml>';
	s.options[s.length]=new Option('plain text','<nowiki>,<\x2fnowiki>');
	s.options[s.length-1].title='nowiki syntax - <nowiki>...<\x2fnowiki>';
	s.options[s.length]=new Option('blockquote','\<\<\<\n,\n\<\<\<');
	s.options[s.length-1].title='indented blockquote - \<\<\<';
	s.options[s.length]=new Option('monospaced','{{{,}}}');
	s.options[s.length-1].title='inline monospaced text - {{{...}}}';
	s.options[s.length]=new Option('monospaced text box','\n{{{\n,\n}}}');
	s.options[s.length-1].title='multi-line monospaced text box - {{{...}}}';
	s.options[s.length]=new Option('hidden comment','/% , %/');
	s.options[s.length-1].title='comment (invisible content) - /%...%/';
	s.options[s.length]=new Option('css comment','/* , */');
	s.options[s.length-1].title='comment (style sheet) - /*...*/';
	s.options[s.length]=new Option('css code','\n/*{{{*/\n,\n/*}}}*/');
	s.options[s.length-1].title='multiline monospaced css box - /*{{{*/.../*}}}*/';
	s.options[s.length]=new Option('visible comment','\n/***\n,\n***/');
	s.options[s.length-1].title='code comment (visible content) - /***...***/';
	s.options[s.length]=new Option('javascript code','\n//{{{\n,\n//}}}');
	s.options[s.length-1].title='multiline monospaced code box - //{{{...//}}}';
	s.options[s.length]=new Option('hidden javascript','///% , //%/');
	s.options[s.length-1].title='code (invisible javascript) - ///%...//%/';
	s.size=s.length;
	s.onclick=function(){ if (!this.value.length) return;
		var parts=this.value.split(',');
		var prefix=parts[0]; var suffix=parts[1]; var ask=parts[2];
		if (ask) {
			var val=prompt(ask); if (!val) { Popup.remove(); return false; }
			prefix=prefix.replace(/\$1/g,val); suffix=suffix.replace(/\$1/g,val);
		}
		config.quickEdit.wrapSelection(this.button,prefix,suffix);
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s.focus();
	return config.quickEdit.processed(event);"
>form</a></html>/%

**** CUSTOM ****

!help
Reminders:

Custom formats are stored as an "HR-separated list" in [[EditBar]], where the first line of each list item is the text 'label' to show in the droplist, followed by one or more lines of wiki content to be inserted into the tiddler source.

Substitution markers can be used to dynamically insert values into the formatted output: $1 inserts the tiddler editor's current selected text. $[[message|default value]] interactively prompts for a value to be inserted. $[[message|$1]] uses the selected text as the default value. $[[message|{{javascript}}]] calculates the default value using javascript code.
!end help

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="custom defined formats"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select a custom format...','');
	var items=store.getTiddlerText('EditBar##customList','').split('\n----\n');
	for (var i=0; i<items.length; i++) {
		if (!items[i].length) continue; var lines=items[i].split('\n');
		var label=lines.shift(); var val=lines.join('\n');
		s.options[s.length]=new Option(label,val); s.options[s.length-1].title=val;
	}
	s.options[s.length]=new Option('[Edit custom formats...]','_edit');
	s.options[s.length-1].title='add/change custom format definitions...';
	s.size=Math.min(s.length,15);
	s.onclick=function(){ if (!this.value.length) return;
		if (this.value=='_edit') {
			alert(store.getTiddlerText('EditBar##help'));
			story.displayTiddler(story.findContainingTiddler(this.button),
				'EditBar',DEFAULT_EDIT_TEMPLATE);
		} else {
		        var e=config.quickEdit.getField(this.button); if (!e) return false;
			e.focus(); var txt=config.quickEdit.getSelection(e);
			replaceSelection(e, this.value.replace(/\$\x31/g,txt)
				.replace(/\$\[\[[^\]]+\]\]/g, function(t){
					x=t.substr(3,t.length-5).split('|');
					var msg=x[0]; var def=x[1]||'';
					if (def.startsWith('{{')) {
						try{def=eval(def.substr(2,def.length-4))} catch(ex){showException(ex)}
					}
					return prompt(msg,def)||'';
				})
			);
		}
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){ var k=(ev||window.event).keyCode;
		if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show();
	s.focus();
	return config.quickEdit.processed(event);"
>more</a></html>/%

**** ALIGNMENT ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="align text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select text alignment...','');
	s.options[s.length]=new Option('left','left');
	s.options[s.length-1].title='{{left{...}}}';
	s.options[s.length]=new Option('center','center');
	s.options[s.length-1].title='{{center{...}}}';
	s.options[s.length]=new Option('right','right');
	s.options[s.length-1].title='{{right{...}}}';
	s.options[s.length]=new Option('justify','justify');
	s.options[s.length-1].title='{{justify{...}}}';
	s.options[s.length]=new Option('indent','indent');
	s.options[s.length-1].title='{{indent{...}}}';
	s.options[s.length]=new Option('float left','floatleft');
	s.options[s.length-1].title='{{floatleft{...}}}';
	s.options[s.length]=new Option('float right','floatright');
	s.options[s.length-1].title='{{floatright{...}}}';
	s.options[s.length]=new Option('no bullets list','nobullets li');
	s.options[s.length-1].title='{{nobullets{...}}}';
	s.size=s.length;
	s.onclick=function(){ if (!this.value.length) return;
		config.quickEdit.wrapSelection(this.button,'{{'+this.value+'{','}}}');
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s.focus();
	return config.quickEdit.processed(event);"
>lign</a></html>/%

**** COLOR ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="text/background color - @@color:#RGB;background-color:#RGB;...@@"
onclick="var p=Popup.create(this,null,'popup sticky smallform'); if (!p) return false;
 	p.style.padding='2px';
	function hex(d) { return '0123456789ABCDEF'.substr(d,1); }
	var fg=createTiddlyElement(p,'select'); fg.button=this;
	fg.style.width='12em';
	fg.options[0]=new Option('text color...','');
	fg.options[1]=new Option('\xa0 or enter a value','_ask');
	fg.options[2]=new Option('\xa0 or use default color','');
	for (var r=0;r<16;r+=3) for (var g=0;g<16;g+=3) for (var b=0;b<16;b+=3) {
		var label=hex(r)+hex(g)+hex(b);
		fg.options[fg.length]=new Option(label,'#'+label);
		fg.options[fg.length-1].style.color='#'+label;
	}
	fg.onchange=function(){ var val=this.value;
		if (val=='_ask') { val=prompt('Enter a CSS color value');
		if (!val||!val.length) return false; }
		this.options[0].value=val; this.options[0].text=val.length?'text: '+val:'text color...';
		var bg=this.nextSibling;
		for (var i=3;i<bg.options.length;i++) bg.options[i].style.color=val;
		var preview=this.nextSibling.nextSibling.nextSibling;
		var t=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
		t=t.replace(/^@@(color\:.+;)?(background-color\:.+;)?/,'').replace(/@@$/,'');
		if (!t.length) t='~AaBbCcDdEeFfGgHhIiJj 1234567890';
		var fg=this.value; if (fg.length) fg='color:'+fg+';';
		var bg=this.nextSibling.value; if (bg.length) bg='background-color:'+bg+';';
		if (fg.length||bg.length) t='@@'+fg+bg+t+'@@';
		removeChildren(preview); wikify(t,preview);
		this.selectedIndex=0; return false;
	};
	var bg=createTiddlyElement(p,'select'); bg.button=this;
	bg.style.width='12em';
	bg.options[0]=new Option('background color...','');
	bg.options[1]=new Option('\xa0 or enter a value','_ask');
	bg.options[2]=new Option('\xa0 or use default color','');
	for (var r=0;r<16;r+=3) for (var g=0;g<16;g+=3) for (var b=0;b<16;b+=3) {
		var label=hex(15-r)+hex(15-g)+hex(15-b);
		bg.options[bg.length]=new Option(label,'#'+label);
		bg.options[bg.length-1].style.backgroundColor='#'+label;
	}
	bg.onchange=function(){ var val=this.value;
		if (val=='_ask') { val=prompt('Enter a CSS color value');
		if (!val||!val.length) return false; }
		this.options[0].value=val;
		this.options[0].text=val.length?'background: '+val:'background color...';
		var fg=this.previousSibling;
		for (var i=3;i<fg.options.length;i++) fg.options[i].style.backgroundColor=val;
		var preview=this.nextSibling.nextSibling;
		var t=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
		t=t.replace(/^@@(color\:.+;)?(background-color\:.+;)?/,'').replace(/@@$/,'');
		if (!t.length) t='~AaBbCcDdEeFfGgHhIiJj 1234567890';
		var fg=this.previousSibling.value; if (fg.length) fg='color:'+fg+';';
		var bg=this.value; if (bg.length) bg='background-color:'+bg+';';
		if (fg.length||bg.length) t='@@'+fg+bg+t+'@@';
		removeChildren(preview); wikify(t,preview);
		this.selectedIndex=0; return false;
	};
	var b=createTiddlyElement(p,'input',null,null,null,{type:'button'}); b.button=this;
	b.value='ok'; b.style.width='4em';
	b.onclick=function() {
		var fg=this.previousSibling.previousSibling.value; if (fg.length) fg='color:'+fg+';';
		var bg=this.previousSibling.value; if (bg.length) bg='background-color:'+bg+';';
		var t=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
		t=t.replace(/^@@(color\:.+;)?(background-color\:.+;)?/,'').replace(/@@$/,'');
		if (fg.length||bg.length) config.quickEdit.setSelection(this.button,'@@'+fg+bg+t+'@@');
		Popup.remove(); return false;
	};
	var preview=createTiddlyElement(p,'div',null,'viewer'); var s=preview.style;
	s.border='1px solid'; s.margin='2px'; s.width='24em'; s.padding='3px'; s.MozBorderRadius='3px';
	s.overflow='hidden'; s.textAlign='center'; s.whiteSpace='normal';
	var t=config.quickEdit.getSelection(config.quickEdit.getField(this));
	wikify(t.length?t:'~AaBbCcDdEeFfGgHhIiJj 1234567890',preview);
	Popup.show(p,false);
	event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>dye</a></html>/%

**** FONT ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="set font-family CSS attribute - @@font-family:facename;...@@"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select a font family...','');
	var fonts=store.getTiddlerText('EditTools##fontList','').split('\n');
	for (var i=0; i<fonts.length; i++) {
		if (!fonts[i].length) continue;
		s.options[s.length]=new Option(fonts[i],fonts[i]);
		s.options[s.length-1].style.fontFamily=fonts[i];
	}
	s.options[s.length]=new Option('[Edit font list...]','_edit');
	s.options[s.length-1].title='enter fonts, one per line...';
	s.size=Math.min(s.length,15);
	s.onclick=function(){
		if (this.value=='_edit')
			story.displayTiddler(story.findContainingTiddler(this.button),'EditTools',DEFAULT_EDIT_TEMPLATE);			
		else
			config.quickEdit.wrapSelection(this.button,'@@font-family:\x22'+this.value+'\x22;','@@');
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s.focus();
	return config.quickEdit.processed(event);"
>font</a></html>/%
%/ &nbsp;/%  SPACER

**** MORE TOOLS ****

%/<<tiddler EditBarTools>>
/***
|Name|EditBarPlugin|
|Source|http://www.TiddlyTools.com/#QuickEditPlugin|
|Documentation|http://www.TiddlyTools.com/#QuickEditPlugin|
|Version|2.4.3|
|Author|Eric Shulman (modified by Wolfgang|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Description|Support functions for ~QuickEdit package: styles, utility functions, and 'toggleQuickEdit' command. - This is a modified version of QuickEditPackage. Important: Don't ask the original author for support to this variant script, before you haven't verified it by installing instead the latest version of the full QuickEditPackage.|
***/
//{{{
version.extensions.QuickEditPlugin= {major: 2, minor: 4, revision: 3, date: new Date(2009,6,11)};

setStylesheet("\
.quickEdit a { border:2px outset ButtonFace; padding:0px 3px !important; \
	-moz-border-radius:.5em; -webkit-border-radius:.5em; \
	-moz-appearance:button !important; -webkit-appearance:push-button !important; \
	background-color:ButtonFace; color:ButtonText !important;  \
	line-height:200%; font-weight:normal; } \
.quickEdit a:hover { border: 2px inset ButtonFace; background-color:ButtonFace; }\
", "quickEditStyles");

if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

config.quickEdit = {
	processed: function(ev) { ev=ev||window.event;
		ev.cancelBubble=true;
		if(ev.stopPropagation) ev.stopPropagation();
		return false;
	},
	keyup: function(ev){ var k=(ev||window.event).keyCode;
		if (k==13) this.onclick();
		if (k==27) Popup.remove();
	},
	getField: function(where) {
		var here=story.findContainingTiddler(where); if (!here) return null;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text");
		if (e&&e.getAttribute("edit")=="text") return e;
		return null;
	},
	setSelection: function(where,newtext) {
		var e=this.getField(where); if (!e) return false;
		e.focus(); replaceSelection(e,newtext);
		return false;
	},
	wrapSelection: function(where,before,after) {
		var e=this.getField(where); if (!e) return false;
		e.focus(); replaceSelection(e,before+config.quickEdit.getSelection(e)+after);
		return false;
	},
	getSelection: function(e) {
		var seltext="";
		if (e&&e.setSelectionRange)
			seltext=e.value.substr(e.selectionStart,e.selectionEnd-e.selectionStart);
		else if (document.selection) {
			var range = document.selection.createRange();
			if (range.parentElement()==e) seltext=range.text
		}
		return seltext;
	},
	promptForFilename: function(msg,path,file) {
		if(window.Components) {
			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.modeOpen);
				var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
				thispath.initWithPath(path);
				picker.displayDirectory=thispath;
				picker.defaultExtension='jpg';
				picker.defaultString=file;
				picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterImages);
				if (picker.show()!=nsIFilePicker.returnCancel)
					var result="file:///"+picker.file.persistentDescriptor.replace(/\\/g,'/');
			}
			catch(e) { alert('error during local file access: '+e.toString()) }
		}
		else {
			try {
				var s = new ActiveXObject('UserAccounts.CommonDialog');
				s.Filter='All files|*.*|JPG files|*.jpg|GIF files|*.gif|PNG files|*.png|';
				s.FilterIndex=1;
				s.InitialDir=path;
				s.FileName=file;
				if (s.showOpen()) var result=s.FileName;
			}
			catch(e) { var result=prompt(msg,path+file); }
		}
		return result;
	}
}
//}}}
//{{{
if (config.options.chkShowEditBar===undefined) config.options.chkShowEditBar=false;
config.commands.toggleEditBar = {
	hideReadOnly: true,
	getText: function() { return config.options.chkShowEditBar?'\u221Aeditbar':'bar'; },

	tooltip: 'show EditBar toolbar buttons',
	handler: function(event,src,title) {
		config.options.chkShowEditBar=!config.options.chkShowEditBar;
		config.macros.option.propagateOption("chkShowEditBar","checked", config.options.chkShowEditBar,"input");
		if (config.options.chkShowEditBar) saveOptionCookie("chkShowEditBar");
		else removeCookie("chkShowEditBar");
		src.innerHTML=config.commands.toggleEditBar.getText();
		story.forEachTiddler(function(t,e){if (story.isDirty(t)) refreshElements(e);});
		return false;
	}
};
//}}}
// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if(config.options.chkStickyPopups==undefined){config.options.chkStickyPopups=false}Popup.stickyPopup_onDocumentClick=function(a){var d=a?a:window.event;var c=resolveTarget(d);var b=c;while(b){if(hasClass(b,"popup")&&(hasClass(b,"sticky")||config.options.chkStickyPopups)){break}else{b=b.parentNode}}if(!b){Popup.onDocumentClick(a)}return true};try{removeEvent(document,"click",Popup.onDocumentClick)}catch(e){}try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick)}catch(e){};
//}}}
/%
|Name| EditTools|
|Source| http://menuflex.tiddlyspot.com/#EditTools - originally: http://www.TiddlyTools.com/#QuickEditPackage|
|Version| 2.4.3|
|Modifier| wolfgang|
|Author| Eric Shulman|
|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| Html|
|Requires| EditBarPlugin, EditBar|
|Description| Quickly insert TiddlyWiki tiddler links or common formatting sequences directly into tiddler content. - This is a modified version of QuickEditPackage. Important: Don't ask the original author for support to this variant script, before you haven't verified it by installing instead the latest version of the full QuickEditPackage.| 

Usage:
EditTools: <<tiddler EditTools>>
OR
EditTemplate: <span class='toolbar' macro='tiddler EditTools'></span>

CUSTOM DEFINITIONS BEGIN HERE...
= = = = = = = = = = = = = = = = = = = =

!fontList
Arial,helvetica,sans-serif
Times New Roman,times,serif
Courier,monospaced
Lucida Sans
Comic Sans MS
Mistral,vaughan
Palatino Linotype
Sylfaen
DejaVu
!end


TOOLBAR DEFINITIONS BEGIN HERE...
= = = = = = = = = = = = = = = = = = = =

**** REPLACE ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="find/replace selected text with replacement text"
onclick="var here=story.findContainingTiddler(this); if (!here) return false;
	var e=config.quickEdit.getField(here);
	var s=config.quickEdit.getSelection(e); 
	var p=Popup.create(this,null,'popup sticky smallform'); if (!p) return false;
	var t=createTiddlyElement(p,'input'); t.onfocus=function(){this.select()};
	t.value=s.length?s:'enter target text';
	var r=createTiddlyElement(p,'input'); r.onfocus=function(){this.select()};
	r.value='enter replacement text';
	var tid=here.getAttribute('tiddler');
	var b=createTiddlyElement(p,'button',null,null,'?',{tid:tid});
	b.style.width='2em';
	b.title='FIND/FIND NEXT target text';
	b.onclick=function(ev) { /* FIND */
		var e=story.getTiddlerField(this.getAttribute('tid'),'text');
		if (!e||e.getAttribute('edit')!='text') return;
		var t=this.previousSibling.previousSibling;
		e.focus();
		if (e.setSelectionRange) { /* MOZ */
			var newstart=e.value.indexOf(t.value,e.selectionStart+1);
			if (newstart==-1) newstart=e.value.indexOf(t.value); /* wrap around */
			if (newstart==-1) { alert('\u0022'+t.value+'\u0022 not found'); t.focus(); return; }
			e.setSelectionRange(newstart,newstart+t.value.length);
			var linecount=e.value.split('\n').length;
			var thisline=e.value.substr(0,e.selectionStart).split('\n').length;
			e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);
		} else if (document.selection) { /* IE */
			var range=document.selection.createRange();
			if(range.parentElement()==e) {
				range.collapse(false);
				var found=false; try{found=range.findText(t.value,e.value.length,4)}catch(e){}
				if (found) range.select();
				else { alert('\u0022'+t.value+'\u0022 not found'); t.focus(); }
			}
		}
	};
	b=createTiddlyElement(p,'button',null,null,'=',{tid:tid});
	b.style.width='2em';
	b.title='REPLACE selected text';
	b.onclick=function(ev) { /* REPLACE */
		var e=story.getTiddlerField(this.getAttribute('tid'),'text');
		if (!e||e.getAttribute('edit')!='text') return;
		var t=this.previousSibling.previousSibling.previousSibling;
		var r=this.previousSibling.previousSibling;
		if (   (e.selectionStart!==undefined && e.selectionEnd==e.selectionStart)
		    || (document.selection && document.selection.createRange().text==''))
			this.previousSibling.click(); /* no selection... do FIND first */
		if (   (e.selectionStart!==undefined && e.selectionEnd==e.selectionStart)
		    || (document.selection && document.selection.createRange().text==''))
			{ t.focus(); return; } /* still no selection... goto target input */
		e.focus(); replaceSelection(e,r.value);
	};
	b=createTiddlyElement(p,'button',null,null,'+',{tid:tid});
	b.style.width='2em';
	b.title='REPLACE selected text AND FIND NEXT target text';
	b.onclick=function(ev) { /* REPLACE and FIND NEXT */
		this.previousSibling.click();
		this.previousSibling.previousSibling.click();
	};
	b=createTiddlyElement(p,'button',null,null,'!',{tid:tid});
	b.style.width='2em';
	b.title='REPLACE ALL occurrences of target text';
	b.onclick=function(ev) { /* REPLACE ALL */
		var e=story.getTiddlerField(this.getAttribute('tid'),'text');
		if (!e||e.getAttribute('edit')!='text') return;
		var t=this.previousSibling.previousSibling.previousSibling.previousSibling.previousSibling;
		var r=this.previousSibling.previousSibling.previousSibling.previousSibling;
		if (!t.value.length) { alert('Please enter the target text'); t.focus(); return; }
		var m='This will replace all occurences of:\n\n';
		m+='\''+t.value+'\'\n\nwith:\n\n\''+r.value+'\'\n\nAre you sure?';
		if (!confirm(m)) { r.focus(); r.select(); return; }
		e.value=e.value.replace(new RegExp(t.value.escapeRegExp(),'gm'),r.value);
		e.focus(); e.select(); Popup.remove();
	};
	Popup.show(p,false);
	if (!s.length) {t.focus();t.select()} else {r.focus();r.select()}
	event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>seek</a></html>/%

**** SPLIT TIDDLER ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="move selection to new tiddler and insert link, embedded tiddler, or slider"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	p.style.whiteSpace='nowrap';
	var i=createTiddlyElement(p,'input');
	i.defaultValue='Enter a new tiddler title';
	i.onfocus=function(){this.select()};
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select type...','');
	s.options[0].title='select split type';
	s.options[1]=new Option('link','link');
	s.options[1].title='replace with [[TiddlerName]]';
	s.options[2]=new Option('embed','embed');
	s.options[2].title='replace with \<\<tiddler TiddlerName\>\>';
	s.options[3]=new Option('slider','slider');
	s.options[3].title='replace with \<\<slider \u0022\u0022 [[TiddlerName]] [[label]] [[tooltip]]\>\>';
	s.onchange=function(){
		if (s.previousSibling.value==s.previousSibling.defaultValue)
			{ alert('A tiddler title is required'); s.selectedIndex=0; s.previousSibling.focus(); return false; }
		var tid=s.previousSibling.value;
		if (store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid])))
			{ s.previousSibling.focus(); return false; }
		switch(s.value) {
			case 'link':
				var newtxt='[['+tid+']]';
				break;
			case 'embed':
				var newtxt='\<\<tiddler [['+tid+']]\>\>';
				break;
			case 'slider':
				var label=prompt('Enter a slider label',tid);
				if (!label) { Popup.remove(); return false; }
				var tip=prompt('Enter a slider tooltip',label);
				if (!tip) { Popup.remove(); return false; }
				var newtxt='\<\<slider \u0022\u0022 [['+tid+']] [['+label+']] [['+tip+']]\>\>';
				break;
		}
		var txt=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
		store.saveTiddler(tid,tid,txt,config.options.txtUserName,new Date(),[],{});
		story.displayTiddler(story.findContainingTiddler(this.button),tid);
		config.quickEdit.setSelection(this.button,newtxt);
		Popup.remove(); return false;
	};
	Popup.show(p,false);
	event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>split</a></html>/%

**** SORT LINES ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="sort lines of text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select sort order...','');
	s.options[s.length]=new Option('ascending','A');
	s.options[s.length-1].title='ascending';
	s.options[s.length]=new Option('descending','D');
	s.options[s.length-1].title='descending';
	s.size=s.length;
	s.onclick=function(){ if (!this.value.length) return;
		var e=config.quickEdit.getField(this.button); if (!e) return false;
		var lines=config.quickEdit.getSelection(e).split('\n').sort();
		if (this.value=='D') lines=lines.reverse();
		replaceSelection(e,lines.join('\n'));
		e.focus();
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s.focus();
	return config.quickEdit.processed(event);"
>sort</a></html>/%

**** CONVERT ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="convert between tab-separated, comma-separated data and wiki table formats"
onclick="var e=config.quickEdit.getField(this);
	if (e) e.focus(); var txt=config.quickEdit.getSelection(e);
	if (txt.indexOf(',')+txt.indexOf('\t')+txt.indexOf('|')==-3) {
		alert('Please select text containing tabs, commas, or TiddlyWiki table syntax.');
		return false;
	}
	var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select a converter...','');
	if (txt.indexOf(',')!=-1) {
		s.options[s.length]=new Option('commas -> table','commasToTable');
		s.options[s.length]=new Option('commas -> tabs','commasToTabs');
	}
	if (txt.indexOf('\t')!=-1) {
		s.options[s.length]=new Option('tabs -> table','tabsToTable');
		s.options[s.length]=new Option('tabs -> commas','tabsToCommas');
	}
	if (txt.indexOf('|')!=-1) {
		s.options[s.length]=new Option('table -> tabs','tableToTabs');
		s.options[s.length]=new Option('table -> commas','tableToCommas');
	}
	s.size=s.length;
	s.onclick=function(){ if (!this.value.length) return;
	        var e=config.quickEdit.getField(this.button); if (!e) return false;
		e.focus(); var txt=config.quickEdit.getSelection(e);
		switch(this.value) {
			case 'tabsToTable':
				txt=txt.replace(/\t/g,'|').replace(/^|$/g,'|');
				txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
				break;
			case 'tableToTabs':
				txt=txt.replace(/\t/g,' ').replace(/\|/g,'\t');
				txt=txt.replace(/^\t/g,'').replace(/\t$/g,'');
				txt=txt.replace(/\n\t/g,'\n').replace(/\t\n/g,'\n');
				break;
			case 'commasToTable':
				txt=txt.replace(/,/g,'|').replace(/^|$/g,'|');
				txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,''); 
				break;
			case 'tableToCommas':
				txt=txt.replace(/,/g,' ').replace(/\|/g,',');
				txt=txt.replace(/^,/g,'').replace(/,$/g,''); 
				txt=txt.replace(/\n,/g,'\n').replace(/,\n/g,'\n'); 
				break;
			case 'tabsToCommas':
				txt=txt.replace(/\t/g,',');
				break;
			case 'commasToTabs':
				txt=txt.replace(/,/g,'\t');
				break;
		}
		replaceSelection(e,txt);
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s.focus();
	return config.quickEdit.processed(event);"
>tab,|</a></html>/%
%/ &nbsp;/% (SPACER)

**** INSERT LINK ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="add a link to a tiddler or external file - [[link text|TiddlerName]]"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';

	var s2=createTiddlyElement(p,'select'); s2.title='filter by tag';
	s2.options[0]=new Option('filter by tag...','');
	s2.options[s2.length]=new Option('[all tiddlers]','');
	var tags=store.getTags();
	for (var t=0; t<tags.length; t++) s2.options[s2.length]=new Option(tags[t][0],tags[t][0]);
	s2.onchange=function(){
		var tag=this.value;
		var tids=tag.length?store.getTaggedTiddlers(tag,'title'):store.getTiddlers('title');
		var list=this.nextSibling.nextSibling;
		while (list.length) list.options[0]=null;
		var prompt='select a tiddler or file...';
		if (tag.length) prompt='select a tagged tiddler ['+tids.length+' matches]...';
		list.options[0]=new Option(prompt,'');
		if (!tag.length) list.options[list.length]=new Option('[browse for file...]','_file');
		for (var t=0; t<tids.length; t++) {
			list.options[list.length]=new Option(tids[t].title,tids[t].title);
			list.options[list.length-1].title=tids[t].getSubtitle();
		}
		list.size=Math.min(list.length,10);
		list.selectedIndex=0; list.focus();
		this.style.width=list.offsetWidth+'px';
		if (!tag.length) this.selectedIndex=0;
	};
	createTiddlyElement(p,'br');

	var s=createTiddlyElement(p,'select'); s.button=this;
	s.title='select a tiddler or file';
	s.options[0]=new Option('select a tiddler or file...','');
	s.options[s.length]=new Option('[browse for file...]','_file');
	var tids=store.getTiddlers('title');
	for (var t=0; t<tids.length; t++) {
		s.options[s.length]=new Option(tids[t].title,tids[t].title);
		s.options[s.length-1].title=tids[t].getSubtitle();
	}
	s.size=Math.min(s.length,10);
	s.onclick=function(){ if (!this.value.length) return false;
		var title=this.value; var txt=title;
		if (title=='_file') {
			title=config.quickEdit.promptForFilename('Select a file',
				getLocalPath(document.location.href),'');
			if (!title) { this.selectedIndex=0; this.focus(); return false; }
			var txt=title.substr(title.lastIndexOf('/')+1);
		}
		var txt=prompt('Enter the text to display for this link',txt);
		if (!txt) { this.selectedIndex=0; this.focus(); return false; }
		config.quickEdit.setSelection(this.button,'[['+txt+'|'+title+']]');
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s2.style.width=s.offsetWidth+'px';
	s.focus();
	return config.quickEdit.processed(event);"
>link</a></html>/%

**** INSERT TIDDLER OR FILE ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="insert content from another tiddler or external file"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';

	var s2=createTiddlyElement(p,'select'); s2.title='filter by tag';
	s2.options[0]=new Option('filter by tag...','');
	s2.options[s2.length]=new Option('[all tiddlers]','');
	var tags=store.getTags();
	for (var t=0; t<tags.length; t++) s2.options[s2.length]=new Option(tags[t][0],tags[t][0]);
	s2.onchange=function(){
		var tag=this.value;
		var tids=tag.length?store.getTaggedTiddlers(tag,'title'):store.getTiddlers('title');
		var list=this.nextSibling.nextSibling;
		while (list.length) list.options[0]=null;
		var prompt='select a tiddler or file...';
		if (tag.length) prompt='select a tagged tiddler ['+tids.length+' matches]...';
		list.options[0]=new Option(prompt,'');
		if (!tag.length) list.options[list.length]=new Option('[browse for file...]','_file');
		for (var t=0; t<tids.length; t++) {
			list.options[list.length]=new Option(tids[t].title,tids[t].title);
			list.options[list.length-1].title=tids[t].getSubtitle();
		}
		list.size=Math.min(list.length,10);
		list.selectedIndex=0; list.focus();
		this.style.width=list.offsetWidth+'px';
		if (!tag.length) this.selectedIndex=0;
	};
	createTiddlyElement(p,'br');

	var s=createTiddlyElement(p,'select'); s.button=this;
	s.title='select a tiddler or file';
	s.options[0]=new Option('select a tiddler or file...','');
	s.options[s.length]=new Option('[browse for file...]','_file');
	var tids=store.getTiddlers('title');
	for (var t=0; t<tids.length; t++) {
		s.options[s.length]=new Option(tids[t].title,tids[t].title);
		s.options[s.length-1].title=tids[t].getSubtitle();
	}
	s.size=Math.min(s.length,10);
	s.onclick=function(){ if (!this.value.length) return false;
		if (this.value=='_file') {
			var fn=config.quickEdit.promptForFilename(
				'Enter/select a text file',getLocalPath(document.location.href),'');
			if (!fn) return false; /* cancelled by user */
			var txt=loadFile(getLocalPath(fn));
			if (!txt) { alert('Error: unable to read contents from \0027'+fn+'\0027'); return; }
		}
		else var txt=store.getTiddlerText(this.value);
		if (!txt) {
			displayMessage(this.value+' not found');
			this.selectedIndex=0; this.focus();
			return false;
		}
		config.quickEdit.setSelection(this.button,txt);
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s2.style.width=s.offsetWidth+'px';
	s.focus();
	return config.quickEdit.processed(event);"
>set</a></html>/%

**** INSERT MACRO ****

You can add guideText to your own plugin-defined macros by using the following javascript syntax: config.macros.macroName.guideText="guide text goes here";
%/<<tiddler {{
	/* SET MACRO GUIDE TEXT (for built-in core macros) (11/17 - TBD - incomplete list) */
	config.macros.edit.guideText="fieldname #rows";
	config.macros.view.guideText="fieldname (link,wikified,date) format";
	config.macros.slider.guideText="cookie TiddlerName label tooltip";
	config.macros.option.guideText="(txtCookieName,chkCookieName)";
	config.macros.tiddler.guideText="TiddlerName with: params...";
	""; /* must return blank to suppress output */ }}>>/%

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
title="add a macro - \<\<macroName ...\>\>"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select a macro...','');
	var macros=[]; for (var m in config.macros) if (config.macros[m].handler) macros.push(m); macros.sort();
	for (var i=0; i<macros.length; i++) { var m=macros[i];
		var help=config.macros[m].guideText; if (!help) help=''; else help=' '+help;
		s.options[s.length]=new Option(m,m+help);
		s.options[s.length-1].title='\<\<'+m+help+'\>\>';
	}
	s.size=Math.min(s.length,15);
	s.onclick=function(){ if (!this.value.length) return;
		config.quickEdit.setSelection(this.button,'\<\<'+this.value+'\>\>');
		Popup.remove(); return false;
	};
	s.onkeyup=function(ev){
		var k=(ev||window.event).keyCode; if (k==13) this.onclick(); if (k==27) Popup.remove();
	};
	Popup.show(p,false);
	s.focus();
	return config.quickEdit.processed(event);"
>mac</a></html>/%

**** INSERT IMAGE ****

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" 
	title="embed an image (jpg/gif/png) - [img[tooltip|URL]] or [img[tooltip|path/to/file.ext]]"
	onclick="var fn=config.quickEdit.promptForFilename(
		'Enter/select an image file',getLocalPath(document.location.href),'');
	if (!fn) return false;  /* cancelled by user */
	var h=document.location.href; var p=decodeURIComponent(h.substr(0,h.lastIndexOf('/')+1));
	if (fn.startsWith(p)) fn=fn.substr(p.length); /* use RELATIVE path/filename.ext */
	var tip=prompt('Enter a tooltip for this image',''); if (!tip) tip=''; else tip+='|';
	return config.quickEdit.setSelection(this,'[img['+tip+fn+']]');"
>img</a></html>&nbsp;
/***
|Name|EditFieldPlugin|
|Source|http://www.TiddlyTools.com/#EditFieldPlugin|
|Version|1.5.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|extend core edit macro for use in ViewTemplates or direct embedding in tiddler content|
!!!!!Usage
<<<
Normally, when a tiddler is edited, a set of input fields is displayed (as defined by the [[EditTemplate]]), and any changes you make are only saved when you press the "done" (or "cancel") command in the tiddler editor's toolbar.  However, you can also ''embed an input field directly in //viewed// tiddler content'' by writing:
{{{
<<edit fieldname numberOfLines defaultValue>>
<<edit fieldname@TiddlerName numberOfLines defaultValue>>
}}}
or in the [[ViewTemplate]] (to add it to every tiddler):
{{{
<span macro='edit fieldname numberOfLines defaultValue'></span>
<span macro='edit fieldname@TiddlerName numberOfLines defaultValue'></span>
}}}
Unfortunately, while the input field will be displayed, the "done" command item is not available when //viewing// a tiddler, so the 'save/discard' handling cannot be invoked once you have decided that your input activities are complete, and any changes you make will not stored anywhere.  To address this, the plugin extends the input field handler so that when a field is embedded in normal tiddler content and you make changes, it can automatically save/discard your changes as soon as you press ENTER or move away ('onBlur' handling) from that input field.  You can also abandon your changes to input field content by pressing ESCAPE.

The plugin also adds support for an optional 'remote field reference' syntax: "{{{fieldname@TiddlerName}}}" so you can display and edit fields stored in other tiddlers.  This allows you to create, for example, 'summary' tiddlers for reviewing/editing field values from several tiddlers at the same time.  Note: whenever a remote field reference is used (even within the [[EditTemplate]]), the automatic save/discard behavior described above will be applied to that field, so that any changes will be saved immediately, and will not be saved again when the "done" command is pressed.
<<<
!!!!!Examples
<<<
*"""<<edit foobar>>"""<br><<edit foobar>>
*"""<<edit foobar@SomeTiddler>>"""<br><<edit foobar@SomeTiddler>>
*"""<<edit tags>>"""<br><<edit tags>>
*"""<<edit text 15>>"""<br>{{editor{<<edit text 15>>}}}
<<<
!!!!!Revisions
<<<
2009.09.16 [1.5.1] fixed 'onblur' handling for local fields (fieldname@here).  Added support for  '@here' syntax
2009.09.05 [1.5.0] code refactored.  added handling for fieldname@tiddlername
2007.08.22 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.EditFieldPlugin= {major: 1, minor: 5, revision: 1, date: new Date(2009,9,16)};

config.macros.edit.editFieldPlugin_savedHandler=config.macros.edit.handler;
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) {

	// let core render input/textarea, then get resulting element
	config.macros.edit.editFieldPlugin_savedHandler.apply(this,arguments);
	var fieldType=params[0]=="text"||params[1]?'textarea':'input';
	var elems=place.getElementsByTagName(fieldType); var e=elems[elems.length-1];

	// extended fieldname@tiddlername handling
	var parts=e.getAttribute("edit").split('@');
	var field=parts[0];
	var title=parts[1]||tiddler.title;
	if (title=='here') title=tiddler.title;
	// stop field from being saved with 'done' button
	if (parts[1]) { e.setAttribute("edit",null); e.setAttribute("field",field); }

	// save starting value and target tiddler
	e.setAttribute("currval",store.getValue(title,field)||''); // save starting value
	e.setAttribute("tiddler",title);

	// force height for textarea field
	if (fieldType=="textarea" && params[1]) e.style.height=params[1]+"em";

	// if viewing tiddler, add autosave handlers
	var here=story.findContainingTiddler(place);
	var isViewed=here&&here.getAttribute("template").indexOf("ViewTemplate")!=-1;
	if (parts[1]||isViewed) { // remote reference or view mode editing...
		story.setDirty(tiddler.title,false); // clear tiddler ("dirty") flag (set by core)
		e.onkeydown=function(ev) { // ENTER key=save (for single-line input)
			var event=ev?ev:window.event;
			this.setAttribute("keyCode",event.keyCode); // save last keyCode (for blur)
			if (event.keyCode==13 && this.nodeName.toUpperCase()!="TEXTAREA")
				this.saveField(); // save input to tiddler field
		}
		e.onblur=function(ev) { // confirm input when focus moves away
			var event=ev?ev:window.event;
			var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
			var field=this.getAttribute("edit")||this.getAttribute("field");
			if (this.value==this.getAttribute("currval")) return; // no change
			if (this.getAttribute("keyCode")=="27") { // if user pressed ESC
				var msg="Abandon changes to %0@%1?".format([field,tid]);
				if (confirm(msg)) this.value=this.getAttribute("currval"); // reset value
				this.id=new Date().getTime(); // set unique ID for delayed re-focus after blur
				setTimeout("document.getElementById('"+this.id+"').focus()",1);
			} else { // other focus change events
				var msg="Save changes to %0@%1?".format([field,tid]);
				if (confirm(msg)) this.saveField();
				else this.value=this.getAttribute("currval");
			}
		};
		e.saveField=function() { // unpack/validate attribs and then save the field
			var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
			var field=this.getAttribute("edit")||this.getAttribute("field");
			var title=(field=="title")?this.value:tid;
			if (!title.length) { // error: blank tiddler title
				this.value=this.getAttribute("currval"); // reset value
				this.id=new Date().getTime(); // set unique ID for delayed messages/refocus
				setTimeout("displayMessage('Please enter a non-blank value')",1);
				setTimeout("document.getElementById('"+this.id+"').focus()",2);
				return;
			}
			config.macros.edit.saveField(tid,title,field,this.value);
			this.setAttribute("currval",this.value); // remember new starting value
		};
	}
}
//}}}
//{{{
// save input value to tiddler field (create/touch/rename tiddler as needed)
config.macros.edit.saveField = function(tid,title,field,val) {
	var t=store.getTiddler(tid);
	store.suspendNotifications();
	var anim=config.options.chkAnimate; config.options.chkAnimate=false; // suspend animation
	var who=t&&config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
	var when=t&&config.options.chkForceMinorUpdate?t.modified:new Date();
	store.saveTiddler(t?tid:title,title,t?t.text:"",who,when,t?t.tags:[],t?t.fields:null);
	store.setValue(title,field,val); // save field
	if (tid!=title) // new title... show renamed tiddler in place of current one
		{ story.displayTiddler(story.getTiddler(tid),title); story.closeTiddler(tid); }
	if (field=="text") // content changed, refresh tiddler display
		{ story.refreshTiddler(title,null,true); }
	config.options.chkAnimate=anim; // resume animation
	store.resumeNotifications();
	store.notify(title,true);
}
//}}}
/***
|Name|EditSectionPlugin ''packed''|
|Source|http://www.TiddlyTools.com/#EditSectionPlugin|
|Version|1.0.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Description|invoke popup 'section editor' for specified section of a tiddler|
***/
//{{{
version.extensions.EditSectionPlugin={major:1,minor:0,revision:1,date:new Date(2009,9,7)};config.shadowTiddlers.EditSectionPluginPanel=store.getTiddlerText("EditSectionPlugin##html");config.macros.editSection={label:"edit section...",tip:"edit %0",handler:function(f,b,d,g,c,i){var j=story.findContainingTiddler(f);var e=d[0];var h=d[1]||this.label.format([e]);var k=d[2]||this.tip.format([e]);var a=createTiddlyButton(f,h,k,this.click);a.setAttribute("tid",e)},click:function(b){var a=story.findContainingTiddler(this);var d=this.getAttribute("tid").split("##");var e=d[1]?d[0]:null;var c=d[1]||d[0];if(!e&&a){e=a.getAttribute("tiddler")}if(!e||!c){displayMessage("invalid section reference: "+this.getAttribute("tid"));return false}return config.macros.editSection.popup(this,b,e,c)},popup:function(a,b,g,e){var d=Popup.create(a);if(!d){return false}d.className+=" smallform editSectionPopup sticky";d.innerHTML=store.getTiddlerText("EditSectionPluginPanel");var c=d.getElementsByTagName("form")[0];c.title.value=g;c.section.value=e;c.newsection.value=g+"##"+e;c.content.value=store.getTiddlerText(g+"##"+e,"");if(version.extensions.TextAreaPlugin){new window.TextAreaResizer(c.content)}Popup.show();b.cancelBubble=true;if(b.stopPropagation){b.stopPropagation()}return false},save:function(l,a){var e=l.form;var b=e.newsection.value.split("##");var k=b[1]?b[0]:null;var m=b[1]||b[0];var d=Popup.stack[Popup.stack.length-1].root;if(!k){k=story.findContainingTiddler(d).getAttribute("tiddler")}if(!k||!m){displayMessage("invalid section reference: "+e.newsection.value);e.newsection.focus();e.newsection.select();return false}var o=store.getTiddler(k);if(!o){if(!confirm("The tiddler: '"+k+"' does not exist.  Press OK to create it.")){e.newsection.focus();e.newsection.select();return false}o=new Tiddler();o.title=k;o.text="!"+m+"\n"}var c=e.section.value;var g=store.getTiddlerText(k+"##"+c,"").escapeRegExp();var i=new RegExp("(.*!{1,6})"+c+"\\n"+g+"((?:\\n!{1,6}|$).*)");var j="$1"+m+"\n"+e.content.value+"$2";var n=o&&config.options.chkForceMinorUpdate?o.modifier:config.options.txtUserName;var h=o&&config.options.chkForceMinorUpdate?o.modified:new Date();store.saveTiddler(k,k,o.text.replace(i,j),n,h,o.tags,o.fields);story.refreshTiddler(k,null,true);Popup.remove();return false}};
//}}}
//{{{
config.shadowTiddlers.EditSectionPluginPanel=store.getTiddlerText('EditSectionPlugin##html');
//}}}
/***
//{{{
!html
<!--{{{-->
<form style="white-space:nowrap">
<input type="hidden" name="title" value="">
<input type="hidden" name="section" value="">
<input type="text" name="newsection" value="" style="width:68%"><!--
--><input type=button value="save" style="width:15%"
	onclick="return config.macros.editSection.save(this,event)"><!--
--><input type=button value="cancel" style="width:15%"
	onclick="Popup.remove(); return false;">
<div class="editor"><textarea name="content" rows="15" cols="90" style="border:0"
	onfocus="this.select()"></textarea></div>
</form>
!end
//}}}
***/
<<forEachTiddler
where
'tiddler.tags.contains("BĆøger")'
sortBy 'tiddler.data("author")'
write
'"{{indent{"+tiddler.data("author")+".}}} {{indent{//"+tiddler.title+"//}}} {{indent{[[her|"+tiddler.title+"]]}}}<br>\n"' 
>>
<<forEachTiddler 
where 'tiddler.tags.contains("BĆøger") && tiddler.data("primtopic")' 
sortBy 'GroupTitle = tiddler.data("primtopic")+"###"+tiddler.title'
script 'function getGroupTitle(tiddler, context) {
    if (!context.lastGroup || context.lastGroup != tiddler.data("primtopic"))
{
        context.lastGroup = tiddler.data("primtopic");
        return "!! {{{"+(context.lastGroup?context.lastGroup:"no categorizados")+"}}}\n";
    } else return "";}'
write
'getGroupTitle(tiddler, context)+"** [["+tiddler.title+"]]\n"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("BĆøger")'
sortBy 'tiddler.title'
write
'"#{{indent{//"+tiddler.title+"//}}} {{indent{"+tiddler.data("author")+".}}} {{indent{[[her|"+tiddler.title+"]]}}}<br>\n"' 
>>
@@color:#ccc;Tiddlers tagged with attachment@@
----
{{twocolumns{
<script>
// get all tiddlers tagged with "attachment"
var tids=store.getTaggedTiddlers("attachment");
// keep only tiddlers *also* tagged with New
var list=[];
for (var t=0; t<tids.length; t++)
   if (tids[t].isTagged("attachment")) 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>
}}} 

{{treeview{<<treeview2 {{story.findContainingTiddler(place).getAttribute
('tiddler');}} "treeview-gray" 'collapsed: false,
 antisesame: "closed", animated: "fast", persist: "cookie", cookieId:
 "Emner"'>>}}}<<tiddler hurtignote>>
{{treeview{<<treeview2 "$1" "treeview-gray" 'collapsed: false, antisesame: "closed", animated: "fast", persist: "cookie", cookieId: "Emner"'>>}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'><span style='padding-right: 1.8em;' macro='newHere label:"*opret et underemne*"'></span><span style="color:#ccc;"></span><span style="padding-right:1.8em;" macro='tagger'></span ><span macro='snapshot print label:print prompt:Udskriv id:story'></span></div></div>
<div macro="hideWhenTaggedAny noTitle iframe">
<span class='title' macro='view title'></span></div>

<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div macro='tiddler EmnerTemplate'></div>
<!--}}}-->
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

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

//}}}

/***
|''Name:''|FCKeditorPlugin|
|''Description:''|Wysiwyg editor for TiddlyWiki using FCKeditor.|
|''Version:''|1.1.1|
|''Date:''|Dec 21,2007|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.2.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demo:
On the plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], see and edit [[WysiwygDemo]].
!Installation:
#download and unzip [[FCKeditor|http://www.fckeditor.net/download]] (by default, in a wiki subfolder, such that the relative path "fckeditor/fckeditor.js" is right).
#import [[FCKeditorPlugin]] (systemConfig tagged)
#add the following text to MarkupPreHead : {{{<script type="text/javascript" src="fckeditor/fckeditor.js"></script>}}}
#customize FCKeditorPath if needed (in MarkupPreHead and in options below)
#save and reload
#use the <<toolbar editHtml>> button in the tiddler's toolbar (in default ViewTemplate) or add {{{editHtml}}} command in your own toolbar.
! Useful Addons
*[[HTMLFormattingPlugin|http://www.tiddlytools.com/#HTMLFormattingPlugin]] to embed wiki syntax in html tiddlers.<<br>>//__Tips__ : When this plugin is installed, you can use anchor syntax to link tiddlers in wysiwyg mode (example : #example). Anchors are converted back and from wiki syntax when editing.//
*[[TaggedTemplateTweak|http://www.TiddlyTools.com/#TaggedTemplateTweak]] to use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values.
!Configuration options :
|FCKeditor folder (absolute or relative)|<<option txtFCKeditorPath>> |
|FCKeditor custom configuration script path (relative or absolute)<<br>>[[Example|fckeditor/editor/custom_config.js]] : {{{ fckeditor/editor/custom_config.js}}}|<<option txtFCKCustomConfigScript>>|
|Toolbar name ("Default", "Basic" or custom)<<br>>See [[FCKeditor documentation|http://wiki.fckeditor.net/Developer%27s_Guide/Configuration/Toolbar]] for more information on custom toolbars|<<option txtFCKToolbar>>|
|FCKeditor default height (if blank = 500px)|<<option txtFCKheight>>|
|Template called by the {{{wysiwyg}}} button|EditHtmlTemplate|
!Code
***/
//{{{
config.options.txtFCKeditorPath = config.options.txtFCKeditorPath ? config.options.txtFCKeditorPath : "fckeditor/";
config.options.txtFCKCustomConfigScript = config.options.txtFCKCustomConfigScript ? config.options.txtFCKCustomConfigScript : "";
config.options.txtFCKToolbar = config.options.txtFCKToolbar ? config.options.txtFCKToolbar : "";
config.options.txtFCKheight = config.options.txtFCKheight ? config.options.txtFCKheight : "500px";

config.macros.editHtml = {
	handler : function(place,macroName,params,wikifier,paramString,tiddler) {
		var field = params[0];
		var height = params[1] ? params[1] : config.options.txtFCKheight;
		if (typeof FCKeditor=="undefined"){
			displayMessage(config.macros.editHtml.FCKeditorUnavailable);
			config.macros.edit.handler(place,macroName,params,wikifier,paramString,tiddler);

		}
		else if (field) {
			var e = createTiddlyElement(null,"div");
			var fckName = "FCKeditor"+ Math.random();
			if(tiddler.isReadOnly())
				e.setAttribute("readOnly","readOnly");
			e.setAttribute("editHtml",field);
			if (height) e.setAttribute("height",height);
			e.setAttribute("fckName",fckName);
			place.appendChild(e);
			var fck = new FCKeditor(fckName);
			fck.BasePath = config.options.txtFCKeditorPath;
			if (config.options.txtFCKCustomConfigScript) fck.Config["CustomConfigurationsPath"] = config.options.txtFCKCustomConfigScript ;
			if (config.options.txtFCKToolbar) fck.ToolbarSet = config.options.txtFCKToolbar;
			fck.Height=height;
			var re = /^<html>(.*)<\/html>$/m;
			var fieldValue=store.getValue(tiddler,field);
			var htmlValue = re.exec(fieldValue);
			var value = (htmlValue && (htmlValue.length>0)) ? htmlValue[1] : fieldValue;
			value=value.replace(/\[\[([^|\]]*)\|([^\]]*)]]/g,'<a href="#$2">$1</a>');
			config.macros.editHtml.FCKvalues[fckName]=value;
			e.innerHTML = fck.CreateHtml();
		}
	},
        gather : function(e) {
            var name = e.getAttribute("fckName");
            var oEditor = window.FCKeditorAPI ? FCKeditorAPI.GetInstance(name) : null;
            if (oEditor) {
                        var html = oEditor.GetHTML();
			if (html!=null) 
                                    return "<html>"+html.replace(/<a href="#([^>]*)">([^<]*)<\/a>/gi,"[[$2|$1]]")+"</html>"; 
            }	
        },
	FCKvalues : {},
	FCKeditorUnavailable : "FCKeditor kunne ikke hentes. Check om du har internet og evt. ogsƄ plugin konfigurationen og genopfrisk."
}


window.FCKeditor_OnComplete= function( editorInstance ) {
        var name=editorInstance.Name;
	var value = config.macros.editHtml.FCKvalues[name];
	delete config.macros.editHtml.FCKvalues[name];
	oEditor = FCKeditorAPI.GetInstance(name);
	if (value) oEditor.SetHTML(value);
}

Story.prototype.previousGatherSaveEditHtml = Story.prototype.previousGatherSaveEditHtml ? Story.prototype.previousGatherSaveEditHtml : Story.prototype.gatherSaveFields; // to avoid looping if this line is called several times
Story.prototype.gatherSaveFields = function(e,fields){
	if(e && e.getAttribute) {
		var f = e.getAttribute("editHtml");
		if(f){
			var newVal = config.macros.editHtml.gather(e);
			if (newVal) fields[f] = newVal;
		}
		this.previousGatherSaveEditHtml(e, fields);
	}
};

config.shadowTiddlers.EditHtmlTemplate = config.shadowTiddlers.EditTemplate.replace(/macro='edit text'/,"macro='editHtml text'");

config.commands.editHtml={
	text: "wysiwyg",
	tooltip: "redigƩr denne tiddler med en RichText editor",
	readOnlyText: "",
	handler : function(event,src,title) {
		clearMessage();
		var tiddlerElem = document.getElementById(story.idPrefix + title);
		var fields = tiddlerElem.getAttribute("tiddlyFields");
		story.displayTiddler(null,title,"EditHtmlTemplate",false,null,fields);
		return false;
	}
}

config.shadowTiddlers.ViewTemplate = config.shadowTiddlers.ViewTemplate.replace(/\+editTiddler/,"+editTiddler editHtml");

//}}}
/***
|Name|FieldsEditorPlugin "packed"|
|Description|//create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>.|
|Version|1.0.2|
|Source|http://visualtw.ouvaton.org/VisualTW.html|
|Author|Pascal Collin|
|License|[[BSD open source license|License]]|
***/
//{{{
config.commands.fields.handlePopup=function(b,f){var g=store.fetchTiddler(f);if(!g){return}var d={};store.forEachField(g,function(k,m,l){d[m]=l},true);var e=[];for(var i in d){var c="<<untiddledCall editFieldDialog "+escape(f)+" "+escape(i)+">>";var j="<<untiddledCall deleteField "+escape(f)+" "+escape(i)+">>";var a="<<untiddledCall renameField "+escape(f)+" "+escape(i)+">>";e.push({field:i,value:d[i],actions:c+a+j})}e.sort(function(l,k){return l.field<k.field?-1:(l.field==k.field?0:+1)});var h="<<untiddledCall createField "+escape(f)+">>";e.push({field:"",value:"",actions:h});if(e.length>0){ListView.create(b,e,this.listViewTemplate)}else{createTiddlyElement(b,"div",null,null,this.emptyText)}};config.commands.fields.listViewTemplate={columns:[{name:"Field",field:"field",title:"Field",type:"String"},{name:"Actions",field:"actions",title:"Actions",type:"WikiText"},{name:"Value",field:"value",title:"Value",type:"WikiText"}],rowClasses:[{className:"fieldTableRow",field:"actions"}],buttons:[]};config.macros.untiddledCall={handler:function(a,e,h,d,g){var e=h.shift();if(e){var c=config.macros[e]}var f=h.shift();if(f){var b=store.getTiddler(unescape(f))}if(c){c.handler(a,e,h,d,g,b)}}};config.macros.deleteField={handler:function(a,e,g,d,f,c){if(!readOnly&&g[0]){fieldName=unescape(g[0]);var b=createTiddlyButton(a,"delete","delete "+fieldName,this.onClickDeleteField);b.setAttribute("title",c.title);b.setAttribute("fieldName",fieldName)}},onClickDeleteField:function(){var b=this.getAttribute("title");var c=this.getAttribute("fieldName");var a=store.getTiddler(b);if(a&&c&&confirm("delete field "+c+" from "+b+" tiddler ?")){delete a.fields[c];store.saveTiddler(a.title,a.title,a.text,a.modifier,a.modified,a.tags,a.fields);story.refreshTiddler(b,"ViewTemplate",true)}return false}};config.macros.createField={handler:function(a,e,g,d,f,c){if(!readOnly){var b=createTiddlyButton(a,"create new","create a new field",this.onClickCreateField);b.setAttribute("title",c.title)}},onClickCreateField:function(){var c=this.getAttribute("title");var b=store.getTiddler(c);if(b){var d=prompt("Field name","");if(store.getValue(b,d)){window.alert("This field already exists.")}else{if(d){var a=prompt("Field value","");b.fields[d]=a;store.saveTiddler(b.title,b.title,b.text,b.modifier,b.modified,b.tags,b.fields);story.refreshTiddler(c,"ViewTemplate",true)}}}return false}};config.macros.editFieldDialog={handler:function(a,e,g,d,f,c){if(!readOnly&&g[0]){fieldName=unescape(g[0]);var b=createTiddlyButton(a,"edit","edit this field",this.onClickEditFieldDialog);b.setAttribute("title",c.title);b.setAttribute("fieldName",fieldName)}},onClickEditFieldDialog:function(){var e=this.getAttribute("title");var c=store.getTiddler(e);var f=this.getAttribute("fieldName");if(c&&f){var d=c.fields[f];d=d?d:"";var a=d.match(/\n/mg);a=a?true:false;if(!a||confirm("This field contains more than one line. Only the first line will be kept if you edit it here. Proceed ?")){var b=prompt("Field value",d);c.fields[f]=b;store.saveTiddler(c.title,c.title,c.text,c.modifier,c.modified,c.tags,c.fields);story.refreshTiddler(e,"ViewTemplate",true)}}return false}};config.macros.renameField={handler:function(a,e,g,d,f,c){if(!readOnly&&g[0]){fieldName=unescape(g[0]);var b=createTiddlyButton(a,"rename","rename "+fieldName,this.onClickRenameField);b.setAttribute("title",c.title);b.setAttribute("fieldName",fieldName)}},onClickRenameField:function(){var c=this.getAttribute("title");var d=this.getAttribute("fieldName");var b=store.getTiddler(c);if(b&&d){var a=prompt("Rename "+d+" as ?",d);if(a){b.fields[a]=b.fields[d];delete b.fields[d];store.saveTiddler(b.title,b.title,b.text,b.modifier,b.modified,b.tags,b.fields);story.refreshTiddler(c,"ViewTemplate",true)}}return false}};config.shadowTiddlers.StyleSheetFieldsEditor="/*{{{*/\n";config.shadowTiddlers.StyleSheetFieldsEditor+=".fieldTableRow td {padding : 1px 3px}\n";config.shadowTiddlers.StyleSheetFieldsEditor+=".fieldTableRow .button {border:0; padding : 0 0.2em}\n";config.shadowTiddlers.StyleSheetFieldsEditor+="/*}}}*/";store.addNotification("StyleSheetFieldsEditor",refreshStyles);
//}}}
/***
|Name|FileDropPlugin|
|Source|http://www.TiddlyTools.com/#FileDropPlugin|
|Version|2.0.0|
|Author|BradleyMeck and Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|FireFox or mozilla-compatible browser|
|Overrides||
|Options|##Configuration|
|Description|drag-and-drop files/directories to create tiddlers|
This plugin registers window event handlers for 'dragdrop' (FireFox 3.1-) and 'drop' (FireFox3.5+) events to automatically create tiddlers from files that are dragged and dropped into an open TiddlyWiki document.  It supports extended handling for multiple files and/or directories, as well as optional handling for embedding binary files if [[AttachFilePlugin]], [[AttachFilePluginFormatters]] and [[AttachFileMIMETypes]] are installed.
!!!!!Configuration
<<<
<<option chkFileDropTrimFilename>> Omit file extensions from tiddler titles when creating new tiddlers
&nbsp;&nbsp;{{{usage: <<option chkFileDropTrimFilename>> }}}
<<option chkFileDropDisplay>> Automatically display newly created tiddlers
&nbsp;&nbsp;{{{usage: <<option chkFileDropDisplay>> }}}
Tag newly created tiddlers with: <<option txtFileDropTags>>
&nbsp;&nbsp;{{{usage: <<option txtFileDropTags>>}}}

__FileDrop+AttachFile configuration options:__
<<option chkFileDropAttachLocalLink>> Include reference to local path/filename
&nbsp;&nbsp;{{{usage: <<option chkFileDropAttachLocalLink>> }}}
<<option chkFileDropAttachEncodeData>> Include binary file data as encoded "base64" text
&nbsp;&nbsp;{{{usage: <<option chkFileDropAttachEncodeData>> }}}
...only if file is smaller than: <<option txtFileDropAttachDataLimit>> bytes
&nbsp;&nbsp;{{{usage: <<option txtFileDropAttachDataLimit>>}}}

//Note: if the plugin does not seem to work, open up the page 'about:config' (just type it in the address bar) and make sure ''signed.applets.codebase_principal_support'' is set to ''true''//
<<<
!!!!!Examples (custom handler functions)
<<<
Adds a single file with confirmation and prompting for title:
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
	function(nsiFile) {
		var msg='You have dropped the file:\n'
			+nsiFile.path+'\n'
			+'onto the page, it will be imported as a tiddler. Is that ok?'
		if(confirm(msg)) {
			var newDate = new Date();
			var title = prompt('what would you like to name the tiddler?');
			store.saveTiddler(title,title,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
		}
		return true;
	});
}}}
Adds a single file without confirmation, using path/filename as tiddler title
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
	function(nsiFile) {
		var newDate = new Date();
		store.saveTiddler(nsiFile.path,nsiFile.path,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
		story.displayTiddler(null,nsiFile.path)
		return true;
	});
}}}
<<<
!!!!!Revisions
<<<
2009.08.19 2.0.0 ELS fixed event listener registration for FireFox 3.5+.  Also, merged with FileDropPluginConfig, with code cleanup/reduction.
2008.08.11 1.5.1 added chkFileDropAttachLocalLink option to allow suppression of local path/file link
2007.01.01 0.9.9 extensions for AttachFilePlugin
2006.11.04 0.1.1 initial release by Bradley Meck
Old revision notes:
*Note: this version has been 'tweaked' by Eric Shulman (http://www.TiddlyTools.com) to add suspend/resume notification handling to improve performance when multiple files are dropped at once.
*Multiple File Dropping API updated, to end all capturing events after yours return a value that makes if(myFunctionsReturnValue) evaluate to true
*Added support for multiple file drop handlers
**Use the config.macros.fileDrop.addEventListener(@@color(green):String Flavor@@, @@color(green):Function handler(nsiFile){}@@, @@color(green):Boolean addToFront@@) function
***Standard Flavor is 'application/x-moz-file'
***addToFront gives your handler priority over all others at time of add
*Old plugin would disallow drops of text between applications because it didn't check if the transfer was a file.
<<<
!!!!!Code
***/
//{{{
version.extensions.FileDropPlugin={major:2, minor:0, revision:0, date: new Date(2009,8,19)};

config.macros.fileDrop = {
	customDropHandlers: [],
	addEventListener: function(paramflavor,func,inFront) {
		var obj={}; obj.flavor=paramflavor; obj.handler=func;
		if (!inFront) this.customDropHandlers.push(obj);
		else this.customDropHandlers.shift(obj);
	},
	dragDropHandler: function(evt) {
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var dragService = Components.classes['@mozilla.org/widget/dragservice;1'].getService(Components.interfaces.nsIDragService);
		var dragSession = dragService.getCurrentSession();
		var transferObject = Components.classes['@mozilla.org/widget/transferable;1'].createInstance();
		transferObject = transferObject.QueryInterface(Components.interfaces.nsITransferable);
		transferObject.addDataFlavor('application/x-moz-file');
		var numItems = dragSession.numDropItems;
		if (numItems>1) {
			clearMessage();
			displayMessage('Reading '+numItems+' files...');
			store.suspendNotifications();
		}
		for (var i = 0; i < numItems; i++) {
			dragSession.getData(transferObject, i);
			var dataObj = {};
			var dropSizeObj = {};
			for(var ind=0; ind<config.macros.fileDrop.customDropHandlers.length; ind++) {
				var item = config.macros.fileDrop.customDropHandlers[ind];
				if(dragSession.isDataFlavorSupported(item.flavor)) {
					transferObject.getTransferData(item.flavor, dataObj, dropSizeObj);
					var droppedFile = dataObj.value.QueryInterface(Components.interfaces.nsIFile);
					var result = item.handler.call(item,droppedFile);
					evt.stopPropagation();
					evt.preventDefault();
					if (result) break;
				}
			}
		}
		if (numItems>1) {
			store.resumeNotifications();
			store.notifyAll();
			displayMessage(numItems+' files have been processed');
		}
	}
}
//}}}
/***
!!!!!window event handlers
***/
//{{{
if(!window.event) {
	window.addEventListener('dragdrop', config.macros.fileDrop.dragDropHandler, true); // FireFox3.1-
	window.addEventListener('drop', config.macros.fileDrop.dragDropHandler, true); // FireFox3.5+
}
//}}}
/***
!!!!!handler for files, directories and binary attachments (see [[AttachFilePlugin]])
<<<
* use just filename instead of whole path as tiddler title
* check for existing tiddler and prompt for new name
* handle folder drops (drops each file or creates a file list in a tiddler)
* use AttachFilePlugin if MIME type is not text/plain
* autotag created tiddlers (e.g., "temporary", "dropped", etc.)
* option to suppress automatic display of newly created tiddlers
* suspend/resume notifications when handling multiple files (performance improvement)
<<<
***/
//{{{
if (config.options.chkFileDropAttachEncodeData===undefined)
	config.options.chkFileDropAttachEncodeData=true;
if (config.options.chkFileDropAttachLocalLink===undefined)
	config.options.chkFileDropAttachLocalLink=true;
if (config.options.txtFileDropAttachDataLimit===undefined)
	config.options.txtFileDropAttachDataLimit=32768;
if (config.options.txtFileDropTags===undefined)
	config.options.txtFileDropTags="";
if (config.options.chkFileDropDisplay===undefined)
	config.options.chkFileDropDisplay=true;
if (config.options.chkFileDropTrimFilename===undefined)
	config.options.chkFileDropTrimFilename=false;

config.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile) {

	var header="Index of %0\n^^(as of %1)^^\n|!filename| !size | !modified |\n";
	var item="|[[%0|%1]]| %2|%3|\n";
	var footer="Total of %0 bytes in %1 files\n";

	var now=new Date();
	var files=[nsiFile];
	if (nsiFile.isDirectory()) {
		var folder=nsiFile.directoryEntries;
		var files=[];
		while (folder.hasMoreElements()) {
			var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
			if (f instanceof Components.interfaces.nsILocalFile && !f.isDirectory()) files.push(f);
		}
		var msg=nsiFile.path.replace(/\\/g,"/")+"\n\n";
		msg+="contains "+files.length+" files... ";
		msg+="select OK to attach all files or CANCEL to create a list...";
		if (!confirm(msg)) { // create a list in a tiddler
			var title=nsiFile.leafName; // tiddler name is last directory name in path
			while (title && title.length && store.tiddlerExists(title)) {
				if (confirm(config.messages.overwriteWarning.format([title]))) break; // use existing title
				title=prompt("Please enter a different tiddler title for this file",nsiFile.path.replace(/\\/g,"/"));
			}
			if (!title || !title.length) return true; // aborted by user... we're done!
			var text=header.format([nsiFile.path.replace(/\\/g,"/"),now.toLocaleString()]);
			var total=0;
			for (var i=0; i<files.length; i++) { var f=files[i];
				var name=f.leafName;
				if (config.options.chkFileDropTrimFilename)
					{ var p=name.split("."); if (p.length>1) p.pop(); name=p.join("."); }
				var path="file:///"+f.path.replace(/\\/g,"/");
				var size=f.fileSize; total+=size;
				var when=new Date(f.lastModifiedTime).formatString("YYYY.0MM.0DD 0hh:0mm:0ss");
				text+=item.format([name,path,size,when]);
			}
			text+=footer.format([total,files.length]);
			var newtags=config.options.txtFileDropTags?config.options.txtFileDropTags.readBracketedList():[];
			store.saveTiddler(null,title,text,config.options.txtUserName,now,newtags);
			if (config.options.chkFileDropDisplay) story.displayTiddler(null,title);
			return true;
		}
	}
	if (files.length>1) store.suspendNotifications();
	for (i=0; i<files.length; i++) {
		var file=files[i];
		if (file.isDirectory()) continue; // skip over nested directories
		var type="text/plain";
		var title=file.leafName; // tiddler name is file name
		if (config.options.chkFileDropTrimFilename)
			{ var p=title.split("."); if (p.length>1) p.pop(); title=p.join("."); }
		var path=file.path;
		var size=file.fileSize;
		while (title && title.length && store.tiddlerExists(title)) {
			if (confirm(config.messages.overwriteWarning.format([title]))) break; // use existing title
			title=prompt("Please enter a different tiddler title for this file",path.replace(/\\/g,"/"));
		}
		if (!title || !title.length) continue; // cancelled by user... skip this file
		if (config.macros.attach) {
			type=config.macros.attach.getMIMEType(file.leafName,"");
			if (!type.length)
				type=prompt("Unrecognized file type.  Please enter a MIME type for this file","text/plain");
			if (!type||!type.length) continue; // cancelled by user... skip this file
		}
		var newtags=config.options.txtFileDropTags?config.options.txtFileDropTags.readBracketedList():[];
		if (type=="text/plain")
			store.saveTiddler(null,title,loadFile(path),config.options.txtUserName,now,newtags);
		else {
			// only encode data if enabled and file is smaller than limit.  Default is 32768 (32K) bytes.
			var embed=config.options.chkFileDropAttachEncodeData
				&& file.fileSize<config.options.txtFileDropAttachDataLimit;
			newtags.push("attachment"); newtags.push("excludeMissing");
			var localfile="";
			if (config.options.chkFileDropAttachLocalLink) {
				// if file is in current document folder,
				// remove path prefix and use relative reference
				var localfile=path;
				var h=document.location.href;
				folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
				if (localfile.substr(0,folder.length)==folder)
					localfile='./'+localfile.substr(folder.length);
			}
			config.macros.attach.createAttachmentTiddler(path,
				now.formatString(config.macros.timeline.dateFormat),
				"attached by FileDropPlugin", newtags,
				title, embed, config.options.chkFileDropAttachLocalLink, false,
				localfile, "", type,!config.options.chkFileDropDisplay);
		}
		if (config.options.chkFileDropDisplay) story.displayTiddler(null,title);
	}
	if (files.length>1) { store.resumeNotifications(); store.notifyAll(); }
	return true;
})
//}}}
<html><div align="center"><iframe src="http://voicethread.com/share/612383/" frameborder="0" width="100%" height="600"></iframe></div></html>
/***
|''Name''|FiveStarsPlugin|
|''Description''|Five stars rating system for tiddlywiki|
|''Icon''|<...>|
|''Author''|Jelly Chen|
|''Contributors''|<...>|
|''Version''|0.1.8|
|''Date''|Sep 10 2009|
|''Status''|stable|
|''Source''|http://sinojellyempty.TiddlySpot.com/#FiveStarsPlugin|
|''CodeRepository''|<...>|
|''Copyright''|Guodong Workshop. 2009-2019. All rights reserved.|
|''License''|GPL v2|
|''CoreVersion''|2.1.0|
|''Requires''|<...>|
|''Overrides''|<...>|
|''Feedback''|sinojelly@163.com|
|''Documentation''|http://sinojelly.blog.51cto.com/479153/197110|
|''Keywords''|FiveStars, vote, rating|
!Description
Five stars rating system for tiddlywiki, the rating info associate with one tiddler are stored in the tiddler's extended fields. 
!Notes
Thanks to FND for answering my question in Google TiddlyWikiDev Group.
Thanks to BramChen for providing many valuable improvements.
Save the files star1.png, star2.png and empty.html in the same directory.
You can find the files star1.png, star2.png at:
http://sinojelly.blog.51cto.com/479153/197110
or:
http://sinojelly.20x.cc/TiddlyPedia/
!Usage
You can add macro invoke in the tiddler as follows. 
{{{
<<rating>>
}}}
Also, if you want to add fivestar to every tiddlers, you should modify ViewTemplate as follows:
modify:
{{{
<div class='viewer' macro='view text wikified'></div>
}}}
to:
{{{
<div class='viewer' macro='view text wikified'><span macro="rating"></span><br/></div>
}}}
!!Parameters
None
!!Examples
<<rating>>
!Configuration Options
None
!Search Rating
''Search rating: ''<html><input id="i_1" type="text" size=6/><a id="a_1" class="button" href="javascript:;";>go</a></html>
{{r_1{<br />}}}
<<tiddler - with:{{
function search_rating(n) {
	var titles=[];
	store.forEachTiddler(function(title, tiddler){
	if (tiddler.fields["rating"] == n.toString())
		titles.push(tiddler.title);});
	return titles;
}

(function($){
	$("#a_1").click(function(){
		var input=$("#i_1")[0].value,
			titles=search_rating(input),
			li=(titles.length==0) ? "* Not found." : "#[[" + titles.join("]]\n#[[")+"]]",
			r=$("#tiddler"+tiddler.title).find(".r_1")
		;
		r.text(" ");
		wikify(li,r[0]);
	})
})(jQuery);
}}>>
!Search Rating Notes
Thanks to BramChen for providing scenario and code.
You can use Search Rating in other tiddlers as this:
{{{
<<tiddler [[FiveStarsPlugin##Search Rating]]>>
}}}
!Revision History
!!v0.0.1 (2009-08-27)  Client OK.
* View fivestar ok.
* Can be clicked to vote, but not any rating info stored.
!!v0.1.0 (2009-09-01)  Write rating info tiddler OK.
* Rating info store in *_fivestar_rating tiddler.
!!v0.1.1 (2009-09-02)  Fixed bugs of vote and stars.
* Support voting more than one tiddler insight.
!!v0.1.2 (2009-09-02)  Record voting info in tiddler's extended fields.
* Record voting info in tiddler's extended fields.
* Load the rating info while displying a tiddler and display the rating info as "(Rated 4 with 176 votes)".
!!v0.1.3 (2009-09-03)  Picture URL.
* Record the last rating as average.
* Use URL to specify  pictures .
!!v0.1.4 (2009-09-06)  Make the simplest version for persional using.
* Only record the last rating info.
!!v0.1.5 (2009-09-06)  Not lose highlight if the stars have been highlighted.
* Not lose highlight if the stars have been highlighted.
!!v0.1.6 (2009-09-10)  Support search the specified rating tiddler.
* You can search the specified rating tiddler.
!!v0.1.7 (2009-09-10)  Support search rating in other tiddlers.
* Support search rating in other tiddlers.
!!v0.1.8 (2009-09-10)  Include pictures data in this tiddler.
* Include pictures(star1.png, star2.png) data in this tiddler.
!To Do for Server Side Using
# Can not vote WelcomeToTiddlyspot and GettingStarted.
# Using lock to support more than one user at the same time to vote the same tiddler.
# Get the real IP address.
# Auto save and upload rating info after voting.
# How to get all the tiddlers with the same rating?
# Bug: The stars become unhighlighted after voting.(if alert a message box such as alert(n), no problem. Message box avoid mouse rollover the stars.)
# Make others can vote the tiddlers, not only the owner can.
/%# ęÆ”č¾ƒå„‡ę€Ŗļ¼šęÆę¬”ęˆ‘äæ®ę”¹čæ™äøŖTiddler之后ļ¼Œäæå­˜åˆ·ę–°ļ¼Œē„¶åŽęœē“¢ratingļ¼Œåˆ™ęœē“¢äøå‡ŗ任何äøœč„æ怂åæ…锻关闭FireFoxļ¼Œå†é‡ę–°ę‰“å¼€čÆ„ę–‡ä»¶ļ¼Œę‰čƒ½ę­£åøøä½æē”Ø怂%/
You're welcome to make these ToDo's implemented.
!Code
***/
//{{{
//var set=false;
var init_highlightnum = 0;
var v=0;  
var RatingLevel = new Array("poor", "below average", "average", "above average", "excellent", "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp");
function loadStars()
{
	star1 = new Image();
	star1.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gJGxQpCZ4Equ4AAASsSURBVDjLlZVdiF1XFcd/a+9z7p2vOy8d0zY6TSWaxii0NlXQttJqHzSKiFhpoab6oogW+yBFUXxQKCj4Uaoogk+KKRWlfkAfhIIKpgZtTam2xKTJpM183Zl7Z+7H+dp7r+XDnQljlQY3nKdz9m+vs/b//1/y6A9+xGsvgVgi4jDfdmAGGNjkrfNsXjjN6rnTLC/9g5VX+vS64K5IFUc2fvmwqzYWEe+AjL37RP7nxiuAxSRW2UJ46dFr5prPqakBU3vhFsPOT/wfYEMgFAfuvOe+O254y/4PpBBfB8wAOYigiXqwgabwX5W/FtgZxkzcfFdnoZO9/s1HDmfN8LAhU8A0kJmpXLEVJk5M3G4PM8Cban5wsfXJvJ3RzlNrNq2+3/BTwNxOS1q7305u+VVgE6HV9M2PuxqjxpgkBfVBi8H1B48ceqc4odXOOHBNflcMYTaqWFQhqNdoLkaVBOSC5LvgDHFkxdqhg/v9J9qzHd/f7NcIvgmpmW6Pb77q2ps7qOC845Y777qx/7unvmj59Ip3EsQ0+FllebQ93tLweNT0ihk5EDMDLIWWrT17/B33fvo6P51hCTBDEPKWhzSpYn4+yz78sffei05k5hDGvXWeePEPTzd1/VtNoW1GwEiZmPo0t/j8maZzrHPybz+88dZbbp+eb4MKqEGy3UtARGi125NuhobTv3xY//hPTpzdnHpkXK6OY1NPx0A0A3/sgx8SwVrqp7cvbuRPvvTXU3Ld4huOtqcyL8jkGtQmWrUIqaIe9PjN9x5c//0L899fqeYeG2+vV4PechwOxsVoSNXUJAcooA71eTsPW3Nv/c7PHz/1wOr55QIADeBbmG+Dnya5OX72rS+debr39m+OmP3TaGMp29q42IyG/XFVUseAArYrtwRUYKV3FmN74eTm8tIANwMuBwtgEVMFhUGcXy9jurC9dt563YtbW73u9mioo6qkSZEkAg4RMFXTkExjpaab7WbjbW86esfVWDU5NTosCYLgnLA4s3ZD2VvpjEf9wWiwVYwGVhRj6rok7qgXF4sBoRoSq7GFYjvW40Fzdae5rd02QZWyEH78lc8+c+Lr959vwkQpxx76xUIe1g9WdVVUFaEoCNWYlAKKTdydlYMuIoJpshBqTUFm3vP5j9wNiVM/fbB88qR/YtMf+nXT7c1f+sI9xx/49mO3tTOR/bOjm85dan6lisYA4VVZ5NbO/Z3Vs8+ydv456b581qqVZ45a0V1YXloZnXgq/+py3fnJYO3Mdr+79K+/XPRfe+hTH/3uxqULev+XH3kfqZxPiYQhtpPQu4/cfeu1O0c4KcYDu/4qd3zfTPj4i/19D0dxg1Buz5bFoK7K0IAk8y7tm3PvvumAfObPZ5pvXFrldDlkVDUUXLYSyO1vZG9mu8xLx8TnGFNImg2NxaqkrGsCQCunJRnWypkLDWk8YlgXDBulsb3gI3P/mXaqiPdMZZ4pA0mR2NSElIgA3pPlLVpqGIbEhhASjUK4PK+ATHWHKNDUaIg4geDcBGSGqk1MBJCUGANBJrYkGao73txbYXY5p2UiEwNVCFHZNTQGJpenCilBUptEvOydrHvWvwGT9K2B/6ho5wAAAABJRU5ErkJggg==";
	star2 = new Image();
	star2.src= "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6AAAdTAAAOpgAAA6lwAAF2+XqZnUAAAF30lEQVR4nGKcPHUGA37AyMDw5zsDIyMTw39mdiYGhv//gYL/wQgky8TM8PbBRYYXdy8yPHt4leH5k/cM714zMAAEEBNBU4EGsnx9rMH0440sAyMzSD0LECP0MTJi1QgQQAQMZvzP+OcHi8jve5N5/71K/vf/H8iZHMiG///zG+oJVAAQQCz4jP0PcvDvb/JqKgw2b779YHr99Y8oEysTyJR/QEv/Mvz7w/Dz8zuGf39/Y7gcIIDwuRhown8Gzt9vLOQ1uDgkJf4Ysvz6rAG0DORiTpCj/v//x4grKAACCG7wf0YmoL+ZYGEIwsz///1jFWF/HconysUgIvBXkPvvC4//DMwgg3mgQcIGU8sAjmUEAAggSDgBbWX79f4/89fX//78AaK/jH9//2P+/e/bJwUJwW/mjCysDELCXAzCbB9s/vz+zf3nH+N/IGYAqvn35z8TUAswWBgYWIHOZ4UZDBBALOBY//ZSjZ/huS8TG9vfX3/eAcUYmf8xMP3lYHxvpKjMLsHwhxHoTjYGNZn3hp/uX837z8b1jPH/v1/AwP3FyPL73xfOjwwf/v1e9eff3yfAeAQZ/gcggFjAifLvbzYBxoe5poac8hzivAx/f/wDxvZ/BhZg6uLm52Vg+AmKLkYGDS1+LmmJ9/H/fr9nYAI6iBWYhl88fsNw6OXnE79+/twMjER2oMG/gVHzFyCAWIA2M//lkb1y9xev95+L19pNjX/4iqsLAe0EhtJPYOT//A9OAwx/QUmalYFPRAiSAj69Z7hw7u6/wzdYl995yzHx6/cXX//8+skJTH1/QKkPIIBYwEHM8Jf9Lxv//ds/jbNf77952/Txy1QNA35eFhZg3PwDxsufP0CDgUnqN9Dpf78wvH/6gmH/sZevzryQm/eZgXvbt0/P/3z7/Iblx4+/f3//Zvj7D+hhgABigaRJhn9MDP/YmNhZf39i05tw4N7jW9+/32o1tRERZvh+l4Hh602G/7//AFPuP4ZvH74xrNvDd+vmL6OZPxh+3Pjy5iHLpw8vfn35/P7rj+8MP4EuBpn3HyCAYBkEFKs/gHwmZiZgZmMXOf7tx/1PDF8uCjN8ugC0Fij9mwUY7iwM/34zMnz6w/fq+5+/Dz69vP//w7tnH758/vjx29f/X4AG//r7BxhowJACCCAmcHgBE+z/f7///v/35weQ8Zb91xsdeeGnsgw/roBt/f6RneH3N1ZgBmdh4OZgZpDleqn+/d1z3q9f3n/68unDty+f/n/79pXh58/vDH+gqZcBIIBY/nz7BIzEf6D8DsxIf4FJmPWvEMMbEwmB2ywMf34y3LzMzrDvstQ5PvZvgq56nxTFRNkYtKT+Ce+9+Ur5x88fl378ANr5jeH3r+/AsP0DNIgRErcAAcTy/dNrIIMR6Oi//3///glMMYxc0nI3zNgYPzIcPsDxbd91xY1vmeU2/nr9ju/py9tx/ia/bRRFmJmkuL8Y3H36ax0wov6ByqHfaGURQACxvLx7AcICpqa//5n/c/3/bMzMc9V6ww6O+4fvyU/5xsR98efnW6zfv399efIPc93jd798g/V/ZqmKMBoevv6d7+9fhreg0uo/vISGAIAAYnn24DI0czMxfPv6iUFBmEnxwNffW2+852/7w/j20+/v97i/f/v088f3379AJdqbN0zTXrxhuqAv9z+dlfEf169fDMAMB/QwWiEEEECMtopIHEYGJhZmRt7/jMysQOs5gOZw//71/w8wtr///AnMUaBSh5WBjRGYQIA0D9Cqv1+/MHz++Y3h869/DL/+Q1IXGAAEoJpKTgAAYVigtbj/muJPpGhRoz8XyB2t5WfiPppIZJUXmXM+PBQmLd/G4QJNBmsb/UYQAzPWA/xEHwHE8g/KZQLGJNCAf8B8AGL+BoYM2CCg6UC7IJkInOD/AfPhb4bfQN+Bi8m/IHmgHFoQMwAEEAu8nIYmE1DJAFQIcgVYJ6hc/Q/O9hAA8u5fkPn/IUU8IwNSzYoEAAIMAOfvwBcmnMG+AAAAAElFTkSuQmCC";
}
function highlight(id)
{
	//if (set==false)
	{
		var s=id.split("_star_");
		y=s[1]*1+1;
		for (i=1;i<y;i++)
		{
			document.getElementById(s[0]+'_star_'+i.toString()).src= star2.src;
		}
		document.getElementById(s[0]+'_vote').innerHTML=RatingLevel[s[1] - 1];
   }
}
function losehighlight(id)
{
	//if (set==false)
	{
		var s=id.split("_star_");
		for (i=1 + init_highlightnum;i<6;i++) // 已高äŗ®ēš„äøå˜ęš— 
		{
			document.getElementById(s[0]+'_star_'+i.toString()).src=star1.src;
			document.getElementById(s[0]+'_vote').innerHTML=RatingLevel[5];//""
		}
	}
}
function setStar(id)
{
	var s=id.split("_star_");
	y = s[1] * 1 + 1;
	for (i=1;i<y;i++) 
	{
		document.getElementById(s[0]+'_star_'+i.toString()).src= star2.src;
	}
}
function saveStar(id)
{
    var s=id.split("_star_");
    var title = s[0],
        n=s[1];
    setStar(id);

    document.getElementById(title+'_vote').innerHTML="Thank you for your vote!";

    var tiddler = store.getTiddler(title);
    tiddler.fields["rating"] = n;
}
config.macros.rating = { 
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
                star1_data=store.getTiddlerText("star1.png##data");
                star2_data=store.getTiddlerText("star2.png##data");
		loadStars();
                highlightnum = parseInt((tiddler.fields["rating"] || 0));
                init_highlightnum = highlightnum;
		var starsHtml='<html>',
                // ä½æē”Øē½‘ē»œč·Æ径
			star='<img src= "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gJGxQpCZ4Equ4AAASsSURBVDjLlZVdiF1XFcd/a+9z7p2vOy8d0zY6TSWaxii0NlXQttJqHzSKiFhpoab6oogW+yBFUXxQKCj4Uaoogk+KKRWlfkAfhIIKpgZtTam2xKTJpM183Zl7Z+7H+dp7r+XDnQljlQY3nKdz9m+vs/b//1/y6A9+xGsvgVgi4jDfdmAGGNjkrfNsXjjN6rnTLC/9g5VX+vS64K5IFUc2fvmwqzYWEe+AjL37RP7nxiuAxSRW2UJ46dFr5prPqakBU3vhFsPOT/wfYEMgFAfuvOe+O254y/4PpBBfB8wAOYigiXqwgabwX5W/FtgZxkzcfFdnoZO9/s1HDmfN8LAhU8A0kJmpXLEVJk5M3G4PM8Cban5wsfXJvJ3RzlNrNq2+3/BTwNxOS1q7305u+VVgE6HV9M2PuxqjxpgkBfVBi8H1B48ceqc4odXOOHBNflcMYTaqWFQhqNdoLkaVBOSC5LvgDHFkxdqhg/v9J9qzHd/f7NcIvgmpmW6Pb77q2ps7qOC845Y777qx/7unvmj59Ip3EsQ0+FllebQ93tLweNT0ihk5EDMDLIWWrT17/B33fvo6P51hCTBDEPKWhzSpYn4+yz78sffei05k5hDGvXWeePEPTzd1/VtNoW1GwEiZmPo0t/j8maZzrHPybz+88dZbbp+eb4MKqEGy3UtARGi125NuhobTv3xY//hPTpzdnHpkXK6OY1NPx0A0A3/sgx8SwVrqp7cvbuRPvvTXU3Ld4huOtqcyL8jkGtQmWrUIqaIe9PjN9x5c//0L899fqeYeG2+vV4PechwOxsVoSNXUJAcooA71eTsPW3Nv/c7PHz/1wOr55QIADeBbmG+Dnya5OX72rS+debr39m+OmP3TaGMp29q42IyG/XFVUseAArYrtwRUYKV3FmN74eTm8tIANwMuBwtgEVMFhUGcXy9jurC9dt563YtbW73u9mioo6qkSZEkAg4RMFXTkExjpaab7WbjbW86esfVWDU5NTosCYLgnLA4s3ZD2VvpjEf9wWiwVYwGVhRj6rok7qgXF4sBoRoSq7GFYjvW40Fzdae5rd02QZWyEH78lc8+c+Lr959vwkQpxx76xUIe1g9WdVVUFaEoCNWYlAKKTdydlYMuIoJpshBqTUFm3vP5j9wNiVM/fbB88qR/YtMf+nXT7c1f+sI9xx/49mO3tTOR/bOjm85dan6lisYA4VVZ5NbO/Z3Vs8+ydv456b581qqVZ45a0V1YXloZnXgq/+py3fnJYO3Mdr+79K+/XPRfe+hTH/3uxqULev+XH3kfqZxPiYQhtpPQu4/cfeu1O0c4KcYDu/4qd3zfTPj4i/19D0dxg1Buz5bFoK7K0IAk8y7tm3PvvumAfObPZ5pvXFrldDlkVDUUXLYSyO1vZG9mu8xLx8TnGFNImg2NxaqkrGsCQCunJRnWypkLDWk8YlgXDBulsb3gI3P/mXaqiPdMZZ4pA0mR2NSElIgA3pPlLVpqGIbEhhASjUK4PK+ATHWHKNDUaIg4geDcBGSGqk1MBJCUGANBJrYkGao73txbYXY5p2UiEwNVCFHZNTQGJpenCilBUptEvOydrHvWvwGT9K2B/6ho5wAAAABJRU5ErkJggg==" onmouseover="highlight(this.id)" onclick="setStar(this.id)" onmouseout="losehighlight(this.id)" onmouseup="saveStar(id,title)" id="%id%"  title='+tiddler.title+' style="width:30px; height:30px; float:left;" />';
		for (var i=1; i<6; i++)
		{                     
                        if (i <= highlightnum)
                        {
                            starsHtml += star.replace("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gJGxQpCZ4Equ4AAASsSURBVDjLlZVdiF1XFcd/a+9z7p2vOy8d0zY6TSWaxii0NlXQttJqHzSKiFhpoab6oogW+yBFUXxQKCj4Uaoogk+KKRWlfkAfhIIKpgZtTam2xKTJpM183Zl7Z+7H+dp7r+XDnQljlQY3nKdz9m+vs/b//1/y6A9+xGsvgVgi4jDfdmAGGNjkrfNsXjjN6rnTLC/9g5VX+vS64K5IFUc2fvmwqzYWEe+AjL37RP7nxiuAxSRW2UJ46dFr5prPqakBU3vhFsPOT/wfYEMgFAfuvOe+O254y/4PpBBfB8wAOYigiXqwgabwX5W/FtgZxkzcfFdnoZO9/s1HDmfN8LAhU8A0kJmpXLEVJk5M3G4PM8Cban5wsfXJvJ3RzlNrNq2+3/BTwNxOS1q7305u+VVgE6HV9M2PuxqjxpgkBfVBi8H1B48ceqc4odXOOHBNflcMYTaqWFQhqNdoLkaVBOSC5LvgDHFkxdqhg/v9J9qzHd/f7NcIvgmpmW6Pb77q2ps7qOC845Y777qx/7unvmj59Ip3EsQ0+FllebQ93tLweNT0ihk5EDMDLIWWrT17/B33fvo6P51hCTBDEPKWhzSpYn4+yz78sffei05k5hDGvXWeePEPTzd1/VtNoW1GwEiZmPo0t/j8maZzrHPybz+88dZbbp+eb4MKqEGy3UtARGi125NuhobTv3xY//hPTpzdnHpkXK6OY1NPx0A0A3/sgx8SwVrqp7cvbuRPvvTXU3Ld4huOtqcyL8jkGtQmWrUIqaIe9PjN9x5c//0L899fqeYeG2+vV4PechwOxsVoSNXUJAcooA71eTsPW3Nv/c7PHz/1wOr55QIADeBbmG+Dnya5OX72rS+debr39m+OmP3TaGMp29q42IyG/XFVUseAArYrtwRUYKV3FmN74eTm8tIANwMuBwtgEVMFhUGcXy9jurC9dt563YtbW73u9mioo6qkSZEkAg4RMFXTkExjpaab7WbjbW86esfVWDU5NTosCYLgnLA4s3ZD2VvpjEf9wWiwVYwGVhRj6rok7qgXF4sBoRoSq7GFYjvW40Fzdae5rd02QZWyEH78lc8+c+Lr959vwkQpxx76xUIe1g9WdVVUFaEoCNWYlAKKTdydlYMuIoJpshBqTUFm3vP5j9wNiVM/fbB88qR/YtMf+nXT7c1f+sI9xx/49mO3tTOR/bOjm85dan6lisYA4VVZ5NbO/Z3Vs8+ydv456b581qqVZ45a0V1YXloZnXgq/+py3fnJYO3Mdr+79K+/XPRfe+hTH/3uxqULev+XH3kfqZxPiYQhtpPQu4/cfeu1O0c4KcYDu/4qd3zfTPj4i/19D0dxg1Buz5bFoK7K0IAk8y7tm3PvvumAfObPZ5pvXFrldDlkVDUUXLYSyO1vZG9mu8xLx8TnGFNImg2NxaqkrGsCQCunJRnWypkLDWk8YlgXDBulsb3gI3P/mXaqiPdMZZ4pA0mR2NSElIgA3pPlLVpqGIbEhhASjUK4PK+ATHWHKNDUaIg4geDcBGSGqk1MBJCUGANBJrYkGao73txbYXY5p2UiEwNVCFHZNTQGJpenCilBUptEvOydrHvWvwGT9K2B/6ho5wAAAABJRU5ErkJggg==", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6AAAdTAAAOpgAAA6lwAAF2+XqZnUAAAF30lEQVR4nGKcPHUGA37AyMDw5zsDIyMTw39mdiYGhv//gYL/wQgky8TM8PbBRYYXdy8yPHt4leH5k/cM714zMAAEEBNBU4EGsnx9rMH0440sAyMzSD0LECP0MTJi1QgQQAQMZvzP+OcHi8jve5N5/71K/vf/H8iZHMiG///zG+oJVAAQQCz4jP0PcvDvb/JqKgw2b779YHr99Y8oEysTyJR/QEv/Mvz7w/Dz8zuGf39/Y7gcIIDwuRhown8Gzt9vLOQ1uDgkJf4Ysvz6rAG0DORiTpCj/v//x4grKAACCG7wf0YmoL+ZYGEIwsz///1jFWF/HconysUgIvBXkPvvC4//DMwgg3mgQcIGU8sAjmUEAAggSDgBbWX79f4/89fX//78AaK/jH9//2P+/e/bJwUJwW/mjCysDELCXAzCbB9s/vz+zf3nH+N/IGYAqvn35z8TUAswWBgYWIHOZ4UZDBBALOBY//ZSjZ/huS8TG9vfX3/eAcUYmf8xMP3lYHxvpKjMLsHwhxHoTjYGNZn3hp/uX837z8b1jPH/v1/AwP3FyPL73xfOjwwf/v1e9eff3yfAeAQZ/gcggFjAifLvbzYBxoe5poac8hzivAx/f/wDxvZ/BhZg6uLm52Vg+AmKLkYGDS1+LmmJ9/H/fr9nYAI6iBWYhl88fsNw6OXnE79+/twMjER2oMG/gVHzFyCAWIA2M//lkb1y9xev95+L19pNjX/4iqsLAe0EhtJPYOT//A9OAwx/QUmalYFPRAiSAj69Z7hw7u6/wzdYl995yzHx6/cXX//8+skJTH1/QKkPIIBYwEHM8Jf9Lxv//ds/jbNf77952/Txy1QNA35eFhZg3PwDxsufP0CDgUnqN9Dpf78wvH/6gmH/sZevzryQm/eZgXvbt0/P/3z7/Iblx4+/f3//Zvj7D+hhgABigaRJhn9MDP/YmNhZf39i05tw4N7jW9+/32o1tRERZvh+l4Hh602G/7//AFPuP4ZvH74xrNvDd+vmL6OZPxh+3Pjy5iHLpw8vfn35/P7rj+8MP4EuBpn3HyCAYBkEFKs/gHwmZiZgZmMXOf7tx/1PDF8uCjN8ugC0Fij9mwUY7iwM/34zMnz6w/fq+5+/Dz69vP//w7tnH758/vjx29f/X4AG//r7BxhowJACCCAmcHgBE+z/f7///v/35weQ8Zb91xsdeeGnsgw/roBt/f6RneH3N1ZgBmdh4OZgZpDleqn+/d1z3q9f3n/68unDty+f/n/79pXh58/vDH+gqZcBIIBY/nz7BIzEf6D8DsxIf4FJmPWvEMMbEwmB2ywMf34y3LzMzrDvstQ5PvZvgq56nxTFRNkYtKT+Ce+9+Ur5x88fl378ANr5jeH3r+/AsP0DNIgRErcAAcTy/dNrIIMR6Oi//3///glMMYxc0nI3zNgYPzIcPsDxbd91xY1vmeU2/nr9ju/py9tx/ia/bRRFmJmkuL8Y3H36ax0wov6ByqHfaGURQACxvLx7AcICpqa//5n/c/3/bMzMc9V6ww6O+4fvyU/5xsR98efnW6zfv399efIPc93jd798g/V/ZqmKMBoevv6d7+9fhreg0uo/vISGAIAAYnn24DI0czMxfPv6iUFBmEnxwNffW2+852/7w/j20+/v97i/f/v088f3379AJdqbN0zTXrxhuqAv9z+dlfEf169fDMAMB/QwWiEEEECMtopIHEYGJhZmRt7/jMysQOs5gOZw//71/w8wtr///AnMUaBSh5WBjRGYQIA0D9Cqv1+/MHz++Y3h869/DL/+Q1IXGAAEoJpKTgAAYVigtbj/muJPpGhRoz8XyB2t5WfiPppIZJUXmXM+PBQmLd/G4QJNBmsb/UYQAzPWA/xEHwHE8g/KZQLGJNCAf8B8AGL+BoYM2CCg6UC7IJkInOD/AfPhb4bfQN+Bi8m/IHmgHFoQMwAEEAu8nIYmE1DJAFQIcgVYJ6hc/Q/O9hAA8u5fkPn/IUU8IwNSzYoEAAIMAOfvwBcmnMG+AAAAAElFTkSuQmCC").replace("%id%",tiddler.title+'_star_'+i.toString());   
                        }
                        else
                        {                        
			     starsHtml += star.replace("%id%",tiddler.title+'_star_'+i.toString());
                        }
		}
		starsHtml += '<div id="'+tiddler.title+'_vote">&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp</div></html>';
		wikify(starsHtml, place);
	}
};
//}}}
/***
|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 : 10
};

//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();
                  }
};
//}}}
/***
|''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|
!Description

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

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version

!Code
***/
//{{{

	
//============================================================================
//============================================================================
//		   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 {{{<<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.
***/
/***
|Name|FramedLinksPlugin|
|Source|http://www.TiddlyTools.com/#FramedLinksPlugin|
|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|createExternalLink|
|Options|##Configuration|
|Description|clicking an external link opens an IFRAME following the link instead of opening a new tab/window|
This plugin causes clicks on external links to be rendered into inline frames (~IFRAMEs) instead of opening them in new browser tabs/windows.
!!!!!Usage
<<<
Just place an external link into your tiddler content using standard TiddlyWiki syntax.  When the {{{chkFramedLinks}}} checkbox is enabled or a tiddler is tagged with 'framedLinks' (see Configuration section, below), an IFRAME will be created dynamically whenever you click the external link.  Clicking on the link again removes the IFRAME.  You can hold down a modifier key (shift, control, or alt) while clicking a specific link to ''temporarily'' bypass the plugin-enhanced IFRAME handling and use the standard link handling behavior for that link.
<<<
!!!!!Configuration
<<<
<<option chkFramedLinks>> display inline frames for all external links
&nbsp; &nbsp; {{{usage: <<option chkFramedLinks>>}}}
<<option chkFramedLinksTag>> display inline frames for external links in tiddlers tagged with: <<option txtFramedLinksTag>> 
&nbsp; &nbsp; {{{usage: <<option chkFramedLinksTag>> and <<option txtFramedLinksTag>>}}}
IFRAME size (CSS units: %, em, px, cm, in) - width: <<option txtFrameWidth>> height: <<option txtFrameHeight>>
&nbsp; &nbsp; {{{usage: <<option txtFrameWidth>> <<option txtFrameHeight>>}}}
<<<
!!!!!Examples
<<<
Try these links:
*http://www.TiddlyWiki.com
*http://www.TiddlyTools.com
*http://groups.google.com/group/TiddlyWiki/topics
<<<
!!!!!Revisions
<<<
2008.09.13 [1.1.0] added support to selectively enable embedded IFRAMEs if the containing tiddler is tagged with 'framedLinks'
2007.11.29 [1.0.5] added slider animation and improved CSS handling for IFRAME height/width to maximize display area
2007.11.29 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.FramedLinksPlugin= {major: 1, minor: 1, revision: 0, date: new Date(2008,9,13)};

var co=config.options; // abbreviation
if (co.chkFramedLinks==undefined) co.chkFramedLinks=false;
if (co.chkFramedLinksTag==undefined) co.chkFramedLinksTag=true;
if (co.txtFramedLinksTag==undefined) co.txtFramedLinksTag="framedLinks";
if (co.txtFrameWidth==undefined) co.txtFrameWidth="100%";
if (co.txtFrameHeight==undefined) co.txtFrameHeight="80%";

window.framedLinks_createExternalLink=createExternalLink;
window.createExternalLink=function(place,url)
{
	var link=this.framedLinks_createExternalLink.apply(this,arguments);
	link.onclick=function(ev) { var e=ev?ev:window.event;
		var co=config.options; // abbreviation
		var here=story.findContainingTiddler(this);
		var enabled=co.chkFramedLinks || co.chkFramedLinksTag && here
			&& store.getTiddler(here.getAttribute("tiddler")).isTagged(co.txtFramedLinksTag);
		if (!enabled || e.ctrlKey || e.shiftKey || e.altKey) return; // BYPASS
		var p=this.parentNode; 
		var f=this.nextSibling?this.nextSibling.firstChild:null; // get the IFRAME... maybe...
		var w=co.txtFrameWidth; if (!w || !w.length) w="100%";
		var h=co.txtFrameHeight; if (!h || !h.length) h="80%";
		if (h.indexOf("%")) h=(findWindowHeight()*h.replace(/%/,"")/100)+"px"; // calc height as % of window
		var showing=f && f.nodeName.toUpperCase()=="IFRAME"; // does IFRAME really exist?
		var stretchCell=p.nodeName.toUpperCase()=="TD" && w.indexOf("%")!=-1 && w.replace(/%/,"")>=100;
		if (!showing) { // create an iframe
			link.style.display="block"; // force IFRAME onto line following link
			if (stretchCell) { p.setAttribute("savedWidth",p.style.width); p.style.width="100%"; } // adjust TD so IFRAME stretches
			var wrapper=createTiddlyElement(null,"span"); // wrapper for slider animation
			wrapper.setAttribute("url",this.href); // for async loading of frame after animation completes
			var f=createTiddlyElement(wrapper,"iframe"); // create IFRAME
			f.style.backgroundColor="#fff"; f.style.width=w; f.style.height=h;
			p.insertBefore(wrapper,this.nextSibling);
			function loadURL(wrapper) { var f=wrapper.firstChild; var url=wrapper.getAttribute("url");
				var d=f.contentDocument?f.contentDocument:(f.contentWindow?f.contentWindow.document:f.document);
				d.open(); d.writeln("<html>connecting to "+url+"</html>"); d.close();
				try { f.src=url; } // if the iframe can't handle the href
				catch(e) { alert(e.description?e.description:e.toString()); } // ... then report the error
				window.scrollTo(0,ensureVisible(wrapper));
			}
			if (!co.chkAnimate) loadURL(wrapper);
			else {
				var morph=new Slider(wrapper,true);
				morph.callback=loadURL;
				morph.properties.push({style: 'width', start: 0, end: 100, template: '%0%'});
				anim.startAnimating(morph);
			}
		} else { // remove iframe
			link.style.display="inline"; // restore link style
			if (stretchCell) p.style.width=p.getAttribute("savedWidth"); // restore previous width of TD
			if (!co.chkAnimate) p.removeChild(f.parentNode);
			else {
				var morph=new Slider(f.parentNode,false,false,"all");
				morph.properties.push({style: 'width', start: 100, end: 0, template: '%0%'});
				anim.startAnimating(morph);
			}
		}
		e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); return false;
	}
	return link;
}
//}}}
/***
|Name|FullScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#FullScreenPlugin|
|Version|1.1|
|Requires|~TW2.x|
!Description:
Toggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.

!Demo:
Click the ā†• button in the toolbar for this tiddler. Click it again to turn off fullscreen.

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

!History:
*25-07-06: ver 1.1
*20-07-06: ver 1.0

!Code
***/
//{{{
var lewcidFullScreen = false;

config.commands.fullscreen =
{
            text:" ā†• ",
            tooltip:"Fullscreen mode"
};

config.commands.fullscreen.handler = function (event,src,title)
{
            if (lewcidFullScreen == false)
               {
                lewcidFullScreen = true;
                setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");
               }
            else
               {
                lewcidFullScreen = false;
                setStylesheet(' ',"lewcidFullScreenStyle");
               }
}

config.macros.fullscreen={};
config.macros.fullscreen.handler =  function(place,macroName,params,wikifier,paramString,tiddler)
{
        var label = params[0]||" ā†• ";
        var tooltip = params[1]||"Fullscreen mode";
        createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);
}

var lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler =function(title,animate,slowly)
{
           lewcid_fullscreen_closeTiddler.apply(this,arguments);
           if (story.isEmpty() && lewcidFullScreen == true)
              config.commands.fullscreen.handler();
}


Slider.prototype.lewcidStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{
           this.lewcidStop();
           if (story.isEmpty() && lewcidFullScreen == true)
              config.commands.fullscreen.handler();
}
//}}}
@@font-size:10pt;<script label="genopfrisk">
        story.forEachTiddler(function(t,e)
{story.refreshTiddler(t,null,true)});
        refreshDisplay();
        return false;
</script>@@
|Name|Groundless|
|Author|JonnyLeRoy, Wolfgang|
|Description|depending on tiddlyDesktopBundle plugins|
|Source|http://aid.tiddlyspot.com|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|
!PageTemplate
<!--{{{-->
<div id='header' class='header' macro='gradient vert [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='Groundless##SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='Groundless##SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='Groundless##SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='Groundless##SiteSubtitle'></span>
</div>
</div>
<div id='mainToolbar' refresh='content' tiddler='Groundless##mainToolbar'></div>
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryMid]] [[ColorPalette::PrimaryMid]] [[ColorPalette::PrimaryLight]]'>
<span id='topMenu' refresh='content' tiddler='Groundless##TopMenu'></span>
</div>
<div id='outer'>
<div id='mainMenu' class='mainMenu' refresh='content' force='true' tiddler='Groundless##MainMenu'></div>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='Groundless##SideBarOptions'></div>
</div>
<div id='messageArea' ondblclick='clearMessage();return false;'></div>
<div id='displayArea'>
<div id='tiddlerDisplay'></div>
</div>
<div style="position:fixed;z-index:1001;bottom:.3em;right:.3em;cursor:pointer;font-size:9pt;">
<a href="javascript:window.scrollTo(0,0)" title="scroll to top of page">&#x25b2</a>
</div>
<!--}}}-->
!ViewTemplate
<!--{{{-->
<div class='windowBar' macro='gradient horiz [[ColorPalette::PrimaryMid]] [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryPale]]'>
<span class='windowToolbar' macro='toolbar Switch##Refresh &nbsp; collapseTiddler closeOthers jump -closeTiddler'></span>
<span class='title' macro='view title'></span>
</div>
<div class='collapsible'>
<div class='tagClear'></div>
<div class='scrollable'>

<div class='viewer' macro='view text wikified'></div>
<span macro='tiddler Switch##TableHighlight'></span>
<div class='subtitle'>
<span macro='view modifier link'></span>,
<span macro='view modified date [[DD mmm YY]]'></span>
 (created: <span macro='view created date [[DD mmm YY]]'></span>)
</div>
<div class='tagging' macro='tagging'></div>
<div class='tagClear'></div>
</div>
<div macro='sizer' class='sizer'>
<div class='toolbar' style='float:left' macro='toolbar [[Groundless##ViewToolbar]]'></div>
</div>
<!--}}}-->
!ViewToolbar
+editTiddler deleteTiddler fields Switch##Tagger openInWindow > permalink syncing references Switch##Embedded Switch##Print Switch##newHere <
!EditTemplate
<!--{{{-->
<div macro='gradient horiz [[ColorPalette::SecondaryMid]] [[ColorPalette::SecondaryLight]] [[ColorPalette::SecondaryPale]]' class='windowBar'>
<span class='windowToolbar' macro='toolbar collapseTiddler closeOthers jump closeTiddler'></span>
<span class='title' macro='view title'></span></div>

<div class='collapsible'>
<div class='toolbar' macro='toolbar [[Groundless##EditToolbar]]'></div>
<div class='tagClear'></div>
<div class='editor' macro='edit title'></div>
<span macro='tiddler EditBar'></span>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div>
<div class='editorFooter' macro='deliciousTagging'></div>
<div class='editor' macro='edit alias'></div><div class='editorFooter'><span macro='message abegoTiddlerAlias.lingo.aliasPrompt'></span></div>
<div macro='sizer' class='sizer'></div>
</div>
<!--}}}-->
!EditToolbar
+saveTiddler -cancelTiddler backup deleteTiddler toggleEditBar
!StyleSheet
[[StyleSheet]]
[[JqueryTreeviewCSS-T]]
[[Groundless##tiddlyDesktopStyle]]
[[Groundless##OverflowStyle]]
[[Groundless##CustomDefinitions]]
[[Groundless##TabStyles]]
[[Groundless##MptwStyle]]
[[Groundless##StylesheetShortcuts]]
!tiddlyDesktopStyle
/*{{{*/
/* by JonnyLeRoy http://www.digitaldimsum.co.uk/tiddlywiki/ */
BODY{position:static;background-image:[[ColorPalette::BackgroundImage]]}
.collapsible{margin:4px}
.scrollable{margin:4px;overflow:auto}
.windowBar{color:[[ColorPalette::Background]];background:[[ColorPalette::PrimaryMid]]; cursor:pointer;padding:2px 2px 2px 4px}
.windowBar .title{color:[[ColorPalette::TertiaryLight]];font-size:1em;cursor:move}
.selected .windowBar .title{color:[[ColorPalette::Background]]}
.tiddler{position:relative;z-index:700;width:640px;border:solid 1px;border-color: [[ColorPalette::TertiaryMid]];background:#f8f8f8;padding:0px}
.tiddler .selected{background:[[ColorPalette::Background]]}
.viewer p{margin:0} 
.tagged{float:left !important}
.tagged li{display:inline}
.viewer{background:transparent}
.windowToolbar{text-align:right;float:right}
.collapsible .toolbar{text-align:right;margin-top:4px;border:0}
.sizer{text-align:right;cursor:move;background:[[ColorPalette::TertiaryLight]]}
.sizer .toolbar a{border:0}
.sizer .resizer{color:[[ColorPalette::Background]];background:#aaa;padding:0px 2px 0px 2px}
.tiddler .windowBar .button{color:[[ColorPalette::PrimaryMid]];background:[[ColorPalette::Background]];margin-right:2px;padding:0em 0.4em;border:solid 1px [[ColorPalette::TertiaryLight]]}
.tiddler .windowBar .button:hover{background:[[ColorPalette::PrimaryPale]];border-color:[[ColorPalette::PrimaryMid]]}
.subtitle{font-size:.9em;text-align:right;float:right;padding-top:1.2em}
/*}}}*/
!OverflowStyle
/*{{{*/
/* by FND http://cleanlayout.tiddlyspot.com, improvement by Morris Gray */
#outer{margin:auto}
#mainMenu{position:static;float:left;width:auto;padding:1.5em .5em .5em .5em;font-size:1.1em;line-height:1.4em;text-align:left}
#sidebar{position:static;float:right;margin-right:3px;width:11em;font-size:1em}
#displayArea{overflow:hidden;margin:1em 1em 0}
#displayArea{display:inline-block}
#displayArea{display:block}
#mainMenu{max-width:24em} */
#mainMenu{max-width:640px} */
// * html #mainMenu{width: expression(this.clientWidth > 640 ? 640 : auto)} IE6
/*}}}*/
!CustomDefinitions
/*{{{*/
.headerShadow,.headerForeground{padding:.3em .3em .2em 1em}
.siteTitle{font-size:1.5em}
.siteSubtitle{font-size:1.1em}
.clear{clear:both}
.cola{float:left;margin-left:10%;width:40%}
.colb{float:left;margin-left:5%; /* width:45% */}
.tagging li{display:inline}
.tagging a{margin-right:1em;line-height:180%}
.tagging{background:transparent !important;float:right !important;border:0 !important}
.viewer li{padding-top:0.3em;padding-bottom:0.3em}
.viewer tr.evenRow{background-color:[[ColorPalette::SecondaryPale]]}
.nobullets li{list-style-type:none;margin-left:-2em}
.spacer{line-height:160%}

#mainToolbar{padding:.25em .4em 0 0;position:absolute;right:0;top:0;z-index:10}
#mainToolbar a{padding:0 0.2px}
#mainToolbar .button, #mainToolbar .tiddlyLink, #mainToolbar a{margin-left:.3em;margin-right:.3em;padding-left:2px;padding-right:2px;color:[[ColorPalette::PrimaryPale]];border:0px}
#mainToolbar .button:hover,mainToolbar .tiddlyLink:hover{background:[[ColorPalette::PrimaryPale]];color:[[ColorPalette::PrimaryDark]];border:0px}

#backstageArea,#backstageArea a{background:[[ColorPalette::PrimaryLight]]}
#backstageCloak{z-index:49}
#backstagePanel{margin:0 .5em 0 .5em}
.backstagePanelFooter{display:none}

.popup{-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-moz-border-radius-topright:5px;background:#ffe;border:1px solid #000;color:#000;white-space:nowrap;padding:0.2em;z-index:1000}
.popup a,.popup .button,.popup .tiddlyLinkExisting,.popup .tiddlyLinkNonExisting{font-style:normal;font-weight:normal}
.popup hr{background:#ddd;border:0;color:#000}
.popup li.disabled{color:#999}
.popup li a,.popup li a:visited{color:#300;padding:1px}
.popup li a:hover{background:#006;color: #fff !important}
#popup tr.fieldTableRow td {padding:1px 3px 1px 3px;}

.tagCloud span{height:3.5em;margin:10px;padding:10px;width:300px}
.tagCloud1{color:#80e;font-size:100%;font-weight:bold;padding-left:10px}
.tagCloud2{color:#35f;font-size:140%;font-weight:bold;padding-left:10px}
.tagCloud3{color:#3b0;font-size:180%;font-weight:bold;padding-left:10px}
.tagCloud4{color:#f90;font-size:220%;font-weight:bold;padding-left:10px}
.tagCloud5{color:#f51;font-size:260%;font-weight:bold;padding-left:10px}
.tagCloud6{color:#f30;font-size:300%;font-weight:bold;padding-left:10px}

#messageArea{background:#000;border:0;bottom:0;left:0;margin:0;opacity:0.5;padding:0;top:auto;width:100%}
#messageArea *{color:#FFF}
#messageArea div{padding:10px}
* html #messageArea{filter: alpha(opacity=50)}
/*}}}*/
!TabStyles
/*{{{*/
/* TeamTasks tabs by PhilHawksworth http://www.hawksworx.com/playground/TeamTasks */
#mainMenu{margin-top:-1.5em}
#mainMenu div.txtSlideTab{}
#mainMenu div.txtSlideTab div.tabset{background-color:[[ColorPalette::PrimaryLight]];color:[[ColorPalette::PrimaryPale]];padding:0;float:left;border-right:solid 1px [[ColorPalette::PrimaryMid]];margin-left:-.4em}
#mainMenu div.txtSlideTab div.tabset a.tab{display:block;padding:.2em .5em;text-align:right;background-color:[[ColorPalette::PrimaryLight]];border-bottom:solid 1px [[ColorPalette::PrimaryMid]]}
#mainMenu div.txtSlideTab div.tabset a.tabSelected{background-color:[[ColorPalette::PrimaryMid]];border-top:solid 0px #aaa;color:#fff}
#mainMenu div.txtSlideTab div.tabset a.tab:hover{background-color:[[ColorPalette::PrimaryMid]]}

#mainMenu div.tabContents{background-color:[[ColorPalette::PrimaryPale]];overflow:auto;border:solid 1px [[ColorPalette::PrimaryPale]];padding:0}
#mainMenu div.txtSlideTab ul{list-style:none;margin:0;padding:5px}
#mainMenu div.txtSlideTab ul li{padding:0 5px}
#mainMenu div.txtSlideTab ul li a{font-weight:normal;line-height:1.2em;color:[[ColorPalette::PrimaryDark]]}
#mainMenu div.txtSlideTab ul li.listTitle{font-size:1em;color:[[ColorPalette::TertiaryMid]]}
#mainMenu div.txtSlideTab ul li.listLink {margin:0}

/* TabsWhiteGray - by DaveBirss */
.whiteGray .button{color:#666}
.whiteGray .tabContents{color:#000}
.whiteGray .tabContents .tiddlyLink{border:none;color:#999}
.whiteGray .tabSelected{background:#fff;border-bottom:0;border-left:solid 1px #ccc;border-right:solid 1px #ccc;border-top:solid 1px #ccc;color:#000}
.whiteGray .tabUnselected{background:#eee;border-bottom:0;border-left:solid 1px #ccc;border-right:solid 1px #ccc;border-top:solid 1px #ccc;color:#999}
.tabSelected, .whiteGray,.whiteGray .tabContents,.whiteGray .txtMoreTab .tabSelected,.whiteGray .txtMoreTab .tabContents{background:#fff}
.tabUnselected, .whiteGray .txtMoreTab .tabUnselected{background:#eee}
.whiteGray .tabContents .button:hover{background:#fff;color:#000}
.whiteGray .tabContents .tiddlyLink:hover{background:#fff;border:none;color:#000}
/*}}}*/
!MptwStyle
/*{{{*/
/* by SimonBaird http://mptw.tiddlyspot.com */
.headerForeground{color:[[ColorPalette::PrimaryPale]]}
.headerForeground .siteSubtitle{color:[[ColorPalette::PrimaryPale]]}
.headerForeground,.headerShadow{padding:1em 1em 0}
.headerForeground,.headerShadow{font-family:'Trebuchet MS' sans-serif;font-weight:bold}
.headerShadow{left:1px;top:1px}
.headerShadow,.headerShadow a,.headerShadow .siteSubtitle{color:[[ColorPalette::PrimaryMid]]}
.selected .toolbar{visibility:visible}
.toolbar{visibility:hidden}
// #sidebar{display:none}
#sidebar .button{border:none}
#sidebarOptions .sliderPanel{border:solid 1px [[ColorPalette::PrimaryLight]]}
#sidebarOptions .sliderPanel br,.popup li .tagger a{display:inline}
#subtitle .button{style:none}
#topMenu{padding:2px;display:none}
#topMenu br,#sidebarOptions br,#mainToolbar br{display:none}
#topMenu.button,#topMenu .tiddlyLink,#topMenu a{color: [[ColorPalette::PrimaryPale]];margin-left:0.5em;margin-right:0.5em;padding-left:3px;padding-right:3px}
#topMenu .button:hover,#topMenu .tiddlyLink:hover{background:[[ColorPalette::PrimaryPale]];border:1px solid [[ColorPalette::SecondaryMid]];color:[[ColorPalette::PrimaryDark]]}
.tiddler{z-index:700;}
/*}}}*/
!StylesheetShortcuts
/*{{{*/
/* by EricShulman http://www.TiddlyTools.com */
.right{display:block;text-align:right}
.center{display:block;text-align:center}
.floatright{float:right}
.floatleft{float:left}
.clear{clear:both}
.space{line-height:160%}
.normal{font-size:9pt;line-height:120%}
.small{font-size:8pt;line-height:120%}
.tiny{font-size:6pt;line-height:120%}
.smallform{white-space:nowrap}
.smallform input,.smallform textarea,.smallform button,.smallform checkbox,.smallform radio,.smallform select{font-size:8pt}
.nobullets li{list-style-type:none;margin-left:-2em}
.indent{display:block;margin:0;padding:0;border:0;margin-left:2em}
.wrap{white-space:normal}
.hidden{display:none}
.show{display:inline !important}
.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody{border:0 !important;margin:0 !important;padding:0 !important}
.outline{display:block;padding:1em;-moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid}
.whitespace{white-space:pre}
#tidIDE, .tidIDE input, .tidIDE textarea, .tidIDE button, .tidIDE checkbox, .tidIDE radio, .tidIDE select{font-family:DejaVu,Verdana;font-size:9pt}
/*}}}*/
/*{{{*/
/* CalendarStyle */
table.calendarWrapper{border-collapse:collapse;border:2px solid #c6dbff}
.calendarWrapper td{border-collapse:collapse;border:1px solid #c6dbff;text-align:center;margin:0;padding:0 0.05em}
table.calendar{border-collapse:collapse;border:0}
.calendar tbody,.calendar th,.calendar td,.calendar tr{border:0;text-align:center;font-size:1em;padding:0 0.1em}
.calendar th{color:#000;background-color:#c6dbff}
#sidebarOptions .calendar td{font-size:0.96em;margin:0;padding:0}
#sidebarTabs .calendar td{padding:0 0.25em}
.calendar .naviBar select{border:0}
.calendar .today a{padding:0;border:1px solid blue}
.calendar .weekend{background-color:#deeeff}
.calendar .hasChanged{font-family:bold;background-color:#fe8;color:darkblue}
.calendar .holiday{font-weight:bold;font-size:1.06em;color:red}
.datePopup{background:#efffff}
.datePopup .isCreated{color:#df6300}
/*}}}*/
!SiteTitle
DeskTree
!SiteSubtitle
 based on Groundless desktop by Wolfgang <<tiddler Switch##ToggleTopMenu>>/%

!mainToolbar
^^
<<restoreLayout>><<rB home>>
<<tiddler Switch##ResizeFonts>>
<<previousTiddler "back" "Show previous tiddler">>
<<closeAll>>
<<permaview>>
<<newJournal label:new>>
<<tiddler Switch##ResizeBox>>
<<saveChanges>>
<html><a href="" class="button" title="Restart" onclick="restart();">Ā®</a></html>
&nbsp;^^<<search>><script>place.lastChild.style.width="10em";place.lastChild.style.fontSize="8pt";place.lastChild.style.letterSpacing="0.3ex";</script>

!TopMenu
<<tiddler Switch##mainMenu>>
<<tiddler Switch##Header>>
<<search>><script>place.lastChild.style.width="10em";place.lastChild.style.fontSize="8pt";place.lastChild.style.letterSpacing="0.3ex";</script>
<<tiddler Switch##Sidebar>>
!MainMenu
{{left{{{nowrap{
<<tiddler HjemKnap>>
<<forEachTiddler where 'tiddler.tags.contains("Emner")' write
 '"<<tiddler EmnerTemplate1 with: [["+tiddler.title+"]]$))"'>>}}}}}}
----
{{center{
[[Tak til ... & licens]]
[[Kontakt MĆ„ns]]
[[Download|http://notebrise.tiddlyspot.com/download]]
+++[Ws MainMenu]...
<<tabs txtSlideTab
" " "" ""
"Timeline" "show timeline" TabTimeline
"Been" "show visited tiddlers" Groundless##ShowBreadcrumbs
"All" "show all tiddlers" Groundless##TabAll
"Tags" "show all tags" Groundless##TabTags
"Edit" "show edit options" Groundless##Edit
"More" "system tiddlers" Groundless##TabMore
"Calendar" "show monthly calendar" Groundless##Calendar
>>===

!Edit
*<<tiddler Groundless##SideBarOptions>>
!TabAll
<<tabs txtAlphaTab
'# ' 'Tiddlers in \W' Groundless##\W
'A ' 'Tiddlers in a' Groundless##a
'B ' 'Tiddlers in a' Groundless##b
'C ' 'Tiddlers in a' Groundless##c
'D ' 'Tiddlers in a' Groundless##d
'E ' 'Tiddlers in a' Groundless##e
'F ' 'Tiddlers in a' Groundless##f
'G ' 'Tiddlers in a' Groundless##g
'H ' 'Tiddlers in a' Groundless##h
'I ' 'Tiddlers in a' Groundless##i
'J ' 'Tiddlers in a' Groundless##j
'K ' 'Tiddlers in a' Groundless##k
'L ' 'Tiddlers in a' Groundless##l
'M ' 'Tiddlers in a' Groundless##m
'N ' 'Tiddlers in a' Groundless##n
'O ' 'Tiddlers in a' Groundless##o
'P ' 'Tiddlers in a' Groundless##p
'Q ' 'Tiddlers in a' Groundless##q
'R ' 'Tiddlers in a' Groundless##r 
'S ' 'Tiddlers in a' Groundless##s
'T ' 'Tiddlers in a' Groundless##t
'U ' 'Tiddlers in a' Groundless##u
'V ' 'Tiddlers in a' Groundless##v
'W ' 'Tiddlers in a' Groundless##w
'X ' 'Tiddlers in a' Groundless##x
'Y ' 'Tiddlers in a' Groundless##y
'Z ' 'Tiddlers in a' Groundless##z 
>>/%
!#
<<listPart all \W\d>>
!a
<<listPart all a>>
!b
<<listPart all b>>
!c
<<listPart all c>>
!d
<<listPart all d>>
!e
<<listPart all e>>
!f
<<listPart all f>>
!g
<<listPart all g>>
!h
<<listPart all h>>
!i
<<listPart all i>>
!j
<<listPart all j>>
!k
<<listPart all k>>
!l
<<listPart all l>>
!m
<<listPart all m>>
!n
<<listPart all n>>
!o
<<listPart all o>>
!p
<<listPart all p>>
!q
<<listPart all q>>
!r
<<listPart all r>>
!s
<<listPart all s>>
!t
<<listPart all t>>
!u
<<listPart all u>>
!v
<<listPart all v>>
!w
<<listPart all w>>
!x
<<listPart all x>>
!y
<<listPart all y>>
!z
<<listPart all z>>
!TabTags
<<tabs txtTabbedListtags
'all ' 'show all tags' Groundless##TagCloud
'a-g ' 'Tiddlers in a-g' Groundless##TAGSa-g
'h-o ' 'Tiddlers in h-ƶ'Groundless##TAGSh-o
'p-s ' 'Tiddlers in p-s' TAGSp-s
't-z ' 'Tiddlers in t-z' TAGSt-z
'# ' 'Tiddlers in symbols' Groundless##TAGS
>>{{tiny{[<<tiddler RenameTag>> <<tiddler DeleteAllTagged>>}}}
!TAGSa-g
<<tagListPart a-g>>
!TAGSh-o
<<tagListPart h-o>>
!TAGS
<<tagListPart \d\W>>
!TabMore
<<tabs txtMoreTab
"Shadow" "shadowed tiddlers" TabMoreShadowed
"Macros" "macros and plugins" Groundless##Macros
"Scripts" "inline and html scripts" Groundless##Scripts
"Exclude" "excludeLists" Groundless##Exclude
"Missing" "missing tiddlers" TabMoreMissing
"Orphan" "orphaned tiddlers" TabMoreOrphan
>>
!Exclude
<<list filter [tag[excludeLists]]>>
!Macros
<<list filter [tag[2]]>>
!Scripts
<<list filter [tag[4]]>>
!SideBarOptions
<<closeAll>>
<<collapseAll>><<rB fold>>
<<expandAll>><<rB expand>>
<<autoLayout>>
<<restoreLayout>>
<<saveLayout>>
<<permaview>>
<<newTiddler>>
<<newJournal "DD MMM YYYY" "journal">>
<<saveChanges>>
<<slider chkSliderOptionsPanel Groundless##OptionsPanel "options Ā»" "Change TiddlyWiki advanced options">>
<<newDocument ask all>>
<<newDocument label:custom.. ask ask>>
<<newDocument label:print ask print>><html><a href='http://aid.tiddlyspot.com/download' class='button'>download</a></html>
<<tiddler Switch##Edit with:__tiddlyDesktopLayout "layout">>
<<tiddler Switch##RefreshDisplay>>
[[configuration|Edit]]
<<tiddler Switch##ResizeBox>>
<<tiddler TspotSidebar>>
!OptionsPanel
user: <<tiddler Groundless##options with: UserName>>
backup folder: <<tiddler Groundless##options with: BackupFolder>>
<<option chkDisableTabsBar>> disable tabs bar
<<option chkShowStartupBreadcrumbs>> crumbs for start
<<option chkBreadcrumbsReverse>> recent crumbs. first
<<option chkStickyPopups>> sticky popups
<<option chkSaveBackups>> save backups
<<option chkAutoSave>> auto save
<<option chkAnimate>> enable animations
<<option chkDisableAutoSelect>> cursor at start
<<option chkTextAreaExtensions>> strg+f, strg+g
<<option chkRegExpSearch>> regexp search
<<option chkCaseSensitiveSearch>> case sensitive search
----
<<tiddler Pop##Right with: More Groundless##Options "show more options">> - also see:
<<tiddler Pop##Right with: "Advanced Options" AdvancedOptions "show advanced options">>
!Options
<<selectPalette>>
edit rows: <<tiddler Switch##options with: MaxEditRows>>
TidIDE rows: <<tiddler Switch##options with: TidIDEMaxEditRows>>
!TagCloud
<<tagCloud excludeLists>>
!Calendar
<<tCalendar>>
!ShowBreadcrumbs
*<<previousTiddler "back" "Show previous tiddler">>
*<<breadcrumbs "<br>" "<br>">>
!
%/
Du kan:
#Ɔndre titelen ved at klikke pĆ„ [[SideTitel|SiteTitle]] og skriv en ny titel.
#Ɔndre eller fjerne undertitlen ved at klikke pĆ„ [[UnderTitel|SiteSubtitle]] og gĆør hvad du vil med den.
#Bestemme hvad der viser sig nƄr du Ƅbner Simple Noter ved at Ƅbne DefaultTiddlers og udskifte {{{[[Instruktioner]]}}} med en notetitel omkranset af dobblete firkantede paranteser.
#NƄr du er sikker pƄ at du ikke lƦngere har brug for dem, kan du slette [[Eksempel emne]], [[Eksempel underemne]] og [[Eksempel note]], [[Avanceret tilpasning]], og denne note, [[GrundlƦggende tilpasning]].
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.3.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.10.02 [2.3.0] added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
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: 3, revision: 0, date: new Date(2008,10,2)};

// 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 <nowiki> is present, just let browser handle it!
			if (html.indexOf('<nowiki>')!=-1)
				createTiddlyElement(w.output,"span").innerHTML=html;
			else {
				// 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;
				// then re-render text nodes as wiki-formatted content
				wikifyTextNodes(e);
			}
			w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing
		}
	}
}

// wikify #text nodes that remain 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|HTMLFormattingPluginInfo|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.3.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|documentation|
|Requires||
|Overrides||
|Description|documentation for HTMLFormattingPlugin|
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.
!!!!!Usage
<<<
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 a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within {{{<html>}}} and {{{</html>}}} markers.  When present, the TiddlyWiki core simply passes this content directly to the browser's internal "rendering engine" to process as ~HTML-formatted content.  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.

This plugin extends the TiddlyWiki core processing so that, after the HTML formatting has been processed, all the pieces of text occuring within the HTML block are then processed one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.

Note: To bypass this extended processing for a specific section of HTML content, embed ''{{{<nowiki>}}}'' //anywhere// inside the {{{<html>...</html>}}} delimiters, and wiki formatting will not be applied to that content.
<<<
!!!!!Line breaks
<<<
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, by placing ''{{{<hide linebreaks>}}}'' //anywhere// within the HTML content.  This automatically converts 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.
<<<
!!!!!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.

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.
<<<
!!!!!Revisions
<<<
2008.10.02 [2.3.0] added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
2008.09.19 [2.2.0] in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
2008.04.26 [*.*.*] plugin size reduction: more documentation moved to HTMLFormattingInfo
2008.01.08 [*.*.*] plugin size reduction: documentation moved to HTMLFormattingInfo
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.06.14 [2.1.5] in formatter, removed call to e.normalize().  Creates an INFINITE RECURSION error in Safari!!!!
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.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
@@font-family:"Comic Sans MS"; NoteStorm er en gratis og nem mƄde at tage og organisere noter.
~NoteBrise er MĆ„ns' variant over NoteStorm. @@ 
<<tabs txtMenuMenu
"Slideshow" "Slideshow" SlideShow
"Kom i gang" "Kom i gang" 'Kom i gang'
"KvikStart" "KvikStart" 'KvikStart' 
"Instruktioner" "Instruktioner" 'Instruktioner' 
"Mod" "Mod" 'Mod'
>>
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};


merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}},

	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title == params[0], place);
	}},

	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title != params[0], place);
	}},

	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !window.hideWhenLastTest, place);
	}}

});

//}}}

<html><a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.filterTiddlers(store.getTiddlerText('DefaultTiddlers'))) "
><span title="Luk alle tiddlere og Ć„ben velkomstsiden" style="cursor:pointer">''Hjem''</span></a></li></html>
<<tiddler Hej!>>
<script>
var out=""; 
var items=store.getTiddlerText('$1','') .split("\n----\n"); 
for (var i=0; i<items.length; i++) { 
if (i>0 && i/5==Math.floor(i/5)) out += "|\n"; // start a new row 
out += "|"+items[i]; // add item to row 
} 

out += "|\n"; // end last row 
return out; 
</script> 
/***
|Name|ImageSizePlugin|
|Source|http://www.TiddlyTools.com/#ImageSizePlugin|
|Version|1.2.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,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|adds support for resizing images|
This plugin adds optional syntax to scale an image to a specified width and height and/or interactively resize the image with the mouse.
!!!!!Usage
<<<
The extended image syntax is:
{{{
[img(w+,h+)[...][...]]
}}}
where ''(w,h)'' indicates the desired width and height (in CSS units, e.g., px, em, cm, in, or %). Use ''auto'' (or a blank value) for either dimension to scale that dimension proportionally (i.e., maintain the aspect ratio). You can also calculate a CSS value 'on-the-fly' by using a //javascript expression// enclosed between """{{""" and """}}""". Appending a plus sign (+) to a dimension enables interactive resizing in that dimension (by dragging the mouse inside the image). Use ~SHIFT-click to show the full-sized (un-scaled) image. Use ~CTRL-click to restore the starting size (either scaled or full-sized).
<<<
!!!!!Examples
<<<
{{{
[img(100px+,75px+)[images/meow2.jpg]]
}}}
[img(100px+,75px+)[images/meow2.jpg]]
{{{
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
}}}
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
{{tagClear{
}}}
<<<
!!!!!Revisions
<<<
2009.02.24 [1.2.1] cleanup width/height regexp, use '+' suffix for resizing
2009.02.22 [1.2.0] added stretchable images
2008.01.19 [1.1.0] added evaluated width/height values
2008.01.18 [1.0.1] regexp for "(width,height)" now passes all CSS values to browser for validation
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImageSizePlugin= {major: 1, minor: 2, revision: 1, date: new Date(2009,2,24)};
//}}}
//{{{
var f=config.formatters[config.formatters.findByField("name","image")];
f.match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
f.lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](?:\(([^,]*),([^\)]*)\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
f.handler=function(w) {
	this.lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var floatLeft=lookaheadMatch[1];
		var floatRight=lookaheadMatch[2];
		var width=lookaheadMatch[3];
		var height=lookaheadMatch[4];
		var tooltip=lookaheadMatch[5];
		var src=lookaheadMatch[6];
		var link=lookaheadMatch[7];

		// Simple bracketted link
		var e = w.output;
		if(link) { // LINKED IMAGE
			if (config.formatterHelpers.isExternalLink(link)) {
				if (config.macros.attach && config.macros.attach.isAttachment(link)) {
					// see [[AttachFilePluginFormatters]]
					e = createExternalLink(w.output,link);
					e.href=config.macros.attach.getAttachment(link);
					e.title = config.macros.attach.linkTooltip + link;
				} else
					e = createExternalLink(w.output,link);
			} else 
				e = createTiddlyLink(w.output,link,false,null,w.isStatic);
			addClass(e,"imageLink");
		}

		var img = createTiddlyElement(e,"img");
		if(floatLeft) img.align="left"; else if(floatRight) img.align="right";
		if(width||height) {
			var x=width.trim(); var y=height.trim();
			var stretchW=(x.substr(x.length-1,1)=='+'); if (stretchW) x=x.substr(0,x.length-1);
			var stretchH=(y.substr(y.length-1,1)=='+'); if (stretchH) y=y.substr(0,y.length-1);
			if (x.substr(0,2)=="{{")
				{ try{x=eval(x.substr(2,x.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			if (y.substr(0,2)=="{{")
				{ try{y=eval(y.substr(2,y.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			img.style.width=x.trim(); img.style.height=y.trim();
			config.formatterHelpers.addStretchHandlers(img,stretchW,stretchH);
		}
		if(tooltip) img.title = tooltip;

		// GET IMAGE SOURCE
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
		else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
			if (config.browser.isIE || config.browser.isSafari) {
				img.onerror=(function(){
					this.src=config.formatterHelpers.resolvePath(this.src,false);
					return false;
				});
			} else
				src=config.formatterHelpers.resolvePath(src,true);
		}
		img.src=src;
		w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
}

config.formatterHelpers.addStretchHandlers=function(e,stretchW,stretchH) {
	e.title=((stretchW||stretchH)?'DRAG=stretch/shrink, ':'')
		+'SHIFT-CLICK=show full size, CTRL-CLICK=restore initial size';
	e.statusMsg='width=%0, height=%1';
	e.style.cursor='move';
	e.originalW=e.style.width;
	e.originalH=e.style.height;
	e.minW=Math.max(e.offsetWidth/20,10);
	e.minH=Math.max(e.offsetHeight/20,10);
	e.stretchW=stretchW;
	e.stretchH=stretchH;
	e.onmousedown=function(ev) { var ev=ev||window.event;
		this.sizing=true;
		this.startX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
		this.startY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
		this.startW=this.offsetWidth;
		this.startH=this.offsetHeight;
		return false;
	};
	e.onmousemove=function(ev) { var ev=ev||window.event;
		if (this.sizing) {
			var s=this.style;
			var currX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var currY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var newW=(currX-this.offsetLeft)/(this.startX-this.offsetLeft)*this.startW;
			var newH=(currY-this.offsetTop )/(this.startY-this.offsetTop )*this.startH;
			if (this.stretchW) s.width =Math.floor(Math.max(newW,this.minW))+'px';
			if (this.stretchH) s.height=Math.floor(Math.max(newH,this.minH))+'px';
			clearMessage(); displayMessage(this.statusMsg.format([s.width,s.height]));
		}
		return false;
	};
	e.onmouseup=function(ev) { var ev=ev||window.event;
		if (ev.shiftKey) { this.style.width=this.style.height=''; }
		if (ev.ctrlKey)  { this.style.width=this.originalW; this.style.height=this.originalH; }
		this.sizing=false;
		clearMessage();
		return false;
	};
	e.onmouseout=function(ev) { var ev=ev||window.event;
		this.sizing=false;
		clearMessage();
		return false;
	};
}
//}}}
On 23. september 2009 22:22:55, YourName imported 179 tiddlers from
[[C:\Documents and Settings\mama\Dokumenter\My Dropbox\Public\DeskTree\DeskTree.html|C:\Documents and Settings\mama\Dokumenter\My Dropbox\Public\DeskTree\DeskTree.html]]:
<<<
#[[AccordianMenuContent]] - added
#[[Acknowledgements & license]] - added
#[[Air]] - added
#[[AndreBĆøger&Artikler]] - added
#[[AppreciatedFunctionsPack]] - added
#[[AttachFileMIMETypes]] - added
#[[AttachFilePlugin]] - added
#[[AttachFilePluginFormatters]] - added
#[[Avanceret tilpasning]] - added
#[[Bibliografi]] - added
#[[Bibliography]] - added
#[[Bibliography feature]] - added
#[[BogArkiv]] - added
#[[BogRapportTemplate]] - added
#[[BreadcrumbsPack]] - added
#[[Browser]] - added
#[[BĆøger]] - added
#[[BĆøgerEditTemplate]] - added
#[[BĆøgerViewTemplate]] - added
#[[CSS]] - added
#[[CheckboxPlugin]] - added
#[[CheckboxToggleTag]] - added
#[[CloseOnCancelPlugin]] - added
#[[ColorPalette]] - added
#[[Compare]] - added
#[[Cookie plugin]] - added
#[[Danish]] - added
#[[DataTiddlerPlugin]] - added
#[[De Gale]] - added
#[[De Gale-note]] - added
#[[De gale - projekt]] - added
#[[DeliciousTaggerPack]] - added
#[[DeprecatedFunctionsPlugin]] - added
#[[DeskTree]] - added
#[[Desktree]] - added
#[[DragScrollPlugin]] - added
#[[Earth]] - added
#[[Edit]] - added
#[[EditBar]] - added
#[[EditBarPlugin]] - added
#[[EditBarTools]] - added
#[[EditFieldPlugin]] - added
#[[EditSectionPlugin]] - added
#[[Efter forfatter]] - added
#[[Efter tema]] - added
#[[Efter titel]] - added
#[[EmbeddedImages]] - added
#[[EmnerTemplate]] - added
#[[EmnerTemplate1]] - added
#[[EmnerViewTemplate]] - added
#[[ExtendTagButtonPlugin]] - added
#[[FCKeditorPlugin]] - added
#[[FieldsEditorPlugin]] - added
#[[FileDropPlugin]] - added
#[[Film#1]] - added
#[[FiveStarsPlugin]] - added
#[[FontSizePlugin]] - added
#[[ForEachTiddlerPlugin]] - added
#[[FormTiddlerMacro]] - added
#[[FormTiddlerPlugin]] - added
#[[FramedLinksPlugin]] - added
#[[FullScreenPlugin]] - added
#[[GenOpfrisk]] - added
#[[Groundless]] - added
#[[GrundlƦggende tilpasning]] - added
#[[HTMLFormattingPlugin]] - added
#[[HTMLFormattingPluginInfo]] - added
#[[Hej!]] - added
#[[HideWhenPlugin]] - added
#[[HjemKnap]] - added
#[[HjƦlp]] - added
#[[HrList2Table]] - added
#[[ImageSizePlugin]] - added
#[[InlineJavascriptPack]] - added
#[[InlineJavascriptPlugin]] - added
#[[Instruktioner]] - added
#[[JqueryTreeviewCSS-T]] - added
#[[Kom i gang]] - added
#[[Komposition]] - added
#[[Kontakt MĆ„ns]] - added
#[[KvikStart]] - added
#[[Lav dine egne voicetreads]] - added
#[[MM 16/09-09 16.15.48]] - added
#[[MainMenu]] - added
#[[MarkupPostBody]] - added
#[[MarkupPreHead]] - added
#[[MicroBrowser]] - added
#[[MiniBrowserList]] - added
#[[Mod]] - added
#[[NestedSlidersPlugin]] - added
#[[NestedSlidersPlugin(withGiffmexTweak)]] - added
#[[NewBibEntry]] - added
#[[NewBibEntryTemplate]] - added
#[[NewDocumentPack]] - added
#[[NewHTMLFromTemplate]] - added
#[[NewHerePlugin(Giffmex version)]] - added
#[[Note]] - added
#[[NoteArkiv]] - added
#[[NoteNote]] - added
#[[NoteStorm]] - added
#[[Ondskaben]] - added
#[[Ondskaben-note]] - added
#[[Opret en hjemmeside pƄ TiddlySpot]] - added
#[[OverSigt]] - added
#[[PlayerPlugin]] - added
#[[Pop]] - added
#[[Program som alm. tekst]] - added
#[[QuickMenu]] - added
#[[QuickNote]] - added
#[[RefreshTiddler]] - added
#[[RenameTagsPlugin]] - added
#[[SetUserNamePlugin]] - added
#[[ShowPopup]] - added
#[[ShowSimilarTagsToThis]] - added
#[[SideBarTabs]] - added
#[[SideBarTabsSlider]] - added
#[[SiteSubtitle]] - added
#[[SiteTitle]] - added
#[[SiteUrl]] - added
#[[SlideShow]] - added
#[[SliderSidebarTabs]] - added
#[[SnapshotPlugin]] - added
#[[StickyPopupPlugin]] - added
#[[Switch]] - added
#[[TableSortingPlugin]] - added
#[[TagCloudPack]] - added
#[[TagCloudPlugin]] - added
#[[TagToolTemplate]] - added
#[[TaggedTemplateTweak]] - added
#[[TaggerPlugin]] - added
#[[TagglyTaggingPlugin]] - added
#[[TiddlerAliasPlugin]] - added
#[[TiddlyCalendarPack]] - added
#[[TiddlyPodList]] - added
#[[TiddlyPodPlugin]] - added
#[[TilElevFraBog]] - added
#[[ToggleLeftSidebar]] - added
#[[ToggleRightSidebar]] - added
#[[ToggleTagPlugin]] - added
#[[TopicNote]] - added
#[[TreeviewPluginPlugin.24]] - added
#[[TspotSetupPlugin]] - skipped after asking
#[[UploadLog]] - added
#[[VedHƦftninger]] - added
#[[VƦrktĆøj]] - added
#[[WikifyPlugin]] - added
#[[__tiddlyDesktopLayout]] - added
#[[attachment]] - added
#[[batchTagToolsPack]] - added
#[[file.gif]] - added
#[[folder-closed.gif]] - added
#[[folder.gif]] - added
#[[fontSize]] - added
#[[hurtignote]] - added
#[[leftbackdo6.gif]] - added
#[[leftbackdrkgreenqu9.jpg]] - added
#[[mainmenugray7ef.gif]] - added
#[[minus.gif]] - added
#[[navbargray1.gif]] - added
#[[navbargray777.gif]] - added
#[[navbargrayhw1.gif]] - added
#[[navbargrayhw1.png]] - added
#[[navbargreenhw1.gif]] - added
#[[navbarred.gif]] - added
#[[openbook.gif]] - added
#[[tagSky]] - added
#[[tiddlyDesktopBundle]] - added
#[[treeview-black-line.gif]] - added
#[[treeview-black.gif]] - added
#[[treeview-default-line.gif]] - added
#[[treeview-default.gif]] - added
#[[treeview-famfamfam-line.gif]] - added
#[[treeview-famfamfam.gif]] - added
#[[treeview-gold-line.gif]] - added
#[[treeview-gold.gif]] - added
#[[treeview-gray-line.gif]] - added
#[[treeview-gray.gif]] - added
#[[treeview-red-line.gif]] - added
#[[treeview-red.gif]] - added
#[[zconfiguration]] - added
<<<
/***
|Name|InlineJavascriptPlugin ''packed''|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Description|Insert Javascript executable code directly into your tiddler content.|
***/
//{{{
version.extensions.InlineJavascriptPlugin={major:1,minor:9,revision:5,date:new Date(2009,4,11)};config.formatters.push({name:"inlineJavascript",match:"\\<script",lookahead:'\\<script(?: src=\\"((?:.|\\n)*?)\\")?(?: label=\\"((?:.|\\n)*?)\\")?(?: title=\\"((?:.|\\n)*?)\\")?(?: key=\\"((?:.|\\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){var src=lookaheadMatch[1];var label=lookaheadMatch[2];var tip=lookaheadMatch[3];var key=lookaheadMatch[4];var show=lookaheadMatch[5];var code=lookaheadMatch[6];if(src){var script=document.createElement("script");script.src=src;document.body.appendChild(script);document.body.removeChild(script)}if(code){if(show){wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output)}if(label){var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));var fixup=code.replace(/document.write\s*\(/gi,"place.bufferedHTML+=(");link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);";link.tiddler=w.tiddler;link.onclick=function(){this.bufferedHTML="";try{var r=eval(this.code);if(this.bufferedHTML.length||(typeof(r)==="string")&&r.length){var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling)}if(this.bufferedHTML.length){s.innerHTML=this.bufferedHTML}if((typeof(r)==="string")&&r.length){wikify(r,s,null,this.tiddler);return false}else{return r!==undefined?r:false}}catch(e){alert(e.description||e.toString());return false}};link.setAttribute("title",tip||"");var URIcode="javascript:void(eval(decodeURIComponent(%22(function(){try{";URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g," ")));URIcode+="}catch(e){alert(e.description||e.toString())}})()%22)))";link.setAttribute("href",URIcode);link.style.cursor="pointer";if(key){link.accessKey=key.substr(0,1)}}else{var fixup=code.replace(/document.write\s*\(/gi,"place.innerHTML+=(");var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";try{var out=eval(c)}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}}});if(typeof(wikifyPlainText)=="undefined"){window.wikifyPlainText=function(d,a,b){if(a>0){d=d.substr(0,a)}var c=new Wikifier(d,formatter,null,b);return c.wikifyPlain()}}if(typeof($)=="undefined"){function $(a){return document.getElementById(a.replace(/^#/,""))}};
//}}}
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.5|
|Author|Eric Shulman|
|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.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.04.11 [1.9.5] pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\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) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // external script library
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (code) { // inline code
				if (show) // display source in tiddler
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (label) { // create 'onclick' command link
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
					link.tiddler=w.tiddler;
					link.onclick=function(){
						this.bufferedHTML="";
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if(this.bufferedHTML.length)
								s.innerHTML=this.bufferedHTML;
							if((typeof(r)==="string")&&r.length) {
								wikify(r,s,null,this.tiddler);
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					};
					link.setAttribute("title",tip||"");
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
					link.setAttribute("href",URIcode);
					link.style.cursor="pointer";
					if (key) link.accessKey=key.substr(0,1); // single character only
				}
				else { // run script immediately
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
					try	 { var out=eval(c); }
					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;
		}
	}
} )
//}}}

// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}
//}}}

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
NoteStorm er en fuldstƦndig simpel mƄde at tage og organisere noter. Dave Gifford lavede den til sine seminarieelever, og har gjort den tilgƦngelig for alle. Originalen kan ses [[her.|NoteStorm]] 
(MĆ„ns har oversat, redesignet, tilfĆøjet nogle ekstra plugins og valgt at kalde den ~NoteBrise) 
!Hvordan bruger man ~NoteBrise:
#''Notatteknik i NB'': i en nĆøddeskal, du laver noter som hĆører til emner og underemner, og finder dem hurtigt igen, enten med sĆøgefunktionen, eller via Emne indekset, som opdateres automatisk.
##''Fra top til bund metoden:'' Klik pĆ„ 'Nyt hovedemne' Ćøverst //(kan ses i den udgave af SN du har gemt til din pc)// og fĆølg de instruktioner som gives. 'Emne' indekset til venstre vil automatisk tilfĆøje emner og noter til Emne indekset.  Klik pĆ„ trƦerne for at Ć„bne forskellige niveauer i indekset.
##''Fra bunden og op metoden'': Klik pĆ„ 'Ny note' foroven //(kan ses i den udgave af NB du har gemt til din pc)// og fĆølg de instruktioner, der gives om at lave en note og arbejd dig op ad emne- og underemnekƦden.
#''Navigation i NB'': Der er mindst tre mƄder at navigere igennem ~NoteBrise:
##SĆøg efter en note gennem sĆøgevinduet.
##Se dine noter igennem via Emne indekset til venstre.
##ƅben sidepanelet for at se lister over noter efter titel, dato Ʀndret og efter tags.
#''Formatering i Simple Noter''
##NĆ„r en note eller et emne er i edit-mode, kan du bruge knapper til at formatere valgt tekst eller tilfĆøje links og billeder.
!Hvordan man downloader ~NoteBrise:
Du kan downloade lige sĆ„ mange kopier af ~NoteBrise som du Ćønsker, gratis. 
# [[Klik her|http://notebrise.tiddlyspot.com/download]] og vƦlg //gem// eller hent den originale 'NoteStorm' [[hĆøjreklik her|http://www.giffmex.org/NoteBrise.html]] og vƦlg 'Gem linkmĆ„l som', 'Gem link som', eller lignende. Giv din fil et nyt filnavn og lƦg den hvor du vil.
#Hvis du bruger en anden browser end Firefox, vil du fĆ„ brug for [[klik her|http://www.tiddlywiki.com/TiddlySaver.jar]], gem  ~TiddlySaver filen, og lƦg den  //samme sted// som din NoteBrise-fil. ~TiddlySaver er en Java applet som giver dig mulighed for at gemme Ʀndringer i forskellige browsere som ikke understĆøtter at man kan gemme Ʀndringer til lokale filer.
!Andre instruktioner
*[[GrundlƦggende tilpasning]]
*[[Avanceret tilpasning]]
For at se hvordan man formaterer tekst i ~TiddlyWiki, kan du lƦse "Special formatting" sektionen af [[denne tutorial|http://www.giffmex.org/twfortherestofus.html]].
(Red.(MM)) Udover [[HurtigEdit|QuickEditToolbar]] som er indbygget i denne udgave af ~TiddlyWiki, fra starten, har jeg tilfĆøjet  wysiwyg. For at kunne bruge wysiwyg lokalt - dvs. efter du har downloadet filen til din pc, - skal du downloade [[denne zipfil|http://maans.newp.dk/fckeditor.zip]], pakke mappen ud og lƦgge mappen (ikke indholdet, men hele mappen) samme sted som du har din tiddlywiki-fil.
/***
!!!<<gradient horiz #4EB93E #fff >><<tiddler RefreshStyles>>&nbsp;StyleSheetTiddlersBar>>/%==================================================%/
***/

 .treeview, .treeview ul { 
	padding: 0;
	margin: 0;
	list-style: none;
}

.treeview ul {
	background-color:transparent;
	margin-top: 2px;
}

.treeview .hitarea {
	background: url([[treeview-gold.gif]]) -64px -25px no-repeat;
	height: 16px;
	width: 16px;
	margin-left: -16px;
	float: left;
	cursor: pointer;
}
/* fix for IE6 */
* html .hitarea {
	display: inline;
	float:none;
}

.treeview li { 
	margin: 0;
	padding: 3px 0pt 3px 16px;
}

.treeview a.selected {
	background-color: #eee;
}

#treecontrol { margin: 1em 0; display: none; }

.treeview .hover { color: red; cursor: pointer; }

.treeview li { background: url([[treeview-gold-line.gif]]) 0 0 no-repeat; }
.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }

.treeview .expandable-hitarea { background-position: -80px -3px; }

.treeview li.last { background-position: 0 -1766px }
.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url([[treeview-gold.gif]]); }  
.treeview li.lastCollapsable { background-position: 0 -111px }
.treeview li.lastExpandable { background-position: -32px -67px }

.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; }

.treeview-red li { background-image: url([[treeview-red-line.gif]]); }
.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url([[treeview-red.gif]]); } 

.treeview-gold li { background-image: url([[treeview-gold-line.gif]]); }
.treeview-gold .hitarea, .treeview-gold li.lastCollapsable, .treeview-gold li.lastExpandable { background-image: url([[treeview-gold.gif]]); } 


.treeview-black li { background-image: url([[treeview-black-line.gif]]); }
.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url([[treeview-black.gif]]); }  

.treeview-gray li { background-image: url([[treeview-gray-line.gif]]); }
.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url([[treeview-gray.gif]]); } 

.treeview-famfamfam li { background-image: url([[treeview-famfamfam-line.gif]]); }
.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url([[treeview-famfamfam.gif]]); } 


.filetree li { padding: 3px 0 2px 16px; }
.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
.filetree span.folder { background: url([[folder.gif]]) 0 0 no-repeat; }
.filetree li.expandable span.folder { background: url([[folder-closed.gif]]) 0 0 no-repeat; }
.filetree span.file { background: url([[file.gif]]) 0 0 no-repeat; }
''__De fĆølgende [[indstillinger og instruktioner|Kom i gang]] viser de fĆørste skridt i at foretage Ʀndringer i din egen kopi af dette dokument:__''
{{big{
# fƄ en kopi<br>{{normal{
Start med at hente en kopi af dette Htmldokument til din egen computer:
{{center{@@font-size:200%;line-height:120%;[[hent nu!|http://notebrise.tiddlyspot.com/download]]@@//(Klik pƄ linket og vƦlg hvor filen skal gemmes)//}}}}}}
# Ƅben din lokale kopi<br>{{normal{NƄr filen er gemt pƄ din pc, skal du lukke ''//dette//'' browser/fane vindue og ''Ƅbne den //lokale// fil du lige har gemt''.}}}
# Indstil titler og menuer<br>{{normal{Udskift indhold i [[SideTitel|SiteTitle]], [[UnderTitel|SiteSubtitle]], og [[HovedMenu|MainMenu]]}}}
# vƦlg opstartstiddlere<br>{{normal{redigĆ©r [[OpstartsTiddlere|DefaultTiddlers]] for at vƦlge hvilke tiddlere der vises ved opstart.  Den nuvƦrende indstilling er: {{block{<<wikify "{{{\n%0\n}}}\n" {{store.getTiddlerText("DefaultTiddlers")}}>>BemƦrk: {{{[tag[opstart]]}}} syntaksen inkluderer automatisk alle tiddlere som er tagget med <<tag opstart>>(hvis der er nogen).  PĆ„ denne mĆ„de kan du hurtigt tilfĆøje/fjerne individuelle tiddlere fra startvisningen blot ved at tilfĆøje/fjerne<<tag opstart>> tagget pĆ„ disse tiddlere, i stedet for, hver gang, at skulle redigere [[OpstartsTiddlere|DefaultTiddlers]] manuelt.
}}}}}}
# vƦlg typografier //(valgfrit)//<br>{{normal{Hvis det Ćønskes, kan du foretage Ʀstetiske Ʀndringer i StyleSheet som passer dig bedre}}}
# vƦlg prƦferencer //(valgfrit)//<br>{{normal{Du kan, redigere [[zzConfigOptions]] for at tilfĆøje, fjerne, eller indstille "fabriksindstillede" plugin prƦferencer (se de individuelle plugins for detaljer).  NuvƦrende indstillinger er:{{block{
<<tiddler zzConfigOptions>>}}}}}}
# fƦrdig<br>{{normal{''Det var det!''... nƄr du har gemt og genƄbnet dit dokument, er det klar til brug.}}}
}}}Ps:
!!!Hvis du vil have ~NoteStorm som hjemmeside, lƦs her:
[[Opret en hjemmeside pƄ TiddlySpot]]
!!!1. +++[Udviklingsmodellen]
[img(95%+,auto)[http://dl.getdropbox.com/u/1064531/Dansk/Udviklingsmodellen.jpg]]
PƄ det handlingsmƦssige plan kan en fortƦlling vƦre karakteristisk ved at vƦre bygget op i en rƦkke udviklingsfaser pƄ forskellige niveauer.

Langt de fleste fiktive traditionelle fortƦllinger indeholder flere af fĆølgende udviklingstrƦk:

Ā·  +++[Kompositorisk udvikling:] Man kan tale om selve kompositionens udvikling, i og med de fleste fortƦllinger strƦkker sig over et forlĆøb, der kan inddeles i en rƦkke faser, fx en indledning, en lang midterdel, hvor selve handlingen folder sig ud, og til sidst en slutning.===

Ā·  +++[Geografisk udvikling:] Rent geografisk kan der ske en udvikling i den forstand, at hovedpersonen fysisk bevƦger sig fra et sted til et andet. Det kan vƦre en 'rejse' over kortere eller lƦngere afstande, fra kĆøkkenet til sovevƦrelset, fra hjemmet til arbejdet, fra Esbjerg til Rom, fra jorden til Mars mv. - og (mĆ„ske) tilbage igen.===

Ā·  +++[Plottets udvikling:] Plottet, dvs. de hƦndelser/konflikter, der udgĆør drivkraften i en fortƦllings handling, er ofte karakteristisk ved at gennemlĆøbe fĆølgende udviklingsfaser: KonfliktprƦsentation i indledningen, konfliktoptrapning i midterdelen, konfliktlĆøsning i slutningen.===

Ā·  +++[StemningsmƦssig udvikling:] StemningsmƦssigt kan der ske en udvikling fra en harmonisk, positivt ladet atmosfƦre, over en konfliktmƦttet disharmonisk tilstand - til, i de fleste tilfƦlde, en ny afklaret harmoni i slutningen, fordi en konfliktsituation er lĆøses med lykkelig udgang til fĆølge. Det skal bemƦrkes at midterdelen meget ofte er karakteristisk ved at indeholde en vekslen mellem urolige, disharmoniske og rolige, relativt harmoniske stemninger. Dog er det disharmonien, der overordnet dominerer denne konfliktprƦgede og konfliktoptrappende fase.===

Ā·  +++[Hovedpersonens personlige udvikling:] En person kan gennemgĆ„ en personlig udviklingsproces fra begyndelsen til slutningen af fortƦllingen. FortƦllingen kan vƦre en skildring af, hvordan en person modnes, hvordan der sker erkendelsesmƦssige skred, sĆ„ han, i historiens slutfase, er blevet et 'nyt og bedre' menneske mv. ===
=== 
!!!2. +++[Kontraktmodellen]

Et typisk kompositionsprincip, der deler eventyret i tre hoveddele kan illustreres med den sƄkaldte kontraktmodel. Ideen i denne model kan sammenfattes sƄdan her:

a. +++[Oprettelse af kontrakt:] Helten/heltinden indgĆ„r en slags kontrakt eller et kontraktlignende forhold med en eller anden eller med sig selv i bestrƦbelserne pĆ„ at fĆ„ et Ćønske opfyldt eller forandre en kompliceret, uĆønsket situation.===

b. +++[Brud pĆ„ kontrakt:] Han begĆ„r imidlertid kontraktbrud, fordi han kan se en sƦrlig umiddelbar fordel herved eller fordi han, af forskellige andre grunde, mener at vƦre nĆødt til det eller simpelthen ikke kan lade vƦre. Det medfĆører en rƦkke besvƦrlige konsekvenser: personen mĆ„ gennemgĆ„ forskellige prĆøvelser, som bĆ„de kan handle om at overvinde konkrete forhindringer eller bestĆ„ i "at overvinde sig selv".===

c. +++[Genetablering af kontrakt:] Hvis helten klarer strabadserne, hvis han lĆøser konflikterne tilfredsstillende gĆør han sig fortjent til at indgĆ„ en ny kontrakt. Han kan igen blive "en del af samfundet", igen blive socialt integreret.===

Det med at indgĆ„ en kontrakt eller et kontraktlignende forhold kan bĆ„de forstĆ„s ret konkret pĆ„ den mĆ„de, at fx soldaten i H.C. Andersens eventyr "FyrtĆøiet" indgĆ„r en aftale med heksen om at hente et fyrtĆøj til hende i det hule trƦ.

Det kan ogsƄ forstƄs i en mere "luftig" betydning, som nƄr det omgivende samfund og nƦrmeste familie har nogle forventninger (en underforstƄet aftale) om, at Klodshans, i eventyret af samme navn, bliver pƄ sin plads og ikke begiver sig ud pƄ eventyr. For det er han simpelthen for "klodshanset" til. NƄr han sƄ alligevel vƦlger at trodse omverdenens normer for at vinde prinsessen, sƄ bryder han i princippet en kontrakt, som genetableres i ny udformning, nƄr han fƄr prinsessen i enden.

At en sƄdan struktur (altsƄ oprettelse af kontrakt, brud pƄ kontrakt og genoprettelse af kontrakt) er typisk for mange eventyr, pƄviste sprogforskeren A.J. Greimas (1917-1992), der i 1960'erne fortsatte et forskningsarbejde, som var pƄbegyndt af russeren Vladimir JƔkolevic Propp (1895-1970) i 1920'erne.

Den kan illustreres med fĆølgende model, som netop kaldes "kontraktmodellen": 
[img(100%+,auto)[http://dl.getdropbox.com/u/1064531/Dansk/Kontraktmodellen.jpg]]

===<br>
Hentet fra: http://www.vognstoft.dk/danskopg/De%20gale/Komposition.doc
<html><div align="center"><iframe src="http://dl.getdropbox.com/u/1064531/mailsignaturMMs.html" frameborder="0" width="100%" height="200"></iframe></div></html><script>
/*<![CDATA[*/

/***********************************************
* Encrypt Email script- Please keep notice intact
* Tool URL: http://www.dynamicdrive.com/emailriddler/
* **********************************************/
<!-- Encrypted version of: humamamm [at] *****.*** //-->

var emailriddlerarray=[104,117,109,97,109,97,109,109,64,103,109,97,105,108,46,99,111,109]
var encryptedemail_id12='' //variable to contain encrypted email 
for (var i=0; i<emailriddlerarray.length; i++)
 encryptedemail_id12+=String.fromCharCode(emailriddlerarray[i])

document.write('<a href="mailto:'+encryptedemail_id12+'?subject=Send mail til MĆ„ns">Mail</a>')

/*]]>*/
</script>
For at komme i gang med denne tomme tiddlywiki, skal du Ʀndre pĆ„ de fĆølgende tiddlere:
* SiteTitle & SiteSubtitle: Sidens titel og undertitel, som vist Ćøverst (efter de er gemt, vil de ogsĆ„ vise sig i browserens titelmenu)
* MainMenu: er hovedmenuen (er oftest placeret til venstre)
* DefaultTiddlers: Indeholder navnene pƄ de tiddlere du vil have skal starte op nƄr du Ƅbner TiddlyWiki
Du skal ogsƄ skrive dit brugernavn for at signere dine redigeringer: <<option txtUserName>>
Opret en bruger pƄ [[Voicethread.com|http://voicethread.com]] for at kunne kommentere og oprette Voicethreads -~~ (Ƅbnes her i siden)~~.
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''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|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
Dette er en ''MEGET'' hurtig note
{{left{{{nowrap{
<<tiddler HjemKnap>>
<<forEachTiddler where 'tiddler.tags.contains("Emner")' write
 '"<<tiddler EmnerTemplate1 with: [["+tiddler.title+"]]$))"'>>}}}}}}
----
{{center{
[[Tak til ... & licens]]
[[Kontakt MĆ„ns]]
[[Download|http://notebrise.tiddlyspot.com/download]]
<script>
/*
 * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
 * 
 * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
 * http://docs.jquery.com/Plugins/Treeview
 *
 * Copyright (c) 2007 JƃĀ¶rn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
 *
 */


;(function($) {

	$.extend($.fn, {
		swapClass: function(c1, c2) {
			var c1Elements = this.filter('.' + c1);
			this.filter('.' + c2).removeClass(c2).addClass(c1);
			c1Elements.removeClass(c1).addClass(c2);
			return this;
		},
		replaceClass: function(c1, c2) {
			return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
		},
		hoverClass: function(className) {
			className = className || "hover";
			return this.hover(function() {
				$(this).addClass(className);
			}, function() {
				$(this).removeClass(className);
			});
		},
		heightToggle: function(animated, callback) {
			animated ?
				this.animate({ height: "toggle" }, animated, callback) :
				this.each(function(){
					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
					if(callback)
						callback.apply(this, arguments);
				});
		},
		heightHide: function(animated, callback) {
			if (animated) {
				this.animate({ height: "hide" }, animated, callback);
			} else {
				this.hide();
				if (callback)
					this.each(callback);				
			}
		},
		prepareBranches: function(settings) {
			if (!settings.prerendered) {
				// mark last tree items
				this.filter(":last-child:not(ul)").addClass(CLASSES.last);
				// collapse whole tree, or only those marked as closed, anyway except those marked as open
				this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide();
			}
			// return all items with sublists
			return this.filter(":has(>ul)");
		},
		applyClasses: function(settings, toggler) {
			this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event) {
				toggler.apply($(this).next());
			}).add( $("a", this) ).hoverClass();
			
			if (!settings.prerendered) {
				// handle closed ones first
				this.filter(":has(>ul:hidden)")
						.addClass(CLASSES.expandable)
						.replaceClass(CLASSES.last, CLASSES.lastExpandable);
						
				// handle open ones
				this.not(":has(>ul:hidden)")
						.addClass(CLASSES.collapsable)
						.replaceClass(CLASSES.last, CLASSES.lastCollapsable);
						
	            // create hitarea
				this.prepend("<div class=\"" + CLASSES.hitarea + "\"/>").find("div." + CLASSES.hitarea).each(function() {
					var classes = "";
					$.each($(this).parent().attr("class").split(" "), function() {
						classes += this + "-hitarea ";
					});
					$(this).addClass( classes );
				});
			}
			
			// apply event to hitarea
			this.find("div." + CLASSES.hitarea).click( toggler );
		},
		treeview: function(settings) {
			
			settings = $.extend({
				cookieId: "treeview"
			}, settings);
			
			if (settings.add) {
				return this.trigger("add", [settings.add]);
			}
			
			if ( settings.toggle ) {
				var callback = settings.toggle;
				settings.toggle = function() {
					return callback.apply($(this).parent()[0], arguments);
				};
			}
		
			// factory for treecontroller
			function treeController(tree, control) {
				// factory for click handlers
				function handler(filter) {
					return function() {
						// reuse toggle event handler, applying the elements to toggle
						// start searching for all hitareas
						toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() {
							// for plain toggle, no filter is provided, otherwise we need to check the parent element
							return filter ? $(this).parent("." + filter).length : true;
						}) );
						return false;
					};
				}
				// click on first element to collapse tree
				$("a:eq(0)", control).click( handler(CLASSES.collapsable) );
				// click on second to expand tree
				$("a:eq(1)", control).click( handler(CLASSES.expandable) );
				// click on third to toggle tree
				$("a:eq(2)", control).click( handler() ); 
			}
		
			// handle toggle event
			function toggler() {
				$(this)
					.parent()
					// swap classes for hitarea
					.find(">.hitarea")
						.swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
						.swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
					.end()
					// swap classes for parent li
					.swapClass( CLASSES.collapsable, CLASSES.expandable )
					.swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
					// find child lists
					.find( ">ul" )
					// toggle them
					.heightToggle( settings.animated, settings.toggle );
				if ( settings.unique ) {
					$(this).parent()
						.siblings()
						// swap classes for hitarea
						.find(">.hitarea")
							.replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
							.replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
						.end()
						.replaceClass( CLASSES.collapsable, CLASSES.expandable )
						.replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
						.find( ">ul" )
						.heightHide( settings.animated, settings.toggle );
				}
			}
			
			function serialize() {
				function binary(arg) {
					return arg ? 1 : 0;
				}
				var data = [];
				branches.each(function(i, e) {
					data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0;
				});
				$.cookie(settings.cookieId, data.join("") );
			}
			
			function deserialize() {
				var stored = $.cookie(settings.cookieId);
				if ( stored ) {
					var data = stored.split("");
					branches.each(function(i, e) {
						$(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ]();
					});
				}
			}
			
			// add treeview class to activate styles
			this.addClass("treeview");
			
			// prepare branches and find all tree items with child lists
			var branches = this.find("li").prepareBranches(settings);
			
			switch(settings.persist) {
			case "cookie":
				var toggleCallback = settings.toggle;
				settings.toggle = function() {
					serialize();
					if (toggleCallback) {
						toggleCallback.apply(this, arguments);
					}
				};
				deserialize();
				break;
			case "location":
				var current = this.find("a").filter(function() { return this.href.toLowerCase() == location.href.toLowerCase(); });
				if ( current.length ) {
					current.addClass("selected").parents("ul, li").add( current.next() ).show();
				}
				break;
			}
			
			branches.applyClasses(settings, toggler);
				
			// if control option is set, create the treecontroller and show it
			if ( settings.control ) {
				treeController(this, settings.control);
				$(settings.control).show();
			}
			
			return this.bind("add", function(event, branches) {
				$(branches).prev()
					.removeClass(CLASSES.last)
					.removeClass(CLASSES.lastCollapsable)
					.removeClass(CLASSES.lastExpandable)
				.find(">.hitarea")
					.removeClass(CLASSES.lastCollapsableHitarea)
					.removeClass(CLASSES.lastExpandableHitarea);
				$(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, toggler);
			});
		}
	});



	// classes used by the plugin
	// need to be styled via external stylesheet, see first example
	var CLASSES = $.fn.treeview.classes = {
		open: "open",
		closed: "closed",
		expandable: "expandable",
		expandableHitarea: "expandable-hitarea",
		lastExpandableHitarea: "lastExpandable-hitarea",
		collapsable: "collapsable",
		collapsableHitarea: "collapsable-hitarea",
		lastCollapsableHitarea: "lastCollapsable-hitarea",
		lastCollapsable: "lastCollapsable",
		lastExpandable: "lastExpandable",
		last: "last",
		hitarea: "hitarea"
	};
	
	// provide backwards compability
	$.fn.Treeview = $.fn.treeview;


	
})(jQuery);
</script>



<script>
var sc_project=4838317; 
var sc_invisible=1; 
var sc_partition=56; 
var sc_click_stat=1; 
var sc_security="9ff8d9d0"; 
</script>

/%
|Name|MicroBrowser|
|Source|http://www.TiddlyTools.com/#MicroBrowser|
|Version|1.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Type|html|
|Description|simplified browser-in-browser with bookmarks|

Usage:	<<tiddler MicroBrowser with: TiddlerName>>
where TiddlerName (optional) contains an HR-separated
list of bookmarks (1st line=list text, 2nd line=URL)

Note: for full browser-in-browser features, including support
for embedded video and flash players, see [[MiniBrowserPlugin]]

%/<html><style>#tiddlerMicroBrowser .tagged {display:none;}</style>
<form style='display:block;margin:0;padding:0;white-space:nowrap;' onsubmit='return false;'><!--
	--><input type='button' value='<' title='back' style='width:3%'
		onclick='try{this.form.nextSibling.history.go(-1)}catch(e){window.history.go(-1)}'><!--
	--><input type='button' value='>' title='forward' style='width:3%'
		onclick='try{this.form.nextSibling.history.go(+1)}catch(e){window.history.go(+1)}'><!--
	--><input type='button' value='+' title='refresh'style='width:3%'
		onclick='try{this.form.nextSibling.location.reload()}catch(e){;}'><!--
	--><input type='button' value='x' title='stop'style='width:3%'
		onclick='window.stop()'><!--
	--><select name='bookmarks' size='1' style='width:25%'
		onchange='this.form.url.value=this.value; this.form.go.click();'><!--
	--><option value=''>bookmarks...</option><!--
	--></select><!--
	--><input type='button' value='edit' title='edit the bookmarks list' style='width:6%'
		onclick='story.displayTiddler(null,this.form.bookmarks.getAttribute("tiddler"),2)'><!--
	--><input type='text' name='url' size='60' value='' style='width:38%'
		onfocus='this.select()'><!--
	--><input type='button' value='go' name='go' title='view URL' style='width:6%'
		onclick="var f=this.form; var i=this.form.nextSibling;
			var u=f.url.value.trim(); if (!u.length) u=f.url.value=f.bookmarks.value.trim();
			if (u.length) { f.done.disabled=false; i.style.display='block'; i.src=u; }
			else { f.done.disabled=true; i.style.display='none'; i.src=''; }
		"><!--
	--><input type='button' value='open' title='open a separate tab/window' style='width:6%'
		onclick='if (this.form.url.value.length) window.open(this.form.url.value)'><!--
	--><input type='button' value='done' name='done' disabled title='disconnect from URL' style='width:6%'
		onclick="this.form.done.disabled=true; var i=this.form.nextSibling; i.style.display='none'; i.src='';"><!--
	--></div></form><iframe src='' width='100%' height='480' 
		style='display:none;background:#fff;border:1px solid;'></iframe>
<hide linebreaks></html><<tiddler {{
	var list=place.lastChild.getElementsByTagName('form')[0].bookmarks;
	while (list.options[1]) list.options[1]=null;
	var tid='$1'; if (tid=='$'+'1') tid='MiniBrowserList';
	list.setAttribute('tiddler',tid);
	var parts=store.getTiddlerText(tid,'').split('\n----\n');
	for (var p=0; p<parts.length; p++) {
		var lines=parts[p].split('\n');
		var label=lines.shift()||''; // 1st line=display text
		var value=lines.shift()||''; // 2nd line=item value
		var indent=value&&value.length?'\xa0\xa0':'';
		list.options[list.length]=new Option(indent+label,value);
	}
''}}>>
Help:

----
TiddlyWiki.org Wiki
http://tiddlywiki.org/wiki/Main_Page
----
Q&A Google Group
http://groups.google.at/group/TiddlyWiki?lnk=srg&hl=de
----
TiddlerToddler
http://tiddlertoddler.tiddlyspot.com/
----
TiddlyWiki Tips
http://tiddlywikitips.com/
----
TiddlyWiki Tutorial - the basics
http://www.blogjones.com/TiddlyWikiTutorial.html
----
TiddlyWiki Guides
http://tiddlywikiguides.org/
----
TiddlyWiki for the rest of us
http://www.giffmex.org/twfortherestofus.html
----
TiddlyWiki Help - a comprehensive guide
http://twhelp.tiddlyspot.com/
----
Questions and Answers on TiddlyWiki
http://twfaq.tiddlyspot.com/
----
Themes:

----
Changing Themes
http://change.tiddlyspot.com
----
MenuFlex
http://menuflex.tiddlyspot.com
----
TiddlyDesktop
http://tiddlyhome.bidix.info/desk
----
<html><div align="center"><iframe src="http://notebrise2.tiddlyspot.com/" frameborder="0" width="100%" height="800"></iframe></div></html>
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.9|
|Author|Eric Shulman|
|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||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.11.15 - 2.4.9 in adjustNestedSlider(), don't make adjustments if panel is marked as 'undocked' (CSS class).  In onClickNestedSlider(), SHIFT-CLICK docks panel (see [[MoveablePanelPlugin]])
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release.  Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
<<<
!!!!!Code
***/
//{{{
version.extensions.NestedSlidersPlugin= {major: 2, minor: 4, revision: 9, date: new Date(2008,11,15)};

// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkFloatingSlidersAnimate===undefined)
	config.options.chkFloatingSlidersAnimate=false; // avoid clipping problems in IE

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");

// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\@\\[\\>]*\\^)?)?(\\*)?(\\@)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
	handler: function(w)
		{
			lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
				var defopen=lookaheadMatch[1];
				var cookiename=lookaheadMatch[2];
				var header=lookaheadMatch[3];
				var panelwidth=lookaheadMatch[4];
				var transient=lookaheadMatch[5];
				var hover=lookaheadMatch[6];
				var buttonClass=lookaheadMatch[7];
				var label=lookaheadMatch[8];
				var openlabel=lookaheadMatch[9];
				var panelID=lookaheadMatch[10];
				var blockquote=lookaheadMatch[11];
				var deferred=lookaheadMatch[12];

				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey, no alternate text/tip
				var show="none"; var cookie=""; var key="";
				var closedtext=">"; var closedtip="";
				var openedtext="<"; var openedtip="";

				// extra "+", default to open
				if (defopen) show="block";

				// cookie, use saved open/closed state
				if (cookiename) {
					cookie=cookiename.trim().slice(1,-1);
					cookie="chkSlider"+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }
					show=config.options[cookie]?"block":"none";
				}

				// parse label/tooltip/accesskey: [label=X|tooltip]
				if (label) {
					var parts=label.trim().slice(1,-1).split("|");
					closedtext=parts.shift();
					if (closedtext.substr(closedtext.length-2,1)=="=")	
						{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
					openedtext=closedtext;
					if (parts.length) closedtip=openedtip=parts.join("|");
					else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
				}

				// parse alternate label/tooltip: [label|tooltip]
				if (openlabel) {
					var parts=openlabel.trim().slice(1,-1).split("|");
					openedtext=parts.shift();
					if (parts.length) openedtip=parts.join("|");
					else openedtip="hide "+openedtext;
				}

				var title=show=='block'?openedtext:closedtext;
				var tooltip=show=='block'?openedtip:closedtip;

				// create the button
				if (header) { // use "Hn" header format instead of button/link
					var lvl=(header.length>5)?5:header.length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,buttonClass,title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute("href","javascript:;");
					btn.setAttribute("title",tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,buttonClass);
				btn.innerHTML=title; // enables use of HTML entities in label

				// set extra button attributes
				btn.setAttribute("closedtext",closedtext);
				btn.setAttribute("closedtip",closedtip);
				btn.setAttribute("openedtext",openedtext);
				btn.setAttribute("openedtip",openedtip);
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=defopen!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				}
				btn.setAttribute("hover",hover?"true":"false");
				btn.onmouseover=function(ev) {
					// optional 'open on hover' handling
					if (this.getAttribute("hover")=="true" && this.sliderPanel.style.display=='none') {
						document.onclick.call(document,ev); // close transients
						onClickNestedSlider(ev); // open this slider
					}
					// mouseover on button aligns floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel);
				}

				// create slider panel
				var panelClass=panelwidth?"floatingPanel":"sliderPanel";
				if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
				var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
				panel.defaultPanelWidth=(panelwidth && panelwidth.length>2)?panelwidth.slice(1,-1):"";
				panel.setAttribute("transient",transient=="*"?"true":"false");
				panel.style.display = show;
				panel.style.width=panel.defaultPanelWidth;
				panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this); }

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!deferred) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					w.subWikify(blockquote?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
					// align floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel);
				}
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					panel.setAttribute("raw",src.substr(0,endpos));
					panel.setAttribute("blockquote",blockquote?"true":"false");
					panel.setAttribute("rendered","false");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
				}
			}
		}
	}
)

function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	while (theTarget && theTarget.sliderPanel==undefined) theTarget=theTarget.parentNode;
	if (!theTarget) return false;
	var theSlider = theTarget.sliderPanel;
	var isOpen = theSlider.style.display!="none";

	// if SHIFT-CLICK, dock panel first (see [[MoveablePanelPlugin]])
	if (e.shiftKey && config.macros.moveablePanel) config.macros.moveablePanel.dock(theSlider,e);

	// toggle label
	theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
	// toggle tooltip
	theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));

	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
			place=createTiddlyElement(place,"blockquote");
		wikify(theSlider.getAttribute("raw"),place);
		theSlider.setAttribute("rendered","true");
	}

	// show/hide the slider
	if(config.options.chkAnimate && (!hasClass(theSlider,'floatingPanel') || config.options.chkFloatingSlidersAnimate))
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		theSlider.style.display = isOpen ? "none" : "block";

	// reset to default width (might have been changed via plugin code)
	theSlider.style.width=theSlider.defaultPanelWidth;

	// align floater panel position with target button
	if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider);

	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
				{ try{ ctrls[c].focus(); } catch(err){;} break; }
		}
	}
	var cookie=theTarget.sliderCookie;
	if (cookie && cookie.length) {
		config.options[cookie]=!isOpen;
		if (config.options[cookie]!=theTarget.defOpen) window.saveOptionCookie(cookie);
		else window.removeCookie(cookie); // remove cookie if slider is in default display state
	}

	// prevent SHIFT-CLICK from being processed by browser (opens blank window... yuck!)
	// prevent clicks *within* a slider button from being processed by browser
	// but allow plain click to bubble up to page background (to close transients, if any)
	if (e.shiftKey || theTarget!=resolveTarget(e))
		{ e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); }
	Popup.remove(); // close open popup (if any)
	return false;
}
//}}}
//{{{
// click in document background closes transient panels 
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);

	if (document.nestedSliders_savedOnClick)
		var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
	// if click was inside a popup... leave transient panels alone
	var p=target; while (p) if (hasClass(p,"popup")) break; else p=p.parentNode;
	if (p) return retval;
	// if click was inside transient panel (or something contained by a transient panel), leave it alone
	var p=target; while (p) {
		if ((hasClass(p,"floatingPanel")||hasClass(p,"sliderPanel"))&&p.getAttribute("transient")=="true") break;
		p=p.parentNode;
	}
	if (p) return retval;
	// otherwise, find and close all transient panels...
	var all=document.all?document.all:document.getElementsByTagName("DIV");
	for (var i=0; i<all.length; i++) {
		 // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
		if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
		// otherwise, if the panel is currently visible, close it by clicking it's button
		if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button})
		if (!hasClass(all[i],"floatingPanel")&&!hasClass(all[i],"sliderPanel")) all[i].style.display="none";
	}
	return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel) {
	if (hasClass(panel,"floatingPanel") && !hasClass(panel,"undocked")) {
		// see [[MoveablePanelPlugin]] for use of 'undocked'
		var rightEdge=document.body.offsetWidth-1;
		var panelWidth=panel.offsetWidth;
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position=="relative" && findPosX(btn)+panelWidth>rightEdge) {
			left-=findPosX(btn)+panelWidth-rightEdge; // shift panel relative to button
			if (findPosX(btn)+left<0) left=-findPosX(btn); // stay within left edge
		}
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && !hasClass(p,'floatingPanel')) p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
			if (left+panelWidth>rightEdge) left=rightEdge-panelWidth;
			if (left<0) left=0;
		}
		panel.style.left=left+"px"; panel.style.top=top+"px";
	}
}
//}}}
//{{{
// TW2.1 and earlier:
// hijack Slider stop handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
	{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }

// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
	Morpher.prototype.coreStop = Morpher.prototype.stop;
	Morpher.prototype.stop = function() {
		this.coreStop.apply(this,arguments);
		var e=this.element;
		if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
			// adjust panel overflow and position after animation
			e.style.overflow = "visible";
			if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
		}
	};
}
//}}}
/***
''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''
^^author: Eric Shulman
source: http://www.TiddlyTools.com/#NestedSlidersPlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^

Quickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content.  Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''

You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created.  This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.

For more details, please click on a section headline below:
++++!!!!![Configuration]>
Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
===
++++!!!!![Usage]>
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content.  Use {{{+++}}} and {{{===}}} to delimit the slider content.  Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*mouse auto rollover
*custom label/tooltip/accesskey
*automatic blockquote
*deferred rendering
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*[label=key|tooltip]>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^
marks the start and end of the slider definition, respectively.  When the extra {{{+}}} is used, the slider will be open when initially displayed.^^
* {{{(cookiename)}}}^^
saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^
* {{{!}}} through {{{!!!!!}}}^^
displays the slider label using a formatted headline (Hn) style instead of a button/link style^^
* {{{^width^}}} (or just {{{^}}})^^
makes the slider 'float' on top of other content rather than shifting that content downward.  'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.).  If omitted, the default width is "auto" (i.e., fit to content)^^
* {{{*}}}^^
automatically opens/closes slider on "rollover" as well as when clicked^^
* {{{[label=key|tooltip]}}}^^
uses custom label/tooltip/accesskey.  {{{=key}}} and {{{|tooltip}}} are optional.  'key' is must be a ''single letter only''.  Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^
* {{{">"}}} //(without the quotes)//^^
automatically adds blockquote formatting to slider content^^
* {{{"..."}}} //(without the quotes)//^^
defers rendering of closed sliders until the first time they are opened.  //Note: deferred rendering may produce unexpected results in some cases.  Use with care.//^^

//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//
===
++++!!!!![Examples]>
simple in-line slider: 
{{{
+++
   content
===
}}}
+++
   content
===
----
use a custom label and tooltip: 
{{{
+++[label|tooltip]
   content
===
}}}
+++[label|tooltip]
   content
===
----
content automatically blockquoted: 
{{{
+++>
   content
===
}}}
+++>
   content
===
----
all options combined //(default open, cookie, heading, sized floater, rollover, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...
   content
===
}}}
++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...
   content
===
----
complex nesting example:
{{{
+++^[get info...=I|click for information or press Alt-I]
   put some general information here, plus a floating slider with more specific info:
   +++^10em^[view details...|click for details]
      put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
   ===
===
}}}
+++^[get info...=I|click for information or press Alt-I]
   put some general information here, plus a floating slider with more specific info:
   +++^10em^[view details...|click for details]
      put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
   ===
===
----
nested floaters
>menu: <<tiddler NestedSlidersExample>>
(see [[NestedSlidersExample]] for definition)
----
===
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label
''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element
''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position
''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie
''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)
''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals
''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin.  This lets other plugins 'hijack' the function even when they are loaded first.
''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels.  While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels.  Short-term workaround is to only adjust the position for 'top-level' floaters.
''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to.  Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels.  Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.
''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)
''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element.  (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)
''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders
removed checkbox option for 'global' application of lazy sliders
''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)
''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability.  Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.
''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state
''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style
''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other
formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines
''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin
more documentation
''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}
tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax
''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used
code cleanup, added documentation
''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}
changed name to EasySlidersPlugin
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 1, minor: 9, revision: 0, date: new Date(2006,5,11)};
//}}}

//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}

//{{{
config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(\\[[^\\]]*\\])?(\\>)?(\\.\\.\\.)?\\s*",
	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)
			{
				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey
				var show="none"; var title="  ā–ŗ"; var tooltip="show"; var cookie=""; var key="";

				// extra "+", default to open
				if (lookaheadMatch[1])
					{ show="block"; title="ā—„"; tooltip="hide"; }

				// cookie, use saved open/closed state
				if (lookaheadMatch[2]) {
					cookie=lookaheadMatch[2].trim().slice(1,-1);
					cookie="chkSlider"+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }
					if (config.options[cookie])
						{ show="block"; title="ā—„"; tooltip="hide"; }
					else
						{ show="none"; title="  ā–ŗ"; tooltip="show"; }
				}

				// parse custom label/tooltip/accesskey: [label=X|tooltip]
				if (lookaheadMatch[6]) {
					title = lookaheadMatch[6].trim().slice(1,-1);
					var pos=title.indexOf("|");
					if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }
					if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }
					if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"
				}

				// create the button
				if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
					var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,null,title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute("href","javascript:;");
					btn.setAttribute("title",tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider);
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				}

				// "non-click" MouseOver open/close slider
				if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;

				// create slider panel
				var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
				var panel=createTiddlyElement(place,"div",null,panelClass,null);
				panel.style.display = show;
				if (lookaheadMatch[4] && lookaheadMatch[4].length>2) panel.style.width=lookaheadMatch[4].slice(1,-1); // custom width
				panel.button = btn; // so the slider panel know which button it belongs to
				btn.sliderPanel=panel;

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!lookaheadMatch[8]) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					w.subWikify(lookaheadMatch[7]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
					// align slider/floater position with button
					adjustSliderPos(place,btn,panel,panelClass);
				}
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					panel.setAttribute("raw",src.substr(0,endpos));
					panel.setAttribute("blockquote",lookaheadMatch[7]?"true":"false");
					panel.setAttribute("rendered","false");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
					if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
				}
			}
		}
	}
)

// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
//}}}

//{{{
window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	var theLabel = theTarget.firstChild.data;
	var theSlider = theTarget.sliderPanel
	var isOpen = theSlider.style.display!="none";
	// if using default button labels, toggle labels
	if (theLabel==">") theTarget.firstChild.data = "ā—„";
	else if (theLabel=="<") theTarget.firstChild.data = "ā–ŗ";
	// if using default tooltips, toggle tooltips
	if (theTarget.getAttribute("title")=="show")
		theTarget.setAttribute("title","hide");
	else if (theTarget.getAttribute("title")=="hide")
		theTarget.setAttribute("title","show");
	if (theTarget.getAttribute("title")=="show "+theLabel)
		theTarget.setAttribute("title","hide "+theLabel);
	else if (theTarget.getAttribute("title")=="hide "+theLabel)
		theTarget.setAttribute("title","show "+theLabel);
	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		if (config.options.chkDebugLazySliderRender)
			alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
			place=createTiddlyElement(place,"blockquote");
		wikify(theSlider.getAttribute("raw"),place);
		theSlider.setAttribute("rendered","true");
	}
	// show/hide the slider
	if(config.options.chkAnimate)
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		theSlider.style.display = isOpen ? "none" : "block";
	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if (t=="input" || t=="textarea" || t=="select")
				{ ctrls[c].focus(); break; }
		}
	}
	if (this.sliderCookie && this.sliderCookie.length)
		{ config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }
	// align slider/floater position with target button
	adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
	return false;
}

// hijack animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }

// adjust panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
	if (panelClass=="floatingPanel") {
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
		}
		if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;
		panel.style.left=left+"px"; panel.style.top=top+"px";
	}
}

function getWindowWidth() {
	if(document.width!=undefined)
		return document.width; // moz (FF)
	if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		return document.documentElement.clientWidth; // IE6
	if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		return document.body.clientWidth; // IE4
	if(window.innerWidth!=undefined)
		return window.innerWidth; // IE - general
	return 0; // unknown
}
//}}}
<<formTiddler NewBibEntryTemplate>>
<html> 
<table> 
<tr> 
<td align="right"><b>[[Forfatter|Efter forfatter]]:</b></td>
 <td colspan="3"><input name=author type=text style="width:100%" /></td></tr>
 <tr>
 <td align="right"><b>[[Titel|Efter titel]]:</b></td>
 <td colspan="3"><span class macro='edit title'> </td></tr>
 <tr>
 <td align="right"><b>Data:</b></td>
 <td colspan="3"><input name=bibdata type=text style="width:100%" /></td></tr>
 <tr>
 <td align="right"><b>[[Tema|Efter tema]]:</b></td>
 <td colspan="3"><input name=primtopic type=text style="width:100%" /></td></tr>
<tr>
 <td align="right"><b><<tiddler TilElevFraBog>>:</b></td>
 <td colspan="3"><input name=wherekept type=text style="width:100%" /></td></tr>
</span></table> </html>
/***
|Name|NewDocumentPlugin ''packed''|
|Source|http://www.TiddlyTools.com/#NewDocumentPlugin|
|Version|1.8.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Description|create new TiddlyWiki documents and/or HTML snapshots from your existing document, with just one click|
***/
//{{{
eval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c/62)))+((c=c%62)<36?c.toString(36):String.fromCharCode(c+29))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'\\w{1,2}'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('version.extensions.R={major:1,minor:8,revision:0,date:M Date(2008,4,20)};G.13.R={1L:"M 7",1C:"1v a M 12 \'starter\' 7",Y:"M.J",V:"all",1e:"save as...",1X:"Save 1p 12 X a different P",15:"1F",1B:"snap",1u:"create a L",1N:"1v a \'L\' of 1G 1p 12 display",1K:"L.J",6:"contentWrapper",1k:"1j 1i a DOM 1g ID S 1G desired content",1d:"Unrecognized 7 1g ID: \'%0\'",H:"ask",1V:"here",W:"1S",1Q:"Z",K:"label:",O:"10:",1o:"1j 1i a filename",E:"includeNew",1E:"Match one or more Q:\\n(space-separated, use [[...]] around Q containing spaces)",filtererrmsg:"Error in tag E \'%0\'",1n:"Document L 1M X %1",1J:"%0 tiddlers 1M X %1",1U:"An error occurred while creating %0"};G.13.R.handler=1h(a,b,c){2 d=U(7.T.1b);2 e=d.C("/");3(e==-1){e=d.C("\\\\")}3(e!=-1){d=d.A(0,e+1)}3(c[0]&&c[0].A(0,5.K.9)==5.K){2 f=c.D().A(5.K.9)}3(c[0]&&c[0].A(0,5.O.9)==5.O){2 z=c.D().A(5.O.9)}2 g=c.D();3(!g){g=5.Y}3(c[0]==5.1B||c[0]==5.15){2 h=(c[0]==5.15);c.D();3(!f){2 f=5.1u}3(!z){2 z=5.1N}2 i=5.1K;2 j=c[0]&&c[0].1W()==5.1Q.1W();3(j){c.D()}2 k=5.6;3(c[0]){2 k=c.D()}}3(c[0]==5.V){3(!f){2 f=5.1e}3(!z){2 z=5.1X}2 i=U(7.T.1b);2 e=i.C("/");3(e==-1){e=i.C("\\\\")}3(e!=-1){i=i.A(e+1)}}3(!z){2 z=5.1C}3(!f){2 f=5.1L}3(!i){2 i=5.Y}2 l=createTiddlyButton(a,f,z,1l);l.19=d;l.P=g;l.1T=i;l.6=k;l.Z=j;l.1R=h;l.E=c.9?c:[5.E]};1c.1l=1h(e){3(!e){2 e=1c.event}2 a=resolveTarget(e);2 b=G.13.R;2 c=b.1J;2 d=b.1U;2 f=0;2 g="";3(a.6){2 h=7.1P(a.6);3(a.6==b.H){6=10(b.1k,b.6);2 h=7.1P(6);3(!h){3(6){1O(b.1d.I([6]))}e.1a=18;3(e.F){e.F()}B(17)}}16{3(a.6==b.1V||a.6==b.W){2 h=story.findContainingTiddler(a);3(h&&a.6==b.W){2 j=h.1m("*");S(2 i=0;i<j.9;i++){3(hasClass(j[i],"1S")){h=j[i];break}}}3(!h){e.1a=18;3(e.F){e.F()}B(17)}}}g+="<J>\\n";3(!a.Z){g+="<1H>\\n";2 k=7.1m("14");S(2 i=0;i<k.9;i++){g+="<14>\\n";g+="/* stylesheet from tiddler:"+k[i].getAttribute("id")+" */\\n";g+=k[i].1A+"\\n\\n";g+="</14>\\n"}g+="</1H>\\n"}g+="<1z>\\n\\n"+h.1A+"\\n\\n</1z>\\n";g+="</J>";c=b.1n}16{2 l=U(7.T.1b);2 m=loadFile(l);3(m==1x){1w(G.1q.cantSaveError);B 1x}m=N(m,"1t-1r");m=N(m,"1s-1r");m=N(m,"1t-1D");m=N(m,"1s-1D");2 n=m.indexOf(1y);2 o=m.C(endSaveArea);3((n==-1)||(o==-1)){1w(G.1q.invalidFileError.I([l]));B}2 p=a.E;3(p[0]==b.H){2 q=10(b.1E,b.E);3(!q){B}p=q.readMacroParams()}2 r=[];2 s=11.getTiddlers("title");S(2 i=0;i<s.9;i++){3(p[0]==b.V||(s[i].Q&&s[i].Q.containsAny(p))){r.push(11.getSaver().externalizeTiddler(11,s[i]))}}g+=m.A(0,n+1y.9);g+=convertUnicodeToUTF8(r.join("\\n"))+"\\n\\t\\t";g+=m.A(o);f=r.9}3(a.1R){2 t=1c.1I("","_1","");t.7.1I();t.7.writeln(g);t.7.close();t.focus();t.1F()}16{2 u=a.P;3(u==b.H){u=promptForFilename(b.1o,a.19,a.1T)}3(!u){B}2 v=u.C("/");3(v==-1){v=u.C("\\\\")}3(v==-1){u=a.19+u}2 w=saveFile(u,g);2 x=w?c.I([f,u]):d.I([u]);2 y=w?"P:///"+u.replace(/\\\\/g,"/"):"";clearMessage();1O(x,y)}e.1a=18;3(e.F){e.F()}B(17)};',[],122,'||var|if||this|snapID|document||length||||||||||||||||||||||||||_0|substr|return|lastIndexOf|shift|filter|stopPropagation|config|askparam|format|html|labelparam|snapshot|new|updateMarkupBlock|promptparam|file|tags|newDocument|for|location|getLocalPath|allparam|viewerparam|to|newdefault|noCSS|prompt|store|TiddlyWiki|macros|style|printparam|else|false|true|path|cancelBubble|href|window|snapIDerrmsg|saveaslabel||element|function|enter|Please|snapIDprompt|onClickNewDocument|getElementsByTagName|snapmsg|fileprompt|current|messages|HEAD|POST|PRE|snaplabel|Create|alert|null|startSaveArea|body|innerHTML|snapparam|newprompt|BODY|filterprompt|print|the|head|open|okmsg|snapdefault|newlabel|written|snapprompt|displayMessage|getElementById|noCSSparam|printmode|viewer|defaultfile|failmsg|hereparam|toLowerCase|saveasprompt'.split('|'),0,{}))
//}}}
//{{{
function promptForFilename(a,b,c){if(window.Components){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");var d=window.Components.interfaces.nsIFilePicker;var f=Components.classes["@mozilla.org/filepicker;1"].createInstance(d);f.init(window,a,d.modeSave);var g=Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);g.initWithPath(b);f.displayDirectory=g;f.defaultExtension="html";f.defaultString=c;f.appendFilters(d.filterAll|d.filterText|d.filterHTML);if(f.show()!=d.returnCancel){var h=f.file.persistentDescriptor}}catch(e){alert("error during local file access: "+e.toString())}}else{try{var s=new ActiveXObject("UserAccounts.CommonDialog");s.Filter="All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|";s.FilterIndex=3;s.InitialDir=b;s.FileName=c;if(s.showOpen()){var h=s.FileName}}catch(e){var h=prompt(a,b+c)}}return h}
//}}}
<<newTiddler label:"newHTML" title:'New HTML' text:{{store.getTiddlerText('TiddlerMakeFile##html')}} tag:html>>
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>, modified by giffmex|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
	newHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]] tag:Note>>",place,null,tiddler);
		}
	},
	newJournalHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	}
});

//}}}

<<forEachTiddler
where
'tiddler.tags.contains("Note")'
sortBy 'tiddler.title'
write
'"<<tiddler EmnerTemplate1 with: [["+tiddler.title+"]]$)){{indent{"+tiddler.text+".}}} \n"' >>
<<tiddler Note>>
<<tiddler hurtignote>>
<!--{{{-->
<a style="color: #5566ff">Det ser ud som om du er ved at lave eller Ʀndre en ny note fra bunden og op!<br>
Skriv notens titel i tekstfeltet Ćøverst, og notens tekst herunder. <br>
TilfĆøj det emne denne note hĆører under i det nƦstĆøverste tekstfelt. <br>
Anvend [[dobbelte firkantede paranteser]] til at omkranse flere-ords emner. <br>
Brug denne drop-down menu:<b><span macro='tagChooser'></span></b> til at vƦlge dinne nuvƦrende emner og andre tags</a>
<!--}}}-->
<html><div align="center"><iframe src="http://giffmex.org/experiments/NoteStorm.html" frameborder="0" width="100%" height="600"></iframe></div></html>
<data>{"author":"Jan Guillou","booktitle":"Ondskaben","primtopic":"Ondskab","mine":false,"wherekept":"Jeg har vist givet den vƦk?!","bibdata":"ISBN: 9788776070014"}</data>
@@font-family:"Comic Sans MS";En selvbiografisk og gribende fortƦlling om en drengs opdragelse i ondskab, fra faderens mishandlinger til de brutale magtkampe i skolegƄrden. Erik kommer fra en rig familie, han er dygtig i skolen og god til sport. Men hjemme i familien fƄr han tƦv af faderenen hver dag.

Erik lƦrer at slĆ„s og klare mange tƦv, men det giver ham problemer i skolen. Han bliver bortvist og sendt til en kostskole, hvor de Ʀldre elevers systematiske undertrykkelse fĆører til en endelĆøs cirkel af provokationer og afstraffelser. Det eneste lyspunkt er vennen Pierre og hƦvnen, som han fĆ„r til sidst.

Easy reader udgave af den oprindelige roman i serien Lette klassikere.@@
config.commands.openInWindow = 
{
	text: "new window",
	tooltip: "Open Tiddler in A new Window"
}
config.commands.openInWindow.handler = function(event,src,title)
{
	var myWin = window.open("",title,"resizable=1,scrollbars=1,toolbar=1,width=400,height=400");
	myWin.document.write('<head><style type="text/css">'+store.getTiddlerText('StyleSheetLayout')+store.getTiddlerText('StyleSheetColors')+store.getTiddlerText('StyleSheet')+'</style></head><body class="selected" style="height: 100%;" onhelp="alert(123)"><div id="popupDisplayArea" class="viewer" style="width: 100%"></div></body>');
	myWin.document.close();
	myWin.document.title = title;
	var e = createTiddlyElement(document.body,"div")
	wikify(store.getTiddlerText(title),e,highlightHack,store.getTiddler(title));
	var text= e.innerHTML;
	myWin.document.getElementById("popupDisplayArea").innerHTML = text;
	document.body.removeChild(e);
	myWin.focus();
	return false;
}
For at lave din egen hjemmeside ud af  "Simple Noter" skal du fĆørst oprette en wikihjemmeside pĆ„ [[TiddlySpot|http://tiddlyspot.com]].
Du skal blot angive navnet pƄ din nye side (Du riskikerer naturligvis at det er optaget) 
og en selvvalgt kode(x2). Brug blot standardTiddlyWikien. (Det har ingen betydning eftersom vi overskriver den om lidt). Klik opret - og notƩr din hjemmesideadresse: {{{http://DitHjemmesidenavn.tiddlyspot.com}}}
Derefter vender du tilbage til "simplenoter.html" (pƄ din pc)

##ƅben "bagscenen"(Ćøverst th.) 
##ƅben importĆ©r.
##Indskriv adressen pƄ din nyligt oprettede hjemmeside.
##Klik Open
##SƦt et flueben Ćøverst for at importere alle tiddlere
##Fjern fluebenet nederst ud for "Keep these tiddlers linked to this server so that you can synchronise subsequent changes"
##Klik importƩr - og fƦrdig
##ƅben SideBarOptions
##Klik redigƩr
##Indskriv {{{<<TspotControl>>}}} - evt. under {{{<<saveChanges>>}}}
##Klik fƦrdig
##Gem Ʀndringer
##OpdatƩr siden (F5)
##Klik muligheder (i Sidepanelet)
##Skriv din kode
##Klik gem til nettet.
##Siden uploades til nettet.
##Du har nu din egen udgave af simplenoter som hjemmeside.

!!!Alternativ uploadmetode:
Indskriv navnet (pĆ„ din nyoprettede side) i upload (bagscenen Ćøverst th)
Indskriv koden i nƦste felt.
I feltet nedenunder (Url of the UploadService script (default: store.php))
skriver du: "DitHjemmesideNavn.tiddlyspot.com/store.cgi".
Til sidst skriver du evt. "backup" i feltet: Relative Directory where to backup.(Ikke obligatorisk)
Nu kan du overskrive den side du lige har oprettet pƄ tiddlyspot, ved at klikke pƄ "Gem til nettet" i uploadvinduet.

@@color(#cc0000):NB!@@ Hvis du vƦlger denne metode vil siden ikke umiddlebart vƦre redigƩrbar pƄ nettet.
Vil du redigere i den online er du nĆødt til at lƦgge en sĆ„kaldt "bookmarklet" i din vƦrktĆøjslinie, som du skal klikke pĆ„ for at "fĆ„ lov" til det.
TrƦk dette link <<tiddler OnlineRedigering>> til menulien i din browser - eller hĆøjreklik og vƦlg "bogmƦrk dette link". //Du kan selvfĆølgelig ogsĆ„ bare klikke pĆ„ linket <<tiddler OnlineRedigering>> her uden at bogmƦrke det!//
Fremover kan du klikke pƄ bogmƦrket i browserens menulinie, og din side bliver redigƩrbar. (allerede Ƅbne tiddlere, skal [[genopfriskes|GenOpfrisk]] for at kunne redigeres!)

Ps: NĆ„r du gemmer mens du er online via upload i "bagscenen", skal du blot skrive "store.cgi"  i feltet: Url of the UploadService script - i stedet for hele adressen.

Mvh MĆ„ns
<<tiddler ShowPopup with: BilledOversigt >>
/***
|''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|PlayerPlugin|
|Source|http://www.TiddlyTools.com/#PlayerPlugin|
|Version|1.1.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|Embed a media player in a tiddler|
!!!!!Usage
<<<
{{{<<player [id=xxx] [type] [URL] [width] [height] [autoplay|true|false] [showcontrols|true|false] [extras]>>}}}

''id=xxx'' is optional, and specifies a unique identifier for each embedded player.  note: this is required if you intend to display more than one player at the same time.

''type'' is optional, and is one of the following: ''windows'', ''realone'', ''quicktime'', ''flash'', ''image'' or ''iframe''.  If the media type is not specified, the plugin automatically detects Windows, Real, QuickTime, Flash video or JPG/GIF images by matching known file extensions and/or specialized streaming-media transfer protocols (such as RTSP:).  For unrecognized media types, the plugin displays an error message.

''URL'' is the location of the media content

''width'' and ''height'' are the dimensions of the video display area (in pixels)

''autoplay'' or ''true'' or ''false'' is optional, and specifies whether the media content should begin playing as soon as it is loaded, or wait for the user to press the "play" button.  Default is //not// to autoplay.

''showcontrols'' or ''true'' or ''false'' is optional, and specifies whether the embedded media player should display its built-in control panel (e.g., play, pause, stop, rewind, etc), if any.  Default is to display the player controls.

''extras'' are optional //pairs// of parameters that can be passed to the embedded player, using the {{{<param name=xxx value=yyy>}}} HTML syntax.

''If you use [[AttachFilePlugin]] to encode and store a media file within your document, you can play embedded media content by using the title of the //attachment tiddler//'' as a parameter in place of the usual reference to an external URL.  When playing an attached media content, you should always explicitly specify the media type parameter, because the name used for the attachment tiddler may not contain a known file extension from which a default media type can be readily determined.
<<<
!!!!!Configuration
<<<
Default player size:
width: <<option txtPlayerDefaultWidth>> height: <<option txtPlayerDefaultHeight>>
<<<
!!!!!Examples
<<<
+++[Windows Media]...
Times Square Live Webcam
{{{<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>}}}
<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>
===
+++[RealOne]...
BBC London: Live and Recorded news
{{{<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>}}}
<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>
===
+++[Quicktime]...
America Free TV: Classic Comedy
{{{<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>}}}
<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>
===
+++[Flash]...
Asteroids arcade game
{{{<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>}}}
<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>
Google Video
{{{<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774               400 326>>}}}
<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774               400 326>>
YouTube Video
{{{<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>}}}
<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>
===
+++[Still Images]...
GIF (best for illustrations, animations, diagrams, etc.)
{{{<<player id=7 image images/meow.gif auto auto>>}}}
<<player id=7 image images/meow.gif auto auto>>
JPG (best for photographs, scanned images, etc.)
{{{<<player id=8 image images/meow2.jpg 200 150>>}}}
<<player id=8 image images/meow2.jpg 200 150>>
===
<<<
!!!!!Revisions
<<<
2008.05.10 [1.1.4] in handlers(), immediately return if no params (prevents error in macro).  Also, refactored auto-detect code to make type mapping configurable.
2007.10.15 [1.1.3] in loadURL(), add recognition for .PNG (still image), fallback to iframe for unrecognized media types
2007.08.31 [1.1.2] added 'click-through' link for JPG/GIF images
2007.06.21 [1.1.1] changed "hidecontrols" param to "showcontrols" and recognize true/false values in addition to 'showcontrols', added "autoplay" param (also recognize true/false values), allow "auto" as value for type param
2007.05.22 [1.1.0] added support for type=="iframe" (displays src URL in an IFRAME)
2006.12.06 [1.0.1] in handler(), corrected check for config.macros.attach (instead of config.macros.attach.getAttachment) so that player plugin will work when AttachFilePlugin is NOT installed.  (Thanks to Phillip Ehses for bug report)
2006.11.30 [1.0.0] support embedded media content using getAttachment() API defined by AttachFilePlugin or AttachFilePluginFormatters.  Also added support for 'image' type to render JPG/GIF still images
2006.02.26 [0.7.0] major re-write.  handles default params better.  create/recreate player objects via loadURL() API for use with interactive forms and scripts.
2006.01.27 [0.6.0] added support for 'extra' macro params to pass through to object parameters
2006.01.19 [0.5.0] Initial ALPHA release
2005.12.23 [0.0.0] Started
<<<
!!!!!Code
***/
//{{{
version.extensions.PlayerPlugin= {major: 1, minor: 1, revision: 4, date: new Date(2008,5,10)};

config.macros.player = {};
config.macros.player.html = {};
config.macros.player.handler= function(place,macroName,params) {
	if (!params.length) return; // missing parameters - do nothing
	var id=null;
	if (params[0].substr(0,3)=="id=") id=params.shift().substr(3);
	var type="";
	if (!params.length) return; // missing parameters - do nothing
	var p=params[0].toLowerCase();
	if (p=="auto" || p=="windows" || p=="realone" || p=="quicktime" || p=="flash" || p=="image" || p=="iframe")
		type=params.shift().toLowerCase();
	var url=params.shift(); if (!url || !url.trim().length) url="";
	if (url.length && config.macros.attach!=undefined) // if AttachFilePlugin is installed
		if ((tid=store.getTiddler(url))!=null && tid.isTagged("attachment")) // if URL is attachment
			url=config.macros.attach.getAttachment(url); // replace TiddlerTitle with URL
	var width=params.shift();
	var height=params.shift();
	var autoplay=false;
	if (params[0]=='autoplay'||params[0]=='true'||params[0]=='false')
		autoplay=(params.shift()!='false');
	var show=true;
	if (params[0]=='showcontrols'||params[0]=='true'||params[0]=='false')
		show=(params.shift()!='false');
	var extras="";
	while (params[0]!=undefined)
		extras+="<param name='"+params.shift()+"' value='"+params.shift()+"'> ";
	this.loadURL(place,id,type,url,width,height,autoplay,show,extras);
}

if (config.options.txtPlayerDefaultWidth==undefined) config.options.txtPlayerDefaultWidth="100%";
if (config.options.txtPlayerDefaultHeight==undefined) config.options.txtPlayerDefaultHeight="480"; // can't use "100%"... player height doesn't stretch right :-(

config.macros.player.typeMap={
	windows: ['mms', '.asx', '.wvx', '.wmv', '.mp3'],
	realone: ['rtsp', '.ram', '.rpm', '.rm', '.ra'],
	quicktime: ['.mov', '.qt'],
	flash: ['.swf', '.flv'],
	image: ['.jpg', '.gif', '.png'],
	iframe: ['.htm', '.html', '.shtml', '.php']
};

config.macros.player.loadURL=function(place,id,type,url,width,height,autoplay,show,extras) {

	if (id==undefined) id="tiddlyPlayer";
	if (!width) var width=config.options.txtPlayerDefaultWidth;
	if (!height) var height=config.options.txtPlayerDefaultHeight;
	if (url && (!type || !type.length || type=="auto")) { // determine type from URL
		u=url.toLowerCase();
		var map=config.macros.player.typeMap;
		for (var t in map) for (var i=0; i<map[t].length; i++)
			if (u.indexOf(map[t][i])!=-1) var type=t;
	}
	if (!type || !config.macros.player.html[type]) var type="none";
	if (!url) var url="";
	if (show===undefined) var show=true;
	if (!extras) var extras="";
	if (type=="none" && url.trim().length) type="iframe"; // fallback to iframe for unrecognized media types

	// adjust parameter values for player-specific embedded HTML
	switch (type) {
		case "windows":
			autoplay=autoplay?"1":"0"; // player-specific param value
			show=show?"1":"0"; // player-specific param value
			break;
		case "realone":
			autoplay=autoplay?"true":"false";
			show=show?"block":"none";
			height-=show?60:0; // leave room for controls
			break;
		case "quicktime":
			autoplay=autoplay?"true":"false";
			show=show?"true":"false";
			break;
		case "image":
			show=show?"block":"none";
			break;
		case "iframe":
			show=show?"block":"none";
			break;
	}

	// create containing div for player HTML
	// and add or replace player in TW DOM structure
	var newplayer = document.createElement("div");
	newplayer.playerType=type;
	newplayer.setAttribute("id",id+"_div");
	var existing = document.getElementById(id+"_div");
	if (existing && !place) place=existing.parentNode;
	if (!existing)
		place.appendChild(newplayer);
	else {
		if (place==existing.parentNode) place.replaceChild(newplayer,existing)
		else { existing.parentNode.removeChild(existing); place.appendChild(newplayer); }
	}

	var html=config.macros.player.html[type];
	html=html.replace(/%i%/mg,id);
	html=html.replace(/%w%/mg,width);
	html=html.replace(/%h%/mg,height);
	html=html.replace(/%u%/mg,url);
	html=html.replace(/%a%/mg,autoplay);
	html=html.replace(/%s%/mg,show);
	html=html.replace(/%x%/mg,extras);
	newplayer.innerHTML=html;
}
//}}}

// // Player-specific API functions: isReady(id), isPlaying(id), toggleControls(id), showControls(id,flag)

//{{{
// status values:
// Windows: 0=Undefined, 1=Stopped, 2=Paused, 3=Playing, 4=ScanForward, 5=ScanReverse
//          6=Buffering, 7=Waiting, 8=MediaEnded, 9=Transitioning, 10=Ready, 11=Reconnecting
// RealOne: 0=Stopped, 1=Contacting, 2=Buffering, 3=Playing, 4=Paused, 5=Seeking
// QuickTime: 'Waiting', 'Loading', 'Playable', 'Complete', 'Error:###'
// Flash: 0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete
config.macros.player.isReady=function(id)
{
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') return !((p.playState==0)||(p.playState==7)||(p.playState==9)||(p.playState==11));
	if (d.playerType=='realone') return (p.GetPlayState()>1);
	if (d.playerType=='quicktime') return !((p.getPluginStatus()=='Waiting')||(p.getPluginStatus()=='Loading'));
	if (d.playerType=='flash') return (p.ReadyState>2);
	return true;
}
config.macros.player.isPlaying=function(id)
{
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') return (p.playState==3);
	if (d.playerType=='realone') return (p.GetPlayState()==3);
	if (d.playerType=='quicktime') return (p.getPluginStatus()=='Complete');
	if (d.playerType=='flash') return (p.ReadyState<4);
	return false;
}
config.macros.player.showControls=function(id,flag) {
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') { p.ShowControls=flag; p.ShowStatusBar=flag; }
	if (d.playerType=='realone') { alert('show/hide controls not available'); }
	if (d.playerType=='quicktime')      // if player not ready, retry in one second
		{ if (this.isReady(id)) p.setControllerVisible(flag); else setTimeout('config.macros.player.showControls("'+id+'",'+flag+')',1000); }
	if (d.playerType=='flash') { alert('show/hide controls not available'); }
}
config.macros.player.toggleControls=function(id) {
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') var flag=!p.ShowControls;
	if (d.playerType=='realone') var flag=true; // TBD
	if (d.playerType=='quicktime') var flag=!p.getControllerVisible();
	if (d.playerType=='flash') var flag=true; // TBD
	this.showControls(id,flag);
}
config.macros.player.fullScreen=function(id) {
	var d=document.getElementById(id+"_div"); if (!d) return false;
	var p=document.getElementById(id); if (!p) return false;
	if (d.playerType=='windows') p.DisplaySize=3;
	if (d.playerType=='realone') p.SetFullScreen();
	if (d.playerType=='quicktime') { alert('full screen not available'); }
	if (d.playerType=='flash') { alert('full screen not available'); }
}
//}}}

// // Player HTML

//{{{
// placeholder (no player)
config.macros.player.html.none=' \
	<table id="%i%" width="%w%" height="%h%" style="background-color:#111;border:0;margin:0;padding:0;"> \
	<tr style="background-color:#111;border:0;margin:0;padding:0;"> \
	<td width="%w%" height="%h%" style="background-color:#111;color:#ccc;border:0;margin:0;padding:0;text-align:center;"> \
	&nbsp; \
	%u% \
	&nbsp; \
	</td></tr></table>';
//}}}

//{{{
// JPG/GIF/PNG still images
config.macros.player.html.image='\
	<a href="%u%" target="_blank"><img width="%w%" height="%h%" style="display:%s%;" src="%u%"></a>';
//}}}

//{{{
// IFRAME web page viewer
config.macros.player.html.iframe='\
	<iframe id="%i%" width="%w%" height="%h%" style="display:%s%;background:#fff;" src="%u%"></iframe>';
//}}}

//{{{
// Windows Media Player
// v7.1 ID: classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6
// v9	ID: classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95
config.macros.player.html.windows=' \
	<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;width:%w%;height:%h%px;" \
		classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" \
		codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" \
		align="baseline" border="0" \
		standby="Loading Microsoft Windows Media Player components..." \
		type="application/x-oleobject"> \
		<param name="FileName" value="%u%"> <param name="ShowControls" value="%s%"> \
		<param name="ShowPositionControls" value="1"> <param name="ShowAudioControls" value="1"> \
		<param name="ShowTracker" value="1"> <param name="ShowDisplay" value="0"> \
		<param name="ShowStatusBar" value="1"> <param name="AutoSize" value="1"> \
		<param name="ShowGotoBar" value="0"> <param name="ShowCaptioning" value="0"> \
		<param name="AutoStart" value="%a%"> <param name="AnimationAtStart" value="1"> \
		<param name="TransparentAtStart" value="0"> <param name="AllowScan" value="1"> \
		<param name="EnableContextMenu" value="1"> <param name="ClickToPlay" value="1"> \
		<param name="InvokeURLs" value="1"> <param name="DefaultFrame" value="datawindow"> \
		%x% \
		<embed src="%u%" style="margin:0;padding:0;width:%w%;height:%h%px;" \
			align="baseline" border="0" width="%w%" height="%h%" \
			type="application/x-mplayer2" \
			pluginspage="http://www.microsoft.com/windows/windowsmedia/download/default.asp" \
			name="%i%" showcontrols="%s%" showpositioncontrols="1" \
			showaudiocontrols="1" showtracker="1" showdisplay="0" \
			showstatusbar="%s%" autosize="1" showgotobar="0" showcaptioning="0" \
			autostart="%a%" autorewind="0" animationatstart="1" transparentatstart="0" \
			allowscan="1" enablecontextmenu="1" clicktoplay="0" invokeurls="1" \
			defaultframe="datawindow"> \
		</embed> \
	</object>';
//}}}

//{{{
// RealNetworks' RealOne Player
config.macros.player.html.realone=' \
	<table width="%w%" style="border:0;margin:0;padding:0;"><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \
	<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \
		CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \
		<PARAM NAME="CONSOLE" VALUE="player"> \
		<PARAM NAME="CONTROLS" VALUE="ImageWindow"> \
		<PARAM NAME="AUTOSTART" Value="%a%"> \
		<PARAM NAME="MAINTAINASPECT" Value="true"> \
		<PARAM NAME="NOLOGO" Value="true"> \
		<PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \
		<PARAM NAME="SRC" VALUE="%u%"> \
		%x% \
		<EMBED width="%w%" height="%h%" controls="ImageWindow" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;" \
			name="%i%" \
			src="%u%" \
			console=player \
			maintainaspect=true \
			nologo=true \
			backgroundcolor=#333333 \
			autostart=%a%> \
		</OBJECT> \
	</td></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \
	<object id="%i%_controls" width="%w%" height="60" style="margin:0;padding:0;display:%s%" \
		CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \
		<PARAM NAME="CONSOLE" VALUE="player"> \
		<PARAM NAME="CONTROLS" VALUE="All"> \
		<PARAM NAME="NOJAVA" Value="true"> \
		<PARAM NAME="MAINTAINASPECT" Value="true"> \
		<PARAM NAME="NOLOGO" Value="true"> \
		<PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \
		<PARAM NAME="SRC" VALUE="%u%"> \
		%x% \
		<EMBED WIDTH="%w%" HEIGHT="60" NOJAVA="true" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;display:%s%" \
			controls="All" \
			name="%i%_controls" \
			src="%u%" \
			console=player \
			maintainaspect=true \
			nologo=true \
			backgroundcolor=#333333> \
		</OBJECT> \
	</td></tr></table>';
//}}}

//{{{
// QuickTime Player
config.macros.player.html.quicktime=' \
	<OBJECT ID="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \
		CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" \
		CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"> \
		<PARAM name="SRC" VALUE="%u%"> \
		<PARAM name="AUTOPLAY" VALUE="%a%"> \
		<PARAM name="CONTROLLER" VALUE="%s%"> \
		<PARAM name="BGCOLOR" VALUE="#333333"> \
		<PARAM name="SCALE" VALUE="aspect"> \
		<PARAM name="SAVEEMBEDTAGS" VALUE="true"> \
		%x% \
		<EMBED name="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \
			SRC="%u%" \
			AUTOPLAY="%a%" \
			SCALE="aspect" \
			CONTROLLER="%s%" \
			BGCOLOR="#333333" \
			EnableJavaSript="true" \
			PLUGINSPAGE="http://www.apple.com/quicktime/download/"> \
		</EMBED> \
	</OBJECT>';
//}}}

//{{{
// Flash Player
config.macros.player.html.flash='\
	<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \
		classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" \
		codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"> \
		<param name="movie" value="%u%"> \
		<param name="quality" value="high"> \
		<param name="SCALE" value="exactfit"> \
		<param name="bgcolor" value="333333"> \
		%x% \
		<embed name="%i%" src="%u%" style="margin:0;padding:0;" \
			height="%h%" width="%w%" quality="high" \
			pluginspage="http://www.macromedia.com/go/getflashplayer" \
			type="application/x-shockwave-flash" scale="exactfit"> \
		</embed> \
	</object>';
//}}}
/%
|Name| Pop|
|Source| http://menuflex.tiddlyspot.com/#Pop - originally: http://www.TiddlyTools.com/#ShowPopup|
|Version| 1.1.0|
|Author| Eric Shulman - modified by Wolfgang|
|License| http://www.TiddlyTools.com/#LegalStatements|
|Type| transcluded html|
|Description| Display tiddler content in a TW popup upon hover. - ShowPopup adapted to open 'on mouse over', to the right and nestled. Important: Don't ask the original author for support to this variant script, before you haven't verified it by installing instead the latest version of ShowPopup.|

usage: <<tiddler ShowPopup with: label TiddlerName tooltip buttonClass width popupClass>>

!Show
<html><a href="javascript:;" class="$4" title="$3" onclick="var p=Popup.create(this); if(!p)return; p.className+='$6'!='$'+'6'?' $6':''; var d=createTiddlyElement(p,'div'); var s=d.style; s.whiteSpace='normal'; s.width='$5'!='$'+'5'?'$5':'auto'; s.padding='2px'; wikify(store.getTiddlerText('$2',''),d); Popup.show(); event.cancelBubble=true; if(event.stopPropagation)event.stopPropagation(); return(false);">$1</a></html>
!Down
<html><a href="javascript:;" class="$4" title="$3" onmouseover="var p=Popup.create(this); if(!p)return; p.className+='$6'!='$'+'6'?' $6':''; var d=createTiddlyElement(p,'div'); var s=d.style; s.whiteSpace='normal'; s.width='$5'!='$'+'5'?'$5':'auto'; s.padding='2px'; wikify(store.getTiddlerText('$2',''),d); Popup.show(); event.cancelBubble=true; if(event.stopPropagation)event.stopPropagation(); return(false);">$1</a></html>
!Right
<html><a href="javascript:;" class="$4" title="$3" onclick="var p=Popup.create(this); if(!p)return; p.className+='$6'!='$'+'6'?' $6':''; var d=createTiddlyElement(p,'div'); var s=d.style; s.whiteSpace='normal'; s.width='$5'!='$'+'5'?'$5':'auto'; s.padding='2px'; wikify(store.getTiddlerText('$2',''),d); Popup.show('top','right'); event.cancelBubble=true; if(event.stopPropagation)event.stopPropagation(); return(false);">$1</a></html>
!One
<html><a href="javascript:;" class="$4" title="$3" onmouseover="var p=Popup.create(this); if(!p)return; p.className+='$6'!='$'+'6'?' $6':''; var d=createTiddlyElement(p,'div'); var s=d.style; s.whiteSpace='normal'; s.width='$5'!='$'+'5'?'$5':'auto'; s.padding='2px'; wikify(store.getTiddlerText('$2',''),d); Popup.show('top','right'); event.cancelBubble=true; if(event.stopPropagation)event.stopPropagation(); return(false);">$1</a></html>
!Two
<html><a href="javascript:;" class="$4" title="$3" onmouseover="var p=Popup.create(this); if(!p)return; p.className+='$6'!='$'+'6'?' $6':''; var d=createTiddlyElement(p,'div'); var s=d.style; s.whiteSpace='normal'; s.width='$5'!='$'+'5'?'$5':'auto'; s.padding='2px'; wikify(store.getTiddlerText('$2',''),d); Popup.show('top','right'); event.cancelBubble=true; if(event.stopPropagation)event.stopPropagation(); return(false);">$1</a></html>
!0
<<tagging $1>>
!1
<<tagging $1>>
[[$1]]
!end
%/
<html><p><meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE"><meta content="OpenOffice.org 3.1  (Win32)" name="GENERATOR"><style type="text/css">
	<!--
		@page { margin: 2cm }
		P { margin-bottom: 0.21cm }
	-->
	</style> <p align="center" style="margin-bottom: 0cm; text-decoration: none;"><font color="#000000"><font><font size="6" style="font-size: 28pt;"><b>DANSK FAGDAGE 2009</b></font></font></font></p> <p align="center" style="margin-bottom: 0cm; font-weight: normal; text-decoration: none;"><font color="#000000"><font><font size="4" style="font-size: 15pt;">HIMMERLANDS UNGDOMSSKOLE</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <div align="left" style="margin-bottom: 0cm;"><font color="#000000"><font size="4"><u><b>MANDAG:</b></u></font></font></div> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">8.25 INTRO</font></font></font></p> <ul><li><p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="3">PR&AElig;SENTATION 	AF DAGENE</font></font></font></p></li></ul> <p align="left" style="margin-left: 0.64cm; margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">8.30 GRETHE GR&Oslash;NKJ&AElig;R</font></font></font></p> <ul><li><p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="3">INTRODUKTION 	TIL MUSIKVIDEOER, HISTORIE, VIRKEMIDLER, TEKNIK MM.</font></font></font></p></li></ul> <p align="left" style="margin-left: 0.64cm; margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">9.45 PAUSE</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">10.15 GRETHE GR&Oslash;NKJ&AElig;R</font></font></font></p> <ul><li><p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="3">FORTS&AElig;TTELSE 	I FORHOLD TIL  GRETHE GR&Oslash;NKJ&AElig;RS PROGRAM</font></font></font></p></li></ul> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">12.25 MIDDAG</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">13.30 GRUPPEARBEJDE &ndash; MUSIKVIDEOER: TEKSTANALYSE, 	STORYBOARDS OG LOCATIONS.</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">15.30 DAGEN SLUTTER</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <div align="left" style="margin-bottom: 0cm;"><font color="#000000"><font size="4"><u><b>TIRSDAG:</b></u></font></font></div> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">8.00 SAMLING I FOREDRAGSSALEN</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">8.15 ARBEJDE MED PRODUKTION AF VIDEO</font></font></font></p> <ul><li><p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="3">DER 	ARBEJDES MED DIGITALKAMERA OG PHOTOSTORY 3</font></font></font></p></li></ul> <p align="left" style="margin-left: 0.64cm; margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">9.45 &ndash; 10.15 PAUSE</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">12.25 MIDDAG</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">13.30 ARBEJDE MED PRODUKTION AF VIDEOER</font></font></font></p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4"><span>-   </span></font></font></font><font color="#000000"><font><font size="3"><span>OPRYDNING I KLASSEFL&Oslash;JEN</span></font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">14.00 PR&AElig;SENTATION AF ARBEJDET</font></font></font></p> <ul><li><p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="3">I 	GRUPPERNE UDV&AElig;LGES DEN BDSTE TIL VISNING I FOREDRAGSSALEN</font></font></font></p></li></ul> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">14.45 PR&AElig;SENTATION AF DE UDVALGTE VIDEOER</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">15.30 DAGEN AFSLUTTES</font></font></font></p> <p align="left" style="margin-left: 0.64cm; margin-bottom: 0cm;">&nbsp;</p> <div align="left" style="margin-bottom: 0cm;"><font color="#000000"><font size="4">NB!</font></font></div> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">Grethe Gr&oslash;nkj&aelig;r har brug for lidt tid i Foredragssalen til at g&oslash;re udstyret klar, derfor skal eleverne f&oslash;rst m&oslash;de 8.25. </font></font></font></p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">Else giver eleverne besked i forbindelse med morgenvagten (hvis du ikke har vagt, Else, som jeg tror, m&aring; vi lige udt&aelig;nke noget andet.</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">Eftermiddagspausen, s&aring;vel mandag som tirsdag, ligges ind, som det passer grupperne.</font></font></font></p> <p align="left" style="margin-bottom: 0cm;">&nbsp;</p> <p align="left" style="margin-bottom: 0cm;"><font color="#000000"><font><font size="4">Der er lavet kopier til alle elever af Grethe Gr&oslash;nkj&aelig;rs materiale om musikvideoer &ndash; disse kopier ligger ligeledes i dueslaget.</font></font></font></p> </meta></meta></p><p>&nbsp;</p></html>
/%
|Name|QuickMenu|
|Source|http://menuflex.tiddlyspot.com/#QuickMenu - originally: http://www.TiddlyTools.com/#TiddlerTweaker%20FaqViewer%20MultiSelectSampleScript|
|Author|Wolfgang - originally by Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Type|Html|
|Description|View tiddlers or select multiple tiddlers to display, edit, delete or calculate their size. -  This is a modified version of MultiSelectSampleScript, combined with parts of TiddlerTweaker and FaqViewer with dependency to InlneJavascriptPlugin eliminated. Important: Don't ask the original author for support to these abandoned variant scripts, before you haven't verified it by installing instead the latest version of these Plugins.|

%/{{smallform{<html><form style="display:inline"><!--
--><table style="padding:0;margin:0;border:0;width:100%"><tr valign="top" style="padding:0;margin:0;border:0"><td  style="text-align:center;white-space:nowrap;width:100%;padding:0;margin:0;border:0"><!--
	--><select multiple name=list size="15" style="width:99.9%" 
		title="use click, shift-click and/or ctrl-click to select multiple tiddler titles"
		onclick="fastview.selecttiddlers(this)"
		onchange='var target=this.form.parentNode.nextSibling; removeChildren(target); wikify("<br>\<\<tiddler [["+this.value+"]]\>\>",target); target.style.display=this.value.length?"block":"none"; this.form.done.disabled=!this.value.length;'><!--
	--></select><!--
	--><!--
--></td><td style="white-space:nowrap;padding:0;margin:0;border:0;width:1%"><!--
	--><table border=0 style="width:99%;padding:0;margin:0;border:0;"><tr style='padding:0;border:0;'><td style="padding:1px;border:0;white-space:nowrap"><!--
	--><div style="margin-top:0em;text-align:center"><!--
	--><i>sort by:</i><br><input type=button name=sortby value="title"
		onclick="fastview.init(this.form,this.value)"><br><!--
	--><input type=button name=sortby value="date"
		onclick="fastview.init(this.form,this.value)"><br><!--
	--><input type=button name=sortby value="size"
		onclick="fastview.init(this.form,this.value)"><br><!--
	--><br><i>choose:</i><br><input type=button name="display" disabled title="display tiddlers" value='open'
		onclick="fastview.displaytiddlers(this)"><br><!--
	--><input type=button name="edit" disabled title="edit tiddlers" value='edit'
		onclick="fastview.editiddlers(this)"><br><!--
	--><input type=button name="del" disabled title="delete tiddlers" value='erase'
		onclick="fastview.deltiddlers(this)"><br><!--
	--><input type=button name="stats" title="tiddler totals" disabled value='bytes'
		onclick="fastview.stats(this)"><br><!--
	--><input type=button name="done" disabled value="done"
		title="hide current tiddler preview" 
		onclick="var target=this.form.parentNode.nextSibling; removeChildren(target); target.style.display='none';this.form.list.selectedIndex=0;"><br><!--
	--></div><!--
--></td></tr></table><!--
--></form></html><<tiddler {{
window.fastview = {
	init: // load tiddler titles into multi-select listbox
	function(form,sortby) { 
		while (form.list.options[0]) form.list.options[0]=null; // empty current list content
		var tids=store.getTiddlers(sortby);
		if (sortby=="size")
			tids.sort(function(a,b) {return a.text.length < b.text.length ? +1 : (a.text.length == b.text.length ? 0 : -1);});
		for (i=0; i<tids.length; i++) {
			var label=tids[i].title; var value=tids[i].title;
			if (sortby=="date") {
				label=tids[tids.length-i-1].modified.formatString("YY.0MM.0DD 0hh:0mm - ")+tids[tids.length-i-1].title;
				value=tids[tids.length-i-1].title;
			}
			if (sortby=="size") label="["+tids[i].text.length+"] "+label;
			form.list.options[form.list.length]=new Option(label,value,false,false);
		}
		form.stats.disabled=form.del.disabled=form.display.disabled=form.edit.disabled=true;
	},

	selecttiddlers: // enable/disable tweaker fields based on number of items selected
	function(here) { 
		// count how many tiddlers are selected
		var list=here.form.list; var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
		here.form.del.disabled=(c==0);
		here.form.display.disabled=(c==0);
		here.form.edit.disabled=(c==0);
		here.form.stats.disabled=(c==0);
		var msg=(c==0)?'select tiddlers:':(c+' tiddler'+(c!=1?'s':'')+' selected');
		here.previousSibling.firstChild.innerHTML=msg;
	},
	
	displaytiddlers: 
	function(here) {
		var form=here.form; var list=form.list;	var tids=[];
		for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		story.displayTiddlers(story.findContainingTiddler(form),tids)
	},

	editiddlers: 
	function(here) {
		var form=here.form; var list=form.list;	var tids=[];
		for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		story.displayTiddlers(story.findContainingTiddler(form),tids,DEFAULT_EDIT_TEMPLATE);
	},

	deltiddlers: 
	function(here) {
		var form=here.form; var list=form.list;	var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		if (!confirm("Are you sure you want to delete these tiddlers:\n\n"+tids.join(', '))) return;
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			if (tid.tags.contains("systemConfig"))
				if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\n\nRemoving this tiddler may cause unexpected results.  Are you sure?"))
					continue;
			store.removeTiddler(tid.title);
		}
		this.init(form,form.sortby.value);
	},

	stats: 
	function(here) {
		var form=here.form; var list=form.list; var tids=[]; var out=''; var tot=0;
		var target=document.getElementById("FastView_stats");
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
		}
		var avg=tot/tids.length;
		out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<';
		removeChildren(target);
		target.innerHTML="<hr><font size=-2><a href='javascript:;' style='text-align:left' onclick='this.parentNode.parentNode.style.display=\"none\"'>close&nbsp;&nbsp;</a></font>";
		wikify(out,target);
		target.style.display="block";
	}
}
// get THIS form...
var here=place.lastChild.firstChild;
// tweaker might be wrappered in a surrounding form (e.g., TidIDE) , so...
while(here && here.nodeName.toLowerCase()!="form") here=here.parentNode; // find containing form
// initialize tweaker controls
fastview.init(here,here.sortby.value);
'';}}>><html><span id="FastView_stats" style="display:none"></span></html>{{hidden wrap{/% this content is replaced by onchange handler above %/}}}}}}
/%
!info
|Name|QuickNote|
|Source|http://www.TiddlyTools.com/#QuickNote|
|Version|1.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transcluded|
|Requires||
|Overrides||
|Description|create quick notes using username+timestamp as tiddler titles|
Usage:
<<<
in tiddler content:
{{{
<<tiddler QuickNote with: format tag tag tag tag...>>
}}}
in PageTemplate (added to story column):
{{{
<div id='displayArea'>
	<div id='messageArea'></div>
	<div macro='tiddler QuickNote with: format'></div>
	<div id='tiddlerDisplay'></div>
</div>
}}}
where ''format'' specifies a TiddlyWiki date format string (e.g. """YYYY0MM0DD0hh0mm0ss""") that is used to generate a unique tiddler title for each new note that is created, by combining the TW username with a //timestamp// for the current time.
<<<
Example:
<<<
{{{
<<tiddler QuickNote with: -YYYY0MM0DD0hh0mm0ss>>
}}}
<<tiddler QuickNote with: -YYYY0MM0DD0hh0mm0ss>>
<<<
!end

!show
<html><nowiki><form class="quickNote" style="display:inline;margin:0;padding:0;white-space:nowrap;">
<input type=text id="quickNoteTitle" disabled value="" title="title for new tiddler" style="width:50%">
<input type=text name="tags" value="hurtignote" title="tags til ny tiddler" style="width:40%">
<input type=button value="Gem" style="width:8%" onclick="
	var who=config.options.txtUserName;
	var when=new Date();
	var title=prompt('The new tiddler title will be:\n\n',who+when.formatString('$1'));
	if (!title) return;
	var msg=config.messages.overwriteWarning.format([title]);
	if (store.tiddlerExists(title) && !confirm(msg)) return;
	var text=this.form.txt.value;
	var tags=this.form.tags.value.readBracketedList();
	store.saveTiddler(title,title,text,who,when,tags,{});
	story.displayTiddler(null,title);
"><br><textarea name="txt" rows="5" cols="60" style="width:100%"></textarea>
</form></html><<tiddler {{
	window.quickNoteTick=function() {
		var e=document.getElementById('quickNoteTitle'); if (!e) return;
		e.value='nƦste titel: '+config.options.txtUserName+new Date().formatString('$1');
		window.setTimeout('window.quickNoteTick()',1000);
	};
	window.quickNoteTick()
'';}}>>
!end
%/<<tiddler {{'QuickNote##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]]>>
/%
|Name|RefreshTiddler|
|Source|http://www.TiddlyTools.com/#RefreshTiddler|
|Version|0.0.0|
|Author|Eric Shulman|
|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|link that forces a refresh of the current tiddler|

usage: <<tiddler RefreshTiddler with: "label" "tooltip">>

where label and tooltip are optional and default to "refresh" and "redisplay tiddler content", respectively.

%/<script label="refresh" title="redisplay tiddler content">
	var here=story.findContainingTiddler(place); if (!here) return false;
	story.refreshTiddler(here.getAttribute("tiddler"),null,true);
	return false;
</script><script>
	if ("$1"!="$"+"1") place.lastChild.innerHTML="$1";
	if ("$2"!="$"+"2") place.lastChild.title="$2";
</script>
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

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

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

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

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

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

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

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

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

	},

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

config.renameTags.init();

//}}}
/***
|Name|SetUserNamePlugin|
|Source|http://www.TiddlyTools.com/#SetUserNamePlugin|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|prompt for TiddlyWiki username|
!!!!!Usage
<<<
{{{
<<setUserName force>>
}}}
This macro prompts for a new username if the default username ("YourName") is currently set.  Use optional 'force' keyword to trigger a prompt even if username has already been set.

If you are using the default (shadow) EditTemplate definition, it will be updated to invoke this macro, via the following template syntax:
{{{
<span macro='setUserName'></span>
}}}
so that whenever a user attempts to edit/create a tiddler AND have not yet entered a username, they will be automatically prompted to enter a new username.  If you are using a customized EditTemplate, you will need to edit it yourself to add the above.
<<<
!!!!!Revisions
<<<
2006.12.01 [1.0.0] initial release - converted from SetUserName inline script
<<<
!!!!!Code
***/
//{{{
version.extensions.SetUserNamePlugin= {major: 1, minor: 0, revision: 0, date: new Date(2006,12,1)};

config.macros.setUserName = {
	msg: "Skriv venligst dit brugernavn",
	handler: function(place,macroName,params) {
		// only prompt when needed or forced
		var force=params[0]&&params[0].toLowerCase()=="force";
		if (!force && (readOnly || config.options.txtUserName!="DitNavn")) return;
		var opt="txtUserName";
		var who=prompt(this.msg,config.options[opt]);
		if (!who||!who.trim().length) return; // cancelled by user
		config.options[opt]=who;
		saveOptionCookie(opt);
		config.macros.option.propagateOption(opt,"value",config.options[opt],"input");
	}
}

// add trigger to default shadow EditTemplate (custom templates: add this by hand)
config.shadowTiddlers.EditTemplate+="<span macro='setUserName'></span>";
//}}}
/%
!info
|Name|ShowPopup|
|Source|http://www.TiddlyTools.com/#ShowPopup|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transcluded html|
|Requires||
|Overrides||
|Description|display tiddler content in a TiddlyWiki popup panel|
Usage:
<<<
{{{
<<tiddler ShowPopup with: TiddlerName label tooltip buttonClass width popupClass>>
}}}
where:
*''~TiddlerName''<br>title of the tiddler to be displayed
*''label''<br>text for the command link
*''tooltip''<br>mouseover help text for the link
*''buttonClass''<br>CSS classname applied to the command text (default=button)
*''width''<br>width of the popup (using CSS measurements, default=auto)
*''popupClass''<br>CSS classname applied to the popup panel (default=none).<br>Use 'sticky' for persistent popups (see StickyPopupPlugin)
<<<
Example:
<<<
{{{
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
}}}
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
<<<
!end

!show
<html><hide linebreaks>
<a href="javascript:;" class="$4" title="$3" onclick="
	var p=Popup.create(this); if(!p)return;
	p.className+='$6'!='$'+'6'?' $6':'';
	var d=createTiddlyElement(p,'div');
	var s=d.style;
	s.whiteSpace='normal';
	s.width='$5'!='$'+'5'?'$5':'auto';
	s.padding='2px';
	wikify(store.getTiddlerText('$1',''),d);
	Popup.show();
	event.cancelBubble=true;
	if(event.stopPropagation)event.stopPropagation();
	return(false);
">$2</a></html>
!end

%/<<tiddler {{'ShowPopup##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]] [[$6]]>>
<<tiddler ShowSimilarTagsToThis with: "CSS" limit>>
----
<script>
	var out=[]; var similar={}; var rank=[];
	var here=story.findContainingTiddler(place);
	var title='$1'!='$'+'1'?'$1':here?here.getAttribute('tiddler'):'';
	var limit='$2'!='$'+'2'?'$2':1;
	var tid=store.getTiddler(title); if (!tid) return;
	var tids=store.reverseLookup('tags','excludeLists'); // get all tiddlers (including from IncludePlugin)
	for (var i=0; i<tids.length; i++) { var t=tids[i];
		if (t.title==tid.title) continue;
		var tags=[]; for (var j=0; j<t.tags.length; j++)
			if (tid.tags.contains(t.tags[j])) tags.push(t.tags[j]);
		if (tags.length >= limit) {
			similar[tids[i].title]=tags;
			if (!rank[tags.length]) rank[tags.length]=new Array();
			rank[tags.length].push(tids[i].title);
		}
	}
	for (var r=rank.length-1; r>=0; r--) { if (!rank[r]) continue;
		out.push('*%0 shared tags:'.format([r,rank[r].length]));
		for (var t=0; t<rank[r].length; t++)
			out.push('##[[%0]] ~~("""%1""")~~'.format([rank[r][t],similar[rank[r][t]].join(', ')]));
	}
	return out.join('\n');
</script>
<<slider txtMainTabSlider SideBarTabsSlider 'tabs Ā»' 'tiddlers, timeline, all, tags, and more'>>
<<tabs txtMainTab "Tidslinie" "Tidslinie" TabTimeline "Alle" "Alle tiddlere" TabAll "Tags" "Alle tags" TabTags "Flere" "Flere lister" TabMore>>
en genbrugelig ikke-liniƦr personlig web notesbog
DeskTree
http://desktree.tiddlyspot.com
+++[VoiceThread]...<<tiddler [[Lav dine egne voicetreads]]>>===  <html><div <img style="visibility:hidden;width:0px;height:0px;" border=0 width=0 height=0 src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyNTMxNzE4NDk3NTAmcHQ9MTI1MzE3MTg1NzcxOCZwPTIwNjQyMSZkPWI2MTUxMzAmZz*yJm89ODU*YmY*OGQyNTI5NDllZjkzZmJhYjVjYjMwYjYzMmUmb2Y9MA==.gif" /><object width="480" height="360"><param name="movie" value="http://voicethread.com/book.swf?b=615130"></param><param name="wmode" value="transparent"></param><embed src="http://voicethread.com/book.swf?b=615130" type="application/x-shockwave-flash" wmode="transparent" width="480" height="360"></embed></object></html>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
/***
|Name|SnapshotPlugin|
|Source|http://www.TiddlyTools.com/#SnapshotPlugin|
|Documentation|http://www.TiddlyTools.com/#SnapshotPluginInfo|
|Version|1.1.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 or print HTML+CSS image of rendered document content|
|Status|ALPHA - DO NOT DISTRIBUTE|
This plugin provides a macro as well as tiddler toolbar commands to create a file or browser window containing the //rendered// CSS-and-HTML that is currently being displayed for selected elements of the current document.
!!!!!Documentation
>see [[SnapshotPluginInfo]]
!!!!!Configuration
<<<
<<option chkSnapshotHTMLOnly>> output HTML only (omit CSS)
<<<
!!!!!Revisions
<<<
2008.05.16 [1.1.1] added try..catch around addEvent/removeEvent calls to avoid error in Opera
2008.04.28 [1.1.0] removed 'viewerHTML' from 'ask' droplist and replaced with toggle for "output HTML only".  Removed 'noCSS' parameter and replaced with config.options.chkSnapshotHTMLOnly global option.  Added "select a tiddler..." to 'ask' droplist
2008.04.24 [1.0.1] in saveSnap(), convert output from Unicode to UTF before passing to saveFile().  Fixes "unknown name" error in IE's file.Write() function.  Added viewerHTML to 'ask' droplist.
2008.04.21 [1.0.0] initial release - derived from [[NewDocumentPlugin]] with many improvements, including: "ask for ID" using droplist of available DOM elements, use "<base href=...>" for correctly resolving image references, wrap 'viewer only' output in class="tiddler viewer" for proper application of inherited CSS styles, snapshotSave and snapshotPrint tiddler toolbar command definitions, and more...
<<<
!!!!!Code
***/
//{{{
version.extensions.SnapshotPlugin= {major: 1, minor: 1, revision: 1, date: new Date(2008,5,16)};

if (config.options.chkSnapshotHTMLOnly===undefined) config.options.chkSnapshotHTMLOnly=false;

config.macros.snapshot = {
	snapLabel: "save a snapshot",
	printLabel: "print a snapshot",
	snapPrompt: "save an HTML image of rendered content",
	printPrompt: "print an HTML image of rendered content",
	hereID: "here",
	viewerID: "viewer",
	storyID: "story",
	allID: "all",
	askID: "ask",
	askTiddlerID: "askTiddler",
	askDOMID: "askDOM",
	askMsg: "select an element...",
	hereItem: "tiddler: '%0'",
	viewerItem: "tiddler: '%0' (content only)",
	storyItem: "story column",
	allItem: "entire document",
	tiddlerItem: "select a tiddler...",
	IDItem: "select a DOM element by ID...",
	HTMLItem: "[%0] output HTML only (omit CSS)",
	fileMsg: "select or enter a target path/filename",
	defaultFilename: "snapshot.html",
	okmsg: "snapshot written to %0",
	failmsg: "An error occurred while creating %0",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var printing=params[0]&&params[0]=="print"; if (printing) params.shift();
		params = paramString.parseParams("anon",null,true,false,false);
		var id=getParam(params,"id","here");
		var label=getParam(params,"label",printing?this.printLabel:this.snapLabel);
		var prompt=getParam(params,"prompt",printing?this.printPrompt:this.snapPrompt);
		var btn=createTiddlyButton(place,label,prompt, function(ev){
			this.setAttribute("snapID",this.getAttribute("startID"));
			config.macros.snapshot.go(this,ev)
		});
		btn.setAttribute("startID",id);
		btn.setAttribute("snapID",id);
		btn.setAttribute("printing",printing?"true":"false");
		btn.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
	},
	go: function(here,ev) {
		var cms=config.macros.snapshot; // abbreviation
		var id=here.getAttribute("snapID");
		var printing=here.getAttribute("printing")=="true";
		var HTMLOnly=here.getAttribute("HTMLOnly")=="true";

		if (id==cms.askID||id==cms.askTiddlerID||id==cms.askDOMID) {
			cms.askForID(here,ev);
		} else {
			// get element
			if (id==cms.storyID) id="tiddlerDisplay";
			if (id==cms.allID) id="contentWrapper";
			var snapElem=document.getElementById(id);
			if (id==cms.hereID || id==cms.viewerID)
				var snapElem=story.findContainingTiddler(here);
			if (snapElem && hasClass(snapElem,"tiddler") && (id==cms.viewerID || HTMLOnly)) {
				// find viewer class element within tiddler element
				var nodes=snapElem.getElementsByTagName("*");
				for (var i=0; i<nodes.length; i++)
					if (hasClass(nodes[i],"viewer")) { snapElem=nodes[i]; break; }
			}
			if (!snapElem) // not in a tiddler or no viewer element or unknown ID
				{ e.cancelBubble=true; if(e.stopPropagation)e.stopPropagation(); return(false); }
			// write or print snapshot
			var out=cms.getsnap(snapElem,id,printing,HTMLOnly);
			if (printing) cms.printsnap(out); else cms.savesnap(out);
		}
		return false;
	},
	askForID: function(here,ev) {
		var ev = ev ? ev : window.event; 
		var cms=config.macros.snapshot; // abbreviation
		var id=here.getAttribute("snapID");
		var indent='\xa0\xa0\xa0\xa0';
		var p=Popup.create(here); if (!p) return false; p.className+=' sticky smallform';
		var s=createTiddlyElement(p,'select'); s.button=here;
		if (id==cms.askID) {
			s.options[s.length]=new Option(cms.askMsg,cms.askID);
			var tid=story.findContainingTiddler(here);
			if(tid) { 
				var title=tid.getAttribute("tiddler");
				if (here.getAttribute("HTMLOnly")!="true")
					s.options[s.length]=new Option(indent+cms.hereItem.format([title]),cms.hereID);
				s.options[s.length]=new Option(indent+cms.viewerItem.format([title]),cms.viewerID);
			}
			s.options[s.length]=new Option(indent+cms.tiddlerItem,cms.askTiddlerID);
			s.options[s.length]=new Option(indent+cms.IDItem,cms.askDOMID);
			s.options[s.length]=new Option(indent+cms.storyItem,"tiddlerDisplay");
			s.options[s.length]=new Option(indent+cms.allItem,"contentWrapper");
		}
		if (id==cms.askDOMID) {
			s.options[s.length]=new Option(cms.IDItem,cms.askDOMID);
			var elems=document.getElementsByTagName("*");
			var ids=[];
			for (var i=0;i<elems.length;i++)
				if (elems[i].id.length && elems[i].className!="animationContainer")
					ids.push(elems[i].id);
			ids.sort();
			for (var i=0;i<ids.length;i++) s.options[s.length]=new Option(indent+ids[i],ids[i]);
		}
		if (id==cms.askTiddlerID) {
			s.options[s.length]=new Option(cms.tiddlerItem,cms.askTiddlerID);
			var elems=document.getElementsByTagName("div");
			var ids=[];
			for (var i=0;i<elems.length;i++) { var id=elems[i].id;
				if (id.length && id.substr(0,story.idPrefix.length)==story.idPrefix && id!="tiddlerDisplay")
					ids.push(id);
			}
			ids.sort();
			for (var i=0;i<ids.length;i++) s.options[s.length]=new Option(indent+ids[i].substr(story.idPrefix.length),ids[i]);
		}
		s.options[s.length]=new Option(cms.HTMLItem.format([here.getAttribute("HTMLOnly")=="true"?"\u221a":"_"]),cms.HTMLItem);
		s.onchange=function(ev){
			var ev = ev ? ev : window.event; 
			var cms=config.macros.snapshot; // abbreviation
			var here=this.button;
			if (this.value==cms.HTMLItem) {
				config.options.chkSnapshotHTMLOnly=!config.options.chkSnapshotHTMLOnly;
				here.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
				config.macros.option.propagateOption("chkSnapshotHTMLOnly","checked",
					config.options.chkSnapshotHTMLOnly,"input");
			} else
				here.setAttribute("snapID",this.value);
			config.macros.snapshot.go(here,ev);
			return false;
		};
		Popup.show(p,false);
		ev.cancelBubble=true;
		if(ev.stopPropagation)ev.stopPropagation();
		return false;
	},
	getpath: function() {
		// get current path
		var path=getLocalPath(window.location.href);
		var slashpos=path.lastIndexOf("/");
		if (slashpos==-1) slashpos=path.lastIndexOf("\\"); 
		if (slashpos!=-1) path=path.substr(0,slashpos+1); // trim filename
		return path;
	},
	getsnap: function(snapElem,id,printing,HTMLOnly) {
		var cms=config.macros.snapshot; // abbreviation
		var out="";
		out+="<html><head>\n";
		if (printing)
			out+='<base href="file:///'+cms.getpath().replace(/\\/g,'/')+'"></base>\n';
		if (!HTMLOnly) {
			var styles=document.getElementsByTagName("style");
			for(var i=0; i < styles.length; i++) {
				out+="<style>\n";
				out+="/* stylesheet="+styles[i].getAttribute("id")+" */\n";
				out+=styles[i].innerHTML+"\n\n";
				out+="</style>\n";
			}
		}
		out+="</head><body>\n\n<div"+(id==cms.viewerID?" class='tiddler viewer'>":">");
		out+=snapElem.innerHTML;
		out+="</div>\n\n</body>\n";
		out+="</html>";
		return out;
	},
	printsnap: function(out) {
		var win=window.open("","_blank","");
		win.document.open();
		win.document.writeln(out);
		win.document.close();
		win.focus(); // bring to front
		win.print(); // trigger print dialog
	},
	savesnap: function(out) {
		var cms=config.macros.snapshot; // abbreviation
		// make sure we are local
		if (window.location.protocol!="file:")
			{ alert(config.messages.notFileUrlError); return; }
		var target=cms.askForFilename(cms.fileMsg,cms.getpath(),cms.defaultFilename);
		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+cms.defaultFilename;
		var link="file:///"+target.replace(/\\/g,'/'); // link for message text
		var ok=saveFile(target,convertUnicodeToUTF8(out));
		var msg=ok?cms.okmsg.format([target]):cms.failmsg.format([target]);
		clearMessage(); displayMessage(msg,link);
	},
	askForFilename: 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;
	}
};
//}}}

// // TOOLBAR DEFINITIONS
//{{{
config.commands.snapshotSave = {
	text: "snap",
	tooltip: config.macros.snapshot.snapPrompt,
	handler: function(ev,src,title) {
		src.setAttribute("snapID","ask");
		src.setAttribute("printing","false");
		src.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
		config.macros.snapshot.go(src,ev);
		return false;
	}
};
config.commands.snapshotPrint = {
	text: "print",
	tooltip: config.macros.snapshot.printPrompt,
	handler: function(ev,src,title) {
		src.setAttribute("snapID","ask");
		src.setAttribute("printing","true");
		src.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
		config.macros.snapshot.go(src,ev);
		return false;
	}
};
//}}}

// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;
Popup.stickyPopup_onDocumentClick = function(ev)
{
	// if click is in a sticky popup, ignore it so popup will remain visible
	var e = ev ? ev : window.event; var target = resolveTarget(e);
	var p=target; while (p) {
		if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
		else p=p.parentNode;
	}
	if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
		Popup.onDocumentClick(ev);
	return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
/***
|Name|StickyPopupPlugin|
|Source|http://www.TiddlyTools.com/#StickyPopupPlugin|
|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|Popup.onDocumentClick|
|Options|##Configuration|
|Description|allow mouse interactions inside popups without automatically closing them|
Usually, when a TW popup is displayed, it is automatically closed whenever a click occurs //anywhere// in the document, either //inside// or //outside// the popup itself.  This plugin makes popups persistent (a.k.a, "sticky"), allowing you to perform multiple mouse interactions on content //inside// the popup (e.g., entering form fields, opening links, selecting text, etc.), remaining visible until you click //outside// the popup or perform an action that opens another popup (only one popup can be displayed at any given time).
!!!!!Configuration
<<<
You can cause popups to behave in a persistent ("sticky") manner simply by selecting the option checkbox below.  The selected popup display behavior will be applied to ALL popups in the document automatically.
><<option chkStickyPopups>> make all popups "sticky"
>{{{usage: <<option chkStickyPopups>>}}}
<<<
!!!!!Usage
<<<
If you are developing your own plugins or inline scripts that create popups programmatically using the core function:
{{{
Popup.create(this)
}}}
you can provide additional parameters that specify the desired CSS classname(s) to assign to the popup DOM element.  The default class when none is specified is simply "popup".  To create a //sticky// popup, simply enter a custom class combination like this:
{{{
Popup.create(this,null,"sticky popup")
}}}
<<<
!!!!!Revisions
<<<
2008.05.16 [1.0.1] added try..catch around addEvent/removeEvent calls to avoid error in Opera
2007.11.25 [1.0.0] initial release - moved from [[CoreTweaks]]
<<<
!!!!!Code
***/
//{{{
version.extensions.StickyPopupPlugin= {major: 1, minor: 0, revision: 1, date: new Date(2008,5,16)};

if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;

Popup.stickyPopup_onDocumentClick = function(ev)
{
	// if click is in a sticky popup, ignore it so popup will remain visible
	var e = ev ? ev : window.event; var target = resolveTarget(e);
	var p=target; while (p) {
		if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
		else p=p.parentNode;
	}
	if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
		Popup.onDocumentClick(ev);
	return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
!!!Contents
{{floatright{<<editSection Contents "view syntax">>}}}{{cola{//Html Scripts//
nav: <<tiddler Switch##Nav>>
refresh display: <<tiddler Switch##RefreshDisplay>>
tagger: <<tiddler Switch##Tagger>>
print: <<tiddler Switch##Print>>
embedded: <<tiddler Switch##Embedded>>
new here: <<tiddler Switch##newHere>>
edit: <<tiddler Switch##Edit>>
open group: <<tiddler Switch##OpenGroup>>
close + open group: <<tiddler Switch##CloseOpenGroup>>
header: <<tiddler Switch##Header>>
main toolbar: <<tiddler Switch##mainToolbar>>
main menu: <<tiddler Switch##mainMenu>>
sidebar: <<tiddler Switch##Sidebar>>
sort table: <<tiddler Switch##SortTable>>
resize text box: <<tiddler Switch##ResizeBox>>
switch style: <<tiddler Switch##StyleSheet>>
switch page template: <<tiddler Switch##PageTemplate>>
}}}{{colb{//Scripts dependent on InlineJavascriptPlugin://
top menu: <<tiddler Switch##ToggleTopMenu>>
rename all tagged: <<tiddler Switch##RenameTag>>
delete all tagged: <<tiddler Switch##DeleteTagged>>
open tagged: <<tiddler Switch##OpenTagged>>
table highlight: <<tiddler Switch##TableHighlight>>
list title: <<tiddler Switch##ListTitle>>
list pop: <<tiddler Switch##ListPop>>
list + pop: <<tiddler Switch##ListAndPop>>
list embedded: <<tiddler Switch##ListEmbed>>
list + embedded: <<tiddler Switch##ListAndEmbed>>
}}}{{clear{}}}
/%
!Nav
<html><hide linebreaks><span align="right"><font size="-1"><input type="button" value="&laquo;" onClick="history.go(-1)""/>
<input type="button" value="&raquo; "onClick="history.forward()"</font></span></html>
!Refresh
<html><a href="javascript:;" onclick="var tid=story.findContainingTiddler(this); if (tid) story.refreshTiddler(tid.getAttribute('tiddler'),null,true); return false;">&nbsp;&#8635; &nbsp;</a></html>
!Tagger
{{span{<<tagger>>}}}
!Print
{{span{<<newDocument label:print ask print here>>}}}
!Embedded
<html><hide linebreaks>
<a href="javascript:;" title="list tiddlers that have transcluded this tiddler" onclick="var t=story.findContainingTiddler(this).getAttribute('tiddler');var m=new RegExp('\<\<tiddler (\\[\\[)?'+t+'(\\]\\])?( with: .*)?\>\>','');var s=store.search(m,'text','excludeLists');var out=[];if(!s.length)out.push('no matching tiddlers');for(var i=0;i<s.length;i++)out.push(s[i].title);var p=Popup.create(this);var d=createTiddlyElement(p,'div');var s=d.style;s.padding='2px';s.textAlignment='left';wikify(out.join('\n'),d);Popup.show();event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"> inkl </a></html>
!newHere
<<newTiddler label:"new" title:{{tiddler.title}} focus:"text" tag:{{tiddler.title}}>>
!RefreshDisplay
<html><a href="javascript:;" onclick="var tid=story.forEachTiddler(function(t,e){story.refreshTiddler(t,null,true)});
refreshDisplay();return false;"<span>refresh</span></a></html>
!StyleSheet
<html><a href="#" onclick="story.switchTheme('');" class="button">default</a></html>
<html><a href="#" onclick="story.switchTheme('$2');" class="button">$1</a></html>
!PageTemplate
<html><a href="javascript:refreshPageTemplate('');">default</a></html>
<html><a href="javascript:refreshPageTemplate('$2');">$1</a></html>
!Edit
<html><a href="javascript:void(0)" onclick="story.displayTiddler(null,['$1'], DEFAULT_EDIT_TEMPLATE)">edit $2</a></html>
!OpenGroup
<html><a href="javascript:void(0)" onclick="story.displayTiddlers(null,store.getTiddlerText('$2').readBracketedList())">$1</a></html>
!CloseOpenGroup
<html><a href="javascript:void(0)" onclick="story.closeAllTiddlers();story.displayTiddlers(null,store.getTiddlerText('$2').readBracketedList())">$1</a></html>
!Header
<html><span><a href="javascript:;" title="Show/hide the header" onclick="javascript:if(!document.getElementById('header').style.display || document.getElementById('header').style.display == 'block') { document.getElementById('header').style.display = 'none'; } else { document.getElementById('header').style.display = 'block'; } return false;">&#9653;</a></span></html>
!mainToolbar
<html><span><a href="javascript:;" title="Show/hide the main toolbar" onclick="javascript:if(!document.getElementById('mainToolbar').style.display || document.getElementById('mainToolbar').style.display == 'block') { document.getElementById('mainToolbar').style.display = 'none'; } else { document.getElementById('mainToolbar').style.display = 'block'; } return false;">&#9653;</a></span></html>
!mainMenu
<html><span><a href="javascript:;" title="Show/hide the left side menu" onclick="javascript:if(!document.getElementById('mainMenu').style.display || document.getElementById('mainMenu').style.display == 'block') { document.getElementById('mainMenu').style.display = 'none'; document.getElementById('displayArea').style.marginLeft = '1em'; } else { document.getElementById('mainMenu').style.display = 'block'; document.getElementById('displayArea').style.marginLeft = '1em'; } return false;">&bull;</a></html>
!Sidebar
<html><span><a href="javascript:;" title="Show/hide the right side bar" onclick="javascript:if(!document.getElementById('sidebar').style.display || document.getElementById('sidebar').style.display == 'none') { document.getElementById('sidebar').style.display = 'block'; document.getElementById('displayArea').style.marginRight = '1em'; } else { document.getElementById('sidebar').style.display = 'none'; document.getElementById('displayArea').style.marginRight = '1em'; } return false;">&bull;</a></span></html>
!ResizeBox
<html><a href="javascript:function resize(w){try{var areas=w.document.getElementsByTagName('textarea');for(i=0;A=areas[i];i++){A.cols*=0.7;A.rows*=0.7;if(document.all&&!w.opera){A.runtimeStyle.height=DS(A.currentStyle.height);A.runtimeStyle.width=DS(A.currentStyle.width);}}for(var i=0;F=w.frames[i];i++){resize(F);}}catch(e){}}function DS(s){var c=parseInt(s);if(!isNaN(c)){var u=s.replace(c,'');if(u.indexOf('%')>=0)return s;return ((c*0.7)+u);}}resize(window);"<span>&nbsp;-&nbsp;</span></a></html><html><a href="javascript:function resize(w){try{var areas=w.document.getElementsByTagName('textarea');for(i=0;A=areas[i];i++){A.cols*=1.5;A.rows*=1.5;if(document.all&&!w.opera){A.runtimeStyle.height=DS(A.currentStyle.height);A.runtimeStyle.width=DS(A.currentStyle.width);}}for(var i=0;F=w.frames[i];i++){resize(F);}}catch(e){}}function DS(s){var c=parseInt(s);if(!isNaN(c)){var u=s.replace(c,'');if(u.indexOf('%')>=0)return s;return ((c*1.5)+u);}}resize(window);"<span>&nbsp;+&nbsp;</span></a></html>
!RenameTag
<html><a class="bookmarklet" title="rename all occurrences of a tag" href="javascript:(function(){if(window.version&#038;&#038;window.version.title=='TiddlyWiki'){var oldTag=prompt('Enter the tag to rename','oldTag');var newTag=prompt('Rename tag '+oldTag+' to:','newTag');var t=store.getTaggedTiddlers(oldTag);store.suspendNotifications();for(var i=0;i<t.length;i++){t[i].tags.remove(oldTag);t[i].tags.pushUnique(newTag);}store.resumeNotifications();refreshDisplay();}})()">RenameTag</a></html>
!DeleteTagged
<html><a class="bookmarklet" title="delete all tiddlers with a specified tag" href="javascript:void(eval(decodeURIComponent(&quot;(function()%257B%250A%2509if(window.version%2520%2526%2526%2520window.version.title%2520%253D%253D%2520'TiddlyWiki')%257B%250A%2509%2509var%2520tag%2520%253D%2520prompt('Delete%2520tiddlers%2520with%2520the%2520tag%253A'%252C'')%253B%250A%2509%2509store.suspendNotifications()%253B%250A%2509%2509var%2520t%2520%253D%2520store.getTaggedTiddlers(tag)%253B%250A%2509%2509for(var%2520i%253D0%253Bi%253Ct.length%253Bi%252B%252B)%250A%2509%2509%2509store.removeTiddler(t%255Bi%255D.title)%253B%250A%2509%2509store.resumeNotifications()%253B%250A%2509%2509refreshDisplay()%253B%2509%2509%250A%2509%257D%250A%257D)()&quot;)))">DeleteTagged</a></html>
!SortTable
<html><a href="javascript:function toArray (c){var a, k;a=new Array;for (k=0; k<c.length; ++k)a[k]=c[k];return a;}function insAtTop(par,child){if(par.childNodes.length) par.insertBefore(child, par.childNodes[0]);else par.appendChild(child);}function countCols(tab){var nCols, i;nCols=0;for(i=0;i<tab.rows.length;++i)if(tab.rows[i].cells.length>nCols)nCols=tab.rows[i].cells.length;return nCols;}function makeHeaderLink(tableNo, colNo, ord){var link;link=document.createElement('a');link.href='javascript:sortTable('+tableNo+','+colNo+','+ord+');';link.appendChild(document.createTextNode((ord>0)?'a':'d'));return link;}function makeHeader(tableNo,nCols){var header, headerCell, i;header=document.createElement('tr');for(i=0;i<nCols;++i){headerCell=document.createElement('td');headerCell.appendChild(makeHeaderLink(tableNo,i,1));headerCell.appendChild(document.createTextNode('/'));headerCell.appendChild(makeHeaderLink(tableNo,i,-1));header.appendChild(headerCell);}return header;}g_tables=toArray(document.getElementsByTagName('table'));if(!g_tables.length) alert(%22This page doesn't contain any tables.%22);(function(){var j, thead;for(j=0;j<g_tables.length;++j){thead=g_tables[j].createTHead();insAtTop(thead, makeHeader(j,countCols(g_tables[j])))}}) ();function compareRows(a,b){if(a.sortKey==b.sortKey)return 0;return (a.sortKey < b.sortKey) ? g_order : -g_order;}function sortTable(tableNo, colNo, ord){var table, rows, nR, bs, i, j, temp;g_order=ord;g_colNo=colNo;table=g_tables[tableNo];rows=new Array();nR=0;bs=table.tBodies;for(i=0; i<bs.length; ++i)for(j=0; j<bs[i].rows.length; ++j){rows[nR]=bs[i].rows[j];temp=rows[nR].cells[g_colNo];if(temp) rows[nR].sortKey=temp.innerHTML;else rows[nR].sortKey=%22%22;++nR;}rows.sort(compareRows);for (i=0; i < rows.length; ++i)insAtTop(table.tBodies[0], rows[i]);}"<span>sort table</span></a></html>
!

!SCRIPTS REQUIRING INLINE_JAVASCRIPT_PLUGIN:

!options
<script label="$1">
var who=prompt("Please set your $1",config.options.txt$1);
if (!who||!who.trim().length) return false;
config.options.txt$1=who;
saveOptionCookie("txt$1");
var tid=story.findContainingTiddler(place);
if (tid) story.refreshTiddler(tid.getAttribute("tiddler"),null,true);
var nodes = document.getElementsByTagName("input");
for(var t=0; t<nodes.length; t++)
if(nodes[t].getAttribute("option")=="txt$1") nodes[t].value=who;
return false;
</script><script>
place.lastChild.title="click to change your $1";
place.lastChild.innerHTML=config.options.txt$1;
</script>
!
Name:OpenTaggedTiddlers "packed"
Source:http://www.TiddlyTools.com/#OpenTaggedTiddlers
Version:1.0.1
Author:EricShulman
License:http://www.TiddlyTools.com/#LegalStatements
Requires:InlineJavascriptPlugin
Description:open multiple tagged tiddlers with a single click
Usage:<<tiddler OpenTaggedTiddlers with: "label" "tagToMatch" "sortBy" "reverse">>
!OpenTagged
<script label="$1">var list=[];var match="$2";var sortBy="$3"; if ((sortBy=="$"+"3")||(sortBy=="")) sortBy="title";var filter="[tag[%0]][sort[%1]]".format([match,sortBy]);var tids=store.filterTiddlers(filter);if ("$4"=="reverse") tids=tids.reverse();for (var t=0;t<tids.length;t++) list.push(tids[t].title);if ("$5"=="close") story.closeAllTiddlers();story.displayTiddlers(story.findContainingTiddler(place),list);return false;</script>
!ResizeFonts
<script label="fonts" title="Set font size of the whole site">void(f=prompt('New font size?','8pt'));for(i=0;i<document.getElementsByTagName('*').length;i++)void(document.getElementsByTagName('*')[i].style.fontSize=f);return false;</script>
!
Table Highlighting for Sortable & TW Tables Version 07.19.2009
ELS simplified code structure
!TableHighlight
<script>jQuery('table.sortable tbody tr').mouseover(function(){jQuery(this).addClass('highlight');jQuery(this).removeClass('evenRow');});jQuery('table.sortable tbody tr').mouseout(function(){jQuery(this).removeClass('highlight');jQuery('table.sortable tr:even').addClass('evenRow');});jQuery('table.twtable tbody tr').mouseover(function(){jQuery(this).addClass('highlight');jQuery(this).removeClass('evenRow');});jQuery('table.twtable tbody tr').mouseout(function(){jQuery(this).removeClass('highlight');jQuery('table.twtable tr:even').addClass('evenRow');});</script>
!ToggleTopMenu
<script label="&#10003;" title="Switch TopMenu on or off">if(window.version&&window.version.title=='TiddlyWiki'){var tm=document.getElementById('topMenu');var show=tm.style.display=='none';if(!show){tm.style.display='none';var margin='1em';}
else{tm.style.display='block';var margin=config.options.txtDisplayAreaTopMargin||'';}
document.getElementById('displayArea').style.marginTop=margin;config.options.chkShowTopMenu=show;saveOptionCookie('chkShowTopMenu');var sm=document.getElementById('storyMenu');if(sm)config.refreshers.content(sm);}
return false;</script>
!ListTitle
<script>var list=[];var tids=store.getTaggedTiddlers("$1");if (!tids.length) return;var out='';for(var t=0;t<tids.length; t++)out+=" [[%0]] &nbsp; ".format([tids[t].title]);return out;</script>
!ListPop
<script>var list=[];var tids=store.getTaggedTiddlers("$1");if (!tids.length) return;var out='';for(var t=0;t<tids.length; t++)out+=" <<tiddler Pop##Right with: [[%0]] [[%0]] ok>> \n".format([tids[t].title]);return out;</script>
!ListAndPop
<script>var list=[];var tids=store.getTaggedTiddlers("$1");if (!tids.length) return;var out='|borderless|k\n';for(var t=0;t<tids.length; t++)out+="| [[%0]]|@@maxWidth:50em;<<tiddler Pop##Right with: &nbsp;&rarr;&nbsp; [[%0]] ok '' 35em>>@@|\n".format([tids[t].title]);return out;</script>
!ListEmbed
<script>var list=[];var tids=store.getTaggedTiddlers("$1");if (!tids.length) return;var out='';for(var t=0;t<tids.length; t++)out+=" <<tiddler [[%0]]>> \n".format([tids[t].title]);return out;</script>
!ListAndEmbed
<script>var list=[];var tids=store.getTaggedTiddlers("$1");if (!tids.length) return;var out='|borderless|k\n';for(var t=0;t<tids.length; t++)out+="| [[%0]]|&nbsp;&rarr;&nbsp;|<<tiddler [[%0]]>>|\n".format([tids[t].title]);return out;</script>
!
%/
/***
|''Name:''|TableSortingPlugin|
|''Description:''|Dynamically sort tables by clicking on column headers|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TableSortingPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.02|
|''Date:''|25-01-2008|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Usage:
* Make sure your table has a header row
** {{{|Name|Phone Number|Address|h}}}<br> Note the /h/ that denote a header row 
* Give the table a class of 'sortable'
** {{{
|sortable|k
|Name|Phone Number|Address|h
}}}<br>Note the /k/ that denotes a class name being assigned to the table.
* To disallow sorting by a column, place {{{<<nosort>>}}} in it's header
* To automatically sort a table by a column, place {{{<<autosort>>}}} in the header for that column
** Or to sort automatically but in reverse order, use {{{<<autosort reverse>>}}}

!!Example:
|sortable|k
|Name |Salary |Extension |Performance |File Size |Start date |h
|ZBloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |
|ABloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |
|CBloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |
|DBloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |
|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |
|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |
|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |
|Shakespeare, Bill |Ā£122000.00|3211 |6 |33.22Gb |12/11/1961 |
|Shakespeare, Hamlet |Ā£9000 |9005 |-8 |3Gb |01/01/2002 |
|Fitz, Marvin |ā‚¬3300.30 |5554 |+5 |4Kb |05/22/1995 |

***/
// /%
//!BEGIN-PLUGIN-CODE
config.tableSorting = {
	
	darrow: "\u2193",
	
	uarrow: "\u2191",
	
	getText : function (o) {
		var p = o.cells[SORT_INDEX];
		return p.innerText || p.textContent || '';
	},
	
	sortTable : function (o,rev) {
		SORT_INDEX = o.getAttribute("index");
		var c = config.tableSorting;
		var T = findRelated(o.parentNode,"TABLE");
		if(T.tBodies[0].rows.length<=1) 
			return;
		var itm = "";
		var i = 0;
		while (itm == "" && i < T.tBodies[0].rows.length) {
			itm = c.getText(T.tBodies[0].rows[i]).trim();
			i++;
		}
		if (itm == "") 
			return; 	
		var r = [];
		var S = o.getElementsByTagName("span")[0];		
		c.fn = c.sortAlpha; 
		if(!isNaN(Date.parse(itm)))
			c.fn = c.sortDate; 
		else if(itm.match(/^[$|Ā£|ā‚¬|\+|\-]{0,1}\d*\.{0,1}\d+$/)) 
			c.fn = c.sortNumber; 
		else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/)) 
			c.fn = c.sortFile; 
		for(i=0; i<T.tBodies[0].rows.length; i++) {
			 r[i]=T.tBodies[0].rows[i]; 
		} 
		r.sort(c.reSort);
		if(S.firstChild.nodeValue==c.darrow || rev) {
			r.reverse();
			S.firstChild.nodeValue=c.uarrow;
		} 
		else 
			S.firstChild.nodeValue=c.darrow;
		var thead = T.getElementsByTagName('thead')[0]; 
		var headers = thead.rows[thead.rows.length-1].cells;
		for(var k=0; k<headers.length; k++) {
			if(!hasClass(headers[k],"nosort"))
				addClass(headers[k].getElementsByTagName("span")[0],"hidden");
		}
		removeClass(S,"hidden");
		for(i=0; i<r.length; i++) { 
			T.tBodies[0].appendChild(r[i]);
			c.stripe(r[i],i);
			for(var j=0; j<r[i].cells.length;j++){
				removeClass(r[i].cells[j],"sortedCol");
			}
			addClass(r[i].cells[SORT_INDEX],"sortedCol");
		}
	},
	
	stripe : function (e,i){
		var cl = ["oddRow","evenRow"];
		i&1? cl.reverse() : cl;
		removeClass(e,cl[1]);
		addClass(e,cl[0]);
	},
	
	sortNumber : function(v) {
		var x = parseFloat(this.getText(v).replace(/[^0-9.-]/g,''));
		return isNaN(x)? 0: x;
	},
	
	sortDate : function(v) {
		return Date.parse(this.getText(v));
	},

	sortAlpha : function(v) {
		return this.getText(v).toLowerCase();
	},
	
	sortFile : function(v) { 		
		var j, q = config.messages.sizeTemplates, s = this.getText(v);
		for (var i=0; i<q.length; i++) {
			if ((j = s.toLowerCase().indexOf(q[i].template.replace("%0\u00a0","").toLowerCase())) != -1)
				return q[i].unit * s.substr(0,j);
		}
		return parseFloat(s);
	},
	
	reSort : function(a,b){
		var c = config.tableSorting;
		var aa = c.fn(a);
		var bb = c.fn(b);
		return ((aa==bb)? 0 : ((aa<bb)? -1:1));
	}
};

Story.prototype.tSort_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText){
	var elem = this.tSort_refreshTiddler.apply(this,arguments);
	if(elem){
		var tables = elem.getElementsByTagName("TABLE");
		var c = config.tableSorting;
		for(var i=0; i<tables.length; i++){
			if(hasClass(tables[i],"sortable")){
				var x = null, rev, table = tables[i], thead = table.getElementsByTagName('thead')[0], headers = thead.rows[thead.rows.length-1].cells;
				for (var j=0; j<headers.length; j++){
					var h = headers[j];
					if (hasClass(h,"nosort"))
						continue;
					h.setAttribute("index",j);
					h.onclick = function(){c.sortTable(this); return false;};
					h.ondblclick = stopEvent;
					if(h.getElementsByTagName("span").length == 0)
						createTiddlyElement(h,"span",null,"hidden",c.uarrow); 
					if(!x && hasClass(h,"autosort")) {
						x = j;
						rev = hasClass(h,"reverse");
					}
				}
				if(x)
					c.sortTable(headers[x],rev);		
			}
		}
	}
	return elem; 
};

setStylesheet("table.sortable span.hidden {visibility:hidden;}\n"+
	"table.sortable thead {cursor:pointer;}\n"+
	"table.sortable .nosort {cursor:default;}\n"+
	"table.sortable td.sortedCol {background:#ffc;}","TableSortingPluginStyles");

function stopEvent(e){
	var ev = e? e : window.event;
	ev.cancelBubble = true;
	if (ev.stopPropagation) ev.stopPropagation();
	return false;	
}	

config.macros.nosort={
	handler : function(place){
		addClass(place,"nosort");
	}	
};

config.macros.autosort={
	handler : function(place,m,p,w,pS){
		addClass(place,"autosort"+" "+pS);		
	}	
};
//!END-PLUGIN-CODE
// %/
/***
|Name|TagCloudPlugin ''packed''|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.2.0|
|Author|EricShulman, ClintChecketts|
|Description|present a 'cloud' of tags using proportional font and colored display|
***/
//{{{
version.extensions.tagCloud={major:1,minor:1,revision:0,date:new Date(2006,2,4)};config.shadowTiddlers.TagCloud="<<tagCloud>>";setStylesheet(".tagCloud span{height: 3.5em;margin: 3px;}.tagCloud1{font-size: 80%;}.tagCloud2{font-size: 100%;}.tagCloud3{font-size: 120%;}.tagCloud4{font-size: 150%;}.tagCloud5{font-size: 180%;}.tagCloud6{font-size: 200%;}","tagCloudsStyles");config.macros.tagCloud={noTags:"No tag cloud created because there are no tags.",tooltip:"%1 tiddlers tagged with '%0'",segments:5,handler:function(a,b,c){var d=store.getTags();for(var t=0;t<d.length;t++){for(var p=0;p<c.length;p++){if(d[t][0]==c[p]){d[t][0]=""}}}var e=0;for(var t=0;t<d.length;t++){if(d[t][0].length>0){if(d[t][1]>e){e=d[t][1]}}}var f=e/config.macros.tagCloud.segments;var g=createTiddlyElement(a,"div",null,"tagCloud",null);if(!d.length){createTiddlyElement(g,"span",null,null,this.noTags)}else{for(var t=0;t<d.length;t++){if(d[t][0].length>0){g.appendChild(document.createTextNode(" "));var h=createTiddlyButton(g,d[t][0],this.tooltip.format(d[t]),onClickTag,"tagCloudtag tagCloud"+(Math.round(d[t][1]/f)+1));h.setAttribute("tag",d[t][0])}}}}};
//}}}
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.2.0|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|present a 'cloud' of tags using proportional font display|
!Usage
<<<
{{{<<tagCloud>>}}}
> show all tags in the document
{{{<<tagCloud tag tag tag...>>}}}
> show all tags except those listed as parameters
{{{<<tagCloud =tagvalue>>}}}
> show only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
<<<
!Examples
<<<
{{{<<tagCloud>>}}}
<<tagCloud>>
----
{{{<<tagCloud =package>>}}}
<<tagCloud =package>>
<<<
!Revisions
<<<
2008.09.05 [1.2.0] ELS: added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] ELS: added 'segments' property to macro object.  Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.tagCloud = {major: 1, minor: 2 , revision: 0, date: new Date(2008,9,5)};
//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman

config.shadowTiddlers.TagCloud="<<tagCloud>>";

setStylesheet("\
	.tagCloud span{height: 3.5em;margin: 3px;}\
	.tagCloud1{font-size: 80%;}\
	.tagCloud2{font-size: 100%;}\
	.tagCloud3{font-size: 120%;}\
	.tagCloud4{font-size: 150%;}\
	.tagCloud5{font-size: 180%;}\
	.tagCloud6{font-size: 200%;}\
	",
	"tagCloudsStyles");

config.macros.tagCloud = {
	noTags: "No tag cloud created because there are no tags.",
	tooltip: "%1 tiddlers tagged with '%0'",
	segments: 5,
	handler: function(place,macroName,params) {

		var tags=store.getTags();

		if (params.length) {
			if (params[0].substr(0,1)=="=") {
				// include only specifically tagged tags
				var tagged=store.getTaggedTiddlers(params[0].substr(1));
				for (var t=0; t<tagged.length; t++)
					tagged[t]=tagged[t].title;
				for (var t=0; t<tags.length; t++)
					if (!tagged.contains(tags[t][0])) tags[t][0]="";
			} else {
				// include all tags except those listed as params
				for (var t=0; t<tags.length; t++)
					if (params.contains(tags[t][0])) tags[t][0]="";
			}
		}

		// get maximum number of tags to calculate tagCloud segment sizes
		var mostTags=0;
		for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0)
			if (tags[t][1]>mostTags) mostTags=tags[t][1];
		var tagSegment=mostTags/config.macros.tagCloud.segments;

		// output
		var tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);
		if(!tags.length)
			createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);
		else for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){
			tagCloudWrapper.appendChild(document.createTextNode(" "));
			var theTag = createTiddlyButton(tagCloudWrapper,
				tags[t][0],this.tooltip.format(tags[t]),onClickTag,
				"tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1));
			theTag.setAttribute("tag",tags[t][0]);
		}
	}
};
//}}}
[[Open tag '$1'|$1]]
<<tiddler Switch##OpenTagged with: "Open all '$1'" "$1">>
<<closeTagged $1>>
<<keepTagged $1>>
{{nobullets{<<tagging $1>>}}}<<newTiddler label:"New $1 Tiddler" tag:"$1">>
<<tagDisplayed $1>>
<<untagDisplayed $1>>
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|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|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.'' 
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2008.01.22 [*.*.*] plugin size reduction - documentation moved to [[TaggedTemplateTweakInfo]]
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.
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.taggedTemplate= {major: 1, minor: 1, revision: 0, date: new Date(2007,6,23)};
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;
}
//}}}
/***
|''Name:''|~TaggerPlugin|
|''Version:''|1.0.1 (2006-06-01)|
|''Source:''|http://tw.lewcid.org//#TaggerPlugin|
|''Author:''|SaqImtiaz|
|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|
|''Documentation:''|[[TaggerPluginDocumentation]]|
|''Source Code:''|[[TaggerPluginSource]]|
|''~TiddlyWiki:''|Version 2.0.8 or better|
|''Requires''|[[DeprecatedFunctionsPlugin]]|
|''Stylesheet Changes''|ViewTemplate|
|See Above|<div class='toolbar'><span style="padding-right:2.45em;" macro='tagger source:TagDB exclude:excludeLists'></span></div>|


***/
//{{{

config.tagger={
       defaults:{
              label: '*fĆøj til overemne* ',
              tooltip: 'Administrer tiddler tags',
              taglist: 'true',
              excludeTags: 'excludeLists',
              notags: 'tiddleren har ingen tags',
              aretags: 'nuvƦrende tiddler tags:',
              toggletext: 'tilfĆøj tags:'
       }
};

config.macros.tagger={};
config.macros.tagger.arrow = (document.all?"ā–¼":"ā–¾"); // the fat one is the only one that works in IE
config.macros.tagger.handler =  function(place,macroName,params,wikifier,paramString,tiddler) {
       var defaults = config.tagger.defaults;
       var nAV = paramString.parseParams('tagman', null, true);
       var label = ((nAV[0].label)&&(nAV[0].label[0])!='.')?nAV[0].label[0]+this.arrow: defaults.label+this.arrow;
       var tooltip = ((nAV[0].tooltip)&&(nAV[0].tooltip[0])!='.')?nAV[0].tooltip[0]: defaults.tooltip;
       var taglist = ((nAV[0].taglist)&&(nAV[0].taglist[0])!='.')?nAV[0].taglist[0]: defaults.taglist;
       var exclude = ((nAV[0].exclude)&&(nAV[0].exclude[0])!='.')?(nAV[0].exclude[0]).readBracketedList(): defaults.excludeTags.readBracketedList();
       if ((nAV[0].source)&&(nAV[0].source[0])!='.')var source = nAV[0].source[0];
       if (source&&!store.getTiddler(source)) return false;

       var onclick = function(e) {
                   if (!e) var e = window.event;
                   var popup = Popup.create(this);
                   var tagsarray = store.getTags();
                   var tags=new Array();

                   for (var i=0; i<tagsarray.length; i++){
                       tags.push(tagsarray[i][0]);}

                   if (source)
                      {var sourcetiddler=store.getTiddler(source);
                       tags=sourcetiddler.tags.sort();}

                   var currentTags = tiddler.tags.sort();

                   var createButtons=function(text,theTag,tooltipPrefix){
                       var sp = createTiddlyElement(createTiddlyElement(popup,"li"),"span",null,"tagger");
                       var theToggle = createTiddlyButton(sp,text,tooltipPrefix+" '"+theTag+"'",taggerOnToggle,"button","toggleButton");
                       theToggle.setAttribute("tiddler",tiddler.title);
                       theToggle.setAttribute("tag",theTag);
                       insertSpacer(sp);
                       if (window.createTagButton_orig_mptw)
                           createTagButton_orig_mptw(sp,theTag);
                       else
                           createTagButton(sp,theTag);
                       }

                   createTiddlyElement(popup,"li",null,"listTitle",(tiddler.tags.length == 0 ? defaults.notags : defaults.aretags));

                   for (var t=0; t<currentTags.length; t++){
                      createButtons("[x]",currentTags[t],"remove tag ");
                       }

                   createTiddlyElement(createTiddlyElement(popup,"li"),"hr");

                   if (taglist!='false')
                      { createTiddlyElement(popup,"li",null,"listTitle",defaults.toggletext);
                        for (var i=0; i<tags.length; i++){
                          if (!tiddler.tags.contains(tags[i])&&!exclude.contains(tags[i]))
                                  {createButtons("[ ]",tags[i],"add tag ");
                                  }
                          }
                          createTiddlyElement(createTiddlyElement(popup,"li"),"hr");
                      }

                   var newTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),("Create new tag"),null,taggerOnToggle);
                   newTagButton.setAttribute("tiddler",tiddler.title);
                   if (source) newTagButton.setAttribute("source",source);

                   Popup.show(popup,false);
                   e.cancelBubble = true;
                   if (e.stopPropagation) e.stopPropagation();
                   return(false);
                   };

       createTiddlyButton(place,label,tooltip,onclick,"button","taggerDrpBtn");
};

window.taggerOnToggle = function(e) {
              var tag = this.getAttribute("tag");
              var title = this.getAttribute("tiddler");
              var tiddler = store.getTiddler(title);
              if (!tag)
                 {
                 var newtag=prompt("Skriv et nyt tag:","");
                 if (newtag!=''&&newtag!=null)
                    {
                    var tag=newtag;
                    if (this.getAttribute("source"))
                    {var sourcetiddler =  store.getTiddler(this.getAttribute("source"));
                    sourcetiddler.tags.pushUnique(newtag);}
                    }
                 else
                     {return false;};
                 }
              if (!tiddler || !tiddler.tags)
                 {store.saveTiddler(title,title,'',config.options.txtUserName,new Date(),tag);}
              else
                  {if (tiddler.tags.find(tag)==null)
                     {tiddler.tags.push(tag)}
                  else if(!newtag)
                      {tiddler.tags.splice(tiddler.tags.find(tag),1)};
                  store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags);};
              story.refreshTiddler(title,null,true);
              if(config.options.chkAutoSave)
                  saveChanges();
              return false;
};

setStylesheet(
 ".tagger a.button {font-weight: bold;display:inline; padding:0px;}\n"+
 ".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\n"+
 "#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\n"+
 ".popup .listTitle {color:#000;}\n"+
 "",
"TaggerStyles");

window.lewcidTiddlerSwapTag =  function (tiddler, oldTag, newTag){
                    for (var i = 0; i < tiddler.tags.length; i++)
			  if (tiddler.tags[i] == oldTag) {
				  tiddler.tags[i] = newTag;
				  return true;}
                         return false;
}

window.lewcidRenameTag = function(e) {
                    var tag=this.getAttribute("tag");
                    var newtag=prompt("Rename tag '"+tag+"' to:",tag);

                    if ((newtag==tag)||(newtag==null)) {return false;}

                    if(store.tiddlerExists(newtag))
                               {if(confirm(config.messages.overwriteWarning.format([newtag.toString()])))
                                             story.closeTiddler(newtag,false,false);
                               else
                                             return null;}

                    tagged=store.getTaggedTiddlers(tag);
                    if (tagged.length!=0){
                          for (var j = 0; j < tagged.length; j++)
                              lewcidTiddlerSwapTag(tagged[j],tag,newtag);}

                    if (store.tiddlerExists(tag))
                       {store.saveTiddler(tag,newtag);}
                    if (document.getElementById("tiddler"+tag))
                       {var oldTagTiddler =  document.getElementById(story.idPrefix + tag);
                       var before= story.positionTiddler(oldTagTiddler);
                       var place = document.getElementById(story.container);
                       story.closeTiddler(tag,false,false);
                       story.createTiddler(place,before,newtag,null);
                       story.saveTiddler(newtag);}
                    if(config.options.chkAutoSave)
                                                      saveChanges();
                    return false;
}


window.onClickTag=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);

        var nested = (!isNested(theTarget));
        if ((Popup.stack.length > 1)&&(nested==true)) {Popup.removeFrom(1);}
        else if(Popup.stack.length > 0 && nested==false) {Popup.removeFrom(0);};

        var theId = (nested==false)? "popup" : "nestedtagger";
        var popup = createTiddlyElement(document.body,"ol",theId,"popup",null);
        Popup.stack.push({root: this, popup: popup});

	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	if(popup && tag)
		{
		var tagged = store.getTaggedTiddlers(tag); 
		var titles = [];
		var li,r;
		for(r=0;r<tagged.length;r++)
			if(tagged[r].title != title)
				titles.push(tagged[r].title);
		var lingo = config.views.wikified.tag;
		if(titles.length > 0)
			{
			var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
			openAll.setAttribute("tag",tag);
			createTiddlyElement(createTiddlyElement(popup,"li"),"hr");
			for(r=0; r<titles.length; r++)
				{
				createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
				}
			}
		else
			createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));
		createTiddlyElement(createTiddlyElement(popup,"li"),"hr");
		var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);
		createTiddlyText(h,lingo.openTag.format([tag]));

		createTiddlyElement(createTiddlyElement(popup,"li"),"hr");

		var renameTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),("OmdĆøb tag '"+tag+"'"),null,lewcidRenameTag);
		renameTagButton.setAttribute("tag",tag)
		}
	Popup.show(popup,false);
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	return(false);
}

if (!window.isNested)
   window.isNested = function(e) {
        while (e != null) {
                var contentWrapper = document.getElementById("contentWrapper");
                if (contentWrapper == e) return true;
                e = e.parentNode;
                }
        return false;
   };

config.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://tw.lewcid.org/#TaggerPluginDocumentation]]";

config.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://tw.lewcid.org/#TaggerPluginSource]]";
//}}}
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{

merge(String.prototype,{

	parseTagExpr: function(debug) {

		if (this.trim() == "")
			return "(true)";

		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

		var spaced = this.
			// because square brackets in templates are no good
			// this means you can use [(With Spaces)] instead of [[With Spaces]]
			replace(/\[\(/g," [[").
			replace(/\)\]/g,"]] "). 
			// space things out so we can use readBracketedList. tricky eh?
			replace(anyLogicOp," $1 ");

		var expr = "";

		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

		for (var i=0;i<tokens.length;i++)
			if (tokens[i].match(singleLogicOp))
				expr += tokens[i];
			else
				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

		if (debug)
			alert(expr);

		return '('+expr+')';
	}

});

merge(TiddlyWiki.prototype,{
	getTiddlersByTagExpr: function(tagExpr,sortField) {

		var result = [];

		var expr = tagExpr.parseTagExpr();

		store.forEachTiddler(function(title,tiddler) {
			if (eval(expr))
				result.push(tiddler);
		});

		if(!sortField)
			sortField = "title";

		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
		
		return result;
	}
});

config.taggly = {

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

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

		tooDeepMessage: "* //sitemap too deep...//"
	},

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

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

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

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

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

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

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

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

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

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

		var upperColsize = colSize;
		var lowerColsize = colSize;

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

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

		return output;
	},

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

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

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

	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
	},

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

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

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

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

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

		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

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

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

				first = false;
			}
		}

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

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

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

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

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

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

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

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

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

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

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

						}
					}
				}
			}
		}

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

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

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

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

		var output = [];

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

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

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

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

	},

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

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

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

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

		var childOutput = "";

		if (depth > this.config.siteMapDepthLimit)
			childOutput += indent + this.lingo.tooDeepMessage;
		else
			for (var i=0;i<list.length;i++)
				if (list[i].title != title)
					if (this.notHidden(list[i].title,this.config.inTiddler))
						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

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

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

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var parsedParams = paramString.parseParams("tag",null,true);
				var refreshContainer = createTiddlyElement(place,"div");

				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);

				var tag = getParam(parsedParams,"tag");
				var expr = getParam(parsedParams,"expr");

				if (expr) {
					refreshContainer.setAttribute("isTagExpr","true");
					refreshContainer.setAttribute("title",expr);
					refreshContainer.setAttribute("showEmpty","true");
				}
				else {
					refreshContainer.setAttribute("isTagExpr","false");
					if (tag) {
        				refreshContainer.setAttribute("title",tag);
						refreshContainer.setAttribute("showEmpty","true");
					}
					else {
        				refreshContainer.setAttribute("title",tiddler.title);
						refreshContainer.setAttribute("showEmpty","false");
					}
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				var isTagExpr = place.getAttribute("isTagExpr") == "true";
				var showEmpty = place.getAttribute("showEmpty") == "true";
				removeChildren(place);
				addClass(place,"tagglyTagging");
				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
				if (countFound > 0 || showEmpty) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",
								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title,isTagExpr);
						if (countFound == 0 && showEmpty)
							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
					}
				}
			}
		}
	},

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

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

config.taggly.init();

//}}}

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

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

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

//}}}

/***
|Name|TiddlerAliasPlugin "packed"|
|Source|http://tiddlywiki.abego-software.de/Beta.html#TiddlerAliasPlugin|
|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; 2009 [[abego Software|http://www.abego-software.de]]|
|Description|Reference a tiddler through an alias (or even through many aliases).|
***/
//{{{
if(!version.extensions.TiddlerAliasPlugin){version.extensions.TiddlerAliasPlugin={major:1,minor:0,revision:0,beta:4,date:new Date(2009,2,30),source:"http://tiddlywiki.abego-software.de/Beta.html#TiddlerAliasPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2009 (www.abego-software.de)"};(function(){window.abegoTiddlerAlias={lingo:{aliasPrompt:"Type alias names (i.e. alternative names for this tiddler) separated with spaces, [[use double square brackets]] if necessary"},editTemplateExtension:"<div class='editor' macro='edit alias'></div><div class='editorFooter'><span macro='message abegoTiddlerAlias.lingo.aliasPrompt'></span></div>"};var j;var k;var i;var a=true;function n(){return a}function f(q,r){var p=r.replace(/\s/g,"-");if(p!=r){q[p]=r}}function m(){var p={};store.forEachTiddler(function(v,r){var t=store.getValue(r,"alias");if(t){var u=t.parseParams("list",null,false,true);for(var q=1;q<u.length;q++){p[u[q].value]=v}}if(n()){f(p,v)}});return p}abegoTiddlerAlias.getAliases=function(){if(!store.aliases){store.aliases=m()}return store.aliases};abegoTiddlerAlias.getAliasTitle=function(q){var p=abegoTiddlerAlias.getAliases()[q];return p?p:(store.fetchTiddler(q)?q:null)};function b(p){return p.indexOf(abegoTiddlerAlias.editTemplateExtension)>=0}function d(q){if(q&&!b(q)){var p=q.lastIndexOf("</div>");if(p>=0){return q.slice(0,p+6)+"\n"+abegoTiddlerAlias.editTemplateExtension+q.slice(p+6)}}return null}function o(){j=store.fetchTiddler;store.fetchTiddler=function(q){var p=j.apply(this,arguments);if(!p&&q){q=abegoTiddlerAlias.getAliases()[q];if(q){p=j.apply(this,[q])}}return p}}function h(){k=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(){var p=k.apply(this,arguments);delete store.aliases;return p}}function l(){i=Story.prototype.displayTiddler;Story.prototype.displayTiddler=function(s,u,w,p,x,q,r,v){var t=store.fetchTiddler(u);if(t){u=t.title}return i.apply(this,[s,u,w,p,x,q,r,v])}}function c(){var q=d(config.shadowTiddlers.EditTemplate);if(q){config.shadowTiddlers.EditTemplate=q}var p=store.getTiddler("EditTemplate");if(p&&!b(p.text)){p.set(null,d(p.text))}}function e(){o();h();l();c()}if(!store){var g=restart;window.restart=function(){e();g.apply(this,arguments)}}else{e()}config.abegoTiddlerAlias=abegoTiddlerAlias})()};
//}}}
/***
!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.
***/
/***
|Name|TiddlyCalendar'|
|Description|Tiddlers Calendar,Date picker|
|Version|1.0.0|
|Source|http://ptw.sourceforge.net/ptwe.html|
|Author|BramChen (bram.chen (at) gmail (dot) com)|
|License|[[Creative Commons Attribution-ShareAlike 3.0 License]]|
|Optional|DatePlugin|
***/
//{{{
version.extensions.tCalendar={major:1,minor:0,revision:0,date:new Date("Nov 21, 2007")};function Calendar(){this.locale=Calendar.locale;this.styles=Calendar.styles;this.callback={fn:null,fnEnable:false,option:null,params:{date:null,title:null,celldate:null,cellClass:null,dateFmt:null}};return this}Calendar.locale="en";Calendar[Calendar.locale]={dates:{days:["Su","M","Tu","W","Th","F","Sa"],yearFmt:"YYYY",monthFmt:"mmm YYYY",dateFmt:"MMM DD, YYYY",longHolidayFmt:"0DD/0MM/YYYY",shortHolidayFmt:"0DD/0MM",startOfWeek:0,weekends:[true,false,false,false,false,false,true],holidays:[]}};Calendar.prototype.show=function(_1,_2,_3,_4){var y,m=new Date().getMonth()+1,c=1;c=isNaN(_4)?(isNaN(_2)&&isNaN(_3)?c:(!isNaN(_2)&&isNaN(_3)?12:c)):parseInt(_4);m=isNaN(_3)?(isNaN(_2)?m:(isNaN(_3)?1:parseInt(_3))):parseInt(_3);y=isNaN(_2)?new Date().getFullYear():parseInt(_2);this.dateFmt=(this.callback.params.dateFmt)?this.callback.params.dateFmt:Calendar[this.locale].dates.dateFmt;for(var i=0;i<c;i++){var _7=new Date(y,m-1+i,1);if((m+i)%12==1||i==0){var _8=createTiddlyElement(_1,"table",null,"calendarWrapper");var _9=createTiddlyElement(_8,"tbody");if(c>1&&m==1&&c%12==0){this.naviBar(_8,_9,_7,true)}}if(i%3==0){var tr=createTiddlyElement(_9,"tr",null,"monthRow")}var td=createTiddlyElement(tr,"td");td.vAlign="top";this.selectMonth(td,_7)}if(c>3){Calendar.dummyDateCell(tr,(3-c%3)%3,2)}};Calendar.prototype.selectMonth=function(_c,_d){var _e=_d.getFullYear();var _f=createTiddlyElement(_c,"table",null,"calendar");var _10=createTiddlyElement(_f,"tbody");this.naviBar(_c,_10,_d);if(store.isDirty()||!Calendar.tiddlers){Calendar.hashTiddlers(_d)}this.showMonth(_10,_d)};Calendar.prototype.naviBar=function(_11,_12,_13,_14){var cal=this;var _16=createTiddlyElement(createTiddlyElement(_12,"tr"),"td",null,"naviBar",null,{colSpan:7});var _17=function(s,_19,_1a){if(_1a){cal.show(s.parentNode,_19.getFullYear(),1,12);removeNode(s)}else{cal.selectMonth(s,_19,cal.dateFmt);removeNode(s.firstChild)}};var _1b=function(ev){var e=ev?ev:window.event;var _1e=null;for(var i=0,options=this.options;i<this.options.length;i++){if(options[i].selected){_1e=new Date(options[i].value)}}_17.call(this,_11,_1e,_14);return false};var _20=_13.getFullYear();var n=3;var y=_14?_20-n:_20;var m=_14?0:new Date(_13).getMonth()-n;var c=null;var _25=[];var fmt=_14?Calendar[this.locale].dates.yearFmt:Calendar[this.locale].dates.monthFmt;for(var i=0;i<n*2+1;i++){c=_14?new Date(y+i,1,1):new Date(y,m+i,1);_25.push({caption:c.formatString(fmt),name:c})}var sel=createTiddlyDropDown(_16,_1b,_25,n);sel.selectedIndex=n};Calendar.prototype.showMonth=function(_29,_2a){var _2b=new Date(_2a).getFullYear();var _2c=new Date(_2a).getMonth()+1;var _2d=new Date(_2b,_2c,0).getDate();var _2e=new Date(_2b,_2c,1).getDay();var _2f=(7+_2a.getDay()-Calendar[this.locale].dates.startOfWeek)%7;var _30=createTiddlyElement(_29,"tr");for(var i=0,ii=0,text=null;i<7;i++){ii=(Calendar[this.locale].dates.startOfWeek+i)%7;text=Calendar[this.locale].dates.days[ii];createTiddlyElement(_30,"th",null,null,text)}var d=1,dayRow=null,celldate=null,isWeekend=false;while(d<=_2d){dayRow=createTiddlyElement(_29,"tr");if(_2f>0){Calendar.dummyDateCell(dayRow,_2f,6)}for(var i=_2f;i<7&&d<=_2d;i++,d++){celldate=new Date(_2b,_2c-1,d);isWeekend=Calendar[this.locale].dates.weekends[(i+Calendar[this.locale].dates.startOfWeek)%7];this.showDate(dayRow,d,celldate,isWeekend)}_2f=0}var n=7-(7+_2e-Calendar[this.locale].dates.startOfWeek)%7;if(n<7){Calendar.dummyDateCell(dayRow,n,6)}};Calendar.prototype.showDate=function(_35,_36,_37,_38){var now=new Date();var _3a=this.dateFmt;var _3b=now.formatString(_3a);var _3c="dateCell";var _3d=_37.formatString(_3a);var day=_37.getDay();var _3f=_3b==_3d;var _40=this.isHoliday(_37);if(_3f){_3c+=" today"}if(_38){_3c+=" weekend"}if(_40){_3c+=" holiday"}var _41=createTiddlyElement(_35,"td",null,_3c);var ymd=_37.convertToLocalYYYYMMDDHHMM().substr(0,8);var _43=this.callback;var _44=_43.option;if(!_44){if(Calendar.tiddlers[ymd]){_3c+=" hasChanged";_44="popup"}else{_44="displayTiddler"}}var _45=_43.params;merge(_45,{date:_36,title:_3d,celldate:_37,cellClass:_3c,dateFmt:_3a});if(_43.fn instanceof Function&&_43.fnEnable){_43.fn(_41,_45)}else{Calendar.optionHandler(_41,_44,_45,_37)}};Calendar.prototype.isHoliday=function(_46){return Calendar[this.locale].dates.holidays.containsAny([_46.formatString(Calendar[this.locale].dates.longHolidayFmt),_46.formatString(Calendar[this.locale].dates.shortHolidayFmt)])};Calendar.dummyDateCell=function(_47,n,max){for(var i=0;i<n&&i<max;i++){createTiddlyElement(_47,"td")}};Calendar.hashTiddlers=function(_4b){if(_4b){var ymd=_4b.convertToLocalYYYYMMDDHHMM().substr(0,8)}var _4d=false;var _4e={};store.forEachTiddler(function(_4f,_50){var _51=_50.modified.convertToLocalYYYYMMDDHHMM().substr(0,8);var _52=_50.created.convertToLocalYYYYMMDDHHMM().substr(0,8);var _53=(_50.modified==_50.created);if(!_4e[_51]){_4e[_51]=[]}_4e[_51].push({title:_50.title,modified:_50.modified,ymd:_51,isCreated:_53?" isCreated":""})});this.tiddlers=_4e};Calendar.optionHandler=function(_54,_55,_56,_57){var fn=Calendar.optionType[_55];var _59=function(ev){var e=ev?ev:window.event;var fn=Calendar.optionType[_55];if(fn instanceof Function){fn.call(this,e,_54,_56)}return false};createTiddlyButton(_54,_56.date,_56.title,_59,_56.cellClass,null,null,_56)};Calendar.optionType={displayTiddler:function(e){story.displayTiddler(null,this.title)},popup:function(e,_5f){var _60=new Date(this.getAttribute("celldate"));Calendar.onClickDatePopup(e,_5f,this.title,_60)},pickDate:function(e){Calendar.pickDate.call(this,e)}};Calendar.onClickDatePopup=function(ev,_63,_64,_65){var e=ev?ev:window.event;if(store.isDirty()){Calendar.hashTiddlers(_65)}var ymd=_65.convertToLocalYYYYMMDDHHMM().substr(0,8);var _68=Calendar.tiddlers[ymd];var _69=Popup.create(_63,null,"datePopup popup");createTiddlyElement(_69,"br");this.optionHandler(_69,"displayTiddler",{title:_64,date:_64});if(_68){createTiddlyElement(_69,"hr");for(var i=0;i<_68.length;i++){this.optionHandler(createTiddlyElement(_69,"li"),"displayTiddler",{date:_68[i].title,title:_68[i].title,cellClass:_68[i].isCreated})}}Popup.show();e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation()}return false};Calendar.pickDate=function(ev){var e=ev?ev:window.event;var _6d=this.getAttribute("inputId");if(_6d){var _6e=document.getElementById(_6d);if(_6e){_6e.value=this.title}}return false};config.shadowTiddlers.CalendarStyle=Calendar.styles;config.notifyTiddlers.pushUnique({name:"CalendarStyle",notify:refreshStyles});var calendar=new Calendar();var datepicker=new Calendar();config.macros.tCalendar={init:function(){var _6f=config.options.chkCalendarCallback==undefined?false:config.options.chkCalendarCallback;calendar.callback={fn:this.showDate,fnEnable:(window.showDate instanceof Function&&_6f),option:null,params:{date:null,dateFmt:null,celldate:null}}}};config.macros.tCalendar.handler=function(_70,_71,_72){var _73=_72[2]?_72[2]:(_72[1]?_72[1]:_72[0]);var _74=_72[0];var _75=isNaN(_72[1])?1:parseInt(_72[1]);var now=new Date();var y=now.getFullYear();var m=now.getMonth()+1;var c=isNaN(_72[1])?1:parseInt(_72[1]);switch(_73){case"month":case"months":m=_74=="last"?m-c:m+1;break;case"thisyear":m=1;c=12;break;case"year":case"years":y=_74=="last"?y-c:y+1;m=1;c=12*c;break;case"timeline":break;default:y=_72[0];m=_72[1];c=_72[2]}calendar.locale=config.options.txtLocale?config.options.txtLocale:Calendar.locale;calendar.locale=Calendar[calendar.locale]?calendar.locale:"en";calendar.show(_70,y,m,c)};config.macros.tCalendar.showDate=function(_7a,_7b){var _7c=(_7b.cellClass.indexOf("weekend")!=-1);window.showDate(_7a,_7b.celldate,"popup","DD",_7b.dateFmt,true,_7c)};config.macros.datePicker={onClick:function(ev){var e=ev?ev:window.event;var _7f=this.getAttribute("inputId");var _80=this.getAttribute("dateFmt");_80=_80=="null"?null:_80;datepicker.callback={fn:null,fnEnable:false,option:"pickDate",params:{inputId:_7f,dateFmt:_80}};var _81=Popup.create(this);datepicker.locale=config.options.txtLocale?config.options.txtLocale:Calendar.locale;datepicker.locale=Calendar[datepicker.locale]?datepicker.locale:"en";datepicker.show(_81);Popup.show();e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation()}return false}};config.macros.datePicker.handler=function(_82,_83,_84){if(!_84){return}var id=_84[0];var _86=_84[1]?_84[1]:null;var _87={inputId:id,dateFmt:_86};var _88=createTiddlyElement(_82,"input",id);var btn=createTiddlyButton(_82,"?","Date Picker",this.onClick,"datepicker",null,null,_87)};
//}}}
http://dl.getdropbox.com/u/1064531/Musik/Kim%20Larsen%20%26%20Kjukken.mp3
Kim Larsens udgave
----
http://dl.getdropbox.com/u/1064531/Musik/DET%20VAR%20EN%20LORDAG%20AFTEN%28AS%20SUNG%20BY%20Kurt%20Dahl%20Andersen%29.mp3
Kurt Dahl Andersens udgave
----
http://dl.getdropbox.com/u/1064531/Musik/NH%C3%98P%20%26%20Kenny%20Drew.mp3
NHƘP og Kenny Drews udgave
----
http://dl.getdropbox.com/u/1064531/Musik/Erling%20Jan%20S%C3%B8rensens%20klaver-arrangement.mp3
Erling Jan SĆørensens udgave

/***
|Name|TiddlyPodPlugin|
|Source|http://www.TiddlyTools.com/#TiddlyPodPlugin|
|Version|1.4.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|TiddlyPodList|
|Overrides||
|Description|autoplay music randomly selected from playlist using embedded player|
!!!!!Usage
<<<
{{{
<<tiddlyPod autoplay loop verbose track:... width:... height:... size:... @TiddlerName>>
}}}
where:
* ''autoplay'' / ''noautoplay'' (keyword, default=''autoplay'')<br>the selected item will play immediately, without pressing the PLAY button.
* ''loop'' / ''noloop'' (keyword, default=''noloop'')<br>the current item is repeatedly played until you press the stop button.
* ''verbose'' (keyword, default=//none//)<br>a message will be displayed whenever an item is selected.
* ''track:...'' (number, default=//last played//)<br>the index into the playlist for the initial item to load into the player.  If no item is specified, the last one played is re-loaded (tracked in a browser cookie).  If no cookie exists (i.e., the first time you play after installing, or after clearing cookies, etc.), then the first item in the playlist is used.
* ''width:...'' and ''height:...'' (default=115x15 for QuickTime or, if using Internet Explorer, 90x44 for Windows Media Player)<br>specify a non-default width/height dimensions for the embedded player (using pixels).
* ''size:xxxx'' (default="auto")<br>a fixed height for the playlist popup container itself (using CSS measurement units, e.g., "px", "em", "cm", "in", etc.).  If the items in the list overflow this height, then a scrollbar is automatically added to the popup list.  "auto" shows //all// playlist entries without scrolling, using a variable height popup.
* ''@~TiddlerName'' (default=[[TiddlyPodList]])<br>specifies a tiddler containing the list of items to play.  Entries in the list are separated by "----", and each entry consist of two lines: the first line is the location (or URL) of the media file to be played.  The second line is a title to be displayed when that item is playing.
<<<
!!!!!Examples
<<<
{{{<<tiddlyPod noautoplay loop track:1 @TiddlyPodList>>}}}
<<tiddlyPod noautoplay loop track:1 @TiddlyPodList>>
<<<
!!!!!Revisions
<<<
2008.03.22 [1.4.4] added [[TiddlyPod]] shadow definition.
2008.03.21 [1.4.3] removed {{{pluginspage="http://www.apple.com/quicktime/download/"}}} param from HTML {{{<embed>}}}, so that FireFox (and other browsers) don't //prefer// QuickTime over other installed media players.  ''It is still up to the browser to determine which player to use.''.
2007.11.09 [1.4.2] in handler(), corrected default initialization of chkTiddlyPodAutoPlay and chkTiddlyPodLoopPlay.
2007.06.12 [1.4.1] in play(), don't call removeChildren(), since browser will clean up objects when assignment to innerHTML is made
2007.02.23 [1.4.0] added support for using 'attachment tiddlers' (see AttachFilePlugin) for self-contained playback.  This seems to work well with QuickTime.  Other embedded players may vary in support for the data:// URI.  Note: IE6/7 does NOT support data:// URI.  Attachments should always have local and/or remote fallbacks defined.
2007.02.23 [1.3.1] added support for scrollbar to playlist popup.  Use size:xxx to set the length of the playlist, where 'xxx' is any valid CSS measurement.  Use "auto" to show all playlist items without scrolling.  Also, added popup items for controlling autoplay/loopplay preferences.
2007.02.21 [1.3.0] added playlist popup and rewrote getPod() and play() to use innerHTML instead of wikify().  Eliminates all dependency on InlineJavascriptPlugin when rendering output.
2007.02.20 [1.2.1] added optional 'track:#' parameter to specify initial track, instead of starting with a random track
2007.02.20 [1.2.0] added optional 'loop' parameter to trigger looping playback
2007.02.20 [1.1.0] removed link for "edit playlist" to reduce clutter and provide a 'playback only' interface.  When changing the play list is appropriate, a link to [[TiddlyPodList]] (or any alternative playlist tiddler) can be directly added to surrounding tiddler content as needed.
2007.02.19 [1.0.0] initial release (converted from inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlyPodPlugin= {major: 1, minor: 4, revision: 4, date: new Date(2008,3,22)};

config.shadowTiddlers['TiddlyPod']='<<tiddlyPod>>';

config.macros.tiddlyPod= {
	verbose: false, // set to true to display messages
	playlist: "TiddlyPodList", // tiddler containing list of tunes
	size: "auto", // maximum length (using CSS) of playlist to show before adding a scrollbar
	width: config.browser.isIE?90:115, // width of embedded player (IE w/WinMedia vs FireFox w/QuickTime)
	height: config.browser.isIE?44:15, // height of embedded player (IE w/WinMedia vs FireFox w/QuickTime)
	getPlayer: function(src,w,h,auto,loop) {
		var out='';
		out+='<EMBED WIDTH="'+w+'" HEIGHT="'+h+'" ';
		out+='	style="height:'+h+'px;width:'+w+'px;margin:0;padding:0;" ';
		out+='	src="'+src+'" ';
		out+='	autostart="'+(auto?'true':'false')+'" autoplay="'+(auto?'true':'false')+'" ';
		out+='	loop="'+(loop?'true':'false')+'" ';
		out+='	controller="show" volume="100" EnableJavaScript="true" ';
		out+='	showtracker="1" showpositioncontrols="0" showaudiocontrols="0" ';
		out+='	showdisplay="0" showstatusbar="0" showgotobar="0"> ';
		out+='</EMBED>';
		return out;
	},
	getPod: function(playlist,which) {
		var txt=store.getTiddlerText(playlist); if (!txt) return;
		var songs=txt.split("\n----\n");
		var first=0;
		var last=songs.length-1;
		if (which===undefined) which=config.options.txtTiddlyPodNowPlaying;
		if (which<first) which=first; if (which>last) which=last;
		var next=(which-1)+2; if (next>last) next=last;
		var prev=which-1; if (prev<first) prev=first;
		var src=songs[which].split("\n")[0];
		var descr=songs[which].split("\n")[1];

		// if src is a tiddlername, check for attachment
		if (config.macros.attach!=undefined) // if AttachFilePlugin is installed
			if ((tid=store.getTiddler(src))!=null && tid.isTagged("attachment")) // if src is attachment tiddler title
				src=config.macros.attach.getAttachment(src); // replace TiddlerTitle with attachment-expanded src URL

		var out='';
		var tip=config.messages.externalLinkTooltip.format([src]); // use core defined tooltip
		out+='<div><a href="'+src+'" target="_blank" class="button" title="'+tip+'" style="white-space:normal">'+descr+'</a></div>';
		out+=this.getPlayer(src,this.width,this.height,config.options.chkTiddlyPodAutoPlay,config.options.chkTiddlyPodLoopPlay);
		out+='<div class="small">';
		out+='<a href="javascript:;" class="button" title="[first] track '+(first+1)+' - '+songs[first].split("\n")[1]+'" ';
		out+='	onclick="config.macros.tiddlyPod.play(this.parentNode.parentNode,'+first+'); return false;">&lt;&lt;</a>';
		out+='&nbsp;';
		out+='<a href="javascript:;" class="button" title="[previous] track '+(prev+1)+' - '+songs[prev].split("\n")[1]+'" ';
		out+='	onclick="config.macros.tiddlyPod.play(this.parentNode.parentNode,'+prev+'); return false;">&nbsp;&lt;&nbsp;</a>';
		out+='&nbsp;';
		out+='<a href="javascript:;" class="button" title="[playlist]" ';
		out+='	onclick="config.macros.tiddlyPod.showpopup(this,event); return false;">...</a>';
		out+='&nbsp;';
		out+='<a href="javascript:;" class="button" title="[next] track '+(next+1)+' - '+songs[next].split("\n")[1]+'" ';
		out+='	onclick="config.macros.tiddlyPod.play(this.parentNode.parentNode,'+next+'); return false;">&nbsp;&gt;&nbsp;</a>';
		out+='&nbsp;';
		out+='<a href="javascript:;" class="button" title="[last] track '+(last+1)+' - '+songs[last].split("\n")[1]+'" ';
		out+='	onclick="config.macros.tiddlyPod.play(this.parentNode.parentNode,'+last+'); return false;">&gt;&gt;</a>';
		out+='</div>';

		if (this.verbose) displayMessage('now playing... track '+(which+1)+' - "'+descr+'"');
		return out;
	},
	play: function(target,which) {
		if (which==undefined) which=config.options.txtTiddlyPodNowPlaying; // if not specified, use most recently played item
		if (which==undefined) which=0; // default to first item in playlist if no previous item
		target.innerHTML=this.getPod(this.playlist,which);
		config.options.txtTiddlyPodNowPlaying=which;
		saveOptionCookie("txtTiddlyPodNowPlaying");
		return;
	},
	showpopup: function(place,event) {
		var popup=Popup.create(place); if (!popup) return;
		var txt=store.getTiddlerText(this.playlist); if (!txt) return;
		var songs=txt.split("\n----\n");
		config.macros.tiddlyPod.target=place.parentNode.parentNode;
		createTiddlyButton(createTiddlyElement(popup,'li'),
			"play a randomly selected track", "shuffle play",
			function(){
				var t=config.options.chkTiddlyPodAutoPlay;
				config.options.chkTiddlyPodAutoPlay=true; // force autoplay
				config.macros.tiddlyPod.play(config.macros.tiddlyPod.target,Math.floor(Math.random()*songs.length));
				config.options.chkTiddlyPodAutoPlay=t;
				return false;
			});
		createTiddlyElement(popup,"hr");
		createTiddlyButton(createTiddlyElement(popup,'li'),
			(config.options.chkTiddlyPodAutoPlay?"[x]":"[_]")+" auto play",
			"automatically play tune when selected (if off, press PLAY button to start)",
			function(){
				config.options.chkTiddlyPodAutoPlay=!config.options.chkTiddlyPodAutoPlay;
				saveOptionCookie("chkTiddlyPodAutoPlay");
				config.macros.tiddlyPod.play(config.macros.tiddlyPod.target,config.options.txtTiddlyPodNowPlaying);
				return false;
			});
		createTiddlyButton(createTiddlyElement(popup,'li'),
			(config.options.chkTiddlyPodLoopPlay?"[x]":"[_]")+" repeat play",
			"when playback is finished, repeat the current selection again",
			function(){
				config.options.chkTiddlyPodLoopPlay=!config.options.chkTiddlyPodLoopPlay;
				saveOptionCookie("chkTiddlyPodLoopPlay");
				config.macros.tiddlyPod.play(config.macros.tiddlyPod.target,config.options.txtTiddlyPodNowPlaying);
				return false;
			});
		createTiddlyElement(popup,"hr");
		var playlist=createTiddlyElement(popup,"div",null,"fine"); // uses 'fine' CSS class to set font size
		playlist.style.padding="2px"; // room for dotted 'focus' indicator (prevent horizontal scrollbar from appearing)
		playlist.style.height=config.macros.tiddlyPod.size;
		playlist.style.overflow="auto";
		for (var s=0; s<songs.length; s++) {
			var src=songs[s].split("\n")[0];
			var descr=(s+1)+" - "+songs[s].split("\n")[1];
			var a=createTiddlyButton(createTiddlyElement(playlist,'li'), descr, src,
				function(){
					var t=config.options.chkTiddlyPodAutoPlay;
					config.options.chkTiddlyPodAutoPlay=true; // force autoplay
					config.macros.tiddlyPod.play(config.macros.tiddlyPod.target,this.getAttribute("which"));
					config.options.chkTiddlyPodAutoPlay=t;
					return false;
				});
			a.setAttribute("which",s); // song index
			if (s==config.options.txtTiddlyPodNowPlaying) a.style.fontWeight="bold";
		}
		createTiddlyElement(popup,"hr");
		createTiddlyButton(createTiddlyElement(popup,'li'), 'edit playlist...', '',
			function(){story.displayTiddler(null,config.macros.tiddlyPod.playlist,2);return false;});
		Popup.show(popup,false);
		if (!event) var event=window.event;
		if (event) event.cancelBubble = true;
		if (event && event.stopPropagation) event.stopPropagation();
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if (config.options.chkTiddlyPodAutoPlay==undefined)
			config.options.chkTiddlyPodAutoPlay=true; // default enable auto play
		if (config.options.chkTiddlyPodLoopPlay==undefined)
			config.options.chkTiddlyPodLoopPlay=false; // default disable loop play
		if (config.options.chkTiddlyPodNowPlaying==undefined)
			config.options.chkTiddlyPodNowPlaying=0; // default to first item in playlist
		while (p=params.shift()) {
			if (p=="autoplay")
				config.options.chkTiddlyPodAutoPlay=true; // enable auto play
			if (p=="noautoplay")
				config.options.chkTiddlyPodAutoPlay=false; // disable auto play
			else if (p=="loop")
				config.options.chkTiddlyPodLoopPlay=true; // enable loop play
			else if (p=="noloop")
				config.options.chkTiddlyPodLoopPlay=false; // disable loop play
			else if (p=="verbose")
				this.verbose=true; // enable message display
			else if (p.substr(0,1)=="@")
				this.playlist=p.substr(1); // alternative playlist tiddler 
			else if (p.substr(0,6)=="track:")
				config.options.txtTiddlyPodNowPlaying=p.substr(6)-1; // initial playlist index (0-based, e.g. track #1=index 0)
			else if (p.substr(0,6)=="width:")
				this.width=p.substr(6); // width of embedded player controls
			else if (p.substr(0,7)=="height:")
				this.height=p.substr(7); // height of embedded player controls
			else if (p.substr(0,11)=="size:")
				this.size=p.substr(11); // height of playlist in popup
		}
		this.play(createTiddlyElement(place,"span"),config.options.txtTiddlyPodNowPlaying);
	}
}
//}}}
<<forEachTiddler where 'tiddler.tags.contains("BĆøger")&& tiddler.data("wherekept") && tiddler.title.contains(context.viewerTiddler.title)'
sortBy 'tiddler.data("wherekept")'
write 
 '" [[Mere|"+tiddler.data("wherekept")+"]] "'

        none '"//ingen \"elev\" har lƦst den endnu//"'
>>
/%
|Name|ToggleLeftSidebar|
|Source|http://www.TiddlyTools.com/#ToggleLeftSidebar|
|Version|2.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|show/hide left sidebar (MainMenu)|

Usage: <<tiddler ToggleLeftSidebar with: "label">>

Config settings:
	config.options.chkShowLeftSidebar (true)
	config.options.txtToggleLeftSideBarLabelShow (ā–ŗ)
	config.options.txtToggleLeftSideBarLabelHide (ā—„)

%/<script label="$1" title="show/hide MainMenu content">
	var co=config.options;
	if (co.chkShowLeftSidebar=='undefined') co.chkShowLeftSidebar=true;
	co.chkShowLeftSidebar=!co.chkShowLeftSidebar;
	var mm=document.getElementById('mainMenu'); if (!mm) return;
	mm.style.display=co.chkShowLeftSidebar?'block':'none';
	document.getElementById('displayArea').style.marginLeft=co.chkShowLeftSidebar?'':'1em';
	saveOptionCookie('chkShowLeftSidebar');
	var labelShow=co.txtToggleLeftSideBarLabelShow||'&#x25BA;';
	var labelHide=co.txtToggleLeftSideBarLabelHide||'&#x25C4;';
	if (typeof(place)!='undefined' && '$1'=='$'+'1') {
		place.innerHTML=co.chkShowLeftSidebar?labelHide:labelShow;
		place.title=(co.chkShowLeftSidebar?'hide':'show')+' left sidebar';
	}
	var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
</script><script>
	var co=config.options;
	if (co.chkShowLeftSidebar=='undefined') co.chkShowLeftSidebar=true;
	var mm=document.getElementById('mainMenu'); if (!mm) return;
	mm.style.display=co.chkShowLeftSidebar?'block':'none';
	document.getElementById('displayArea').style.marginLeft=co.chkShowLeftSidebar?'':'1em';
	if ('$1'=='$'+'1') {
		var labelShow=co.txtToggleLeftSideBarLabelShow||'&#x25BA;';
		var labelHide=co.txtToggleLeftSideBarLabelHide||'&#x25C4;';
		place.lastChild.innerHTML=co.chkShowLeftSidebar?labelHide:labelShow;
		place.lastChild.title=(co.chkShowLeftSidebar?'hide':'show')+' left sidebar';
	}
</script>
/%
|Name|ToggleRightSidebar|
|Source|http://www.TiddlyTools.com/#ToggleRightSidebar|
|Version|2.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|show/hide right sidebar (MainMenu)|

Usage: <<tiddler ToggleRightSidebar with: "label">>

Config settings:
	config.options.chkShowRightSidebar (false)
	config.options.txtToggleRightSideBarLabelShow (ā–ŗ)
	config.options.txtToggleRightSideBarLabelHide (ā—„)

%/<script label="$1" title="show/hide right sidebar content">
	var co=config.options;
	if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
	co.chkShowRightSidebar=!co.chkShowRightSidebar;
	var sb=document.getElementById('sidebar'); if (!sb) return;
	sb.style.display=co.chkShowRightSidebar?'block':'none';
	document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
	saveOptionCookie('chkShowRightSidebar');
	var labelShow=co.txtToggleRightSideBarLabelShow||(config.browser.isSafari?'&#x25c0;':'&#x25c4;');
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25ba;';
	if (typeof(place)!='undefined' && '$1'=='$'+'1') {
		place.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
		place.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
	}
	var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
</script><script>
	var co=config.options;
	if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
	var sb=document.getElementById('sidebar'); if (!sb) return;
	sb.style.display=co.chkShowRightSidebar?'block':'none';
	document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
	if ('$1'=='$'+'1') {
		var labelShow=co.txtToggleRightSideBarLabelShow||(config.browser.isSafari?'&#x25c0;':'&#x25c4;');
		var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25ba;';
		place.lastChild.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
		place.lastChild.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
	}
</script>
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

merge(config.macros,{

	toggleTag: {

		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tiddlerTitle = tiddler ? tiddler.title : '';
			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
			label = (label == '-' ? '' : label); // dash means no label
			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
						theTiddler.modified = new Date();
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}

<!--{{{-->
<a style="color: #5566ff">det ser ud som om du er ved at lave, eller redigere et hieraki af noter fra toppen og ned!<br>Skriv titelen pĆ„ dit emne i  det Ćøverste vindue.<br>Klik 'fƦrdig', klik derefter pĆ„ *opret et underemne*' hvis du vil lave underemner eller noter til dette overemne.TilfĆøj noter i det store vindue.</a>
<!--}}}-->
/***
|Name|TreeviewPluginPlugin2|
|Source|http://treeview.tiddlyspot.com/|
|Version|0.24|
|Author|MarkS|
|License|Various. See respective libraries for details|
|Type|plugin|
|Requires(1) |jQuery library, treeview plugin libraries and styles |
|Requires(2) |AttachFilePackage and sub-libraries from tiddlytools.com if you want to use embedded images to create the tree|
|Description|Creates a tag tree, formatted as an actual tree |
|Status|Experimental - ALPHA, but built on fairly solid technologies|
|Warning|When creating tag trees, make sure no tiddler loops back on itself, or its likely the script will hang|
!!!!Set up for portability
You will need a version of TW that incorporates the jQuery library. That happens automatically with recent editions of TW. You will also need to install or access the treeview libraries from http:www.dynamicdrive.com. The libraries can be carried as local files, inserted in the MarkupPostBody, or referenced from the dynamicdrive site. Each approach will require a different set up. 
You will also need to link in the stylesheet for the treeview objects. A quick way to do this is to put:
>{{{<link rel="stylesheet" type="text/css" href="http://www.dynamicdrive.com/dynamicindex1/treeview/jquery.treeview.css" /> }}}
into the MarkupPreHead tiddler. However, this won't work if you go off line. It also doesn't work permanently if you are hosting your file on a web server. So you may want to download a copy of the stylesheet and attendant image files and change the MarkupPreHead tiddler to pick up the local copy. Or load the stylesheet and images onto your own server where you will be able to access them.
!!!!Usage
{{{<<treeview2 }}}
>{{{<root tag> [tree style] [startup parameters]}}} 
{{{  >>}}}

!!!!!Where:
''root tag'' is the tag at the top of your tagging tree, i.e. the mother of all tiddlers related to it by using its name as one of their tags.
''tree style'' indicates which type of tree will be displayed,  possibly //treeview//, //filetree//, and //treeview-red//, and //treeview-famfamfam//. There may be other styles too, but those are the ones I know about.
''startup parameters'' are a set of optional parameters given in a comma-separated, key/value string like this:
>{{{'collapsed: false, animated: "normal", persist: true'}}}
There's a list of possible options at:
  http://www.dynamicdrive.com/dynamicindex1/treeview/index.htm
However, not all settings may actually work under TW. Mainly, you will probably be interested in controlling the presence of animation, and whether the initial state of the tree is opened or closed.
!!!!Images and stylesheet set-up
The tree is constructed from little bits of images. If you don't want to carry these images in a separate directory, nor reference them remotely, you can embed them in your TW file. To do this,  you will need the AttachFilePackage and accompanying plugins from 
> www.tiddlytools.com
and you will need the AttachFilePluginFormatters plugin from the same site.
Then import all the tiddlers from this file tagged as treeviewimage . These images are referenced in the StyleSheet. If you import JqueryTreeviewCss from this file, and then put the name in your StyleSheet, the images should be imported without having to access them remotely.
!!!!Persistence
To make persistence work, you will need to have the treeview cookie library loaded. The easiest way to do that is to put:
>{{{<script src="http://www.dynamicdrive.com/dynamicindex1/treeview/lib/jquery.cookie.js" type="text/javascript"></script>}}}
into the MarkupPostBody. However, this technique will only work if you have online access. If you will be working offline, then you will either need to download the cookie library to the same directory as your ~TiddlyWiki file and put the following into your MarkupPostBody:
>>{{{<script src="jquery.cookie.js"></script>}}}
or you will need to put the entire contents of the cookie library into script tags inside the MarkupPostBody.
Then, in any macro that wants its tree to be persistently configured, you will need to use configuration parameter:
>>{{{persist: "cookie", cookieId: "myid"}}}
where //myid// should be an identification that will be unique throughout the entire TW file.
***/
//{{{
config.macros.treeview2 = {
  handler: function (place, macroName, params, wikifier, paramString, tiddler)
  {  // Code here
var lcTag = params[0] ;
var lcClass = params[1] ? params[1] : "treeview" ;
var DEV_MODE = false ; // Make true when developing code or changes won't show up.
try {
  if( MAS === undefined ) MAS = { } ;
} catch(ex) {
  MAS = {} ;
}

MAS.treeviewSettings = function(obj) {
	var defa = {} ;
	defa.collapsed= true;
	defa.unique = true ;
	//defa.persist= "location" ;
	if( obj !== undefined ) {
		try {
		obj = eval("({" + obj + "})" ) ;
		} catch(ex) {
			alert("Unable to use your treeview configuration settings!") ;
			return defa ;
		}
		for (var prop in obj) {
			defa[prop] =obj[prop] ;
		}
	}
	return defa ;
} ;
if( DEV_MODE || MAS.getTiddlersPerTagAsHtmlList === undefined ) {
MAS.getTiddlersPerTagAsHtmlList = function(tagname,setup) { 
  var tids = store.getTaggedTiddlers(tagname) ;
  var temp = "" ;
	var prefix = tids.length > 0 ? "<span class='folder'>" : "<span class='file'>" ; 
	var statetags = store.getTiddler(tagname).tags ;
	var state = "" ;
	var lcSesame = setup["sesame"] !== undefined ? setup["sesame"] : "" ;
	var lcAntiSesame = setup["antisesame"] !== undefined ? setup["antisesame"] : "" ;
	if(statetags.length > 0 ) {
						 if(lcSesame) state =  statetags.contains(lcSesame) ? ' class="open"'   : ' class="closed"'  ;
						 if(lcAntiSesame) state = statetags.contains(lcAntiSesame) ? ' class="closed"' : ' class="open"'   ;
	}	
// state="" ; // DEBUG
  //var rtn ="<li>"  + prefix + tagname + "</a></span>" ;
	var rtn = "<li" + state +">"  + prefix + "<a href=\"javascript:;\" tiddlylink=\"" + tagname + "\"  refresh=\"link\"    class='tiddlyLink tiddlyLinkExisting' title='Link to " + tagname + "' >" + tagname + "</a></span>" ;
	//wikify(rtn,place) ;
  forever:
  while(true) {  
		if(tids.length == 0 ) break ;
   	rtn = rtn + "<ul>" ;
   	for(var i=0;i<tids.length;i++) {
			temp = MAS.getTiddlersPerTagAsHtmlList(tids[i].title, setup) ;
     	rtn = rtn +  temp  ;
  	}
  	rtn = rtn + "</ul>\n" ;
		break ;
  } // forever
  rtn = rtn + "</li>\n" ;
  return rtn ;
}  ; // End of function definition
} // End of checking if function already defined

// The extra set of span tags are needed here because jquery find function ignores
// the outer set of tags. Or at least that's what seems to be happening. So, I give
// it an extra set so it can throw it away without consequence
var loSetup = MAS.treeviewSettings(params[2]) ;
var lcId = "root" + (new Date()).getTime().toString() ;
if(loSetup.cookieId) {
	lcId = "root_" + loSetup.cookieId ; 
}
//var a =  '<span id="' + lcId + '"><ul id="' + "root" + '" >' +  MAS.getTiddlersPerTagAsHtmlList(lcTag, loSetup) + "</ul></span>" ;
var a =  '<ul id="' + lcId + '" >' +  MAS.getTiddlersPerTagAsHtmlList(lcTag, loSetup) + "</ul>" ;
var b = jQuery(a) ; 
// A smarter person might have know how to put the onclick function in at the top 
b.find("a").each(function(n) {
	this.onclick = onClickTiddlerLink ;
	}) ;
//b.find(lcId).attr("class",lcClass) ;
//b.find("#root").attr("class",lcClass) ;

jQuery(place).append(b) ;

jQuery(place).find("#" + lcId).attr("class",lcClass).treeview(loSetup) ;
  }
};
//}}}
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

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

// 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.org|http://tiddlywiki.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/]], [[blog|http://tiddlyspot.blogspot.com/]], 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")

});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 23/09/2009 22:24:18 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/Downloads/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
| 23/09/2009 22:24:20 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/Downloads/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
| 23/09/2009 22:26:30 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/Downloads/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | . |
| 23/09/2009 23:28:01 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/My%20Dropbox/Public/DeskTree/DeskTree2Tspot/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
| 23/09/2009 23:28:15 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/My%20Dropbox/Public/DeskTree/DeskTree2Tspot/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
| 23/09/2009 23:28:41 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/My%20Dropbox/Public/DeskTree/DeskTree2Tspot/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
| 23/09/2009 23:29:27 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/My%20Dropbox/Public/DeskTree/DeskTree2Tspot/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | . | failed |
| 23/09/2009 23:29:43 |  | [[desktree.html|file:///C:/Documents%20and%20Settings/mama/Dokumenter/My%20Dropbox/Public/DeskTree/DeskTree2Tspot/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | . | failed |
| 14/11/2009 19:03:50 |  | [[desktree.html|file:///D:/My%20Dropbox/Public/DeskTree/DeskTree2Tspot/desktree.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
| 14/11/2009 19:05:58 |  | [[index.html|http://desktree.tiddlyspot.com/index.html]] | [[store.cgi|http://desktree.tiddlyspot.com/store.cgi]] | . | [[index.html | http://desktree.tiddlyspot.com/index.html]] | backup |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''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|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// 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
		if (!params) params = {};
		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}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[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 = new 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,username,password,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 = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,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 == 404)
			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; ;charset=UTF-8; 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');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}

++++[Oversigt]
@@display:block;height:8em;overflow:auto;{{treeview{<<treeview2 [[attachment]] "treeview-gray" 'collapsed: false,
 antisesame: "closed", animated: "fast", persist: "cookie", cookieId:
 "attachment"'>>}}}@@@@display:block;text-align:right;^^rul ned for at se mere...^^@@===<<tiddler hurtignote>>
Der findes mange mƄder at udvide ~TiddlyWikis funktionalitet.
En af dem er via <<tag systemConfig>>. En anden er ganske enkelt at man laver sit eget hierakiske system, med viden som er vigtig at kunne finde rundt i pƄ en nem og overskuelig mƄde.
/***
|Name|WikifyPlugin|
|Source|http://www.TiddlyTools.com/#WikifyPlugin|
|Documentation|http://www.TiddlyTools.com/#WikifyPluginInfo|
|Version|1.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|substitute fields, slices, or computed values into a wiki-syntax format string and render results dynamically|
The {{{<<wikify>>}}} macro allows you to easily retrieve values from custom tiddler fields, tiddler slices, computed values (using javascript) or just plain old literals, and assemble them into small bits of generated wiki-syntax text content that can be rendered directly into a tiddler, or used in the ViewTemplate or EditTemplate to add dynamically-generated content to each tiddler.

The {{{<<wikiCalc>>}}} macro performs the same processing as {{{<<wikify>>}}} and, in addition, passes the assembled text content through javascript's {{{eval()}}} function before rendering the results.  This allows you to, for example, construct and compute mathematical expressions that use input values extracted from tiddler fields or slices.
!!!!!Documentation
> see [[WikifyPluginInfo]]
!!!!!Revisions
<<<
2009.03.29 [1.1.4] in handler(), pass 'tiddler' value to wikify() to fix macro errors in rendered content
|please see [[WikifyPluginInfo]] for additional revision details|
2007.06.22 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.WikifyPlugin= {major: 1, minor: 1, revision: 4, date: new Date(2009,3,29)};

config.macros.wikify={
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var fmt=params.shift();
		var values=[];
		var out="";
		if (!fmt.match(/\%[0-9]/g) && params.length) // format has no markers, just join all params with spaces
			out=fmt+" "+params.join(" ");
		else { // format param has markers, get values and perform substitution
			while (p=params.shift()) values.push(this.getFieldReference(place,p));
			out=fmt.format(values);
		}
		if (macroName=="wikiCalc") out=eval(out).toString();
		wikify(out.unescapeLineBreaks(),place,null,tiddler);
	},
	getFieldReference: function(place,p) { // "slicename::tiddlername" or "fieldname@tiddlername" or "fieldname"
		if (typeof p != "string") return p; // literal non-string value... just return it...
		var parts=p.split(config.textPrimitives.sliceSeparator);
		if (parts.length==2) {// maybe a slice reference?
			var tid=parts[0]; var slice=parts[1];
			if (!tid || !tid.length || tid=="here") { // no target (or "here"), use containing tiddler
				tid=story.findContainingTiddler(place);
				if (tid) tid=tid.getAttribute("tiddler")
				else tid="SiteSlices"; // fallback for 'non-tiddler' areas (e.g, header, sidebar, etc.)
			}
			var val=store.getTiddlerSlice(tid,slice);  // get tiddler slice value
		}
		if (val==undefined) {// not a slice, or slice not found, maybe a field reference?
			var parts=p.split("@");
			var field=parts[0];
			if (!field || !field.length) field="checked"; // missing fieldname, fallback: checked@tiddlername
			var tid=parts[1];
			if (!tid || !tid.length || tid=="here") { // no target (or "here"), use containing tiddler
				tid=story.findContainingTiddler(place);
				if (tid) tid=tid.getAttribute("tiddler")
				else tid="SiteFields"; // fallback for 'non-tiddler' areas (e.g, header, sidebar, etc.)
			}
			var val=store.getValue(tid,field);
		}
		// not a slice or field, or slice/field not found... return value unchanged
		return val===undefined?p:val;
	}
}
//}}}
//{{{
// define alternative macroName for triggering pre-rendering call to eval()
config.macros.wikiCalc=config.macros.wikify;
//}}}
/***
@@''This tiddler is auto-generated - don't edit it!''@@
***/
/*{{{*/
[
{id: 'tiddlerEdit', x: 209, y: 74, z: 1, width: 640, height: 426, collapsed: false}
]
/*}}}*/

/***
|Name|Batch & TemplatedTagTools & batchTagTools - packed|
|Description|Batch framework, batchTagTools and TemplatedTagTools allow easily to create macros that work on the dislayed tiddlers. You can see them in action in the tag tab from the content section of TWkd|
|Version|0.1.0|
|Source|http://yann.perrin.googlepages.com/twkd.html|
|Author|YannPerrin|
|License|BSD open source licens|
***/
// // Batch
//{{{
if(!window.TWkd){window.TWkd={context:{}}}if(!TWkd.Batch){TWkd.Batch=function(h,i,j,k,l,m,n,o){if(n==undefined){n=true}this.macroName=h;this.label=i;this.prompt=j;this.labelIfParam=k;this.promptIfParam=l;this.action=m;this.showWhenReadOnly=n;this.ask=o;this.handler=function(a,b,c,d,e,f){if((!readOnly)||(this.showWhenReadOnly)){if(c[0]){var g=createTiddlyButton(a,this.labelIfParam.format(c),this.promptIfParam.format(c),this.operation);g.setAttribute("param",c[0])}else{var g=createTiddlyButton(a,this.label,this.prompt,this.operation);g.setAttribute("ask",this.ask)}g.setAttribute("macroName",this.macroName)}};this.operation=function(){var c=this.getAttribute("macroName");var d=this.getAttribute("param");if((!d)&&(this.getAttribute("ask")!=undefined)){var d=window.prompt(this.getAttribute("ask"))}story.forEachTiddler(function(a){var b=store.getTiddler(a);if(b){config.macros[c].action(b,d)}});store.notifyAll();if(config.options.chkAutoSave){saveChanges(true)}return(false)}}}
//}}}
// // TemplatedTagTools
//{{{
function onClickTag(e){if(!e){var e=window.event}var a=resolveTarget(e);var b=Popup.create(this);var c=this.getAttribute("tag");var d=this.getAttribute("tiddler");if(b&&c){wikify("<<tiddler TagToolTemplate with:\""+c+"\">>",b)}Popup.show(b,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation()}return(false)}
//}}}
//{{{
config.macros.openAll={};config.macros.openAll.handler=function(a,b,c,d,e,f){var g=config.views.wikified.tag;var h=createTiddlyButton(a,g.openAllText.format(c),g.openAllTooltip,onClickTagOpenAll);h.setAttribute("tag",c[0])};
//}}}
// // definition de TagToolTemplate
//{{{
config.shadowTiddlers.TagToolTemplate = "[[Open tag '$1'|$1]]\n<<openAll $1>>\n<<tagging $1>><<newTiddler label:\"New $1 Tiddler\" tag:\"$1\">>";
//}}}
// // batchTagTools
//{{{
config.macros.closeTagged=new TWkd.Batch("closeTagged","Close Tagged","Close Tiddlers tagged with the chosen tag","Close '%0' Tiddlers","Close Tiddlers tagged with '%0'",function(a,b){if((!b)||(a.tags.contains(b))){story.closeTiddler(a.title,true,false)}},true,"Please enter the tag of your choice");
//}}}
//{{{
config.macros.keepTagged=new TWkd.Batch("keepTagged","Keep Tagged","Close Tiddlers that are not tagged with the chosen tag","Keep '%0' Tiddlers","Close Tiddlers that are not tagged with '%0'",function(a,b){if((!b)||(!a.tags.contains(b))){story.closeTiddler(a.title,true,false)}},true,"Please enter the tag of your choice");
//}}}
//{{{
config.macros.tagDisplayed=new TWkd.Batch("tagDisplayed","New Tag","Tag displayed Tiddlers with the chosen tag","Tag as '%0'","Tag displayed Tiddlers with '%0'",function(a,b){if(!a.isTagged(b)){a.tags.push(b);story.refreshTiddler(a.title,false,true);store.setDirty(true)}},false,"Please enter the tag of your choice");
//}}}
//{{{
config.macros.untagDisplayed=new TWkd.Batch("untagDisplayed","Remove Tag","remove the chosen tag from displayed Tiddlers","Remove '%0' Tag","Remove the '%0' tag from displayed Tiddlers",function(a,b){if(a.isTagged(b)){a.tags.splice(a.tags.find(b),1);story.refreshTiddler(a.title,false,true);store.setDirty(true)}},false,"Please enter the tag of your choice");
//}}}
//{{{
config.macros.deleteTagged=new TWkd.Batch("deleteTagged","Delete Tagged","Delete displayed tiddlers tagged with the chosen tag","Delete '%0' Tiddlers","Delete diplayed Tiddlers tagged with '%0'",function(a,b){if((!b)||(a.tags.contains(b))){store.removeTiddler(a.title);story.closeTiddler(a.title,true,false)}},false,"Please enter the tag of your choice");
//}}}
/***
[[DividedListsPlugin]] ''modified''
***/
//{{{
version.extensions.DividedListsPlugin={major:1,minor:1,revision:0,date:new Date(2006,17,3),source:"http://yann.perrin.googlepages.com/twkd1.html#DividedListsPlugin"};
//}}}
/***
// //Partial Tiddler List
***/
//{{{
config.macros.listPart={};config.macros.listPart.handler=function(a,b,c,d,e,f){var g=c[0]?c[0]:"all";var h=document.createElement("ul");a.appendChild(h);if(config.macros.list[g].prompt){createTiddlyElement(h,"li",null,"listTitle",config.macros.list[g].prompt)}var i;if(config.macros.list[g].handler){i=config.macros.list[g].handler(c)}var j=new RegExp("^["+c[1]+"]","i");for(var t=0;t<i.length;t++){var k=document.createElement("li");if(typeof i[t]=="string"){if(j.test(i[t])){h.appendChild(k);createTiddlyLink(k,i[t],true)}}else{if(j.test(i[t].title)){h.appendChild(k);createTiddlyLink(k,i[t].title,true)}}}};
//}}}
// //Partial Tag List
//{{{
config.macros.tagListPart={};config.macros.tagListPart.handler=function(a,b,c,d,e,f){var g=new RegExp("^["+c[0]+"]","i");var h=store.getTags();var i=createTiddlyElement(a,"ul",null,null,null);if(h.length==0){createTiddlyElement(i,"li",null,"listTitle",config.macros.allTags.noTags)}for(var t=0;t<h.length;t++){if(g.test(h[t])){var j=createTiddlyElement(i,"li",null,null,null);var k=createTiddlyButton(j,h[t][0]+" ("+h[t][1]+")",config.macros.allTags.tooltip.format([h[t][0]]),onClickTag);k.setAttribute("tag",h[t][0])}}};
//}}}
/***
// //Defining shadow tiddlers
***/
//{{{
function defineTabShadow(a,b,c){var d="<<tabs txtTabbedList"+a+" ";for(var t=0;t<b.length;t++){d+=b[t]+" 'Tiddlers in "+b[t]+"' "+a.toUpperCase()+b[t]+" ";if(c!="TabTags"){config.shadowTiddlers[a.toUpperCase()+b[t]]="<<listPart "+a+" "+b[t]+">>"}else{config.shadowTiddlers[a.toUpperCase()+b[t]]="<<tagListPart "+b[t]+">>"}}d+=">>";config.shadowTiddlers[c]=d}tabs=["a-e","f-j","k-o","p-s","t-z","\\W"];defineTabShadow("all",tabs,"TabAll");defineTabShadow("tags",tabs,"TabTags");defineTabShadow("missing",tabs,"TabMoreMissing");defineTabShadow("orphans",tabs,"TabMoreOrphans");defineTabShadow("shadowed",tabs,"TabMoreShadowed");config.shadowTiddlers.DividedListsPluginDocumentation="Documentation for this plugin is available [[here|"+version.extensions.DividedListsPlugin.source+"Documentation]]";
//}}}
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\file.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[file.gif|file.gif]] - {{{type=image/gif, size=145 bytes, encoded=199 bytes}}}|
| local file:|/%LOCAL_LINK%/[[file:///F:/TiddlyWiki/TW jQuery/TreeView/images/file.gif|file:///F:/TiddlyWiki/TW jQuery/TreeView/images/file.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/file.gif|http://www.symbex.net.au/Wiki/images/file.gif]]|
image
<<<
usage: {{{[img[tooltip|file.gif]] or [img[tooltip|file.gif][link]]}}}
[img[tooltip|file.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhDwAOALMAAGpsYoy3oamMQdS9fDmJdP////9tcH98XwAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAAUALAAAAAAPAA4AAAQ+sBRBK5VYiizH5l82eCBX
jCS2GayRhZOpvkVgHwWg0XKM4azCAaATZnA9pAQ3sAUIhOWxZ/xRlcKDdsuVRAAA
Ow==
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\folder-closed.gif}}}|
| attached on:|4 June 2009 by YourName|
| embedded:|[[folder-closed.gif|folder-closed.gif]] - {{{type=image/gif, size=887 bytes, encoded=1202 bytes}}}|
| local file:|/%LOCAL_LINK%/[[file:///F:/TiddlyWiki/TW jQuery/TreeView/images/folder-closed.gif|file:///F:/TiddlyWiki/TW jQuery/TreeView/images/folder-closed.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/folder-closed.gif|http://www.symbex.net.au/Wiki/images/folder-closed.gif]]|
image
<<<
usage: {{{[img[tooltip|folder-closed.gif]] or [img[tooltip|folder-closed.gif][link]]}}}
[img[tooltip|folder-closed.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEAAOAPcAAJdaH+C6eP/inq1zLf/////Sg59oJMOHNAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAAQALAAAAAAQAA4AAAhUAAkIHEiwoMGDBw8oPIBw
4ACCDxEeEECxQIAACxUSZNiQo8CJFEOKBABRpEkBEQUOOCkyJQEDBWLKnGmAIICZ
OAuQHAhgQE6ZOwcaGEq0aMOjBAICADs=
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\folder.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[folder.gif|folder.gif]] - {{{type=image/gif, size=141 bytes, encoded=190 bytes}}}|
| local file:|/%LOCAL_LINK%/[[file:///F:/TiddlyWiki/TW jQuery/TreeView/images/folder.gif|file:///F:/TiddlyWiki/TW jQuery/TreeView/images/folder.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/folder.gif|http://www.symbex.net.au/Wiki/images/folder.gif]]|
image
<<<
usage: {{{[img[tooltip|folder.gif]] or [img[tooltip|folder.gif][link]]}}}
[img[tooltip|folder.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEAAOALMAAJdaH+C6eP/inq1zLf/////Sg59oJMOHNAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAAQALAAAAAAQAA4AAAQ6kMhJq7336IPnoB92CGQR
BJtGcR0rjWQsA6A83HhODDEvx4WPoRAkGo8hQPGInAAGzCbFQK1aO1hCBAA7
---END_DATA---
%/
<<fontSize>>
+++[hurtignote]...<<setUserName force>><<tiddler QuickNote with: \n0DD/0MM-YY\n0hh.0mm.0ss>>===
+++[LƦs alle]...<<forEachTiddler
where
'tiddler.tags.contains("hurtignote")'
sortBy 'tiddler.title'
write
'"<<tiddler EmnerTemplate1 with: [["+tiddler.title+"]]$)){{indent{"+tiddler.text+".}}} \n"' >>===
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\leftbackdo6.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[leftbackdo6.gif|leftbackdo6.gif]] - {{{type=image/gif, size=64 bytes, encoded=89 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/leftbackdo6.gif|./images/leftbackdo6.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/leftbackdo6.gif|http://www.symbex.net.au/Wiki/images/leftbackdo6.gif]]|
image
<<<
usage: {{{[img[tooltip|leftbackdo6.gif]] or [img[tooltip|leftbackdo6.gif][link]]}}}
[img[tooltip|leftbackdo6.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhbgACAIAAAHKOqgAzZiH5BAAAAAAALAAAAABuAAIAAAIXDIynyesNn4x0
2lqB3rz7D4biSJZmVwAAOw==
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\leftbackdrkgreenqu9.jpg}}}|
| attached on:|1 June 2009 by YourName|
| embedded:|[[leftbackdrkgreenqu9.jpg|leftbackdrkgreenqu9.jpg]] - {{{type=image/jpeg, size=992 bytes, encoded=1344 bytes}}}|
| local file:|//none//|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/leftbackdrkgreenqu9.jpg|http://www.symbex.net.au/Wiki/images/leftbackdrkgreenqu9.jpg]]|
image
<<<
usage: {{{[img[tooltip|leftbackdrkgreenqu9.jpg]] or [img[tooltip|leftbackdrkgreenqu9.jpg][link]]}}}
[img[tooltip|leftbackdrkgreenqu9.jpg]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/jpeg;base64,
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8L
CwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUF
BQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e
Hh4eHh4eHh4eHh4eHh7/wAARCAACAG4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA
AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6
Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ
mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx
8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp
anN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE
xcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCw
mnaem3ZY2q7cbcRKMY24xx28tP8AvhfQUJp2npt2WNqu3G3ESjGNuMcdvLT/AL4X
0FFFfMn5+Cadp6bdljartxtxEoxjbjHHby0/74X0FCadp6bdljartxtxEoxjbjHH
by0/74X0FFFAAmnaem3ZY2q7cbcRKMY24xx28tP++F9BQmnaem3ZY2q7cbcRKMY2
4xx28tP++F9BRRQAJp2npt2WNqu3G3ESjGNuMcdvLT/vhfQUJp2npt2WNqu3G3ES
jGNuMcdvLT/vhfQUUUACadp6bdljartxtxEoxjbjHHby0/74X0FCadp6bdljartx
txEoxjbjHHby0/74X0FFFAAmnaem3ZY2q7cbcRKMY24xx28tP++F9BQmnaem3ZY2
q7cbcRKMY24xx28tP++F9BRRQAJp2npt2WNqu3G3ESjGNuMcdvLT/vhfQU63srO3
YNb2kETKu0FIwpAwoxx2wiD6KPQUUVnV/hy9GJ7H/9k=
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\mainmenugray7ef.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[mainmenugray7ef.gif|mainmenugray7ef.gif]] - {{{type=image/gif, size=105 bytes, encoded=142 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/mainmenugray7ef.gif|./images/mainmenugray7ef.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/mainmenugray7ef.gif|http://www.symbex.net.au/Wiki/images/mainmenugray7ef.gif]]|
image
<<<
usage: {{{[img[tooltip|mainmenugray7ef.gif]] or [img[tooltip|mainmenugray7ef.gif][link]]}}}
[img[tooltip|mainmenugray7ef.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhAQBkAPMPALa2trm5ub29vb+/v8TExMbGxsvLy9HR0dfX19vb29zc3OHh
4efn5+vr6+zs7O7u7iH5BAAAAAAALAAAAAABAGQAAAQW8D3X2FIJHVPIEAEgjmRp
nmiqrqwZAQA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\minus.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[minus.gif|minus.gif]] - {{{type=image/gif, size=837 bytes, encoded=1133 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/minus.gif|./images/minus.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/minus.gif|http://www.symbex.net.au/Wiki/images/minus.gif]]|
image
<<<
usage: {{{[img[tooltip|minus.gif]] or [img[tooltip|minus.gif][link]]}}}
[img[tooltip|minus.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhCQAJAPcAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAJAAkAAAgiAAMIHEjwn8GD/wQiPKhw
YcIA/wBIlPjQYUWHDRcS3BggIAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\navbargray1.gif}}}|
| attached on:|17 June 2009 by YourName|
| embedded:|[[navbargray1.gif|navbargray1.gif]] - {{{type=image/gif, size=837 bytes, encoded=1133 bytes}}}|
| local file:|//none//|
| remote link:|/%REMOTE_LINK%/[[htttp://www/symbex.net.au/Wiki/images/navbargray1.gif|htttp://www/symbex.net.au/Wiki/images/navbargray1.gif]]|
image
<<<
usage: {{{[img[tooltip|navbargray1.gif]] or [img[tooltip|navbargray1.gif][link]]}}}
[img[tooltip|navbargray1.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhbgACAPcAAAAAAGNjY///////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////ywAAAAAbgACAAAIKgADABBIcKDBgggPKkzIcKHDhhAfSowY
EYDFixgzatzIsaPHjyBDiswYEAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\navbargray777.gif}}}|
| attached on:|17 June 2009 by YourName|
| embedded:|[[navbargray777.gif|navbargray777.gif]] - {{{type=image/gif, size=837 bytes, encoded=1133 bytes}}}|
| local file:|//none//|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki//images/navbargray777.gif|http://www.symbex.net.au/Wiki//images/navbargray777.gif]]|
image
<<<
usage: {{{[img[tooltip|navbargray777.gif]] or [img[tooltip|navbargray777.gif][link]]}}}
[img[tooltip|navbargray777.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhbgACAPcAAAAAAHNzc///////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////ywAAAAAbgACAAAIKgADABBIcKDBgggPKkzIcKHDhhAfSowY
EYDFixgzatzIsaPHjyBDiswYEAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\navbargrayhw1.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[navbargrayhw1.gif|navbargrayhw1.gif]] - {{{type=image/gif, size=1012 bytes, encoded=1373 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/navbargrayhw1.gif|./images/navbargrayhw1.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/navbargrayhw1.gif|http://www.symbex.net.au/Wiki/images/navbargrayhw1.gif]]|
image
<<<
usage: {{{[img[tooltip|navbargrayhw1.gif]] or [img[tooltip|navbargrayhw1.gif][link]]}}}
[img[tooltip|navbargrayhw1.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhCgA8APcAAL29zr3GzsbGzsbG1sbO1s7O1s7W3tbW3tbe3t7e597n5+fn
7+fv7+/v7+/v9+/39/f39/f/////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////ywAAAAACgA8AAAI2QABCBxIkEEDBggTIkzAsKFDAgUIQJwY
MYDFixYBYNxoUUAAAR5BfhQwgABJAgMEoFQpsaVJiRFjxoRYwECBmjhrGthpk+fO
A0CDCkVwAAFRo0UPOFyKIIECpwyfSp1KdYHVq1gXMLC6davWgw3CGgTbwEFYs2XP
PjC7lq0DCHDjyp1Lt67cCHDx5rXLt6/fv4ADCx5MuDBfvXohJFZcd3Hix3YhM947
Fy9ixnglQNC8GS5nzHEzd+4surRnxpozi07dWTNr1qtby3Y9WzFtCa5dq74dAffm
gAAAOw==
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW Help\ScienceImages\navbargrayhw1.png}}}|
| attached on:|26 May 2009 by YourName|
| embedded:|[[navbargrayhw1.png|navbargrayhw1.png]] - {{{type=image/png, size=303 bytes, encoded=410 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|navbargrayhw1.png]] or [img[tooltip|navbargrayhw1.png][link]]}}}
[img[tooltip|navbargrayhw1.png]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAIAAADQc7xaAAAABmJLR0QA/wD/AP+g
vaeTAAAA5ElEQVR42u2TS67DIAxF7wHvfz0ddd699KO+fqbugDYlQKBSVOkNmgGK
fLDvxQY2252WPw6ncwfb+e/Ww/tjN/tyvfdwDKGHQx/HuAqPiscVxW1dtsX/am2k
/c2JDa4D4O5AAVKwlyrJpt3TkpcwuUtpUVVfwbvFB9o/3MYMJgZyh3JcLsF7oIhq
XuIDa7T0yZw3OW/nZFvyH1PyTAncJRRe0s3zYxliLu2TNkveTJWj7N7LhPCGNC9r
C7aeT1C4PJWo023SrbRBCs9RUfIUtLJbc+uNnudbTVnT58lOug60TpaCD9FINRTx
kClXAAAAAElFTkSuQmCC
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\navbargreenhw1.gif}}}|
| attached on:|1 June 2009 by YourName|
| embedded:|[[navbargreenhw1.gif|navbargreenhw1.gif]] - {{{type=image/gif, size=966 bytes, encoded=1308 bytes}}}|
| local file:|//none//|
| remote link:|/%REMOTE_LINK%/[[htttp://www.symbex.net.ai/Wiki/images/navbargreenhw1.gif|htttp://www.symbex.net.ai/Wiki/images/navbargreenhw1.gif]]|
image
<<<
usage: {{{[img[tooltip|navbargreenhw1.gif]] or [img[tooltip|navbargreenhw1.gif][link]]}}}
[img[tooltip|navbargreenhw1.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhCgA8APcAAK33nLX/pb3/pb3/rcb/rcb/tc7/tdb/tdb/vd7/vd7/xuf/
xu//xu//zv//////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////ywAAAAACgA8AAAIqwABCBxIMEECBQgOJkRooKHDhwMERJwY
IGIAABczYsQYoKPHjyBDigwgsWLJiRMlqkQ5oKXLlgRiypQ5gECBmDdt4tR5s2eB
h0CDAj2AwEBRBAeMGkWKgGnTp1ChGpxKdaoCg1cPal2wdSvXBWAVgE0AtqzZs2jT
ql3Ltq3bt3Djyp1Lt67du3jzzmUAlu8Cv2z5Ci7rt0FZw4T7Kk68ALFhvo//mh0c
mUFAAAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\navbarred.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[navbarred.gif|navbarred.gif]] - {{{type=image/gif, size=984 bytes, encoded=1332 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/navbarred.gif|./images/navbarred.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/navbarred.gif|http://www.symbex.net.au/Wiki/images/navbarred.gif]]|
image
<<<
usage: {{{[img[tooltip|navbarred.gif]] or [img[tooltip|navbarred.gif][link]]}}}
[img[tooltip|navbarred.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhCgA8APcAAP+9zv/Gzv/G1v/O1v/W3v/e3v/e5//n5//n7//v7//v9//3
9///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////ywAAAAACgA8AAAIvQABCBxIMIHBgwgNKFzIcIDDhxADSJwo
EQDFixgxChgQYKOAAAM+QnwIcqTJAQQcpkyJkoDLlS9jynRZgECBmjdtEmDIs4CB
Az8VAh1KtCiCA0cRJEWKIIFSp06bIpzaVEECq1ivKlhwletWqwvCil2wdazZs2gX
MAi7dm3at3Djyp1Lt67du3jhunWrdixfv4DZiv0buK/hw4MNtz28WHDjvYL7MlhM
2bFktZUhZ8Z8ebPnzJQnY24bekFAAAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\openbook.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[openbook.gif|openbook.gif]] - {{{type=image/gif, size=397 bytes, encoded=540 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/openbook.gif|./images/openbook.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/openbook.gif|http://www.symbex.net.au/Wiki/images/openbook.gif]]|
image
<<<
usage: {{{[img[tooltip|openbook.gif]] or [img[tooltip|openbook.gif][link]]}}}
[img[tooltip|openbook.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEAAQANU5AKat0evq6d7d3Zy12tji9pKp16WkuXZ/q7O2xo2MjLi4qoOc
zby8rLS0s8G/u7i2prKxr6WnpJKp2MbU8cTEw7/P772+rFx6tnCLws/b8+bl5cPG
09fh9b/Arru4uK+smfPy6Tlcoqyxr9HQzq2yss/b9LK0p8bT8XCLw4Oczv//+0lq
q8jIyD5Uf2aAtMrO4XRzcy5Sm6WkoZ6z3tnZ2Ts7O0RERMPDw////////wAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAADkALAAAAAAQABAAAAaqwBoqRywajbUU7EgkJAzF
WqGwLN5gCcABmqvNCJ7qNSL4bA63rqSEI8GuAhzugUAUbrXFSS6CxeUmLwEzNjUY
FXI0DjRyOAovNIQ1FxOJECyNDJCSKxlyIzKYchabhSEcOBoUoY0dpTUxBDgCDaxy
LwCDNjctMQMBNDIvOAEAAC8ghDm8vsEsMgChNCrKy70DMjIDLtzc1dYuMS4tvTHm
LTZGNzbsN+7v7kEAOw==
---END_DATA---
%/
<<tagCloud  admin authorbook [[Eksempel emne]] [[Eksempel underemne]] Emner excludeList excludeLists excludeSearch Note  script settings systemConfig systemServer TiddlyHomeSystem Upload VƦrktĆøj>>
/***
|Name|tiddlyDesktopBundle packed and ~StyleSheet definitions placed in theme tiddler|
|Description|Essential plugins for TiddlyDesktop theme modified for use with current ~TiddlyWiki version and default style (shadowed styles and templates added to a systemTheme tiddler)|
|Requires|tiddlyDesktopTheme, InlineJavascriptPlugin, OpenTaggedTiddlers, batchTagToolsBundle, TagToolTemplate|
|Source|http://www.digitaldimsum.co.uk/tiddlywiki/|
|Author|JonnyLeRoy|
***/
/***
!.FunctionDecorator
Thanks to [[Roman Porotnikov|http://www.jroller.com/page/deep/20030701]] - note: this systemConfig needs to be evaluated before other ones that use the Aspects so the name starts with "."
***/
/*{{{*/
Aspects=new Object();Aspects.addBefore=function(C,D,A){var B=C[D];C[D]=function(){return B.apply(this,A(arguments,B,this))}};Aspects.addAfter=function(B,D,C){var A=B[D];B[D]=function(){return C(A.apply(this,arguments),arguments,A,this)}};Aspects.addAround=function(C,D,A){var B=C[D];C[D]=function(){return A(arguments,B,this)}};
/*}}}*/
/***
|Name|JumpMacro|
|Author|Saq Imtiaz|
|Source|http://tw.lewcid.org/svn/plugins|
|License|http://creativecommons.org/licenses/by-sa/3.0/|
***/
/*{{{*/
config.macros.jump={};config.macros.jump.handler=function(a,b,c,d,e,f){var g=(c[0]&&c[0]!=".")?c[0]:"jump";var h=(c[1]&&c[1]!=".")?c[1]:"jump to an open tiddler";var i=(c[2]&&c[2]=="top")?true:false;var j=createTiddlyButton(a,g,h,this.onclick);if(i==true){j.setAttribute("top","true")}};config.macros.jump.onclick=function(e){if(!e){var e=window.event}var c=resolveTarget(e);var d=c.getAttribute("top");var f=Popup.create(this);if(f){if(d=="true"){createTiddlyButton(createTiddlyElement(f,"li"),"Top \u2191","Top of TW",config.macros.jump.top);createTiddlyElement(f,"hr")}story.forEachTiddler(function(a,b){createTiddlyLink(createTiddlyElement(f,"li"),a,true)})}Popup.show(f,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation()}return false};config.macros.jump.top=function(){window.scrollTo(0,0)};
/*}}}*/
/***
!Collapse / Expand all tiddlers
***/
/*{{{*/
eval(function(p,a,c,k,e,r){e=function(c){return c.toString(36)};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'\\w'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2.4.9={5:"fold 6",3:"Collapse 6 p f"};2.4.9.d=0(a){b(a,1.5,1.3,0(){q.9();g 7})};o.n.9=0(){1.m(0(a,e){2.l.k.j(a,i,7)})};2.4.8={5:"h 6",3:"h 6 p f"};2.4.8.d=0(a){b(a,1.5,1.3,0(){q.8();g 7})};o.n.8=0(){1.m(0(a,e){2.l.k.j(a,7,i)})};2.4.c={5:"cascade",3:"Layout 6 open f nicely"};2.4.c.d=0(a){b(a,1.5,1.3,0(){layout.c();g 7})};',[],27,'function|this|config|prompt|macros|label|all|false|expandAll|collapseAll||createTiddlyButton|autoLayout|handler||Tiddlers|return|expand|true|toggle|collapseTiddler|commands|forEachTiddler|prototype|Story|visible|story'.split('|'),0,{}))
/*}}}*/
/***
!Collapse Tiddler
***/
/*{{{*/
eval(function(p,a,c,k,e,r){e=function(c){return c.toString(36)};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'\\w'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('4.7.h.3={6:"-",k:"Collapse 0 x",9:"+",l:"Expand 0 x"};4.commands.3={6:4.7.h.3.6,k:4.7.h.3.k,9:4.7.h.3.9,l:4.7.h.3.l,handler:8(a,b,c){0.v(c,u,u)},v:8(a,b,c){2 d=document.getElementById(story.idPrefix+a);2 e=0.q(d);2 f=0.p(d);5(c&&f.1.y=="o"){0.n(d,f,e,"block",d.1.w,0.6,0.k)}else{5(b){5(d.1.j){d.1.w=d.1.j}0.n(d,f,e,"o",f.1.j,0.9,0.l)}}},q:8(a){2 b=a.getElementsByTagName("a");t(i s b){2 c=b[i];5(c.m==0.6||c.m==0.9){r c}}},p:8(a){2 b=a.childNodes;t(i s b){2 c=b[i];5(c&&c.className=="collapsible"){r c}}},n:8(a,b,c,d,e,f,g){b.1.y=d;c.m=f;c.setAttribute("title",g);5(typeof e!="undefined"){a.1.j=e}a.collapsed=d=="o"}};',[],35,'this|style|var|collapseTiddler|config|if|text|views|function|toggleText||||||||wikified||height|tooltip|toggleTooltip|innerHTML|toggleDisplay|none|findCollapseDiv|getCollapseLink|return|in|for|true|toggle|_0|tiddler|display'.split('|'),0,{}))
/*}}}*/
/***
!Core Drag Functionality
Borrowed from [[DOM Drag|http://www.youngpup.net]] with some changes
***/
/*{{{*/
var Drag={obj:null,init:function(B,A){B.onmousedown=Drag.start;B.root=A&&A!=null?A:B;if(isNaN(parseInt(B.root.style.left))){B.root.style.left="0px"}if(isNaN(parseInt(B.root.style.top))){B.root.style.top="0px"}B.root.onDragStart=new Function();B.root.onDragEnd=new Function();B.root.onDrag=new Function()},start:function(B){var C=Drag.obj=this;B=Drag.fixE(B);var D=parseInt(C.root.style.top);var A=parseInt(C.root.style.left);C.root.onDragStart(A,D);C.lastMouseX=B.clientX;C.lastMouseY=B.clientY;document.onmousemove=Drag.drag;document.onmouseup=Drag.end;return false},drag:function(E){E=Drag.fixE(E);var F=Drag.obj;var C=E.clientY;var D=E.clientX;var H=parseInt(F.root.style.top);var B=parseInt(F.root.style.left);var A,G;A=B+((D-F.lastMouseX)*1);G=H+((C-F.lastMouseY)*1);if(G<TiddlyDesktop.canvas.top){G=TiddlyDesktop.canvas.top}if(A+F.clientWidth<TiddlyDesktop.canvas.left){A=TiddlyDesktop.canvas.left-F.clientWidth}Drag.obj.root.style.left=A+"px";Drag.obj.root.style.top=G+"px";Drag.obj.root.clientX=A+"px";Drag.obj.root.clientY=G+"px";Drag.obj.lastMouseX=D;Drag.obj.lastMouseY=C;Drag.obj.root.onDrag(A,G);return false},end:function(){document.onmousemove=null;document.onmouseup=null;Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style.left),parseInt(Drag.obj.root.style.top));Drag.obj=null},fixE:function(A){if(typeof A=="undefined"){A=window.event}if(typeof A.layerX=="undefined"){A.layerX=A.offsetX}if(typeof A.layerY=="undefined"){A.layerY=A.offsetY}return A}};
/*}}}*/
/***
!Drag Tiddler
***/
/*{{{*/
eval(function(p,a,c,k,e,r){e=function(c){return c.toString(36)};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'\\w'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('3 e;5 8(){f(e==2){i}e=2;3 A=2.q;A.n(2);A.l(2);9.8(2)}6.7.o=6.7.t;6.7.t=5(A,G,D,B,F){2.o(A,G,D,B,F);3 C=k.h(2.idPrefix+G);3 E=C.getElementsByTagName("div")[0];9.w(C);C.8=8;C.onmousedown=8;C.8();g.u.s.toggle(G,r,d);9.p(C,d);f(E){E.c=5(){2.4.height="1.25em"};E.c();E.ondblclick=5(H){2.c();H=fixE(H);g.u.s.handler(H,null,G);H.cancelBubble=d;f(H.j){H.j()}};Drag.init(E,C);C.onDragStart=5(H,I){2.4.a=2.4.b;2.4.b="red"};C.onDragEnd=5(H,L){2.4.b=2.4.a?2.4.a:"#999";9.p(2,r);3 I=k.h("sidebar");3 J=I.q;3 K=I.offsetTop;J.n(I);J.l(I);I.4.top=K+"px"}}};6.7.m=6.7.v;6.7.v=5(D,A,B){3 C=2.m(D,A,B);9.w(C);i C};',[],33,'||this|var|style|function|Story|prototype|bringToFront|layout|borderColor_old|borderColor|fixHeight|true|lastClicked|if|config|getElementById|return|stopPropagation|document|appendChild|old_refreshTiddler|removeChild|old_displayTiddler|add|parentNode|false|collapseTiddler|displayTiddler|commands|refreshTiddler|limitHeight'.split('|'),0,{}))
/*}}}*/
/***
!Tiddler Layout
***/
/*{{{*/
eval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c/62)))+((c=c%62)<36?c.toString(36):String.fromCharCode(c+29))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'\\w{1,2}'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('8 U(){}U.I={i:[],add:8(C,A){h B={j:C.j,x:findPosX(C),y:findPosY(C),z:7.i.w,1b:8(){h D=Q.O(7.j);v"\\n{j: \'%0\', x: %1, y: %2, z: %3, m: %4, r: %5, W: %6}".1c([7.j,7.x,7.y,7.z,D.K,D.1a,(!!D.W)])}};7.M(C);9(A){7.J(B,C,18)}7.i.17(B);7.i.S(8(E,D){v E.x-D.x})},J:8(C,B,A){9(A){7.s(C)}B.k.J="absolute";B.k.P=C.x+"o";B.k.X=C.y+"o";B.11()},s:8(A){q(t p 7.i){h B=7.i[t];9(10.Z(B.x-A.x)<G.s.P){A.x+=G.s.P;9(10.Z(B.y-A.y)<G.s.X){A.y+=G.s.X}}}},M:8(A){q(t p 7.i){h B=7.i[t];9(B.j==A.j){7.i.splice(t,1);break}}},autoLayout:8(){h A=[];q(t p 7.i){9(7.i[t].j){A.17(7.i[t].j.Y(u.L.w))}}u.closeAllTiddlers();u.displayTiddlers(V,A.reverse())},11:8(A){h B=7.i.S(8(F,E){v F.z-E.z});h D=B.w;q(t p B){h C=B[t];9(C.j==A.j){D=C.z;C.z=B.w}T{9(C.z>D){C.z--}}}},marshall:8(){v"[%0\\n]".1c([7.i.1b()])},unmarshall:8(c){h d=eval(c).S(8(a,b){v a.z-b.z});q(t p d){9(d[t].j){h e=d[t];h f=e.j.Y(u.L.w);u.displayTiddler(V,f);h g=Q.O(e.j);7.J(e,g,19);9(e.m){g.k.m=e.m+"o";g.k.r=e.r+"o";9(e.W){config.commands.collapseTiddler.toggle(f,18,19)}T{g.l.k.m=(e.m-15)+"o";g.l.k.r=(e.r-60)+"o"}}}}},N:8(A){A.14=8(){h B=7.getElementsByTagName("div");q(d p B){h C=B[d];9(C&&C.16=="l"){7.l=C}T{9(C&&C.16=="H"){7.H=C}}}};A.N=8(){7.14();9(7.1a>400){7.l.k.r="380px"}9(7.l&&7.l.K>=7.H.K){7.l.k.m=(7.H.K-15)+"o"}};A.N()}};h 13=new U();R.I.12=R.I.1d;R.I.1d=8(D,A,C){h B=Q.O(7.L+D);9(B!=V){13.M(B)}7.12(D,A,C)};',[],76,'|||||||this|function|if||||||||var|tiddlers|id|style|scrollable|width||px|in|for|height|cascade||story|return|length||||||||||TiddlyDesktop|windowBar|prototype|position|clientWidth|idPrefix|remove|limitHeight|getElementById|left|document|Story|sort|else|Layout|null|collapsed|top|substring|abs|Math|bringToFront|old_closeTiddler|layout|findMovingParts||className|push|true|false|clientHeight|toString|format|closeTiddler'.split('|'),0,{}))
/*}}}*/
/***
!Save Layout
Save the layout to a tiddler for redisplaying later
***/
/*{{{*/
config.macros.saveLayout={label:"save layout",prompt:"Save the current layout as the default",handler:function(A,D,F,C,E,B){createTiddlyButton(A,this.label,this.prompt,this.saveLayout)},saveLayout:function(){var A="__tiddlyDesktopLayout";var C=layout.marshall();C="/***\n@@''This tiddler is auto-generated - don't edit it!''@@\n***/\n/*{{{*/\n"+C+"\n/*}}}*/\n";var B=store.saveTiddler(A,A,C,config.options.txtUserName,new Date(),"excludeLists");if(config.options.chkAutoSave){saveChanges()}}};config.macros.restoreLayout={label:"restore layout",prompt:"Restores the last saved layout",handler:function(A,D,F,C,E,B){createTiddlyButton(A,this.label,this.prompt,restart)}};this["restart"]=function(){var A=store.getTiddlerText("__tiddlyDesktopLayout");var B=store.getTiddlerText("DefaultTiddlers");if(window.location.hash){story.displayTiddlers(null,convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1))).readBracketedList())}else{if(A){layout.unmarshall(A)}else{if(B){story.displayTiddlers(null,B.readBracketedList())}}}};
/*}}}*/
/***
!Core Sizer Functionality
Structure taken from [[DOM Drag|http://www.youngpup.net]]
***/
/*{{{*/
eval(function(p,a,c,k,e,r){e=function(c){return c.toString(36)};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'\\w'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('4 1={5:j,c:0,d:0,b:0,9:0,init:6(B,A){B.onmousedown=1.k;B.2=A&&A!=j?A:B;B.2.onSizeStart=u s();B.2.r=u s()},k:6(A){4 B=1.5=this;A=e(A);B.2.onSizeStartPre(A);1.9=m(B.2.offsetHeight);1.b=m(B.2.offsetWidth);B.2.8.l=1.9+"7";B.2.8.n=1.b+"7";1.c=A.o;1.d=A.x;B.2.onSizeStartPost(A);3.v=3.i;3.t=3.h;3.i=1.w;3.h=1.q;f p},w:6(C){C=e(C);4 B=(C.o-1.c);4 E=(C.x-1.d);4 A=B+1.b;4 D=E+1.9;g(A<a){A=a}g(D<a){D=a}1.5.2.8.n=A+"7";1.5.2.8.l=D+"7";1.5.2.r(B,E);f p},q:6(){3.i=3.v;3.h=3.t;1.5=j}};6 e(A){g(typeof A=="undefined"){A=window.event}f A};',[],34,'|Sizer|root|document|var|obj|function|px|style|startHeight|100|startWidth|startX|startY|fixE|return|if|onmouseup|onmousemove|null|start|height|parseInt|width|clientX|false|end|onSize|Function|_1|new|_0|drag|clientY'.split('|'),0,{}))
/*}}}*/
/***
!Resize Tiddler
***/
/*{{{*/
config.macros.sizer={};config.macros.sizer.handler=function(H,G,F,E,D,C){var B=createTiddlyElement(H,"span",null,"resizer","trƦk her");var A=document.getElementById(story.idPrefix+C.title);Sizer.init(B,A);A.onSizeStartPre=function(){this.findMovingParts();this.scrollable.startHeight=parseInt(this.scrollable.offsetHeight);this.scrollable.startWidth=parseInt(this.scrollable.offsetWidth);this.windowBar.startHeight=parseInt(this.windowBar.clientHeight)};A.onSizeStartPost=function(){this.windowBar.fixHeight()};A.onSize=function(J,L){var I=J+this.scrollable.startWidth;var K=L+this.scrollable.startHeight;if(I<80){I=80}if(K<50){K=50}this.scrollable.style.width=I+"px";this.scrollable.style.height=K+"px";this.windowBar.fixHeight()}};
/*}}}*/
/***
!CloseAllPreOpenAllTags
Requires http://www.digitaldimsum.co.uk/#_.FunctionDecorator
***/
/*{{{*/
Aspects.addBefore(this,"onClickTagOpenAll",function(A){story.closeAllTiddlers();return A});
/*}}}*/
/***
!Tiddly Desktop
Core stuff - should move more functionality (like decorating Tiddlers) into here
***/
/*{{{*/
var TiddlyDesktop={canvas:{top:39,left:60},cascade:{top:20,left:20}};
/*}}}*/
//{{{
function checkDisplay(c){var d=c["displayMessage"];c["displayMessage"]=function(a,b){d.apply(this,arguments);setTimeout(clearMessage,10000)}}checkDisplay(this);
//}}}
//{{{
config.commands.jump.text="ā†—";
config.commands.closeOthers.text="ā˜¼";
config.commands.closeTiddler.text="āœ•"
//}}}
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-black-line.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-black-line.gif|treeview-black-line.gif]] - {{{type=image/gif, size=1877 bytes, encoded=2543 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-black-line.gif|./images/treeview-black-line.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-black-line.gif|http://www.symbex.net.au/Wiki/images/treeview-black-line.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-black-line.gif]] or [img[tooltip|treeview-black-line.gif][link]]}}}
[img[tooltip|treeview-black-line.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEADwBvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAPAGAAj/AP8JHPgPAMGDCA0iXFiQ
4UKFDglCjChwIkWLETE61MgQgMePHx9SlDhyIEeRJRumPJkwpcqSLA/GJLnS5UyT
NnPW3AlTZ0+eI29W9BmU6EWjGZFuVNqRKcqfUIsCPTo1adWlV5tmfSo1KlWvVsFi
FauVLNevXdOiXRtWbVu2Y93GhVtWbl26Z9/qnbv3bt+8fAP7FQx4sOHCiFtuVWyW
sd3EMp06xjv5b2XClw9nhkyzceTFnz13fry5dGjSpymntrwac2vNrznjBD1adW3W
t13nhr1b9lDas0UHR93bdPHYxofbVo6buW7nvKH7fkncpfXr2LNr3869e/TfwsFX
/xe/nHxz88/Rf6denv159+nhrxcqfzr9+5KR6z/OX3py9fbl1x+A/9VXIH7AEbif
fwsqOKCBDUL4IILhScjghAJeqKGDG1rI4YcehkjheCJmCOKI7aH4norxsTifiSUm
GGOFLgYoY40HwohjhDtieKOOQP4oJI1BEjkkiT12mOSJRSLZZIpPrhhli1O+eCSU
V0qZJZVbWmnkl052aSOYWJKppZlcoullmGqOyeabZcJ5ppxp0rlmnHjOmWede96p
5598AupnoIQOaqibfSIqqKKFMnpojmJC2qakdjpqKaWJYrqopo1y+iiPVV4KaqSj
TlpqpZ6K6qOpq6J6aqavbv8aa6ezftoqrLfKmiutu9qqZKipBlurqr+S2iuxTBpb
LKvLunqssM8OC22zuFKrq7W8Yutrssxy66y2yM74rbfVknutudmiu6245bJ7rrvp
wrvukvKGS++9wEqrb7T8gjutuvbm2y/A/9ZbML7KEryvvwsrPLDBDUP8MMLdSszw
xAJfrLHDG1vM8cceh0zxuCJnDPLI7aL8rsrxsjyvySUnHHPFLgcsc80Hw4xzxDtj
fLPOQP8sNM1BEz00yT13nPTJRSPddMpPrxx1y1O/fDTUV0udNdVbW2301053bTPY
WJOttdlco+112GqPzfbbZcN9ttxp07123HjPnXfde9//rffffAPud+CED264230j
LrjihTN+eM5iQ9625HY7bjnliWO+uOaNc/44z1VfDnrko09eeuWei+6z6aujfnrm
r28ee+ezf9467LfLnjvtu9uudOipB1+76r+T3jvxTBtfPOvLu3688M8PD33zuFOv
u/W8Y+978sxz77z2yM/8vffVk3+9+dmjv7345bN/vvvpw7/+0vKHT//9wEuvf/T8
gz+9+vbLX/8A+L/6FRB/yiPg/vy3QAUO0IANhOADEdg9CTJwggK8oAYduEELcvCD
HgwhBccnwgyCcITtQ+H7VBg/Fs7PhCVMYAwr6MIAyrCGB4QhDiO4QwzeUIdA/KEQ
MmkYRCIOkYQ97GAST1hEJDYxhU9cYRRbOMUXHhGKV5RiFqm4RSsa8YtO7KINaQgS
kAQEADs=
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-black.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-black.gif|treeview-black.gif]] - {{{type=image/gif, size=1216 bytes, encoded=1649 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-black.gif|./images/treeview-black.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-black.gif|http://www.symbex.net.au/Wiki/images/treeview-black.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-black.gif]] or [img[tooltip|treeview-black.gif][link]]}}}
[img[tooltip|treeview-black.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhYACFAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABgAIUAAAj/AP8JHEiwoMGDCBMqXMjw
H4CHABRCbEixosWLBCNi3Mixo0WNHkOKFAlypMmTKFOqPAmx5cOVMEkeLBmz5seB
IGna3LkwJ06eQBlGdOmwZdCjGX8K1In0qM+lTaNCNchU6k6XRq1araoVKdeuQb+C
5Sl2rM2yZmOiTRuS6Vq2Hd3CxThR4kuqcy++Rbg3b9+8gAMLBou17mCTcg8jnql4
Md7GMokShbwxMeW4jC9jfqy5cuG/nTmHljl6JOjSolFzPK1aaWuhmV/3jB3aMN+7
BVmb1e0QNW/ZwIMLF/z5N2TLw3O7Nt74ae/keCVnhe6cueLq0FNPzY7zM/fv4MOL
nR+/m7z21tNn4gaOnHv77O+p0zb/nHxx8fGTYw+/H/xQo5PJt511h/X3XX7D3Uff
ggw26GB9CxLYmYS7racehWNhSJmGxz3o4YcK+jcffCMKqBx/RU0UoH4lsnieiyf6
592HNNZoY20Octicfhbm1qOJEeYoZIM6BhbigS0mmKRwCDKZ4ksrKvmilDEiOSWT
M96o5ZZcdunll2AaFBAAOw==
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-default-line.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-default-line.gif|treeview-default-line.gif]] - {{{type=image/gif, size=1993 bytes, encoded=2701 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-default-line.gif|./images/treeview-default-line.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-default-line.gif|http://www.symbex.net.au/Wiki/images/treeview-default-line.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-default-line.gif]] or [img[tooltip|treeview-default-line.gif][link]]}}}
[img[tooltip|treeview-default-line.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEADwBvcAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAPAGAAj/AP8JHEiwoEGBAQ4qXHgw
IcOHCx1CnEhQIkWKCTP+03ixYceLFj8yDClSIcmSBk+irLhyZMuIL03G9DizoMqX
N1vmXLkTZc+SP0UG/Ti0Y1GQNW0mZbkUYVOnT49ifLqRqtSJVyFmfbjVZVSrYL+K
bdoV5tilZWWeTZqWJtmwb9fWbJsSLlq7bPHO1TuTrlK5ffnG9Ms0ruG7gAcLxrlY
Z2Oej31GBjpZaGWil6lq3sy5M9fMSBMzFu2YNGTTklFTVm2ZNWbXRkFPhR36cF7a
s23vxY1Vdm/eWn0HB/6ZuFfdgY2bRa5YuVrmo6GXln6aemrrq7G31v6ae2znbhF7
/68tvvzt8bnN70b/m/1w98XhH1efXP5y+s3tP8cfnf90/9UBeJ2A2RG4nYHdIfid
fuGdpyB5Dka43oPpSVgfhe1h+J6G8XE4n4X5eXgfiP2R+J+JAaI4oIoFsnigiwnC
uKCI+8kI4YQ2VojjjhfmmKGPGwLZoZAf8hgikSMaWaKSJzKZopMrQtmilC9SGaOV
MyJZI5Y39siljl6GeeSXP5IZpJlDolmkmEuy2aSbT8IZpZxT0lmlnVfimaWaSerZ
5Zh+ggnooG0S+qahcSI6p6J1Mnqno3lCumegZVJ6pqVpYrqmpH8W6umhnyYa6qKj
Nlrqo6dGmuqknAq6aqegxv8qqqyk0mqqrajiqqqurL7qKq+wzipsrcPeWmyux+6a
bK/A/rpssMRGa6y0yFKrrLXMPussttBO6221314bbrbcbjtut+CmK6665J5rLrvo
ritvu/C+O2+89N5rb7784uvvvv9W2qrAvhLcrMHaIlyuwu4yXK/D+kLcL8AUSxzw
pQNjXLDGB3OcsMcLg9ywyA+THLHJE1tcMcoXZ5qxyxvD3LHMH9Mcss0j41yyzifz
nDLLK/vc8qYxEz2z0TUjfbPSOTO9s9M9Q/2z0EFLPXSfL1tdNdZFc32010mDvbTY
TZP9tNlRoz211iq3DbTbVMPN9tt0x1333Hbnjffeal//vaWmfW/9d9aBy1343Yfr
nTjfg3fd+NePhx352JOXXfnZl6ed+dqLd7653w3y+bngoQM+uuGnI5664qszXjrh
rXv+uuOzQ1675LdTnrvlu2Peu+a/cx778MGDXhd4xzOYPI3Fk768ls2jHr3q07Ne
vevPi3697Nmbvj3x3cP+/fjh016+7efjnr7u6/Pevu/vAx+/8OT/pbz9zM9vPP7Q
6+88/9rzn/QESD0CWs+A2AOg9xDIPQWKj4Hgc6D5JIg+CqrPguzDoPs0CD8Oys+D
9INg/QqTPxDuj4T9M+H/UBhAFQ7QhQWE4QFlmEAWLpCGDbThA3EYQR1O0IcVBOIF
poWYQSJu0IgdROIHlRhCHo5wIISBonBmyMQTShF5ThShFrPIxSqu8Ir38+ILxRhD
MlIRjCU0Yw3RmEI15pCNLXRjD+F4Qzk+ESphpOMO7bhFPnZRjz8EZBAFOURCFtGQ
R0RkEhW5REY20Y+QdKQV8ZhGSX6Rkm205Bg1WUZOnhGTcfTkGkFZR1G+kZR7NOUc
URlIVg7SlYWE5SFlmUhaLtIpGslIQAAAOw==
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-default.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-default.gif|treeview-default.gif]] - {{{type=image/gif, size=1222 bytes, encoded=1657 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-default.gif|./images/treeview-default.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-default.gif|http://www.symbex.net.au/Wiki/images/treeview-default.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-default.gif]] or [img[tooltip|treeview-default.gif][link]]}}}
[img[tooltip|treeview-default.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhYACFAPcAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABgAIUAAAj/AP8JHEiwoMGDCBMqXMjw
H4CHABRCbEixosWLBCNi3Mixo0WNHkOKFAlypMmTKFOqPBmgpUuXK2OKDHCQpsyb
G206HKgTp8+GOkH2/EkUIU2ID//RXFq0KcGgPJ1KfTpQ6NSrQwVmvfrzpVeuYMOK
VTq2rFmnW8+qXTsyLVuSb4uWjBq34USJSetynIvRrd6qfwMLHszV60vCIbf6RcxQ
MeOOjh/ndIiULFPJFCNjtqh5c+aanjkbbhm6tNTFplOvRK26tUnWpvm6Xigbdty7
CXGrls3ZM+/ZwIMLjzua9HC6BW2Hhqr1OHKrzskijchU+WPmZKNjt7658/Di3KOL
ox9Pvrx5ir+jp8dcOXfe1uuP1xYff/j88/iVFhfvXfh2/oA1px1lE1X3XYDZOfff
gAaFJxl4+UUo4YTO1SechcFhSJhuB3EYW4QazhYihSS2BiGDyQHYoIopDjidZQkC
119wM8oImnb7lajjjjz+NSJ8IALnYUbv9aiag0YyhmSSf52o4I1ProgiVS5WZqB/
UB5X42xbuuYkk2CGKeaYZJY5W0AAOw==
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-famfamfam-line.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-famfamfam-line.gif|treeview-famfamfam-line.gif]] - {{{type=image/gif, size=807 bytes, encoded=1092 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-famfamfam-line.gif|./images/treeview-famfamfam-line.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-famfamfam-line.gif|http://www.symbex.net.au/Wiki/images/treeview-famfamfam-line.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-famfamfam-line.gif]] or [img[tooltip|treeview-famfamfam-line.gif][link]]}}}
[img[tooltip|treeview-famfamfam-line.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhAQABAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAABAAEAAAgEAP8FBAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-famfamfam.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-famfamfam.gif|treeview-famfamfam.gif]] - {{{type=image/gif, size=1280 bytes, encoded=1734 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-famfamfam.gif|./images/treeview-famfamfam.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-famfamfam.gif|http://www.symbex.net.au/Wiki/images/treeview-famfamfam.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-famfamfam.gif]] or [img[tooltip|treeview-famfamfam.gif][link]]}}}
[img[tooltip|treeview-famfamfam.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhYACFAPcAAAAAADFrGDlzIUJzIVKEMXOcY71CAL1KANZaCMZaId5rIfdz
APd7GIS1Y4y9Y5S1e++EQvetc5S1jKW9nLXWlLXGrbnSpN6lhOetjOe1lO+1lNbn
vf/Stf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABgAIUAAAj/AP8JHEiwoMGDCBMqXMjw
H4CHABRCbEixosWLBCNi3Mixo0WNHkOKFAlypMmTKFOqXMmypcuXMGPKnCnQQoEC
BCbQ3JmwQgMKGxwQeMCzKEECFCh0cOBAgNGnSDtIpRDgqdEBDhp0aNDUalEJBBxQ
EErUK08JAwIMkGC2rdu3cOPKnUu3Ls2SdlvizVtxosSHfDfuDYxyMOHDiBMrXsy4
sdsMCQwkuOCYYwYFGjhEUJChMsYEGiAwYAAhgeeLBjhI7cDAwGmLCSIwWLAAgenX
FDEkmI3gAGXcFCFL/g28uPHjyJMrl7icoeHKfhNGB/68ucDq1rNr3869u1WbOHVy
3fcJlCx3pEqZOt0edWrV7Vi1cl2vHaxY89zRqmXrvb///wAGOBB2zRG4GETVTYeb
gcoxmJyDyEEo4IQUHgdeTt2RF9RQ5yW1VFfsKeUed/FtBWJ9YY3FYX5prVXhizDG
eJiExtFYnI18KWiQjqfhuCCAPsoo5JBE8iTcZN1dltlmnW0Hmmik3aZdaqu1xl1s
s9UmZXa68eZbkpEhWeSYZJapUpA9AhkhYNKxaeabcMYp55yMHUmcdkpqxtmVoY1W
GndUSmWlk7LRZht3Xdb2JXd20unoo5BGKumkBwUEADs=
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\treeview-gold-line.gif}}}|
| attached on:|4 June 2009 by YourName|
| embedded:|[[treeview-gold-line.gif|treeview-gold-line.gif]] - {{{type=image/gif, size=1878 bytes, encoded=2543 bytes}}}|
| local file:|/%LOCAL_LINK%/[[file:///F:/TiddlyWiki/TW jQuery/TreeView/images/treeview-gold-line.gif|file:///F:/TiddlyWiki/TW jQuery/TreeView/images/treeview-gold-line.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-gold-line.gif|http://www.symbex.net.au/Wiki//images/treeview-gold-line.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-gold-line.gif]] or [img[tooltip|treeview-gold-line.gif][link]]}}}
[img[tooltip|treeview-gold-line.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEADwBvcAAAAAAPdzc///1v//////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////yH5BAEAAAAALAAAAAAQAPAGAAj+AAEIHAhAAMGDCA0iXFiQ
4UKFDglCjChwIkWLETE61MhQgMePHx9SlDhyIEeRJRumPJkwpcqSLA/GJLnS5UyT
NnPW3AlTZ0+eI29W9BmU6EWjGZFuVNqRKcqfUIsCPTo1adWlV5tmfSo1KlWvVsFi
FauVLNevXdOiXRtWbVu2Y93GhVtWbl26Z9/qnbv3bt+8fAP7FQx4sOHCiFtuVWyW
sd3EMp06xjv5b2XClw9nhkyzceTFnz13fry5dGjSpymntrwac2vNrznjBD1adW3W
t13nhr1b9lDas0UHR93bdPHYxofbVo6buW7nvKH7fkncpfXr2LNr3869e/TfwsH+
Vxe/nHxz88/Rf6denv159+nhrxcqfzr9+5KR6z/OX3py9fbl1x+A/9VXIH7AEbif
fwsqOKCBDUL4IILhScjghAJeqKGDG1rI4YcehkjheCJmCOKI7aH4norxsTifiSUm
GGOFLgYoY40HwohjhDtieKOOQP4oJI1BEjkkiT12mOSJRSLZZIpPrhhli1O+eCSU
V0qZJZVbWmnkl052aSOYWJKppZlcoullmGqOyeabZcJ5ppxp0rlmnHjOmWede96p
5598AupnoIQOaqibfSIqqKKFMnpojmJC2qakdjpqKaWJYrqopo1y+iiPVV4KaqSj
TlpqpZ6K6qOpq6J6aqb+r24aa6ezftoqrLfKmiutu9qqZKipBlurqr+S2iuxTBpb
LKvLunqssM8OC22zuFKrq7W8Yutrssxy66y2yM74rbfVknutudmiu6245bJ7rrvp
wrvukvKGS++9wEqrb7T8gjutuvbm2y/A/9ZbML7KEryvvwsrPLDBDUP8MMLdSszw
xAJfrLHDG1vM8cceh0zxuCJnDPLI7aL8rsrxsjyvySUnHHPFLgcsc80Hw4xzxDtj
fLPOQP8sNM1BEz00yT13nPTJRSPddMpPrxx1y1O/fDTUV0udNdVbW2301053bTPY
WJOttdlco+112GqPzfbbZcN9ttxp07123HjPnXf+3XvfrffffAPud+CED264230j
LrjihTN+eM5iQ9625HY7bjnliWO+uOaNc/44z1VfDnrko09eeuWei+6z6aujfnrm
r28ee+ezf9467LfLnjvtu9uudOipB1+76r+T3jvxTBtfPOvLu3688M8PD33zuFOv
u/W8Y+978sxz77z2yM/8vffVk3+9+dmjv7345bN/vvvpw7/+0vKHT//9wEuvf/T8
gz+9+vbLX/8A+L/6FRB/yiPg/vy3QAUO0IANhOADEdg9CTJwggK8oAYduEELcvCD
HgwhBccnwgyCcITtQ+H7VBg/Fs7PhCVMYAwr6MIAyrCGB4QhDiO4QwzeUIc3QPyh
EGkYRCIOkYQ97GAST1hEJDYxhU9cYRRbOMUXHhGKV5RiFqm4RSsa8YtO7KINaQgS
kAQEAAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\treeview-gold.gif}}}|
| attached on:|5 June 2009 by YourName|
| embedded:|[[treeview-gold.gif|treeview-gold.gif]] - {{{type=image/gif, size=1179 bytes, encoded=1596 bytes}}}|
| local file:|//none//|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-gold.gif|http://www.symbex.net.au/Wiki/images/treeview-gold.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-gold.gif]] or [img[tooltip|treeview-gold.gif][link]]}}}
[img[tooltip|treeview-gold.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhYACFAPcAAAAAAP//1v//////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
/////////////////yH5BAEAAAAALAAAAABgAIUAAAj+AAEIHEiwoMGDCBMqXMiw
ocOHECNKnEixosWLGDNq3Mixo8ePIEMKDECyZEmRKCUGOLgypcuGLQHEjPmyJsuB
M23qNLgygICTJmnudJlz5NCjRWUeHSrU6FKdQU0+Xdp06s6qVm1izfpyK9eUXr+K
DCsWJNmyHs+i5ah2rca2buPKnUtXbtSTdTNWhZs34d6+GP8CtthTgOGeUgdHFKx4
IuPGi29CVnmX7+SCli9L1kyY88XMnnGGrgh6dOnQpz2n5rx6tOvXsGNzrdw672PZ
op0qxY05927eon0CTYw7ae26xoETvM2btvLn0KNLn069uvWvxyFnb7xdcffB3+l5
OofOvLjv8GuTk5f5k6RM4rLVP5evvHz8ytfz69/Pv7///wAGKOCABJqF33o8RWdf
bAvCVthh7+FlXoII9lbhcgoeWOCGHHbo4YcgOqgferaNaCJ14823WX0rAtfga4i1
F6F7zbVYI4Uq4lifhiH26OOPQAYppEsBAQA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-gray-line.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-gray-line.gif|treeview-gray-line.gif]] - {{{type=image/gif, size=1877 bytes, encoded=2543 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-gray-line.gif|./images/treeview-gray-line.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-default.gif|http://www.symbex.net.au/Wiki/images/treeview-default.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-gray-line.gif]] or [img[tooltip|treeview-gray-line.gif][link]]}}}
[img[tooltip|treeview-gray-line.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEADwBvcAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAPAGAAj/AP8JHPgvAMGDCA0iXFiQ
4UKFDglCjChwIkWLETE61MgwgMePHx9SlDhyIEeRJRumPJkwpcqSLA/GJLnS5UyT
NnPW3AlTZ0+eI29W9BmU6EWjGZFuVNqRKcqfUIsCPTo1adWlV5tmfSo1KlWvVsFi
FauVLNevXdOiXRtWbVu2Y93GhVtWbl26Z9/qnbv3bt+8fAP7FQx4sOHCiFtuVWyW
sd3EMp06xjv5b2XClw9nhkyzceTFnz13fry5dGjSpymntrwac2vNrznjBD1adW3W
t13nhr1b9lDas0UHR93bdPHYxofbVo6buW7nvKH7fkncpfXr2LNr3869e/TfwsFX
/xe/nHxz88/Rf6denv159+nhrxcqfzr9+5KR6z/OX3py9fbl1x+A/9VXIH7AEbif
fwsqOKCBDUL4IILhScjghAJeqKGDG1rI4YcehkjheCJmCOKI7aH4norxsTifiSUm
GGOFLgYoY40HwohjhDtieKOOQP4oJI1BEjkkiT12mOSJRSLZZIpPrhhli1O+eCSU
V0qZJZVbWmnkl052aSOYWJKppZlcoullmGqOyeabZcJ5ppxp0rlmnHjOmWede96p
5598AupnoIQOaqibfSIqqKKFMnpojmJC2qakdjpqKaWJYrqopo1y+iiPVV4KaqSj
TlpqpZ6K6qOpq6J6aqavbv8aa6ezftoqrLfKmiutu9qqZKipBlurqr+S2iuxTBpb
LKvLunqssM8OC22zuFKrq7W8Yutrssxy66y2yM74rbfVknutudmiu6245bJ7rrvp
wrvukvKGS++9wEqrb7T8gjutuvbm2y/A/9ZbML7KEryvvwsrPLDBDUP8MMLdSszw
xAJfrLHDG1vM8cceh0zxuCJnDPLI7aL8rsrxsjyvySUnHHPFLgcsc80Hw4xzxDtj
fLPOQP8sNM1BEz00yT13nPTJRSPddMpPrxx1y1O/fDTUV0udNdVbW2301053bTPY
WJOttdlco+112GqPzfbbZcN9ttxp07123HjPnXfde9//rffffAPud+CED264230j
LrjihTN+eM5iQ9625HY7bjnliWO+uOaNc/44z1VfDnrko09eeuWei+6z6aujfnrm
r28ee+ezf9467LfLnjvtu9uudOipB1+76r+T3jvxTBtfPOvLu3688M8PD33zuFOv
u/W8Y+978sxz77z2yM/8vffVk3+9+dmjv7345bN/vvvpw7/+0vKHT//9wEuvf/T8
gz+9+vbLX/8A+L/6FRB/yiPg/vy3QAUO0IANhOADEdg9CTJwggK8oAYduEELcvCD
HgwhBccnwgyCcITtQ+H7VBg/Fs7PhCVMYAwr6MIAyrCGB4QhDiO4QwzeUIdA/KEQ
MmkYRCIOkYQ97GAST1hEJDYxhU9cYRRbOMUXHhGKV5RiFqm4RSsa8YtO7KINaQgS
kAQEADs=
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-gray.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-gray.gif|treeview-gray.gif]] - {{{type=image/gif, size=1230 bytes, encoded=1665 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-gray.gif|./images/treeview-gray.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-gray.gif|http://www.symbex.net.au/Wiki/images/treeview-gray.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-gray.gif]] or [img[tooltip|treeview-gray.gif][link]]}}}
[img[tooltip|treeview-gray.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhYACFAPcAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABgAIUAAAj/AP8JHEiwoMGDCBMqXMjw
H4CHABRCbEixosWLBCNi3Mixo0WNHkOKFAlypMmTKFOqPBmgpUuXK2OKDHCQpsyb
G206HKgTp8+GOkH2/EkUIU2ID/+9HFq0aFCeTaMafCqQqVSnNa9qXfpSq9eqX8OC
FfvVKlmsZ7emVbv2ZkmobWW+HRu34kSJSafW/RjS7N6Dc/8KHkw4LVeYhUda9ZvY
4uLGM7NC9ngUqdKuky8+zsxxM2eMnj87PsxYNMPSpimiTn2adV/XlGF3XA07MG3X
tlPfTbib4O29gR3rlk28uPHjVUkjl1zwd2qqSpfrFShUenOHlpdah+7cNHfrvpmD
qyfdHbz58+jTqzcZHH1705Z55y2e+3x98/fB518ffT159KFtN1B1531XIHYTaSed
geYxOJ542ynH34QUVmjhThW+h99xvQE2H3Ea6mdhiBeWWKCEDUK4oIrLBbgiUhEp
2CKLyLk443QNomjijjz2mBmJ0gG5nJCTdViQkTdSWB5xS8rWJGxPivbfgTg+WKWA
V76YHWZJhkfldV96meNhPpZp5plopqnmmggFBAA7
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TW jQuery\TreeView\images\treeview-red-line.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-red-line.gif|treeview-red-line.gif]] - {{{type=image/gif, size=1877 bytes, encoded=2543 bytes}}}|
| local file:|/%LOCAL_LINK%/[[file:///F:/TiddlyWiki/TW jQuery/TreeView/images/treeview-red-line.gif|file:///F:/TiddlyWiki/TW jQuery/TreeView/images/treeview-red-line.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-red-line.gif|http://www.symbex.net.au/Wiki/images/treeview-red-line.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-red-line.gif]] or [img[tooltip|treeview-red-line.gif][link]]}}}
[img[tooltip|treeview-red-line.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhEADwBvcAAAAAAPV2dgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAPAGAAj/AP8JHPgvAMGDCA0iXFiQ
4UKFDglCjChwIkWLETE61MgwgMePHx9SlDhyIEeRJRumPJkwpcqSLA/GJLnS5UyT
NnPW3AlTZ0+eI29W9BmU6EWjGZFuVNqRKcqfUIsCPTo1adWlV5tmfSo1KlWvVsFi
FauVLNevXdOiXRtWbVu2Y93GhVtWbl26Z9/qnbv3bt+8fAP7FQx4sOHCiFtuVWyW
sd3EMp06xjv5b2XClw9nhkyzceTFnz13fry5dGjSpymntrwac2vNrznjBD1adW3W
t13nhr1b9lDas0UHR93bdPHYxofbVo6buW7nvKH7fkncpfXr2LNr3869e/TfwsFX
/xe/nHxz88/Rf6denv159+nhrxcqfzr9+5KR6z/OX3py9fbl1x+A/9VXIH7AEbif
fwsqOKCBDUL4IILhScjghAJeqKGDG1rI4YcehkjheCJmCOKI7aH4norxsTifiSUm
GGOFLgYoY40HwohjhDtieKOOQP4oJI1BEjkkiT12mOSJRSLZZIpPrhhli1O+eCSU
V0qZJZVbWmnkl052aSOYWJKppZlcoullmGqOyeabZcJ5ppxp0rlmnHjOmWede96p
5598AupnoIQOaqibfSIqqKKFMnpojmJC2qakdjpqKaWJYrqopo1y+iiPVV4KaqSj
TlpqpZ6K6qOpq6J6aqavbv8aa6ezftoqrLfKmiutu9qqZKipBlurqr+S2iuxTBpb
LKvLunqssM8OC22zuFKrq7W8Yutrssxy66y2yM74rbfVknutudmiu6245bJ7rrvp
wrvukvKGS++9wEqrb7T8gjutuvbm2y/A/9ZbML7KEryvvwsrPLDBDUP8MMLdSszw
xAJfrLHDG1vM8cceh0zxuCJnDPLI7aL8rsrxsjyvySUnHHPFLgcsc80Hw4xzxDtj
fLPOQP8sNM1BEz00yT13nPTJRSPddMpPrxx1y1O/fDTUV0udNdVbW2301053bTPY
WJOttdlco+112GqPzfbbZcN9ttxp07123HjPnXfde9//rffffAPud+CED264230j
LrjihTN+eM5iQ9625HY7bjnliWO+uOaNc/44z1VfDnrko09eeuWei+6z6aujfnrm
r28ee+ezf9467LfLnjvtu9uudOipB1+76r+T3jvxTBtfPOvLu3688M8PD33zuFOv
u/W8Y+978sxz77z2yM/8vffVk3+9+dmjv7345bN/vvvpw7/+0vKHT//9wEuvf/T8
gz+9+vbLX/8A+L/6FRB/yiPg/vy3QAUO0IANhOADEdg9CTJwggK8oAYduEELcvCD
HgwhBccnwgyCcITtQ+H7VBg/Fs7PhCVMYAwr6MIAyrCGB4QhDiO4QwzeUIdA/KEQ
MmkYRCIOkYQ97GAST1hEJDYxhU9cYRRbOMUXHhGKV5RiFqm4RSsa8YtO7KINaQgS
kAQEADs=
---END_DATA---
%/
| source file:|{{{F:\TiddlyWiki\TWExperiments\jQuery\images\treeview-red.gif}}}|
| attached on:|31 May 2009 by YourName|
| embedded:|[[treeview-red.gif|treeview-red.gif]] - {{{type=image/gif, size=1230 bytes, encoded=1665 bytes}}}|
| local file:|/%LOCAL_LINK%/[[./images/treeview-red.gif|./images/treeview-red.gif]]|
| remote link:|/%REMOTE_LINK%/[[http://www.symbex.net.au/Wiki/images/treeview-red.gif|http://www.symbex.net.au/Wiki/images/treeview-red.gif]]|
image
<<<
usage: {{{[img[tooltip|treeview-red.gif]] or [img[tooltip|treeview-red.gif][link]]}}}
[img[tooltip|treeview-red.gif]]
<<<

/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhYACFAPcAAAAAAPV2dgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABgAIUAAAj/AP8JHEiwoMGDCBMqXMjw
H4CHABRCbEixosWLBCNi3Mixo0WNHkOKFAlypMmTKFOqPBmgpUuXK2OKDHCQpsyb
G206HKgTp8+GOkH2/EkUIU2ID/+9HFq0aFCeTaMafCqQqVSnNa9qXfpSq9eqX8OC
FfvVKlmsZ7emVbv2ZkmobWW+HRu34kSJSafW/RjS7N6Dc/8KHkw4LVeYhUda9ZvY
4uLGM7NC9ngUqdKuky8+zsxxM2eMnj87PsxYNMPSpimiTn2adV/XlGF3XA07MG3X
tlPfTbib4O29gR3rlk28uPHjVUkjl1zwd2qqSpfrFShUenOHlpdah+7cNHfrvpmD
qyfdHbz58+jTqzcZHH1705Z55y2e+3x98/fB518ffT159KFtN1B1531XIHYTaSed
geYxOJ542ynH34QUVmjhThW+h99xvQE2H3Ea6mdhiBeWWKCEDUK4oIrLBbgiUhEp
2CKLyLk443QNomjijjz2mBmJ0gG5nJCTdViQkTdSWB5xS8rWJGxPivbfgTg+WKWA
V76YHWZJhkfldV96meNhPpZp5plopqnmmggFBAA7
---END_DATA---
%/
/***
Configuration settings, Core and Backstage tweaks
***/
//{{{
config.options.txtTheme="Groundless";
config.options.txtUserName="";
config.options.chkAnimate=false;
config.options.txtBackupFolder="backup";
config.options.chkHttpReadOnly=false;
readOnly=false;
showBackstage=true;
config.options.chkForceMinorUpdate=true;
config.options.chkInsertTabs=true;
config.options.txtMaxEditRows="20";
config.options.txtTidIDEMaxEditRows="12";
config.options.chkSaveBackups=false;
config.options.slidercookiename=false;
config.macros.editSection.rows=15;
config.macros.editSection.cols=80;
config.options.chkStickyPopups=true;
config.options.chkCreateDefaultBreadcrumbs=false;
config.options.chkReorderBreadcrumbs=true;
config.options.chkBreadcrumbsReverse=true;
config.options.chkShowBreadcrumbs=false;
config.options.chkShowStartupBreadcrumbs=true;

//}}}
/***
Name: CoreTweaks ''packed''
Source: http://www.TiddlyTools.com/#CoreTweaks
Author: Eric Shulman
License: http://www.TiddlyTools.com/#LegalStatements
~CoreVersion: 2.2.4
Description: a small collection of overrides to TW core functions
tooltip format:
***/
//{{{
config.messages.tiddlerLinkTooltip="%0 - %1, %2 (%3 bytes)";config.messages.tiddlerLinkTooltipDate="DDD, MMM DDth YYYY 0hh12:0mm AM";config.options.txtTiddlerLinkTootip=config.options.txtTiddlerLinkTootip||config.messages.tiddlerLinkTooltip;config.options.txtTiddlerLinkTooltipDate=config.options.txtTiddlerLinkTooltipDate||config.messages.tiddlerLinkTooltipDate;Tiddler.prototype.getSubtitle=function(){var a=this.modifier;if(!a){a=config.messages.subtitleUnknown}var b=this.modified;if(b){b=b.formatString(config.options.txtTiddlerLinkTooltipDate)}else{b=config.messages.subtitleUnknown}return config.options.txtTiddlerLinkTootip.format([this.title,a,b,this.text.length])};
//}}}
// // (more/less toggle) + (wikify tiddler/slice/section content)
//{{{
merge(config.macros.toolbar,{moreLabel:"+",morePrompt:"Show additional commands",lessLabel:"-",lessPrompt:"Hide additional commands",separator:"|"});config.macros.toolbar.onClickMore=function(a){var b=this.nextSibling;b.style.display="inline";this.style.display="none";return false};config.macros.toolbar.onClickLess=function(b){var c=this.parentNode;var a=c.previousSibling;c.style.display="none";a.style.display="inline";return false};config.macros.toolbar.handler=function(g,b,f,i,d,m){for(var n=0;n<f.length;n++){var l=f[n];switch(l){case"!":createTiddlyText(g,this.separator);break;case"*":createTiddlyElement(g,"BR");break;case"<":var a=createTiddlyButton(g,this.lessLabel,this.lessPrompt,config.macros.toolbar.onClickLess,"moreCommand");break;case">":var a=createTiddlyButton(g,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore,"moreCommand");var j=createTiddlyElement(g,"span",null,"moreCommand");j.style.display="none";g=j;break;default:var k="";switch(l.substr(0,1)){case"+":k="defaultCommand";l=l.substr(1);break;case"-":k="cancelCommand";l=l.substr(1);break}if(l in config.commands){this.createCommand(g,l,m,k)}else{if(l.substr(0,1)=="~"){l=l.substr(1)}var h=store.getTiddlerText(l);if(h){h=h.replace(/^\n*/,"").replace(/\n*$/,"");h=h.replace(/^\{\{\{\n/,"").replace(/\n\}\}\}$/,"");wikify(h,createTiddlyElement(g,"span"),null,m)}}break}}};
//}}}
// // 'double-backslash-newline' - to be embedded in line-mode wiki syntax (e.g., tables, bullets, etc.)
//{{{
window.coreWikify=wikify;window.wikify=function(a,b,c,d){if(a){arguments[0]=a.replace(/\\\\\n/mg,"<br>")}coreWikify.apply(this,arguments)};
config.formatters[config.formatters.findByField("name","rule")].match+="|<hr ?/?>\\n?";
//}}}
/***
!Backstage
adapted from http://www.tiddlytools.com/#BackstageTweaks
DO NOT USE THIS PLUGIN WITHOUT EDITING IT TO MATCH **YOUR** DOCUMENT!!!
***/
//{{{
if(config.tasks!=undefined){
config.tasks.tiddler={text:"tiddler",tooltip:"Tiddler Tweaker Panel",content:"<<tiddler TidIDEditor>>"};
config.backstageTasks.push("tiddler");
config.tasks.menu={text:"menu",tooltip:"View the Menu",content:"<<tiddler Groundless##MainMenu>>"};
config.backstageTasks.push("menu");
config.messages.backstage.open.text="";
config.glyphs.codes.bentArrowLeft=["<","<"];
config.glyphs.codes.bentArrowRight=["",""];
config.glyphs.codes.downTriangle=["..",".."];
setStylesheet("\t#backstageButton \t\t{ font-size:7pt; } \t#backstageArea \t\t{ font-size:7pt; } \t#backstagePanel #importPanel \t\t{ left:10%; right:auto; }\t","BackstageTweaks_");
}
backstage.save_init=backstage.init;
backstage.init=function(){
this.save_init.apply(this,arguments);
var _1=document.getElementById("backstageShow");
if(_1&&(addClass instanceof Function)){
addClass(_1,"mouseover");
}
};
//}}}
/***
!
Name: YourSearchBookmarklet
Version: 2.1.4
Source: http://tiddlywiki.abego-software.de/#YourSearchPlugin
Author: UdoBorkowski, XavierVergƩs
Licence: BSD open source license (abego Software)
Copyright: &copy; 2005-2008 http://www.abego-software.de
Community: http://xdexavier.googlepages.com/yoursearch.html
***/
//{{{
(function(){var a=document.createElement("script");a.src="http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/YourSearchPlugin.js";a.onload=function(){refreshPageTemplate();displayMessage("YourSearch has been loaded")};document.getElementsByTagName("head")[0].appendChild(a)})();
//}}}