Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
<<importTiddlers>>
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

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

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

----
Also see [[AdvancedOptions]]
<!--{{{-->
<div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!Tiddler von ExtendedBrain
<<forEachTiddler
 where 
 'tiddler.tags.contains("ExtendedBrain")'
    sortBy 
        'tiddler.title'
        ascending
    script
        '
        function writeLine(tiddler) {
            var line = "";
            line = line + "|" + "[[" + tiddler.title + "]]";
            line = line + "|" + "[["+ tiddler.fields.version;
            line = line + "|\n";
            return line;
        } 
        '
    write
        'writeLine(tiddler)'
    begin 
        '"|!Name|!Version|\n"'
>>
<<autoRefresh>>
/***
|!Filename |ExtendedBrainConfiguration.js|
|!Usage |The following code is used as configuration of ExtendedBrainPlugin, a plugin for TiddlyWikiClassic. It has to be added as tiddler named ExtendedBrainConfiguration and tagged as systemConfig. |
|!Version |0.2 |
!History
!!0.2 / 2014-04-07 / Reto Stauss
Values of extendedBrainDisplayDateWeekFormat and extendedBrainDisplayDateMonthFormat changed
!!0.1 / 2014-03-14 / Reto Stauss
Long time ago developped but now under version control
!Configuration Values
***/
// // Zeitstempel im Titel von historischen Tiddlern
//{{{
config.options.extendedBrainTitleTimestamp = "YYYY-0MM-0DD 0hh:0mm /";
//}}}
// // Format des Zeitstempels zur Erzeugung einer eindeutigen Identifkation
//{{{
config.options.extendedBrainFormatUniqueId = "YYYY0MM0DD0hh0mm0ss";
//}}}
// // First day of a week is Sunday?
//{{{
config.options.extendedBrainFirstDayOfWeekSunday = false;
//}}}
// // Format of internal dates
//{{{
config.options.extendedBrainDateFormat = "YYYY-0MM-0DD";
config.options.extendedBrainDateWeekFormat = "YYYY-KW0WW";
config.options.extendedBrainDateMonthFormat = "YYYY-0MM";
//}}}
// // Format of displayed dates
//{{{
config.options.extendedBrainDisplayDateFormat = "DDD, DD. MMM YYYY";
config.options.extendedBrainDisplayDateWeekFormat = "KW0WW YYYY";
config.options.extendedBrainDisplayDateMonthFormat = "MMM YYYY";
//}}}
// // Verschiedene Texte
//{{{
config.options.extendedBrainDateField = "Feld";
config.options.extendedBrainDateIsUndefined = "ist undefiniert";
config.options.extendedBrainDateNoTiddlerFoundUniqueId = "Kein Tiddler gefunden mit der Unique ID =";
config.options.extendedBrainDateNoTiddlerFoundTitle = "Kein Tiddler gefunden mit dem Titel =";
config.options.extendedBrainDateEmpty = "";
//}}}
// // Status
//{{{
config.options.extendedBrainStatusOpenString = "Offen";
config.options.extendedBrainStatusOpenValue = 1;
config.options.extendedBrainStatusPausedString = "Wartend";
config.options.extendedBrainStatusPausedValue = 2;
config.options.extendedBrainStatusDoneString = "Erledigt";
config.options.extendedBrainStatusDoneValue = 3;
//}}}
/***
|''Name''|ExtendedBrainPlugin|
|''Description''|<...>|
|''Icon''|<...>|
|''Author''|Reto Stauss|
|''Contributors''|<...>|
|''Version''|0.3|
|''Date''|<...>|
|''Status''|@@experimental@@|
|''Source''|<...>|
|''CodeRepository''|<...>|
|''Copyright''|<...>|
|''License''|<...>|
|''CoreVersion''|<...>|
|''Requires''|<...>|
|''Overrides''|<...>|
|''Feedback''|<...>|
|''Documentation''|<...>|
|''Keywords''|<...>|
!Description
<...>
!Notes
<...>
!History
!!V0.3 / 03-07-2013
* addOffsetToDateOfPeriodToShow was replaced by addOffsetToDate, which allows to pass the field as argument that holds the date
* New macro showDateField
!Usage of calculateTimeEffort
{{{
<<calculateTimeEffort tiddler:[TIDDLER_TITLE]>>
}}}
!!Parameters
[TIDDLER_TITLE]: title of the work tiddler
!!Example
<<showTemplate tiddler:"ExtendedBrainPlugin">>
!Usage of showTemplate
{{{
<<showTemplate template:[TEMPLATE] tiddler:[TIDDLER_TITLE]>>
}}}
!!Parameters
[TEMPLATE]: template to show, to be found in a tiddler with this name
[TIDDLER_TITLE]: title of the work tiddler
!!Example
<<showTemplate template:"WorkHeader" tiddler:"ExtendedBrainPlugin">>
!Usage of showWorkHeader
{{{
<<showWorkHeader tiddler:[TIDDLER_TITLE]>>
}}}
!!Parameters
[TIDDLER_TITLE]: title of the work tiddler
!!Example
<<showWorkHeader tiddler:"ExtendedBrainPlugin">>
!Usage of showTitleOfField
{{{
<<showTitleOfField tiddler:[TIDDLER_TITLE] fieldname:[NAME_OF_FIELD]>>
}}}
!!Parameters
[NAME_OF_FIELD]: name of the field which contains a unique id of another tiddler
[TIDDLER_TITLE]: title of the tiddler which contains the field
!!Examples
<<showTitleOfField title:"ExtendedBrainPlugin" fieldname:"ref_to_origin_of_work">>
!Usage of showDateField
{{{
<<showDateField tiddler:[TIDDLER] fieldname:[NAME_OF_FIELD] format:[DATE_FORMAT]>>
}}}
!!Parameters
[TIDDLER]: title of the tiddler which contains the field
[NAME_OF_FIELD]: name of the field which contains a unique id of another tiddler
[DATE_FORMAT]: a TiddlyWiki date format, e.g. "YYYY-0MM-0DD"
!!Examples
<<showDateField title:"ExtendedBrainPlugin" fieldname:"date">>
!Configuration Options
See [[ExtendedBrainConfiguration]].
!Unit tests
* [[Test checkUniqueId]]
* [[Test generateUniqueId]]
* [[Test addOffsetToDate]]
* [[Test getDaysOfWeek]]
* [[Test getRefToOriginOfWork]]
* [[Test getTitleOfUniqueId]]
!Revision History
!!v0.1 (2010-10-09)
* Initial Version
!To Do
* 
!Code
***/
//{{{
if(!version.extensions.ExtendedBrainPlugin) { //# ensure that the plugin is only installed once
   version.extensions.ExtendedBrainPlugin = { installed: true };
 
   if(!config.extensions) { config.extensions = {}; } //# obsolete from v2.4.2

} //# end of "install only once"

function calculateTimeEffort(uniqueId) {
   var sum = new Number(0);

   /* Calculates the hours worked for a work tiddler */
   /* Lookup: */
   /* 1. Get all tiddlers with the field 'ref_to_work' equal to the unique id of the passed tiddler */
   /* 2. Sum the field 'time_effort' of the tiddlers tagged with 'Report' */
   var tids=store.reverseLookup("ref_to_work", uniqueId, true);
   /* Loop through the tiddlers */
   for (var t=0; t<tids.length; t++) {
      if(tids[t].tags.contains("Report") && tids[t].fields.ref_to_work) {
         sum += Number(store.getValue(tids[t].title, "time_effort"));
      }
   }
   return(sum.toFixed(1));
};

config.macros.calculateRestEffort= {};

config.macros.calculateRestEffort.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
   var parameters = paramString.parseParams(null, null, true);
   var title= getParam(parameters, "tiddler");
   var estimated_effort = new Number(0);
   var rest = new Number(0);
   var sum = new Number(0);

   /* Calculates the estimated effort minus the hours worked for a work tiddler*/
   /* Lookup: */
   /* 1. Get all tiddlers with the field 'ref_to_work' equal to the unique id of the passed tiddler */
   /* 2. Sum the field 'time_effort' of the tiddlers tagged with 'Report' */
   var tids=store.reverseLookup("ref_to_work", store.getValue(title, "unique_id"),true);
   /* Loop through the tiddlers */
   for (var t=0; t<tids.length; t++) {
      if(tids[t].tags.contains("Report")) {
         sum += Number(store.getValue(tids[t].title, "time_effort"));
      }
   }
   estimated_effort = Number(store.getValue(title, "estimated_time_effort"));
   rest = estimated_effort - sum;
   wikify(rest.toFixed(1), place, null, tiddler);
};

config.macros.calculateTimeEffort= {};

config.macros.calculateTimeEffort.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
   var parameters = paramString.parseParams(null, null, true);
   var title= getParam(parameters, "tiddler");
   var sum = new Number(0);

   /* Calculates the hours worked for a work tiddler */
   /* Lookup: */
   /* 1. Get all tiddlers with the field 'ref_to_work' equal to the unique id of the passed tiddler */
   /* 2. Sum the field 'time_effort' of the tiddlers tagged with 'Report' */
   var tids=store.reverseLookup("ref_to_work", store.getValue(title, "unique_id"),true);
   /* Loop through the tiddlers */
   for (var t=0; t<tids.length; t++) {
      if(tids[t].tags.contains("Report")) {
         sum += Number(store.getValue(tids[t].title, "time_effort"));
      }
   }
   wikify(sum.toFixed(1), place, null, tiddler);
};

config.macros.showTemplate= {};

config.macros.showTemplate.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
   var parameters = paramString.parseParams(null, null, true);
   var title = getParam(parameters, "tiddler");
   var template = getParam(parameters, "template");
   var returnValue = "";
   if(!store.tiddlerExists(title)) {
         wikify(config.options.extendedBrainDateNoTiddlerFoundTitle + " " + title, place, null, tiddler);
   } else {
      returnValue = store.getTiddlerText(template);
      wikify(returnValue, place, null, tiddler);
   } 
};

