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'></span></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>
<!--}}}-->


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' 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>
<!--}}}-->
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space: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; 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;}
}
/*}}}*/
/*{{{*/
	
window.ccTiddlyVersion = '1.6';
window.workspacePermission= {};
window.url = "http://wiki.osmosoft.com/alpha";
window.workspace = "pardelib";

workspacePermission.upload = 1;workspacePermission.owner = 1;window.loggedIn = "";
workspacePermission.anonC = 0 ;
workspacePermission.anonR = 1; 
workspacePermission.anonU = 0;
workspacePermission.anonD = 0;

// hide new journal
config.macros.newJournal.handler=function(place,macroName,params,wikifier,paramString,tiddler){};
// hide new tiddler 
config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler){};

// PHP TO JAVASCRIPT VARIABLE ASSIGNMENT --- 
window.workspace_delete = "D";
window.workspace_udate = "";
window.can_create_account = "1";
window.openid_enabled = "0";

setStylesheet(store.getRecursiveTiddlerText("ccStyleSheet",10),"ccStyleSheet");

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

.input {
	display: block;
	float: left;
	margin-bottom: 4px;
	font-size:0.9em;
	width: 150px;
	margin-bottom: 4px;
	padding:4px;
}

.inputError {
	display: block;
	float: left;
}
.submit {
	padding-left:122px;
	align:right;
}

.label {
	text-align: right;
	display: block;
	float: left;
}
.checkContainer {
	text-align: right;
	display: block;
	float: left;
}

.inlineError{
	color:red;
}


.inlineOk{
	color:green;
}

.checkLabel {
	text-align:left;
	display: block;
	float:left;
}
br {
	clear: left;
}

.checkContainer {
	padding-right: 2px;
	width: 120px;
	margin-bottom:5px;
}

.label {
	padding-top:2px;
	padding-right: 5px;
	width: 190px;
	margin-bottom: 10px;
}

/*BELOW THIS POINT WILLBE SPLIT OFF INTO A THEME*/
/*

.input {
	border:solid 1px #B3B3B3; 
}
.checkTitle {
	font-size:0.9em;
	font-weight:bold;
}

.inlineOk{
	padding-left:10px;
	padding-top:8px;
	font-size:0.9em;
}

.inlineError{
	padding-left:10px;
	padding-top:8px;
	font-size:0.9em;
}

.checkInput{
	border:solid 1px #B3B3B3;
}
.wizardStep{
	border:solid 1px #9399AB;
}

.backButton{
	background-color:green;
}

.wizard{
	border:solid 1px #9399AB;
	margin:10px;
	padding:10px;
}

.wizard .button {
	padding : 4px 14px 4px 14px;
	font-weight:bold;
	color:#292929;
	border:solid 1px #292929; 
	font-size:0.9em;
	margin-top:1px;
}

.inputError {
	font-size:0.9em;
	width: 150px;
	margin-bottom: 4px;
	border:solid 1px #B3B3B3; 
	padding:4px;
}


label{
	font-size:0.9em;
	font-face:arial;
	color:#292929;
}

.wizard{
	background-color:#E1E7F8;
	border:solid 1px #9399AB;
}

.checkInput{
	border:solid 1px #B3B3B3;
	color: #5B5C56;
	background-color: #FFFFFF;
	border:none;
}

.wizardStep{
	border:solid 1px #9399AB;
}

.wizardFooter{
	background-color:#E1E7F8;
}
*/

/*}}}*/
/***
|''Name''|ccWorkspace|
|''Description''|Allows users to create Workspaces|
|''Author''|[[Simon McManus | http://simonmcmanus.com]]
|''Version''|1.0.1|
|''Date''|12/05/08|
|''Status''|@@alpha@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccWorkspace.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccWorkspace.js|
|''License''|BSD|
|''Feedback''|http://groups.google.com/group/ccTiddly|
|''Keywords''|ccTiddly, ccWorkspace|

!Description

Allows users to create their own workspace. 

!Usage
{{{
<>
}}}

!Code
***/
//{{{

config.backstageTasks.push('create');
merge(config.tasks,{create: {text: 'create', tooltip: 'Create new workspace', content:'<<ccCreateWorkspace>>'}});

config.macros.ccCreateWorkspace = {}
config.macros.ccCreateWorkspace.handler =  function(place,macroName,params,wikifier,paramString,tiddler, errorMsg){
	// When we server this tiddler it need to know the URL of the server to post back to
	//this value is currently set in index.php, should be index.php?action=createWorkspace to prepare for modulation
	//form heading
	if (workspacePermission.create!=1)
	{
		createTiddlyElement(place,'div', null, "annotation",  'You do not have permissions to create a workspace.  You may need to log in.');
		return null;
	}
	var frm = createTiddlyElement(place,'form',null,"wizard");
	frm.onsubmit = this.createWorkspaceOnSubmit;

	createTiddlyElement(frm,'h1', null, null,  'Create Workspace ');
	createTiddlyElement(frm, 'h2', null, null,  "Get your own TiddlyWiki workspace below");
	createTiddlyElement(frm,'br');

	var body = createTiddlyElement(frm,'div',null, "wizardBody");

	//form content
	var step = createTiddlyElement(body,'div',null, "wizardStep");
	//createTiddlyElement(step, "br");
	//form workspace name/url
	var url_label = createTiddlyElement(step, "label", null, "label", url);
	url_label.setAttribute("for","ccWorkspaceName");
	var workspaceName = createTiddlyElement(step,'input','ccWorkspaceName', 'input')				
	workspaceName.value = workspace;
	workspaceName.size = 15;
	workspaceName.name = 'ccWorkspaceName';
	workspaceName.onkeyup=function() {
		config.macros.ccRegister.workspaceNameKeyPress(this.value);
	};
	step.appendChild(workspaceName);
	createTiddlyElement(step,"span",'workspaceName_error','inlineError',null);

	createTiddlyElement(step,'br');

	//privilege form
	anonTitle = createTiddlyElement(step,'div', null, "checkTitle",  'Anonymous Users Can');
	//var anC = createTiddlyCheckbox(null, 'Create Tiddlers', 0);
	var span = createTiddlyElement(step, 'span', null, "checkContainer")
	var anC = createTiddlyElement(null,'input', 'anC','checkInput');
	anC.setAttribute('type','checkbox');
	if (workspacePermission.anonC==1)
	anC.setAttribute('checked','checked');    
	span.appendChild(anC);
	var anC_label = createTiddlyElement(step, "label", null, "checkLabel", "Create Tiddlers");
	anC_label.setAttribute("for","anC");
	createTiddlyElement(step,'br');

	var span = createTiddlyElement(step, 'span', null, "checkContainer")
	var anR = createTiddlyElement(null,'input', 'anR','checkInput');
	anR.setAttribute('type','checkbox');
	if (workspacePermission.anonR  == 1)
	anR.setAttribute('checked','checked');
	span.appendChild(anR);
	var anR_label = createTiddlyElement(step, "label", null, "checkLabel", "Read Tiddlers");
	anR_label.setAttribute("for","anR");
	createTiddlyElement(step,'br');

	var span = createTiddlyElement(step, 'span', null, "checkContainer")
	var anU = createTiddlyElement(null,'input', 'anU','checkInput');
	anU.setAttribute('type','checkbox');
	if (workspacePermission.anonU  == 1)
	anU.setAttribute('checked','checked');
	span.appendChild(anU);
	var anU_label = createTiddlyElement(step, "label", null, "checkLabel", "Update Tiddlers");
	anU_label.setAttribute("for","anU");
	createTiddlyElement(step,'br');

	var span = createTiddlyElement(step, 'span', null, "checkContainer")
	var anD = createTiddlyElement(null,'input', 'anD','checkInput');
	anD.setAttribute('type','checkbox');
	if (workspacePermission.anonD  == 1)
	anD.setAttribute('checked','checked');
	span.appendChild(anD);
	var anD_label = createTiddlyElement(step, "label", null, "checkLabel", "Delete Tiddlers");
	anD_label.setAttribute("for","anD");
	createTiddlyElement(step,'br');

	var a=createTiddlyElement(step, "div", "createWorkspaceButton", "submit")
	var btn=createTiddlyElement(null,'input',this.prompt,'button');
	btn.setAttribute('type','submit');
	btn.value="Create Workspace";
	a.appendChild(btn);
	createTiddlyElement(a,"span",'workspaceStatus','',null);
	
};
config.macros.ccCreateWorkspace.createWorkspaceOnSubmit = function() {
	var trueStr = "A";
	var falseStr = "D";
	// build up string with permissions values
	var anon=(this.anR.checked?trueStr:falseStr);
	anon+=(this.anC.checked?trueStr:falseStr);
	anon+=(this.anU.checked?trueStr:falseStr);
	anon+=(this.anD.checked?trueStr:falseStr);
	var params = {}; 
	params.url = url+'/'+this.ccWorkspaceName.value;
	
	// disable create workspace button 
	var submit=document.getElementById('createWorkspaceButton');
	submit.disabled=true;
	submit.setAttribute("class","buttonDisabled");
	document.getElementById('workspaceStatus').innerHTML='Please wait, your workspace is being created.';
	
	
	

	var loginResp = doHttp('POST',url+'/'+this.ccWorkspaceName.value,'ccCreateWorkspace=' + encodeURIComponent(this.ccWorkspaceName.value)+'&ccAnonPerm='+encodeURIComponent(anon),null,null,null,config.macros.ccCreateWorkspace.createWorkspaceCallback,params);
	return false; 
};
config.macros.ccCreateWorkspace.createWorkspaceCallback = function(status,params,responseText,uri,xhr) {
	//displayMessage(xhr.status);
	if(xhr.status==201) {
		window.location = params.url;
		//displayMessage('workspace crated');				
	} else if (xhr.status == 200) {
		displayMessage(responseText+"Workspace name is already in use.");
	} else if (xhr.status == 403) {
		displayMessage("Permission denied,the ability to create new workspaces may have been disabled by you systems administrator.");	
	} else {
		displayMessage(responseText);	
	}
};

config.macros.ccRegister.workspaceNameKeyPress=function(str){

	doHttp('POST',url+'/handle/lookupWorkspaceName.php',"ccWorkspaceLookup="+str+"&free=1",null,null,null,config.macros.ccRegister.workspaceNameCallback,null);
	return false;
};

config.macros.ccRegister.workspaceNameCallback=function(status,params,responseText,uri,xhr){
	var field = "";
	if(responseText>0){{
		workspaceName_space=document.getElementById('workspaceName_error');
		workspaceName_space.innerHTML='Workspace name has already been taken';
		workspaceName_space.setAttribute("class","inlineError");
	}
	}else{
		workspaceName_space=document.getElementById('workspaceName_error');
		workspaceName_space.innerHTML="Workspace name is available";
		workspaceName_space.setAttribute("class","inlineOk");
	}
};



config.macros.ccEditWorkspace = {};
config.macros.ccEditWorkspace.handler = function(place,macroName,params,wikifier,paramString,tiddler,errorMsg) {
		
	if (workspacePermission.owner != 1)
	{
		createTiddlyElement(place,'div',null,"annotation", 'You do not have permissions to edit this workspaces permission. ');
		return null;
	}
	// When we server this tiddler it need to know the URL of the server to post back to, this value is currently set in index.php
	var frm = createTiddlyElement(place,'form',null,"wizard");
	frm.onsubmit = this.editWorkspaceOnSubmit;
	createTiddlyElement(frm,"br");
	createTiddlyElement(frm,'h1',null,null,'Edit Workspace Permissions');
	createTiddlyElement(frm,"br");
	var body = createTiddlyElement(frm,'div',null,"wizardBody");
	var step = createTiddlyElement(body,'div',null,"wizardStep");
	createTiddlyElement(step,'h5	',null,null,'Anonymous Users Can :  ');
	
	var span = createTiddlyElement(step,'span',null,"checkContainer")
	var anC = createTiddlyCheckbox(span,null,workspacePermission.anonC);
	anC.id='anC';
	anC.setAttribute("class","checkInput");
	var anC_label = createTiddlyElement(step,"label",null,"checkLabel","Create Tiddlers");
 	anC_label.setAttribute("for","anC");
	createTiddlyElement(step,'br');
	
	
	var span = createTiddlyElement(step,'span',null,"checkContainer")
	var  anR = createTiddlyCheckbox(span,null ,workspacePermission.anonR);
	anR.id = 'anR';
	anR.setAttribute("class","checkInput");
	var anR_label = createTiddlyElement(step,"label",null,"checkLabel","Read Tiddlers");
 	anR_label.setAttribute("for","anR");

	createTiddlyElement(step,'br');
			var span = createTiddlyElement(step,'span',null,"checkContainer")
	var anU = createTiddlyCheckbox(span,null,workspacePermission.anonU);
	anU.id = 'anU';
	anU.setAttribute("class","checkInput");
	var anU_label = createTiddlyElement(step,"label",null,"checkLabel","Update Tiddlers");
 	anU_label.setAttribute("for","anU");

	createTiddlyElement(step,'br');
	
				var span = createTiddlyElement(step,'span',null,"checkContainer")
	var anD = createTiddlyCheckbox(span,null,workspacePermission.anonD);
	anD.id = 'anD';
	anD.setAttribute("class","checkInput");
	var anD_label = createTiddlyElement(step,"label",null,"checkLabel","Delete Tiddlers");
 	anD_label.setAttribute("for","anD");

	createTiddlyElement(step,'br');
	createTiddlyElement(frm,'br');
	var btn = createTiddlyElement(frm,'input',this.prompt,"button","button");
	 btn.setAttribute('type','submit');
	 btn.value = 'Edit Workspace Permissions'
	createTiddlyElement(frm,'br');
	createTiddlyElement(frm,'br');
};
	
config.macros.ccEditWorkspace.editWorkspaceOnSubmit = function() {
	var trueStr = "A";
	var falseStr = "D";
	// build up string with permissions values
	var anon=(this.anR.checked?trueStr:falseStr);
	anon+=(this.anC.checked?trueStr:falseStr);
	anon+=(this.anU.checked?trueStr:falseStr);
	anon+=(this.anD.checked?trueStr:falseStr);
	doHttp('POST',url+'handle/updateWorkspace.php','ccCreateWorkspace=' + encodeURIComponent(workspace)+'&ccAnonPerm='+encodeURIComponent(anon),null,null,null,config.macros.ccEditWorkspace.editWorkspaceCallback,params);
	return false;
};

config.macros.ccEditWorkspace.editWorkspaceCallback = function(status,params,responseText,uri,xhr) {
	if (xhr.status == 200) {
		displayMessage(responseText);	
	}
	return false;
};

//}}}
/***
|''Name''|ccSave|
|''Description''|Currently only being used to stop the upgrade option |
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|1.0.1|
|''Date''|12/05/2008|

!Code

***/
//{{{

// GENERAL ccTiddly Bits 

config.backstageTasks.remove("upgrade");
config.backstageTasks.remove("save");

//}}}
/***
|''Name''|ccLoginStatus|
|''Description''|Allows users to see their login status and displays the options to login or logout. This Macro will later be added to ccLogin|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|1.0.1|
|''Date''|12/05/2008|
|''Status''|@@alpha@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccLoginStatus.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccLoginStatus.js|
|''License''|BSD|
|''Requires''|ccRegister, ccLogin|
|''Feedback''|http://groups.google.com/group/ccTiddly|
|''Keywords''|ccTiddly ccLoginStatus|

!Description

Show the current user their login status. 

!Usage
{{{
<>
}}}

!Code

***/
//{{{
	
config.macros.ccLoginStatus={};
config.macros.ccLoginStatus.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	var loginDiv=createTiddlyElement(place,"div",null,"loginDiv",null);
	this.refresh(loginDiv);
};
	