config.macros.showWorkHeader= {};

config.macros.showWorkHeader.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
   var parameters = paramString.parseParams(null, null, true);
   var title = getParam(parameters, "tiddler");
   var returnValue = "";
   if(!store.tiddlerExists(title)) {
         wikify(config.options.extendedBrainDateNoTiddlerFoundTitle + " " + title, place, null, tiddler);
   } else {
      returnValue = store.getTiddlerText("WorkHeader");
      //alert(returnValue);
      wikify(returnValue, place, null, tiddler);
      //return returnValue;
   } 
};

config.macros.showTitleOfField= {};

config.macros.showTitleOfField.handler = function showTitleOfField(place, macroName, params, wikifier, paramString, tiddler) {
   var parameters = paramString.parseParams(null, null, true);
   var title = getParam(parameters, "tiddler");
   var fieldname = getParam(parameters, "fieldname");
   var returnValue = "";
   if(!store.tiddlerExists(title)) {
         wikify(config.options.extendedBrainDateNoTiddlerFoundTitle + " " + title, place);
   } else {
      if(store.getValue(title, fieldname) == undefined) {
         // Check if field is defined
         wikify(config.options.extendedBrainDateField + " {{{" + fieldname + "}}} " + config.options.extendedBrainDateIsUndefined, place, null, tiddler);
      } else {
         // Field is defined, find tiddler
         var tids=store.reverseLookup("unique_id", store.getValue(title, fieldname),true);
         for (var t=0; t<tids.length; t++) { 
            returnValue = returnValue + "[[" + tids[t].title + "]]";
         }
         if(returnValue != "") {
            // Tiddler found
            wikify(returnValue, place);
         } else {
            // No tiddler with the unique id in the passed field found
            wikify(config.options.extendedBrainDateNoTiddlerFoundUniqueId + " " + store.getValue(title, fieldname), place, null, tiddler);
         }
      }
   } 
};

config.macros.showDateField= {};

config.macros.showDateField.handler = function showDateField(place, macroName, params, wikifier, paramString, tiddler) {
   var parameters = paramString.parseParams(null, null, true);
   var title = getParam(parameters, "tiddler");
   var fieldname = getParam(parameters, "fieldname");
   var format = getParam(parameters, "format");
   var returnValue = "";
   if(!store.tiddlerExists(title)) {
         wikify(config.options.extendedBrainDateNoTiddlerFoundTitle + " " + title, place);
   } else {
      // Check if field is defined
      if(store.getValue(title, fieldname) == undefined) {
         wikify(config.options.extendedBrainDateField + " {{{" + fieldname + "}}} " + config.options.extendedBrainDateIsUndefined, place, null, tiddler);
      } else {
         // Field is defined
         returnValue = store.getValue(title, fieldname);
         if(returnValue != "") {
            // Tiddler found
            returnValue = new Date(returnValue).formatString(format);
            wikify(returnValue, place);
         } else {
            // Field is empty
            wikify(config.options.extendedBrainDateEmpty);
         }
      }
   } 
};

   function generateUniqueId(uniqueId) {
      /* Returns a unique number based on date and time */
      /* If the passed value is 0 then the function generates a new unique id */
      /* If the passed value is not 0 then the function checks if the value ist unique */
      // var uniqueId = 0;
      var notUnique= 0;
      /* Generate the unique number */
      if(uniqueId == 0) {
         uniqueId = new Date().formatString(config.options.extendedBrainFormatUniqueId);
      }
      /* check if not already in use */
      do {
         if(checkUniqueId(uniqueId)) {
            //alert(uniqueId + " is not unique");
            uniqueId = parseInt(uniqueId) + 1;
            notUnique = 1;
         } else {
            //alert(uniqueId + " is unique");
            notUnique = 0;
         }
      } while(notUnique);
      return uniqueId;
   };