config.macros.ccLoginStatus.refresh=function(place,errorMsg){
	var loginDivRef=document.getElementById ("LoginDiv");
	removeChildren(loginDivRef);
	var wrapper=createTiddlyElement(place,"div");
	if (isLoggedIn()){
		createTiddlyElement(wrapper,"br");
		name = cookieString(document.cookie).txtUserName;
		var str=wikify("You are viewing the workspace "+workspace +" and  are logged in as: "+decodeURIComponent(name),wrapper);
		var btn=createTiddlyElement(null,"input",null,"button");
		btn.setAttribute("type", "button");
		btn.onclick=function() {
		window.location = window.location+"?&logout=1"
		};
		
	//	btn.setAttribute("type","submit");d
		btn.value="Logout";   
		wrapper.appendChild(btn);	
	}else{
		wikify("[[Login]]",wrapper);
	}
};

//}}}
/***
|''Name''|ccLogin|
|''Description''|Allows users to login to ccTiddly, In future, this will include the ccRegister and  ccLoginStatus Status Macro|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|1.0.1|
|''Date''|12/05/2008|
|''Status''|@@alpha@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccLogin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccLogin.js|
|''License''|BSD|
|''Requires''|ccRegister, ccLogin|
|''Overrides''|restart|
|''Feedback''|http://groups.google.com/group/ccTiddly|
|''Keywords''|ccTiddly ccLogin|

!Description

To display a login prompt for your user simple type the following text into a tiddler function tiddler :

!Usage
{{{
<>
}}}

!Code

***/
//{{{
	
	
config.backstageTasks.push("login");
merge(config.tasks,{login:{text: "login",tooltip: "Login to your TiddlyWiki",content: '<<ccLogin>>'}});

config.macros.saveChanges.handler=function(place,macroName,params,wikifier,paramString,tiddler){};
var loginState=null;
var registerState=null;

config.macros.toolbar.isCommandEnabled=function(command,tiddler){	
	var title=tiddler.title;
	if (workspace_delete=="D"){
		// REMOVE OPTION TO DELETE TIDDLERS 
		if (command.text=='delete'){
			return false;
		}
	}
	if (workspace_udate=="D"){
		// REMOVE EDIT LINK FROM TIDDLERS 
		if (command.text=='edit'){
			return false;
		}
	}
	var ro=tiddler.isReadOnly();
	var shadow=store.isShadowTiddler(title) && !store.tiddlerExists(title);
	return (!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow);
};

// Returns output var with output.txtUsername and output.sessionToken
function findToken(cookieStash){
	var output={};
	if (!cookieStash){
		return false;
	}	
	//  THIS IS VERY HACKY AND SHOULD BE REFACTORED WHEN TESTS ARE IN PLACE
	var cookies=cookieStash.split('path=/');
	for(var c=0; c < cookies.length ; c++){
		var cl =cookies[c].split(";");
		for(var e=0; e < cl.length; e++){ 
			var p=cl[e].indexOf("=");
			if(p!=-1){
				var name=cl[e].substr(0,p).trim();
				var value=cl[e].substr(p+1).trim();       
				if (name=='txtUserName'){
					output.txtUserName=value;
				}
				if (name=='sessionToken'){
					output.sessionToken=value;
				}
			}
		}
	}	
	return output;
}

function cookieString(str){
	var cookies = str.split(";");
	var output = {};
	for(var c=0; c < cookies.length; c++){
		var p = cookies[c].indexOf("=");
		if(p != -1) {
			var name = cookies[c].substr(0,p).trim();
			var value = cookies[c].substr(p+1).trim();
			if (name=='txtUserName'){
				output.txtUserName=value;
			}
			if (name=='sessionToken'){
				output.sessionToken=value;
			}
		}
	}
	return output;
}

function isLoggedIn(){
	if(window.loggedIn == '1'){
		return true;
	}else{
		return false;
	}
}

config.macros.ccLogin={};
config.macros.ccLogin.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	var loginDiv=createTiddlyElement(place,"div",null,"loginDiv",null);
	this.refresh(loginDiv);
};

config.macros.ccLogin.refresh=function(place,errorMsg){
	var loginDivRef=document.getElementById("LoginDiv");
	removeChildren(loginDivRef);
	var wrapper=createTiddlyElement(place,"div");
	var cookieValues=findToken(document.cookie);
	var frm="";
	if (isLoggedIn()){
		// user is logged in
		var msg=createTiddlyElement(wrapper,"div");
		// display the logout button
		config.macros.ccLoginStatus.handler(msg);		
	}else{
		//user not logged in.	
		frm=createTiddlyElement(wrapper,"form",null,"wizard");
		frm.onsubmit=this.loginOnSubmit;
		createTiddlyElement(frm,"h1",null,null,"Login");
		createTiddlyElement(frm,"h2",null,null,"Login to ccTiddly");	
		createTiddlyElement(frm,"br");
		var body=createTiddlyElement(frm,"div",null,"wizardBody");
		var step=createTiddlyElement(body,"div",null,"wizardStep");

		if(errorMsg!==null){  
			createTiddlyElement(step,"span",null,null,errorMsg);
			createTiddlyElement(step,"br");
		}
		createTiddlyElement(step,"br");
		var oidfrm=createTiddlyElement(step,"form",null,null);
		oidfrm.method='get';
		oidfrm.action='includes/openid/try_auth.php';

		if (openid_enabled==1){
			createTiddlyElement(oidfrm,"br");
			createTiddlyText(oidfrm,"You can get an openID from ");
			var link=createExternalLink(oidfrm,'http://myopenid.com');
			link.textContent='http://myopenid.com';
			createTiddlyElement(oidfrm,"br");
			createTiddlyElement(oidfrm,"br");
			createTiddlyText(oidfrm,'OpenID:');
	
			var oidaction=createTiddlyElement(null,"input",null);
			oidaction.setAttribute("type","hidden");
			oidaction.setAttribute("value","verify");
			oidfrm.appendChild(oidaction);
	
			var oidid=createTiddlyElement(null,"input",null);
			oidid.setAttribute("type","text");
			oidid.setAttribute("name","openid_identifier");
			oidfrm.appendChild(oidid);
	
			var oidsub=createTiddlyElement(null,"input",null);
			oidsub.setAttribute("type","submit");
			oidsub.setAttribute("value","Verify");
			oidfrm.appendChild(oidsub);
		}else{ 
			var user_label=createTiddlyElement(step,"label",null,"label","Username");
			user_label.setAttribute("for","cctuser");
			var txtuser=createTiddlyElement(step,"input","cctuser","input");
			if (cookieValues.txtUserName!==undefined){
				txtuser.value=cookieValues.txtUserName ;
			}
			createTiddlyElement(step,"br");
			var pass_label=createTiddlyElement(step,"label",null,"label","Password");
			pass_label.setAttribute("for","cctpass");

			var txtpass=createTiddlyElement(null,"input","cctpass","input",null,{"type":"password"});
			//  var txtpass=createTiddlyElement(step,"input","cctpass","cctpass");
			txtpass.setAttribute("type","password");
			step.appendChild(txtpass);
			createTiddlyElement(step,"br");

			var submitSpan=createTiddlyElement(step,"div");
			submitSpan.setAttribute("class","submit");

			var btn1=createTiddlyElement(null,"input",this.prompt,"button");
			btn1.setAttribute("type","submit");
			btn1.setAttribute("id","loginButton");
			btn1.value="Login";
			submitSpan.appendChild(btn1);

			createTiddlyElement(submitSpan,'p');	
			var li=createTiddlyElement(submitSpan,'li');
			createTiddlyLink(li,'Register','Register');
			var li1=createTiddlyElement(submitSpan,'li');
			createTiddlyLink(li1,'Forgotten Details','Forgotten Details');
		}
	}
};

config.macros.killLoginCookie=function(){
	var c='sessionToken=invalid';
	c+="; expires=Fri, 1 Jan 1811 12:00:00 UTC; path=/";
	document.cookie=c;
};

config.macros.ccLogin.logoutOnSubmit=function(){

	var loginDivRef=findRelated(this,"loginDiv","className","parentNode");
	removeChildren(loginDivRef);

	document.cookie="sessionToken=invalid;   expires=15/02/2009 00:00:00";
	document.cookie = '';
	config.macros.killLoginCookie();
	//config.macros.ccLogin.refresh(loginDivRef);
	doHttp('POST',url+'msghandle.php',"logout=1");
	window.location=window.location;      
	return false;
};

config.macros.ccLogin.logoutCallback=function(status,params,responseText,uri,xhr){
//	displayMessage(status);
	//return true;
};
	
config.macros.ccLogin.loginCheckResp=function(){
		alert("Your Login has timed out. ");
		var but1=document.getElementById('loginButton');
		but1.disabled=false;
		but1.setAttribute("class","button");		
};

config.macros.ccLogin.loginOnSubmit=function(){
	var user1=document.getElementById('cctuser').value;
	var pass=document.getElementById('cctpass').value;
	var but1=document.getElementById('loginButton');
	but1.disabled=true;
	but1.setAttribute("class","buttonDisabled");
	var params={}; 
	loginState ='';
	params.origin=this; 
	//setTimeout(config.macros.ccLogin.loginCheckResp,3000);

	var loginResp=doHttp('POST',url+'/handle/login.php',"cctuser=" + encodeURIComponent(user1)+"&cctpass="+Crypto.hexSha1Str(pass).toLowerCase(),null,null,null,config.macros.ccLogin.loginCallback,params);
	return false;
};


config.macros.ccLogin.loginCallback=function(status,params,responseText,uri,xhr){
//	var cookie;
	var cookieValues=findToken(document.cookie);
	config.macros.ccLogin.saveCookie(cookieValues);
	if(xhr.status!==401){
		window.location.reload();
	} else{
		if (xhr.responseText!==""){
			displayMessage(xhr.responseText);
		}
		var loginDivRef=findRelated(params.origin,"loginDiv","className","parentNode");
		removeChildren(loginDivRef);
		config.macros.ccLogin.refresh(loginDivRef,'Login Failed ');
		loginState='fail';
	}
	return true;
};

config.macros.ccLogin.saveCookie=function(cookieValues){
	// Save the session token in cookie.
	var c='sessionToken'+"="+cookieValues.sessionToken;

	c+="; expires=Fri, 1 Jan 2811 12:00:00 UTC; path=";
	document.cookie=c;
	// Save the txtUserName in the normal tiddlywiki format
   if (cookieValues.txtUserName!==null){
		 config.options.txtUserName=cookieValues.txtUserName;
		saveOptionCookie("txtUserName");
	}
};


window.restart = function (){
	var tiddlers="";
 	tiddlers=store.filterTiddlers(store.getTiddlerText("AnonDefaultTiddlers"));
	if (isLoggedIn()){
		tiddlers=store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"));
	}
	story.displayTiddlers(null,tiddlers);	
	invokeParamifier(params,"onstart");
	window.scrollTo(0,0);
}
//}}}
/***
|''Name:''|ccLoadRemoteFileThroughProxy (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){
	var urlStart = window.url;
	if((document.location.toString().substr(0,4)=="http")&&(url.substr(0,4)=="http")){ 
		url=urlStart+"/"+store.getTiddlerText("SiteProxy","/proxy")+url;
	}
	var a = bidix.core.loadRemoteFile(url,callback,params);
	return a;
}
//}}}
If you've forgotten your username and / or password, please contact the administrator:

simon@osmosoft.com
[[Login]] [[GettingStarted]]
/***
|''Name''|ccAbout|
|''Description''|The ccAbout macro lets you find the current version number in ccTiddly|
|''Author''|Simon McManus|
|''Contributors''|Simon McManus|
|''Version''|2.3|
|''Date''|12/05/08|
|''Status''|@@alpha@@;|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccAbout.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccAbout.js|
|''License''|BSD|
|''Feedback''|http://groups.google.com/group/ccTiddly|
|''Keywords''|ccTiddly ccAbout|


!Usage
{{{
<>
}}}

***/
//{{{
config.backstageTasks.push("about");

		
merge(config.tasks,{about:{text: "about",tooltip: "Find out more about ccTiddly ",content: '<<ccAbout>>'}});

config.macros.ccAbout={};
config.macros.ccAbout.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
	createTiddlyElement(place,"h1","","","About ccTiddly");
	createTiddlyElement(place,"br");
	var str="You are running ccTiddly " + window.ccTiddlyVersion;
	createTiddlyText(place,str);
	createTiddlyElement(place,"br");
	createTiddlyElement(place,"br");
	var str="more info about ccTiddly can be found  at " ;
	createTiddlyText(place,str);
	var link=createExternalLink(place,'http://tiddlywiki.org/wiki/CcTiddly');
	link.textContent='http://tiddlywiki.org/wiki/CcTiddly';
};
//}}}
<<ccCreateWorkspace>>
handle/proxy.php?feed=
<<ccLogin>>
<<ccLoginStatus>>
/***
|''Name:''|simpleTheme|

|''~StyleSheet:''|##StyleSheet|

***/

!StyleSheet

#mainMenu {display:none}
#sidebarOptions{display:none}
#sidebarTabs {display:none}

/*}}}*/

/***
|''Name''|ccUpload|
|''Description''|Allows users to upload files onto a ccTiddly server|
|''Author''|[[Simon McManus | http://simonmcmanus.com]]|
|''Version''|1.0.1|
|''Date''|12/05/2008|
|''Status''|@@alpha@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccUpload.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccUpload.js|
|''License''|BSD|
|''Feedback''|http://groups.google.com/group/ccTiddly|
|''Documentation''|<...>|
|''Keywords''|ccTiddly, ccUpload|

!Description

Allows users to upload files to a ccTiddly serevr. 

!Usage
{{{
<>
}}}

!Code
***/
//{{{

var iFrameLoad=function(){
	var uploadIframe= document.getElementById('uploadIframe');
	var statusArea=document.getElementById("uploadStatus");
	document.getElementById("ccfile").value=""; 
	statusArea.innerHTML=uploadIframe.contentDocument.body.innerHTML;
};

config.macros.ccUpload={};
config.macros.ccUpload.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
	if (workspacePermission.upload!=1){
		createTiddlyElement(place,'div',null,"annotation",'You do not have permissions to create a file on this server. ');
		return null;
	}

	// When we server this tiddler it need to know the URL of the server to post back to,this value is currently set in index.php
	var frm=createTiddlyElement(place,'form',null,"wizard");
	frm.action=window.url+"/handle/upload.php"; ; 
	frm.id="ccUpload";
	frm.enctype="multipart/form-data";
	frm.method="POST";	
	frm.target="uploadIframe";

	var body=createTiddlyElement(frm,'div',null,"wizardBody");
	createTiddlyElement(body,"h1",null,null,"Upload File");
	createTiddlyElement(body,"h2",null,null,"Upload Files to your workspace");
	createTiddlyElement(body,"br");
	//form content
	var step=createTiddlyElement(body,'div',null,"wizardStep");
	
	var username=createTiddlyElement(step,'input','username','username');				
	username.name='username';
	username.type="HIDDEN";
	username.value=config.options.txtUserName;		
	
	var label=createTiddlyElement(step,"label",null,"label","Upload your file ");
	label.setAttribute("for","ccfile");
	
	var file=createTiddlyElement(step,'input','ccfile','input');				
	file.type="file";
	file.name="userFile";
	var workspaceName=createTiddlyElement(step,'input','workspaceName','workspaceName');				
	workspaceName.name='workspaceName';
	workspaceName.type="HIDDEN";
	workspaceName.value=workspace;
	createTiddlyElement(step,'br');

	var saveTo=createTiddlyElement(step,'input','saveTo','saveTo',"workspace");				
	saveTo.type="HIDDEN";
	saveTo.name='saveTo';
	saveTo.value='workspace';
	
	var submitDiv=createTiddlyElement(step,"div",null,'submit');
	var btn=createTiddlyElement(frm,"input",null,'button');
	btn.setAttribute("type","submit");
	btn.setAttribute("onClick","config.macros.ccUpload.submitiframe()");
	btn.value='Upload File';
	submitDiv.appendChild(btn);	

	// Create the iframe
	var iframe=document.createElement("iframe");
	iframe.style.display="none";
	iframe.id='uploadIframe';
	iframe.name='uploadIframe';
	frm.appendChild(iframe);
	createTiddlyElement(step,"div",'uploadStatus');

	iframe.onload=iFrameLoad;
};