function checkUniqueId(candidate) {
   /* Checks whether the passed number is unique */
   var isInUse = 0;
   var tids=store.getTiddlers("title");
   /* Loop through all tiddlers */
   for (var t=0; t<tids.length; t++) {
      /* Check whether the candidate is in use */
      if (store.getValue(tids[t].title,"unique_id") == candidate.toString()) {
         /* Uhoh, is in use */
         t = tids.length; // Leave the for loop and check again
         isInUse = 1;
      }
   }
   return isInUse;
};

function getTitleOfUniqueId(uniqueId) {
   /* Get the title of the tiddler having the passed unique id */
   var title = new String();
   var tids=store.getTiddlers("title");
   /* Loop through all tiddlers */
   for (var t=0; t<tids.length; t++) {
      /* Check whether the candidate has the passed unique id */
      if (store.getValue(tids[t].title,"unique_id") == uniqueId.toString()) {
         /* Gotcha */
         title = tids[t].title;
         t = tids.length; // Leave the for loop
      }
   }
   return title;
};

function addOffsetToDate(tiddler, field, offset) {
   /* Adds the offset to the date in the passed field of the passed tiddler */
   var valid = new Boolean(false);
   date = new Date(store.getValue(tiddler.title, field));
   if(isNaN(offset)) {
      /* Offset is not numeric */
      if(offset == "+1w") {
         /* Offset is +1 week */
         valid = true;
         date.setDate(date.getDate() + 7);
      } else if(offset == "-1w") {
         /* Offset is -1 week */
         valid = true;
         date.setDate(date.getDate() - 7);
      } else if(offset == "+1m") {
         /* Offset is +1 month */
         valid = true;
         date.setMonth(date.getMonth() + 1);
      } else if(offset == "-1m") {
         /* Offset is -1 month */
         valid = true;
         date.setMonth(date.getMonth() - 1);
      } else if(offset == "+1d") {
         /* Offset is +1 day */
         valid = true;
         date.setDate(date.getDate() + 1);
      } else if(offset == "-1d") {
         /* Offset is -1 day */
         valid = true;
         date.setDate(date.getDate() - 1);
      } else {
         /* Unknown offset */
         valid = false;
      }
   } else {
      /* Offset is numeric */
      valid = true;
      date.setDate(date.getDate() + offset);
   }
   if(valid) {
      /* If the offset was valid set the field to the new date */
      store.setValue(tiddler.title, field, new Date(date).formatString("YYYY-0MM-0DD"));
   }
};

function getDaysOfWeek(date) {
   /* Returns a list of the days of the week the passed date is part of */
         if(date == 0) {
            // use current date
            date = new Date();
         } else {
            // use passed date
         }
         var days = "(";
         var day = 1; // Day of month
         var dayOfWeek = 0;
         // Offset for first day of the week
         if(config.options.extendedBrainFirstDayOfWeekSunday) {
            // First day of week set to Sunday
            offset = 0;
            dayOfWeek = date.getDay();
         } else {
            // First day of week set to Monday
            offset = 1;
            dayOfWeek = date.getDay() - 1;
            if(dayOfWeek == -1) {
               dayOfWeek = 6;
            }
         }
         // First day of week of passed date
         //day = date.getDate() - date.getDay() + offset; // getDate => returns day of month, getDay => returns day of week, + 1 because first day of getDay is sunday
         day = date.getDate() - dayOfWeek; // getDate => returns day of month, getDay => returns day of week, + 1 because first day of getDay is sunday
         date.setDate(day);
         days = days + date.formatString(config.options.extendedBrainDateFormat);
         //Following days
         for(i=1;i<7;i++) {
            date.setDate(day+i);
            days = days + "|" + date.formatString(config.options.extendedBrainDateFormat);
         }
         days = days + ")";
         return(days);
};

function getRefToOriginOfWork(tiddler2) {
   /* Returns the unique id of the origin of work */
   /* Lookup: */
   /* 1. If the passed tiddler has a field 'ref_to_origin_of_work' and it is set => the value of the field is taken */
   /* 2. If it has no field 'ref_to_origin_of_work' that it is itself an origin of work => the value of the field 'unique_id' is taken */
   var returnValue = "";
   var refToOriginOfWork = store.getValue(tiddler2.title, "ref_to_origin_of_work");
   if( refToOriginOfWork == undefined || refToOriginOfWork == "") {
      /* The passed tiddler is the origin of work */      
      returnValue = store.getValue(tiddler2.title, "unique_id");
   } else {
      /* The passed tiddler is not itself the origin of work */
      returnValue = store.getValue(tiddler2.title, "ref_to_origin_of_work");
   }
   return returnValue;
};

//}}}