config.macros.ccUpload.submitiframe=function(){

	var statusArea=document.getElementById("uploadStatus");
	statusArea.innerHTML="uploading...  <img src=loading.gif /> ";	
	return true;
};
 
config.macros.ccCreate={};

config.macros.ccCreate.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
	if (workspacePermission.upload !=1){
		createTiddlyElement(place,'div',null,"annotation",'You do not have permissions to create a new file on this server. ');
return null;
	}
	// When we server this tiddler it need to know the URL of the server to post back to,this value is currently set in index.php
	var frm=createTiddlyElement(place,'form',null,"wizard");

displayMessage(url);
	frm.action="hdfdandle/upload.php";
	frm.method="POST";
	createTiddlyElement(frm,"br");
	var body=createTiddlyElement(frm,'div',null,"wizardBody");
	createTiddlyElement(frm,"br");
	createTiddlyElement(body,"h1",null,null,"Create HTML file ");
	createTiddlyElement(body,"br");
	//form content
	var step=createTiddlyElement(body,'div',null,"wizardStep");

	createTiddlyText(step,'Filename : ');
	var htmlfile=createTiddlyElement(step,'input','ccHTMLName','ccHMLname');				
	htmlfile.name='ccHTMLName';
	createTiddlyElement(step,'br');
	createTiddlyElement(step,'br');

	createTiddlyText(step,"add your HTML code to the textbox below :");
	createTiddlyElement(step,'br');
	var htmlbox=createTiddlyElement(step,'textarea','ccHTML','ccHML');				
	htmlbox.name='ccHTML';
	htmlbox.rows='20';
	htmlbox.cols='100';

	createTiddlyElement(step,'br');
	var username=createTiddlyElement(step,'input','username','username');				
	username.name='username';
	username.type="HIDDEN";
	username.value=config.options.txtUserName;		
	createTiddlyElement(step,'br');

	var workspaceName=createTiddlyElement(step,'input','workspaceName','workspaceName');				
	workspaceName.name='workspaceName';
	workspaceName.type="HIDDEN";
	workspaceName.value=workspace;
	
	createTiddlyText(step,"Create the file in :");
	createTiddlyElement(step,'br');
	var RDuser=createTiddlyElement(step,'input','user','user');
	RDuser.type="radio";
	RDuser.name="saveTo";

	RDuser.value="user";
	createTiddlyText(step,"My User Area");

	createTiddlyElement(step,'br');
	var RDworkspace=createTiddlyElement(step,'input','workspace','workspace');		
	RDworkspace.type="radio";
	RDworkspace.name="saveTo";
	RDworkspace.value="workspace";
	RDworkspace.checked="1";

	createTiddlyText(step,"Workspace Area ");
	createTiddlyElement(step,'br');

	createTiddlyElement(frm,'br');
	var btn=createTiddlyElement(frm,'input',this.prompt,'button');
	btn.setAttribute('type','submit');
	btn.value='Create File ';
	createTiddlyElement(frm,'br');
	createTiddlyElement(frm,'br');
};
//}}}
/***
|''Name''|ccRegister|
|''Description''|Allows users to Register for a user account. If the user is logged in there are informed of their username This Macro will later be added to ccLogin Status|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|1.0.1|
|''Date''|12/05/2008|
|''Status''|@@alpha@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccRegister.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/ccPlugins/ccRegister.js|
|''License''|BSD|
|''Requires''|ccLogin, ccLoginStatus|
|''Feedback''|http://groups.google.com/group/ccTiddly|
|''Keywords''|ccTiddly ccRegister|

!Description

Show the current user their login status. 

!Usage
{{{
<>
}}}

!Code

***/
//{{{
	
config.macros.ccRegister ={};
config.macros.ccRegister.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	var registerDiv = createTiddlyElement(place,"div",null,"loginDiv",null);
	this.refresh(registerDiv);
};

config.macros.ccRegister.refresh=function(place,errorMsg){
	var loginDivRef = document.getElementById("LoginDiv");
	removeChildren(loginDivRef);
	var wrapper = createTiddlyElement(place,"div");
	if (can_create_account != 1){
		createTiddlyElement(place,'div',null,"annotation",'You do not have permissions to register for an account ');
		return null;
	}
	if (errorMsg=='201'){
		return false;
	}
	var frm=createTiddlyElement(place,"form",null,"wizard");
	frm.onsubmit= config.macros.ccRegister.registerOnSubmit;
	createTiddlyElement(frm,"h1",null,null,"Register");
	createTiddlyElement(frm,"h2",null,null,"Sign up for an account");
	createTiddlyElement(frm,"br");
	var body=createTiddlyElement(frm,"div",null,"wizardBody");
	var step=createTiddlyElement(body,"div",null,"wizardStep");

	var user_label = createTiddlyElement(step,"label",null,"label","Username");
	user_label.setAttribute("for","username");
	
	
	var username=createTiddlyElement(null,"input","username" ,"input");		
	username.onkeyup=function() {
		config.macros.ccRegister.usernameKeyPress(this.value);
	};
	step.appendChild(username);
	username.setAttribute("tabindex","1");
	createTiddlyElement(step,"span",'username_error','inlineError',null);
	createTiddlyElement(step,"br");	
	var mail_label = createTiddlyElement(step,"label",null,"label","E-Mail Address");
	mail_label.setAttribute("for","username");	
	var mail=createTiddlyElement(null,"input","mail" ,"input");		
	mail.onkeyup=function() {
		config.macros.ccRegister.mailKeyUp(this.value);
	};
	step.appendChild(mail);

	mail.setAttribute("tabindex","2");
	createTiddlyElement(step,"span",'mail_error','inlineError','');
	createTiddlyElement(step,"br");
	
	var pw1_label = createTiddlyElement(step,"label",null,"label","Password");
	pw1_label.setAttribute("for","password1");
	var password1 = createTiddlyElement(null,"input","password1","input");
	password1.setAttribute("type","password");
	password1.setAttribute("tabindex","3");
	step.appendChild(password1);
	
	createTiddlyElement(step,"span",'mail_error','inlineError','');
	
	createTiddlyElement(step,"span",'pass1_error','inlineError');
	createTiddlyElement(step,"br");
	
	var pw2_label = createTiddlyElement(step,"label",null,"label","Password Confirmation");
	pw2_label.setAttribute("for","password2");
	var password2 = createTiddlyElement(null,"input","password2","input");
	password2.setAttribute("type","password");
	password2.setAttribute("tabindex","4");
	step.appendChild(password2);
	
	createTiddlyElement(step,"span",'pass2_error','inlineError');
	createTiddlyElement(step,"br");

	var a = createTiddlyElement(step,"div",null,"submit");
	var btn = createTiddlyElement(null,"input",this.prompt,"button");
	btn.setAttribute("type","submit");
	btn.setAttribute("value","Register Account");	 
	btn.setAttribute("tabindex","5");
	
	btn.setAttribute("id","registerAccountSubmit");
	a.appendChild(btn);
	createTiddlyElement(a,"span","submitStatus",null,"");
};

config.macros.ccRegister.emailValid=function(str){
	if((str.indexOf(".") > 0) && (str.indexOf("@") > 0)){	
		return true;
	}else{
		return false;
	}
}; 

config.macros.ccRegister.mailKeyUp=function(mail){
	if(config.macros.ccRegister.emailValid(mail)){
		var a=document.getElementById('mail_error');
		var field=document.getElementById('mail');
		a.innerHTML='The email address is valid ';
		a.setAttribute("class","inlineOk");
		a.setAttribute("className", "inlineOk");
		field.setAttribute("class","input");
	}
};


config.macros.ccRegister.registerOnSubmit=function(){
	if(this.username.value==''){
		document.getElementById('username_error').innerHTML='Please enter a username';
		this.username.setAttribute("class","inputError");
		return false;
	}else{
		document.getElementById('username_error').innerHTML='Please enter a username';
		this.username.setAttribute("class","input");
	}
	var mail_space="";
	if(this.username.value===''){
		displayMessage('no username entered');
	}
	if(config.macros.ccRegister.emailValid(this.mail.value)){
		mail_space=document.getElementById('mail_error');
		mail_space.innerHTML="email ok";
		mail_space.setAttribute("class","inlineOk");
	}else{
		mail_space=document.getElementById('mail_error');
		mail_space.innerHTML='not a valid email address ';
		mail_space.setAttribute("class","inlineError");
		return false;
	}
	if(this.password1.value===''){
		document.getElementById('pass1_error').innerHTML='Please enter a password';
		this.password1.setAttribute("class","inputError");
		return false;
	}else{
			document.getElementById('pass1_error').innerHTML='';
			this.password1.setAttribute("class","input");
	}
	if(this.password2.value===''){
		document.getElementById('pass2_error').innerHTML='Please enter a password';
		this.password2.setAttribute("class","inputError");
		return false;
	}else{
		document.getElementById('pass2_error').innerHTML='';
		this.password2.setAttribute("class","input");
	}
	if(this.password1.value != this.password2.value ){			
		this.password1.setAttribute("class","inputError");
		document.getElementById('pass2_error').innerHTML='Please ensure both passwords match';
		this.password2.setAttribute("class","inputError");
		return false;
	}
	var submit=document.getElementById('registerAccountSubmit');
	submit.disabled=true;
	submit.setAttribute("class","buttonDisabled");
	document.getElementById('submitStatus').innerHTML='Please wait, your account is being created.';
	setTimeout(config.macros.ccRegister.registerCheckResp,3000);
	displayMessage(this.username.value);
	doHttp('POST',url+'/handle/register.php',"username=" + encodeURIComponent(this.username.value)+ "&password="+Crypto.hexSha1Str(this.password1.value).toLowerCase(),null,null,null,config.macros.ccRegister.registerCallback,null);
	return false;
};

config.macros.ccRegister.registerCheckResp=function(){
	if (registerState !="Fail" && registerState !="ok"){
		alert("Your registration has timed out. ");
	}
};

config.macros.ccRegister.registerCallback=function(status,params,responseText,uri,xhr){
	if(xhr.status=='201'){
		registerState="ok";
		var loginDiv=document.getElementById("LoginDiv");
		document.getElementById('submitStatus').innerHTML='Your account has been created ';
		document.getElementById('username').value='';
		document.getElementById('mail').value='';
		document.getElementById('password1').value='';
		document.getElementById('password2').value='';
		document.getElementById('username_error').innerHTML='';
		document.getElementById('mail_error').innerHTML='';
		document.getElementById('pass1_error').innerHTML=''; 	
		document.getElementById('pass2_error').innerHTML=''; 
		var but=document.getElementById('registerAccountSubmit');
		but.disabled=false;
		but.setAttribute("class","button");
		document.getElementById('registerAccountSubmit').setAttribute('class','button');
	}else{
		registerState ="Fail";
	}
};


config.macros.ccRegister.usernameKeyPress=function(){
	doHttp('POST',url+'/handle/register.php',"username="+document.getElementById("username").value+"&free=1",null,null,null,config.macros.ccRegister.usernameCallback,null);
	return false;
};

config.macros.ccRegister.usernameCallback=function(status,params,responseText,uri,xhr){
	var field = "";
	if(responseText > 0){
		var error=document.getElementById('username_error');
		field=document.getElementById('username');
		error.innerHTML='The username has already been taken. ';
		error.setAttribute("class","inlineError");
		// For IE 
		error.setAttribute("className", "inlineError");
		field.setAttribute("class","inputError");
	}else{
		var a = document.getElementById('username_error');
		field = document.getElementById('username');
		a.innerHTML='The username is available ';
		// For IE
		a.setAttribute("className", "inlineOk");
		a.setAttribute("class","inlineOk");
		field.setAttribute("class","input");
	}
};
//}}}

/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|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.04.01 [1.2.0] added support for using systemTheme section-based template definitions (requested by Phil Hawksworth)
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: 2, revision: 0, date: new Date(2008,4,1)};
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 (i=0; i<tiddler.tags.length; i++) {
		var t=tiddler.tags[i]+template; // add tag prefix
		var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
		var s=config.options.txtTheme+"##"; // systemTheme section prefix
		if (store.tiddlerExists(t)) { template=t; break; }
		if (store.tiddlerExists(c)) { template=c; break; }
		if (store.getTiddlerText(s+t)) { template=s+t; break; }
		if (store.getTiddlerText(s+c)) { template=s+c; break; }
	}
	return template;
}
//}}}
<<ccRegister>>
<<ccUpload>>

!ccTiddly Macros 
{{{<>}}}
!!!{{{<>}}}
!!!{{{<>}}}
!!!{{{<>}}}
!!!{{{<>}}}
!!!{{{<>}}}

!TiddlyWiki Macros
!!!{{{<>}}}
Shows current date.
!!!{{{<>}}} 
This macro shows the version number of the current TiddlyWiki document.
!!!{{{<>}}}
Lists all tags. Clicking on a tag lists all the tiddlers assigned that tag. 
!!!{{{<>}}} 
Parameters : (all (default), missing, orphans, shadowed, touched, filter)
!!!{{{<>}}} 
 The timeline macro creates a list of tiddlers sorted by a date specified.

Example : 
{{{<>}}}

Produces : 

<>
!!!{{{<>}}}
The slider macro allows embedding tiddlers within another tiddler, with the option to toggle the visibility of the transcluded contents.

    * cookie: variable to save the state of the slider
    * tiddler: name of the tiddler to include in the slider
    * label: title text of the slider
    * tooltip: tooltip text of the slider 

 Example
{{{<>}}}

Produces : 

<>
!!!{{{<>}}}
The tabs macro creates an area where it displays one of several tiddlers alternately, as the user clicks on the tab labels at the top.

It is used like this:

{{{<>}}}

produces :
<>

    * ID: specifies the name of a cookie used to save the information about which tab was displayed last.
    * Label1, Label2, ... define the labels that are displayed at the top of the area for each tab
    * Tip1, Tip2, ... define tooltips that explain, somewhat more verbosely than the labels, what you can expect to find on each tab.
    * Tiddler1, Tiddler2, ... name the tiddlers that are displayed on each tab. 

Obviously, there must be exactly three strings for each tab.

The syntax for the tabs macro looks like this:

{{{<>}}}

produces :

<>

!!!{{{<>}}}
This macro generates a list of tiddlers that carry the specified tag.

<>

If the tag parameter is not specified, the current tiddler's name will be used instead.
!!!{{{<>}}}
!!!{{{<>}}}
This macro generates a button to create a journal tiddler, using the current time and date as title.

It is otherwise identical to the NewTiddler macro.

Example : 
{{{<>}}}

Produces : 
<>

The optional parameter can be used to specify a custom date format.

In addition, all of the NewTiddler macro's parameters are valid.

!!!{{{<>}}}

 Usage

<>

Parameters

This macro uses named parameters. All parameters are optional.
|Parameter|Description|
|label |button label|
|prompt|button tooltip|
|title|title for the new tiddler (defaults to "New Tiddler")|
|text|contents for the new tiddler|
|tag|tag to be applied to the new tiddler (parameter can be used repeatedly to specify multiple tags)|
|accessKey|single letter to use as access key to trigger the button|
|focus|which of the editable fields to default the focus to (e.g. "title", "text", "tags")|
|template|template tiddler to use to display the new tiddler (defaults to EditTemplate)|
|fields|custom fields to be assigned to the new tiddler, in name:value;name:value; format|

Only fields contained as input fields in the specified template can be primed with an initial value.
[edit] Example

<>



!!!{{{<>}}}



!!!{{{<>}}}

This macro creates an input field to perform full-text searches on a TiddlyWiki document's tiddler contents.
[edit] Usage

Example : 
{{{<>}}}

Produces : 

<>

By specifiying the value parameter, the search form can be "preloaded" with the desired term.
[edit] Options
This section is still incomplete. You can help by contributing to its expansion.
Please improve the article, or discuss the issue on the talk page.

    * case-sensitive
    * regular expressions 


!!!{{{<>}}}

The Gradient macro allows simple horizontal and vertical coloured gradients. They are constructed from coloured HTML elements, and don't require any images to work.
The Gradient macro is an extended macro that processes the text after it up until the next '

>>

' sequence. It looks like this:
Example : 
{{{<>gradient fill>>}}}

Produces : 
<>gradient fill>>

The first parameter can be vert or horiz to indicate the direction of the gradient. The following parameters are two or more colours (CSS RGB(r,g,b) format is also acceptable). The macro constructs a smooth linear gradient between each of the colours in turn.

Inline CSS definitions can be added to gradient fills like this:


Example : 
{{{<>color:#ffffff;font-size:12pt;Darkness>>}}}

Produces : 
<>color:#ffffff;font-size:12pt;Darkness>>


!!!{{{<>}}}

Sparklines were invented by Edward Tufte, author of a number of thoughtful and inspiring books on the presentation of visual information. They are described by Tufte as "small, intense, word-like graphics", and are designed to be used inline with ordinary text.

TiddlyWiki's Sparklines macro creates these graphics inline without requiring any image files or server-side processing.

As of TiddlyWiki v2.3.0, this macro's code has been moved into the optional SparklinePlugin (included in the default distribution).
[edit] Usage
Example :
{{{<>}}}
Produces : 
<>

The macro accepts space-separated numeric values as parameter.
[edit] Example

Example : 
{{{<>}}}

Produces : 
<>

!!!{{{<>}}}
!!!{{{<>}}}
Changes the browser address bar to a permalink to the current Tiddler or the set of open tiddlers. It is used with the ToolbarMacro like this:

Example : 
{{{<>}}}
Produces : 
<>

!!!{{{<>}}}
The ToolbarMacro is used in the TemplateMechanism to define the toolbar that appearthat appear either in EditMode or in ViewMode. The arguments to the ToolbarMacro is a list of command names, as discussed in the CommandMechanism..

You can precede a command name with a "+" to specify a default command that is automatically chosen when a tiddler is double-clicked, or the ctrl-Enter key combination pressed. Similarly, precede it with "-" to specify a command to be chosen when the Escape key is pressed.
!!!{{{<>}}}

!!!{{{<>}}}
The command <> switches from ViewMode to EditMode. The EditMacro is either a double mouse click inside the tiddler or the entry 'edit' in the tiddler's Toolbar. It is used in ViewTemplate as ToolbarMacro like this:
Example : 
{{{<>}}}
Produces : 
<>

!!!{{{<>}}}
!!!{{{<>}}}
!!!{{{<>}}}
Retrieves a specified field (given by fieldname) from the tiddler to be displayed and outputs its value in one of the following ways (the optional //how// parameter):

    * (unspecified): render as is (without formatting)
    * link: format as a link (using createTiddlyLink)
    * wikified: format using all the normal rendering rules
    * date: expects a value of the form YYYYMMDDHHMM and outputs it using either a specified format (...) or config.views.wikified.dateFormat 

The standard field names are:

    * title - the tiddler title
    * tiddler - the tiddler title (as well)
    * text - the text of the tiddler
    * modifier - the person who last modified it
    * modified - date&time of last modification
    * created - when it was created
    * tags - the tiddler tags 

If your tiddlers contain custom fields, they could be specified as well.

The view macro is used extensively in the standard tiddler rendering templates (ViewTemplate and EditTemplate).

!!!ccTiddly Tiddlers 





!!! Predefined ccTiddly Tags 

simple - displays the tiddler without showing the date editor and tags. 

private - Only you will be able to read the tiddlers tagged private.


!!! ccTiddly Tiddlers  

[[anonDefaultTiddlers]]
[[ccVariables]]

== Headings

== Heading2
=== Heading3
==== Heading4
===== Heading5

==Heading2
===Heading3
====Heading4
=====Heading5

== Heading2 =
=== Heading3 =
==== Heading4 =====
===== Heading5 ==



== Bold and Italic

**bold**
//italic//
**//bolditalic//**

A normal sentence. **A bold sentence
that continues in bold over a line break.** And another normal sentence.

A normal sentence. **A bold sentence that is not terminated by star-star, but is instead is terminated by a paragraph break.

A normal sentence.

A normal sentence. //An italic sentence
that continues in italic over a line break.// And another normal sentence.

A normal sentence. //An italic sentence that is not terminated by slash-slash, but is instead is terminated by a paragraph break.

A normal sentence.

== Preformatted text

Normal text {{{preformatted text}}} Normal text.

{{{
A block
of preformatted text
}}}

== Links
[[explicitlink]]

[[link|explicitlinkTitle]]

http://www.wikicreole.org

[[http://www.wikicreole.org|Wiki Creole Site]]

== Misc

A horizontal rule follows
----

== Lists
* bulleted list
* bullet 2
** bullet level 2
*** bullet level 3

# numbered list
# item 2
## item 2.1
### item 2.1.1
#### item 2.1.1.1
##### item 2.1.1.1.1
# item 3
# item 4
Participatory Deliberation -
http://osmosoft.com/ More info about osmosoft can be found here
when creating a link using ''[''''['', it may open a new window depending on its settings. One can now override this behaviour by using a ''~'' at the begining of the link like\n[[a link to google|~http://google.com]]\n\nNB: this isn't working\n
Well, with help from a number of sources I've nailed the basics ... even discovered how to do --strikeout--!\n\n----\n\n--see [[Requirements]] from http://cctiddly.sourceforge.net/-- ... this didn't work. Dunno why, copied the source directly from the original. ''This is now working''\n\nAltMenu is the Main Menu from http://www.hawksworx.com/playground/TeamTasks/ ... a simple slider, without the nice internal nesting the other has, but at least this works here.\n
!!!Requirements\nccTiddly can be hosted using the following environment (click on the link to see details)\n#+++^[Public free web server]<<tiddler "Public free web server">>===\n\n#+++^[Rent some webspace from web providers]<<tiddler "Rent some webspace from web providers">>===\n\n#+++^[Setup your own server]<<tiddler "Setup your own server">>===\n\nAfter picking your server environment, you can proceed to install.\n\n<<tag requirements>>\n
It's about discourse! (Provided by [[Osmosoft]] using TiddlyWiki.)
This is paradigmatically different in many, many ways. 1st, no evidence of markup ... or help on the subject. 2nd failure at an intuitive level e.g. I add an item to DefaultTiddlers but don't see how I can add that to the menu alongside GettingStarted. 3rd, just plain weirdness: "Help" is located under "Options" ... HeyHo.\n\nbummer
[[26 June 2008]]\nOpenSourceCommunity\nMoralProvocation\n
"''Even if you don't care, it still matters!''"\n\nIf there's something you don't care about, that "something" may still matter, it may be quite important. \n\nIf there's something that's important that you don't care about, the fact that you don't care about it may be important! You not caring may matter a lot.\n\nLiving as though we're contented cows is no way to live ... we're human beings, we're sentient. When we don't respond to moral provocation it's exactly as though we'd been lobotomized.
Since "New Journal" doesn't create a CamelCase tiddler, I wasn't able to add that item to DefaultTiddlers. So I created this one. Which doesn't show up as a link in DefaultTiddlers. *sigh*\n\nThis is paradigmatically different in many, many ways. 1st, no evidence of markup ... or help on the subject. 2nd failure at an intuitive level e.g. I add an item to DefaultTiddlers but don't see how I can add that to the menu alongside GettingStarted. 3rd, just plain weirdness: "Help" is located under "Options" ... HeyHo.\n\nbummer
ChrisDentSez\n----\n<<slider chkSliderOptionsPanel Blurts 'Blurts »' 'A list of blurts'>>\n<<slider chkSliderOptionsPanel Journals 'Journals »' 'A list of journals'>>\n----\n*[[Customization]] \n*GettingStarted \n\n----\ngoto [[Resources|Resources]]\n\n[[SaveA)s pardelibTW.html|http://wiki.osmosoft.com/alpha/pardelib]]\n
[[Blurts]] | [[Journals]] | MainMenu | \n\nDefaultTiddlers | AnonDefaultTiddlers | SiteTitle & SiteSubtitle | \n\n*PageTemplate -- Contains the overall structure of the page, including the gradient macro for the masthead.\n*EditTemplate -- Contains the structure and order of the tiddler editor screen\n*ViewTemplate -- Contains the structure and order of the tiddler view screen\n*ToolbarCommands\n*StyleSheetColors -- Contains the CSS for colors\n*StyleSheetLayout -- Contains the CSS for layout\n*StyleSheetPrint -- Contains the CSS used when printing from the TiddlyWiki\n\n----\n\nThe following block was ripped off from [[the tiddlywiki homepage|http://tiddlywiki.com/]]\n----\nYou can customise the appearance and behaviour of TiddlyWiki to almost any degree you want:\n* Use the ColorPalette to change the basic colour scheme\n* Create a CustomStyleSheet for finer grained control over the appearance\n* Customise the PageTemplate, ViewTemplate or EditTemplate to change the composition of the page and the layout of individual tiddlers\n* Use off-the-shelf themes from [[TiddlyThemes|http://tiddlythemes.com/]]\n* Visit the [[Configuration]] summary to see all the special configuration tiddlers\n* Install [[Plugins]] to extend the core functionality (find them at [[TiddlyVault|http://tiddlyvault.tiddlyspot.com/]] or you can try [[writing or adapting your own|http://gimcrackd.com/etc/src/codex/]])\n* Use TiddlyBookmarklets for low level hacking of TiddlyWiki documents\nThere are also a bunch of TiddlyWikiTools that you can use to enhance TiddlyWiki.\n----\n\n<<slider chkSliderOptionsPanel Resources 'Resources »' 'A list of sites'>>\n\n<<tag resources>>\n
You can also get free webspace from some public servers out there (such as [[byethost|http://byethost.com/]] and [[lycos (tripod)|http://www.tripod.lycos.co.uk/]]. Whichever providers you choose, you will need:\n*~PHP4/5\n*~MySQL\n\n''Benefit''\n*Free (as in beer)\n*Uptime (depending on your provider, but usually not as good as paid hosting)\n*Saves time from maintaining server\n\n''Issues''\n*Advertising on your page\n*Database is "not as private" since your provider now have access to it\n\nHere is a ''step-by-step'' installation tutorial for [[Byethost|Installing on byethost]] and [[Lycos|Installing on lycos]]
(//recent first//)\n-[[26June08-2|26 June 2008-2]]\n-[[26June08|26 June 2008]]\n-[[25June08|25 June 2008]]\n- [[23June08-2]]\n- [[23June08]]\n<<slider chkSliderOptionsPanel Items 'Items »' 'A second list of journals'>>
- [[Blank1]]\n- [[Blank2]]
see irc://irc.freenode.net/tiddlywiki\n\n<<slider chkSliderOptionsPanel ccTWRes 'ccTiddly »' 'A list of sites'>>\n\n<<slider chkSliderOptionsPanel TWRes 'TIddlyWiki »' 'A list of sites'>>\n\n<<slider chkSliderOptionsPanel RRapRes 'RippleRap »' 'A list of sites'>>\n\n[[TWRes]] [[ccTWRes]] [[RRapRes]]\n\n----\n<<slider chkSliderOptionsPanel GettingStarted 'Getting Started »' 'A list of sites'>>\n\n<<tag resources>>\n
- CordonBlue\n- [[w/Chris Brogan|ChrisBrogan1]]\n- [[OS & Community|OpenSourceCommunity]]\n- MoralProvocation
Originally posted as [[a comment to Nick Webb's "Tiddlypreneurship at Osmosoft"|http://www.erraticmusings.com/?p=16]]:\n\nAs for “whether or not open source software is solely the domain of developers” I’d agree with you on “shouldn’t be”, but would quite confidantly say “Is, most of the time, very definitely.”\n\nTake ccTW for example. I got [[mine up and running at osmosoft|http://wiki.osmosoft.com/alpha/pardelib]] pretty quickly after having come across [[Confabb’s “Note Saver"|http://blog.confabb.com/?p=106]]. Fast start followed by grinding frustration … for example markup copied from another TW not working on my install; not the sort of snafu you want to encounter on your first day.\n\nAddressing documentation (my trade) it’s only natural that developers leave just enough cookie crumbs for others like them to find their work … which isn’t at all the same as enabling a naive participant.\n\nCase in point: configuration of a server side install. I’ve found a lot of Tiddlers that nominally address that, but none of them have actual config data and instructions.\nOh-wooops, one of them does … incidentally … the one that describes installing at Lycos. Go figure!\n\nIt’s a cultural thing. Developers leave gaping voids where they (quite correctly) presume other developers to be up to speed. In my estimation encountering 2 or 3 of those voids would be enough to deter a naive participant … and nobody would ever know.\n\nIt’s a cultural thing.\nBen Tremblay at June 24th, 2008 around 6:10 pm
|''Type:''|file|\n|''URL:''|http://cctiddly.sourceforge.net/|\n|''Workspace:''|(default)|\n\nThis tiddler was automatically created to record the details of this server
!!~TiddlyWiki Resources\n\n*[[Main TiddlyWiki site|http://www.tiddlywiki.com]] and [[Developers' site|http://www.tiddlywiki.org/wiki/TiddlyWeb]]\n*[[TWFaq at TiddlySpot|http://twfaq.tiddlyspot.com/]]\n*[[Julian Knight's references|http://knighjm.googlepages.com/knightnet-default-tw.html]]\n\n*[[Google Group|http://groups.google.com/group/TiddlyWiki]]\n*[[Developers Google Group|http://groups.google.com/group/TiddlyWikiDev]]\n\n*[[Write-up at OsmoSoft|http://osmosoft.com/#TiddlyWiki]]\n\n\n\n\n
A reply I just crafted while chatting with [[Chris Brogan|http://twitter.com/chrisbrogan]] on ~FaceBook:\n\n""We're tying threads together."\nIndeed, indeed!\n\nHave you come across "autopoesis"?\nFractals and such ... self-organizing systems ...\n\nSo long as a critical number of individuals are striving towards ?what? however they conceive of "the good", things will work themselves out. Kinda like how in conflict situations (Gaza, Iraq, Sudan) all that's required for evil to triumph is that people of good-will do nothing.\n\nMichael Mandelbaum was on Charlie Rose last night ... produced a nice trope: "the irresistable force of democracy and free markets meeting the immovable object that is China's Communist Party" ... it's like that ... tectonic.\n\nMy worry: that "fun" increase dissipation catastrophically. (~MySpace comes to mind.)\nMy project: to create an online system that empowers real discourse. (For my money, conventional forums / wiki / blogs don't cut the mustard.)\n
!!ccTiddly Resources\n\n[[ccTiddly at TiddlyWiki.org|http://tiddlywiki.org/wiki/CcTiddly]] and [[Sourceforge Homepage|http://cctiddly.sourceforge.net/]] (see [[Requirements]])\n\n[[ccTiddly hosting at OsmoSoft|http://wiki.osmosoft.com/alpha]]\n\n[[Google user group|http://groups.google.com/group/ccTiddly]]\n[[SourceForge Forum|http://sourceforge.net/forum/forum.php?forum_id=523746]]\n \nBlogs: [[Simon's blog|http://wordpress.com/tag/cctiddly/]] and [[Matthew |http://coolcold.wordpress.com/category/cctiddly/]].
!!~RippleRap Resources\n\n[[HomePage|http://www.ripplerap.com/]]\n\n[[Write-up at OsmoSoft|http://osmosoft.com/#RippleRap]]\n
I just now discovered AnonDefaultTiddlers ... a good thing to find!\n\nA few minutes ago I finished the first cut of [[Resources]] ... something to build on.\n\nEarlier, with email from Simon, I gave Import a spin ... managed to grab one Tiddler, but --didn't get the slider functionality I'd wanted. ~HeyHo, and so it goes!--\n\n//Addendum//: ~Ace_NoOne on IRC pointed me to this: [[SourceForge #NestedSlidersPlugin|http://cctiddly.sourceforge.net/#NestedSlidersPlugin]]\nThat brought me to [[TiddlyTools #NestedSlidersPlugin|http://www.tiddlytools.com/#NestedSlidersPlugin]] and [[TiddlyTools #NestedSlidersPluginInfo|http://www.tiddlytools.com/#NestedSlidersPluginInfo]]\nThe key instructions were on [[the Wiki Plugins page|http://www.tiddlywiki.org/wiki/Plugins]], i.e. "In order to install a plugin, the respective tiddler(s) need to be imported (or simply copied in edit mode) from the source into the TiddlyWiki document. In order to be processed on startup, plugins need to be assigned the "systemConfig" tag. "\n[[Requirements]] is now fully nested.\n\n>//NB: constantly having to log in again and again and again is fucking bullshit. Ok? Ok. Now, where was I ... ohhhh yaa, now I have to restore that whole fucking paragraph full of links. (How long has this been around? Yaa yaa I know, all I'm good for is picking gnits ... GD amateurs.)\nIt's like Twitter ... unless you want to lose your work before committing you select all and copy, then hit the button.//\n\n----\nOf historical interest:\n*A [[whole list of interviews with TiddlyHackers|http://mptw1.tiddlyspot.com/#The TiddlyWiki Report]] at Simon Baird's [["MonkeyPirateTiddlyWiki"|http://mptw1.tiddlyspot.com/]]. (Do peek [[Simon's main blog|http://glosoli.blogspot.com/]].) \nCase in point: [["The TiddlyWiki Report, Part IV: Jeremy Ruston"|http://loosewire.typepad.com/blog/2005/08/the_tiddlywiki__3.html]] ("The man who started it all".)
AnonGreets\n\n[[26 June 2008]]
Hi! You've found your way to my (very preliminary) ~ParDelib page.\n\nI invite you to snoop the material I've listed in the left sidebar menu ...\n... but perhaps you want to set up your own ccTiddlyWiki? (That's the software this site is running.)\nIf that's the case, then head on over to [[OsmoSoft's hosting site|http://wiki.osmosoft.com/alpha/]] ... fill your boots!\n\n- -[[bentrem|http://twitter.com/bentrem]]\n\n<<ccLogin>>
|''Type:''|file|\n|''URL:''|http://cctiddly.sourceforge.net|\n|''Workspace:''|(default)|\n\nThis tiddler was automatically created to record the details of this server
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly 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.''\n\nYou 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.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen 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\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*mouse auto rollover\n*custom class/label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{^width^}}} (or just {{{^}}})^^\nmakes 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)^^\n* {{{*}}}^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{{{class{[label=key|tooltip]}}}}}}^^\nuses custom label/tooltip/accesskey. {{{{{class{...}}}}}}, {{{=key}}} and {{{|tooltip}}} are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//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.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n===\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}\n''2006.07.25 - 1.9.3'' when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it. Significantly reduces the 'cookie overhead' when default slider states are used.\n''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"\n''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value\n''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\n''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element\n''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\n''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n''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)\n''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\n''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.\n''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.\n''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\n''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.\n''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)\n''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)\n''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n''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.\n''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state\n''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\nformatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin\nmore documentation\n''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\ncode cleanup, added documentation\n''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\nchanged name to EasySlidersPlugin\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 2, minor: 0, revision: 0, date: new Date(2006,7,28)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(?:\s\s{\s\s{([\s\sw]+[\s\ss\s\sw]*)\s\s{)?(\s\s[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n // defopen=lookaheadMatch[1]\n // cookiename=lookaheadMatch[2]\n // header=lookaheadMatch[3]\n // panelwidth=lookaheadMatch[4]\n // rollover=lookaheadMatch[5]\n // class=lookaheadMatch[6]\n // label=lookaheadMatch[7]\n // blockquote=lookaheadMatch[8]\n // deferred=lookaheadMatch[9]\n\n lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey\n var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // parse custom label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n title = lookaheadMatch[7].trim().slice(1,-1);\n var pos=title.indexOf("|");\n if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }\n if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }\n if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);\n\n // set extra button attributes\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):""; // save requested panel size\n btn.sliderPanel=panel;\n panel.style.display = show;\n panel.style.width=panel.defaultPanelWidth;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[9]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[8]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[8]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n // reset to default width (might have been changed via plugin code)\n theSlider.style.width=theSlider.defaultPanelWidth;\n // align slider/floater position with target button\n if (!isOpen) adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n // if showing panel, set focus to first 'focus-able' element in panel\n if (theSlider.style.display!="none") {\n var ctrls=theSlider.getElementsByTagName("*");\n for (var c=0; c<ctrls.length; c++) {\n var t=ctrls[c].tagName.toLowerCase();\n if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length) {\n config.options[this.sliderCookie]=!isOpen;\n if (config.options[this.sliderCookie]!=this.defOpen)\n saveOptionCookie(this.sliderCookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = this.sliderCookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (place.style.position!="relative") {\n var left=findPosX(btn);\n var top=findPosY(btn)+btn.offsetHeight;\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;\n if (p) { left-=findPosX(p); top-=findPosY(p); }\n }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}
<<tabs referencelabel [[A1]] "Not much" [[subtabA1]] [[B1]]\n"Just a bit" [[subtabB1]] >>\n\n<<tag demo>>
And just now came upon Saq Imtiaz's [["TiddlySnip" FireFox extension|http://tiddlysnip.com/]]\n\nRefactored [[Resources]] and GettingStarted.\n\nJust now discovered http://tiddlychatter.tiddlyspot.com/\nAlso [[presentation template|http://lewcid.googlepages.com/presentation_empty_full.html]] ([[see it in action|http://lewcid.googlepages.com/tots.html]]) and [[WebView|http://www.giffmex.org/webviewtwexample.html]] (gotta luv the editor functions here!).\nShould peek http://tiddlyspot.com/ as well.\n\nDragged in the TiddlerNotesPlugin, so [[Notes]] works ... but I had noped to use it in AnonGreets, so visitors could leave notes anonymousely (i.e. the //principle of ''non-destructive contribution''//) but no such luck.\n\n''NB'': Lots of posts to grapple with on [[Saq's "Tiddly Learning" blog Lewcid.org|http://lewcid.org/]]\n\nHot Dang! see AccordionMenuDemo ... using [[tw.lewcid.org/#AccordionMenuPlugin|http://tw.lewcid.org/#AccordionMenuPlugin]]\n''//~ToDo//'': Get a consistent look between this and the slider style in [[Resources]].\nNB: StartingAccordion is a variant of GettingStarted ... note how it should be multiline but //each link causes a newline// ... ''not right''.\n\nAnd likewise //Hot Dang//: DropDownDemo from [[tw.lewcid.org/#DropDownMenuPlugin|http://tw.lewcid.org/#DropDownMenuPlugin]]\n\nCreated TestTabs ... neat!\n\n''//Project//'':\nI'm seeing some really fine plugins on sites that are a) stale (unedited since sometime in 2006) and b) not accessible //via// "Import". So: how to harvest from sites such as [[Jim Barr's fully enhanced TW|http://tiddlywikitips.com/]]?\nI just did a manual grap of his [[Plugin listTags]] ... no evidence that it's working; no documentation of how it's used. ~HeyHo.\nHis [[list of internal macros|http://tiddlywikitips.com/#Internal Macros]] is useful, for e.g. listing all tiddlers with a certain tag:\n<<tag journal>>\n\nI just grabbed his [[list of internal macros|InternalMacros]]. (The ref links are relative, so that needs to be hacked.)\n\nMeh ... grabbed [[Plugin SplashScreen]] but no joy.\n\nMeh again ... grabbed [[Plugin ImportTiddlers]] and got "A script from "http://wiki.osmosoft.com" was denied UniversalBrowserRead privileges." and exceptions / errors.\nOk, so now I'm getting "Could not open local document: C:\sbuffer\sripplerap\stiddlywikitips_empty.html" ... which isn't even slightly helpful. ~HeyHo ...\n<<importTiddlers inline>>\n''//NB://'' I had to un-deploy the systemConfig tag (by changing it to systemConfigwas) because it clashes with the "Backstage" import function.\n\n----\nNeato ... I just found how to include another tiddler's contents inside a tiddler, e.g. here's [[subtabB1]]:\n\n<<tiddler "subtabB1">>\n----\n
<<slider chkSliderOptionsPanel BasicRes 'Basic »' 'A list of sites'>>\n\n<<slider chkSliderOptionsPanel AdvancedRes 'Advanced »' 'A list of sites'>>\n\n<<slider chkSliderOptionsPanel ExporeRes 'To Be Explored »' 'A list of sites'>>\n\n<<tag resources>>
Hope hope hope
So this is contents
!!!Getting an account on Lycos (tripod)\n#Go to http://www.tripod.lycos.co.uk/\n#Signup for an account\n#Wait for your account verification email and verify your account\n#When your account is verified, login to your account\n#Go to ''My account'', below ''Take a tour'' on your left\n#Go to bottom of the page and locate five icons (green and black)\n#click on ''PHP4U''\n#Click on ''Active PHP4U now''\n#On this page, record down your database info. I use my test site as an example\n{{{\nName: cctiddly_uk_db\nUsername: cctiddly\nPassword: no password needed\nHost: localhost\n}}}\n\n!!!Config and upload your ccTiddly\n*open your ''default.php'' under your ''config'' directory with your favorite editor\n*Change the following variables to the values required (change\n{{{\n$tiddlyCfg['db']['host'] = "localhost"; //sql host\n$tiddlyCfg['db']['login'] = "cctiddly"; //login name\n$tiddlyCfg['db']['pass'] = ""; //login password\n$tiddlyCfg['db']['name'] = "cctiddly_uk_db"; //db name\n}}}\n*because the MySQL on Lycos do not support ''set names'', disable utf-8 in your config file (set it to 0, available in v1.0 final)\n{{{\n$tiddlyCfg['pref']['utf8'] = 0;\n}}}\n\n<<tag requirements>>
[[all of the Internal Macro Tiddlers at TiddlyWikiTips.com|http://TiddlyWikiTips.com/index.html#[[Tip #12: TiddlyWiki Internal Macros]] TipAllTags TipCloseAll TipNewJournal TipNewTiddler TipPermaView TipSaveChanges TipSearch TipSlider TipTabbedContent TipTagPopUp TipTiddlerContents TipTimeline TipToday TipTWVersion]]\n----\n\nIn addition to the excellent Plugins found here and throughout the TiddlyWiki world, TiddlyWiki contains some internal Macros that, for the most part, remain undocumented. They can offer lots of interesting possibilities when customizing your TiddlyWiki. The Macro list below was compiled from TiddlyWiki version 1.2.31. Click on a macro's description below to view more detail about each Macro including syntax, description, and examples!\n\n|!Macro|!Description|!Syntax|\n|allTags|[[List all Tags in a Tiddler|TipAllTags]]|{{{<}}}{{{<allTags>>}}}|\n|closeAll|[[Close all displayed Tiddlers|TipCloseAll]]|{{{<}}}{{{<closeAll>>}}}|\n|list all|[[List all Tiddlers in a Tiddler|TipListAll]]|{{{<}}}{{{<list all>>}}}|\n|list missing|[[List all Missing Tiddlers in a Tiddler|TipListMissing]]|{{{<}}}{{{<list missing>>}}}|\n|list orphans|[[List all orphaned Tiddlers in a Tiddler|TipListOrphans]]|{{{<}}}{{{<list orphans>>}}}|\n|newJournal|[[Create new date & Time stamped Tiddler|TipNewJournal]]|{{{<}}}{{{<newJournal>>}}}|\n|newTiddler|[[Create new Tiddler|TipNewTiddler]]|{{{<}}}{{{<newTiddler>>}}}|\n|permaview|[[URL link for all open Tiddlers|TipPermaView]]|{{{<}}}{{{<permaview>>}}}|\n|saveChanges |[[Save all TiddlyWiki changes|TipSaveChanges]]|{{{<}}}{{{<saveChanges>>}}}|\n|search|[[Display a Search box|TipSearch]]|{{{<}}}{{{<search>>}}}|\n|slider|[[Display a Slider|TipSlider]]|{{{<}}}{{{<slider sliderID sliderTiddler sliderLabel>>}}}|\n|tabs|[[Display Tabbed content|TipTabbedContent]]|{{{<}}}{{{<tabs indentifier tabLabel tabName Tiddler>>}}}|\n|tag|[[Display a Tag PopUp|TipTagPopUp]]|{{{<}}}{{{<tag tagName>>}}}|\n|tiddler|[[Display inline contents of a Tiddler|TipTiddlerContents]]|{{{<}}}{{{<tiddler Tiddler>>}}}|\n|timeline|[[Display Timeline in a Tiddler|TipTimeline]]|{{{<}}}{{{<timeline>>}}}|\n|today|[[Dusplay Today's Date|TipToday]]|{{{<}}}{{{<today>>}}}|\n|version|[[Display TiddlyWiki's version|TipTWVersion]]|{{{<}}}{{{<version>>}}}|\n
config.macros.listTags = { text: "Hello" };\nconfig.macros.listTags.handler = function(place,macroName,params)\n{\n var tagged = store.getTaggedTiddlers(params[0]);\n var ul = createTiddlyElement(place,"ul",null,null,"");\n for(var r=0;r<tagged.length;r++)\n {\n var li = createTiddlyElement(ul,"li",null,null,"");\n createTiddlyLink(li,tagged[r].title,true);\n }\n}
/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#SplashScreenPlugin|\n|Version|0.21 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nvar old_lewcid_splash_restart=restart;\n\nrestart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n if (document.getElementById("contentWrapper"))\n document.getElementById("contentWrapper").style.display = "block";\n \n old_lewcid_splash_restart();\n \n if (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n}\n\n\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n//}}}
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ImportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important. This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. It can also be very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\n!!!!!Inline interface (live)\n<<<\n<<importTiddlers inline>>\n<<<\n!!!!!Macro Syntax\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n{{{<<importTiddlers filter source quiet ask>>}}}\nnon-interactive 'automatic' import.\n''filter'' determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n''source'' is the location of the imported document. It can be either a local document or an URL:\n>filename is any local path/file, in whatever format your system requires\n>URL is any remote web location that starts with "http://" or "https://"\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"ask"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n\n''Special tag values: importReplace and importPublic''\n\nBy adding these special tags to an existing tiddler, you can precisely control whether or not to allow updates to that tiddler as well as decide which tiddlers in your document can be automatically imported by others.\n*''For maximum safety, the default action is to prevent existing tiddlers from being unintentionally overwritten by incoming tiddlers.'' To allow an existing tiddler to be overwritten by an imported tiddler, you must tag the existing tiddler with ''<<tag importReplace>>''\n*''For maximum privacy, the default action for //outgoing// tiddlers is to NOT automatically share your tiddlers with others.'' To allow a tiddler in your document to be shared via auto-import actions by others, you must tag it with ''<<tag importPublic>>''\n//Note: these tags are only applied when using the auto-import processing. When using the interactive control panel, all tiddlers in the imported document are available in the listbox, regardless of their tag values.//\n<<<\n!!!!!Interactive Usage\n<<<\nWhen used interactively, a control panel is displayed consisting of an "import source document" filename input (text field plus a ''[Browse...]'' button), a listbox of available tiddlers, a "differences only" checkbox, an "add tags" input field and four push buttons: ''[open]'', ''[select all]'', ''[import]'' and ''[close]''.\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//\n\nSelect one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//\n\n''Import Report History''\n\nWhen tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n''2006.02.17 [2.6.0]''\nRemoved "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]''\nadded checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]''\nFF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]''\ncorrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]''\nmoved globals from window.* to config.macros.importTiddlers.* to avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2006.01.18 [2.5.0]''\nadded checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]''\nadded "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]''\nAdded support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]''\nAdded "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]''\nStrip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]''\nReorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]''\nAdded "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]''\nWhen a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]''\nIMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]''\nWhen refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]''\nWhen "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]''\ntweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]''\nDynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]''\nfixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]''\nadded 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]''\nonly load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]''\nfixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]''\ncombined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]''\nmoved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]''\ncore update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]''\nadded parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n\n// // Version\n//{{{\nversion.extensions.importTiddlers = {major: 2, minor: 6, revision: 0, date: new Date(2006,2,17)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n// // IE needs explicit global scoping for functions/vars called from browser events\n//{{{\nwindow.onClickImportButton=onClickImportButton;\nwindow.loadImportFile=loadImportFile;\nwindow.refreshImportList=refreshImportList;\n//}}}\n\n// // default cookie/option values\n//{{{\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n//}}}\n\n\n// // ''MACRO DEFINITION''\n\n//{{{\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n countMsg: "%0 tiddlers selected for import",\n src: "", // path/filename or URL of document to import\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n // LINK WITH FLOATING PANEL\n if (!params[0]) {\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n return;\n }\n // INLINE TIDDLER CONTENT\n if (params[0]=="inline") {\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n return;\n }\n // NON-INTERACTIVE BATCH MODE\n switch (params[0]) {\n case 'all':\n case 'new':\n case 'changes':\n case 'updates':\n var filter=params.shift();\n break;\n default:\n var filter="updates";\n break;\n } \n if (!params[0]||!params[0].length) return; // filename is required\n config.macros.importTiddlers.src=params.shift();\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="ask"); if (ask) params.shift();\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n // load storeArea from a hidden IFRAME, then apply import rules and add/replace tiddlers\n loadImportFile(config.macros.importTiddlers.src,filter,quiet,ask,autoImportTiddlers);\n}\n//}}}\n\n// // ''READ TIDDLERS FROM ANOTHER DOCUMENT''\n\n//{{{\nfunction loadImportFile(src,filter,quiet,ask,callback) {\n if (!quiet) clearMessage();\n // LOCAL FILE\n if ((src.substr(0,7)!="http://")&&(src.substr(0,8)!="https://")) {\n if (!quiet) displayMessage("Opening local document: "+ src);\n var txt=loadFile(src);\n if(!txt) { if (!quiet) displayMessage("Could not open local document: "+src); }\n else {\n var s="<html><body>"+txt.substr(txt.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(txt.length+" bytes in document. ("+s.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(convertUTF8ToUnicode(s));\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n return;\n }\n // REMOTE FILE\n var x; // XML object\n try {x = new XMLHttpRequest()}\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")}\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")}\n catch (e) { return }\n }\n }\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status == 200) {\n var sa="<html><body>"+x.responseText.substr(x.responseText.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(x.responseText.length+" bytes in document. ("+sa.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(sa);\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n else\n if (!quiet) displayMessage("Could not open remote document:"+ src+" (error="+x.status+")");\n }\n }\n if (document.location.protocol=="file:") { // UniversalBrowserRead only works from a local file context\n try {netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead')}\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n if (!quiet) displayMessage("Opening remote document: "+ src);\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",url,true);\n x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage("Could not open remote document: "+src);\n displayMessage(e.description?e.description:e.toString());\n }\n }\n}\n\nfunction readImportedTiddlers(txt)\n{\n var importedTiddlers = [];\n // create frame\n var f=document.getElementById("importFrame");\n if (f) document.body.removeChild(f);\n f=document.createElement("iframe");\n f.id="importFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n // get document\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n // load source into document\n d.open(); d.writeln(txt); d.close();\n // read tiddler DIVs from storeArea DOM element \n var importStore = [];\n var importStoreArea = d.getElementById("storeArea");\n if (!importStoreArea || !(importStore=importStoreArea.childNodes) || (importStore.length==0)) { return null; }\n importStoreArea.normalize();\n for(var t = 0; t < importStore.length; t++) {\n var e = importStore[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && (e.id.substr(0,5) == "store"))\n title = e.id.substr(5);\n if(title && title != "") {\n var theImported = new Tiddler();\n theImported.loadFromDiv(e,title);\n importedTiddlers.push(theImported);\n }\n }\n return importedTiddlers;\n}\n//}}}\n\n// // ''NON-INTERACTIVE IMPORT''\n\n// // import all/new/changed tiddlers into store, replacing or adding tiddlers as needed\n//{{{\nfunction autoImportTiddlers(src,filter,quiet,ask)\n{\n var count=0;\n if (config.macros.importTiddlers.inbound) for (var t=0;t<config.macros.importTiddlers.inbound.length;t++) {\n var theImported = config.macros.importTiddlers.inbound[t];\n var theExisting = store.getTiddler(theImported.title);\n\n // only import tiddlers if tagged with "importPublic"\n if (theImported.tags && theImported.tags.find("importPublic")==null)\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // never import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // check existing tiddler for importReplace, or systemConfig tags\n config.macros.importTiddlers.inbound[t].status="added"; // default - add any tiddlers not filtered out\n if (store.tiddlerExists(theImported.title)) {\n config.macros.importTiddlers.inbound[t].status="replaced";\n if (!theExisting.tags||(theExisting.tags.find("importReplace")==null))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists (use importReplace to allow changes)"; continue; }\n if ((theExisting.tags.find("systemConfig")!=null)||(theImported.tags.find("systemConfig")!=null))\n config.macros.importTiddlers.inbound[t].status+=" - WARNING: an active systemConfig plugin has been added or updated";\n }\n\n // apply the all/new/changes/updates filter \n if (filter!="all") {\n if ((filter=="new") && store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists"; continue; }\n if ((filter=="changes") && !store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - new tiddler"; continue; }\n if (store.tiddlerExists(theImported.title) && ((theExisting.modified.getTime()-theImported.modified.getTime())>=0))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler is unchanged"; continue; }\n }\n\n // get confirmation if required\n if (ask && !confirm("Import "+(theExisting?"updated":"new")+" tiddler '"+theImported.title+"'\snfrom "+src))\n { config.macros.importTiddlers.inbound[t].status="skipped - cancelled by user"; continue; }\n\n // DO THE IMPORT!!\n store.addTiddler(theImported); count++;\n }\n importReport(quiet); // generate a report (as needed) and display it if not 'quiet'\n if (count) store.setDirty(true); \n // always show final message when tiddlers were actually imported\n if (!quiet||count) displayMessage("Imported "+count+" tiddler"+(count!=1?"s":"")+" from "+src);\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the Ask panel will still be open... close it now.\n var askpanel=document.getElementById('importAskPanel'); if (askpanel) askpanel.style.display='none'; \n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // gather the statistics\n var count=tiddlers.length;\n var added=0; var replaced=0; var renamed=0; var skipped=0; var merged=0;\n for (var t=0; t<count; t++)\n if (tiddlers[t].status)\n {\n if (tiddlers[t].status=='added') added++;\n if (tiddlers[t].status.substr(0,7)=='skipped') skipped++;\n if (tiddlers[t].status.substr(0,6)=='rename') renamed++;\n if (tiddlers[t].status.substr(0,7)=='replace') replaced++;\n if (tiddlers[t].status.substr(0,6)=='merged') merged++;\n }\n var omitted=count-(added+replaced+renamed+skipped+merged);\n // DEBUG alert('stats done: '+count+' total, '+added+' added, '+skipped+' skipped, '+renamed+' renamed, '+replaced+' replaced, '+merged+' merged');\n // skip the report if nothing was imported\n if (added+replaced+renamed+merged==0) return;\n // skip the report if not desired by user\n if (!config.options.chkImportReport) {\n // reset status flags\n for (var t=0; t<count; t++) config.macros.importTiddlers.inbound[t].status="";\n // refresh display since tiddlers have been imported\n store.notifyAll();\n // quick message area summary report\n var msg=(added+replaced+renamed+merged)+' of '+count+' tiddler'+((count!=1)?'s':"");\n msg+=' imported from '+config.macros.importTiddlers.src.replace(/\s\s/g,'/')\n displayMessage(msg);\n return;\n }\n // create the report tiddler (if not already present)\n var tiddler = store.getTiddler('ImportedTiddlers');\n if (!tiddler) // create new report tiddler if it doesn't exist\n {\n tiddler = new Tiddler();\n tiddler.title = 'ImportedTiddlers';\n tiddler.text = "";\n }\n // format the report header\n var now = new Date();\n var newText = "";\n newText += "On "+now.toLocaleString()+", "+config.options.txtUserName+" imported tiddlers from\sn";\n newText += "[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n newText += "<"+"<"+"<\sn";\n newText += "Out of "+count+" tiddler"+((count!=1)?"s ":" ")+" in {{{"+config.macros.importTiddlers.src.replace(/\s\s/g,'/')+"}}}:\sn";\n if (added+renamed>0)\n newText += (added+renamed)+" new tiddler"+(((added+renamed)!=1)?"s were":" was")+" added to your document.\sn";\n if (merged>0)\n newText += merged+" tiddler"+((merged!=1)?"s were":" was")+" merged with "+((merged!=1)?"":"an ")+"existing tiddler"+((merged!=1)?"s":"")+".\sn"; \n if (replaced>0)\n newText += replaced+" existing tiddler"+((replaced!=1)?"s were":" was")+" replaced.\sn"; \n if (skipped>0)\n newText += skipped+" tiddler"+((skipped!=1)?"s were":" was")+" skipped after asking.\sn"; \n if (omitted>0)\n newText += omitted+" tiddler"+((omitted!=1)?"s":"")+((omitted!=1)?" were":" was")+" not imported.\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n // output the tiddler detail and reset status flags\n for (var t=0; t<count; t++)\n if (tiddlers[t].status!="")\n {\n newText += "#["+"["+tiddlers[t].title+"]"+"]";\n newText += ((tiddlers[t].status!="added")?("^^\sn"+tiddlers[t].status+"^^"):"")+"\sn";\n config.macros.importTiddlers.inbound[t].status="";\n }\n newText += "<"+"<"+"<\sn";\n // output 'discard report' link\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+tiddler.title+"'); store.deleteTiddler('"+tiddler.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n tiddler.text = newText+((tiddler.text!="")?'\sn----\sn':"")+tiddler.text;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n store.addTiddler(tiddler);\n if (!quiet) story.displayTiddler(null,"ImportedTiddlers",1,null,null,false);\n story.refreshTiddler("ImportedTiddlers",1,true);\n // refresh the display\n store.notifyAll();\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS, register for notification\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n store.addNotification(null,refreshImportList); // refresh listbox after every tiddler change\n refreshImportList();\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n padding: 0.5em; margin:0em; text-align:left; font-size: 8pt;\s\n background-color: #eee; color:#000000; \s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px; -moz-border-radius:1em;\s\n}\s\n#importPanel a { color:#009; }\s\n#importPanel input { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel select { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importAskPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML\n//{{{\nconfig.macros.importTiddlers.html = '\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n import from source document\s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <input type=checkbox id="chkImportReport" checked style="height:1em; width:auto"\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;">create a report\s\n</span>\s\n<input type="file" id="fileImportSource" size=56\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</span>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox id="chkAddTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox id="chkImportTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox id="chkKeepTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importAskPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theAskPanel = document.getElementById('importAskPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadImportFile(config.macros.importTiddlers.src,"all",null,null,function(src,filter,quiet,ask){window.refreshImportList(0);});\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: [['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theImported.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (theImported.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (theImported.status.substr(0,7)!="replace") && (theImported.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=theImported.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n theImported.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n theImported.status=(theImported.status=="")?'added':theImported.status;\n // do the import!\n store.addTiddler(theImported);\n store.setDirty(true);\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the ask panel and set the title edit field\n document.getElementById('importAskPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n
/***\n|''Name:''|AccordionMenuPlugin|\n|''Description:''|Turn an unordered list into an accordion style menu|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#AccordionMenuPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.0|\n|''Date:''|03/11/2007|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.5|\n!!Usage:\n* put {{{<<accordion>>}}} on the line after your unordered list\n\n!!Customizing:\n* customize the css via the shadow tiddler StyleSheetAccordionMenuPlugin\n* or give the list a custom class by passing the classes as parameters to the macro.\n** Eg: {{{<<accordion ClassName1 ClassName2>>}}}\n\n!!Examples:\n*[[AccordionMenuPluginDemo]]\n\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\nconfig.macros.accordion={\n dropchar : " \su00BB",\n handler : function(place,macroName,params,wikifier,paramString,tiddler){\n list = findRelated(place.lastChild,"UL","tagName","previousSibling");\n if (!list)\n return;\n addClass(list,"accordion");\n if (params.length){\n addClass(list,paramString);\n }\n this.fixLinks(list.childNodes); \n },\n\n fixLinks : function(els){\n for (var i=0; i<els.length; i++){\n if(els[i].tagName.toLowerCase()=="li"){\n var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");\n if(!link){\n var ih = els[i].firstChild.data;\n els[i].removeChild(els[i].firstChild);\n link = createTiddlyElement(null,"a",null,null,ih+this.dropchar,{href:"javascript:;"});\n els[i].insertBefore(link,els[i].firstChild);\n }\n else{\n link.firstChild.data = link.firstChild.data + this.dropchar;\n removeClass(link,"tiddlyLinkNonExisting");\n }\n link.onclick = this.show;\n }\n }\n },\n \n show : function(e){\n var list = this.parentNode.parentNode;\n var els = list.childNodes;\n for (var i=0; i<els.length; i++){\n removeClass(els[i],"accordion-active");\n }\n addClass(this.parentNode,"accordion-active");\n } \n};\n\nconfig.shadowTiddlers["StyleSheetAccordionMenuPlugin"] = "/*{{{*/\sn"+\n "ul.accordion, ul.accordion li, ul.accordion li ul {margin:0; padding:0; list-style-type:none;text-align:left;}\sn"+\n "ul.accordion li ul {display:none;}\sn"+\n "ul.accordion li.accordion-active ul {display:block;}\sn"+\n "\sn"+\n "ul.accordion li.accordion-active a {cursor:default;}\sn"+\n "ul.accordion li.accordion-active ul li a{cursor:pointer;}\sn"+\n "\sn"+\n "ul.accordion a {display:block; padding:0.5em;}\sn"+\n "ul.accordion li a.tiddlyLink, ul.accordion li a.tiddlyLinkNonExisting, ul.accordion li a {font-weight:bold;}\sn"+\n "ul.accordion li a {background:#0066aa; color:#FFF; border-bottom:1px solid #fff;}\sn"+\n "ul.accordion li.accordion-active a, ul.accordion li a:hover {background:#00558F;color:#FFF;}\sn"+\n "\sn"+\n "ul.accordion li ul li{display:inline-block;overflow:hidden;}\sn"+\n "ul.accordion li.accordion-active ul li {background:#eff3fa; color:#000; padding:0em;}\sn"+\n "ul.accordion li.accordion-active ul li div {padding:1em 1.5em; background:#eff3fa;}\sn"+\n "ul.accordion li.accordion-active ul a{background:#eff3fa; color:#000; padding:0.5em 0.5em 0.5em 1.0em;border:none;}\sn"+\n "ul.accordion li.accordion-active ul a:hover {background:#e0e8f5; color:#000;}\sn" +\n "/*}}}*/";\n \n store.addNotification("StyleSheetAccordionMenuPlugin",refreshStyles);\n //!END-PLUGIN-CODE\n// %/
@@display:none;clear:both;@@\n\n''Creating a navigation menu using the AccordionMenuPlugin is as simple as:''\n# writing a two level unordered list using ~TiddlyWiki syntax\n# and placing {{{<<accordion>>}}} on the line after it.\nExample:\n{{{\n* Section 1\n** [[Link1]]\n** [[Link2]]\n** [[Link3]]\n*Section 2\n** [[Link4]]\n** [[Link5]]\n** [[Link6]]\n*Section 3\n**[[Link7]]\n**[[Link8]]\n**[[Link9]]\n<<accordion>>\n}}}\ngives:\n\n* Section 1\n** [[Link1]]\n** [[Link2]]\n** [[Link3]]\n*Section 2\n** [[Link4]]\n** [[Link5]]\n** [[Link6]]\n*Section 3\n**[[Link7]]\n**[[Link8]]\n**[[Link9]]\n<<accordion>>\n\n''The AccordionMenuPlugin was written with navigation menu's in mind but can be put to other uses as well. ''\nBy wrapping the content in a DIV, you can have multi-line content as well. Example:\n{{{\n* [[section1]]\n**{{myclass{\nPraesent posuere sodales tortor. Mauris ut erat non lacus semper porta. Mauris enim. \nPhasellus tempor, metus ut dapibus lobortis, leo magna ornare metus, et pellentesque neque massa eget turpis.\nProin nec tellus. Donec aliquet.\nNullam sed leo bibendum justo rutrum rhoncus.}}}\n* section2\n**{{myclass{\nDonec rhoncus sem eget urna.\nAenean tempor dolor vitae nisi.\nDonec leo urna, placerat porttitor, auctor ut, volutpat a, purus,\nEtiam eu sapien id nulla malesuada scelerisque.\nMaecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}\n* section3\n**{{myclass{\nDonec rhoncus sem eget urna.\nAenean tempor dolor vitae nisi.\nDonec leo urna, placerat porttitor, auctor ut, volutpat a, purus,\nEtiam eu sapien id nulla malesuada scelerisque.\nMaecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}\n}}}\n\ngives you:\n\n* [[section1]]\n**{{myclass{\nPraesent posuere sodales tortor. Mauris ut erat non lacus semper porta. Mauris enim. \nPhasellus tempor, metus ut dapibus lobortis, leo magna ornare metus, et pellentesque neque massa eget turpis.\nProin nec tellus. Donec aliquet.\nNullam sed leo bibendum justo rutrum rhoncus.}}}\n* section2\n**{{myclass{\nDonec rhoncus sem eget urna.\nAenean tempor dolor vitae nisi.\nDonec leo urna, placerat porttitor, auctor ut, volutpat a, purus,\nEtiam eu sapien id nulla malesuada scelerisque.\nMaecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}\n* section3\n**{{myclass{\nDonec rhoncus sem eget urna.\nAenean tempor dolor vitae nisi.\nDonec leo urna, placerat porttitor, auctor ut, volutpat a, purus,\nEtiam eu sapien id nulla malesuada scelerisque.\nMaecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}\n<<accordion>>\n
@@display:none;clear:both;@@\n*Of interest:\n**{{myclass{\n*[[TWFaq at TiddlySpot|http://twfaq.tiddlyspot.com/]] and [[CheatSheet (PDF)|http://nothickmanuals.info/lib/exe/fetch.php/cheatsheets:tiddlywiki_cheatsheet.pdf]]\n*[[Daniel Baird's UserGuide|http://danielbaird.com/tiddlywikiguides/userguide-sample.html#TiddlyWiki User's Guide]]\n*[[TW Resources on TiddlyWiki.org's Wiki|http://www.tiddlywiki.org/wiki/TiddlyWiki_Resources]]\n*[[Jim Barr's fully enhanced TW|http://tiddlywikitips.com/]]\n}}}\n*Advanced:\n**{{myclass{\n*[[Plugin Development|http://tiddlywiki.org/wiki/Plugin_Development]]\n}}}\n*To Be Explored:\n**{{myclass{\n*[["Tiddler Parts" plugin|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin]] by [[Udo Borkowski|http://www.abego-software.de/]] (see also [[list of his plugins|http://tiddlywiki.abego-software.de/#Plugins]])\n*[[FND's DevPad|http://devpad.tiddlyspot.com/]]\n*[[Some useful reference stuff by Jules|http://knighjm.googlepages.com/knightnet-default-tw.html#Reference]] including lists of built-in macros, formatting rules and useful javascript methods for developers.\n*[[Repository for BidiX's TiddlyWiki Extensions|http://tiddlywiki.bidix.info/]]\n*[[Extension Repository|http://tw.lewcid.org/]] from [[LewCid.org|http://lewcid.org/]]\n}}}\n<<accordion>>\n<<tag demo>>
* Section 1\n** [[Link1]]\n** [[Link2]]\n** [[Link3]]\n*Section 2\n** [[Link4]]\n** [[Link5]]\n** [[Link6]]\n*Section 3\n**[[Link7]]\n**[[Link8]]\n**[[Link9]]\n<<accordion>>\n\nMultiLine:\n\n\n* [[section1]]\n**{{myclass{\nPraesent posuere sodales tortor. Mauris ut erat non lacus semper porta. Mauris enim. \nPhasellus tempor, metus ut dapibus lobortis, leo magna ornare metus, et pellentesque neque massa eget turpis.\nProin nec tellus. Donec aliquet.\nNullam sed leo bibendum justo rutrum rhoncus.}}}\n* section2\n**{{myclass{\nDonec rhoncus sem eget urna.\nAenean tempor dolor vitae nisi.\nDonec leo urna, placerat porttitor, auctor ut, volutpat a, purus,\nEtiam eu sapien id nulla malesuada scelerisque.\nMaecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}\n* section3\n**{{myclass{\nDonec rhoncus sem eget urna.\nAenean tempor dolor vitae nisi.\nDonec leo urna, placerat porttitor, auctor ut, volutpat a, purus,\nEtiam eu sapien id nulla malesuada scelerisque.\nMaecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}\n<<accordion>>\n\n<<tag demo>>
/***\n|''Name:''|DropDownMenuPlugin|\n|''Description:''|Create dropdown menus from unordered lists|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#DropDownMenuPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.1|\n|''Date:''|11/04/2007|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.5|\n\n!!Usage:\n* create a two-level unordered list using wiki syntax, and place {{{<<dropMenu>>}}} on the line after it.\n* to create a vertical menu use {{{<<dropMenu vertical>>}}} instead.\n* to assign custom classes to the list, just pass them as parameters to the macro {{{<<dropMenu className1 className2 className3>>}}}\n\n!!Features:\n*Supports just a single level of drop-downs, as anything more usually provides a poor experience for the user.\n* Very light weight, about 1.5kb of JavaScript and 4kb of CSS.\n* Comes with two built in css 'themes', the default horizontal and vertical. \n\n!!Customizing:\n* to customize the appearance of the menu's, you can either add a custom class as described above or, you can edit the CSS via the StyleSheetDropDownMenu shadow tiddler.\n\n!!Examples:\n* [[DropDownMenuDemo]]\n\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\nconfig.macros.dropMenu={\n\n dropdownchar: "\su25bc",\n\n handler : function(place,macroName,params,wikifier,paramString,tiddler){\n list = findRelated(place.lastChild,"UL","tagName","previousSibling");\n if (!list)\n return;\n addClass(list,"suckerfish");\n if (params.length){\n addClass(list,paramString);\n }\n this.fixLinks(list);\n },\n \n fixLinks : function(el){\n var els = el.getElementsByTagName("li");\n for(var i = 0; i < els.length; i++) {\n if(els[i].getElementsByTagName("ul").length>0){\n var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");\n if(!link){\n var ih = els[i].firstChild.data;\n els[i].removeChild(els[i].firstChild);\n var d = createTiddlyElement(null,"a",null,null,ih+this.dropdownchar,{href:"javascript:;"});\n els[i].insertBefore(d,els[i].firstChild);\n }\n else{\n link.firstChild.data = link.firstChild.data + this.dropdownchar;\n removeClass(link,"tiddlyLinkNonExisting");\n }\n }\n els[i].onmouseover = function() {\n addClass(this, "sfhover");\n };\n els[i].onmouseout = function() {\n removeClass(this, "sfhover");\n };\n }\n } \n};\n\nconfig.shadowTiddlers["StyleSheetDropDownMenuPlugin"] = \n "/*{{{*/\sn"+\n "/***** LAYOUT STYLES - DO NOT EDIT! *****/\sn"+\n "ul.suckerfish, ul.suckerfish ul {\sn"+\n " margin: 0;\sn"+\n " padding: 0;\sn"+\n " list-style: none;\sn"+\n " line-height:1.4em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li {\sn"+\n " display: inline-block; \sn"+\n " display: block;\sn"+\n " float: left; \sn"+\n "}\sn\sn"+\n "ul.suckerfish li ul {\sn"+\n " position: absolute;\sn"+\n " left: -999em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li:hover ul, ul.suckerfish li.sfhover ul {\sn"+\n " left: auto;\sn"+\n "}\sn\sn"+\n "ul.suckerfish ul li {\sn"+\n " float: none;\sn"+\n " border-right: 0;\sn"+\n " border-left:0;\sn"+\n "}\sn\sn"+\n "ul.suckerfish a, ul.suckerfish a:hover {\sn"+\n " display: block;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li a.tiddlyLink, ul.suckerfish li a, #mainMenu ul.suckerfish li a {font-weight:bold;}\sn"+\n "/**** END LAYOUT STYLES *****/\sn"+\n "\sn\sn"+\n "/**** COLORS AND APPEARANCE - DEFAULT *****/\sn"+\n "ul.suckerfish li a {\sn"+\n " padding: 0.5em 1.5em;\sn"+\n " color: #FFF;\sn"+\n " background: #0066aa;\sn"+\n " border-bottom: 0;\sn"+\n " font-weight:bold;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li:hover a, ul.suckerfish li.sfhover a{\sn"+\n " background: #00558F;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li:hover ul a, ul.suckerfish li.sfhover ul a{\sn"+\n " color: #000;\sn"+\n " background: #eff3fa;\sn"+\n " border-top:1px solid #FFF;\sn"+\n "}\sn\sn"+\n "ul.suckerfish ul li a:hover {\sn"+\n " background: #e0e8f5;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li a{\sn"+\n " width:9em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish ul li a, ul.suckerfish ul li a:hover{\sn"+\n " display:inline-block;\sn"+\n " width:9em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li {\sn"+\n " border-left: 1px solid #00558F;\sn"+\n "}\sn"+\n "/***** END COLORS AND APPEARANCE - DEFAULT *****/\sn"+\n "\sn\sn"+\n "/***** LAYOUT AND APPEARANCE: VERTICAL *****/\sn"+\n "ul.suckerfish.vertical li{\sn"+\n " width:10em;\sn"+\n " border-left: 0px solid #00558f;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical ul li, ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a {\sn"+\n " border-left: 0.8em solid #00558f;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a, ul.suckerfish.vertical li.sfhover a:hover{\sn"+\n " width:8em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical {\sn"+\n " width:10em; text-align:left;\sn"+\n " float:left;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li a {\sn"+\n " padding: 0.5em 1em 0.5em 1em;\sn"+\n " border-top:1px solid #fff;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical, ul.suckerfish.vertical ul {\sn"+\n " line-height:1.4em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover ul, ul.suckerfish.vertical li.sfhover ul { \sn"+\n " margin: -2.4em 0 0 10.9em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover ul li a, ul.suckerfish.vertical li.sfhover ul li a {\sn"+\n " border: 0px solid #FFF;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a{\sn"+\n " padding-right:1.1em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover ul li, ul.suckerfish.vertical li.sfhover ul li {\sn"+\n " border-bottom:1px solid #fff;\sn"+\n "}\sn\sn"+\n "/***** END LAYOUT AND APPEARANCE: VERTICAL *****/\sn"+\n "/*}}}*/";\nstore.addNotification("StyleSheetDropDownMenuPlugin",refreshStyles);\n//!END-PLUGIN-CODE\n// %/
''horizontal:''\n{{{\n* menu #1\n** [[item #1-1]]\n** [[item #1-2]]\n** [[item #1-3]]\n* menu #2\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n* menu #3\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n<<dropMenu>>\n}}}\n* menu #1\n** [[item #1-1]]\n** [[item #1-2]]\n** [[item #1-3]]\n* menu #2\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n* menu #3\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n<<dropMenu>>\n\n''vertical:''\n{{{\n* menu #1\n** [[item #1-1]]\n** [[item #1-2]]\n** [[item #1-3]]\n* menu #2\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n<<dropMenu vertical>>\n}}}\n\n* menu #1\n** [[item #1-1]]\n** [[item #1-2]]\n** [[item #1-3]]\n* menu #2\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n<<dropMenu vertical>>\n\n\n/% %/
''horizontal:''\n\n* menu #1\n** [[item #1-1]]\n** [[item #1-2]]\n** [[item #1-3]]\n* menu #2\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n* menu #3\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n<<dropMenu>>\n\n''vertical:''\n\n* menu #1\n** [[item #1-1]]\n** [[item #1-2]]\n** [[item #1-3]]\n* menu #2\n** [[item #2-1]]\n** [[item #2-2]]\n** [[menu #2-3]]\n<<dropMenu vertical>>\n\n\n/% %/
/***\n|''Name:''|TiddlerNotesPlugin|\n|''Description:''|Add notes to tiddlers without modifying the original content|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#TiddlerNotesPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.1|\n|''Date:''|26/10/07|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.3|\n\n!!Concept:\n*The TiddlerNotesPlugin allows you to add notes to tiddlers, without needing to edit the original tiddler. This means that your original content will remain unaltered, and if you update it in the future, you won’t lose your notes. Notes are stored in separate tiddlers, but can be viewed and edited from within the original tiddler.\n*For a tiddler titled "~MySlide", the notes are by default saved in a tiddler titled "~MySlide-Notes" and is given a tag of "Notes". The suffix and tags of the notes tiddlers are customizable. You can have one or multiple notes per tiddlers. So it is possible to have for example, teacher's notes and student's notes in the same file.\n*Notes can be configured to start off blank, or pre-filled with the contents of the original tiddler.\n\n!!Usage:\n*{{{<<notes>>}}} is the simplest usage form.\n* additional optional parameters include:\n**{{{heading:}}} the heading to use for the notes box\n**{{{tag:}}} the tag to be given to the notes tiddler\n**{{{suffix:}}} the suffix to be used when naming the notes tiddler\n* a full macro call could look like: {{{<<notes heading:"My Notes" tag:"NoteTiddlers" suffix:"Comments">>}}}\n* To avoid adding {{{<<notes>>}}} to each tiddler you want notes for, you could add the macro call to the ViewTemplate\n** below the line {{{<div class='viewer' macro='view text wikified'></div>}}} add the following line: <br> {{{<div class='viewer' macro='notes'></div>}}}\n** Used in combination with the ~HideWhenPlugin or ~PublisherPlugin, you could have notes be shown only for tiddlers with specific tags. The ~PublisherPlugin would allow you for instance to only have the ~TeachersNotes visible to the teacher, and the ~StudentsNotes for the same tiddler visible to the Student.\n\n!!Configuration\n*<<option chkPrefillNotes>> Enable to pre-fill notes with the original tiddler's contents\n\n!!Demo:\n* [[MySlide]]\n\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\n\nif (!config.options.chkPrefillNotes)\n config.options.chkPrefillNotes = false;\n \nfunction createTiddlyElement(theParent,theElement,theID,theClass,theText,attribs)\n{\n var e = document.createElement(theElement);\n if(theClass != null)\n e.className = theClass;\n if(theID != null)\n e.setAttribute("id",theID);\n if(theText != null)\n e.appendChild(document.createTextNode(theText));\n if(attribs){\n for(var n in attribs){\n e.setAttribute(n,attribs[n]);\n }\n }\n if(theParent != null)\n theParent.appendChild(e);\n return e;\n}\n\nfunction createTiddlyButton(theParent,theText,theTooltip,theAction,theClass,theId,theAccessKey,attribs)\n{\n var theButton = document.createElement("a");\n if(theAction) {\n theButton.onclick = theAction;\n theButton.setAttribute("href","javascript:;");\n }\n if(theTooltip)\n theButton.setAttribute("title",theTooltip);\n if(theText)\n theButton.appendChild(document.createTextNode(theText));\n if(theClass)\n theButton.className = theClass;\n else\n theButton.className = "button";\n if(theId)\n theButton.id = theId;\n if(attribs){\n for(var n in attribs){\n e.setAttribute(n,attribs[n]);\n }\n }\n if(theParent)\n theParent.appendChild(theButton);\n if(theAccessKey)\n theButton.setAttribute("accessKey",theAccessKey);\n return theButton;\n}\n\nconfig.macros.notes={\n \n cancelWarning: "Are you sure you want to abandon changes to your notes for '%0'?",\n editLabel: "edit notes",\n editTitle: "double click to edit",\n saveLabel: "save notes",\n saveTitle: "double click to save",\n cancelLabel: "cancel",\n heading: "Notes",\n suffix: "Notes",\n tag: "Notes",\n \n saveNotes: function(ev){\n e = ev? ev : window.event;\n var theTarget = resolveTarget(e);\n if (theTarget.nodeName.toLowerCase() == "textarea")\n return false;\n var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");\n story.setDirty(title,false);\n var box = document.getElementById("notesContainer"+title);\n var textarea = document.getElementById("notesTextArea"+title);\n if(textarea.getAttribute("oldText")!=textarea.value && !hasClass(theTarget,"cancelNotesButton")){\n var suffix = box.getAttribute("suffix");\n var t = store.getTiddler(title+"-"+suffix);\n store.saveTiddler(title+"-"+suffix,title+"-"+suffix,textarea.value,config.options.txtUserName,new Date(),t?t.tags:box.getAttribute("tag"),t?t.fields:{});\n }\n story.refreshTiddler(title,1,true);\n autoSaveChanges(true);\n return false;\n },\n \n editNotes: function(box,tiddler){\n removeChildren(box);\n story.setDirty(tiddler,true);\n box.title = this.saveTitle;\n box.ondblclick = this.saveNotes;\n createTiddlyButton(box,this.cancelLabel,this.cancelLabel,this.saveNotes,"cancelNotesButton");\n createTiddlyButton(box,this.saveLabel,this.saveLabel,this.saveNotes,"saveNotesButton");\n wikify("!!"+box.getAttribute("heading")+"\sn",box);\n addClass(box,"editor");\n var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");\n var wrapper2 = createTiddlyElement(wrapper1,"div");\n var e = createTiddlyElement(wrapper2,"textarea","notesTextArea"+tiddler);\n var v = store.getValue(tiddler+"-"+box.getAttribute("suffix"),"text");\n if(!v) \n v = config.options.chkPrefillNotes? store.getValue(tiddler,"text"):'';\n e.value = v;\n e.setAttribute("oldText",v);\n var rows = 10;\n var lines = v.match(/\sn/mg);\n var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);\n if(lines != null && lines.length > rows)\n rows = lines.length + 5;\n rows = Math.min(rows,maxLines);\n e.setAttribute("rows",rows);\n box.appendChild(wrapper1);\n },\n \n editNotesButtonOnclick: function(e){\n var title = story.findContainingTiddler(this).getAttribute("tiddler");\n var box = document.getElementById("notesContainer"+title);\n config.macros.notes.editNotes(box,title);\n return false;\n },\n \n ondblclick : function(ev){\n e = ev? ev : window.event;\n var theTarget = resolveTarget(e);\n var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");\n var box = document.getElementById("notesContainer"+title);\n config.macros.notes.editNotes(box,title);\n e.cancelBubble = true;\n if(e.stopPropagation) e.stopPropagation();\n return false;\n },\n \n handler : function(place,macroName,params,wikifier,paramString,tiddler){\n \n params = paramString.parseParams("anon",null,true,false,false);\n var heading = getParam(params,"heading",this.heading);\n var tag = getParam(params,"tag",this.tag);\n var suffix = getParam(params,"suffix",this.suffix);\n var box = createTiddlyElement(place,"div","notesContainer"+tiddler.title,"TiddlerNotes",null,{"source":tiddler.title,params:paramString,heading:heading,tag:tag,suffix:suffix});\n createTiddlyButton(box,this.editLabel,this.editLabel,this.editNotesButtonOnclick,"editNotesButton");\n wikify("!!"+heading+"\sn",box);\n box.title=this.editTitle;\n box.ondblclick = this.ondblclick;\n wikify("<<tiddler [["+tiddler.title+"-"+suffix+"]]>>",box);\n } \n};\n\nStory.prototype.old_notes_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler = function(title,animate,unused){\n if(story.isDirty(title)) {\n if(!confirm(config.macros.notes.cancelWarning.format([title])))\n return false;\n }\n return this.old_notes_closeTiddler.apply(this,arguments);\n}\n\nsetStylesheet(".TiddlerNotes {\sn"+ " background:#eee;\sn"+ " border:1px solid #ccc;\sn"+ " padding:10px;\sn"+ " margin:15px;\sn"+ "}\sn"+ "\sn"+ ".cancelNotesButton,.editNotesButton, .saveNotesButton {\sn"+ " float:right;\sn"+ " border:1px solid #ccc;\sn"+ " padding:2px 5px;\sn"+ "}\sn"+ "\sn"+ ".saveNotesButton{\sn"+ " margin-right:0.5em;\sn"+ "}\sn"+ "\sn"+ ".TiddlerNotes.editor textarea{\sn"+ " border:1px solid #ccc;\sn"+ "}","NotesPluginStyles");\n//!END-PLUGIN-CODE\n// %/\n
Translators and commentators sometimes make it sound as if Machiavelli were talking about something altogether different than the tradition, as if this were just an instance in which one word was being used for entirely different ideas. But then Machiavelli's philosophical point would be lost. Machiavelli is taking the traditional concept of virtue as natural human excellence, with all its teleological baggage, and giving it a partially new content. Excellence for a ruler is not the same thing as excellence for a citizen, and excellence for a ruler involves a willingness to engage in what would otherwise be immoral, unjust conduct, and which still may tarnish the ruler's immortal soul, even if it is necessary in the situation for the safety / glory of the patria. It is not the case that all virtues (= excellences) go together and imply one another, as Socrates optimistically believed. New conception of an old concept, not just homonyms.\n<<notes>>\n\n<<tag demo>>
This allows notes!
<<notes>>
To include another tiddler's contents inside a tiddler, e.g. here's [[subtabB1]]:\n\n<<tiddler "subtabB1">>\n\n<<tag demo>>
*[[Roadmap and known bugs at Hawksworx.com|http://www.hawksworx.com/playground/TeamTasks/roadmap.html]] last modified byPhilHawkswort on 10 March 2008\n*[["Tiddler Parts" plugin|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin]] by [[Udo Borkowski|http://www.abego-software.de/]] (see also [[list of his plugins|http://tiddlywiki.abego-software.de/#Plugins]])\n*[[FND's DevPad|http://devpad.tiddlyspot.com/]]\n*[[Saq's "Tiddly Learning" blog Lewcid.org|http://lewcid.org/]]\n*[[Some useful reference stuff by Jules|http://knighjm.googlepages.com/knightnet-default-tw.html#Reference]] including lists of built-in macros, formatting rules and useful javascript methods for developers.\n*[[Repository for BidiX's TiddlyWiki Extensions|http://tiddlywiki.bidix.info/]]\n*[[Extension Repository|http://tw.lewcid.org/]] from [[LewCid.org|http://lewcid.org/]]\n*[[TiddlyChatter|http://tiddlychatter.tiddlyspot.com/]] at http://tiddlyspot.com/ \n*[[presentation template|http://lewcid.googlepages.com/presentation_empty_full.html]] ([[see it in action|http://lewcid.googlepages.com/tots.html]])\n*[[WebView|http://www.giffmex.org/webviewtwexample.html]] (gotta luv the editor functions here!).\n
*[[TWFaq|http://twfaq.tiddlyspot.com/]] and [[elaborate help|http://tiddlyspot.com/twhelp/]] at [[TiddlySpot.com|http://tiddlyspot.com/]]\n*[[CheatSheet (PDF)|http://nothickmanuals.info/lib/exe/fetch.php/cheatsheets:tiddlywiki_cheatsheet.pdf]]\n*[[Daniel Baird's UserGuide|http://danielbaird.com/tiddlywikiguides/userguide-sample.html#TiddlyWiki User's Guide]]\n*[[TW Resources on TiddlyWiki.org's Wiki|http://www.tiddlywiki.org/wiki/TiddlyWiki_Resources]]\n*[[Jim Barr's fully enhanced TW|http://tiddlywikitips.com/]]\n*[[TW for the Rest of Us|http://giffmex.org/twfortherestofus.html]]\n\nFrom [[JeremyRuston's "Getting Started" at TiddlyWiki.com|http://www.tiddlywiki.com/#GettingStarted]]:\n----\nThere is an extensive [[Community]] [[documentation wiki|http://www.tiddlywiki.org/]], including an invaluable [[FAQ|http://www.tiddlywiki.org/wiki/TiddlyWiki_FAQ]]. Other useful guides include:\n* Jeremy Wagstaff's [[The Power of Tiddly|http://www.loosewireblog.com/2007/11/the-power-of-ti.html]]\n* Dave Gifford's [[TiddlyWiki for the Rest of Us|http://www.giffmex.org/twfortherestofus.html]] and his [[slideshow introduction|http://www.giffmex.org/blog/?p=23]]\n* Morris Gray's [[TW Help - TiddlyWiki help file for beginners|http://tiddlyspot.com/twhelp/]]\n* Dmitri Popov's [[TiddlyWiki quick reference card|http://nothickmanuals.info/doku.php/cheatsheets]]\n* Screencasts from [[JimVentola|http://faculty.massasoit.mass.edu/jventola/videocasts/tidhelp2/tidhelp2.html]] and [[LeonKilat|http://max.limpag.com/2006/09/07/using-a-tiddlywiki-a-video-guide/]].\n\n----\n\n<<tag resources>>
*[[Plugin Development|http://tiddlywiki.org/wiki/Plugin_Development]]\n*[[Bookmarklets|http://lewcid.org/tiddlywiki-bookmarklets/]]\n*[[For advanced users: Customize your TW experience|http://giffmex.org/twfortherestofus.html#For advanced users: Customize your TW experience]] at [[TW for the Rest of Us|http://giffmex.org/twfortherestofus.html]]\n* [[TiddlyVault index of extensions from Giffmex.org|http://tiddlyvault.tiddlyspot.com/]]
Setting up your own server would require\n*internet connection\n*[[HTTP server|http://httpd.apache.org]]\n*[[PHP4/5|http://php.net]]\n*[[MySQL|http://mysql.com]]\n\n''Benefit''\n*no cash required apart from your internet connection\n*Database is kept private\n*No advertising\n\n''Issues''\n*Spending time to maintain the server (such as learn to set one up, keep server up to date)\n*Require a domain (you can get them free from [[here|http://no-ip.com]]\n*Security\n*Uptime (if your internet connection is down at home, you wont be able to access it at work)\n*Computer switch on all the time (hidden cost in electricity)\n\nsee [[Installing on lycos]] for some configuration data\n\n<<tag requirements>>
If you want to renting webspace, you will need access to\n*~PHP4/5\n*~MySQL\n\n''Benefit''\n*Uptime (depending on your provider)\n*Saves time from maintaining server\n*No advertising\n\n''Issues''\n*Database is "not as private" since your provider now have access to it\n*Cost a bit of money, but they are relatively cheap nowadays\n*Need to get a domain\n\n<<tag requirements>>
See also ChrisCookbook\n\nRipped off from [[Chris' TechnicalOverview|http://peermore.com:8080/recipes/AutoTiddlyWeb/tiddlers.wiki#TiddlyWebTechnicalOverview]]\n----\n\nTiddlyWeb is written using version 2.5 of [[Python]].\n\nIts basic architecture is strongly based on [[Joe Gregorio]]'s [[Robaccia]] toy framework, meaning: TiddlyWeb is a [[WSGI]] application that uses [[Selector]] to dispatch a small number of URLs to simple functions in simple modules that satisfy the request.\n\nThe TiddlyWeb UrlMap maps URLs to code.\n\nThere are three primary entities operating in the TiddlyWeb system:\n\n* [[Recipe]]s\n* [[Bag]]s\n* [[Tiddler]]s\n\nThese are represented in code by very simple classes. Recipe, Bag and Tiddler objects have no methods, only attributes. Other modules use the objects in concert with other modules to perform required actions. These other modules can be divided into sets:\n\n* WebHandlers\n* [[Store]]s\n* [[Serializer]]s\n* [[Control]]\n* [[Filter]]s\n* [[WSGI Middleware]]\n\nThe UrlMap dispatches requests to WebHandlers. The WebHandlers instantiate Recipe, Bag and Tiddler objects and then get them from or put them to [[Store]]s. When the request requires some form of output, a [[Serializer]] is used to transform the object to the required form. A bastardized form of [Content Negotiation] is done to select which Serializer to use.\n\nThere are some notes on [[AUTH]] and [[REVISIONS]].\n\nMore to come.\n----\n\nAnd //that//, as they say, //is ''that''!//\n\n<<tag history>>
*sigh* I click [[New Journal]] and the one I've been working on all day opens.\nCan't have that sorta core dysfunction.\nCan't.\n~CannotRPTnot.\n\n*sigh*\n\n\n<<tag journal>>
Posted to [[the TW Dev google group|http://groups.google.com/group/TiddlyWikiDev]] ... I had in mind such as [[The "TiddlyVault" index of extensions|http://tiddlyvault.tiddlyspot.com/"]] and [[TiddlyWiki in Action|http://giffmex.tiddlyspot.com/]]\n----\n\nAs you can see by http://wiki.osmosoft.com/alpha/pardelib#Resources and my Journals there I've been spidering quite a bit.\nWhen I come across something like the editor function in http://www.giffmex.org/webviewtwexample.html the fact that Import is of limited scope really hammers me in the head.\n\nSo thinking, I pondered how we might "sync" plugins / templates etc.\nOf course ginsu / cook / recipes came to mind.\n\nAnecdotally, ExtJS allows the download of a customized build.\nWith that in mind an RFE came to mind.\n\nA repository where ~TWs could be built from scratch using the groups aggregated resources. (Have any of you come across "Puppet"? "Make, on steroids" is how one wag described it.)\n\nFor e.g. I uploade the empty.html's that I've collected.\nThose go into a directory and get ginsu'd.\nA menu is generated.\nI select from that collection and the chimera is produced, for me to download. \nHeck, I can imagine an Import that would allow me to drag in Tiddlers from whatever ~TWs I've loaded!\n\nApologies if this is madly impractical.\n\ncheers\n[[--bentrem|http://twitter.com/bentrem/]]\n----\n\n<<tag blurt>>
From [[ChrisDent/experimental/TiddlyWeb/COOKBOOK|http://trac.tiddlywiki.org/browser/Trunk/contributors/ChrisDent/experimental/TiddlyWeb/COOKBOOK]]\n(Thanks to [[Jeremy Ruston for his reply to my "CordonBlue" suggestion in google group|http://groups.google.com/group/TiddlyWikiDev/browse_thread/thread/6562d68583b31eb7]].)\n\n\n----\n>Document a COOKBOOK for getting starting with TiddlyWeb. A fairly long and involved tutorial to cover the basics of making things go.\n>This was just rolled out, and is not my area of expertise so I would very much welcome tweaks from others. \n----
includes = 0.024s\nget all tiddlers = 0.043s\nbefore print tiddly = 4.716s\nafter print tiddly = 5.934s\nend of script = 5.934s\n