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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 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:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding: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 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin: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;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

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

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

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
/***\n|''Name:''|abego.IncludePlugin|\n|''Version:''|1.0.1 (2007-04-30)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IncludePlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IncludePlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]]|\n|''Community:''|([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin]]) ([[Support|http://groups.google.com/group/TiddlyWiki]])|\n|''Copyright:''|&copy; 2007 [[abego Software|http://www.abego-software.de]]|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''~CoreVersion:''|2.1.3|\n|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|\n***/\n/***\nThis plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js]] to get the readable source code.\n***/\n///%\nif(!window.abego){window.abego={};}var invokeLater=function(_1,_2,_3){return abego.invokeLater?abego.invokeLater(_1,_2,_3):setTimeout(_1,_2);};abego.loadFile=function(_4,_5,_6){var _7=function(_8,_9,_a,_b,_c){return _8?_5(_a,_b,_9):_5(undefined,_b,_9,"Error loading %0".format([_b]));};if(_4.search(/^((http(s)?)|(file)):/)!=0){if(_4.search(/^((.\s:\s\s)|(\s\s\s\s)|(\s/))/)==0){_4="file://"+_4;}else{var _d=document.location.toString();var i=_d.lastIndexOf("/");_4=_d.substr(0,i+1)+_4;}_4=_4.replace(/\s\s/mg,"/");}loadRemoteFile(_4,_7,_6);};abego.loadTiddlyWikiStore=function(_f,_10,_11,_12){var _13=function(_14,_15){if(_12){_12(_14,"abego.loadTiddlyWikiStore",_15,_f,_11);}};var _16=function(_17,_18){var _19=_18.indexOf(startSaveArea);var _1a=_18.indexOf("<!--POST-BODY-END--"+">");var _1b=_18.lastIndexOf(endSaveArea,_1a==-1?_18.length:_1a);if((_19==-1)||(_1b==-1)){return config.messages.invalidFileError.format([_f]);}var _1c="<html><body>"+_18.substring(_19,_1b+endSaveArea.length)+"</body></html>";var _1d=document.createElement("iframe");_1d.style.display="none";document.body.appendChild(_1d);var doc=_1d.document;if(_1d.contentDocument){doc=_1d.contentDocument;}else{if(_1d.contentWindow){doc=_1d.contentWindow.document;}}doc.open();doc.writeln(_1c);doc.close();var _1f=doc.getElementById("storeArea");_17.loadFromDiv(_1f,"store");_1d.parentNode.removeChild(_1d);return null;};var _20=function(_21){_13("Error when loading %0".format([_f]),"Failed");_10(undefined,_f,_11,_21);return _21;};var _22=function(_23){_13("Loaded %0".format([_f]),"Done");_10(_23,_f,_11);return null;};var _24=function(_25,_26,_27,_28){if(_25===undefined){_20(_28);return;}_13("Processing %0".format([_f]),"Processing");var _29=config.messages.invalidFileError;config.messages.invalidFileError="The file '%0' does not appear to be a valid TiddlyWiki file";try{var _2a=new TiddlyWiki();var _2b=_16(_2a,_25);if(_2b){_20(_2b);}else{_22(_2a);}}catch(ex){_20(exceptionText(ex));}finally{config.messages.invalidFileError=_29;}};_13("Start loading %0".format([_f]),"Started");abego.loadFile(_f,_24,_11);};(function(){if(abego.TiddlyWikiIncluder){return;}var _2c="waiting";var _2d="loading";var _2e=1000;var _2f=-200;var _30=-100;var _31=-300;var _32;var _33=[];var _34={};var _35=[];var _36;var _37=[];var _38;var _39=function(){if(_32===undefined){_32=config.options.chkUseInclude===undefined||config.options.chkUseInclude;}return _32;};var _3a=function(url){return "No include specified for %0".format([url]);};var _3c=function(){var _3d=_35;_35=[];if(_3d.length){for(var i=0;i<_37.length;i++){_37[i](_3d);}}};var _3f;var _40=function(){if(_36!==undefined){clearInterval(_36);}_3f=0;var _41=function(){abego.TiddlyWikiIncluder.sendProgress("","","Done");};_36=setInterval(function(){_3f++;if(_3f<=10){return;}clearInterval(_36);_36=undefined;abego.TiddlyWikiIncluder.sendProgress("Refreshing...","","");refreshDisplay();invokeLater(_41,0,_2f);},1);};var _42=function(_43){var _44;for(var i=0;i<_33.length;i++){var _46=abego.TiddlyWikiIncluder.getStore(_33[i]);if(_46&&(_44=_43(_46,_33[i]))){return _44;}}};var _47=function(){if(!window.store){return invokeLater(_47,100);}var _48=store.fetchTiddler;store.fetchTiddler=function(_49){var t=_48.apply(this,arguments);if(t){return t;}if(config.shadowTiddlers[_49]!==undefined){return undefined;}if(_49==config.macros.newTiddler.title){return undefined;}return _42(function(_4b,url){var t=_4b.fetchTiddler(_49);if(t){t.includeURL=url;}return t;});};if(_33.length){_40();}};var _4e=function(){if(!window.store){return invokeLater(_4e,100);}var _4f=store.getTiddlerText("IncludeList");if(_4f){wikify(_4f,document.createElement("div"));}};var _50=function(_51){var _52=function(){var _53=store.forEachTiddler;var _54=function(_55){var _56={};var _57;var _58=function(_59,_5a){if(_56[_59]){return;}_56[_59]=1;if(_57){_5a.includeURL=_57;}_55.apply(this,arguments);};_53.call(store,_58);for(var n in config.shadowTiddlers){_56[n]=1;}_56[config.macros.newTiddler.title]=1;_42(function(_5c,url){_57=url;_5c.forEachTiddler(_58);});};store.forEachTiddler=_54;try{return _51.apply(this,arguments);}finally{store.forEachTiddler=_53;}};return _52;};var _5e=function(_5f,_60){return _5f[_60]=_50(_5f[_60]);};abego.TiddlyWikiIncluder={};abego.TiddlyWikiIncluder.setProgressFunction=function(_61){_38=_61;};abego.TiddlyWikiIncluder.getProgressFunction=function(_62){return _38;};abego.TiddlyWikiIncluder.sendProgress=function(_63,_64,_65){if(_38){_38.apply(this,arguments);}};abego.TiddlyWikiIncluder.onError=function(url,_67){displayMessage("Error when including '%0':\sn%1".format([url,_67]));};abego.TiddlyWikiIncluder.hasPendingIncludes=function(){for(var i=0;i<_33.length;i++){var _69=abego.TiddlyWikiIncluder.getState(_33[i]);if(_69==_2c||_69==_2d){return true;}}return false;};abego.TiddlyWikiIncluder.getIncludes=function(){return _33.slice();};abego.TiddlyWikiIncluder.getState=function(url){var s=_34[url];if(!s){return _3a(url);}return typeof s=="string"?s:null;};abego.TiddlyWikiIncluder.getStore=function(url){var s=_34[url];if(!s){return _3a(url);}return s instanceof TiddlyWiki?s:null;};abego.TiddlyWikiIncluder.include=function(url,_6f){if(!_39()||_34[url]){return;}var _70=this;_33.push(url);_34[url]=_2c;var _71=function(_72,_73,_74,_75){if(_72===undefined){_34[url]=_75;_70.onError(url,_75);return;}_34[url]=_72;_35.push(url);invokeLater(_3c);};var _76=function(){_34[url]=_2d;abego.loadTiddlyWikiStore(url,_71,null,_38);};if(_6f){invokeLater(_76,_6f);}else{_76();}};abego.TiddlyWikiIncluder.forReallyEachTiddler=function(_77){var _78=function(){store.forEachTiddler(_77);};_50(_78).call(store);};abego.TiddlyWikiIncluder.getFunctionUsingForReallyEachTiddler=_50;abego.TiddlyWikiIncluder.useForReallyEachTiddler=_5e;abego.TiddlyWikiIncluder.addListener=function(_79){_37.push(_79);};abego.TiddlyWikiIncluder.addListener(_40);if(config.options.chkUseInclude===undefined){config.options.chkUseInclude=true;}config.shadowTiddlers.AdvancedOptions+="\sn<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])\sn^^(Reload this ~TiddlyWiki to make changes become effective)^^";config.shadowTiddlers.IncludeState="<<includeState>>";var _7a=function(e,_7c,_7d){if(!anim||!abego.ShowAnimation){e.style.display=_7c?"block":"none";return;}anim.startAnimating(new abego.ShowAnimation(e,_7c,_7d));};abego.TiddlyWikiIncluder.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\sn"+"background-color:#FFCC00;\sn"+"position:absolute;\sn"+"right:0.2em;\sn"+"top:0.2em;\sn"+"width:7em;\sn"+"padding-left:0.2em;\sn"+"padding-right:0.2em\sn"+"}\sn","abegoInclude");var _7e=function(){var e=document.createElement("div");e.className="includeProgressState";e.style.display="none";document.body.appendChild(e);return e;};var _80=_7e();var _81=function(_82){removeChildren(_80);createTiddlyText(_80,_82);_7a(_80,true,0);};var _83=function(){invokeLater(function(){_7a(_80,false,_2e);},100,_30);};var _84=function(_85,_86,_87,url,_89){if(_87=="Done"||_87=="Failed"){_83();return;}if(_86=="abego.loadTiddlyWikiStore"){_3f=0;if(_87=="Processing"){_81("Including...");}}else{_81(_85);}};return _84;};abego.TiddlyWikiIncluder.setProgressFunction(abego.TiddlyWikiIncluder.getDefaultProgressFunction());config.macros.include={};config.macros.include.handler=function(_8a,_8b,_8c,_8d,_8e,_8f){_8c=_8e.parseParams("url",null,true,false,true);var _90=parseInt(getParam(_8c,"delay","0"));var _91=_8c[0]["url"];var _92=getFlag(_8c,"hide",false);if(!_92){createTiddlyText(createTiddlyElement(_8a,"code"),_8d.source.substring(_8d.matchStart,_8d.nextMatch));}for(var i=0;_91&&i<_91.length;i++){abego.TiddlyWikiIncluder.include(_91[i],_90);}};config.macros.includeState={};config.macros.includeState.handler=function(_94,_95,_96,_97,_98,_99){var _9a=function(){var s="";var _9c=abego.TiddlyWikiIncluder.getIncludes();if(!_9c.length){return "{{noIncludes{\snNo includes or 'include' is disabled (see AdvancedOptions)\sn}}}\sn";}s+="|!Address|!State|\sn";for(var i=0;i<_9c.length;i++){var inc=_9c[i];s+="|{{{"+inc+"}}}|";var t=abego.TiddlyWikiIncluder.getState(inc);s+=t?"{{{"+t+"}}}":"included";s+="|\sn";}s+="|includeState|k\sn";return s;};var _a0=function(){removeChildren(div);wikify(_9a(),div);if(abego.TiddlyWikiIncluder.hasPendingIncludes()){invokeLater(_a0,500,_31);}};var div=createTiddlyElement(_94,"div");invokeLater(_a0,0,_31);};var _a2=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return _a2.apply(this,arguments)||this.isIncluded();};Tiddler.prototype.isIncluded=function(){return this.includeURL!=undefined;};Tiddler.prototype.getIncludeURL=function(){return this.includeURL;};var _a3={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1};for(var n in _a3){_5e(TiddlyWiki.prototype,n);}var _a5=function(){if(abego.IntelliTagger){_5e(abego.IntelliTagger,"assistTagging");}};var _a6=function(){if(config.macros.forEachTiddler){_5e(config.macros.forEachTiddler,"findTiddlers");}};_47();invokeLater(_4e,100);invokeLater(_a5,100);invokeLater(_a6,100);})();\n//%/\n
{{{find . -type d -exec chmod 755 {} \s;}}}\n\nThis will recursively search your directory tree (starting at dir 'dot') and chmod 755 all directories only.\n\nSimilarly, the following will chmod all files only (and ignore the directories):\n\n{{{find . -type f -exec chmod 644 {} \s;}}}
Sitting on the river bank, nothing coming down,\nI don't know why I don't move on, out of this ol' town.\nSnow's a-falling in the street. The winter's setting in.\nThe years and changes say to me, “You can't go home again.\n\nCHO: So sing me a song that's not too long. Take me home tonight,\nTill around the bend, I see again, the ridge road gravel and the coal oil light.\n\nI heard it on my radio, bad times all around.\nTell me something I don't know. A change could help out now.\nLooking for a good-time gal, looking for a friend,\nMourning for those good ol' days I thought would never end. CHO.\n\nWritten by Norman Blake.
http://www.ctmuseumquest.com\n\nHe's all over Connecticut and has some ideas of places to visit while staying in state.
/***\n|''Name''|SimpleSearchPlugin|\n|''Description''|displays search results as a simple list of matching tiddlers|\n|''Authors''|FND|\n|''Version''|0.4.0|\n|''Status''|stable|\n|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|\n|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|\n|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''Keywords''|search|\n!Revision History\n!!v0.2.0 (2008-08-18)\n* initial release\n!!v0.3.0 (2008-08-19)\n* added Open All button (renders Classic Search option obsolete)\n* sorting by relevance (title matches before content matches)\n!!v0.4.0 (2008-08-26)\n* added tag matching\n!To Do\n* tag matching optional\n* animations for container creation and removal\n* when clicking on search results, do not scroll to the respective tiddler (optional)\n* use template for search results\n!Code\n***/\n//{{{\nif(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once\nversion.extensions.SimpleSearchPlugin = { installed: true };\n\nif(!plugins) { var plugins = {}; }\nplugins.SimpleSearchPlugin = {\n heading: "Search Results",\n containerId: "searchResults",\n btnCloseLabel: "close",\n btnCloseTooltip: "dismiss search results",\n btnCloseId: "search_close",\n btnOpenLabel: "Open all",\n btnOpenTooltip: "open all search results",\n btnOpenId: "search_open",\n \n displayResults: function(matches, query) {\n story.refreshAllTiddlers(true); // update highlighting within story tiddlers\n var el = document.getElementById(this.containerId);\n query = '"""' + query + '"""'; // prevent WikiLinks\n if(el) {\n removeChildren(el);\n } else { //# fallback: use displayArea as parent\n var container = document.getElementById("displayArea");\n el = document.createElement("div");\n el.setAttribute("id", this.containerId);\n el = container.insertBefore(el, container.firstChild);\n }\n var msg = "!" + this.heading + "\sn";\n if(matches.length > 0) {\n msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\sn";\n this.results = [];\n for(var i = 0 ; i < matches.length; i++) {\n this.results.push(matches[i].title);\n msg += "* [[" + matches[i].title + "]]\sn";\n }\n } else {\n msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?\n }\n createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, plugins.SimpleSearchPlugin.closeResults, "button", this.btnCloseId);\n wikify(msg, el);\n if(matches.length > 0) { // XXX: redundant!?\n createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, plugins.SimpleSearchPlugin.openAll, "button", this.btnOpenId);\n }\n },\n\n closeResults: function() {\n var el = document.getElementById(plugins.SimpleSearchPlugin.containerId);\n removeNode(el);\n plugins.SimpleSearchPlugin.results = null;\n highlightHack = null;\n },\n\n openAll: function(ev) {\n story.displayTiddlers(null, plugins.SimpleSearchPlugin.results);\n return false;\n }\n};\n\nconfig.shadowTiddlers.StyleSheetSimpleSearch = "/*{{{*/\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " {\sn" +\n "\stoverflow: auto;\sn" +\n "\stpadding: 5px 1em 10px;\sn" +\n "\stbackground-color: [[ColorPalette::TertiaryPale]];\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " h1 {\sn" +\n "\stmargin-top: 0;\sn" +\n "\stborder: none;\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " ul {\sn" +\n "\stmargin: 0.5em;\sn" +\n "\stpadding-left: 1.5em;\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " .button {\sn" +\n "\stdisplay: block;\sn" +\n "\stborder-color: [[ColorPalette::TertiaryDark]];\sn" +\n "\stpadding: 5px;\sn" +\n "\stbackground-color: [[ColorPalette::TertiaryLight]];\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " .button:hover {\sn" +\n "\stborder-color: [[ColorPalette::SecondaryMid]];\sn" +\n "\stbackground-color: [[ColorPalette::SecondaryLight]];\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.btnCloseId + " {\sn" +\n "\stfloat: right;\sn" +\n "\stmargin: -5px -1em 5px 5px;\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.btnOpenId + " {\sn" +\n "\stfloat: left;\sn" +\n "\stmargin-top: 5px;\sn" +\n "}\sn" +\n "/*}}}*/";\nstore.addNotification("StyleSheetSimpleSearch", refreshStyles);\n\n// override Story.search()\nStory.prototype.search = function(text, useCaseSensitive, useRegExp) {\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack, null, "excludeSearch");\n var q = useRegExp ? "/" : "'";\n plugins.SimpleSearchPlugin.displayResults(matches, q + text + q);\n};\n\n// override TiddlyWiki.search() to sort by relevance\nTiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {\n var candidates = this.reverseLookup("tags", excludeTag, !!match);\n var primary = [];\n var secondary = [];\n var tertiary = [];\n for(var t = 0; t < candidates.length; t++) {\n if(candidates[t].title.search(searchRegExp) != -1) {\n primary.push(candidates[t]);\n } else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) {\n secondary.push(candidates[t]);\n } else if(candidates[t].text.search(searchRegExp) != -1) {\n tertiary.push(candidates[t]);\n }\n }\n var results = primary.concat(secondary).concat(tertiary);\n if(sortField) {\n results.sort(function(a, b) {\n return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);\n });\n }\n return results;\n};\n\n} //# end of "install only once"\n//}}}
http://giffmex.org/twfortherestofus.html\n\nhttp://twhelp.tiddlyspot.com/\n
/%\n!info\n|Name|PaletteMaker|\n|Source|http://www.TiddlyTools.com/#PaletteMaker|\n|Version|1.2.2|\n|Author|Eric Shulman|\n|License|http://www.TiddlyTools.com/#LegalStatements|\n|Type|transclusion|\n|Description|edit/create ColorPalette using interactive grid/list|\nUsage\n<<<\n{{{\n<<tiddler PaletteMaker with: PaletteName GridName noList noGrid allowOther>>\n}}}\n*''~PaletteName'' (default=ColorPalette)<br>specifies a tiddler containing {{{name:value}}} slices that assign names to color values\n*''~GridName'' (default=[[216-color 'web safe' grid|http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors]])<br>specifies a tiddler (or section) that defines a table, where each table cell contains one of:\n**a 3-digit #RGB or 6-digit #RRGGBB color value\n**an [[X11 Color Name|http://en.wikipedia.org/wiki/X11_color_names]]\n**another valid CSS attribute value (see ''allowOther'', below)\n*''noList'' //or// ''noGrid''<br>omits the palette listbox or color grid to provide a more compact layout\n*''allowOther''<br>permit non-color CSS attribute values to be entered/selected, e.g., {{{url('images/somefile.jpg')}}}\n<<<\nNotes:\n<<<\n*{{block{\nYou can use "-" as placeholders for the default values of ''~PaletteName'' and/or ''~GridName'':\n{{{\n<<tiddler PaletteMaker with: - - nogrid>>\n}}}\n}}}\n*{{block{\nThe grid/list are rendered with 'float:left' styles so content that follows will be rendered next to them. To show your content below the grid/list display, embed an //empty// 'tagClear' CSS wrapper after the PaletteMaker:\n{{{\n<<tiddler PaletteMaker ...>>{{tagClear{\n}}} \n}}}\nYou can also customize the default styles contained in [[PaletteMakerStyles]]:\n<<tiddler PaletteMaker##showcode with: styles>>\n}}}\n*The default color grid definition is:<br><<tiddler PaletteMaker##showcode with: colorgrid>>\n<<<\nExamples\n<<<\nEdit ColorPalette (allow non-color values to be entered):\n{{{<<tiddler PaletteMaker with: - - allowOther>>}}}\n<<tiddler PaletteMaker##show with: - - allowOther>>{{tagClear{\n}}}\nCreate/edit NewPalette using a 16-color 'rainbow' and/or shades of gray (no list):\n{{{<<tiddler PaletteMaker with: NewPalette PaletteMaker##grayscale noList>>}}}\n<<tiddler PaletteMaker##show with: NewPalette PaletteMaker##grayscale noList>>\n{{{<<tiddler PaletteMaker with: NewPalette PaletteMaker##rainbow noList>>}}}\n<<tiddler PaletteMaker##show with: NewPalette PaletteMaker##rainbow noList>>\n<<<\n!showcode\n<<tiddler PaletteMaker##out with: {{store.getTiddlerText('PaletteMaker##$1')}}>>\n!out\n{{{\n$1\n}}}\n!end\n\n!colorgrid\n|white || | | | | | |FC0|F90|F60|F30| | | | | | ||FFF|\n|black ||9C0| | | | |C90|FC3|FC6|F96|F63|C30| | | | |C03||EEE|\n|red ||CF0|CF3|330|660|990|CC0|FF0|C93|C63|300|600|900|C00|F00|F36|F03||DDD|\n|orange ||9F0|CF6|9C3|663|993|CC3|FF3|960|930|633|933|C33|F33|C36|F69|F06||CCC|\n|yellow ||6F0|9F6|6C3|690|996|CC6|FF6|963|630|966|C66|F66|903|C39|F6C|F09||BBB|\n|green ||3F0|6F3|390|6C0|9F3|CC9|FF9|C96|C60|C99|F99|F39|C06|906|F3C|F0C||AAA|\n|blue ||0C0|3C0|360|693|9C6|CF9|FFC|FC9|F93|FCC|F9C|C69|936|603|C09|303||999|\n|darkmagenta ||3C3|6C6|0F0|3F3|6F6|9F9|CFC| | | |C9C|969|939|909|636|606||888|\n|violet ||060|363|090|393|696|9C9| | | |FCF|F9F|F6F|F3F|F0F|C6C|C3C||777|\n|darkred ||030|0C3|063|396|6C9|9FC|CFF|39F|9CF|CCF|C9F|96C|639|306|90C|C0C||666|\n|darkorange ||0F3|3F6|093|0C6|3F9|9FF|9CC|06C|69C|99F|99C|93F|60C|609|C3F|C0F||555|\n|gold ||0F6|6F9|3C6|096|6FF|6CC|699|036|369|66F|66C|669|309|93C|C6F|90F||444|\n|darkgreen ||0F9|6FC|3C9|3FF|3CC|399|366|069|039|33F|33C|339|336|63C|96F|60F||333|\n|darkblue ||0FC|3FC|0FF|0CC|099|066|033|39C|36C|00F|00C|009|006|003|63F|30F||222|\n|indigo ||0C9| | | | |09C|3CF|6CF|69F|36F|03C| | | | |30C||111|\n|darkviolet || | | | | | |0CF|09F|06F|03F| | | | | | ||000|\n!grayscale\n|FFF|EEE|DDD|CCC|BBB|AAA|999|888|777|666|555|444|333|222|111|000|\n!rainbow\n|black|white|red|orange|yellow|green|blue|darkmagenta|violet|darkred|darkorange|gold|darkgreen|darkblue|indigo|darkviolet|\n!end\n\n!styles\n/*{{{*/\n.colorgrid table\n { float:left; margin:0 !important; border:0 !important; }\n.colorgrid table, .colorgrid tr, .colorgrid th, .colorgrid tbody\n { color:black; border:0 !important; }\n.colorgrid td\n { height:16px; width:16px; text-align:center; padding:0; line-height:100%; }\n.colorgrid select\n { float:left; margin-left:16px; font-size:80%; height:255px; }\n/*}}}*/\n!end\n\n!code\n<<tiddler {{\nconfig.shadowTiddlers.PaletteMakerStyles=store.getTiddlerText('PaletteMaker##styles');\nsetStylesheet(store.getTiddlerText('PaletteMakerStyles'),'paletteMakerStyles');\nwindow.paletteMaker = {\n getColor: function(t){ if (!t||!t.length) return null;\n var s=document.createElement('span').style;\n try { s.color='#'+t; if (s.color.length) return '#'+t; }\n catch(e) { try{ s.color=t; } catch(e){ return null; } return t; } // IE \n s.color=t; return s.color.length?t:null; // FF\n },\n getTextColor: function(t){ \n t=this.getColor(t);\n if (!t||!t.length||!t.startsWith('#')) return 'black'; // BAD COLOR or X11 COLOR NAME\n var rgb=t.substr(1).split(''); var long=t.length>=6;\n function h2d(h){return '0123456789ABCDEF'.indexOf(h?h.toUpperCase():'');};\n var r=h2d(rgb[0]); var g=h2d(rgb[long?2:1]); var b=h2d(rgb[long?4:2]);\n if (r<0||g<0||b<0||r+g+b>=15) return 'black'; // BAD RGB or BRIGHT COLOR\n return 'white'; // DARK COLOR\n },\n getPalette: function(palette) {\n var pal={};\n var slices=store.calcAllSlices(palette);\n for (var s in slices) {\n var color=slices[s].toUpperCase().replace(/#/,'');\n if (!pal[color]) pal[color]=new Array();\n pal[color].push(s);\n }\n return pal;\n },\n drawGrid: function(place,grid,palette,opts) {\n var pm=window.paletteMaker; // abbrev\n removeChildren(place);\n if (!opts.contains('NOGRID')) wikify(store.getTiddlerText(grid,''),place);\n if (!opts.contains('NOLIST')) var s=pm.drawList(place,\n { palette:palette,min:0,max:0,edit:true,callback:pm.callback,place:place,opts:opts });\n var pal=pm.getPalette(palette);\n var cells=place.getElementsByTagName('td');\n for (var i=0; i<cells.length; i++) { var td=cells[i];\n td.style.border=0;\n var txt=getPlainText(td).trim(); if (!txt.length) continue;\n var c=pm.getColor(txt); if (!c && !opts.contains('ALLOWOTHER')) continue;\n if (c) { td.style.backgroundColor=c; td.innerHTML=''; td.style.fontSize='70%'; }\n td.title=c||txt;\n td.style.cursor=c?'crosshair':'pointer';\n td.params={ palette:palette, min:0, max:15, edit:true, callback:pm.callback,\n place:place, grid:grid, opts:opts, pick:c||txt };\n if (pal[txt.toUpperCase()]) {\n td.params.names=pal[txt.toUpperCase()];\n td.title+='='+td.params.names.join(', ');\n if (c) { td.style.color=pm.getTextColor(c); td.innerHTML='&radic;'; }\n }\n td.onclick=function(ev) { ev=ev||window.event;\n var p=Popup.create(this); if(!p)return false;\n p.className+=' sticky smallform';\n var s=window.paletteMaker.drawList(p,this.params);\n s.style.fontSize='80%'; Popup.show(); s.focus();\n ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation();\n return false;\n };\n }\n },\n drawList: function(here,p) {\n var pm=window.paletteMaker; // abbrev\n var s=createTiddlyElement(here,'select');\n s.params=p;\n s.options[s.length]=new Option(p.palette+':','_view');\n s.options[s.length-1].title='open '+p.palette;\n if (p.edit && p.pick!==undefined) {\n var c=pm.getColor(p.pick);\n s.options[s.length]=new Option('+Add this color...','_add');\n if (c) s.options[s.length-1].style.backgroundColor=c;\n if (c) s.options[s.length-1].style.color=pm.getTextColor(c);\n s.options[s.length-1].title=p.pick;\n }\n var colors=store.calcAllSlices(p.palette);\n for (var x in colors) {\n var c=pm.getColor(colors[x]);\n var prefix=p.names&&p.names.contains(x)?'=':'\sxA0\sxA0';\n s.options[s.length]=new Option(prefix+x,colors[x]);\n if (c) s.options[s.length-1].style.backgroundColor=c;\n if (c) s.options[s.length-1].style.color=pm.getTextColor(c)\n s.options[s.length-1].title=(!c?'other: "':'')+colors[x]+(!c?'"':'');\n }\n s.size=p.min&&s.length<p.min?p.min:p.max&&s.length>p.max?p.max:s.length;\n s.onclick=function(ev){ ev=ev||window.event;\n var name=this.options[this.selectedIndex].text.replace(/[\sxA0=]+/,'').trim();\n if (this.params.callback) this.params.callback(this,name,this.value,this.params);\n return false;\n };\n s.onkeyup=function(ev){ ev=ev||window.event;\n if (ev.keyCode==13) { this.onclick(); Popup.remove(); }\n if (ev.keyCode==27) Popup.remove();\n return false;\n };\n return s;\n },\n callback: function(here,name,val,p){\n var pm=window.paletteMaker; // abbrev\n if (!val.length) return;\n var pick=p.pick!==undefined?p.pick:val;\n if (val=='_view') {\n story.displayTiddler(story.findContainingTiddler(this.place),p.palette);\n Popup.remove();\n return false;\n } else if (val=='_add') {\n var msg='Enter a new name for "'+pick+'"';\n name=prompt(msg,'');\n var slices=store.calcAllSlices(p.palette);\n while (name && slices[name])\n name=prompt('"'+name+'" is already in use\sn'+msg,name);\n } else if (p.edit) {\n var allow=p.opts.contains('ALLOWOTHER');\n var msg='Change "'+name+'" from "'+val+'" to:';\n pick=prompt(msg,pick);\n while (pick && !pm.getColor(pick)) {\n var err='"'+pick+'" is not a recognized color\sn\sxa0';\n if (!allow) err+='Please try again\sn\sn';\n else err+='Press OK to use this value anyway\sn\sn';\n var pre=pick; pick=prompt(err+msg,pick);\n if (pre==pick && allow) break;\n }\n } else {\n // TBD: callback without editing\n Popup.remove(); return false;\n }\n here.selectedIndex=0;\n if (!name||!pick) return false;\n pm.set(p.palette,name.replace(/ /g,''),pick);\n pm.drawGrid(p.place,p.grid,p.palette,p.opts);\n Popup.remove();\n return false;\n },\n set: function(palette,name,newval) {\n var tid=store.getTiddler(palette);\n if (!tid) { var tid=new Tiddler(); tid.text=store.getTiddlerText(palette,''); }\n var oldval=store.getTiddlerSlice(palette,name)||'';\n var pattern="((?:^|\s\sn)(?:[\s\s'\s\s/]{0,2})~?(?:"\n +name.escapeRegExp()\n +")\s\s1\s\s:[\s\st\s\sx20]*)(?:"\n +oldval.escapeRegExp()\n +")([\s\st\s\sx20]*(?:\s\sn|$))";\n var t=tid.text; var match=t.match(new RegExp(pattern));\n if (match) {\n var pos=t.indexOf(match[0]);\n var newText=t.substr(0,pos)+\n match[1]+newval+match[2]+\n t.substr(pos+match[0].length);\n } else { // place new slice at top of list or start of tiddler\n var match=t.match(store.slicesRE);\n var pos=t.indexOf(match?match[0]:'');\n var newText=t.substr(0,pos)\n +name+': '+newval+(t.length?'\sn':'')\n +t.substr(pos);\n }\n var who=config.options.txtUserName; var when=new Date();\n if (config.options.chkForceMinorUpdate)\n { var who=tid.modifier; var when=tid.modified; }\n displayMessage('setting "'+palette+'::'+name+'" to "'+newval+'"');\n store.saveTiddler(palette,palette,newText,who,when,tid.tags,tid.fields);\n story.refreshTiddler(palette,null,true);\n }\n};\n'';}}>>\n!end\n\n!show\n<<tiddler {{\n var opts=[]\n var palette=('$1'!='$'+'1' && '$1'!='-')?'$1':'ColorPalette';\n var grid =('$2'!='$'+'2' && '$2'!='-')?'$2':'PaletteMaker##colorgrid';\n opts.push('$3'.toUpperCase());\n opts.push('$4'.toUpperCase());\n opts.push('$5'.toUpperCase());\n if (!place.lastChild||!hasClass(place.lastChild,'colorgrid')) {\n var wrapper=createTiddlyElement(place,'span',null,'colorgrid');\n window.paletteMaker.drawGrid(wrapper,grid,palette,opts);\n }\n'';}}>>\n!end\n\n%/<<tiddler PaletteMaker##code>>/%\n%/<<tiddler {{var src='PaletteMaker'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}\n with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]]>>
/***\n|Name:|HideWhenPlugin|\n|Description:|Allows conditional inclusion/exclusion in templates|\n|Version:|3.1 ($Rev: 3919 $)|\n|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|\n|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|\n|Author:|Simon Baird <simon.baird@gmail.com>|\n|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|\nFor use in ViewTemplate and EditTemplate. Example usage:\n{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.hideWhenLastTest = false;\n\nwindow.removeElementWhen = function(test,place) {\n window.hideWhenLastTest = test;\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }},\n\n hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.title == params[0], place);\n }},\n\n showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.title != params[0], place);\n }},\n\n 'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !window.hideWhenLastTest, place);\n }}\n\n});\n\n//}}}\n
[[Pinedale|http://en.wikipedia.org/wiki/Pinedale,_Wyoming]]
<<tiddler PaletteMaker with: - - >>
Steven Downes at http://www.downes.ca/post/38526 has some good ideas about how to write a web post.
[img[http://graphics8.nytimes.com/images/2009/07/09/business/econgraphic3.jpg]]
//25 kilowatt hours--the equivalent of what a home consumes in a day.//\n\nCL&P Rate: .16763 x 850 kwh = $142.48 \n\nWe're using more than this.
[img[http://www.lwtf.org/Invasives.jpg]]\n\nfrom [[Lake Waramaug Task Force Website|http://www.lwtf.org/news.html]]\n\n<html>\n<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;q=Lake+Waramaug,+Litchfield,+Connecticut+06777&amp;sll=37.0625,-95.677068&amp;sspn=32.66491,55.195312&amp;ie=UTF8&amp;cd=1&amp;geocode=FUNFfAIdVpug-w&amp;split=0&amp;ll=41.706177,-73.356314&amp;spn=0.030055,0.053902&amp;t=p&amp;z=14&amp;output=embed"></iframe><br /><small><a href="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;q=Lake+Waramaug,+Litchfield,+Connecticut+06777&amp;sll=37.0625,-95.677068&amp;sspn=32.66491,55.195312&amp;ie=UTF8&amp;cd=1&amp;geocode=FUNFfAIdVpug-w&amp;split=0&amp;ll=41.706177,-73.356314&amp;spn=0.030055,0.053902&amp;t=p&amp;z=14" style="color:#0000FF;text-align:left">View Larger Map</a></small></html>
HEX: #423B36 RGB: 66,59,54\nHEX: #4E5756 RGB: 78,87,86\nHEX: #6F755B RGB: 111,117,91\nHEX: #B59F5C RGB: 181,159,92\nHEX: #E89856 RGB: 232,152,86\n<html>\n<div style="background-color: #423B36; color: white;">Color 1</div>\n<div style="background-color: #4E5756; color: white">Color 2</div>\n<div style="background-color: #6F755B; color: white">Color 3</div>\n<div style="background-color: #B59F5C; color: white">Color 4</div>\n<div style="background-color: #E89856; color: white">Color 5</div>\n</html>
/***\n|''Name:''|~TaggerPlugin|\n|''Version:''|1.0.1 (2006-06-01)|\n|''Source:''|http://tw.lewcid.org//#TaggerPlugin|\n|''Author:''|SaqImtiaz|\n|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|\n|''Documentation:''|[[TaggerPluginDocumentation]]|\n|''Source Code:''|[[TaggerPluginSource]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n***/\n// /%\nconfig.tagger={defaults:{label:"Tags: ",tooltip:"Manage tiddler tags",taglist:"true",excludeTags:"",notags:"tiddler has no tags",aretags:"current tiddler tags:",toggletext:"add tags:"}};config.macros.tagger={};config.macros.tagger.arrow=(document.all?"â–Œ":"▪");config.macros.tagger.handler=function(_1,_2,_3,_4,_5,_6){var _7=config.tagger.defaults;var _8=_5.parseParams("tagman",null,true);var _9=((_8[0].label)&&(_8[0].label[0])!=".")?_8[0].label[0]+this.arrow:_7.label+this.arrow;var _a=((_8[0].tooltip)&&(_8[0].tooltip[0])!=".")?_8[0].tooltip[0]:_7.tooltip;var _b=((_8[0].taglist)&&(_8[0].taglist[0])!=".")?_8[0].taglist[0]:_7.taglist;var _c=((_8[0].exclude)&&(_8[0].exclude[0])!=".")?(_8[0].exclude[0]).readBracketedList():_7.excludeTags.readBracketedList();if((_8[0].source)&&(_8[0].source[0])!="."){var _d=_8[0].source[0];}if(_d&&!store.getTiddler(_d)){return false;}var _e=function(e){if(!e){var e=window.event;}var _11=Popup.create(this);var _12=store.getTags();var _13=new Array();for(var i=0;i<_12.length;i++){_13.push(_12[i][0]);}if(_d){var _15=store.getTiddler(_d);_13=_15.tags.sort();}var _16=_6.tags.sort();var _17=function(_18,_19,_1a){var sp=createTiddlyElement(createTiddlyElement(_11,"li"),"span",null,"tagger");var _1c=createTiddlyButton(sp,_18,_1a+" '"+_19+"'",taggerOnToggle,"button","toggleButton");_1c.setAttribute("tiddler",_6.title);_1c.setAttribute("tag",_19);insertSpacer(sp);if(window.createTagButton_orig_mptw){createTagButton_orig_mptw(sp,_19)}else{createTagButton(sp,_19);}};createTiddlyElement(_11,"li",null,"listTitle",(_6.tags.length==0?_7.notags:_7.aretags));for(var t=0;t<_16.length;t++){_17("[x]",_16[t],"remove tag ");}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");if(_b!="false"){createTiddlyElement(_11,"li",null,"listTitle",_7.toggletext);for(var i=0;i<_13.length;i++){if(!_6.tags.contains(_13[i])&&!_c.contains(_13[i])){_17("[ ]",_13[i],"add tag ");}}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");}var _1f=createTiddlyButton(createTiddlyElement(_11,"li"),("Create new tag"),null,taggerOnToggle);_1f.setAttribute("tiddler",_6.title);if(_d){_1f.setAttribute("source",_d);}Popup.show(_11,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};createTiddlyButton(_1,_9,_a,_e,"button","taggerDrpBtn");};window.taggerOnToggle=function(e){var tag=this.getAttribute("tag");var _22=this.getAttribute("tiddler");var _23=store.getTiddler(_22);if(!tag){var _24=prompt("Enter new tag:","");if(_24!=""&&_24!=null){var tag=_24;if(this.getAttribute("source")){var _26=store.getTiddler(this.getAttribute("source"));_26.tags.pushUnique(_24);}}else{return false;}}if(!_23||!_23.tags){store.saveTiddler(_22,_22,"",config.options.txtUserName,new Date(),tag);}else{if(_23.tags.find(tag)==null){_23.tags.push(tag);}else{if(!_24){_23.tags.splice(_23.tags.find(tag),1);}}store.saveTiddler(_23.title,_23.title,_23.text,_23.modifier,_23.modified,_23.tags);}story.refreshTiddler(_22,null,true);if(config.options.chkAutoSave){saveChanges();}return false;};setStylesheet(".tagger a.button {font-weight: bold;display:inline; padding:0px;}\sn"+".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\sn"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+".popup .listTitle {color:#000;}\sn"+"","TaggerStyles");window.lewcidTiddlerSwapTag=function(_27,_28,_29){for(var i=0;i<_27.tags.length;i++){if(_27.tags[i]==_28){_27.tags[i]=_29;return true;}}return false;};window.lewcidRenameTag=function(e){var tag=this.getAttribute("tag");var _2d=prompt("Rename tag '"+tag+"' to:",tag);if((_2d==tag)||(_2d==null)){return false;}if(store.tiddlerExists(_2d)){if(confirm(config.messages.overwriteWarning.format([_2d.toString()]))){story.closeTiddler(_2d,false,false);}else{return null;}}tagged=store.getTaggedTiddlers(tag);if(tagged.length!=0){for(var j=0;j<tagged.length;j++){lewcidTiddlerSwapTag(tagged[j],tag,_2d);}}if(store.tiddlerExists(tag)){store.saveTiddler(tag,_2d);}if(document.getElementById("tiddler"+tag)){var _2f=document.getElementById(story.idPrefix+tag);var _30=story.positionTiddler(_2f);var _31=document.getElementById(story.container);story.closeTiddler(tag,false,false);story.createTiddler(_31,_30,_2d,null);story.saveTiddler(_2d);}if(config.options.chkAutoSave){saveChanges();}return false;};window.onClickTag=function(e){if(!e){var e=window.event;}var _34=resolveTarget(e);var _35=(!isNested(_34));if((Popup.stack.length>1)&&(_35==true)){Popup.removeFrom(1);}else{if(Popup.stack.length>0&&_35==false){Popup.removeFrom(0);}}var _36=(_35==false)?"popup":"nestedtagger";var _37=createTiddlyElement(document.body,"ol",_36,"popup",null);Popup.stack.push({root:this,popup:_37});var tag=this.getAttribute("tag");var _39=this.getAttribute("tiddler");if(_37&&tag){var _3a=store.getTaggedTiddlers(tag);var _3b=[];var li,r;for(r=0;r<_3a.length;r++){if(_3a[r].title!=_39){_3b.push(_3a[r].title);}}var _3d=config.views.wikified.tag;if(_3b.length>0){var _3e=createTiddlyButton(createTiddlyElement(_37,"li"),_3d.openAllText.format([tag]),_3d.openAllTooltip,onClickTagOpenAll);_3e.setAttribute("tag",tag);createTiddlyElement(createTiddlyElement(_37,"li"),"hr");for(r=0;r<_3b.length;r++){createTiddlyLink(createTiddlyElement(_37,"li"),_3b[r],true);}}else{createTiddlyText(createTiddlyElement(_37,"li",null,"disabled"),_3d.popupNone.format([tag]));}createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var h=createTiddlyLink(createTiddlyElement(_37,"li"),tag,false);createTiddlyText(h,_3d.openTag.format([tag]));createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var _40=createTiddlyButton(createTiddlyElement(_37,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);_40.setAttribute("tag",tag);}Popup.show(_37,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};if(!window.isNested){window.isNested=function(e){while(e!=null){var _42=document.getElementById("contentWrapper");if(_42==e){return true;}e=e.parentNode;}return false;};}config.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://tw.lewcid.org/#TaggerPluginDocumentation]]";config.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://tw.lewcid.org/#TaggerPluginSource]]";\n// %/
"Sometimes it is said that man cannot be trusted with the government of himself. Can he, then, be trusted with the government of others?" - Thomas Jefferson\n\nThis is why the government should be as small as possible
/***\n|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|\n|''Version:''|1.0.9 (2007-07-14)|\n|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.3|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Table of Content<html><a name="TOC"/></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>\n!Description<html><a name="Description"/></html>\nWith the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. \nEach part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features"). E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.\n\n\n''Syntax:'' \n|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|\n|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|\n|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|\n|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Applications<html><a name="Applications"/></html>\n!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>\nAssume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.\n\nNotice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Citation Index<html><a name="Citation"/></html>\nCreate a tiddler "Citations" that contains your "citations". \nWrap every citation with a part and a proper name. \n\n''Example''\n{{{\n<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// \nin //Proc. ICSM//, 1998.</part>\n\n<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// \nThesis, Uni Stuttgart, 2002.</part>\n\n<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// \nin //Proc. ICSM//, 1999.</part>\n}}}\n\nYou may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>\nYou may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list\n{{{\n* Item 1\n* Item 2\n* Item 3\n}}}\ninto a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.\n\nUsing the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.\n\n''Example''\n{{{\n|!Subject|!Items|\n|subject1|<<tiddler ./Cell1>>|\n|subject2|<<tiddler ./Cell2>>|\n\n<part Cell1 hidden>\n* Item 1\n* Item 2\n* Item 3\n</part>\n...\n}}}\n\nNotice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".\n\nBTW: The same approach can be used to create bullet lists with items that contain more than one line.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating Tabs<html><a name="Tabs"/></html>\nThe build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.\n\nWith the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.\n\n''Example''\nThe standard tabs at the sidebar are defined by the following eight tiddlers:\n* SideBarTabs\n* TabAll\n* TabMore\n* TabMoreMissing\n* TabMoreOrphans\n* TabMoreShadowed\n* TabTags\n* TabTimeline\n\nInstead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:\n{{{\n<<tabs txtMainTab \n Timeline Timeline SideBarTabs/Timeline \n All 'All tiddlers' SideBarTabs/All \n Tags 'All tags' SideBarTabs/Tags \n More 'More lists' SideBarTabs/More>>\n<part Timeline hidden><<timeline>></part>\n<part All hidden><<list all>></part>\n<part Tags hidden><<allTags>></part>\n<part More hidden><<tabs txtMoreTab \n Missing 'Missing tiddlers' SideBarTabs/Missing \n Orphans 'Orphaned tiddlers' SideBarTabs/Orphans \n Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>\n<part Missing hidden><<list missing>></part>\n<part Orphans hidden><<list orphans>></part>\n<part Shadowed hidden><<list shadowed>></part>\n}}}\n\nNotice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.\n\nE.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:\n{{{\n<<forEachTiddler \n sortBy 'tiddler.modified' descending \n write '(index < 100) ? "* [["+tiddler.title+"]]\sn":""'>>\n}}}\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Using Sliders<html><a name="Sliders"/></html>\nVery similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature\n\n''Example''\nIn a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.\n{{{\n...\n<<slider chkAboutDetails About/Details details "Click here to see more details">>\n<part Details hidden>\nTo give you a better overview ...\n</part>\n...\n}}}\n\nNotice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Revision history<html><a name="Revisions"/></html>\n* v1.0.9 (2007-07-14)\n** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.\n* v1.0.8 (2007-06-16)\n** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.\n** Support "./partName" syntax inside <<tabs ...>> macro\n* v1.0.7 (2007-03-07)\n** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.\n* v1.0.6 (2006-11-07)\n** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.\n* v1.0.5 (2006-03-02)\n** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.\n* v1.0.4 (2006-02-28)\n** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.\n* v1.0.3 (2006-02-26)\n** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.\n* v1.0.2 (2006-02-05)\n** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)\n* v1.0.1 (2006-01-27)\n** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.\n** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.\n* v1.0.0 (2006-01-25)\n** initial version\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Code<html><a name="Code"/></html>\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n//{{{\n//============================================================================\n// PartTiddlerPlugin\n\n// Ensure that the PartTiddler Plugin is only installed once.\n//\nif (!version.extensions.PartTiddlerPlugin) {\n\n\n\nversion.extensions.PartTiddlerPlugin = {\n major: 1, minor: 0, revision: 9,\n date: new Date(2007, 6, 14), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"\n};\n\nif (!window.abego) window.abego = {};\nif (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");\n\n//============================================================================\n// Common Helpers\n\n// Looks for the next newline, starting at the index-th char of text. \n//\n// If there are only whitespaces between index and the newline \n// the index behind the newline is returned, \n// otherwise (or when no newline is found) index is returned.\n//\nvar skipEmptyEndOfLine = function(text, index) {\n var re = /(\sn|[^\ss])/g;\n re.lastIndex = index;\n var result = re.exec(text);\n return (result && text.charAt(result.index) == '\sn') \n ? result.index+1\n : index;\n}\n\n\n//============================================================================\n// Constants\n\nvar partEndOrStartTagRE = /(<\s/part>)|(<part(?:\ss+)((?:[^>])+)>)/mg;\nvar partEndTagREString = "<\s\s/part>";\nvar partEndTagString = "</part>";\n\n//============================================================================\n// Plugin Specific Helpers\n\n// Parse the parameters inside a <part ...> tag and return the result.\n//\n// @return [may be null] {partName: ..., isHidden: ...}\n//\nvar parseStartTagParams = function(paramText) {\n var params = paramText.readMacroParams();\n if (params.length == 0 || params[0].length == 0) return null;\n \n var name = params[0];\n var paramsIndex = 1;\n var hidden = false;\n if (paramsIndex < params.length) {\n hidden = params[paramsIndex] == "hidden";\n paramsIndex++;\n }\n \n return {\n partName: name, \n isHidden: hidden\n };\n}\n\n// Returns the match to the next (end or start) part tag in the text, \n// starting the search at startIndex.\n// \n// When no such tag is found null is returned, otherwise a "Match" is returned:\n// [0]: full match\n// [1]: matched "end" tag (or null when no end tag match)\n// [2]: matched "start" tag (or null when no start tag match)\n// [3]: content of start tag (or null if no start tag match)\n//\nvar findNextPartEndOrStartTagMatch = function(text, startIndex) {\n var re = new RegExp(partEndOrStartTagRE);\n re.lastIndex = startIndex;\n var match = re.exec(text);\n return match;\n}\n\n//============================================================================\n// Formatter\n\n// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.\n//\n// @return true if a complete part section (including the end tag) could be processed, false otherwise.\n//\nvar handlePartSection = function(w) {\n var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);\n if (!tagMatch) return false;\n if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;\n\n // Parse the start tag parameters\n var arguments = parseStartTagParams(tagMatch[3]);\n if (!arguments) return false;\n \n // Continue processing\n var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);\n var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);\n if (endMatch && endMatch[1]) {\n if (!arguments.isHidden) {\n w.nextMatch = startTagEndIndex;\n w.subWikify(w.output,partEndTagREString);\n }\n w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);\n \n return true;\n }\n return false;\n}\n\nconfig.formatters.push( {\n name: "part",\n match: "<part\s\ss+[^>]+>",\n \n handler: function(w) {\n if (!handlePartSection(w)) {\n w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);\n }\n }\n} )\n\n//============================================================================\n// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers \n// as tiddlers.\n\nvar currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)\n\n// Return the match to the first <part ...> tag of the text that has the\n// requrest partName.\n//\n// @return [may be null]\n//\nvar findPartStartTagByName = function(text, partName) {\n var i = 0;\n \n while (true) {\n var tagMatch = findNextPartEndOrStartTagMatch(text, i);\n if (!tagMatch) return null;\n\n if (tagMatch[2]) {\n // Is start tag\n \n // Check the name\n var arguments = parseStartTagParams(tagMatch[3]);\n if (arguments && arguments.partName == partName) {\n return tagMatch;\n }\n }\n i = tagMatch.index+tagMatch[0].length;\n }\n}\n\n// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler \n// object, using fullName as the Tiddler's title. \n//\n// All remaining properties of the new Tiddler (tags etc.) are inherited from \n// the parentTiddler.\n// \n// @return [may be null]\n//\nvar getPart = function(parentTiddler, partName, fullName) {\n var text = parentTiddler.text;\n var startTag = findPartStartTagByName(text, partName);\n if (!startTag) return null;\n \n var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);\n var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);\n\n if (indexOfEndTag >= 0) {\n var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);\n var partTiddler = new Tiddler();\n partTiddler.set(\n fullName,\n partTiddlerText,\n parentTiddler.modifier,\n parentTiddler.modified,\n parentTiddler.tags,\n parentTiddler.created);\n partTiddler.abegoIsPartTiddler = true;\n return partTiddler;\n }\n \n return null;\n}\n\n// Hijack the store.fetchTiddler to recognize the "part" addresses.\n//\nvar hijackFetchTiddler = function() {\n var oldFetchTiddler = store.fetchTiddler ;\n store.fetchTiddler = function(title) {\n var result = oldFetchTiddler.apply(this, arguments);\n if (!result && title) {\n var i = title.lastIndexOf('/');\n if (i > 0) {\n var parentName = title.substring(0, i);\n var partName = title.substring(i+1);\n var parent = (parentName == ".") \n ? store.resolveTiddler(currentParent)\n : oldFetchTiddler.apply(this, [parentName]);\n if (parent) {\n return getPart(parent, partName, parent.title+"/"+partName);\n }\n }\n }\n return result; \n };\n};\n\n// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. \n// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.\n// Otherwise hijack now.\nif (!store) {\n var oldRestartFunc = restart;\n window.restart = function() {\n hijackFetchTiddler();\n oldRestartFunc.apply(this,arguments);\n };\n} else\n hijackFetchTiddler();\n\n\n\n\n// The user must not edit a readOnly/partTiddler\n//\n\nconfig.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;\n\nTiddler.prototype.isReadOnly = function() {\n // Tiddler.isReadOnly was introduced with TW 2.0.6.\n // For older version we explicitly check the global readOnly flag\n if (config.commands.editTiddler.oldIsReadOnlyFunction) {\n if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;\n } else {\n if (readOnly) return true;\n }\n\n return this.abegoIsPartTiddler;\n}\n\nconfig.commands.editTiddler.handler = function(event,src,title)\n{\n var t = store.getTiddler(title);\n // Edit the tiddler if it either is not a tiddler (but a shadowTiddler)\n // or the tiddler is not readOnly\n if(!t || !t.abegoIsPartTiddler)\n {\n clearMessage();\n story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(title,"text");\n return false;\n }\n}\n\n// To allow the "./partName" syntax in macros we need to hijack \n// the invokeMacro to define the "currentParent" while it is running.\n// \nvar oldInvokeMacro = window.invokeMacro;\nfunction myInvokeMacro(place,macro,params,wikifier,tiddler) {\n var oldCurrentParent = currentParent;\n if (tiddler) currentParent = tiddler;\n try {\n oldInvokeMacro.apply(this, arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n}\nwindow.invokeMacro = myInvokeMacro;\n\n// To correctly support the "./partName" syntax while refreshing we need to hijack \n// the config.refreshers.tiddlers to define the "currentParent" while it is running.\n// \n(function() {\n var oldTiddlerRefresher= config.refreshers.tiddler;\n config.refreshers.tiddler = function(e,changeList) {\n var oldCurrentParent = currentParent;\n try {\n currentParent = e.getAttribute("tiddler");\n return oldTiddlerRefresher.apply(this,arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n };\n})();\n\n// Support "./partName" syntax inside <<tabs ...>> macro\n(function() {\n var extendRelativeNames = function(e, title) {\n var nodes = e.getElementsByTagName("a");\n for(var i=0; i<nodes.length; i++) {\n var node = nodes[i];\n var s = node.getAttribute("content");\n if (s && s.indexOf("./") == 0)\n node.setAttribute("content",title+s.substr(1));\n }\n };\n var oldHandler = config.macros.tabs.handler;\n config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var result = oldHandler.apply(this,arguments);\n if (tiddler)\n extendRelativeNames(place, tiddler.title);\n return result;\n };\n})();\n\n// Scroll the anchor anchorName in the viewer of the given tiddler visible.\n// When no tiddler is defined use the tiddler of the target given event is used.\nwindow.scrollAnchorVisible = function(anchorName, tiddler, evt) {\n var tiddlerElem = null;\n if (tiddler) {\n tiddlerElem = document.getElementById(story.idPrefix + tiddler);\n }\n if (!tiddlerElem && evt) {\n var target = resolveTarget(evt);\n tiddlerElem = story.findContainingTiddler(target);\n }\n if (!tiddlerElem) return;\n\n var children = tiddlerElem.getElementsByTagName("a");\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n var name = child.getAttribute("name");\n if (name == anchorName) {\n var y = findPosY(child);\n window.scrollTo(0,y);\n return;\n }\n }\n}\n\n} // of "install only once"\n//}}}\n\n/***\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n
[[Upgrade the LinkSys Router|http://www.thegeekstuff.com/2009/06/how-to-upgrade-linksys-wireless-router-firmware/]] from the [[The Geek Stuff|http://www.thegeekstuff.com/]] .com\n\nLooks pretty easy!
/***\n|Name|TagCloudPlugin|\n|Source|http://www.TiddlyTools.com/#TagCloudPlugin|\n|Version|1.6.0|\n|Author|Eric Shulman|\n|Original Author|Clint Checketts|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|present a 'cloud' of tags (or links) using proportional font display|\n!Usage\n<<<\n{{{\n<<cloud type action:... limit:... tag tag tag ...>>\n<<cloud type action:... limit:... +TiddlerName>>\n<<cloud type action:... limit:... =tagvalue>>\n}}}\nwhere:\n* //type// is a keyword, one of:\n** ''tags'' (default) - displays a cloud of tags, based on frequency of use\n** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler\n** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler\n* ''action:popup'' (default) - clicking a cloud item shows a popup with links to related tiddlers<br>//or//<br> ''action:goto'' - clicking a cloud item immediately opens the tiddler corresponding to that item\n* ''limit:N'' (optional) - restricts the cloud display to only show the N most popular tags/links\n* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters\n* ''+TiddlerName''<br>shows tags/links read from a space-separated, bracketed list stored in a separate tiddler.\n* ''=tagvalue'' (//only if type=''tags''//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)\n//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//\n<<<\n!Examples\n<<<\n//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//\n{{{<<cloud systemConfig excludeMissing script>>}}}\n{{groupbox{<<cloud systemConfig excludeMissing script>>}}}\n//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//\n{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}\n{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}\n//tags listed in// [[FavoriteTags]]\n{{{<<cloud +FavoriteTags>>}}}\n{{groupbox{<<cloud +FavoriteTags>>}}}\n//links to tiddlers tagged with 'package'//\n{{{<<cloud action:goto =package>>}}}\n{{groupbox{<<cloud action:goto =package>>}}}\n//top 20 most referenced tiddlers//\n{{{<<cloud references limit:20>>}}}\n{{groupbox{<<cloud references limit:20>>}}}\n//top 20 tiddlers that contain the most links//\n{{{<<cloud links limit:20>>}}}\n{{groupbox{<<cloud links limit:20>>}}}\n<<<\n!Revisions\n<<<\n2009.02.26 [1.6.0] added {{{action:...}}} parameter to apply popup vs. goto action when clicking cloud items\n2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.\n2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error\n2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations\n2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular\n2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler\n2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)\n2008.07.03 [1.1.0] added 'segments' property to macro object. Extensive code cleanup\n<<<\n!Code\n***/\n//{{{\nversion.extensions.TagCloudPlugin= {major: 1, minor: 6 , revision: 0, date: new Date(2009,2,26)};\n//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman\n//Currently maintained and enhanced by Eric Shulman\n//}}}\n//{{{\nconfig.macros.cloud = {\n tagstip: "%1 tiddlers tagged with '%0'",\n refslabel: " (%0 references)",\n refstip: "%1 tiddlers have links to '%0'",\n linkslabel: " (%0 links)",\n linkstip: "'%0' has links to %1 other tiddlers",\n groups: 9,\n init: function() {\n config.macros.tagCloud=config.macros.cloud; // for backward-compatibility\n config.shadowTiddlers.TagCloud='<<cloud>>';\n config.shadowTiddlers.StyleSheetTagCloud=\n '/*{{{*/\sn'\n +'.tagCloud span {line-height: 3.5em; margin:3px;}\sn'\n +'.tagCloud1{font-size: 80%;}\sn'\n +'.tagCloud2{font-size: 100%;}\sn'\n +'.tagCloud3{font-size: 120%;}\sn'\n +'.tagCloud4{font-size: 140%;}\sn'\n +'.tagCloud5{font-size: 160%;}\sn'\n +'.tagCloud6{font-size: 180%;}\sn'\n +'.tagCloud7{font-size: 200%;}\sn'\n +'.tagCloud8{font-size: 220%;}\sn'\n +'.tagCloud9{font-size: 240%;}\sn'\n +'/*}}}*/\sn';\n setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');\n },\n getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows\n if (!tiddler.linksUpdated) tiddler.changed();\n var list=[]; for (var i=0; i<tiddler.links.length; i++) {\n var title=tiddler.links[i];\n if (store.isShadowTiddler(title)||store.tiddlerExists(title))\n list.push(title);\n }\n return list;\n },\n handler: function(place,macroName,params) {\n // unpack params\n var inc=[]; var ex=[]; var limit=0; var action='popup';\n var links=(params[0]&&params[0].toLowerCase()=='links'); if (links) params.shift();\n var refs=(params[0]&&params[0].toLowerCase()=='references'); if (refs) params.shift();\n if (params[0]&&params[0].substr(0,7).toLowerCase()=='action:')\n action=params.shift().substr(7).toLowerCase();\n if (params[0]&&params[0].substr(0,6).toLowerCase()=='limit:')\n limit=parseInt(params.shift().substr(6));\n if (params.length) {\n if (params[0].substr(0,1)=='+') { // get tag list from tiddler\n var inc=store.getTiddlerText(params[0].substr(1),'').readBracketedList();\n } else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags\n var tagged=store.getTaggedTiddlers(params[0].substr(1));\n for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);\n } else ex=params; // exclude params\n }\n // get all items, include/exclude specific items\n var items=[];\n var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();\n for (var t=0; t<list.length; t++) {\n var title=(links||refs)?list[t].title:list[t][0];\n if (links) var count=this.getLinks(list[t]).length;\n else if (refs) var count=store.getReferringTiddlers(title).length;\n else var count=list[t][1];\n if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))\n items.push({ title:title, count:count });\n }\n if(!items.length) return;\n // sort by decending count, limit results (optional)\n items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});\n while (limit && items.length>limit) items.pop();\n // find min/max and group size\n var most=items[0].count;\n var least=items[items.length-1].count;\n var groupSize=(most-least+1)/this.groups;\n // sort by title and draw the cloud of items\n items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});\n var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);\n for (var t=0; t<items.length; t++) {\n cloudWrapper.appendChild(document.createTextNode(' '));\n var group=Math.ceil((items[t].count-least)/groupSize)||1;\n var className='tagCloudtag tagCloud'+group;\n var tip=refs?this.refstip:links?this.linkstip:this.tagstip;\n tip=tip.format([items[t].title,items[t].count]);\n if (action=='goto') { // TAG/LINK/REFERENCES GOTO\n var btn=createTiddlyLink(cloudWrapper,items[t].title,true,className);\n btn.title=tip;\n btn.style.fontWeight='normal';\n } else if (!links&&!refs) { // TAG POPUP\n var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);\n btn.setAttribute('tag',items[t].title);\n } else { // LINK/REFERENCES POPUP\n var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,\n function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;\n var popup = Popup.create(this);\n var title = this.getAttribute('tiddler');\n var count = this.getAttribute('count');\n var refs = this.getAttribute('refs')=='T';\n var links = this.getAttribute('links')=='T';\n var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);\n createTiddlyLink(popup,title,true);\n createTiddlyText(popup,label);\n createTiddlyElement(popup,'hr');\n if (refs) {\n popup.setAttribute('tiddler',title);\n config.commands.references.handlePopup(popup,title);\n }\n if (links) {\n var tiddler = store.fetchTiddler(title);\n var links=config.macros.cloud.getLinks(tiddler);\n for(var i=0;i<links.length;i++)\n createTiddlyLink(createTiddlyElement(popup,'li'),\n links[i],true);\n }\n Popup.show();\n e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();\n return false;\n }, className);\n btn.setAttribute('tiddler',items[t].title);\n btn.setAttribute('count',items[t].count);\n btn.setAttribute('refs',refs?'T':'F');\n btn.setAttribute('links',links?'T':'F');\n btn.title=tip;\n }\n }\n }\n};\n//}}}
11.5. How do I highlight all the non-printable characters in a file?\nYou can use the following commands and search pattern to highlight all the\nnon-printable characters in a file:\n\n :set hlsearch\n search for string \s(\sp\s|$\s)\s@!.
1-888-436-2735
/***\n|''Name:''|FootnotesPlugin|\n|''Description:''|Create automated tiddler footnotes.|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#FootnotesPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.01|\n|''Date:''|10/25/07|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.2|\n\n!!Usage:\n*To create a footnote, just put the footnote text inside triple backticks.\n*Footnotes are numbered automatically, and listed at the bottom of the tiddler.\n*{{{Creating a footnote is easy. ```This is the text for my footnote```}}}\n*[[Example|FootnotesDemo]]\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\nconfig.footnotesPlugin = {\n backLabel: "back",\n prompt:"show footnote"\n};\n\nconfig.formatters.unshift( {\n name: "footnotes",\n match: "```",\n lookaheadRegExp: /```((?:.|\sn)*?)```/g,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var tiddler = story.findContainingTiddler(w.output);\n if (!tiddler.notes)\n tiddler.notes = [];\n var title = tiddler.getAttribute("tiddler");\n tiddler.notes.pushUnique(lookaheadMatch[1]);\n var pos = tiddler.notes.indexOf(lookaheadMatch[1]) + 1;\n createTiddlyButton(w.output,pos,config.footnotesPlugin.prompt,function(){var x = document.getElementById(title+"ftn"+pos);window.scrollTo(0,ensureVisible(x)+(ensureVisible(x)<findScrollY()?(findWindowHeight()-x.offsetHeight):0));return false;},"ftnlink",title+"ftnlink"+pos); \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n});\n\nold_footnotes_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,force)\n{\n var tiddler = old_footnotes_refreshTiddler.apply(this,arguments);\n if (tiddler.notes && tiddler.notes.length)\n {\n var holder = createTiddlyElement(null,"div",null,"footnoteholder");\n var list = createTiddlyElement(holder,"ol",title+"footnoteholder");\n for (var i=0; i<tiddler.notes.length; i++)\n {\n var ftn = createTiddlyElement(list,"li",title+"ftn"+(i+1),"footnote");\n wikify(tiddler.notes[i]+" ",ftn);\n createTiddlyButton(ftn,"["+config.footnotesPlugin.backLabel+"]",config.footnotesPlugin.backLabel,function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ftn","ftnlink"))));return false;},"ftnbklink");\n }\n var count = tiddler.childNodes.length;\n for (var j=0; j<count; j++){\n if(hasClass(tiddler.childNodes[j],"viewer")){\n var viewer = tiddler.childNodes[j]; \n }\n }\n viewer.appendChild(holder);\n tiddler.notes = [];\n }\n return tiddler;\n};\n\nsetStylesheet(\n".tiddler a.ftnlink {vertical-align: super; font-size: 0.8em; color:red;}\sn"+\n".tiddler a.ftnlink:hover, .tiddler .footnoteholder a.ftnbklink:hover{color:#fff;background:red;}\sn"+\n".tiddler div.footnoteholder{margin:1.8em 1.0em; padding:0.1em 1.0em 0.1em 1.0em ;border-left: 1px solid #ccc;}"+\n".tiddler footnoteholder ol {font-size: 0.9em; line-height: 1.2em;}\sn"+\n".tiddler .footnoteholder li.footnote {margin: 0 0 5px 0;}\sn"+\n".tiddler .footnoteholder a.ftnbklink{color:red;}\sn","FootNotesStyles");\n//!END-PLUGIN-CODE\n// %/
Keeping things straight and trying to record when things happen
http://echoreply.us/tuto/mercurial%5Fsite%5Fmanagement.html
A place to keep notes
New chip, 14" $649
* Gloria Ferrer Sonoma Brut $16,00\n* Segura Viudas "Cava", Spain $10,00\n* Yellow by Yellowglen, Autrailian $11.00
/*\n TiddlyWiki Comments Plugin - Online demo at http://tiddlyguv.org/CommentsPlugin.html\n\n TODO:\n - Support Cascade comment delete when the top-level tiddler is deleted\n - Support more than one < <comments> > per tiddler. This will probably entail creating an invisible root tiddler to\n hold all the comments for a macro together. The user will need to provide an ID for this tiddler.\n - Don't use global "macro" var (use "macro" param a la jquery)\n\n*/\n\n/***\n|Name|CommentsPlugin|\n|Description|Macro for nested comments, where each comment is a separate tiddler.|\n|Source|http://tiddlyguv.org/CommentsPlugin.html#CommentsPlugin|\n|Documentation|http://tiddlyguv.org/CommentsPlugin.html#CommentsPluginInfo|\n|Version|0.1|\n|Author|Michael Mahemoff, Osmosoft|\n|''License:''|[[BSD open source license]]|\n|~CoreVersion|2.2|\n***/\n\n/*{{{*/\nif(!version.extensions.CommentsPlugin) {\n\n version.extensions.CommentsPlugin = {installed:true};\n\n (function(plugin) {\n\n var cmacro = config.macros.comments = {\n\n\n\ninit: function() {\n var stylesheet = store.getTiddlerText(tiddler.title + "##StyleSheet");\n if (stylesheet) { // check necessary because it happens more than once for some reason\n config.shadowTiddlers["StyleSheetCommentsPlugin"] = stylesheet;\n store.addNotification("StyleSheetCommentsPlugin", refreshStyles);\n }\n if (!version.extensions.CommentsPlugin.retainViewTemplate) cmacro.enhanceViewTemplate();\n},\n\nenhanceViewTemplate: function() {\n var template = config.shadowTiddlers.ViewTemplate;\n if ((/commentBreadcrumb/g).test(template)) return; // already enhanced\n var TITLE_DIV = "<div class='title' macro='view title'></div>";\n var commentsDiv = "<div class='commentBreadcrumb' macro='commentBreadcrumb'></div>";\n config.shadowTiddlers.ViewTemplate = template.replace(TITLE_DIV,commentsDiv+"\sn"+TITLE_DIV);\n},\n\nhandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var macroParams = paramString.parseParams();\n var tiddlerParam = getParam(macroParams, "tiddler");\n tiddler = tiddlerParam ? store.getTiddler(tiddlerParam) : tiddler;\n if (!tiddler || !store.getTiddler(tiddler.title)) return;\n cmacro.buildCommentsArea(tiddler, place, macroParams);\n // cmacro.refreshCommentsFromRoot(story.getTiddler(tiddler.title).commentsEl, tiddler, macroParams);\n cmacro.refreshCommentsFromRoot(place.commentsEl, tiddler, macroParams);\n},\n\n\nbuildCommentsArea: function(rootTiddler, place, macroParams) {\n var commentsArea = createTiddlyElement(place, "div", null, "comments");\n var heading = getParam(macroParams, "heading");\n if (heading) createTiddlyElement(commentsArea, "h1", null, null, heading);\n var comments = createTiddlyElement(commentsArea, "div", null, "");\n place.commentsEl = comments;\n\n if (cmacro.editable(macroParams)) {\n var newCommentArea = createTiddlyElement(commentsArea, "div", null, "newCommentArea", "New comment:");\n cmacro.forceLoginIfRequired(params, newCommentArea, function() {\n var newCommentEl = cmacro.makeTextArea(newCommentArea, macroParams);\n // var addComment = createTiddlyElement(newCommentArea, "button", null, "addComment button", "Add Comment");\n var addComment = createTiddlyButton(newCommentArea, "Add Comment", null, function() {\n var comment = cmacro.createComment(newCommentEl.value, rootTiddler, macroParams); \n newCommentEl.value = "";\n cmacro.refreshCommentsFromRoot(comments, rootTiddler, macroParams);\n }, "addComment button");\n });\n }\n\n},\n\n\nmakeTextArea: function(container, macroParams) {\n var textArea = createTiddlyElement(container, "textarea");\n textArea.rows = getParam(macroParams, "textRows") || 4;\n textArea.cols = getParam(macroParams, "textCols") || 20;\n textArea.value = getParam(macroParams, "text") || "";\n return textArea;\n},\n\nrefreshCommentsFromRoot: function(rootCommentsEl, rootTiddler, macroParams) {\n cmacro.treeifyComments(rootTiddler);\n cmacro.refreshComments(rootCommentsEl, rootTiddler, macroParams);\n},\n\nrefreshComments: function(daddyCommentsEl, tiddler, macroParams) {\n // cmacro.log("refreshComments - root", rootCommentsEl, "daddy", daddyCommentsEl,\n // "tiddler ", tiddler, "macroParams ", macroParams);\n // cmacro.log("refreshComments", arguments);\n\n var commentsEl;\n if (tiddler.fields.daddy) {\n var commentEl = cmacro.buildCommentEl(daddyCommentsEl, tiddler, macroParams);\n daddyCommentsEl.appendChild(commentEl);\n commentsEl = commentEl.commentsEl;\n } else { // root element\n removeChildren(daddyCommentsEl);\n // refreshedEl = story.getTiddler(tiddler.title);\n commentsEl = daddyCommentsEl;\n }\n\n for (var child = tiddler.firstChild; child; child = child.next) {\n cmacro.refreshComments(commentsEl, child, macroParams);\n }\n\n},\n\ntreeifyComments: function(rootTiddler) {\n\n var comments = cmacro.findCommentsFromRoot(rootTiddler);\n\n cmacro.forEach(comments, function(comment) {\n var prev = comment.fields.prev;\n var daddy = comment.fields.daddy;\n if (prev) {\n store.getTiddler(prev).next = comment;\n } else {\n store.getTiddler(daddy).firstChild = comment;\n }\n });\n\n},\n\nlogComments: function(comments) {\n for (var i=0; i<comments.length; i++) {\n var comment = comments[i];\n }\n},\n\nfindCommentsFromRoot: function(rootTiddler) {\n var comments = [];\n store.forEachTiddler(function(title,tiddler) {\n if (tiddler.fields.root==rootTiddler.title) comments.push(tiddler);\n });\n return comments;\n},\n\nfindChildren: function(daddyTiddler) {\n var comments = [];\n store.forEachTiddler(function(title,tiddler) {\n if (tiddler.fields.daddy==daddyTiddler.title) comments.push(tiddler);\n });\n return comments;\n},\n\nbuildCommentEl: function(daddyCommentsEl, comment, macroParams) {\n\n // COMMENT ELEMENT\n var commentEl = document.createElement("div");\n commentEl.className = "comment";\n\n // HEADING <- METAINFO AND DELETE\n var headingEl = createTiddlyElement(commentEl, "div", null, "heading");\n\n var metaInfoEl = createTiddlyElement(headingEl, "div", null, "commentTitle", comment.modifier + '@' + comment.modified.formatString(getParam(macroParams,"dateFormat") || "DDD, MMM DDth, YYYY hh12:0mm:0ss am"));\n metaInfoEl.onclick = function() { \n // story.closeAllTiddlers();\n story.displayTiddler("top", comment.title, null, true);\n // document.location.hash = "#" + comment.title;\n };\n\n var deleteEl = createTiddlyElement(headingEl, "div", null, "deleteComment", "X");\n deleteEl.onclick = function() {\n if (true || confirm("Delete this comment and all of its replies?")) {\n cmacro.deleteTiddlerAndDescendents(comment);\n commentEl.parentNode.removeChild(commentEl);\n }\n };\n\n // TEXT\n commentEl.text = createTiddlyElement(commentEl, "div", null, "commentText");\n wikify(comment.text, commentEl.text);\n\n // REPLY LINK\n if (cmacro.editable(macroParams)) {\n var replyLinkZone = createTiddlyElement(commentEl, "div", null, "replyLinkZone");\n var replyLink = createTiddlyElement(replyLinkZone, "span", null, "replyLink", "reply to this comment");\n replyLink.onclick = function() { cmacro.openReplyLink(comment, commentEl, replyLink, macroParams); };\n }\n\n // var clearance = createTiddlyElement(commentEl, "clearance", null, "clearance");\n // clearance.innerHTML = "&nbsp;";\n\n // COMMENTS AREA\n commentEl.commentsEl = createTiddlyElement(commentEl, "div", null, "comments");\n\n // RETURN\n return commentEl;\n\n},\n\nopenReplyLink: function(commentTiddler, commentEl, replyLink, macroParams) {\n if (commentEl.replyEl) {\n commentEl.replyEl.style.display = "block";\n return;\n }\n\n commentEl.replyEl = document.createElement("div");\n commentEl.replyEl.className = "reply";\n\n replyLink.style.display = "none";\n var newReplyHeading = createTiddlyElement(commentEl.replyEl, "div", null, "newReply");\n createTiddlyElement(newReplyHeading, "div", null, "newReplyLabel", "New Reply:");\n var closeNewReply = createTiddlyElement(newReplyHeading, "div", null, "closeNewReply", "close");\n closeNewReply.onclick = function() {\n commentEl.replyEl.style.display = "none";\n replyLink.style.display = "block";\n };\n\n cmacro.forceLoginIfRequired(params, commentEl.replyEl, function() {\n var replyText = cmacro.makeTextArea(commentEl.replyEl, macroParams);\n var submitReply = createTiddlyButton(commentEl.replyEl, "Reply", null, function() {\n var newComment = cmacro.createComment(replyText.value, commentTiddler, macroParams);\n replyText.value = "";\n closeNewReply.onclick();\n cmacro.refreshComments(commentEl.commentsEl, newComment, macroParams);\n });\n });\n\n commentEl.insertBefore(commentEl.replyEl, commentEl.commentsEl);\n},\n\n\ncreateComment: function(text, daddy, macroParams) {\n\n var rootTitle = daddy.fields.root ? daddy.fields.root : daddy.title;\n // second case is the situation where daddy *is* root\n var newComment = cmacro.createCommentTiddler(macroParams, rootTitle);\n var fieldsParam = getParam(macroParams, "fields") || "";\n var fields = fieldsParam.decodeHashMap();\n var inheritedFields = (getParam(macroParams, "inheritedFields") || "").split(",");\n cmacro.forEach(inheritedFields, function(field) {\n if (field!="") fields[field] = daddy.fields[field];\n });\n var tagsParam = getParam(macroParams, "tags") || "comment";\n var now = new Date();\n newComment.set(null, text, config.options.txtUserName, now, tagsParam.split(","), now, fields);\n\n var youngestSibling = cmacro.findYoungestChild(daddy)\n if (youngestSibling) newComment.fields.prev = youngestSibling.title;\n newComment.fields.daddy = daddy.title;\n newComment.fields.root = rootTitle;\n\n cmacro.saveTiddler(newComment.title);\n autoSaveChanges(false);\n return newComment;\n},\n\nfindYoungestChild: function(daddy) {\n\n var siblingCount = 0;\n var elderSiblings = cmacro.mapize(cmacro.selectTiddlers(function(tiddler) {\n isChild = (tiddler.fields.daddy==daddy.title);\n if (isChild) siblingCount++;\n return isChild;\n }));\n if (!siblingCount) return null;\n\n // Find the only sibling that doesn't have a prev pointing at it\n var youngestSiblings = cmacro.clone(elderSiblings) // as a starting point\n cmacro.forEachMap(elderSiblings, function(tiddler) {\n delete youngestSiblings[tiddler.fields.prev];\n });\n\n for (title in youngestSiblings) { return youngestSiblings[title]; }\n\n},\n\n// The recursive delete is run by a separate function (nested inside\n// this one, for encapsulation purposes).\ndeleteTiddlerAndDescendents: function(tiddler) {\n\n function deleteRecursively(tiddler) {\n for (var child = tiddler.firstChild; child; child = child.next) {\n deleteRecursively(child);\n }\n store.removeTiddler(tiddler.title);\n }\n\n cmacro.treeifyComments(store.getTiddler(tiddler.fields.root));\n\n // save some info prior to deleting\n var prev = tiddler.fields.prev;\n var next = tiddler.next;\n\n deleteRecursively(tiddler);\n\n // used saved info\n if (next) {\n next.fields.prev = prev;\n cmacro.saveTiddler(next.title);\n }\n\n autoSaveChanges(false);\n\n},\n\n\nforEach: function(list, visitor) { for (var i=0; i<list.length; i++) visitor(list[i]); },\nforEachMap: function(map, visitor) { for (var key in map) visitor(map[key]); },\nselect: function(list, selector) { \n var selection = [];\n cmacro.forEach(list, function(currentItem) {\n if (selector(currentItem)) { selection.push(currentItem); }\n });\n return selection;\n},\nselectTiddlers: function(selector) { \n var tiddlers = [];\n store.forEachTiddler(function(title, tiddler) {\n var wanted = selector(tiddler);\n if (wanted) tiddlers.push(tiddler);\n });\n return tiddlers;\n},\nmap: function(list, mapper) { \n var mapped = [];\n cmacro.forEach(list, function(currentItem) { mapped.push(mapper(currentItem)); });\n return mapped;\n},\nremove: function(list, unwantedItem) {\n return cmacro.select(list,\n function(currentItem) { return currentItem!=unwantedItem; });\n},\nmapize: function(tiddlerList) {\n var map = {};\n cmacro.forEach(tiddlerList, function(tiddler) { map[tiddler.title] = tiddler; });\n return map;\n},\nclone: function(map) { return merge({}, map); },\n\n\neditable: function(params) {\n var editable = getParam(params, "editable");\n return (!editable || editable!="false");\n},\n\nneedsLogin: function(params) {\n var loginCheck = getParam(params, "loginCheck");\n return loginCheck && !window[loginCheck]();\n},\n\nforceLoginIfRequired: function(params, loginPromptContainer, authenticatedBlock) {\n if (cmacro.needsLogin(params)) wikify("<<"+getParam(macroParams, "loginPrompt")+">>", loginPromptContainer);\n else authenticatedBlock();\n},\n\n\nmergeReadOnly: function(first, second) {\n var merged = {};\n for (var field in first) { merged[field] = first[field]; }\n for (var field in second) { merged[field] = second[field]; }\n return merged;\n},\n\n// callers may replace this with their own ID generation algorithm\ncreateCommentTiddler: function(macroParams, rootTitle) {\n // var titleFormat = getParam(macroParams, "titleFormat") || "%root%Comment"; \n var prefix = rootTitle+"Comment"; // was "_comment"\n if (!store.createGuidTiddler) return store.createTiddler(prefix+((new Date()).getTime()));\n return store.createGuidTiddler(prefix);\n},\nsaveTiddler: function(tiddler) {\n var tiddler = (typeof(tiddler)=="string") ? store.getTiddler(tiddler) : tiddler; \n store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, cmacro.mergeReadOnly(config.defaultCustomFields, tiddler.fields), false, tiddler.created)\n},\nlog: function() { if (console && console.firebug) console.log.apply(console, arguments); },\nassert: function() { if (console && console.firebug) console.assert.apply(console, arguments); },\n\n\ncopyFields: function(fromTiddler, toTiddler, field1, field2, fieldN) {\n for (var i=2; i<arguments.length; i++) {\n fieldKey = arguments[i];\n if (fromTiddler.fields[fieldKey]) toTiddler.fields[fieldKey] = fromTiddler.fields[fieldKey];\n }\n}\n}\n\nconfig.macros.commentsCount = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var count = 0;\n if (tiddler && store.getTiddler(tiddler.title)) {\n var rootTiddler = paramString.length ? paramString : tiddler.title;\n count = config.macros.comments.findCommentsFromRoot(store.getTiddler(rootTiddler)).length;\n }\n createTiddlyText(place, count);\n }\n},\n\nconfig.macros.commentBreadcrumb = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!tiddler.fields.root) return;\n var rootLink = createTiddlyElement(place, "span", null, null);\n createTiddlyLink(rootLink, tiddler.fields.root, true);\n\n var rootIsParent = tiddler.fields.daddy==tiddler.fields.root;\n var rootIsGrandparent = (store.getTiddler(tiddler.fields.daddy)).fields.daddy==tiddler.fields.root;\n\n if (!rootIsParent) {\n if (!rootIsGrandparent) createTiddlyElement(place, "span", null, null, " > ... ");\n createTiddlyElement(place, "span", null, null, " > ");\n var daddyLink = createTiddlyElement(place, "span", null, null);\n createTiddlyLink(daddyLink, tiddler.fields.daddy, true);\n }\n\n createTiddlyElement(place, "span", null, null, " > ");\n\n // place.appendChild(createTiddlyLink(tiddler.fields.root));\n }\n}\n\nconfig.macros.tiddlyWebComments = {};\nconfig.macros.tiddlyWebComments.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n paramString = "fields:'server.workspace:bags/comments' inheritedFields:'server.host,server.type'";\n config.macros.comments.handler(place,macroName,params,wikifier, paramString,tiddler);\n };\n\nfunction log() { if (console && console.firebug) console.log.apply(console, arguments); }\n\n})(version.extensions.CommentsPlugin);\n\n\n/***\n!StyleSheet\n\n.comments h1 { margin-bottom: 0; padding-bottom: 0; }\n.comments { padding: 0; }\n.comment .comments { margin-left: 1em; }\n\n.comment { padding: 0; margin: 1em 0 0; }\n.comment .comment { margin 0; }\n.comment .toolbar .button { border: 0; color: #9a4; }\n.comment .heading { background: [[ColorPalette::PrimaryPale]]; color: [[ColorPalette::PrimaryDark]]; border-bottom: 1px solid [[ColorPalette::PrimaryLight]]; border-right: 1px solid [[ColorPalette::PrimaryLight]]; padding: 0.5em; height: 1.3em; }\n.commentTitle { float: left; }\n.commentTitle:hover { text-decoration: underline; cursor: pointer; }\n.commentText { clear: both; padding: 1em 1em; }\n.deleteComment { float: right; cursor: pointer; text-decoration:underline; color:[[ColorPalette::SecondaryDark]]; padding-right: 0.3em; }\n.comment .reply { margin-left: 1em; }\n.comment .replyLink { color:[[ColorPalette::SecondaryDark]]; font-style: italic; \n cursor: pointer; text-decoration: underline; margin: 0 1em; }\n.comment .created { }\n.comment .newReply { color:[[ColorPalette::SecondaryDark]]; margin-top: 1em; }\n.newReplyLabel { float: left; }\n.closeNewReply { cursor: pointer; float: right; text-decoration: underline; }\n.comments textarea { width: 100%; padding: 0.3em; margin-bottom: 0.6em; }\n.newCommentArea { margin-top: 0.5em; }\n\n.clearance { clear: both; }\n\n\n!(end of StyleSheet)\n\n***/\n\n config.macros.comments.init();\n\n} // end of 'install only once'\n/*}}}*/\n\n// function log() { if (console && console.firebug) console.log.apply(console, arguments); }\n
Compact lite computer
Powered by [[ZiddlyWiki|http://ziddlywiki.com]]\n
header("Content-type: application/octet-stream");\nheader("Content-Disposition: attachment; filename=yourfilename.xls");\nheader("Pragma: no-cache");\nheader("Expires: 0");
<<tiddler PaletteMaker >>\n
gtk-recordMyDesktop
\n\n[[Here is an article|http://baselinescenario.com/2009/08/14/an-inside-perspective-on-regulatory-capture/]] at [[The Base Line Scenario|http://baselinescenario.com]] by James Coffman. I think this short post says as much about the situation as any thing I've read.\n\n> * First, we need to look at the structure of the finance industry. Commercial banks got into trouble in large part because they warehoused (often off the books) toxic securities underwritten by their investment banking counterparts within the holding company structure. Similar abuses in the past resulted in separating investment banking from commercial banking. We should try it again. Insurance should be split off as well.\n\n>* Second, no institution should be allowed to become too big to fail. Those that have already achieved that status should be broken up.\n\n>* Third, we must put in place an effective financial consumer protection agency which can counteract the worst consumer practices of a too powerful industry.\n\n>* Fourth, investment banks should be made to eat what they kill. Public ownership of investment banks coincided with the industry's decline into extremely reckless risk taking. Investment bankers should be required to own a significant percentage of the equity in the institutions in which they work (something approaching 50%, to pick a number). Having a significant portion of their net worth tied up in such stock would provide an incentive to carefully identify and measure risk. It should also reduce outsized compensation for investment bankers.\n\n>* Fifth, there should be greater limits placed on the ability of political appointees to oust career regulators. Make capture more difficult.\n\n>* Sixth, more financial products and firms should be subject to government registration and reporting.\n\n>* Seventh, regulators should not be forced to wear conflicting hats. One cannot promote an industry while protecting the public from it. Don't ask regulators to be industry cheerleaders. Limits can be placed on regulators to ensure that they not act without consideration of the impact of their actions. But over-regulation is not what got us in this position. Cheerleaders purporting to be regulators did.\n\n>* Finally, the government should adopt a bonus plan for regulators, run by regulators (who would rotate off after short, fixed terms, to prevent back-scratching among board members) to provide incentives for regulators to excel at the job of regulation. Recognized, protected and incentivized regulators will resist capture.\n\n\n
/***\n\n|Name|ToggleSideBarMacro|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#ToggleSideBarMacro|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nProvides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.\n\n!Demo\n<<toggleSideBar "Toggle Sidebar">>\n\n!Usage:\n{{{<<toggleSideBar>>}}} <<toggleSideBar>>\nadditional options:\n{{{<<toggleSideBar label tooltip show/hide>>}}} where:\nlabel = custom label for the button,\ntooltip = custom tooltip for the button,\nshow/hide = use one or the other, determines whether the sidebar is shown at first or not.\n(default is to show the sidebar)\n\nYou can add it to your tiddler toolbar, your MainMenu, or where you like really.\nIf you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:\n{{{ .HideSideBarButton {float:right;} }}}\n\n!History\n*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. \n*20-07-06: version 0.11\n*27-04-06: version 0.1: working.\n\n!Code\n***/\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em; width: 100%}\sn"+"",\n styleShow : " ",\n arrow1: "«",\n arrow2: "»"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n\n//}}}
/***\n|Name|TiddlerPasswordPlugin|\n|Source|http://www.TiddlyTools.com/#TiddlerPasswordPlugin|\n|Version|1.1.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description||\n\nThis plugin blocks viewing of specific tiddler content by prompting for a NON-SECURE, UNENCRYPTED password before the tiddler is displayed. If the correct password is not entered, the tiddler is automatically closed. The process does not prevent tiddler content from being viewed directly from the TiddlyWiki source file's storeArea, nor does it encrypt the tiddler content in any way. Because it is relatively simple to bypass and/or disable the password prompting process, this macro should be thought of as a "latch" rather than a "lock" on a given tiddler.\n!!!!!Usage\n<<<\n{{{<<getTiddlerPassword>>}}} \n{{{<<getTiddlerPassword password>>}}}\n{{{<<getTiddlerPassword password "prompt message">>}}}\n{{{<<getTiddlerPassword - "prompt message">>}}}\n\nPlace the {{{<<getTiddlerPassword>>}}} macro at the beginning of your tiddler content. The macro prompts for a password until either A) the correct password is entered or B) the user presses the cancel button from the prompt box, in which case the tiddler is automatically closed so it cannot be viewed. If a valid password is input, it will be remembered only until the user closes the tiddler. Each time the tiddler is opened, the password must be re-entered.\n\nThe optional ''password'' parameter provides a "user-level" password for the tiddler in which the macro occurs. If no user password is provided, then only the admin-level password (see below) will be accepted. \n\nBy default, the prompt message reads: "Please enter a password to view '%0'" (where the %0 is automatically replaced by the name of the tiddler in which the macro occurs) To change this text, enter an additional macro parameter, following the user password.\n>Note: because the prompt text is likely to contain spaces, you should always enclose it in quotes (or use {{{[[...]]}}} if it contains quotes). In addition, to enter an alternative prompt without providing a user-level password, use "-" as a //placeholder// for the password parameter.\n\nNotes:\n* You can also set a hard-coded admin password (see below) to define a "universal passkey" that will grant access to all tiddlers protected by this script, regardless of the individual password used on each protected tiddler.\n* If you embed one or more password-protected tiddlers within another tiddler (by using the {{{<<tiddler TiddlerName>>}}} macro) the user will be prompted to provide the appropriate password for the EACH protected tiddler contained in the tiddler being rendered.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TiddlerPasswordPlugin'' (tagged with <<tag systemConfig>>)\n\n''As soon as you have installed this plugin, you should change the default admin password in [[TiddlerPasswordConfig]].'' Note: the configuration tiddler is password-protected to prevent the admin password from being viewed (and/or modified) unless the current password is provided. By default, the admin password is set to "admin".\n<<<\n!!!!!Revision History\n<<<\n''2007.02.22 [1.1.1]'' updated documentation for using custom prompt text\n''2007.01.01 [1.1.0]'' added optional param for using custom prompt text \n''2006.12.03 [1.0.1]'' handler() uses passed-in 'tiddler.title' (if any), so that title of included protected tiddlers can be correctly displayed (instead of showng title of containing tiddler)\n''2006.12.02 [1.0.0]'' initial release - converted from GetTiddlerPassword inline script\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.getTiddlerPassword= {major: 1, minor: 1, revision: 1, date: new Date(2007,2,22)};\n\nconfig.macros.getTiddlerPassword = {\n msg: "Please enter a password to view '%0'",\n defaultText: "enter password here",\n retryMsg: "'%0' is not the correct password for '%1'. Please try again:",\n cancelMsg: "Sorry, you cannot view '%0' without entering a valid password.",\n thanksMsg: "Thank you, your password has been accepted.",\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var here=story.findContainingTiddler(place); if (!here) return;\n var title=tiddler?tiddler.title:here.getAttribute("tiddler");\n var who=here.getAttribute("logID");\n var userPass=params[0]?params[0]:""; if (userPass=='-') userPass="";\n var msg=params[1]?params[1]:this.msg;\n if (who==userPass||who==this.adminPass) return; // already 'logged in'?\n var who=prompt(msg.format([title]),this.defaultText); // ask for ID\n while (who && who!=userPass && who!=this.adminPass) // not correct ID?\n who=prompt(this.retryMsg.format([who,title]),this.defaultText); // ask again\n if (who==userPass||who==this.adminPass) // correct ID? mark tiddler logged in...\n { here.setAttribute("logID",who); alert(this.thanksMsg); }\n else // incorrect ID (e.g., entry cancelled by user)...\n { story.closeTiddler(here.getAttribute("tiddler")); alert(this.cancelMsg.format([title])); }\n }\n}\n// default admin password (may be overridden in TiddlerPasswordConfig)\nif (config.macros.getTiddlerPassword.adminPass==undefined)\n config.macros.getTiddlerPassword.adminPass="admin";\n//}}}
Background: #fff\nForeground: #000\nPrimaryPale: #8cf\nPrimaryLight: #18f\nPrimaryMid: #04b\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
[[Buteyko Method|http://en.wikipedia.org/wiki/Buteyko_method]]
\n41.595968,-73.233335
Fujifilm FinePix F200EXR Digital camera - compact - 12.0 Megapixel - 5 x optical zoom -
<!--{{{-->\n\n<link rel="alternate" type="application/rss+xml" title="RSS" href="?format=xml" />\n\n<!--}}}-->
http://deimos3.apple.com/WebObjects/Core.woa/Browse/ox-ac-uk-public.2191186376.02191186378\n\nPhilosophy Course from Oxford\n\nAnderson's Book about //Free//\nhttp://www.wired.com/images/multimedia/free/FREE_Audiobook_unabridged.zip
&lt;&lt;option chkOpenInNewWindow&gt;&gt; OpenLinksInNewWindow\n&lt;&lt;option chkToggleLinks&gt;&gt; Clicking on links to tiddlers that are already open causes them to close\n^^(override with Control or other modifier key)^^\n&lt;&lt;option chkForceMinorUpdate&gt;&gt; Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n&lt;&lt;option chkConfirmDelete&gt;&gt; ConfirmBeforeDeleting
\nThe 2009 Kentucky Derby is set for this Saturday with a full field (at least right now) of 20 top-flight horses. This will be the 135th running of the race, and fans can look forward to another great "Running of the Roses". Which jockey/horse combo will be in the winner's circle this year? Let's take a look at the contenders, as well as my picks for this year's Kentucky Derby.\n\n1. West Side Bernie: Bernie has been to six different tracks in his career, but he's yet to win a race as a 3 year old. He ran very well in the Wood Memorial, finishing 2nd behind I Want Revenge. This horse is a solid closer, but could suffer from his post position.\n\n2. Musket Man: Won the Illinois Derby as well as two lower-level races. Not great at this distance, will likely fall late.\n\n3. Mr. Hot Stuff: 30/1 odds on this horse for a reason. Has shown the ability to close on artificial turf, but so far not on dirt.\n\n4. Advice: Patient horse. Snuck into the derby with a win at Lexington, but many experts believe he doesn't deserve to be here.\n\n5. Hold Me Back: Has not been competitive on dirt tracks. Was beaten in the Bluegrass Stakes as the favorite and only ran in two prep races this year.\n
!!! Wealth\n>Wealth is not the same thing as money. [3] Wealth is as old as human history. Far older, in fact; ants have wealth. Money is a comparatively recent invention. Wealth is the fundamental thing. Wealth is stuff we want: food, clothes, houses, cars, gadgets, travel to interesting places, and so on. You can have wealth without having money. \n\n!!!Scrappy\n>Someone who's scrappy manages to be both threatening and undignified at the same time. Which seems to me exactly what one would want to be, in any kind of work. If you're not threatening, you're probably not doing anything new, and dignity is merely a sort of plaque.\n\n!!!Going Fast\n>If you want to go faster, it's a problem to have your work tangled together with a large number of other people's. In a large group, your performance is not separately measurable-- and the rest of the group slows you down.
This is just a test of the comment system.
Tudesday - Went to Dr. McNair for the first time this spring after staying up most of Monday night.
from the NYT\n\n* http://twitter.com/Jetbluecheeps\n* http://www.farecompare.com/\n* http://twitter.com/Michellehiggins\n* http://itasoftware.com/ \n\nTake the bus\nhttp://gotobus.com/\n\nhttp://Kayak.com/
Model 911-9369181 (Made by Roper)\nFault Code F1 - Replace Electronic Range Control/Clock (ERC) from ( http://www.repairclinic.com/0078.asp)
A lot of good reviews and only $500 (can it be that cheap)
Hydrangea\nBleeding Heat\nCoral bell\ncolumn one\nplumbago\nastible\nyellow corydalis\nfoxglove\nhellebores\nbugbane\npulmonarya\nfoamflower\n\n\n<<comments>>
/***\n|''Name:''|DataTiddlerPlugin|\n|''Version:''|1.0.6 (2006-08-26)|\n|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nEnhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).\n\nSuch tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. \n\n''//Example: "Table with all December Expenses"//''\n{{{\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\n}}}\n//(This assumes that expenses are stored in tiddlers tagged with "expense".)//\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\nFor other examples see DataTiddlerExamples.\n\n\n\n\n''Access and Modify Tiddler Data''\n\nYou can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. \n\nThese values can be accessed and modified through the following Tiddler methods:\n|!Method|!Example|!Description|\n|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n\nAlternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.\n|!Method|!Description|\n|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n//(For details on the various functions see the detailed comments in the source code.)//\n\n\n''Data Representation in a Tiddler''\n\nThe data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. \n\n//''Data Section Example:''//\n{{{\n<data>{"isVIP":true,"user":"John Brown","age":34}</data>\n}}}\n\nThe data section is not displayed when viewing the tiddler (see also "The showData Macro").\n\nBeside the data section a tiddler may have all kind of other content.\n\nTypically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.\n\n\n''Saving Changes''\n\nThe "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.\n\n\n''Notifications''\n\nNo notifications are sent when a tiddler's data value is changed through the "setData" methods. \n\n''Escape Data Section''\nIn case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.\n\n\n''The showData Macro''\n\nBy default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:\n\n''Syntax:'' \n|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|\n|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|\n|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\n\n!Revision history\n* v1.0.6 (2006-08-26) \n** Removed misleading comment\n* v1.0.5 (2006-02-27) (Internal Release Only)\n** Internal\n*** Make "JSLint" conform\n* v1.0.4 (2006-02-05)\n** Bugfix: showData fails in TiddlyWiki 2.0\n* v1.0.3 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.2 (2005-12-22)\n** Enhancements:\n*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.\n*** Improved (JSON) error messages.\n** Bugs fixed: \n*** References are not updated when using the DataTiddler.\n*** Changes to compound objects are not always saved.\n*** "~</data>" is not rendered correctly (expected "</data>")\n* v1.0.1 (2005-12-13)\n** Features: \n*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed\n** Bugs fixed: \n*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)\n* v1.0.0 (2005-12-12)\n** initial version\n\n!Code\n***/\n//{{{\n//============================================================================\n//============================================================================\n// DataTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Ensure that the DataTiddler Plugin is only installed once.\n//\nif (!version.extensions.DataTiddlerPlugin) {\n\n\n\nversion.extensions.DataTiddlerPlugin = {\n major: 1, minor: 0, revision: 6,\n date: new Date(2006, 7, 26), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) {\n TiddlyWiki.prototype.getTiddler = function(title) { \n var t = this.tiddlers[title]; \n return (t !== undefined && t instanceof Tiddler) ? t : null; \n };\n}\n\n//============================================================================\n// DataTiddler Class\n//============================================================================\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nfunction DataTiddler() {\n}\n\nDataTiddler = {\n // Function to stringify a JavaScript value, producing the text for the data section content.\n // (Must match the implementation of DataTiddler.parse.)\n //\n stringify : null,\n \n\n // Function to parse the text for the data section content, producing a JavaScript value.\n // (Must match the implementation of DataTiddler.stringify.)\n //\n parse : null\n};\n\n// Ensure access for IE\nwindow.DataTiddler = DataTiddler;\n\n// ---------------------------------------------------------------------------\n// Data Accessor and Mutator\n// ---------------------------------------------------------------------------\n\n\n// Returns the value of the given data field of the tiddler.\n// When no such field is defined or its value is undefined\n// the defaultValue is returned.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.getData = function(tiddler, field, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataValue(t, field, defaultValue);\n};\n\n\n// Sets the value of the given data field of the tiddler to\n// the value. When the value is equal to the defaultValue\n// no value is set (and the field is removed)\n//\n// Changing data of a tiddler will not trigger notifications.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.setData = function(tiddler, field, value, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler+ "("+t+")";\n }\n\n DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);\n};\n\n\n// Returns the data object of the tiddler, with a property for every field.\n//\n// The properties of the returned data object may only be read and\n// not be modified. To modify the data use DataTiddler.setData(...) \n// or the corresponding Tiddler method.\n//\n// If no data section is defined a new (empty) object is returned.\n//\n// @param tiddler either a tiddler name or a Tiddler\n//\nDataTiddler.getDataObject = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataObject(t);\n};\n\n// Returns the text of the content of the data section of the tiddler.\n//\n// When no data section is defined for the tiddler null is returned \n//\n// @param tiddler either a tiddler name or a Tiddler\n// @return [may be null]\n//\nDataTiddler.getDataText = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.readDataSectionText(t);\n};\n\n\n// ---------------------------------------------------------------------------\n// Internal helper methods (must not be used by code from outside this plugin)\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// The original JSONError is not very user friendly, \n// especially it does not define a toString() method\n// Therefore we extend it here.\n//\nDataTiddler.extendJSONError = function(ex) {\n if (ex.name == 'JSONError') {\n ex.toString = function() {\n return ex.name + ": "+ex.message+" ("+ex.text+")";\n };\n }\n return ex;\n};\n\n// Internal.\n//\n// @param t a Tiddler\n//\nDataTiddler.getTiddlerDataObject = function(t) {\n if (t.dataObject === undefined) {\n var data = DataTiddler.readData(t);\n t.dataObject = (data) ? data : {};\n }\n \n return t.dataObject;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {\n var value = DataTiddler.getTiddlerDataObject(tiddler)[field];\n return (value === undefined) ? defaultValue : value;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n var oldValue = data[field];\n \n if (value == defaultValue) {\n if (oldValue !== undefined) {\n delete data[field];\n DataTiddler.save(tiddler);\n }\n return;\n }\n data[field] = value;\n DataTiddler.save(tiddler);\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns its text\n// (as a String).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readDataSectionText = function(tiddler) {\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n if (matches === null || !matches[2]) {\n return null;\n }\n return matches[2];\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns it\n// (as an internalized object).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readData = function(tiddler) {\n var text = DataTiddler.readDataSectionText(tiddler);\n try {\n return text ? DataTiddler.parse(text) : null;\n } catch(ex) {\n throw DataTiddler.extendJSONError(ex);\n }\n};\n\n// Internal.\n// \n// Returns the serialized text of the data of the given tiddler, as it\n// should be stored in the data section.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getDataTextOfTiddler = function(tiddler) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n return DataTiddler.stringify(data);\n};\n\n\n// Internal.\n// \nDataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {\n var index = s.indexOf(subString, startIndex);\n while ((index > 0) && (s[index-1] == '~')) { \n index = s.indexOf(subString, index+1);\n }\n return index;\n};\n\n// Internal.\n//\nDataTiddler.getDataSectionInfo = function(text) {\n // Special care must be taken to handle "<data>" and "</data>" texts inside\n // a data section. \n // Also take care not to use an escaped <data> (i.e. "~<data>") as the start \n // of a data section. (Same for </data>)\n\n // NOTE: we are explicitly searching for a data section that contains a JSON\n // string, i.e. framed with braces. This way we are little bit more robust in\n // case the tiddler contains unescaped texts "<data>" or "</data>". This must\n // be changed when using a different stringifier.\n\n var startTagText = "<data>{";\n var endTagText = "}</data>";\n\n var startPos = 0;\n\n // Find the first not escaped "<data>".\n var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);\n if (startDataTagIndex < 0) {\n return null;\n }\n\n // Find the *last* not escaped "</data>".\n var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);\n if (endDataTagIndex < 0) {\n return null;\n }\n var nextEndDataTagIndex;\n while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {\n endDataTagIndex = nextEndDataTagIndex;\n }\n\n return {\n prefixEnd: startDataTagIndex, \n dataStart: startDataTagIndex+(startTagText.length)-1, \n dataEnd: endDataTagIndex, \n suffixStart: endDataTagIndex+(endTagText.length)\n };\n};\n\n// Internal.\n// \n// Returns the "matches" of a content of a DataTiddler on the\n// "data" regular expression. Return null when no data is defined\n// in the tiddler content.\n//\n// Group 1: text before data section (prefix)\n// Group 2: content of data section\n// Group 3: text behind data section (suffix)\n//\n// @param tiddler a Tiddler\n// @return [may be null] null when the tiddler contains no data section, otherwise see above.\n//\nDataTiddler.getDataTiddlerMatches = function(tiddler) {\n var text = tiddler.text;\n var info = DataTiddler.getDataSectionInfo(text);\n if (!info) {\n return null;\n }\n\n var prefix = text.substr(0,info.prefixEnd);\n var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);\n var suffix = text.substr(info.suffixStart);\n \n return [text, prefix, data, suffix];\n};\n\n\n// Internal.\n//\n// Saves the data in a <data> block of the given tiddler (as a minor change). \n//\n// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. \n// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.\n//\n// Notifications are not send. \n//\n// This method should only be called when the data really has changed. \n//\n// @param tiddler\n// the tiddler to be saved.\n//\nDataTiddler.save = function(tiddler) {\n\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n\n var prefix;\n var suffix;\n if (matches === null) {\n prefix = tiddler.text;\n suffix = "";\n } else {\n prefix = matches[1];\n suffix = matches[3];\n }\n\n var dataText = DataTiddler.getDataTextOfTiddler(tiddler);\n var newText = \n (dataText !== null) \n ? prefix + "<data>" + dataText + "</data>" + suffix\n : prefix + suffix;\n if (newText != tiddler.text) {\n // make the change in the tiddlers text\n \n // ... see DataTiddler.MyTiddlerChangedFunction\n tiddler.isDataTiddlerChange = true;\n \n // ... do the action change\n tiddler.set(\n tiddler.title,\n newText,\n config.options.txtUserName, \n config.options.chkForceMinorUpdate? undefined : new Date(),\n tiddler.tags);\n\n // ... see DataTiddler.MyTiddlerChangedFunction\n delete tiddler.isDataTiddlerChange;\n\n // Mark the store as dirty.\n store.dirty = true;\n \n // AutoSave if option is selected\n if(config.options.chkAutoSave) {\n saveChanges();\n }\n }\n};\n\n// Internal.\n//\nDataTiddler.MyTiddlerChangedFunction = function() {\n // Remove the data object from the tiddler when the tiddler is changed\n // by code other than DataTiddler code. \n //\n // This is necessary since the data object is just a "cached version" \n // of the data defined in the data section of the tiddler and the \n // "external" change may have changed the content of the data section.\n // Thus we are not sure if the data object reflects the data section \n // contents. \n // \n // By deleting the data object we ensure that the data object is \n // reconstructed the next time it is needed, with the data defined by\n // the data section in the tiddler's text.\n \n // To indicate that a change is a "DataTiddler change" a temporary\n // property "isDataTiddlerChange" is added to the tiddler.\n if (this.dataObject && !this.isDataTiddlerChange) {\n delete this.dataObject;\n }\n \n // call the original code.\n DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);\n};\n\n\n//============================================================================\n// Formatters\n//============================================================================\n\n// This formatter ensures that "~<data>" is rendered as "<data>". This is used to \n// escape the "<data>" of a data section, just in case someone really wants to use\n// "<data>" as a text in a tiddler and not start a data section.\n//\n// Same for </data>.\n//\nconfig.formatters.push( {\n name: "data-escape",\n match: "~<\s\s/?data>",\n\n handler: function(w) {\n w.outputText(w.output,w.matchStart + 1,w.nextMatch);\n }\n} );\n\n\n// This formatter ensures that <data>...</data> sections are not rendered.\n//\nconfig.formatters.push( {\n name: "data",\n match: "<data>",\n\n handler: function(w) {\n var info = DataTiddler.getDataSectionInfo(w.source);\n if (info && info.prefixEnd == w.matchStart) {\n w.nextMatch = info.suffixStart;\n } else {\n w.outputText(w.output,w.matchStart,w.nextMatch);\n }\n }\n} );\n\n\n//============================================================================\n// Tiddler Class Extension\n//============================================================================\n\n// "Hijack" the changed method ---------------------------------------------------\n\nDataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;\nTiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;\n\n// Define accessor methods -------------------------------------------------------\n\n// Returns the value of the given data field of the tiddler. When no such field \n// is defined or its value is undefined the defaultValue is returned.\n//\n// When field is undefined (or null) the data object is returned. (See \n// DataTiddler.getDataObject.)\n//\n// @param field [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n// @return [may be null, undefined]\n//\nTiddler.prototype.data = function(field, defaultValue) {\n return (field) \n ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)\n : DataTiddler.getTiddlerDataObject(this);\n};\n\n// Sets the value of the given data field of the tiddler to the value. When the \n// value is equal to the defaultValue no value is set (and the field is removed).\n//\n// @param value [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n//\nTiddler.prototype.setData = function(field, value, defaultValue) {\n DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);\n};\n\n\n//============================================================================\n// showData Macro\n//============================================================================\n\nconfig.macros.showData = {\n // Standard Properties\n label: "showData",\n prompt: "Display the values stored in the data section of the tiddler"\n};\n\nconfig.macros.showData.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the optional "JSON"\n var showInJSONFormat = false;\n if ((i < params.length) && params[i] == "JSON") {\n i++;\n showInJSONFormat = true;\n }\n \n var tiddlerName = story.findContainingTiddler(place).id.substr(7);\n if (i < params.length) {\n tiddlerName = params[i];\n i++;\n }\n\n // --- Processing ------------------------------------------\n try {\n if (showInJSONFormat) {\n this.renderDataInJSONFormat(place, tiddlerName);\n } else {\n this.renderDataAsTable(place, tiddlerName);\n }\n } catch (e) {\n this.createErrorElement(place, e);\n }\n};\n\nconfig.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {\n var text = DataTiddler.getDataText(tiddlerName);\n if (text) {\n createTiddlyElement(place,"pre",null,null,text);\n }\n};\n\nconfig.macros.showData.renderDataAsTable = function(place,tiddlerName) {\n var text = "|!Name|!Value|\sn";\n var data = DataTiddler.getDataObject(tiddlerName);\n if (data) {\n for (var i in data) {\n var value = data[i];\n text += "|"+i+"|"+DataTiddler.stringify(value)+"|\sn";\n }\n }\n \n wikify(text, place);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.showData.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".showDataError{color: #ffffff;background-color: #880000;}",\n "showData");\n\n\n} // of "install only once"\n// Used Globals (for JSLint) ==============\n\n// ... TiddlyWiki Core\n/*global createTiddlyElement, saveChanges, store, story, wikify */\n// ... DataTiddler\n/*global DataTiddler */\n// ... JSON\n/*global JSON */\n \n\n/***\n!JSON Code, used to serialize the data\n***/\n/*\nCopyright (c) 2005 JSON.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe Software shall be used for Good, not Evil.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/*\n The global object JSON contains two methods.\n\n JSON.stringify(value) takes a JavaScript value and produces a JSON text.\n The value must not be cyclical.\n\n JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\n throw a 'JSONError' exception if there is an error.\n*/\nvar JSON = {\n copyright: '(c)2005 JSON.org',\n license: 'http://www.crockford.com/JSON/license.html',\n/*\n Stringify a JavaScript value, producing a JSON text.\n*/\n stringify: function (v) {\n var a = [];\n\n/*\n Emit a string.\n*/\n function e(s) {\n a[a.length] = s;\n }\n\n/*\n Convert a value.\n*/\n function g(x) {\n var c, i, l, v;\n\n switch (typeof x) {\n case 'object':\n if (x) {\n if (x instanceof Array) {\n e('[');\n l = a.length;\n for (i = 0; i < x.length; i += 1) {\n v = x[i];\n if (typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(v);\n }\n }\n e(']');\n return;\n } else if (typeof x.toString != 'undefined') {\n e('{');\n l = a.length;\n for (i in x) {\n v = x[i];\n if (x.hasOwnProperty(i) &&\n typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(i);\n e(':');\n g(v);\n }\n }\n return e('}');\n }\n }\n e('null');\n return;\n case 'number':\n e(isFinite(x) ? +x : 'null');\n return;\n case 'string':\n l = x.length;\n e('"');\n for (i = 0; i < l; i += 1) {\n c = x.charAt(i);\n if (c >= ' ') {\n if (c == '\s\s' || c == '"') {\n e('\s\s');\n }\n e(c);\n } else {\n switch (c) {\n case '\sb':\n e('\s\sb');\n break;\n case '\sf':\n e('\s\sf');\n break;\n case '\sn':\n e('\s\sn');\n break;\n case '\sr':\n e('\s\sr');\n break;\n case '\st':\n e('\s\st');\n break;\n default:\n c = c.charCodeAt();\n e('\s\su00' + Math.floor(c / 16).toString(16) +\n (c % 16).toString(16));\n }\n }\n }\n e('"');\n return;\n case 'boolean':\n e(String(x));\n return;\n default:\n e('null');\n return;\n }\n }\n g(v);\n return a.join('');\n },\n/*\n Parse a JSON text, producing a JavaScript value.\n*/\n parse: function (text) {\n var p = /^\ss*(([,:{}\s[\s]])|"(\s\s.|[^\sx00-\sx1f"\s\s])*"|-?\sd+(\s.\sd*)?([eE][+-]?\sd+)?|true|false|null)\ss*/,\n token,\n operator;\n\n function error(m, t) {\n throw {\n name: 'JSONError',\n message: m,\n text: t || operator || token\n };\n }\n\n function next(b) {\n if (b && b != operator) {\n error("Expected '" + b + "'");\n }\n if (text) {\n var t = p.exec(text);\n if (t) {\n if (t[2]) {\n token = null;\n operator = t[2];\n } else {\n operator = null;\n try {\n token = eval(t[1]);\n } catch (e) {\n error("Bad token", t[1]);\n }\n }\n text = text.substring(t[0].length);\n } else {\n error("Unrecognized token", text);\n }\n } else {\n token = operator = undefined;\n }\n }\n\n\n function val() {\n var k, o;\n switch (operator) {\n case '{':\n next('{');\n o = {};\n if (operator != '}') {\n for (;;) {\n if (operator || typeof token != 'string') {\n error("Missing key");\n }\n k = token;\n next();\n next(':');\n o[k] = val();\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next('}');\n return o;\n case '[':\n next('[');\n o = [];\n if (operator != ']') {\n for (;;) {\n o.push(val());\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next(']');\n return o;\n default:\n if (operator !== null) {\n error("Missing value");\n }\n k = token;\n next();\n return k;\n }\n }\n next();\n return val();\n }\n};\n\n/***\n!Setup the data serialization\n***/\n\nDataTiddler.format = "JSON";\nDataTiddler.stringify = JSON.stringify;\nDataTiddler.parse = JSON.parse;\n\n//}}}\n
http://www.stanford.edu/~scheidel/Divergence.pdf from Steve Hsu
Bank Street Theatre\n46 Bank Street, New Milford, CT\n11:00am 1:30 4:15 7:15pm\n\n
Marware CEO Sleeve $25\n\nBelkin Slim-Fit $20\n\nCase Mate $34 has removable clip so it will fit in your pocket\n\nSena UltraSlim Pouch $29 \n Seems like a winner. Not much protection but not much weight or hassle. \n\n
!!!Anyone can check the codes in thier nissans.\n1.Turn the ignition key to the on position for exactly three seconds\n\n2.Push the accelerator pedal all the way to the floor and release 5 times within 5 seconds.\n\n3.Wait EXACTLY seven seconds\n\n4.Push the accelerator pedal all the way to the floor and hold for ten\nseconds. At this point the SES light should start flashing the error codes\nthat are stored in the system and you can release the pedal. If you only get\nfive slow flashes or no flashes at all, then your timing was off on one of\nthe above steps and you should start over.\n\n5.Now to clear the codes, push the pedal back down all the way to the floor\nand hold for at least ten seconds. The light will continue to flash and\nthere's no indication that the codes have been cleared so make sure you time\nten seconds or more.\n\nWhen the ses starts flashing you count the number of flashes. 1-10 10 being\n0. There will be a 4 diget code. The first flashs are about .5 of a sec the\nnext three are like .3 sec.\n
nephrolithiasis
merge(config.macros,{\n wordCount: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyText(place,tiddler&&tiddler.text?tiddler.text.match(/\sw+/g).length:"0");\n }\n }\n});\n
735 Gallons per season. (Can we get this down?) at 4.60 averages $282 per month $3,384 per year. \n\n
96.32.1.163\n\nchanged from 24. something\n
Samsung PN42B450
<<option chkRegExpSearch>> ~RegExp Search\n<<option chkCaseSensitiveSearch>> Case sensitive search\n<<option chkAnimate>> Enable animations\n<<option chkOpenInNewWindow>> Open links in new window\n<<option chkToggleLinks>> Links close open tiddlers\n<<option chkConfirmDelete>> Confirm before deleting\n<<option chkForceMinorUpdate>> Preserve date/time on edit\n<<option chkInsertTabs>> Insert tab characters\n<<option txtMaxEditRows>> Maximum editor rows\n----\nPluginManager\n
this might work \n\nhttp://docs.info.apple.com/article.html?artnum=42995\n
Category for all those things that might be considered programing related
East Cost Paving 1866-pavement\n\n340 ft . x 12ft = 4,104 \n\n1^^1 / ~~2 inch overlay\n\n[[Cost of paving has almost doubled this year|http://www.dot.ca.gov/hq/esc/oe/asphalt_index/astable.html]]\n\nCost between $7,000 to $14,000\n\n!!!Tar and Chip Example\nIt almost looks like ours\n[img[Example of tar and chip|/filestore/misc/chipandtar.jpg]]\n\nhttp://www.thkinsella.com/products.html Quarry Stone\n\nhttp://www.askthebuilder.com/B127_All_About_Tar_and_Chip_Driveways.shtml About water-based and "cutback"\n
{{{\n# .bash_profile\n\n# Get the aliases and functions\n\nif [ -f ~/.bashrc ]; then\n . ~/.bashrc\nfi\n\n# User specific environment and startup programs\n\nBASH_ENV=$HOME/.bashrc\nUSERNAME=""\nINPUTRC=~/.inputrc\nexport USERNAME BASH_ENV PATH INPUTRC \n}}}
It didn't rain today!
http://www.cga.ct.gov/2009/rpt/2009-R-0331.htm\n\nThis page offers an overview of the state retirement plans. \n\nhttp://www.osc.state.ct.us/empret/healthin/2008hcplan/SOCEMPLHCOP2008finalrev.pdf\nCurrent Health Plan\n\nGuy from Eastern has written about the CSU retirement plans at http://nutmeg.easternct.edu/~russellj/ConnecticutAlternateRetirementProgramCrisis.htm
Cyber infrastructure\n[img[/filestore/uploads/repositories/escidoc.png]]\n\n!!!Architecture\n* The Basic Layer implements a set of resource handlers. \n* Each resource handler is responsible for handling of a specific type of a resource. Each resource handler service implements the four basic operations create, retrieve, update, and delete (CRUD). Additionally, filter methods and task-oriented methods (e.g., for changing the status of an object within a content repository) are provided.\n* The most important resources are Items, Containers, and Contexts. \n\nItems are basic objects that represent content entities within the repository, e.g. articles, \nimages, or videos. \n\nContainers are aggregation objects that allow for arbitrary \ngrouping of items and other containers. Whereas the general layout of Item \nand Container resources remains the same, they can be further specialized by \ncontent types. Content types impose constraints on objects (e.g. allowed \nmetadata schemas, required metadata, allowed file types and mime types for \nthe binary content and specify a set of content type specific properties).\n\nContexts represent units of administration for a set of Items and Containers. They \nare associated with an institutional body responsible for the management of \nthe content. \n\n\n[[API's and Schemas|https://escidoc.org/JSPWiki/en/ObjectManager#section-ObjectManager-Item]]\n\n[[Metadata Schemas|http://metadata.mpdl.mpg.de/escidoc/metadata/schemas/0.1/]]
config.options.chkTopOfPageMode=true;\nconfig.options.chkSinglePageMode=true;\nconfig.options.chkSinglePagePermalink=true;\nconfig.options.chkOpenInNewWindow=false;\n\n
/***\n|Name|SinglePageModePlugin|\n|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|\n|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|\n|Version|2.9.6|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|\n|Options|##Configuration|\n|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|\nThis plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.\n!!!!!Documentation\n>see [[SinglePageModePluginInfo]]\n!!!!!Configuration\n<<<\n<<option chkSinglePageMode>> Display one tiddler at a time\n><<option chkSinglePagePermalink>> Automatically permalink current tiddler\n><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded\n><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited\n<<option chkTopOfPageMode>> Open tiddlers at the top of the page\n<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page\n<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)\n\nNotes:\n* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.\n* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.\n* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.\n<<<\n!!!!!Revisions\n<<<\n2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false\n| Please see [[SinglePageModePluginInfo]] for previous revision details |\n2005.08.15 [1.0.0] Initial Release. Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 6, date: new Date(2008,10,17)};\n//}}}\n//{{{\nconfig.paramifiers.SPM = { onstart: function(v) {\n config.options.chkSinglePageMode=eval(v);\n if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {\n config.lastURL = window.location.hash;\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n} };\n//}}}\n//{{{\nif (config.options.chkSinglePageMode==undefined)\n config.options.chkSinglePageMode=false;\nif (config.options.chkSinglePagePermalink==undefined)\n config.options.chkSinglePagePermalink=true;\nif (config.options.chkSinglePageKeepFoldedTiddlers==undefined)\n config.options.chkSinglePageKeepFoldedTiddlers=false;\nif (config.options.chkSinglePageKeepEditedTiddlers==undefined)\n config.options.chkSinglePageKeepEditedTiddlers=false;\nif (config.options.chkTopOfPageMode==undefined)\n config.options.chkTopOfPageMode=false;\nif (config.options.chkBottomOfPageMode==undefined)\n config.options.chkBottomOfPageMode=false;\nif (config.options.chkSinglePageAutoScroll==undefined)\n config.options.chkSinglePageAutoScroll=false;\n//}}}\n//{{{\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash) return; // no change in hash\n var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();\n if (tids.length==1) // permalink (single tiddler in URL)\n story.displayTiddler(null,tids[0]);\n else { // restore permaview or default view\n config.lastURL = window.location.hash;\n if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();\n story.closeAllTiddlers();\n story.displayTiddlers(null,tids);\n }\n}\n\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined)\n Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)\n{\n var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;\n var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already displayed\n var opt=config.options;\n var single=opt.chkSinglePageMode && !startingUp;\n var top=opt.chkTopOfPageMode && !startingUp;\n var bottom=opt.chkBottomOfPageMode && !startingUp;\n if (single) {\n story.forEachTiddler(function(tid,elem) {\n // skip current tiddler and, optionally, tiddlers that are folded.\n if ( tid==title\n || (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))\n return;\n // if a tiddler is being edited, ask before closing\n if (elem.getAttribute("dirty")=="true") {\n if (opt.chkSinglePageKeepEditedTiddlers) return;\n // if tiddler to be displayed is already shown, then leave active tiddler editor as is\n // (occurs when switching between view and edit modes)\n if (tiddlerElem) return;\n // otherwise, ask for permission\n var msg="'"+tid+"' is currently being edited.\sn\sn";\n msg+="Press OK to save and close this tiddler\snor press Cancel to leave it opened";\n if (!confirm(msg)) return; else story.saveTiddler(tid);\n }\n story.closeTiddler(tid);\n });\n }\n else if (top)\n arguments[0]=null;\n else if (bottom)\n arguments[0]="bottom";\n if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering\n var isTopTiddler=(tiddlerElem.previousSibling==null);\n if (!isTopTiddler && (single || top))\n tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);\n else if (bottom)\n tiddlerElem.parentNode.insertBefore(tiddlerElem,null);\n else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler\n } else\n this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler\n var tiddlerElem=document.getElementById(story.idPrefix+title);\n if (tiddlerElem&&opt.chkSinglePageAutoScroll) {\n // scroll to top of page or top of tiddler\n var isTopTiddler=(tiddlerElem.previousSibling==null);\n var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);\n // if animating, defer scroll until after animation completes\n var delay=opt.chkAnimate?config.animDuration+10:0;\n setTimeout("window.scrollTo(0,"+yPos+")",delay); \n }\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined)\n Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function() {\n // suspend single/top/bottom modes when showing multiple tiddlers\n var opt=config.options;\n var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;\n var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;\n var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;\n this.SPM_coreDisplayTiddlers.apply(this,arguments);\n opt.chkBottomOfPageMode=saveBPM;\n opt.chkTopOfPageMode=saveTPM;\n opt.chkSinglePageMode=saveSPM;\n}\n//}}}
212.158.160.0/20 \n212.24.32.0/19\n212.24.48.170/24\n217.23.128.0/19\n62.213.64.0/18\n72.232.191.50 \n81.176.0.0/15\n85.255.118.92/24\n~
/***\n|Name|ImportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|\n|Documentation|http://www.TiddlyTools.com/#ImportTiddlersPluginInfo|\n|Version|4.5.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|config.macros.importTiddlers.handler|\n|Description|interactive controls for import/export with filtering.|\nCombine tiddlers from any two TiddlyWiki documents. An interactive control panel lets you pick a source document and import selected tiddlers, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Generates a detailed report of import 'history' in ImportedTiddlers.\n!!!!!Documentation\n<<<\nsee [[ImportTiddlersPluginInfo]] for details\n<<<\n!!!!!interactive control panel:\n<<<\n<<importTiddlers inline>>\n{{clear{\n^^(see also: [[ImportTiddlers]] shadow tiddler)^^}}}\n<<<\n!!!!!Revisions\n<<<\n2009.05.04 [4.5.0] import from CSV-formatted files\n|please see [[ImportTiddlersPluginInfo]] for additional revision details|\n2005.07.20 [1.0.0] Initial Release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.ImportTiddlersPlugin= {major: 4, minor: 5, revision: 0, date: new Date(2009,5,4)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\n// default shadow definition\nconfig.shadowTiddlers.ImportTiddlers='<<importTiddlers inline>>';\n\n// use shadow tiddler content in backstage panel\nif (config.tasks) config.tasks.importTask.content='<<tiddler ImportTiddlers>>' // TW2.2 or above\n//}}}\n//{{{\n// backward-compatiblity for TW2.0.x and TW1.2.x\nif (config.macros.importTiddlers==undefined) config.macros.importTiddlers={};\nif (typeof merge=='undefined') {\n function merge(dst,src,preserveExisting) {\n for(var i in src) { if(!preserveExisting || dst[i] === undefined) dst[i] = src[i]; }\n return dst;\n }\n}\nif (config.browser.isGecko===undefined)\n config.browser.isGecko=(config.userAgent.indexOf('gecko')!=-1);\n//}}}\n//{{{\nmerge(config.macros.importTiddlers,{\n $: function(id) { return document.getElementById(id); }, // abbreviation\n label: 'import tiddlers',\n prompt: 'Copy tiddlers from another document',\n openMsg: 'Opening %0',\n openErrMsg: 'Could not open %0 - error=%1',\n readMsg: 'Read %0 bytes from %1',\n foundMsg: 'Found %0 tiddlers in %1',\n filterMsg: "Filtered %0 tiddlers matching '%1'",\n summaryMsg: '%0 tiddler%1 in the list',\n summaryFilteredMsg: '%0 of %1 tiddler%2 in the list',\n plural: 's are',\n single: ' is',\n countMsg: '%0 tiddlers selected for import',\n processedMsg: 'Processed %0 tiddlers',\n importedMsg: 'Imported %0 of %1 tiddlers from %2',\n loadText: 'please load a document...',\n closeText: 'close',\n doneText: 'done',\n startText: 'import',\n stopText: 'stop',\n local: true, // default to import from local file\n src: '', // path/filename or URL of document to import (retrieved from SiteUrl)\n proxy: '', // URL for remote proxy script (retrieved from SiteProxy)\n useProxy: false, // use specific proxy script in front of remote URL\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: 10, // # 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 sync: false, // add 'server' fields to imported tiddlers (for sync function)\n lastFilter: '', // most recent filter (URL hash) applied\n lastAction: null, // most recent collision button performed\n index: 0, // current processing index in import list\n sort: '' // sort order for imported tiddler listbox\n});\n//}}}\n//{{{\n// hijack core macro handler\nif (config.macros.importTiddlers.coreHandler==undefined)\n config.macros.importTiddlers.coreHandler=config.macros.importTiddlers.handler;\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!params[0] || params[0].toLowerCase()=='core') { // default to built in\n if (config.macros.importTiddlers.coreHandler)\n config.macros.importTiddlers.coreHandler.apply(this,arguments);\n else \n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n } else if (params[0]=='link') { // show link to floating panel\n createTiddlyButton(place,params[1]||this.label,params[2]||this.prompt,onClickImportMenu);\n } else if (params[0]=='inline') {// show panel as INLINE tiddler content\n createImportPanel(place);\n this.$('importPanel').style.position='static';\n this.$('importPanel').style.display='block';\n } else if (config.macros.loadTiddlers)\n config.macros.loadTiddlers.handler(place,macroName,params); // any other params: loadtiddlers\n}\n//}}}\n//{{{\n// Handle link click to create/show/hide control panel\nfunction onClickImportMenu(e) { var e=e||window.event;\n var parent=resolveTarget(e).parentNode;\n var panel=document.getElementById('importPanel');\n if (panel==undefined || panel.parentNode!=parent) panel=createImportPanel(parent);\n var isOpen=panel.style.display=='block';\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,false,'none'));\n else\n panel.style.display=isOpen?'none':'block';\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n}\n//}}}\n//{{{\n// Create control panel: HTML, CSS\nfunction createImportPanel(place) {\n var cmi=config.macros.importTiddlers; // abbrev\n var panel=cmi.$('importPanel');\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(cmi.css,'importTiddlers');\n panel=createTiddlyElement(place,'span','importPanel',null,null)\n panel.innerHTML=cmi.html;\n refreshImportList();\n var siteURL=store.getTiddlerText('SiteUrl'); if (!siteURL) siteURL='';\n cmi.$('importSourceURL').value=siteURL;\n cmi.src=siteURL;\n var siteProxy=store.getTiddlerText('SiteProxy'); if (!siteProxy) siteProxy='SiteProxy';\n cmi.$('importSiteProxy').value=siteProxy;\n cmi.proxy=siteProxy;\n if (config.browser.isGecko) { // FF3 FIXUP\n cmi.$('fileImportSource').style.display='none';\n cmi.$('importLocalPanelFix').style.display='block';\n }\n cmi.$('chkSync').checked=cmi.sync;\n cmi.$('chkImportTags').checked=cmi.importTags;\n cmi.$('chkKeepTags').checked=cmi.keepTags;\n cmi.$('chkAddTags').checked=cmi.addTags;\n cmi.$('txtNewTags').value=cmi.newTags;\n cmi.$('txtNewTags').style.display=cmi.addTags?'block':'none';\n cmi.$('chkSync').checked=cmi.sync;\n cmi.$('chkImportReport').checked=config.options.chkImportReport;\n return panel;\n}\n//}}}\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 background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em;\s\n}\s\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel select { width:100%;margin:0px;font-size:8pt;line-height:110%;}\s\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#importPanel .box { border:1px solid #000; background-color:#eee; padding:3px 5px; margin-bottom:5px; -moz-border-radius:5px;-webkit-border-radius:5px;}\s\n#importPanel .topline { border-top:1px solid #999; padding-top:2px; margin-top:2px; }\s\n#importPanel .rad { width:auto; }\s\n#importPanel .chk { width:auto; margin:1px;border:0; }\s\n#importPanel .btn { width:auto; }\s\n#importPanel .btn1 { width:98%; }\s\n#importPanel .btn2 { width:48%; }\s\n#importPanel .btn3 { width:32%; }\s\n#importPanel .btn4 { width:23%; }\s\n#importPanel .btn5 { width:19%; }\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#backstagePanel #importPanel { left:10%; right:auto; }\s\n';\n//}}}\n//{{{\nconfig.macros.importTiddlers.html = '\s\n<!-- source and report -->\s\n<table><tr><td align=left>\s\n import from\s\n <input type="radio" class="rad" name="importFrom" id="importFromFile" value="file" CHECKED\s\n onclick="onClickImportButton(this,event)" title="show file controls"> local file\s\n <input type="radio" class="rad" name="importFrom" id="importFromWeb" value="http"\s\n onclick="onClickImportButton(this,event)" title="show web controls"> web server\s\n</td><td align=right>\s\n <input type=checkbox class="chk" id="chkImportReport"\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;"> create report\s\n</td></tr></table>\s\n\s\n<div class="box" id="importSourcePanel" style="margin:.5em">\s\n<div id="importLocalPanel" style="display:block;margin-bottom:2px;"><!-- import from local file -->\s\nenter or browse for source path/filename<br>\s\n<input type="file" id="fileImportSource" size=57 style="width:100%"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;document.getElementById(\s'importLoad\s').onclick()">\s\n<div id="importLocalPanelFix" style="display:none"><!-- FF3 FIXUP -->\s\n <input type="text" id="fileImportSourceFix" style="width:90%"\s\n title="Enter a path/file to import"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;document.getElementById(\s'importLoad\s').onclick()">\s\n <input type="button" id="fileImportSourceFixButton" style="width:7%" value="..."\s\n title="Select a path/file to import"\s\n onClick="var r=config.macros.importTiddlers.askForFilename(this); if (!r||!r.length) return;\s\n document.getElementById(\s'fileImportSourceFix\s').value=r;\s\n config.macros.importTiddlers.src=r;\s\n document.getElementById(\s'importLoad\s').onclick()">\s\n</div><!--end FF3 FIXUP-->\s\n</div><!--end local-->\s\n<div id="importHTTPPanel" style="display:none;margin-bottom:2px;"><!-- import from http server -->\s\n<table><tr><td align=left>\s\n enter a URL or <a href="javascript:;" id="importSelectFeed"\s\n onclick="onClickImportButton(this,event)" title="select a pre-defined \s'systemServer\s' URL">\s\n select a server</a><br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="importUsePassword"\s\n onClick="config.macros.importTiddlers.usePassword=this.checked;\s\n config.macros.importTiddlers.showPanel(\s'importIDPWPanel\s',this.checked,true);">password\s\n <input type="checkbox" class="chk" id="importUseProxy"\s\n onClick="config.macros.importTiddlers.useProxy=this.checked;\s\n config.macros.importTiddlers.showPanel(\s'importSiteProxy\s',this.checked,true);">proxy\s\n</td></tr></table>\s\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\s\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\s\n onChange="config.macros.importTiddlers.proxy=this.value;">\s\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n<div id="importIDPWPanel" style="text-align:center;margin-top:2px;display:none";>\s\nusername: <input type=text id="txtImportID" style="width:25%" \s\n onChange="config.options.txtRemoteUsername=this.value;">\s\n password: <input type=password id="txtImportPW" style="width:25%" \s\n onChange="config.options.txtRemotePassword=this.value;">\s\n</div><!--end idpw-->\s\n</div><!--end http-->\s\n</div><!--end source-->\s\n\s\n<div class="box" id="importSelectPanel" style="display:none;margin:.5em;">\s\n<table><tr><td align=left>\s\nselect:\s\n<a href="javascript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this);return false;" title="SELECT all tiddlers">\s\n all</a>\s\n&nbsp;<a href="javascript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this);return false;" title="SELECT tiddlers not already in destination document">\s\n added</a>\s\n&nbsp;<a href="javascript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this);return false;" title="SELECT tiddlers that have been updated in source document">\s\n changes</a>\s\n&nbsp;<a href="javascript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this);return false;" title="SELECT tiddlers that have been added or are different from existing tiddlers">\s\n differences</a>\s\n</td><td align=right>\s\n<a href="javascript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this);return false;" title="SHRINK list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n<a href="javascript:;" id="importListLarger"\s\n onclick="onClickImportButton(this);return false;" title="GROW list size">\s\n &nbsp;+&nbsp;</a>\s\n<a href="javascript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this);return false;" title="MAXIMIZE/RESTORE list size">\s\n &nbsp;=&nbsp;</a>\s\n</td></tr></table>\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<div style="text-align:center">\s\n <a href="javascript:;"\s\n title="click for help using filters..."\s\n onclick="alert(\s'A filter consists of one or more space-separated combinations of:\s\sn\s\sntiddler titles\s\sntag:[[tagvalue]]\s\sntag:[[tag expression]] (requires MatchTagsPlugin)\s\snstory:[[TiddlerName]]\s\snsearch:[[searchtext]]\s\sn\s\snUse a blank filter for all tiddlers.\s')"\s\n >filter</a>\s\n <input type="text" id="importLastFilter" style="margin-bottom:1px; width:65%"\s\n title="Enter a combination of one or more filters. Use a blank filter for all tiddlers."\s\n onfocus="this.select()" value=""\s\n onKeyUp="config.macros.importTiddlers.lastFilter=this.value"\s\n onChange="config.macros.importTiddlers.lastFilter=this.value;">\s\n <input type="button" id="importApplyFilter" style="width:20%" value="apply"\s\n title="filter list of tiddlers to include only those that match certain criteria"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div><!--end select-->\s\n\s\n<div class="box" id="importOptionsPanel" style="text-align:center;margin:.5em;display:none;">\s\n apply tags: <input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">from source&nbsp;\s\n <input type=checkbox class="chk" id="chkKeepTags" checked\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing&nbsp;\s\n <input type=checkbox class="chk" id="chkAddTags" \s\n onClick="config.macros.importTiddlers.addTags=this.checked;\s\n config.macros.importTiddlers.showPanel(\s'txtNewTags\s',this.checked,false);\s\n if (this.checked) document.getElementById(\s'txtNewTags\s').focus();">add tags<br>\s\n <input type=text id="txtNewTags" style="margin-top:4px;display:none;" size=15\s onfocus="this.select()" \s\n title="enter tags to be added to imported tiddlers" \s\n onKeyUp="config.macros.importTiddlers.newTags=this.value;\s\n document.getElementById(\s'chkAddTags\s').checked=this.value.length>0;" autocomplete=off>\s\n <nobr><input type=checkbox class="chk" id="chkSync" \s\n onClick="config.macros.importTiddlers.sync=this.checked;">\s\n link tiddlers to source document (for sync later)</nobr>\s\n</div><!--end options-->\s\n\s\n<div id="importButtonPanel" style="text-align:center">\s\n <input type=button id="importLoad" class="importButton btn3" value="open"\s\n title="load listbox with tiddlers from source document"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importOptions" class="importButton btn3" value="options..."\s\n title="set options for tags, sync, etc."\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton btn3" value="import"\s\n title="start/stop import of selected source tiddlers into current document"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton btn3" value="done"\s\n title="clear listbox or hide control panel"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n\s\n<div class="none" id="importCollisionPanel" style="display:none;margin:.5em 0 .5em .5em;">\s\n <table><tr><td style="width:65%" align="left">\s\n <table><tr><td align=left>\s\n tiddler already exists:\s\n </td><td align=right>\s\n <input type=checkbox class="chk" id="importApplyToAll" \s\n onclick="document.getElementById(\s'importRename\s').disabled=this.checked;"\s\n checked>apply to all\s\n </td></tr></table>\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n </td><td style="width:34%" align="center">\s\n <input type=button id="importMerge"\s\n class="importButton" style="width:47%" value="merge"\s\n title="append the incoming tiddler to the existing tiddler"\s\n onclick="onClickImportButton(this)"><!--\s\n --><input type=button id="importSkip"\s\n class="importButton" style="width:47%" value="skip"\s\n title="do not import this tiddler"\s\n onclick="onClickImportButton(this)"><!--\s\n --><br><input type=button id="importRename"\s\n class="importButton" style="width:47%" value="rename"\s\n title="rename the incoming tiddler"\s\n onclick="onClickImportButton(this)"><!--\s\n --><input type=button id="importReplace"\s\n class="importButton" style="width:47%" value="replace"\s\n title="discard the existing tiddler"\s\n onclick="onClickImportButton(this)">\s\n </td></tr></table>\s\n</div><!--end collision-->\s\n';\n//}}}\n//{{{\n// process control interactions\nfunction onClickImportButton(which,event) {\n var cmi=config.macros.importTiddlers; // abbreviation\n var list=cmi.$('importList'); if (!list) return;\n var thePanel=cmi.$('importPanel');\n var theCollisionPanel=cmi.$('importCollisionPanel');\n var theNewTitle=cmi.$('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'importFromFile': // show local panel\n case 'importFromWeb': // show HTTP panel\n cmi.local=(which.id=='importFromFile');\n cmi.showPanel('importLocalPanel',cmi.local);\n cmi.showPanel('importHTTPPanel',!cmi.local);\n break;\n case 'importOptions': // show/hide options panel\n cmi.showPanel('importOptionsPanel',cmi.$('importOptionsPanel').style.display=='none');\n break;\n case 'fileImportSource':\n case 'importLoad': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n cmi.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (cmi.src=='') break;\n // Load document, read it's DOM and fill the list\n cmi.loadRemoteFile(cmi.src,cmi.filterTiddlerList);\n break;\n case 'importSelectFeed': // select a pre-defined systemServer feed URL\n var p=Popup.create(which); if (!p) return;\n var tids=store.getTaggedTiddlers('systemServer');\n if (!tids.length)\n createTiddlyText(createTiddlyElement(p,'li'),'no pre-defined server feeds');\n for (var t=0; t<tids.length; t++) {\n var u=store.getTiddlerSlice(tids[t].title,'URL');\n var d=store.getTiddlerSlice(tids[t].title,'Description');\n if (!d||!d.length) d=store.getTiddlerSlice(tids[t].title,'description');\n if (!d||!d.length) d=u;\n createTiddlyButton(createTiddlyElement(p,'li'),tids[t].title,d,\n function(){\n var u=this.getAttribute('url');\n document.getElementById('importSourceURL').value=u;\n config.macros.importTiddlers.src=u;\n document.getElementById('importLoad').onclick();\n },\n null,null,null,{url:u});\n }\n Popup.show(p,false);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return(false);\n // create popup with feed list\n // onselect, insert feed URL into input field.\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 < list.options.length; t++) {\n if (list.options[t].value=='') continue;\n list.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!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 < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value=='') continue;\n list.options[t].selected=!store.tiddlerExists(list.options[t].value);\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!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 < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value==''||!store.tiddlerExists(list.options[t].value)) continue;\n for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler\n { var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }\n list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified>0); // updated tiddler\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!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 < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value=='') continue;\n if (!store.tiddlerExists(list.options[t].value)) { list.options[t].selected=true; count++; continue; }\n for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler\n { var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }\n list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified!=0); // changed tiddler\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importApplyFilter': // filter list to include only matching tiddlers\n importReport(); // if an import was in progress, generate a report\n clearMessage();\n if (!cmi.all) // no tiddlers loaded = '0 selected'\n { displayMessage(cmi.countMsg.format([0])); return false; }\n var hash=cmi.$('importLastFilter').value;\n cmi.inbound=cmi.filterByHash('#'+hash,cmi.all);\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n cmi.$('importApplyToAll').checked=false;\n cmi.$('importStart').value=cmi.stopText;\n if (cmi.index>0) cmi.index=-1; // stop processing\n else cmi.index=importTiddlers(0); // or begin processing\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 (!cmi.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n cmi.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.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 theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: ';\n theText +='[['+cmi.src+'#'+theItem.value+'|'+cmi.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+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 0hh:0mm:0ss');\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.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 0hh:0mm:0ss');\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (list.options.length==1) break;\n list.size-=(list.size>5)?1:0;\n cmi.listsize=list.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (list.options.length==1) break;\n list.size+=(list.size<list.options.length)?1:0;\n cmi.listsize=list.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (list.options.length==1) break;\n list.size=(list.size==list.options.length)?cmi.listsize:list.options.length;\n break;\n }\n}\n//}}}\n//{{{\nconfig.macros.importTiddlers.showPanel=function(place,show,skipAnim) {\n if (typeof place=='string') var place=document.getElementById(place);\n if (!place||!place.style) return;\n if(!skipAnim && anim && config.options.chkAnimate) anim.startAnimating(new Slider(place,show,false,'none'));\n else place.style.display=show?'block':'none';\n}\n//}}}\n//{{{\nfunction refreshImportList(selectedIndex) {\n var cmi=config.macros.importTiddlers; // abbrev\n var list=cmi.$('importList'); if (!list) return;\n // if nothing to show, reset list content and size\n if (!cmi.inbound) {\n while (list.length > 0) { list.options[0] = null; }\n list.options[0]=new Option(cmi.loadText,'',false,false);\n list.size=cmi.listsize;\n cmi.$('importLoad').disabled=false;\n cmi.$('importLoad').style.display='inline';\n cmi.$('importStart').disabled=true;\n cmi.$('importOptions').disabled=true;\n cmi.$('importOptions').style.display='none';\n cmi.$('fileImportSource').disabled=false;\n cmi.$('importFromFile').disabled=false;\n cmi.$('importFromWeb').disabled=false;\n cmi.$('importStart').value=cmi.startText;\n cmi.$('importClose').value=cmi.doneText;\n cmi.$('importSelectPanel').style.display='none';\n cmi.$('importOptionsPanel').style.display='none';\n return;\n }\n // there are inbound tiddlers loaded...\n cmi.$('importLoad').disabled=true;\n cmi.$('importLoad').style.display='none';\n cmi.$('importOptions').style.display='inline';\n cmi.$('importOptions').disabled=false;\n cmi.$('fileImportSource').disabled=true;\n cmi.$('importFromFile').disabled=true;\n cmi.$('importFromWeb').disabled=true;\n cmi.$('importClose').value=cmi.closeText;\n if (cmi.$('importSelectPanel').style.display=='none')\n cmi.showPanel('importSelectPanel',true);\n\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) cmi.sort='title'; // heading\n if (selectedIndex==1) cmi.sort='title';\n if (selectedIndex==2) cmi.sort='modified';\n if (selectedIndex==3) cmi.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < list.options.length; t++) {\n if (!list.options[t].selected) continue;\n if (list.options[t].value!='')\n count+=1;\n else { // if heading is selected, deselect it, and then select and count all in section\n list.options[t].selected=false;\n for ( t++; t<list.options.length && list.options[t].value!=''; t++) {\n list.options[t].selected=true;\n count++;\n }\n }\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n }\n cmi.$('importStart').disabled=!count;\n if (selectedIndex>3) return; // no refresh needed\n\n // get the alphasorted list of tiddlers\n var tiddlers=cmi.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 (list.length > 0) { list.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 if (cmi.all.length==tiddlers.length)\n var summary=cmi.summaryMsg.format([tiddlers.length,(tiddlers.length!=1)?cmi.plural:cmi.single]);\n else\n var summary=cmi.summaryFilteredMsg.format([tiddlers.length,cmi.all.length,(cmi.all.length!=1)?cmi.plural:cmi.single]);\n list.options[i++]=new Option(summary,'',false,false);\n list.options[i++]=new Option(((cmi.sort=='title' )?'>':indent)+' [by title]','',false,false);\n list.options[i++]=new Option(((cmi.sort=='modified')?'>':indent)+' [by date]','',false,false);\n list.options[i++]=new Option(((cmi.sort=='tags')?'>':indent)+' [by tags]','',false,false);\n // output the tiddler list\n switch(cmi.sort) {\n case 'title':\n for(var t = 0; t < tiddlers.length; t++)\n list.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 list.options[i++] = new Option(theSection,'',false,false);\n lastSection = theSection;\n }\n list.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 if (!tags || !tags.length) {\n if (theTitles['untagged']==undefined) { theTags.push('untagged'); theTitles['untagged']=new Array(); }\n theTitles['untagged'].push(title);\n }\n else 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 list.options[i++]=new Option(theTag,'',false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n list.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n list.selectedIndex=selectedIndex; // select current control item\n if (list.size<cmi.listsize) list.size=cmi.listsize;\n if (list.size>list.options.length) list.size=list.options.length;\n}\n//}}}\n//{{{\n// re-entrant processing for handling import with interactive collision prompting\nfunction importTiddlers(startIndex) {\n var cmi=config.macros.importTiddlers; // abbrev\n if (!cmi.inbound) return -1;\n var list=cmi.$('importList'); if (!list) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<cmi.inbound.length;t++)\n cmi.inbound[t].status='';\n for (var i=startIndex; i<list.options.length; i++) {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!list.options[i].selected) || ((t=list.options[i].value)==''))\n continue;\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==t) break;\n var inbound = cmi.inbound[j];\n var theExisting = store.getTiddler(inbound.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (inbound.status=='added')\n continue;\n // don't import the 'ImportedTiddlers' history from the other document...\n if (inbound.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (inbound.status.substr(0,7)!='replace') && (inbound.status.substr(0,5)!='merge'))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = '';\n if (cmi.importTags)\n newTags+=inbound.getTags() // import remote tags\n if (cmi.keepTags && theExisting)\n newTags+=' '+theExisting.getTags(); // keep existing tags\n if (cmi.addTags && cmi.newTags.trim().length)\n newTags+=' '+cmi.newTags; // add new tags\n inbound.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n inbound.status=(inbound.status=='')?'added':inbound.status;\n // set sync fields\n if (cmi.sync) {\n if (!inbound.fields) inbound.fields={}; // for TW2.1.x backward-compatibility\n inbound.fields['server.page.revision']=inbound.modified.convertToYYYYMMDDHHMM();\n inbound.fields['server.type']='file';\n inbound.fields['server.host']=(cmi.local?'file://':'')+cmi.src;\n }\n // do the import!\n store.suspendNotifications();\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags, inbound.fields, true, inbound.created);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value (needed for TW2.1.x and earlier)\n store.resumeNotifications();\n }\n return(-1); // signals that we really finished the entire list\n}\nfunction importStopped() {\n var cmi=config.macros.importTiddlers; // abbrev\n var list=cmi.$('importList'); if (!list) return;\n var theNewTitle=cmi.$('importNewTitle');\n if (cmi.index==-1){ \n cmi.$('importStart').value=cmi.startText;\n importReport(); // import finished... generate the report\n } else {\n // import collision...\n // show the collision panel and set the title edit field\n cmi.$('importStart').value=cmi.stopText;\n cmi.showPanel('importCollisionPanel',true);\n theNewTitle.value=list.options[cmi.index].value;\n if (cmi.$('importApplyToAll').checked && cmi.lastAction && cmi.lastAction.id!='importRename')\n onClickImportButton(cmi.lastAction);\n }\n}\n//}}}\n//{{{\nfunction importReport() {\n var cmi=config.macros.importTiddlers; // abbrev\n if (!cmi.inbound) return;\n // if import was not completed, the collision panel will still be open... close it now.\n var panel=cmi.$('importCollisionPanel'); if (panel) panel.style.display='none';\n // get the alphasorted list of tiddlers\n var tiddlers = cmi.inbound;\n // gather the statistics\n var count=0; var total=0;\n for (var t=0; t<tiddlers.length; t++) {\n if (!tiddlers[t].status || !tiddlers[t].status.trim().length) continue;\n if (tiddlers[t].status.substr(0,7)!='skipped') count++;\n total++;\n }\n // generate a report\n if (total) displayMessage(cmi.processedMsg.format([total]));\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport=new Tiddler(); theReport.title='ImportedTiddlers'; theReport.text=''; }\n // format the report content\n var now = new Date();\n var newText = 'On '+now.toLocaleString()+', '+config.options.txtUserName\n newText +=' imported '+count+' tiddler'+(count==1?'':'s')+' from\sn[['+cmi.src+'|'+cmi.src+']]:\sn';\n if (cmi.addTags && cmi.newTags.trim().length)\n newText += 'imported tiddlers were tagged with: "'+cmi.newTags+'"\sn';\n newText += '<<<\sn';\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status)\n newText += '#[['+tiddlers[t].title+']] - '+tiddlers[t].status+'\sn';\n newText += '<<<\sn';\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!='')?'\sn----\sn':'')+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags, theReport.fields);\n story.displayTiddler(null,theReport.title,1,null,null,false);\n story.refreshTiddler(theReport.title,1,true);\n }\n // reset status flags\n for (var t=0; t<cmi.inbound.length; t++) cmi.inbound[t].status='';\n // mark document as dirty and let display update as needed\n if (count) { store.setDirty(true); store.notifyAll(); }\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(cmi.importedMsg.format([count,tiddlers.length,cmi.src.replace(/%20/g,' ')]));\n}\n//}}}\n//{{{\n// // File and XMLHttpRequest I/O\nconfig.macros.importTiddlers.askForFilename=function(here) {\n var msg=here.title; // use tooltip as dialog box message\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf('/'); if (slashpos==-1) slashpos=path.lastIndexOf('\s\s'); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n var file='';\n var result='';\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeOpen);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XPSP2 IE only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { // fallback\n var result=prompt(msg,path+file);\n }\n }\n return result;\n}\n\nconfig.macros.importTiddlers.loadRemoteFile = function(src,callback) {\n if (src==undefined || !src.length) return null; // filename is required\n var original=src; // URL as specified\n var hashpos=src.indexOf('#'); if (hashpos!=-1) src=src.substr(0,hashpos); // URL with #... suffix removed (needed for IE)\n clearMessage();\n displayMessage(this.openMsg.format([src.replace(/%20/g,' ')]));\n if (src.substr(0,5)!='http:' && src.substr(0,5)!='file:') { // if not a URL, read from local filesystem\n var txt=loadFile(src);\n if (!txt) { // file didn't load, might be relative path.. try fixup\n var pathPrefix=document.location.href; // get current document path and trim off filename\n var slashpos=pathPrefix.lastIndexOf('/'); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf('\s\s'); \n if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);\n src=pathPrefix+src;\n if (pathPrefix.substr(0,5)!='http:') src=getLocalPath(src);\n var txt=loadFile(src);\n }\n if (!txt) { // file still didn't load, report error\n displayMessage(config.macros.importTiddlers.openErrMsg.format([src.replace(/%20/g,' '),'(filesystem error)']));\n } else {\n displayMessage(config.macros.importTiddlers.readMsg.format([txt.length,src.replace(/%20/g,' ')]));\n if (callback) callback(true,original,convertUTF8ToUnicode(txt),src,null);\n }\n } else {\n var name=config.options.txtRemoteUsername; var pass=config.options.txtRemotePassword;\n var xhr=doHttp('GET',src,null,null,name,pass,callback,original,null)\n if (!xhr) displayMessage(config.macros.importTiddlers.openErrMsg.format([src,'(XMLHTTPRequest error)']));\n }\n}\n\nconfig.macros.importTiddlers.readTiddlersFromHTML=function(html)\n{\n var remoteStore=new TiddlyWiki();\n remoteStore.importTiddlyWiki(html);\n return remoteStore.getTiddlers('title'); \n}\n\nconfig.macros.importTiddlers.readTiddlersFromCSV=function(CSV) {\n var remoteStore=new TiddlyWiki();\n var lines=CSV.split('\sn'); var names=lines[0].split(','); CSV=lines.join('\sn')\n // ENCODE commas and newlines within quoted values\n var comma='!~comma~!'; var commaRE=new RegExp(comma,'g');\n var newline='!~newline~!'; var newlineRE=new RegExp(newline,'g');\n CSV=CSV.replace(/\sx22((?:[^\sx22]|\sx22\sx22)*?)\sx22/g,\n function(x){ return x.substr(1,x.length-2).replace(/\s,/g,comma).replace(/\sn/g,newline); });\n // PARSE lines\n var lines=CSV.split('\sn');\n for (var i=1; i<lines.length; i++) { if (!lines[i].length) continue;\n var values=lines[i].split(',');\n // DECODE commas, newlines and doubled-quotes within quoted values\n for (var v=0; v<values.length; v++)\n values[v]=values[v].replace(commaRE,',').replace(newlineRE,'\sn').replace(/\sx22\sx22/g,'\sx22');\n // EXTRACT tiddler values\n var title=''; var text=''; var tags=[]; var fields={};\n var created=null; var when=new Date(); var who=config.options.txtUserName;\n for (var v=0; v<values.length; v++) { var val=values[v];\n if (names[v]) switch(names[v].toLowerCase()) {\n case 'title': title=val.replace(/\s[\s]\s|/g,'_'); break;\n case 'created': created=new Date(val); break;\n case 'modified':when=new Date(val); break;\n case 'modifier':who=val; break;\n case 'text': text=val; break;\n case 'tags': tags=val.readBracketedList(); break;\n default: fields[names[v].toLowerCase()]=val; break;\n }\n }\n // CREATE tiddler in temporary store\n if (title.length) remoteStore.saveTiddler(title,title,text,who,when,tags,fields,true,created||when);\n }\n return remoteStore.getTiddlers('title'); \n}\n\nconfig.macros.importTiddlers.filterTiddlerList=function(success,params,txt,src,xhr) {\n var cmi=config.macros.importTiddlers; // abbreviation\n var src=src.replace(/%20/g,' ');\n if (!success) { displayMessage(cmi.openErrMsg.format([src,xhr.status])); return; }\n cmi.all=cmi.readTiddlersFromHTML(txt);\n if (!cmi.all||!cmi.all.length) cmi.all=cmi.readTiddlersFromCSV(txt)\n var count=cmi.all?cmi.all.length:0;\n var querypos=src.lastIndexOf('?'); if (querypos!=-1) src=src.substr(0,querypos);\n displayMessage(cmi.foundMsg.format([count,src]));\n cmi.inbound=cmi.filterByHash(params,cmi.all); // use full URL including hash (if any)\n cmi.$('importLastFilter').value=cmi.lastFilter;\n window.refreshImportList(0);\n}\n\nconfig.macros.importTiddlers.filterByHash=function(src,tiddlers)\n{\n var hashpos=src.lastIndexOf('#'); if (hashpos==-1) return tiddlers;\n var hash=src.substr(hashpos+1); if (!hash.length) return tiddlers;\n var tids=[];\n var params=hash.parseParams('anon',null,true,false,false);\n for (var p=1; p<params.length; p++) {\n switch (params[p].name) {\n case 'anon':\n case 'open':\n tids.pushUnique(params[p].value);\n break;\n case 'tag':\n if (store.getMatchingTiddlers) { // for boolean expressions - see MatchTagsPlugin\n var r=store.getMatchingTiddlers(params[p].value,null,tiddlers);\n for (var t=0; t<r.length; t++) tids.pushUnique(r[t].title);\n } else for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].isTagged(params[p].value))\n tids.pushUnique(tiddlers[t].title);\n break;\n case 'story':\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].title==params[p].value) {\n tiddlers[t].changed();\n for (var s=0; s<tiddlers[t].links.length; s++)\n tids.pushUnique(tiddlers[t].links[s]);\n break;\n }\n break;\n case 'search':\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].text.indexOf(params[p].value)!=-1)\n tids.pushUnique(tiddlers[t].title);\n break;\n }\n }\n var matches=[];\n for (var t=0; t<tiddlers.length; t++)\n if (tids.contains(tiddlers[t].title))\n matches.push(tiddlers[t]);\n displayMessage(config.macros.importTiddlers.filterMsg.format([matches.length,hash]));\n config.macros.importTiddlers.lastFilter=hash;\n return matches;\n}\n//}}}
" as useful as asking flight attendant candidate to explain jet propulsion"
Formats: [[XML|?format=xml]] | [[YAML|?format=yaml]]\n
//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) (.*?)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e)\n {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n})\n//}}}
<<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Open options panel'>><<exportLink>><<importLink>><<login>>\n\n
Model 140Z\n\nhttp://clearcreekspas.com/FindPartByPictures152b.html\n\nhttp://www.spadepot.com/shop/Spas---Hot-Tubs-C59.aspx\n\nhttp://www.poolandspa.com/page958.htm\n\nhttp://reliablepools.com/Products/JacuzziHotTubs/300series/J345/tabid/1790/Default.aspx
It's Preakness Day. It's going to rain!
\n1. I am a true born Irishman. I never deny what I am.\nI was born in sweet Tipperary town three thousand miles away.\n\nCHORUS: So hurray, me boys, hurray! No more do I wish for to roam. The sun it will shine in the harvest time, to welcome poor Paddy home.\n\n2. The girls they are gay and frisky. They take you by the hand,\nSaying, "Jimmy machree, won't you come with me and welcome poor Paddy home?"\n\nCHORUS\n\n3. In came a foreign nation. they scattered all over our land.\nThe horse, the cow, the sheep, goat and sow fell into the stranger's hand.\n\nCHORUS\n\n4. The Scotchman can boast of the thistle, and England can boast of the rose,\nBut Paddy can boast of his Emerald Isle where his dear little shamrock grows.\n\nCHORUS
<<tagCloud protected systemConfig excludeSearch excludeLists excludeTimeline>>\n\n{{floatLeft{[[Contents By Creation Date]] }}} | {{floatLeft{[[Contents By Title]]}}}
Send to Patrick\n\nhttp://www.wired.com/culture/education/magazine/17-09/st_essay
<!--{{{-->\n\n<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references revisions jump fullscreen'></div>\n\n<div class='title' macro='view title'></div>\n\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>) <span macro='view renamedSubTitle'></span> <span macro='view historicalSubTitle'></span></div>\n\n<div class='tagging' macro='tagging'></div>\n\n<div class='tagged' macro='tags'></div>\n\n<div class='viewer' macro='view text wikified'></div>\n\n<div class='tagClear'></div>\n\n<!--}}}-->\n\n
<<tagCloud>>
/***\nThis tiddler is a special status tiddler. It is a DTML script that interrogates Zope about the status of your tiddlers. The variables below are dynamic and this tiddler is reloaded when you login. Editing this tiddler through ZiddlyWiki will break your ZiddlyWiki. (If you need to make modifications, edit it in the ZMI)\n***/\n//{{{\nif(typeof document.zw == "undefined") var zw = {};\nzw.loggedIn = false;\nzw.anonEdit = false;\nzw.isAdmin = false;\nzw.latestTiddler = 126849891395;\nzw.username = 'Anonymous User';\nconfig.options.txtUserName = 'Anonymous User';\nzw.serverUrl = "http://kennison.name/notes";\nversion.extensions.ZiddlyWiki = '1';\nzw.tiddlerList = {\n"16 May 2009": "894.24269.23674.18380" ,"SiteTitle": "894.24035.59687.33740" ,"SiteSubtitle": "894.25952.27153.19114" ,"FullScreenPlugin": "894.24058.6638.7116" ,"ViewTemplate": "899.58071.15227.53555" ,"MainMenu": "897.26499.20386.30037" ,"ToggleSidebarMacro": "894.24037.28781.63675" ,"StyleSheet": "895.63980.3970.1041" ,"Average Home Use of Electricity": "894.24028.56821.47223" ,"Ban Spammers": "897.17656.59174.55825" ,"Champagnes": "894.24028.56821.47223" ,"Corby's Kidney Stones": "894.24028.56821.47223" ,"DefaultTiddlers": "894.24605.47912.13516" ,"Driveway Paving": "899.51908.14172.9403" ,"ELEUTHERA in the Bahamas": "894.24071.12783.13960" ,"Heating Oil": "894.24028.56821.47223" ,"Outsourcing": "896.59801.8391.57992" ,"PT Cruiser Error Codes": "894.24039.31727.22118" ,"People To Read": "894.24028.56821.47223" ,"Recursively chmod directories only": "894.24270.65374.20428" ,"Reinstall iPhoto": "894.24028.56821.47223" ,"Ridge Road Gravel": "894.28273.1096.6229" ,"Roofer": "894.24028.56821.47223" ,"Roofing Materials": "894.24028.56821.47223" ,"Roy Fielding": "894.24028.56821.47223" ,"Screen Capture Software": "894.24028.56821.47223" ,"Serve Excel": "894.24028.56821.47223" ,"Shade Plants": "896.62836.13957.31624" ,"Small Government": "894.24028.56821.47223" ,"Sony-brand CPA-9C Cassette Adapter": "894.24028.56821.47223" ,"Spammers IPs": "894.24028.56821.47223" ,"Standards and Poors 500 ": "894.24028.56821.47223" ,"Stove ": "894.24028.56821.47223" ,"Tiddler Links": "894.24028.56821.47223" ,"Vinca Minor": "894.24028.56821.47223" ,"Waterfall Method of Development": "894.26797.7953.60569" ,"Welcome Paddy Home": "894.24268.9093.30839" ,"bash_profile": "896.63340.15226.27886" ,"iPhone Cases": "894.24028.56821.47223" ,"iPhoto Update": "894.24028.56821.47223" ,"Contents": "899.58090.11874.8396" ,"Tagcloud": "894.24074.22105.4232" ,"SideBarOptions": "894.24607.7741.57548" ,"CookieJar": "896.35365.29616.39031" ,"Ownership in the Digital Age": "894.24266.23572.5256" ,"MarkupPostHead": "894.24284.4179.19063" ,"EditTemplate": "899.58068.61289.62327" ,"12 May 2009": "894.29824.7150.19012" ,"5 June 2009": "896.63348.2995.17373" ,"Grass Seed": "894.32821.25988.51712" ,"19 June 2009": "894.50402.26715.14455" ,"Upgrade Router": "895.7907.39424.6792" ,"Are the Good Times Really Over for Good": "895.18042.3775.40038" ,"16 July 2009": "895.24870.42215.37802" ,"Corby's Car Tires": "896.44119.25401.51746" ,"Dice Probability": "895.63418.35868.19200" ,"The Financial Crisis and Regulation": "896.5369.7758.63129" ,"10 September 2009": "896.42585.56212.65058" ,"Home Theater Computer": "897.18950.30863.682" ,"Map of Lake Waramaug": "896.46802.20121.30515" ,"Bantam Lake": "899.58069.43213.52599" ,"iPhone Costs": "896.47098.21321.43059" ,"Paul Graham": "896.59924.28181.49322" ,"Interesting Guy": "896.61486.57724.49220" ,"Shade PlantsComment1253974484679": "896.62838.48955.59767" ,"Outside Journal": "896.63331.40252.56439" ,"Outside Journal-Notes": "896.64309.15855.47172" ,"Menus": "897.11538.49431.49100" ,"The Data Pipe to the House": "898.46024.45323.33297" ,"Retierment Plans": "897.57787.19479.21248" ,"Rising Health Care Costs": "897.13283.11951.29678" ,"Woodbury": "897.15118.10033.44544" ,"Web Colors": "899.50818.11825.15189" ,"Mercurial": "897.17657.19644.1570" ,"Samsung": "897.18951.2720.27886" ,"PaletteMaker": "899.56192.29508.59630" ,"My Palette Maker": "897.26470.21155.61849" ,"Jacuzzi": "897.30560.48088.42461" ,"2 November 2009": "897.52253.60198.17971" ,"Scratch": "897.56656.19614.49510" ,"Buteyko": "897.63369.30638.19558" ,"Storage for Corby's Stuff": "898.159.18306.45636" ,"Camera": "898.57095.64043.64597" ,"Latititude and Longitude of home": "898.19506.36561.22818" ,"ASUS UL30A-A1": "899.37505.54820.40874" ,"Reading Links": "898.33905.37054.4061" ,"HP Pavilion DM3-1030US 13.3-Inch Notebook": "898.57126.10884.41830" ,"Think Like Me": "898.60209.60504.34184" ,"Travel Notes": "899.18812.33275.59392" ,"18 January 2010": "899.33323.35610.24644" ,"HP DV4-2170": "899.37506.40708.19968" ,"Altima Car Codes": "899.42121.61635.36164" ,"Adding Value": "899.44867.49214.18210" ,"Testing Tiddler": "899.51963.21930.52565" ,"ForEachPlugin": "899.55132.41459.3072" ,"MyTesting again": "899.55133.8171.32000" ,"Colors Used": "899.56198.37133.4812" ,"ColorPalette": "899.56199.22523.26897" ,"Are we engineers or flight attendants?": "899.57817.27290.5137" ,"Contents By Title": "899.58090.28447.27170" ,"eScidDoc": "899.58185.21671.25770" ,"How to Write": "900.9683.4194.49339" ,"Credit Cards": "900.16673.22939.24217" ,"Green River Lake, WY": "900.16841.55487.29440" ,"Research Interests": "900.21218.53551.21913" ,"Ontologies": "900.21218.19634.50124" ,"Enbril Supply": "900.35801.48240.5512" ,"Irish Music": "900.49968.37082.59050" };\n//}}}\n
<html><iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;q=Bantam+Lake,+Litchfield,+Connecticut&amp;sll=37.0625,-95.677068&amp;sspn=32.66491,55.195312&amp;ie=UTF8&amp;cd=1&amp;geocode=FYxafAIdW6ei-w&amp;split=0&amp;ll=41.711623,-73.22216&amp;spn=0.030052,0.053902&amp;z=14&amp;output=embed"></iframe><br /><small><a href="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;q=Bantam+Lake,+Litchfield,+Connecticut&amp;sll=37.0625,-95.677068&amp;sspn=32.66491,55.195312&amp;ie=UTF8&amp;cd=1&amp;geocode=FYxafAIdW6ei-w&amp;split=0&amp;ll=41.711623,-73.22216&amp;spn=0.030052,0.053902&amp;z=14" style="color:#0000FF;text-align:left">View Larger Map</a></small></html>
{{{\nuser_agent = context.REQUEST.HTTP_USER_AGENT\ndenied_agents = 'DA', 'GetRight', 'FlashGet', 'Mass'\n\nfor denied_agent in denied_agents:\n chars = len(denied_agent)\n if user_agent[:chars] == denied_agent:\n raise "UserAgentError", "We don't allow download accelerators"\n}}}
[[Tag cloud|Contents]] | [[Home|/]] | [[Blog|/blog]] | [[Photos|/photos]] | [[Wiki|/wiki]] | [[Work|/work]] | <<toggleSideBar>>\n
<<notes>>\n\nhttp://www.plumbingsupply.com/woodfordparts.html \n\nThe above URL has a parts break down. \n\n<<date>>\n{d}\n\n
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}
To get started with this blank ZiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the ZiddlyWiki is opened\n
Wish a buck was still silver.\nIt was, back when the country was strong.\nBack before Elvis; before the Vietnam war came along.\nBefore The Beatles and "Yesterday",\nWhen a man could still work, and still would.\nIs the best of the free life behind us now?\nAre the good times really over for good? \n\nAre we rolling down hill like a snowball headed for hell?\nWith no kind of chance for the Flag or the Liberty bell.\nWish a Ford and a Chevy,\nCould still last ten years, like they should.\nIs the best of the free life behind us now?\nAre the good times really over for good? \n\nI wish coke was still cola,\nAnd a joint was a bad place to be.\nAnd it was back before Nixon lied to us all on TV.\nBefore microwave ovens, \nWhen a girl still cooked and still would.\nIs the best of the free life behind us now?\nAre the good times really over for good? \n\nAre we rolling down hill like a snowball headed for hell?\nWith no kind of chance for the Flag or the Liberty bell.\nWish a Ford and a Chevy,\nCould still last ten years, like they should.\nIs the best of the free life behind us now?\nAre the good times really over for good? \n\nStop rolling down hill like a snowball headed for hell?\nStand up for the Flag and let's all ring the Liberty bell.\nLet's make a Ford and a Chevy,\nStill last ten years, like they should.\n'Cos the best of the free life is still yet to come,\nThe good times ain't over for good? \n
/***\n\n|Name|ToggleSideBarMacro|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#ToggleSideBarMacro|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nProvides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.\n\n!Demo\n<<toggleSideBar "Toggle Sidebar">>\n\n!Usage:\n{{{<<toggleSideBar>>}}} <<toggleSideBar>>\nadditional options:\n{{{<<toggleSideBar label tooltip show/hide>>}}} where:\nlabel = custom label for the button,\ntooltip = custom tooltip for the button,\nshow/hide = use one or the other, determines whether the sidebar is shown at first or not.\n(default is to show the sidebar)\n\nYou can add it to your tiddler toolbar, your MainMenu, or where you like really.\nIf you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:\n{{{ .HideSideBarButton {float:right;} }}}\n\n!History\n*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. \n*20-07-06: version 0.11\n*27-04-06: version 0.1: working.\n\n!Code\n***/\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "«",\n arrow2: "»"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n\n//}}}
This is just a test\n
http://www.liveireland.com/live.shtml\n\nhttp://www.celticgrove.com/webplayer/flexAmp.html\n\nhttp://www.wgbh.org/listen/celtic.cfm
/***\n|''Name:''|BreadCrumbsPlugin|\n|''Version:''|2.2.1 (05-July-2007)|\n|''Author:''|AlanHecht|\n|''Adapted By:''|[[Jack]]|\n|''Type:''|Plugin|\n!Description\nThis plugin creates an area at the top of the tiddler area that displays "breadcrumbs" of where you've been. This is especially useful for ~TWs using SinglePageMode by Eric Schulman.\n!Usage\nJust install the plugin and tag with systemConfig. Optionally position the following div in your PageTemplate to control the positioning of the breadcrumbs menu:\n{{{\n<div id='breadCrumbs'></div>\n}}}\n!Revision History\n* Original by AlanHecht\n* 2.0 Made 2.0.x compatible by [[Jack]]\n* Made 2.0.10 compatible (onstart paramifier)\n* Bugfix -> return false in onClickTiddlerLink()\n* 2.2 Made 2.2.x compatible\n!Code\n***/\n\n// // Use the following line to set the number of breadcrumbs to display before rotating them off the list.\n//{{{\nversion.extensions.breadCrumbs = {major: 2, minor: 2, revision: 1, date: new Date("Jul 5, 2007")};\nvar crumbsToShow = 7;\nvar breadCrumbs = [];\n\nonClickTiddlerLink_orig_breadCrumbs = onClickTiddlerLink;\nonClickTiddlerLink = function(e){\n onClickTiddlerLink_orig_breadCrumbs(e);\n breadcrumbsAdd(e);\n return false;\n}\n\nrestart_orig_breadCrumbs = restart;\nfunction restart() {\n invokeParamifier(params,"onstart");\n var defaultParams = store.getTiddlerText("DefaultTiddlers").parseParams("open",null,false);\n invokeParamifier(defaultParams,"onstart");\n breadCrumbs = [];\n breadcrumbsRefresh();\n window.scrollTo(0,0);\n return false;\n}\n\nfunction breadcrumbsAdd(e) {\n var uniqueCrumb = true;\n var crumbIndex = 0;\n if (!e) var e = window.event;\n var target = resolveTarget(e);\n var thisCrumb="[["+resolveTarget(e).getAttribute("tiddlyLink")+"]]";\n var lastInactiveCrumb = breadCrumbs.length -(breadCrumbs.length < crumbsToShow ? breadCrumbs.length : crumbsToShow);\n for(t=lastInactiveCrumb; t<breadCrumbs.length; t++)\n if(breadCrumbs[t] == thisCrumb) {\n uniqueCrumb = false;\n crumbIndex = t+1;\n }\n if(uniqueCrumb)\n breadCrumbs.push(thisCrumb);\n else\n breadCrumbs = breadCrumbs.slice(0,crumbIndex);\n breadcrumbsRefresh(); \n}\n\nfunction breadcrumbsRefresh() {\n \n if (!document.getElementById("breadCrumbs")) {\n // Create breadCrumbs div\n var ca = document.createElement("div");\n ca.id = "breadCrumbs";\n ca.style.visibility= "hidden";\n var targetArea = document.getElementById("tiddlerDisplay")||document.getElementById("storyDisplay");\n targetArea.parentNode.insertBefore(ca,targetArea);\n }\n\n var crumbArea = document.getElementById("breadCrumbs");\n crumbArea.style.visibility = "visible";\n removeChildren(crumbArea);\n createTiddlyButton(crumbArea,"Home",null,restart);\n crumbArea.appendChild(document.createTextNode(" > "));\n \n var crumbLine = "";\n var crumbCount = breadCrumbs.length;\n var firstCrumb = crumbCount -(crumbCount < crumbsToShow ? crumbCount : crumbsToShow);\n for(t=firstCrumb; t<crumbCount; t++) {\n if(t != firstCrumb)\n crumbLine += " > ";\n crumbLine += breadCrumbs[t];\n }\n wikify(crumbLine,crumbArea)\n}\n\n\n//}}}
>If you use WaterFall the way it was designed to be used, @@if you make a mistake in an early process and discover it in a later process, you must go back to the early phase and do all the affected phases again@@. This is because the phase is important (else why are you doing it?), and during the phase you must manually cross-check the fix with everything else. Then you must run the subsequent phases using only the output of the previously re-done phase.\n\n[[C2 Wiki|http://c2.com/cgi/wiki?WaterFall]]
<!--{{{-->\n<div class="header roundedCorners" macro="gradient vert #CC6633 #ffff80 ">\n <div class='headerShadow'>\n <span class="searchBar" macro="search"</span>\n \n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div id='messageArea'></div>\n <div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n</div>\n\n<div id="bodyWrapper">\n <div id='displayArea'>\n <div id='tiddlerDisplay'></div>\n </div> \n\n <div id='sidebar'>\n <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n <div id='sidebarTabs' refresh='macro' force='true' macro='slider chkSideBarTabs SideBarTabs "index »" "display lists of tiddlers"'></div>\n <div id='ZiddlyFormats' refresh='content' tiddler='ZiddlyFormats'></div>\n <div id='ZiddlyPowered' refresh='content' tiddler='ZiddlyPowered'></div>\n </div>\n\n \n</div>\n<!--}}}-->\n
/***\n<<checkForDataTiddlerPlugin>>\n|''Name:''|FormTiddlerPlugin|\n|''Version:''|1.0.6 (2007-06-24)|\n|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|\n|''Requires:''|DataTiddlerPlugin|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nUse form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).\n\n''Syntax:'' \n|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|\n|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|\n\n|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|\n|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|\n|//buttonLabel//|The label of the button|\n|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|\n|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nFor details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].\n\n!Revision history\n* v1.0.6 (2007-06-24)\n** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)\n* v1.0.5 (2006-02-24)\n** Removed "debugger;" instruction\n* v1.0.4 (2006-02-07)\n** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)\n* v1.0.3 (2006-02-05)\n** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)\n* v1.0.2 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.1 (2005-12-22)\n** Features: \n*** Support InternetExplorer\n*** Added newTiddlerWithForm Macro\n* v1.0.0 (2005-12-14)\n** initial version\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// FormTiddlerPlugin\n//============================================================================\n//============================================================================\n\nif (!window.abego) window.abego = {};\n\nabego.getOptionsValue = function(element,i) {\n var v = element.options[i].value;\n if (!v && element.options[i].text)\n v = element.options[i].text;\n return v;\n};\n\nversion.extensions.FormTiddlerPlugin = {\n major: 1, minor: 0, revision: 5,\n date: new Date(2006, 2, 24), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } \n\n//============================================================================\n// formTiddler Macro\n//============================================================================\n\n// -------------------------------------------------------------------------------\n// Configurations and constants \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler = {\n // Standard Properties\n label: "formTiddler",\n version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},\n prompt: "Edit tiddler data using forms",\n\n // Define the "setters" that set the values of INPUT elements of a given type\n // (must match the corresponding "getter")\n setter: { \n button: function(e, value) {/*contains no data */ },\n checkbox: function(e, value) {e.checked = value;},\n file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},\n hidden: function(e, value) {e.value = value;},\n password: function(e, value) {e.value = value;},\n radio: function(e, value) {e.checked = (e.value == value);},\n reset: function(e, value) {/*contains no data */ },\n "select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},\n "select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},\n submit: function(e, value) {/*contains no data */},\n text: function(e, value) {e.value = value;},\n textarea: function(e, value) {e.value = value;}\n },\n\n // Define the "getters" that return the value of INPUT elements of a given type\n // Return undefined to not store any data.\n getter: { \n button: function(e, value) {return undefined;},\n checkbox: function(e, value) {return e.checked;},\n file: function(e, value) {return e.value;},\n hidden: function(e, value) {return e.value;},\n password: function(e, value) {return e.value;},\n radio: function(e, value) {return e.checked ? e.value : undefined;},\n reset: function(e, value) {return undefined;},\n "select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},\n "select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},\n submit: function(e, value) {return undefined;},\n text: function(e, value) {return e.value;},\n textarea: function(e, value) {return e.value;}\n }\n};\n\n\n// -------------------------------------------------------------------------------\n// The formTiddler Macro Handler \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {\n return;\n }\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n\n // --- Processing ------------------------------------------\n\n // Get the form template text. \n // (This contains the INPUT elements for the form.)\n var formTemplateTiddler = store.getTiddler(formTemplateName);\n if (!formTemplateTiddler) {\n config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");\n return;\n }\n var templateText = formTemplateTiddler.text;\n if(!templateText) {\n // Shortcut: when template text is empty we do nothing.\n return;\n }\n\n // Get the name of the tiddler containing this "formTiddler" macro\n // (i.e. the tiddler, that will be edited and that contains the data)\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);\n\n // Append a "form" element. \n var formName = "form"+formTemplateName+"__"+tiddlerName;\n var e = document.createElement("form");\n e.setAttribute("name", formName);\n place.appendChild(e);\n\n // "Embed" the elements defined by the templateText (i.e. the INPUT elements) \n // into the "form" element we just created\n wikify(templateText, e);\n\n // Initialize the INPUT elements.\n config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));\n}\n\n\n// -------------------------------------------------------------------------------\n// Form Data Access \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\n// Initialize the INPUT elements of the form with the values of their "matching"\n// data fields in the tiddler. Also setup the onChange handler to ensure that\n// changes in the INPUT elements are stored in the tiddler's data.\n//\nconfig.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {\n // config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");\n\n // find the form\n var form = config.macros.formTiddler.findForm(formName);\n if (!form) {\n return;\n }\n\n try {\n var elems = form.elements;\n for (var i = 0; i < elems.length; i++) {\n var c = elems[i];\n \n var setter = config.macros.formTiddler.setter[c.type];\n if (setter) {\n var value = data[c.name];\n if (value != null) {\n setter(c, value);\n }\n c.onchange = onFormTiddlerChange;\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");\n }\n }\n } catch(e) {\n config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);\n }\n}\n\n\n// Internal.\n//\n// @return [may be null]\n//\nconfig.macros.formTiddler.findForm = function(formName) {\n // We must manually iterate through the document's forms, since\n // IE does not support the "document[formName]" approach\n\n var forms = window.document.forms;\n for (var i = 0; i < forms.length; i++) {\n var form = forms[i];\n if (form.name == formName) {\n return form;\n }\n }\n\n return null;\n}\n\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectOneValue = function(element,value) {\n var n = element.options.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = abego.getOptionsValue(element,i) == value;\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectMultipleValue = function(element,value) {\n var values = {};\n for (var i = 0; i < value.length; i++) {\n values[value[i]] = true;\n }\n \n var n = element.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectOneValue = function(element) {\n var i = element.selectedIndex;\n return (i >= 0) ? abego.getOptionsValue(element,i) : null;\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectMultipleValue = function(element) {\n var values = [];\n var n = element.length;\n for (var i = 0; i < n; i++) {\n if (element.options[i].selected) {\n values.push(abego.getOptionsValue(element,i));\n }\n }\n return values;\n}\n\n\n\n// -------------------------------------------------------------------------------\n// Helpers \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.formTiddler.checkForExtensions = function(place,macroName) {\n if (!version.extensions.DataTiddlerPlugin) {\n config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");\n return false;\n }\n return true;\n}\n\n// Internal.\n//\n// Displays a trace message in the "TiddlyWiki" message pane.\n// (used for debugging)\n//\nconfig.macros.formTiddler.trace = function(s) {\n displayMessage("Trace: "+s);\n}\n\n// Internal.\n//\n// Display some error message in the "TiddlyWiki" message pane.\n//\nconfig.macros.formTiddler.displayFormTiddlerError = function(s) {\n alert("FormTiddlerPlugin Error: "+s);\n}\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.formTiddler.createErrorElement = function(place, message) {\n return createTiddlyElement(place,"span",null,"formTiddlerError",message);\n}\n\n// Internal.\n//\n// Returns the name of the tiddler containing the given element.\n// \nconfig.macros.formTiddler.getContainingTiddlerName = function(element) {\n return story.findContainingTiddler(element).id.substr(7);\n}\n\n// -------------------------------------------------------------------------------\n// Event Handlers \n// -------------------------------------------------------------------------------\n\n// This function must be called by the INPUT elements whenever their\n// data changes. Typically this is done through an "onChange" handler.\n//\nfunction onFormTiddlerChange (e) {\n // config.macros.formTiddler.trace("onFormTiddlerChange "+e);\n\n if (!e) var e = window.event;\n\n var target = resolveTarget(e);\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);\n var getter = config.macros.formTiddler.getter[target.type];\n if (getter) {\n var value = getter(target);\n DataTiddler.setData(tiddlerName, target.name, value);\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");\n }\n}\n\n// ensure that the function can be used in HTML event handler\nwindow.onFormTiddlerChange = onFormTiddlerChange;\n\n\n// -------------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// -------------------------------------------------------------------------------\n\nsetStylesheet(\n ".formTiddlerError{color: #ffffff;background-color: #880000;}",\n "formTiddler");\n\n\n//============================================================================\n// checkForDataTiddlerPlugin Macro\n//============================================================================\n\nconfig.macros.checkForDataTiddlerPlugin = {\n // Standard Properties\n label: "checkForDataTiddlerPlugin",\n version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},\n prompt: "Check if the DataTiddlerPlugin exists"\n}\n\nconfig.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {\n config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);\n}\n\n\n\n//============================================================================\n// newTiddlerWithForm Macro\n//============================================================================\n\nconfig.macros.newTiddlerWithForm = {\n // Standard Properties\n label: "newTiddlerWithForm",\n version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},\n prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"\n}\n\nconfig.macros.newTiddlerWithForm.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the button label\n var buttonLabel = undefined;\n if (i < params.length) {\n buttonLabel = params[i];\n i++;\n }\n\n if (!buttonLabel) {\n config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the (optional) tiddlerName script and "askUser"\n var tiddlerNameScript = undefined;\n var askUser = false;\n if (i < params.length) {\n tiddlerNameScript = params[i];\n i++;\n\n if (i < params.length && params[i] == "askUser") {\n askUser = true;\n i++;\n }\n }\n\n // --- Processing ------------------------------------------\n\n if(!readOnly) {\n var onClick = function() {\n var tiddlerName;\n if (tiddlerNameScript) {\n try {\n tiddlerName = eval(tiddlerNameScript);\n } catch (ex) {\n }\n }\n if (!tiddlerName || askUser) {\n tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");\n }\n while (tiddlerName && store.getTiddler(tiddlerName)) {\n tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\sn\sn"+"Please specify a tiddler name.", tiddlerName);\n }\n\n // tiddlerName is either null (user canceled) or a name that is not yet in the store.\n if (tiddlerName) {\n var body = "<<formTiddler [["+formTemplateName+"]]>>";\n var tags = [];\n store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);\n story.displayTiddler(null,tiddlerName,1);\n }\n }\n\n createTiddlyButton(place,buttonLabel,buttonLabel,onClick);\n }\n}\n\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
<<date>>\n\nWorked on the hot tub and found bad stuff!
Friday - Had to go again (not quite of month [24days]). Gave me the predizone again.
Can I find this locally?\n\nI bought the cheap one from Wal-Mart (Phillips) and the Monster one from Apple. Both work but they're not great!
/***\n|Name|InlineJavascriptPlugin|\n|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|\n|Version|1.9.4|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Insert Javascript executable code directly into your tiddler content.|\n''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Documentation\n>see [[InlineJavascriptPluginInfo]]\n!!!!!Revisions\n<<<\n2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax\n|please see [[InlineJavascriptPluginInfo]] for additional revision details|\n2005.11.08 [1.0.0] initial release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 3, date: new Date(2008,6,11)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: title=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: key=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var 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 var src=lookaheadMatch[1];\n var label=lookaheadMatch[2];\n var tip=lookaheadMatch[3];\n var key=lookaheadMatch[4];\n var show=lookaheadMatch[5];\n var code=lookaheadMatch[6];\n if (src) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = src;\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (code) { // there is script code\n if (show) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (label) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));\n var fixup=code.replace(/document.write\ss*\s(/gi,'place.bufferedHTML+=(');\n link.code="function _out(place){"+fixup+"\sn};_out(this);"\n link.tiddler=w.tiddler;\n link.onclick=function(){\n this.bufferedHTML="";\n try{ var r=eval(this.code);\n if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)\n var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);\n if(this.bufferedHTML.length)\n s.innerHTML=this.bufferedHTML;\n if((typeof(r)==="string")&&r.length) {\n wikify(r,s,null,this.tiddler);\n return false;\n } else return r!==undefined?r:false;\n } catch(e){alert(e.description||e.toString());return false;}\n };\n link.setAttribute("title",tip||"");\n var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';\n URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\sn/g,' ')));\n URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';\n link.setAttribute("href",URIcode);\n link.style.cursor="pointer";\n if (key) link.accessKey=key.substr(0,1); // single character only\n }\n else { // run inline script code\n var fixup=code.replace(/document.write\ss*\s(/gi,'place.innerHTML+=(');\n var c="function _out(place){"+fixup+"\sn};_out(w.output);";\n try { var out=eval(c); }\n catch(e) { out=e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n\n// // Backward-compatibility for TW2.1.x and earlier\n//{{{\nif (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {\n if(limit > 0) text = text.substr(0,limit);\n var wikifier = new Wikifier(text,formatter,null,tiddler);\n return wikifier.wikifyPlain();\n}\n//}}}\n\n// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()\n//{{{\nif (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }\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// %/
>It brought back to me some considerations I'd had about the nature of ownership. My generation will have a distinctly different concept of ownership to that of my daughter's generation. For my generation you partly constructed your identity around what you owned - your bookshelf, record collection and DVD archive were important aspects of who you were (as anyone who has read Nick Hornby's High Fidelity will appreciate). But for the digital generation this strong link with ownership has been broken.\n\n>It took time and money to build up any of those collections. Therefore they demonstrated a commitment which was worth exhibiting. In a digital world this effort is greatly reduced, and as a result so is the emotional attachment one feels towards them. -- Martin Weller\n\nThe point is that you can get ''so'' much with relative ease that it becomes less valuable to ''own'' something!
!!!Learning Technology\n* study of contemporary learning and instructional theories\n* learner-centered design, interface design, and information access design\n* networked learning systems, including digital libraries and learning communities\n\n!!!Information Science\n* Information-seeking and use\n* Information organization\n* Human institutions, including libraries, that support the production and dissemination of and access to information
/***\n|Name|SearchOptionsPlugin|\n|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|\n|Version|2.6.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|\n|Description|extend core search function with additional user-configurable options|\n\nThe TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text'). However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases. In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.\n\n!!!!!Usage\n<<<\nThis plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags. It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers. You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.\n<<<\n!!!!!Configuration\n<<<\nIn additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:\n<<option chkSearchTitles>> Search in titles\n<<option chkSearchText>> Search in tiddler text\n<<option chkSearchTags>> Search in tags\n<<option chkSearchFields>> Search in data fields\n<<option chkSearchShadows>> Search shadow tiddlers\n<<option chkSearchTitlesFirst>> Show title matches first\n<<option chkSearchByDate>> Sort matching tiddlers by date\n<<option chkSearchList>> Show list of matches in [[SearchResults]]\n<<option chkSearchIncremental>> Incremental searching\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SearchOptionsPlugin handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior. However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}}, {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}} (with suitable prompt text) to your customized tiddler.\n<<<\n!!!!!Revision History\n<<<\n''2007.02.17 [2.6.1]'' added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0\n''2007.02.13 [2.6.0]'' remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.\n''2007.02.08 [2.5.1]'' include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)\n''2007.01.29 [2.5.0]'' added support for "sort results by date". Default is to sort alphabetically (standard). When sorted by dates, most recent changes are shown first\n''2006.10.10 [2.4.0]'' added support for "search in tiddler data" (tiddler.fields) Default is to search extended data.\n''2006.04.06 [2.3.0]'' added support for "search in shadow tiddlers". Default is *not* to search in the shadows (i.e. standard TW behavior). Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.\n''2006.02.03 [2.2.1]'' rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes. note that core no longer permits "blank=all" searches, so neither does this plugin. To search for all, use "." with text patterns enabled.\n''2006.02.02 [2.2.0]'' in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars. Prevents searching on shorter text when shortened by rapid backspaces (<500msec)\n''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching\nalso, blank search text now presents "No search text. Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.\n''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank\n''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.\n''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)\ndefine results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title\n''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.\n''2006.01.17 [2.1.4]'' Use regExp.search() instead of regExp.test() to scan for matches. Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.\n''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output\n''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers. This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.\n''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()\n''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.\n''2005.12.30 [2.0.0]'' Upgraded to TW2.0\nwhen rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.\n''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags\n''2005.12.21 [1.3.7]'' use \s\s to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link. Also, added access key: "O", to trigger "open all" link.\nBased on a suggestion by UdoBorkowski.\n''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon\n''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.\n''2005.12.17 [1.3.4]'' use {/%%/{/%%/{ and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered \nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches\nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.\nBased on a suggestion by UdoBorkowski.\n''2005.12.10 [1.3.1]'' added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.\n''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).\nadded handling for Enter key so it can be used to start a search.\nBased on a suggestion by LyallPearce\n''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin\n''2005.11.25 [1.2.0]'' added chkSearchList option\nBased on a suggestion by RodneyGomes\n''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.\nBased on a suggestion by ChristianHauck\n''2005.10.18 [1.0.0]'' Initial Release\nBased on a suggestion by LyallPearce.\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};\n//}}}\n\n//{{{\nif (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;\nif (config.options.chkSearchText==undefined) config.options.chkSearchText=true;\nif (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;\nif (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;\nif (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;\nif (config.options.chkSearchList==undefined) config.options.chkSearchList=false;\nif (config.options.chkSearchByDate==undefined) config.options.chkSearchByDate=false;\nif (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;\nif (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitles>> Search in tiddler titles";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchText>> Search in tiddler text";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTags>> Search in tiddler tags";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchFields>> Search in tiddler data fields";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchShadows>> Search in shadow tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitlesFirst>> Search results show title matches first";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchList>> Search results show list of matching tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchByDate>> Search results sorted by modification date ";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchIncremental>> Incremental searching";\n\nif (config.macros.search.reportTitle==undefined) config.macros.search.reportTitle="SearchResults";\n//}}}\n\n//{{{\nconfig.macros.search.onKeyPress = function(e)\n{\n if(!e) var e = window.event;\n switch(e.keyCode)\n {\n case 13: // Ctrl-Enter\n case 10: // Ctrl-Enter on IE PC\n config.macros.search.doSearch(this);\n break;\n case 27: // Escape\n this.value = "";\n clearMessage();\n break;\n }\n if (config.options.chkSearchIncremental) {\n if(this.value.length > 2)\n {\n if(this.value != this.getAttribute("lastSearchText"))\n {\n if(config.macros.search.timeout)\n clearTimeout(config.macros.search.timeout);\n var txt = this;\n config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);\n }\n }\n else\n {\n if(config.macros.search.timeout)\n clearTimeout(config.macros.search.timeout);\n }\n }\n}\n//}}}\n\n//{{{\nStory.prototype.search = function(text,useCaseSensitive,useRegExp)\n{\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");\n if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first\n var q = useRegExp ? "/" : "'";\n clearMessage();\n if (!matches.length) {\n if (config.options.chkSearchList) discardSearchResults();\n displayMessage(config.macros.search.failureMsg.format([q+text+q]));\n } else {\n if (config.options.chkSearchList) \n reportSearchResults(text,matches);\n else {\n var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);\n this.closeAllTiddlers(); story.displayTiddlers(null,titles);\n displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));\n }\n }\n highlightHack = null;\n}\n//}}}\n\n//{{{\nTiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)\n{\n var candidates = this.reverseLookup("tags",excludeTag,false,sortField);\n\n // scan for matching titles first...\n var results = [];\n if (config.options.chkSearchTitles) {\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].title.search(searchRegExp)!=-1)\n results.push(candidates[t]);\n if (config.options.chkSearchShadows)\n for (var t in config.shadowTiddlers)\n if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))\n results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));\n }\n // then scan for matching text, tags, or field data\n for(var t=0; t<candidates.length; t++) {\n if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)\n results.pushUnique(candidates[t]);\n if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)\n results.pushUnique(candidates[t]);\n if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above\n store.forEachField(candidates[t],\n function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },\n true); // extended fields only\n }\n // then check for matching text in shadows\n if (config.options.chkSearchShadows)\n for (var t in config.shadowTiddlers)\n if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))\n results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));\n\n // if not 'titles first', or sorting by modification date, re-sort results to so titles, text, tag and field matches are mixed together\n if(!sortField) sortField = "title";\n var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }\n if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);\n\n return results;\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nif (!window.reportSearchResults) window.reportSearchResults=function(text,matches)\n{\n var title=config.macros.search.reportTitle\n var q = config.options.chkRegExpSearch ? "/" : "'";\n var body="\sn";\n\n // summary: nn tiddlers found matching '...', options used\n body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\sn";\n body+="^^//searched in:// ";\n body+=(config.options.chkSearchTitles?"''titles'' ":"");\n body+=(config.options.chkSearchText?"''text'' ":"");\n body+=(config.options.chkSearchTags?"''tags'' ":"");\n body+=(config.options.chkSearchFields?"''fields'' ":"");\n body+=(config.options.chkSearchShadows?"''shadows'' ":"");\n if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {\n body+=" //with options:// ";\n body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");\n body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");\n }\n body+="^^";\n\n // numbered list of links to matching tiddlers\n body+="\sn<<<";\n for(var t=0;t<matches.length;t++) {\n var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";\n body+="\sn# "+date+"[["+matches[t].title+"]]";\n }\n body+="\sn<<<\sn";\n\n // open all matches button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.displayTiddlers(null,["\n for(var t=0;t<matches.length;t++)\n body+="'"+matches[t].title.replace(/\s'/mg,"\s\s'")+"'"+((t<matches.length-1)?", ":"");\n body+="],1);\s" ";\n body+="accesskey=\s"O\s" ";\n body+="value=\s"open all matching tiddlers\s"></html> ";\n\n // discard search results button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\s" ";\n body+="value=\s"discard "+title+"\s"></html>";\n\n // search again\n body+="\sn\sn----\sn";\n body+="<<search \s""+text+"\s">>\sn";\n body+="<<option chkSearchTitles>>titles ";\n body+="<<option chkSearchText>>text ";\n body+="<<option chkSearchTags>>tags";\n body+="<<option chkSearchFields>>fields";\n body+="<<option chkSearchShadows>>shadows";\n body+="<<option chkCaseSensitiveSearch>>case-sensitive ";\n body+="<<option chkRegExpSearch>>text patterns";\n body+="<<option chkSearchByDate>>sort by date";\n\n // create/update the tiddler\n var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();\n tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");\n store.addTiddler(tiddler); story.closeTiddler(title);\n\n // use alternate "search again" label in <<search>> macro\n var oldprompt=config.macros.search.label;\n config.macros.search.label="search again";\n\n // render/refresh tiddler\n story.displayTiddler(null,title,1);\n store.notify(title,true);\n\n // restore standard search label\n config.macros.search.label=oldprompt;\n\n}\n\nif (!window.discardSearchResults) window.discardSearchResults=function()\n{\n // remove the tiddler\n story.closeTiddler(config.macros.search.reportTitle);\n store.deleteTiddler(config.macros.search.reportTitle);\n}\n//}}}
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.8 (2007-04-12)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.8 (2007-04-12)\n** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)\n* v1.0.7 (2007-03-28)\n** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)\n* v1.0.6 (2006-09-16)\n** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.\n** Support "begin", "end" and "none" expressions in "write" action\n* v1.0.5 (2006-02-05)\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nif (!window.abego) window.abego = {};\n\nversion.extensions.ForEachTiddlerPlugin = {\n major: 1, minor: 0, revision: 8, \n date: new Date(2007,3,12), \n source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",\n licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"\n};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {\n major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\nabego.parseNamedParameter = function(name, parameter, i) {\n var beginExpression = null;\n if ((i < parameter.length) && parameter[i] == name) {\n i++;\n if (i >= parameter.length) {\n throw "Missing text behind '%0'".format([name]);\n }\n \n return config.macros.forEachTiddler.paramEncode(parameter[i]);\n }\n return null;\n}\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "begin" option\n var beginExpression = abego.parseNamedParameter("begin", parameter, p);\n if (beginExpression !== null) \n p += 2;\n var endExpression = abego.parseNamedParameter("end", parameter, p);\n if (endExpression !== null) \n p += 2;\n var noneExpression = abego.parseNamedParameter("none", parameter, p);\n if (noneExpression !== null) \n p += 2;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n if (count > 0 && beginExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);\n \n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (count > 0 && endExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);\n\n if (count == 0 && noneExpression) \n text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);\n \n\n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.\n viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n var tiddlyWiki = new TiddlyWiki();\n\n // Starting with TW 2.2 there is a helper function to import the tiddlers\n if (tiddlyWiki.importTiddlyWiki) {\n if (!tiddlyWiki.importTiddlyWiki(content))\n throw "File '"+path+"' is not a TiddlyWiki.";\n tiddlyWiki.dirty = false;\n return tiddlyWiki;\n }\n \n // The legacy code, for TW < 2.2\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
[[Maco Reference|http://www.tiddlywiki.org/wiki/Category:Macros]]\n\n!Inline Formatting /% DEBUG: buggy (-&gt; monospaced) %/\n|!Option|!Syntax|!Output|\n|bold font|{{{''bold''}}}|''bold''|\n|italic type|{{{//italic//}}}|//italic//|\n|underlined text|{{{__underlined__}}}|__underlined__|\n|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|\n|superscript text|{{{^^super^^script}}}|^^super^^script|\n|subscript text|{{{~~sub~~script}}}|~~sub~~script|\n|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|\n|monospaced text|{{{{{{monospaced}}}}}}|{{{monospaced}}}|\n!Block Elements\n!!Headings\n{{{\n!Heading 1\n!!Heading 2\n!!!Heading 3\n!!!!Heading 4\n!!!!!Heading 5\n}}}\n&lt;&lt;&lt;\n!Heading 1\n!!Heading 2\n!!!Heading 3\n!!!!Heading 4\n!!!!!Heading 5\n&lt;&lt;&lt;\n!!Lists\n{{{\n* unordered list, level 1\n** unordered list, level 2\n*** unordered list, level 3\n\n# ordered list, level 1\n## ordered list, level 2\n### unordered list, level 3\n\n; definition list, term\n: definition list, description\n}}}\n&lt;&lt;&lt;\n* unordered list, level 1\n** unordered list, level 2\n*** unordered list, level 3\n\n# ordered list, level 1\n## ordered list, level 2\n### unordered list, level 3\n\n; definition list, term\n: definition list, description\n&lt;&lt;&lt;\n!!Blockquotes /% DEBUG: hack %/\n{{{\n&gt; blockquote, level 1\n&gt;&gt; blockquote, level 2\n&gt;&gt;&gt; blockquote, level 3\n\n&lt;&lt;&lt;\nblockquote\n&lt;&lt;&lt;\n}}}\n&lt;&lt;&lt;\n&gt; blockquote, level 1\n&gt;&gt; blockquote, level 2\n&gt;&gt;&gt; blockquote, level 3\n\n&gt; blockquote\n&lt;&lt;&lt;\n!!Preformatted Text /% DEBUG: hack %/\n{{{\n {{{\n preformatted (e.g. code)\n }}}\n}}}\n&lt;&lt;&lt;\n{{{\npreformatted (e.g. code)\n}}}\n&lt;&lt;&lt;\n!!Tables\n{{{\n|CssClass|k\n|!heading column 1|!heading column 2|\n|row 1, column 1|row 1, column 2|\n|row 2, column 1|row 2, column 2|\n|&gt;|COLSPAN|\n|ROWSPAN| ... |\n|~| ... |\n|CssProperty:value;...| ... |\n|caption|c\n}}}\n''Annotation:''\n* The {{{&gt;}}} marker creates a "colspan", causing the current cell to merge with the one to the right.\n* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.\n&lt;&lt;&lt;\n|CssClass|k\n|!heading column 1|!heading column 2|\n|row 1, column 1|row 1, column 2|\n|row 2, column 1|row 2, column 2|\n|&gt;|COLSPAN|\n|ROWSPAN| ... |\n|~| ... |\n|CssProperty:value;...| ... |\n|caption|c\n&lt;&lt;&lt;\n!!Images /% DEBUG: to do %/\ncf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]\n{{{\n[img[title|filename]]\n[img[filename]]\n[img[title|filename][link]]\n[img[filename][link]]\n}}}\n\n\n!Hyperlinks\n* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler\n** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}\n* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}\n** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}&lt;br&gt;'''N.B.:''' In this case, the target can also be any website (i.e. URL).\n!Custom Styling\n* {{{@@CssProperty:value;CssProperty:value;...@@}}}&lt;br&gt;''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.\n* {{{{{customCssClass{...}}}}}} /% DEBUG: buggy %/\n* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{&lt;html&gt; ... &lt;/html&gt;}}}\n!Special Markers\n* {{{&lt;br&gt;}}} forces a manual line break\n* {{{----}}} creates a horizontal ruler\n* [http://www.tiddlywiki.com/#HtmlEntities HTML entities]\n* {{{&lt;&lt;macroName&gt;&gt;}}} calls the respective [[macro|Macros]]\n* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.&lt;br/&gt;This can be a useful trick for hiding drafts or annotating complex markup.\n* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.
/***\n|''Name:''|TiddlyLightBox|\n|''Date:''|Jan 1, 2006|\n|''Version:''|1.0 beta|\n|''Author:''|Saq Imtiaz|\n|''Location:''|http://tw.lewcid.org/#TiddlyLightBoxPlugin|\n|''Documentation:''|http://tw.lewcid.org/#TiddlyLightBoxDocs|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''Based on:''|DC3.LightBox<br>Light Box Gone Wild <br>Ibox|\n\n!!Code\n***/\n//{{{\nconfig.macros.imagebox ={};\nconfig.macros.imagebox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var e = place.lastChild;\n e.onclick = function(){TiddlyLightBox.initBox('image',this,params[1],params[2],params[0]);return false;};\n}\n\nconfig.macros.divbox ={};\nconfig.macros.divbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n if (params[0]!=".")\n createTiddlyButton(place,params[0],params[0],function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;});\n else\n {\n var e = place.lastChild;\n e.onclick = function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;};\n }\n}\n\nconfig.macros.tiddlerbox ={}\nconfig.macros.tiddlerbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n config.macros.divbox.handler(place,macroName,[params[0],"tiddler:"+params[1],params[2],params[3],params[4]]);\n return false;\n}\n\nstore.addNotification("TiddlyLightBoxStyles",refreshStyles);\n\nif (!window.TiddlyLightBox)\n window.TiddlyLightBox = {};\n var loadingImage = "indicator.gif";\n window.TiddlyLightBox =\n {\n _curBox: null, // [sentinel]\n\n lightBoxHtml : '<div id="lightBoxOverlay" onclick="TiddlyLightBox.hideBox()" style="display:none"></div><div id="lightboxprogress" style="display:none;"><img src=\s''+loadingImage+'\s' alt=\s'loading\s' style="width:128px;height:128px;"></div><div class="lightBox" id="lightBox" style="display:none"><div id="lightBoxContent"></div><div id="lightBoxTitle">This is a title</div><div id="lightBoxClose"><a href:"#" onclick="TiddlyLightBox.hideBox();return false;">Click to close</a></div></div>',\n\n createBoxWrapper : function()\n {\n var wrapper = createTiddlyElement(document.getElementsByTagName("body")[0],"div","tiddlyLightBoxWrapper");\n wrapper.innerHTML = this.lightBoxHtml;\n },\n\n initBox : function(contentType,url,w,h,text)\n {\n if (this._curBox)\n return;\n this.showProgress();\n this.hideSelects("hidden");\n this.showBg();\n this._curBox = true;\n this.sizeTheBox(contentType,w,h);\n if (contentType == 'image')\n this.showImage(url,text);\n else if (contentType == 'html')\n this.showHtml(url,text);\n return false;\n },\n \n sizeTheBox : function(contentType,w,h)\n {\n var box = document.getElementById("lightBoxContent");\n if (w && isNaN(parseInt(w)))\n {\n addClass(box,w);\n }\n else if (w ||h || contentType == 'html')\n {\n box.style.width = w? w+ "px" : "450px";\n box.style.height = h? h+ "px" : "280px";\n if (contentType=='image')\n setStylesheet("#lightBoxContent img{height:100%;width:100%;}","lightBoxImageSizeHack");\n }\n },\n\n showProgress : function()\n {\n var progress = document.getElementById("lightboxprogress");\n progress.style.display='';\n this._center(progress);\n },\n \n hideProgress: function()\n {\n var progress = document.getElementById("lightboxprogress");\n progress.style.display='none';\n },\n\n //this function lifted from Lightbox Gone Wild\n hideSelects: function(visibility)\n {\n var selects = document.getElementsByTagName('select');\n for(i = 0; i < selects.length; i++)\n {\n selects[i].style.visibility = visibility;\n }\n },\n\n showBg: function()\n {\n var overlay = document.getElementById('lightBoxOverlay');\n if (config.browser.isIE)\n {\n overlay.style.height = Math.max(document.documentElement.scrollHeight,document.documentElement.offsetHeight);\n overlay.style.width = document.documentElement.scrollWidth;\n }\n overlay.style.display = 'block';\n },\n\n showImage: function (url,text)\n {\n imgPreloader = new Image();\n imgPreloader.onload = function ()\n {\n var lb = document.getElementById("lightBoxContent");\n lb.innerHTML = "<img src="+url+">";\n lb.onclick = function(){TiddlyLightBox.hideBox();return false;};\n TiddlyLightBox.posBox(text);\n };\n imgPreloader.src = url;\n },\n \n showHtml : function(theID,text)\n {\n var lb = document.getElementById("lightBoxContent");\n if (theID.indexOf("tiddler:")==-1)\n lb.innerHTML = document.getElementById(theID).innerHTML;\n else\n { \n wikify(store.getTiddlerText(theID.replace("tiddler:","")),lb);\n lb.className='tiddler';\n }\n lb.style.overflow = "auto";\n this.posBox(text);\n },\n\n posBox: function(text)\n {\n this.setTitle(text);\n this.hideProgress();\n var lb = document.getElementById("lightBox");\n lb.style.display = "";\n lb.style.visibilty = "hidden";\n lb.style.position = "absolute";\n this._center(lb);\n if(!TiddlyLightBox._curBox) return;\n lb.style.visibility = "visible";\n lb.style.display = "block";\n },\n\n setTitle: function(text)\n {\n document.getElementById("lightBoxTitle").innerHTML= (text==undefined)? '': text;\n },\n\n _center: function(lb)\n {\n var lbSize = new TiddlyLightBox.getElementSize(lb);\n lb.style.left = (Math.round(findWindowWidth()/2) - (lbSize.width /2) + findScrollX())+'px';\n lb.style.top = (Math.round(findWindowHeight()/2) - (lbSize.height /2) + findScrollY())+'px';\n },\n\n //this function lifted from Ibox\n getElementSize : function(elem)\n {\n this.width = elem.offsetWidth || elem.style.pixelWidth;\n this.height = elem.offsetHeight || elem.style.pixelHeight;\n },\n\n hideBox: function()\n {\n if(!this._curBox)\n return;\n document.getElementById("tiddlyLightBoxWrapper").innerHTML= this.lightBoxHtml;\n setStylesheet("","lightBoxImageSizeHack");\n this._curBox = null;\n return false;\n }\n}\n\nTiddlyLightBox.createBoxWrapper();\n\nStory.prototype.findContainingTiddler = function(e)\n{\n while(e && (!hasClass(e,"tiddler") || !e.getAttribute("tiddler")))\n e = e.parentNode;\n return(e);\n}\n\nconfig.shadowTiddlers.TiddlyLightBoxStyles="/*{{{*/\sn#lightBoxOverlay {\sn position:absolute;\sn top: 0;\sn left: 0;\sn width: 100%;\sn height: 100%;\sn z-index: 90; \sn background-color: #000;\sn -moz-opacity: 0.75;\sn opacity: .75;\sn filter: alpha(opacity=75);\sn}\sn#lightBoxOverlay[id]{ \sn position: fixed;\sn}\sn\sn#lightboxprogress { \sn margin:0;padding:0;\sn position: absolute;\sn z-index:95;\sn}\sn\sndiv.lightBox {\sn background: #fff;\sn color: #fff;\sn border: 4px solid #525252;\snpadding:20px 20px 25px 20px; position:absolute; z-index:99;\sn}\sn\sn#lightBoxClose {text-align:right; color:#000; font-size:1.0em; position:absolute; bottom:6px; right:20px;}\sn#lightBoxClose a{color:#666; border-bottom:1px solid #666;cursor:pointer;}\sn#lightBoxClose a:hover {color:#111; border-bottom:1px solid #666; cursor:pointer; background:transparent;}\sn\sn#lightBoxContent {border:1px solid #525252;color:#000; background:#fff;}\sn#lightBox .tiddler {background:#fff;}\sn\sn#lightBoxContent img {border:0;margin:0;padding:0;display:block;cursor:pointer;}\sn\sn#lightBoxTitle {padding:0px; font-weight:bold; position:absolute; left:20px;bottom:6px; font-size:1.1em; color:#000;}\sn\sn/*}}}*/";\n//}}}
PEEKSKILL NURSERIES\nShrub Oak, New York 10588\n914-245-5595\n\n Plant 6 to 8 inches apart. $410 for 1000 plants (should cover 500 square feet) Below the driveway is 70x20 (1,400 sq. ft) ''Ouch''\n\n
3 tab shingles $66.00 per square ($19 to 22 per bundle)\nComposite: $96.00 per square ($25 x 32)\n\n$120 per square for installation?\n\n\nI'm guessing we need 30 squares ((2000 x 1.5)/100)\nBewtween 8-10K for both buildings\n\n\n
Data Plan (required for life of phone) - $30 per month x 12\nVoice Plan (min. voice plan required) - $40 per month x 12\nText Message Plan ($5 / $15 / $20) - $15 per month x 12\nTaxes - $3 per month x 12\nInsurance - $5 per month x 12\n\nTOTAL = $1251 per year x 2 year contact = $2502
Notes for possible purchases
/***\n|Name|DatePlugin|\n|Source|http://www.TiddlyTools.com/#DatePlugin|\n|Version|2.3.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nThis plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.06.20 [2.3.1]'' in onClickDatePopup(), use Popup.show() instead of deprecated ScrollToTiddlerPopup(). Fixes fatal error that prevents popups from being properly displayed\n''2007.05.31 [2.3.0]'' list "created" tiddlers in date popup. Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.date = {major: 2, minor: 3, revision: 1, date: new Date(2007,6,20)};\n//}}}\n\n//{{{\nconfig.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n createdbg: "#bbeeff", // "beef"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\nconfig.macros.date.handler = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format) format=config.macros.date.format;\n if (!linkformat) linkformat=config.macros.date.linkformat;\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n link.date = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n link.style.fontStyle="normal";\n }\n\n // format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date)||hasCreateds(date))\n { link.style.fontStyle="normal"; link.style.fontWeight="bold"; }\n if (hasReminders(date))\n { link.style.textDecoration="underline"; }\n if(isToday(date))\n { link.style.border="1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )\n { place.style.background = config.macros.date.weekendbg; }\n if(isHoliday(date)&&(config.macros.date.holidaybg!=""))\n { place.style.background = config.macros.date.holidaybg; }\n if (hasCreateds(date)&&(config.macros.date.createdbg!=""))\n { place.style.background = config.macros.date.createdbg; }\n if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))\n { place.style.background = config.macros.date.modifiedsbg; }\n if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))\n { place.style.background = config.macros.date.linkedbg; }\n if (hasReminders(date)&&(config.macros.date.remindersbg!=""))\n { place.style.background = config.macros.date.remindersbg; }\n if(isToday(date)&&(config.macros.date.todaybg!=""))\n { place.style.background = config.macros.date.todaybg; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return (config.macros.date.weekend[date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i < config.macros.date.holidays.length; i++) {\n var holiday=config.macros.date.holidays[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = Popup.create(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))\n createTiddlyLink(popup,this.date.formatString(this.linkformat),true);\n else\n createTiddlyText(popup,this.date.formatString(this.linkformat));\n addCreatedsToPopup(popup,this.date,this.format);\n addModifiedsToPopup(popup,this.date,this.format);\n addRemindersToPopup(popup,this.date,this.linkformat);\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexCreateds() // build list of tiddlers, hash indexed by creation date\n{\n var createds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].created.formatString("YYYY0MM0DD")\n if (!createds[date])\n createds[date]=new Array();\n createds[date].push(tiddlers[t].title);\n }\n return createds;\n}\nfunction hasCreateds(date) // returns true if date has created tiddlers\n{\n if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();\n return (config.macros.date.createds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addCreatedsToPopup(popup,when,format)\n{\n var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));\n if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var createds = config.macros.date.createds[when.formatString("YYYY0MM0DD")];\n if (createds) {\n createds.sort();\n var e=createTiddlyElement(popup,"div",null,null,"created:");\n for(var t=0; t<createds.length; t++) {\n var link=createTiddlyLink(popup,createds[t],false);\n link.appendChild(document.createTextNode(indent+createds[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));\n if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changed:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!config.macros.date.reminders)\n config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return (config.macros.date.reminders[date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
- 30 percent domestic stocks, \n- 15 percent foreign stocks, and \n- 5 percent emerging-market stocks, \n- 20 percent in real estate(indexed funds)\n- 15 Treasury bonds and \n- 15 Treasury inflation-protected securities, or TIPS.
12/09/09
/*{{{*/\n\n#contentFooter {\nbackground:#575352;\nclear:both;\ncolor:#BFB6B3;\npadding:0.5em 1em;\n}\n\n#contentFooter a {\nborder-bottom:1px dotted #BFB6B3;\ncolor:#BFB6B3;\n}\n\n#contentFooter a:hover {\nbackground-color:#575352;\ncolor:#FFF;\n}\n\n#contentWrapper {\ncolor:#666;\nfont-family:Lucida Grande, Tahoma, Arial, Helvetica, sans-serif;\nfont-size:120%;\nline-height:1.6em;\nmargin:0 3.4em;\nwidth:90%;\n}\n\n#displayArea {\nfloat:left;\nmargin:0;\nwidth:78%;\n}\n\n#header {\ndisplay:inline-block;\n}\n\n#mainMenu {\nborder:thin solid red;\ndisplay:inline;\nfloat:left;\nfont-size:1em;\nmargin-bottom:1em;\npadding:2em 0.5em 0.5em 0;\nposition:relative;\ntext-align:left;\nwidth:13em;\n}\n\n#mainMenu #noticeBoard .button {\nborder:1px solid #DF9153;\ncolor:#666;\npadding:2px;\n}\n\n#mainMenu #noticeBoard .button:hover {\nbackground:#DF9153;\nborder-color:#DF9153;\ncolor:#fff;\n}\n\n#mainMenu #noticeBoard a,#mainMenu #noticeBoard .tiddlyLink {\nborder:none;\ncolor:#DF9153;\ndisplay:inline;\npadding:5px 2px;\n}\n\n#mainMenu a {\nborder-bottom:1px solid #CCC;\ndisplay:block;\npadding:5px;\n}\n\n#mainMenu a:hover,#mainMenu a:hover,#mainMenu a:active,#mainMenu .highlight,#mainMenu .marked {\nbackground:#000 url(arrow.gif) 96% 50% no-repeat;\nbackground-color:#F5F5F5;\ncolor:#CC6714;\n}\n\n#mainMenu br {\ndisplay:none;\n}\n\n#mainMenu span {\nposition:relative;\n}\n\n#messageArea {\nbackground:#f5f5f5;\nborder:4px solid #948979;\ncolor:#999;\nfont-size:90%;\n}\n\n#messageArea .button:hover {\nbackground:#948979;\nborder-color:#948979;\ncolor:#fff;\n}\n\n#messageArea a:hover {\nbackground:#f5f5f5;\n}\n\n#noticeBoard {\nbackground:#fff;\nborder-bottom:1px dotted #CCC;\nborder-top:1px dotted #CCC;\nclear:both;\ncolor:#999;\ndisplay:block;\nfont-size:0.9em;\nmargin-right:0.5em;\nmargin-top:60px;\npadding:5px;\nposition:relative;\n}\n\n#noticeBoard a:hover {\nborder:none;\n}\n\n#noticeBoard br {\ndisplay:inline;\n}\n\n#sidebar {\nfloat:right;\nmargin-bottom:1em;\npadding-top:2em;\nwidth:20%;\n}\n\n#sidebarOptions {\nline-height:1.4em;\n}\n\n#sidebarOptions .button:active,#sidebarOptions .highlight {\nbackground:#F5F5F5;\n}\n\n#sidebarOptions .sliderPanel {\nbackground:#fff;\nborder:none;\nfont-size:1em;\n}\n\n#sidebarOptions .sliderPanel a {\nfont-weight:400;\n}\n\n#sidebarOptions .sliderPanel input {\nborder:1px solid #999;\n}\n\n#sidebarOptions a {\ncolor:#999;\ntext-decoration:none;\n}\n\n#sidebarOptions a:hover {\nbackground-color:#F5F5F5;\nborder:1px solid #fff;\ncolor:#4F4B45;\n}\n\n#sidebarTabs .tabContents {\nbackground:#fff;\n}\n\n#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover,#sidebarTabs .tabContents .button:hover,#sidebarTabs .tabContents .highlight,#sidebarTabs .tabContents .marked,#sidebarTabs .tabContents a.button:active {\nbackground:#fff;\ncolor:#4F4B45;\n}\n\n#sidebarTabs .tabSelected {\npadding-bottom:3px;\n}\n\n#sidebarTabs .tabUnselected {\nborder-bottom:none;\npadding-bottom:3px;\n}\n\n#sidebarTabs .tabUnselected:hover {\nborder-bottom:none;\ncolor:#4F4B45;\npadding-bottom:3px;\n}\n\n#topMenu {\nmargin-bottom:1em;\nmargin-left:2em;\n}\n\n#topMenu a {\ncolor:#483D8B;\n}\n\n* html .editor textarea,* html .editor input {\nwidth:98%;\n}\n\n* html .viewer pre {\nmargin-left:0;\n}\n\n*html #contentFooter {\npadding:0.25em 1em 0.5em;\n}\n\n.editor input,.editor textarea {\nborder:1px solid #948979;\n}\n\n.header {\nbackground:#fff;\nborder-bottom:4px solid #948979;\nclear:both;\nmargin-top:1em;\npadding-top:10px;\n}\n\n.headerShadow {\npadding:2.6em 0 0.5em;\n}\n\n.highlight,.marked {\nbackground:#FF0;\nborder:none;\ncolor:#000;\ntext-decoration:underline;\n}\n\n.listLink,#sidebarTabs .tabContents {\nline-height:1.5em;\n}\n\n.listTitle {\ncolor:#888;\n}\n\n.popup {\nbackground:#948979;\nborder:1px solid #948979;\nfont-size:1em;\n}\n\n.popup li a,.popup li a:visited {\nborder:none;\ncolor:#eee;\n}\n\n.popup li a:hover {\nbackground:#575352;\nborder:none;\ncolor:#fff;\n}\n\n.popup li.disabled {\ncolor:#000;\n}\n\n.roundedCorners {\n-khtml-border-radius:10px;\n-moz-border-radius:10px;\n-webkit-border-radius:10px;\nborder-radius:10px;\n}\n\n.searchBar {\nfloat:right;\nfont-size:1em;\nmargin-top:1.3px;\nmposition:relative;\n}\n\n.searchBar .button,.searchBar .searchButton {\ncolor:#FFF;\ndisplay:block;\n}\n\n.searchBar .button:hover,.searchBar .searchButton:hover {\nborder:1px solid #fefefe;\ncolor:#4F4B45;\n}\n\n.searchBar input {\nbackground-color:#fefefe;\nborder:1px solid #CCC;\ncolor:#830200;\nmargin-right:3px;\n}\n\n.searchbar {\nposition:relative;\nwidth:11em;\n}\n\n.searchbar .button {\nmargin:0;\nwidth:11em;\n}\n\n.selected .tagging .button,.selected .tagged .button {\ncolor:#4F4B45;\n}\n\n.selected .tagging .listTitle,.selected .tagged .listTitle {\ncolor:#666;\n}\n\n.selected .tagging,.selected .tagged {\nbackground-color:#eee;\nborder:1px solid #BFBAB3;\n}\n\n.selected .toolbar a,#sidebarTabs .tabContents .tiddlyLink,#sidebarTabs .tabContents .button {\ncolor:#999;\n}\n\n.selected .toolbar a:hover,.toolbar .button:hover,.toolbar .highlight,.toolbar .marked,.toolbar a.button:active {\nbackground:transparent;\nborder:1px solid #fff;\ncolor:#4F4B45;\n}\n\n.shadow .title {\ncolor:#948979;\n}\n\n.siteSubtitle {\ncolor:#FFF;\nfont-size:1em;\nmargin:.5em 3em;\n}\n\n.siteTitle {\nbackground-color:transparent !important;\ncolor:#2f2a29;\nfont-family:'Trebuchet MS' sans-serif;\nfont-size:32px;\nfont-weight:700;\nmargin-bottom:1em;\nmargin-left:.5em;\n}\n\n.siteTitle a {\nborder-bottom:1px dotted #c63;\ncolor:#C63;\n}\n\n.subtitle,.subtitle a {\ncolor:#999;\nfont-size:1em;\nmargin:0.2em;\n}\n\n.tabSelected {\nbackground:#948979;\ncolor:#fff;\n}\n\n.tabSelected,.tabSelected:hover {\nbackground:#948979;\nborder:solid 1px #948979;\ncolor:#fff;\npadding-bottom:1px;\n}\n\n.tabUnselected {\nbackground:#eee;\nborder:solid 1px #ccc;\ncolor:#999;\npadding-bottom:1px;\n}\n\n.tagClear {\nclear:none;\n}\n\n.tagging .button,.tagged .button {\ncolor:#aaa;\n}\n\n.tagging .button:hover,.tagged .button:hover,.tagging .button:active,.tagged .button:active {\nbackground:transparent;\nborder:none;\ncolor:#000;\ntext-decoration:underline;\n}\n\n.tagging .listTitle,.tagged .listTitle {\ncolor:#bbb;\n}\n\n.tagging,.tagged {\nbackground-color:#F7F7F7;\nborder:1px solid #eee;\n}\n\n.tiddler {\nborder-bottom:1px solid #DDD;\npadding-bottom:40px;\n}\n\n.title {\ncolor:#C63;\n}\n\n.viewer .button,.editorFooter .button,#messageArea .button {\nborder:1px solid #CC6714;\ncolor:#666;\n}\n\n.viewer .button:active,.viewer .highlight,.editorFooter .button:active,.editorFooter .highlight {\nbackground:#575352;\nborder-color:#575352;\ncolor:#fff;\n}\n\n.viewer .button:hover,.editorFooter .button:hover {\nbackground:#CC6714;\nborder-color:#CC6714;\ncolor:#fff;\n}\n\n.viewer blockquote {\nborder-left:3px solid #948979;\n}\n\n.viewer code {\ncolor:#2F2A29;\n}\n\n.viewer hr {\nborder-top:dashed 1px #948979;\n}\n\n.viewer pre {\nbackground:#f5f5f5;\nborder:1px solid #948979;\n}\n\n.viewer table {\nborder:2px solid [[ColorPalette::TertiaryDark]];\n}\n\n.viewer th,thead td {\nbackground:#948979;\nborder:1px solid #948979;\ncolor:#fff;\n}\n\na,#sidebarOptions .sliderPanel a,#mainMenu a:link,#navlist a:visited {\ncolor:#CC6714;\ntext-decoration:none;\n}\n\na:hover,#sidebarOptions .sliderPanel a:hover {\nbackground-color:#F5F5F5;\ncolor:#CC6714;\n}\n\nh1 {\nfont-size:18px;\n}\n\nh1,h2,h3,h4,h5 {\nbackground:transparent;\ncolor:#666;\nfont-family:Arial, Helvetica, sans-serif;\npadding-bottom:2px;\n}\n\nh2 {\nfont-size:16px;\n}\n\nh3 {\nfont-size:14px;\n}\n\n/*}}}*/\n
[[Ikea|http://www.ikea.com/us/en/catalog/products/S89850945]]
/***\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
// // Excludes any tiddlers from timeline that have been tagged with ''excludeTimeline''\n/*{{{*/\nconfig.macros.timeline.handler = function(place,macroName,params)\n{\n var field = params[0] ? params[0] : "modified";\n var tiddlers = store.reverseLookup("tags","excludeTimeline",false,field);\n var lastDay = "";\n var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;\n for(var t=tiddlers.length-1; t>=last; t--)\n {\n var tiddler = tiddlers[t];\n var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);\n if(theDay != lastDay)\n {\n var theDateList = document.createElement("ul");\n place.appendChild(theDateList);\n createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));\n lastDay = theDay;\n }\n var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink");\n theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));\n }\n}\n/*}}}*/\n
/***\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// %/
Notes and Journal Entries
203-924-6604\n\nNick Lampronikos
''Definition:'' things we have others do because we are unable or unwilling to do for ourselves
+++[+ Menu1][- Menu1]>\n +++[+ SubMenu1][- SubMenu1]>\n item\n item\n ...\n ===\n +++[+ SubMenu2][- SubMenu2]>\n item\n item\n ...\n ===\n===\n\nhttp://www.carmarea.org/Carm_Web/Alumni/Alumni_index.htm
Pearlspremium.com. \n\nSlow growing native grass mix.
http://www.freshapps.com/lose-it/\n\nhttp://www.fourmilab.ch/hackdiet/
TopLevel -- broad\nDomain -- refinement in regard to a particular field\nTask -- further refinement to a area within a domain\nApplication - getting a particular thing done
//{{{\nconfig.formatters.unshift( {\n name: "inlinetabs",\n match: "\s\s<tabs",\n lookaheadRegExp: /(?:<tabs (.*)>\sn)((?:.|\sn)*?)(?:\sn<\s/tabs>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var cookie = lookaheadMatch[1];\n var wrapper = createTiddlyElement(null,"div",null,cookie);\n var tabset = createTiddlyElement(wrapper,"div",null,"tabset");\n tabset.setAttribute("cookie",cookie);\n var validTab = false;\n var firstTab = '';\n var tabregexp = /(?:<tab (.*)>)(?:(?:\sn)?)((?:.|\sn)*?)(?:<\s/tab>)/mg;\n while((m = tabregexp.exec(lookaheadMatch[2])) != null)\n {\n if (firstTab == '') firstTab = m[1];\n var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");\n tab.setAttribute("tab",m[1]);\n tab.setAttribute("content",m[2]);\n tab.title = m[1];\n if(config.options[cookie] == m[1])\n validTab = true;\n }\n if(!validTab)\n config.options[cookie] = firstTab;\n w.output.appendChild(wrapper);\n story.switchInlineTab(tabset,config.options[cookie]);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n})\n\nStory.prototype.switchInlineTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents");\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n wikify(theTab.getAttribute("content"),tabContent);\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n \nStory.prototype.onClickInlineTab = function(e)\n{\n story.switchInlineTab(this.parentNode,this.getAttribute("tab"));\n return false;\n}\n//}}}
<!--{{{-->\n<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div macro='annotations'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>\n<!--}}}-->
>a static, rual, earthly paradise\n\nThis is delusional but it's what I think we want some times.
from Seth Godin\n\n>Friday, 06:20 AM\n>When you're trying to sell your idea, it's natural to assume that the people you're selling to think the way you do. If you can only show them the facts and stories that led you to believe what you believe, then of course they'll end up where you are... believing.\n\n>The problem, of course, is that people don't always think like you.\n\n>Go watch some videos of people of different political ideologies talking about why they support a candidate other than your candidate. These people are stupid! They can't conjugate an idea, they have no factual basis for their beliefs, they are clueless, they are ideologues, they are parroting a talking head who knows even less than they do! (And those epithets apply to anyone you disagree with, of course). In fact, they're saying the same thing about you.\n\n>Same goes for diehard fans of the other brand, or worse, the clueless who should be using your solution, but don't even care enough to use your competitor's product.\n\n>If they only thought like you, of course, and knew what you know, then there wouldn't be a problem.\n\n>The challenge doesn't lie in getting them to know what you know. It won't help. The challenge lies in helping them see your idea through their lens, not yours. If you study the way religions and political movements spread, you can see that this is exactly how it works. Marketers of successful ideas rarely market the facts. Instead, they market stories that match the worldview of the people being marketed to.\n\n>There's an alternative, one that you might want to think hard about: perhaps you should only market your idea to people who already think the way you do. After all, you're not running for president, you don't need a majority. Screen people by their behavior (what they read, what they buy, how they act) and only tell your story to the people who will embrace it. That's a lot easier to do that than it's ever been before.]\n\n[[5 big world views|http://www.xenos.org/classes/papers/5wldview.htm]]
/***\n|Name:|InstantTimestampPlugin|\n|Source|http://instanttimestamp.tiddlyspot.com/|\n|Documentation|TBA|\n|Version|1.0.5 (17-Jan-2007)|\n|Author|SimonBaird|\n|License|Creative Commons Attribution-ShareAlike 2.5 License|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires|NA|\n|Overrides|NA|\n|Description|Date Stamp|\n!Description\nIf you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list:\n{{{\n* {ts} or {t} -> timestamp\n* {ds} or {d} -> datestamp\n* !ts or !t at start of line -> !!timestamp\n* !ds or !d at start of line -> !!datestamp\n}}}\n(I added the extra ! since that's how I like it. Remove it from translations below if required)\n!Notes\n* Change the timeFormat and dateFormat below to suit your preference.\n* See also AutoCorrectPlugin\n!History\n* 17-Jan-07, version 1.0.5\n** added fields param to saveTiddler method needed in TW 2.1+\n* 06-Apr-06, version 1.0.4\n** removed the AutoCorrect stuff and put it in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.3\n** now have exclusion by tag and tiddler name, probably less important here than in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.2\n** put matches into array to and eval them to allow generic substitutions\n* 05-Apr-06, version 1.0.1\n** added ds for datestamp as suggested by DanielBaird\n** made case insensitive\n** Added translation for !t at start of line\n* 05-Apr-06, version 1.0.0\n** written after suggestion by Achim Wessling \n!Code\n***/\n//{{{\n\nconfig.InstantTimestamp = {\n\n // adjust to suit\n timeFormat: '0DD.0MM.YY 0hh:0mm',\n dateFormat: '0DD.0MM.YY',\n\n translations: [\n [/^!ts?$/img, "'!!'+now.formatString(config.InstantTimestamp.timeFormat)"],\n [/^!ds?$/img, "'!!'+now.formatString(config.InstantTimestamp.dateFormat)"],\n [/\s{ts?\s}/ig, "now.formatString(config.InstantTimestamp.timeFormat)"],\n [/\s{ds?\s}/ig, "now.formatString(config.InstantTimestamp.dateFormat)"]\n ],\n\n excludeTags: [\n "noAutoCorrect",\n "html",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nTiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.InstantTimestamp;\n\n if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var now = new Date();\n var trans = config.InstantTimestamp.translations;\n for (var i=0;i<trans.length;i++) {\n newBody = newBody.replace(trans[i][0], eval(trans[i][1]));\n }\n }\n\n return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields);\n}\n\n//}}}
[[Computer Error Codes|http://www.ptcruizer.com/computer-codes.html]]\n\nThe car's not running right and it has an error code of 302\n\n>Misfires are caused by loss of spark, air/fuel mixture is too far out of balance \n>to ignite, or loss of compression\n
<<timeline created >>
CARIBBEAN AND BERMUDA &gt; THE BAHAMAS &gt; ELEUTHERA\nAffordable Caribbean: Bahamas \n\nFrom the NYT 25 January 2009
<<list all>>
/***\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 label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*[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* {{{[label=key|tooltip]}}}^^\nuses custom label/tooltip/accesskey. {{{=key}}} and {{{|tooltip}}} are optional. 'key' is must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\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, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*[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----\nnested floaters\n>menu: <<tiddler NestedSlidersExample>>\n(see [[NestedSlidersExample]] for definition)\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.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: 1, minor: 9, revision: 0, date: new Date(2006,5,11)};\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\s])?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n var 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[6]) {\n title = lookaheadMatch[6].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,null,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);\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\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.style.display = show;\n if (lookaheadMatch[4] && lookaheadMatch[4].length>2) panel.style.width=lookaheadMatch[4].slice(1,-1); // custom width\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[8]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[7]?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[7]?"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 // 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" || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length)\n { config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }\n // align slider/floater position with target button\n adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\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//}}}
[[80 years of Standards and Poors Performance|http://kennison.name/files/uploads/SandP500.gif]]
[[This is a good site that explains how to calculate the probability of an event occuring when thowing dice|http://www.edcollins.com/backgammon/diceprob.htm]]
You have to pay for what you use if you want to get alternative to cable programing\nhttp://gigaom.com/2009/02/04/welcome-to-consumption-based-broadband/\n\nWe pay $75 for TV and $45 for Internet
Mark C. Taylor, columbia, religion\nRichard Posner, chicago, law, finance
/***\n|''Name:''|Plugin: ZiddlyWiki|\n|''Description:''|Client-side component of the ZiddlyWiki server-side for TiddlyWiki|\n|''Version:''|1.0.0|\n|''Date:''|Sep 30, 2006|\n|''Source:''|http://ziddlywiki.com|\n|''Author:''|BobMcElrath|\n|''Email:''|my first name at my last name dot org|\n|''License:''|[[GPL open source license|http://www.gnu.org/licenses/gpl.html]]|\n|''~CoreVersion:''|2.1.0|\n!Description\nThis plugin is useful only in conjunction with the ZiddlyWiki server-side for\nTiddlyWiki. This plugin is automatically added to any TiddlyWiki downloaded\nfrom a ZiddlyWiki server, and should not be added by hand to your TiddlyWiki.\n\nIf you want to use the ZiddlyWiki server, install that first, and you will\nautomatically get this plugin.\n!My Server\nThis ZiddlyWiki lives at: \n{{{\n http://kennison.name/notes\n}}}\n!API\n{{{\n action=get\n}}}\n!Code\n***/\n//{{{\n// Place to store my junk\nif(typeof zw == "undefined") var zw = {};\nconfig.options.checkUnsavedChanges = false;\nconfig.options.confirmExit = false;\n//zw.ieurl = (navigator.appVersion.indexOf('MSIE') > -1) ? 'ie=1&' : '';\nzw.editingTiddlers = {};\nzw.dirty = false; // flag for when ZW was unable to save something\nzw.serverUrl = "http://kennison.name/notes";\n\nconfig.messages.loginToEdit = 'You must be logged in to make changes. Viewing source instead.';\nconfig.messages.errorDeleting = 'An error has occurred. Review your Zope error log for details.';\nconfig.messages.errorSaving = 'An error has occurred. Review your Zope error log for details. If you navigate away from this page now, you will lose your changes.';\nconfig.messages.protectedTiddler = 'You are not allowed to edit here. Click OK to view the source.';\nconfig.messages.lockedTiddler = 'This tiddler is currently being edited by %s. Please try again in a few minutes.';\nconfig.messages.lockedTiddlerYou = 'This tiddler is currently locked by you. Would you like to edit anyway?';\nconfig.messages.viewRevisionTooltip = 'View this revision.';\nconfig.messages.exportLinkLabel = 'export to file';\nconfig.messages.exportLinkPrompt = 'Export to a TiddlyWiki file';\nconfig.messages.importLinkLabel = 'import from file';\nconfig.messages.importLinkPrompt = 'Import from a TiddlyWiki file';\nconfig.messages.unsavedChangesWarning = 'Something has gone wrong and ZiddlyWiki was unable to save all changes to the server.\snIf you navigate away from this page, those changes will be lost.\snPress OK to save a backup to a local file.';\n\nconfig.views.wikified.toolbarRevisions = {text: "revisions", tooltip: "View another revision of this tiddler", popupNone: "No revisions"};\n\n// Shadow tiddlers that are protected\nconfig.protectedTiddlers = ['DefaultTiddlers', 'MainMenu'];\n\nconfig.replaceBodyCharacters = [\n [/‘/g, "'"],\n [/’/g, "'"],\n [/“/g, '"'],\n [/”/g, '"'],\n [/…/g, '...'],\n [/–/g, ' -- ']\n];\n\nconfig.macros.login = {\n label: 'login',\n prompt: 'Log into the system',\n sizeTextbox: 15,\n // FIXME onmouseover, etc... do these cause a problem? Add (?!onmouseover|onmouseout...)\n innerHTMLSafe: /^<div( ([a-zA-Z0-9_]+)="[^"]*")+>[^<>]*<\s/div>$/,\n handler: function(place) {\n if(zw.loggedIn) {\n var link = createTiddlyLink(place, zw.username, true);\n if(location.protocol == "file:") {\n link.innerHTML = zw.username + ' (offline)';\n } else {\n link.innerHTML = zw.username + ' (logged in)';\n createTiddlyButton(place, "logout", "Log out of the system", this.doLogout);\n }\n } else {\n // FIXME Only make login form if cookie-based login are enabled.\n var form = document.createElement("form");\n form.action = "?action=get&title=ZiddlyStatus";\n var u = createTiddlyElement(form, "input", "zw_username");\n u.value = "YourName";\n u.onclick = this.clearInput;\n u.size = this.sizeTextbox;\n u.onkeypress = this.enterSubmit;\n u.name = "__ac_name";\n var p = createTiddlyElement(form, "input", "zw_password");\n p.value = "password";\n p.size = this.sizeTextbox;\n p.onclick = this.clearInput;\n p.onkeypress = this.enterSubmit;\n p.name = "__ac_password";\n place.appendChild(form);\n createTiddlyButton(place,this.label,this.prompt,this.doLogin);\n }\n },\n clearInput: function(e) {\n var u = document.getElementById("zw_username");\n var p = document.getElementById("zw_password");\n if((e.target == u || e.target == p) && p.type != "password") { \n u.value = ''; \n p.value=''; \n p.type = "password";\n }\n },\n enterSubmit: function(e) {\n if(e.keyCode == 13 || e.keyCode == 10) config.macros.login.doLogin(e);\n },\n doLogin: function(e) {\n clearMessage();\n displayMessage('Logging in...');\n var u = document.getElementById("zw_username");\n var p = document.getElementById("zw_password");\n zw.loggingIn = true;\n ajax.post(zw.serverUrl.replace("http://","http://"+u.value+":"+p.value+"@")\n ,zw.addTiddler,\n "action=get&title=ZiddlyStatus&__ac_name="+u.value+"&__ac_password="+p.value);\n },\n doLogout: function(e) {\n clearMessage();\n displayMessage('Logging out...');\n zw.loggingIn=false;\n // FIXME this will fail if " " is a valid username\n ajax.post(zw.serverUrl.replace("http://","http:// :@")\n ,zw.addTiddler,\n "action=get&title=ZiddlyStatus&__ac_name=&__ac_password=");\n },\n statusChange: function() {\n var oldreadOnly = readOnly;\n config.options.chkHttpReadOnly = (zw.loggedIn || zw.anonEdit || location.protocol == "file:") ? false:true;\n readOnly = !zw.loggedIn;\n // Check for new tiddlers\n var numtofetch = 0;\n var missingtiddlers = "";\n for(var t in zw.tiddlerList) {\n if(!store.fetchTiddler(t.htmlDecode())) {\n numtofetch++;\n missingtiddlers += "\sn" + t;\n }\n }\n var fetched = 0;\n this.fetchlist = [];\n if(zw.tiddlerList.length == 0) {\n clearMessage();\n } else for(var t in zw.tiddlerList) {\n if(!store.fetchTiddler(t.htmlDecode())) {\n var callback = zw.addTiddler;\n this.fetchlist.push(t);\n if(++fetched == numtofetch) \n callback = config.macros.login.addLastTiddler;\n ajax.get('?action=get&title=' + encodeURIComponent(t.htmlDecode())\n + "&" + zw.no_cache(), callback)\n }\n }\n if(oldreadOnly != readOnly || numtofetch == 0) {\n refreshDisplay(["ViewTemplate", "EditTemplate"]);\n story.refreshAllTiddlers();\n refreshAll();\n }\n },\n doneLoginout: function() {\n var evalme = store.fetchTiddler("ZiddlyStatus").text;\n window.eval(evalme);\n readOnly = !zw.loggedIn;\n store.notify(["ZiddlyStatus"], true);\n if(!zw.loggedIn && zw.loggingIn) { // still not logged in.\n clearMessage();\n displayMessage("Authentication failed. Did you type your username and password correctly?");\n }\n if(!zw.loggingIn || (zw.loggedIn && zw.loggingIn)) clearMessage();\n return true;\n },\n addLastTiddler: function(str,status) {\n zw.addTiddler(str,status);\n refreshAll(); // Just redraw everything.\n }\n};\n// This causes our doneLogin method above to be called on startup.\nstore.addNotification("ZiddlyStatus", config.macros.login.statusChange);\n\n// Dynamically load a tiddler\nzw.loadTiddler = function(t) {\n var str = ajax.gets('?action=get&title=' + encodeURIComponent(t.htmlDecode())\n + "&" + zw.no_cache());\n return zw.addTiddler(str, 200);\n}\n\nzw.addTiddler = function(str,status) {\n var tiddler = new Tiddler();\n var d = document.createElement("div");\n if(!str.match(config.macros.login.innerHTMLSafe)) { \n if(!confirm("This tiddler appears to contain HTML and may be dangerous\sn\sn"+str)) \n return tiddler;\n }\n d.innerHTML = str; // FIXME dangerous -- response could contain <script>\n var title = store.getLoader().getTitle(store, d.firstChild);\n if(status == 404) { // not found\n store.zw_removeTiddler(title);\n } else if(status == 200) { // okay\n tiddler = store.getLoader().internalizeTiddler(store, tiddler, title, d.firstChild);\n tiddler.changed();\n store.addTiddler(tiddler);\n if(typeof store.getValue(title, "oldtitle") != "undefined") {\n store.setValue(title, "renamedSubTitle", \n "(renamed from "+store.getValue(title, "oldtitle")+")");\n }\n }\n if(tiddler.title == "ZiddlyStatus")\n config.macros.login.doneLoginout();\n refreshDisplay(title);\n return tiddler;\n}\n\nTiddler.prototype.getSubtitle = function() {\n var theModifier = this.modifier;\n if(!theModifier)\n theModifier = config.messages.subtitleUnknown;\n var theModified = this.modified;\n if(theModified)\n theModified = theModified.toLocaleString();\n else\n theModified = config.messages.subtitleUnknown;\n return(config.messages.tiddlerLinkTooltip.format([this.title,theModifier,\ntheModified]));\n\n}\n\nconfig.macros.ziddlyversion = {\n handler: function(place) {\n createTiddlyElement(place,"span",null,null,version.major + "." \n + version.minor + "." + version.revision \n + (version.beta ? "(b" + version.beta + ")" : "") + "." \n + version.extensions.ZiddlyWiki);\n }\n};\n\nconfig.macros.exportLink = {\n label: config.messages.exportLinkLabel,\n prompt: config.messages.exportLinkPrompt,\n handler: function(place) { \n if(location.protocol == "file:") {\n this.label = config.macros.saveChanges.label;\n this.prompt = config.macros.saveChanges.prompt;\n this.accessKey = config.macros.saveChanges.accessKey;\n config.macros.saveChanges.handler(place);\n } else {\n createTiddlyButton(place,this.label,this.prompt,function(){\n location.href='?action=export';return false;\n });\n }\n }\n};\n\nconfig.macros.importLink = {\n label: config.messages.importLinkLabel,\n prompt: config.messages.importLinkPrompt,\n handler: function(place) {\n if(zw.loggedIn || zw.anonEdit) {\n createTiddlyButton(place,this.label,this.prompt,function(){\n displayTiddler(null, "ImportTiddlers");\n });\n }\n }\n};\n\nTiddlyWiki.prototype.zw_removeTiddler = TiddlyWiki.prototype.removeTiddler;\nTiddlyWiki.prototype.removeTiddler = function(title) {\n displayMessage("Deleting '"+title+"' on server...");\n ajax.post(zw.serverUrl, zw.addTiddler, 'action=delete&title=' + encodeURIComponent(title) + '&' + zw.no_cache());\n return true;\n};\n\nTiddlyWiki.prototype.zw_saveTiddler = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n displayMessage("Saving '"+title+"'...");\n newBody = replaceBodyCharacters(newBody);\n var tiddler = this.zw_saveTiddler(title,newTitle,newBody,modifier,modified,tags);\n var callback = function(r,status){\n var newtiddler = zw.addTiddler(r,status);\n if(!newtiddler) {\n alert("ZiddlyWiki error: The tiddler '"+title+"' that I just tried to save\sn"\n +"doesn't exist after the save! Response ("+status+") was: \sn"+r);\n zw.dirty = true;\n } else if(newtiddler.escapeLineBreaks().htmlEncode() != tiddler.escapeLineBreaks().htmlEncode()) {\n alert("ZiddlyWiki error: Saved tiddler '"+title+"' is not the same as what was just saved."\n +"\sn-------------------before---------------------\sn"+tiddler.escapeLineBreaks().htmlEncode()\n +"\sn-------------------after----------------------\sn"+newtiddler.escapeLineBreaks().htmlEncode()\n );\n zw.dirty = true;\n }\n };\n// FIXME by using async ajax here, a reload timeout may come between the save\n// and the callback's return, which causes the tiddler to be double-rendered.\n ajax.post(zw.serverUrl, callback, 'action=save&oldtitle=' + encodeURIComponent(title) + '&title=' \n + encodeURIComponent(newTitle) + '&body=' + encodeURIComponent(newBody) + '&tags=' \n + encodeURIComponent(tags) + '&modified=' \n + encodeURIComponent((modified||store.fetchTiddler(title).modified).convertToYYYYMMDDHHMM()) \n + '&' + zw.no_cache());\n clearMessage();\n return tiddler;\n};\n\nfunction replaceBodyCharacters(body) {\n var chars = config.replaceBodyCharacters;\n for(var i=0; i<chars.length; i++) {\n body = body.replace(chars[i][0], chars[i][1]);\n }\n return body;\n};\n\nzw.no_cache = function() {return new String((new Date()).getTime())};\n\nconfig.commands.revisions = {\n text: config.views.wikified.toolbarRevisions.text,\n tooltip: config.views.wikified.toolbarRevisions.tooltip,\n popupNone: config.views.wikified.toolbarRevisions.popupNone,\n hideShadow: true,\n handler: function(event,src,title) {\n var popup = Popup.create(src);\n Popup.show(popup,false);\n var callback = function(r,status) {\n if(popup) {\n if(status != 200) {\n createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),\n config.views.wikified.toolbarRevisions.popupNone);\n } else {\n var revs = r.split('\sn');\n for(var i=0; i<revs.length; i++) {\n var parts = revs[i].split(' ');\n if(parts.length>1) {\n var modified = Date.convertFromYYYYMMDDHHMM(parts[0]);\n var key = parts[1];\n var modifier = parts[2];\n var button = createTiddlyButton(createTiddlyElement(popup,"li"), modified.toLocaleString() +" "+ modifier, \n config.messages.viewRevisionTooltip, \n function(){\n displayTiddlerRevision(this.getAttribute('tiddlerTitle'), \n this.getAttribute('revision'), this); \n return false;\n }, 'tiddlyLinkExisting tiddlyLink');\n button.setAttribute('tiddlerTitle', title);\n button.setAttribute('revision', key);\n var t = store.fetchTiddler(title);\n if(!t) alert("Attempt to find revisions for non-existant tiddler '"+title+"'!");\n if(t && (store.getValue(t, 'revision') == key))\n button.className = 'revisionCurrent';\n if(i == 0)\n this.latestRevision = key;\n }\n }\n }\n }\n };\n ajax.get('?action=get_revisions&title=' + encodeURIComponent(title.htmlDecode()) + '&' + zw.no_cache(), callback);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return true;\n }\n}\n\nfunction displayTiddlerRevision(title, revision, src, updateTimeline) {\n var tiddler = store.fetchTiddler(title);\n// We already have the latest version\n if(tiddler && store.getValue(tiddler, 'revision') == revision) return;\n displayMessage("Loading revision information for '"+title+"'...");\n revision = revision ? '&revision=' + revision : '';\n ajax.get('?action=get&title=' + encodeURIComponent(title.htmlDecode()) + revision \n + '&' + zw.no_cache(), displayTiddlerRevisionCallback)\n};\n\nfunction displayTiddlerRevisionCallback(str,status) {\n store.suspendNotifications(); // To prevent multiple redraws\n var tiddler = zw.addTiddler(str,status);\n store.setValue(tiddler.title, "historicalSubTitle", "");\n if(tiddler.tags.contains('deleted'))\n store.setValue(tiddler.title, "historicalSubTitle", \n store.getValue(tiddler.title, "historicalSubTitle")+" (deleted)");\n if(latestRevision != store.getValue(tiddler.title, "revision"))\n store.setValue(tiddler.title, "historicalSubTitle", \n store.getValue(tiddler.title, "historicalSubTitle")+" (historical revision)");\n store.setValue(tiddler.title, "latestRevision", latestRevision);\n story.refreshTiddler(tiddler.title, DEFAULT_VIEW_TEMPLATE, true);\n store.resumeNotifications();\n clearMessage();\n}\n\nTiddler.prototype.isReadOnly = function() {\n if(store.getValue(this.title, "readonly") == "true") return true;\n if(zw.isAdmin) return false;\n if(zw.loggedIn && this.modifier == zw.username) return false;\n if(location.protocol == "file:") return false;\n return isProtectedTiddler(this.title) || !(zw.anonEdit || zw.loggedIn);\n};\n\n// Add the protected tag to tiddlers in config.protectedTiddlers\nTiddler.prototype.zw_set = Tiddler.prototype.set;\nTiddler.prototype.set = function(title,text,modifier,modified,tags,created) {\n if(!tags) tags = [];\n if(typeof tags == "string") tags = tags.readBracketedList();\n if(!store.tiddlerExists(title) && store.isShadowTiddler(title)) {\n for(var i=0;i<config.protectedTiddlers.length;i++) {\n if(config.protectedTiddlers[i] == title) {\n tags.push('protected');\n break;\n }\n }\n }\n return this.zw_set(title, text, modifier, modified, tags, created);\n}\n\nconfig.commands.editTiddler.zw_handler = config.commands.editTiddler.handler;\nconfig.commands.editTiddler.handler = function(event,src,title) {\n if(readOnly) {\n this.zw_handler(event,src,title);\n } else {\n displayMessage("Loading '"+title+"'...");\n var obj = this;\n var callback = function(r,status) {\n clearMessage();\n if(status == 404) { // doesn't exist (might be a shadow tiddler)\n zw.editingTiddlers[title] = true;\n obj.zw_handler(event,src,title);\n } else if(status == 200) {\n var tiddler = zw.addTiddler(r,status);\n if(tiddler.tags.indexOf('deleted') != -1) // Remove the deleted tag on edit\n tiddler.tags.splice(tiddler.tags.indexOf('deleted'),1);\n zw.editingTiddlers[tiddler.title] = true;\n obj.zw_handler(event,src,tiddler.title);\n } else if(status == 503) { // "Temporarily Unavailable" Conflict\n if(r == zw.username) {\n if(confirm(config.messages.lockedTiddlerYou)) {\n var str = ajax.gets('?action=unlock&title=' + encodeURIComponent(title)\n + "&" + zw.no_cache());\n zw.addTiddler(str, 200);\n return obj.handler(event,src,title);\n }\n } else {\n alert(config.messages.lockedTiddler.replace(/%s/g, r));\n }\n } else if(status == 403) {\n // Lock failed, we must not be logged in, or something changed underneath us.\n zw.loggedIn = false;\n zw.isAdmin = false;\n readOnly = true;\n zw.loadTiddler("ZiddlyStatus");\n //refreshDisplay(["SideBarOptions","ViewTemplate", "EditTemplate"]);\n //story.refreshAllTiddlers();\n alert(config.messages.loginToEdit);\n config.commands.editTiddler.zw_handler(event,src,title);\n } else {\n alert("Server returned a response I don't understand:\sn\sn"+k);\n }\n };\n var rev = "";\n if(store.getValue(title, "latestRevision") != "undefined")\n rev = "revision="+store.getValue(title, "revision");\n ajax.post(zw.serverUrl, callback, 'action=lock&title=' + encodeURIComponent(title) + '&' + rev + '&' + zw.no_cache());\n }\n return false;\n};\n\nconfig.commands.saveTiddler.zw_handler = config.commands.saveTiddler.handler;\nconfig.commands.saveTiddler.handler = function(event,src,title) {\n if(zw.isAdmin \n || (zw.loggedIn || zw.anonEdit) && !isProtectedTiddler(title)\n || (isProtectedTiddler(title) && zw.loggedIn && this.modifier == zw.username)) {\n zw.editingTiddlers[title] = false;\n return this.zw_handler(event,src,title);\n } else {\n config.commands.cancelTiddler.zw_handler(null,null,title);\n }\n return false;\n};\n\nconfig.commands.deleteTiddler.zw_handler = config.commands.deleteTiddler.handler;\nconfig.commands.deleteTiddler.handler = function(event,src,title) {\n if(zw.isAdmin \n || (zw.loggedIn || zw.anonEdit) && !isProtectedTiddler(title)\n || (isProtectedTiddler(title) && zw.loggedIn && this.modifier == zw.username)) {\n zw.editingTiddlers[title] = false;\n return this.zw_handler(event,src,title);\n } else {\n config.commands.cancelTiddler.zw_handler(null,null,title);\n }\n return false;\n};\n\nconfig.commands.cancelTiddler.zw_handler = config.commands.cancelTiddler.handler;\nconfig.commands.cancelTiddler.handler = function(event,src,title) {\n if(!config.options.chkHttpReadOnly) {\n if(zw.editingTiddlers[title]) {\n var str = ajax.gets('?action=unlock&title=' + encodeURIComponent(title) + "&" + zw.no_cache());\n zw.addTiddler(str, 200);\n }\n zw.editingTiddlers[title] = false;\n }\n return this.zw_handler(event,src,title);\n};\n\nfunction isProtectedTiddler(title) {\n var tiddler = store.fetchTiddler(title);\n if(!tiddler) { // Must be a shadow\n for(var i=0;i<config.protectedTiddlers.length;i++) {\n if(config.protectedTiddlers[i] == title) return true;\n }\n }\n if(tiddler && tiddler.tags) {\n for(var i=0;i<tiddler.tags.length;i++) {\n if(tiddler.tags[i] == 'protected') return true;\n }\n }\n return false;\n};\n\nzw.refresh_count = 0;\nzw.refresh_tiddlers = function() {\n zw.refresh_count++;\n if(zw.refresh_count > 30) { // thirty minutes\n clearInterval(zw.refresh_interval_id);\n } else {\n ajax.get(zw.serverUrl + '?action=refresh&latest=' + zw.latestTiddler, zw.refresh_tiddlers_callback);\n }\n};\n\n// If there are unsaved changes, force the user to confirm before exitting\nfunction confirmExit()\n{\n hadConfirmExit = true;\n if(zw.dirty) return config.messages.confirmExit;\n}\n\n// Give the user a chance to save changes before exitting\nfunction checkUnsavedChanges()\n{\n if(zw.dirty && window.hadConfirmExit === false)\n {\n if(confirm(config.messages.unsavedChangesWarning))\n saveChanges();\n }\n}\n\nTiddler.prototype.isReadOnly = function() {\n return readOnly || store.getValue(this.title, "readonly");\n}\n\n// Receives a list of updated tiddler [timestamp, [title, modified, revision], ...]\n// If TW supports higher resolution modification stamps (currently: 1 minute) we can use\n// that as an identifier instead of revision\nzw.refresh_tiddlers_callback = function(tiddlers) {\n if(tiddlers == '') return;\n tiddlers = tiddlers.split('\sn\sn');\n zw.latestTiddler = parseInt(tiddlers[0]);\n for(var i=1; i<tiddlers.length; i++) {\n var l = tiddlers[i].split('\sn'); // [title, modified, revision]\n if(!zw.editingTiddlers[l[0]]) // FIXME if it's being edited and we just found out someone else modified it, we should issue a warning.\n displayTiddlerRevision(l[0], l[2], null, true);\n }\n};\n\nif(location.protocol != "file:")\n zw.refresh_interval_id = setInterval('zw.refresh_tiddlers()', 60000); // refresh every minute\n\n// mini/ajax.js - http://timmorgan.org/mini\n\nfunction $(e){if(typeof e=='string')e=document.getElementById(e);return e};\nfunction collect(a,f){var n=[];for(var i=0;i<a.length;i++){var v=f(a[i]);if(v!=null)n.push(v)}return n};\n\nvar ajax={};\najax.x=function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}};\najax.serialize=function(f){var g=function(n){return f.getElementsByTagName(n)};var nv=function(e){if(e.name)return encodeURIComponent(e.name)+'='+encodeURIComponent(e.value);else return ''};var i=collect(g('input'),function(i){if((i.type!='radio'&&i.type!='checkbox')||i.checked)return nv(i)});var s=collect(g('select'),nv);\nvar t=collect(g('textarea'),nv);return i.concat(s).concat(t).join('&');};\najax.send=function(u,f,m,a){var x=ajax.x();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseText,x.status,x.statusText)};if(m=='POST')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a)};\najax.get=function(url,func){ajax.send(url,func,'GET')};\najax.gets=function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText};\najax.post=function(url,func,args){ajax.send(url,func,'POST',args)};\najax.posts=function(url,args){var x=ajax.x();x.open('POST',url,false);x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(args);return x.responseText};\najax.update=function(url,elm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.get(url,f)};\najax.submit=function(url,elm,frm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.post(url,f,ajax.serialize(frm))};\n\n//if(window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)\n//window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n//window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");\n//window.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n\n//}}}\n
/***\n|Name|FullScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#FullScreenPlugin|\n|Version|1.1|\n|Requires|~TW2.x|\n!Description:\nToggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.\n\n!Demo:\nClick the ↕ button in the toolbar for this tiddler. Click it again to turn off fullscreen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nEdit the ViewTemplate to add the fullscreen command to the toolbar.\n\n!History:\n*25-07-06: ver 1.1\n*20-07-06: ver 1.0\n\n!Code\n***/\n//{{{\nvar lewcidFullScreen = false;\n\nconfig.commands.fullscreen =\n{\n text:" ↕ ",\n tooltip:"Fullscreen mode"\n};\n\nconfig.commands.fullscreen.handler = function (event,src,title)\n{\n if (lewcidFullScreen == false)\n {\n lewcidFullScreen = true;\n setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important; width: 100%}',"lewcidFullScreenStyle");\n }\n else\n {\n lewcidFullScreen = false;\n setStylesheet(' ',"lewcidFullScreenStyle");\n }\n}\n\nconfig.macros.fullscreen={};\nconfig.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = params[0]||" ↕ ";\n var tooltip = params[1]||"Fullscreen mode";\n createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);\n}\n\nvar lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler =function(title,animate,slowly)\n{\n lewcid_fullscreen_closeTiddler.apply(this,arguments);\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n\n\nSlider.prototype.lewcidStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n{\n this.lewcidStop();\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n//}}}
Discover More Card (5% to 20% cash back at select online retailers; up to 1% unlimited cash back on all other purchases; increased or double rewards when choosing gift cards as the redemption option; no annual fee).\n\n\nDiscover Open Road Card (5% cash back on gas and auto maintenance purchases; 5% to 20% cash back on select online purchases; up to 1% cash back on all other purchases; no caps or reward expirations; no annual fee).\n
I purchased iPhoto and it's not great but it works. I still have to see how the rest of the iLife Series works. \n\n
http://www.jonahlehrer.com/articles Saw this from Guido\n\n40.3" W x 27.6" H x 9.6" D
/***\n|Name|ExportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|\n|Version|2.4.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file|\n\nWhen many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\nExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...). An interactive control panel lets you specify a destination, and then select which tiddlers to export. A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded. ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''\n\n!!!!!Inline interface (live)\n<<<\n<<exportTiddlers inline>>\n<<<\n!!!!!Usage\n<<<\nOptional "special tiddlers" used by this plugin:\n* SiteUrl^^\nURL for official server-published version of document being viewed (used in XML export)\ndefault: //none//^^\n* SiteHost^^\nhost name/address for remote server (e.g., "www.server.com" or "192.168.1.27")\ndefault: //none//^^\n* SitePost^^\nremote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")\ndefault: //none//^^\n* SiteParams^^\narguments (if any) for server-side receiving script\ndefault: //none//^^\n* SiteNotify^^\naddresses (if any) for sending automatic server-side email notices\ndefault: //none//^^\n* SiteID^^\nusername or other authorization identifier for login-controlled access to remote server\ndefault: current TiddlyWiki username (e.g., "YourName")^^\n* SiteDate^^\nstored date/time stamp for most recent published version of document\ndefault: current document.modified value (i.e., the 'file date')^^\n<<<\n!!!!!Example\n<<<\n<<exportTiddlers>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<exportTiddlers>>}}} macro^^\n<<<\n!!!!!Revision History\n<<<\n''2007.07.16 [2.4.1]'' in exportTWHeader(), reset HTML source 'markup' so installed markup is NOT copied to new file.\n''2007.06.30 [2.4.0]'' added "select related tiddlers" feature. Recursively scans the tiddler links[] info to find all tiddlers referenced by any of the currently selected tiddler, and then selects them all (including the original tiddlers). ''//Theoretically//'', selecting all related tiddlers should ensure that the exported file contains all tiddlers needed to properly render all of the originally selected tiddlers.\n''2007.04.19 [2.3.0]'' in exportData(), pass SiteURL value as param to saveToRss(). Fixes 'undefined' appearing in tiddler link in XML output. Also, in refreshExportList(), added 'sort by tags'. Also, added 'group select'... selecting a heading (date,author,tag) auto-selects all tiddlers in that group.\n''2007.03.02 [2.2.6]'' in onClickExportButton(), when selecting open tiddlers for TW2.2, look for "storyDisplay" instead of "tiddlerDisplay" but keep fallback to "tiddlerDisplay" for TW2.1 or earlier\n''2007.03.01 [2.2.5]'' removed hijack of store.saveChanges() (was catching save on http:, but there are other solutions that do a much better job of handling save to server.\n|please see [[ExportTiddlersPluginHistory]] for additional revision details|\n''2005.10.09 [0.0.0]'' development started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // version\n//{{{\nversion.extensions.exportTiddlers = {major: 2, minor: 4, revision: 1, date: new Date(2007,7,16)};\n//}}}\n\n// // macro handler\n//{{{\nconfig.macros.exportTiddlers = {\n label: "export tiddlers",\n prompt: "Copy selected tiddlers to an export document",\n newdefault: "export.html",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields\n};\n\nconfig.macros.exportTiddlers.handler = function(place,macroName,params) {\n if (params[0]!="inline")\n { createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }\n var panel=createExportPanel(place);\n panel.style.position="static";\n panel.style.display="block";\n}\n\nfunction createExportPanel(place) {\n var panel=document.getElementById("exportPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");\n panel=createTiddlyElement(place,"span","exportPanel",null,null)\n panel.innerHTML=config.macros.exportTiddlers.html;\n exportShowPanel(document.location.protocol);\n exportInitFilter();\n refreshExportList(0);\n return panel;\n}\n\nfunction onClickExportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createExportPanel(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 if (panel.style.display!="none") refreshExportList(0); // update list when panel is made visible\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // IE needs explicit scoping for functions called by browser events\n//{{{\nwindow.onClickExportMenu=onClickExportMenu;\nwindow.onClickExportButton=onClickExportButton;\nwindow.exportShowPanel=exportShowPanel;\nwindow.exportShowFilterFields=exportShowFilterFields;\nwindow.refreshExportList=refreshExportList;\n//}}}\n\n// // CSS for floating export control panel\n//{{{\nconfig.macros.exportTiddlers.css = '\s\n#exportPanel {\s\n display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\s\n#exportPanel textarea { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\s\n#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\s\n#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#exportPanel .rad { width:auto;border:0 }\s\n#exportPanel .chk { width:auto;border:0 }\s\n#exportPanel .btn { width:auto; }\s\n#exportPanel .btn1 { width:98%; }\s\n#exportPanel .btn2 { width:48%; }\s\n#exportPanel .btn3 { width:32%; }\s\n#exportPanel .btn4 { width:24%; }\s\n#exportPanel .btn5 { width:19%; }\s\n';\n//}}}\n\n// // HTML for export control panel interface\n//{{{\nconfig.macros.exportTiddlers.html = '\s\n<!-- output target and format -->\s\n<table cellpadding="0" cellspacing="0"><tr><td width=50%>\s\n export to\s\n <select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\s\n <option value="file:" SELECTED>this computer</option>\s\n <option value="http:">web server (http)</option>\s\n <option value="https:">secure web server (https)</option>\s\n <option value="ftp:">file server (ftp)</option>\s\n </select>\s\n</td><td width=50%>\s\n output format\s\n <select id="exportFormat" size=1>\s\n <option value="DIV">TiddlyWiki export file</option>\s\n <option value="TW">TiddlyWiki document</option>\s\n <option value="XML">RSS feed (XML)</option>\s\n </select>\s\n</td></tr></table>\s\n\s\n<!-- export to local file -->\s\n<div id="exportLocalPanel" style="margin-top:5px;">\s\nlocal path/filename<br>\s\n<input type="text" id="exportFilename" size=40 style="width:93%"><input \s\n type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%" \s\n onclick="this.previousSibling.value=window.promptForExportFilename(this);">\s\n<!--<input type="file" id="exportFilename" size=57 style="width:100%"><br>-->\s\n</div><!--panel-->\s\n\s\n<!-- export to http server -->\s\n<div id="exportHTTPPanel" style="display:none;margin-top:5px;">\s\n<table><tr><td align=left>\s\n server location, script, and parameters<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="exportNotify"\s\n onClick="document.getElementById(\s'exportSetNotifyPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> notify\s\n</td></tr></table>\s\n<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\s\n<div id="exportSetNotifyPanel" style="display:none">\s\n send email notices to<br>\s\n <input type="text" id="exportNotifyTo" onfocus="this.select()"><br>\s\n</div>\s\n</div><!--panel-->\s\n\s\n<!-- export to ftp server -->\s\n<div id="exportFTPPanel" style="display:none;margin-top:5px;">\s\n<table cellpadding="0" cellspacing="0" width="32%"><tr valign="top"><td>\s\n host server<br>\s\n <input type="text" id="exportFTPHost" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n username<br>\s\n <input type="text" id="exportFTPID" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n password<br>\s\n <input type="password" id="exportFTPPW" onfocus="this.select()"><br>\s\n</td></tr></table>\s\nFTP path/filename<br>\s\n<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- notes -->\s\nnotes<br>\s\n<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \s\n\s\n<!-- list of tiddlers -->\s\n<table><tr align="left"><td>\s\n select:\s\n <a href="JavaScript:;" id="exportSelectAll"\s\n onclick="onClickExportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n &nbsp;opened&nbsp;</a> \s\n <a href="JavaScript:;" id="exportSelectRelated"\s\n onclick="onClickExportButton(this)" title="select all tiddlers related (by link or transclusion) to the currently selected tiddlers">\s\n &nbsp;related&nbsp;</a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportListSmaller"\s\n onclick="onClickExportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n</td></tr></table>\s\n<select id="exportList" multiple size="10" style="margin-bottom:5px;"\s\n onchange="refreshExportList(this.selectedIndex)">\s\n</select><br>\s\n</div><!--box-->\s\n\s\n<!-- selection filter -->\s\n<div id="exportFilterPanel" style="display:none">\s\n<table><tr align="left"><td>\s\n selection filter\s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportHideFilter"\s\n onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\s\n</td></tr></table>\s\n<div class="box">\s\n<input type="checkbox" class="chk" id="exportFilterStart" value="1"\s\n onclick="exportShowFilterFields(this)"> starting date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportStartDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterStartBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\s\n onclick="exportShowFilterFields(this)"> ending date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportEndDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterEndBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id=exportFilterTags value="1"\s\n onclick="exportShowFilterFields(this)"> match tags<br>\s\n<input type="text" id="exportTags" onfocus="this.select()">\s\n<input type="checkbox" class="chk" id=exportFilterText value="1"\s\n onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\s\n<input type="text" id="exportText" onfocus="this.select()">\s\n</div> <!--box-->\s\n</div> <!--panel-->\s\n\s\n<!-- action buttons -->\s\n<div style="text-align:center">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportFilter" value="apply filter">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportStart" value="export tiddlers">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportClose" value="close">\s\n</div><!--center-->\s\n';\n//}}}\n\n// // initialize interface\n// // exportShowPanel(which)\n//{{{\nfunction exportShowPanel(which) {\n var index=0; var panel='exportLocalPanel';\n switch (which) {\n case 'file:':\n case undefined:\n index=0; panel='exportLocalPanel'; break;\n case 'http:':\n index=1; panel='exportHTTPPanel'; break;\n case 'https:':\n index=2; panel='exportHTTPPanel'; break;\n case 'ftp:':\n index=3; panel='exportFTPPanel'; break;\n default:\n alert("Sorry, export to "+which+" is not yet available");\n break;\n }\n exportInitPanel(which);\n document.getElementById('exportTo').selectedIndex=index;\n document.getElementById('exportLocalPanel').style.display='none';\n document.getElementById('exportHTTPPanel').style.display='none';\n document.getElementById('exportFTPPanel').style.display='none';\n document.getElementById(panel).style.display='block';\n}\n//}}}\n\n// // exportInitPanel(which)\n//{{{\nfunction exportInitPanel(which) {\n switch (which) {\n case "file:": // LOCAL EXPORT PANEL: file/path:\n // ** no init - security issues in IE **\n break;\n case "http:": // WEB EXPORT PANEL\n case "https:": // SECURE WEB EXPORT PANEL\n // url\n if (store.tiddlerExists("unawiki_download")) {\n var theURL=store.getTiddlerText("unawiki_download");\n theURL=theURL.replace(/\s[\s[download\s|/,'').replace(/\s]\s]/,'');\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n }\n // server script/params\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n // get POST\n var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";\n var thePost=store.getTiddlerText(title);\n if (!thePost || !thePost.length) thePost="/"+title;\n // get PARAMS\n var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";\n var theParams=store.getTiddlerText(title);\n if (!theParams|| !theParams.length) theParams=title;\n var serverURL = which+"//"+theHost+thePost+"?"+theParams;\n document.getElementById("exportHTTPServerURL").value=serverURL;\n // get NOTIFY\n var theAddresses=store.getTiddlerText("SiteNotify");\n if (!theAddresses|| !theAddresses.length) theAddresses="SiteNotify";\n document.getElementById("exportNotifyTo").value=theAddresses;\n break;\n case "ftp:": // FTP EXPORT PANEL\n // host\n var siteHost=store.getTiddlerText("SiteHost");\n if (!siteHost || !siteHost.length) siteHost=document.location.host;\n if (!siteHost || !siteHost.length) siteHost="SiteHost";\n document.getElementById("exportFTPHost").value=siteHost;\n // username\n var siteID=store.getTiddlerText("SiteID");\n if (!siteID || !siteID.length) siteID=config.options.txtUserName;\n document.getElementById("exportFTPID").value=siteID;\n // password\n document.getElementById("exportFTPPW").value="";\n // file/path\n document.getElementById("exportFTPFilename").value="";\n break;\n }\n}\n//}}}\n\n// // exportInitFilter()\n//{{{\nfunction exportInitFilter() {\n // start date\n document.getElementById("exportFilterStart").checked=false;\n document.getElementById("exportStartDate").value="";\n // end date\n document.getElementById("exportFilterEnd").checked=false;\n document.getElementById("exportEndDate").value="";\n // tags\n document.getElementById("exportFilterTags").checked=false;\n document.getElementById("exportTags").value="";\n // text\n document.getElementById("exportFilterText").checked=false;\n document.getElementById("exportText").value="";\n // show/hide filter input fields\n exportShowFilterFields();\n}\n//}}}\n\n// // exportShowFilterFields(which)\n//{{{\nfunction exportShowFilterFields(which) {\n var show;\n\n show=document.getElementById('exportFilterStart').checked;\n document.getElementById('exportFilterStartBy').style.display=show?"block":"none";\n document.getElementById('exportStartDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterStartBy').value;\n document.getElementById('exportStartDate').value\n =getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterStartBy') && (val=='other'))\n document.getElementById('exportStartDate').focus();\n\n show=document.getElementById('exportFilterEnd').checked;\n document.getElementById('exportFilterEndBy').style.display=show?"block":"none";\n document.getElementById('exportEndDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterEndBy').value;\n document.getElementById('exportEndDate').value\n =getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterEndBy') && (val=='other'))\n document.getElementById('exportEndDate').focus();\n\n show=document.getElementById('exportFilterTags').checked;\n document.getElementById('exportTags').style.display=show?"block":"none";\n\n show=document.getElementById('exportFilterText').checked;\n document.getElementById('exportText').style.display=show?"block":"none";\n}\n//}}}\n\n// // onClickExportButton(which): control interactions\n//{{{\nfunction onClickExportButton(which)\n{\n // DEBUG alert(which.id);\n var theList=document.getElementById('exportList'); if (!theList) return;\n var count = 0;\n var total = store.getTiddlers('title').length;\n switch (which.id)\n {\n case 'exportFilter':\n count=filterExportList();\n var panel=document.getElementById('exportFilterPanel');\n if (count==-1) { panel.style.display='block'; break; }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));\n if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }\n break;\n case 'exportStart':\n exportTiddlers();\n break;\n case 'exportHideFilter':\n case 'exportToggleFilter':\n var panel=document.getElementById('exportFilterPanel')\n panel.style.display=(panel.style.display=='block')?'none':'block';\n break;\n case 'exportSelectChanges':\n var lastmod=new Date(document.lastModified);\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;\n theList.options[t].selected=(tiddler.modified>lastmod);\n count += (tiddler.modified>lastmod)?1:0;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no unsaved changes");\n break;\n case 'exportSelectAll':\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count += 1;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,count));\n break;\n case 'exportSelectOpened':\n for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;\n var tiddlerDisplay = document.getElementById("tiddlerDisplay"); // for TW2.1-\n if (!tiddlerDisplay) tiddlerDisplay = document.getElementById("storyDisplay"); // for TW2.2+\n for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {\n var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);\n for (var i = 0; i < theList.options.length; i++) {\n if (theList.options[i].value!=tiddler) continue;\n theList.options[i].selected=true; count++; break;\n }\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no tiddlers currently opened");\n break;\n case 'exportSelectRelated':\n // recursively build list of related tiddlers\n function getRelatedTiddlers(tid,tids) {\n var t=store.getTiddler(tid); if (!t || tids.contains(tid)) return tids;\n tids.push(t.title);\n if (!t.linksUpdated) t.changed();\n for (var i=0; i<t.links.length; i++)\n if (t.links[i]!=tid) tids=getRelatedTiddlers(t.links[i],tids);\n return tids;\n }\n // for all currently selected tiddlers, gather up the related tiddlers (including self) and select them as well\n var tids=[];\n for (var i=0; i<theList.options.length; i++)\n if (theList.options[i].selected) tids=getRelatedTiddlers(theList.options[i].value,tids);\n // select related tiddlers (includes original selected tiddlers)\n for (var i=0; i<theList.options.length; i++)\n theList.options[i].selected=tids.contains(theList.options[i].value);\n clearMessage(); displayMessage(formatExportMessage(tids.length,total));\n break;\n case 'exportListSmaller': // decrease current listbox size\n var min=5;\n theList.size-=(theList.size>min)?1:0;\n break;\n case 'exportListLarger': // increase current listbox size\n var max=(theList.options.length>25)?theList.options.length:25;\n theList.size+=(theList.size<max)?1:0;\n break;\n case 'exportClose':\n document.getElementById('exportPanel').style.display='none';\n break;\n }\n}\n//}}}\n\n// // list display\n//{{{\nfunction formatExportMessage(count,total)\n{\n var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";\n txt += (count==0)?"none":(count==total)?"all":count;\n txt += " selected for export";\n return txt;\n}\n\nfunction refreshExportList(selectedIndex)\n{\n var theList = document.getElementById("exportList");\n var sort;\n if (!theList) return;\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) sort='modified';\n if (selectedIndex==1) sort='title';\n if (selectedIndex==2) sort='modified';\n if (selectedIndex==3) sort='modifier';\n if (selectedIndex==4) sort='tags';\n\n // unselect headings and count number of tiddlers actually selected\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (!theList.options[t].selected) continue;\n if (theList.options[t].value!="")\n count++;\n else { // if heading is selected, deselect it, and then select and count all in section\n theList.options[t].selected=false;\n for ( t++; t<theList.options.length && theList.options[t].value!=""; t++) {\n theList.options[t].selected=true;\n count++;\n }\n }\n }\n\n // disable "export" button if no tiddlers selected\n document.getElementById("exportStart").disabled=(count==0);\n // show selection count\n var tiddlers = store.getTiddlers('title');\n if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }\n\n // if a [command] item, reload list... otherwise, no further refresh needed\n if (selectedIndex>4) return;\n\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++]=\n new Option(tiddlers.length+" tiddlers in document", "",false,false);\n theList.options[i++]=\n new Option(((sort=="title" )?">":indent)+' [by title]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="tags" )?">":indent)+' [by tags]', "",false,false);\n // output the tiddler list\n switch(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 "modifier":\n case "modified":\n var tiddlers = store.getTiddlers(sort);\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();\n if (sort=="modifier") theSection=tiddler.modifier;\n if (theSection != lastSection)\n {\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 if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else 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}\n//}}}\n\n// // list filtering\n//{{{\nfunction getFilterDate(val,id)\n{\n var result=0;\n switch (val) {\n case 'site':\n var timestamp=store.getTiddlerText("SiteDate");\n if (!timestamp) timestamp=document.lastModified;\n result=new Date(timestamp);\n break;\n case 'file':\n result=new Date(document.lastModified);\n break;\n case 'other':\n result=new Date(document.getElementById(id).value);\n break;\n default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31\n var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;\n var oneday=86400000;\n if (id=='exportStartDate')\n result=new Date((Math.floor(now/oneday)-val)*oneday+tz);\n else\n result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);\n break;\n }\n // DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\snnow="+now);\n return result;\n}\n\nfunction filterExportList()\n{\n var theList = document.getElementById("exportList"); if (!theList) return -1;\n\n var filterStart=document.getElementById("exportFilterStart").checked;\n var val=document.getElementById("exportFilterStartBy").value;\n var startDate=getFilterDate(val,'exportStartDate');\n\n var filterEnd=document.getElementById("exportFilterEnd").checked;\n var val=document.getElementById("exportFilterEndBy").value;\n var endDate=getFilterDate(val,'exportEndDate');\n\n var filterTags=document.getElementById("exportFilterTags").checked;\n var tags=document.getElementById("exportTags").value;\n\n var filterText=document.getElementById("exportFilterText").checked;\n var text=document.getElementById("exportText").value;\n\n if (!(filterStart||filterEnd||filterTags||filterText)) {\n alert("Please set the selection filter");\n document.getElementById('exportFilterPanel').style.display="block";\n return -1;\n }\n if (filterStart&&filterEnd&&(startDate>endDate)) {\n var msg="starting date/time:\sn"\n msg+=startDate.toLocaleString()+"\sn";\n msg+="is later than ending date/time:\sn"\n msg+=endDate.toLocaleString()\n alert(msg);\n return -1;\n }\n\n // scan list and select tiddlers that match all applicable criteria\n var total=0;\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-tiddler list items (section headings)\n var opt=theList.options[i]; if (opt.value=="") continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; \n var sel=true;\n if ( (filterStart && tiddler.modified<startDate)\n || (filterEnd && tiddler.modified>endDate)\n || (filterTags && !matchTags(tiddler,tags))\n || (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))\n sel=false;\n opt.selected=sel;\n count+=sel?1:0;\n total++;\n }\n return count;\n}\n//}}}\n\n//{{{\nfunction matchTags(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }\n return false;\n}\n//}}}\n\n// // output data formatting\n// // exportHeader(format)\n//{{{\nfunction exportHeader(format)\n{\n switch (format) {\n case "TW": return exportTWHeader();\n case "DIV": return exportDIVHeader();\n case "XML": return exportXMLHeader();\n }\n}\n//}}}\n\n// // exportFooter(format)\n//{{{\nfunction exportFooter(format)\n{\n switch (format) {\n case "TW": return exportDIVFooter();\n case "DIV": return exportDIVFooter();\n case "XML": return exportXMLFooter();\n }\n}\n//}}}\n\n// // exportTWHeader()\n//{{{\nfunction exportTWHeader()\n{\n // Get the URL of the document\n var originalPath = document.location.href;\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n { alert(config.messages.notFileUrlError); return; }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n // Load the original file\n var original = loadFile(localPath);\n if(original == null)\n { alert(config.messages.cantSaveError); return; }\n // reset existing HTML source markup\n original=updateMarkupBlock(original,"PRE-HEAD");\n original=updateMarkupBlock(original,"POST-HEAD");\n original=updateMarkupBlock(original,"PRE-BODY");\n original=updateMarkupBlock(original,"POST-BODY");\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n { alert(config.messages.invalidFileError.format([localPath])); return; }\n return original.substr(0,posOpeningDiv+startSaveArea.length)\n}\n//}}}\n\n// // exportDIVHeader()\n//{{{\nfunction exportDIVHeader()\n{\n var out=[];\n var now = new Date();\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<html><body>");\n out.push("<style type=\s"text/css\s">");\n out.push("#storeArea {display:block;margin:1em;}");\n out.push("#storeArea div");\n out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");\n out.push("#javascriptWarning");\n out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");\n out.push("</style>");\n out.push("<div id=\s"javascriptWarning\s">");\n out.push("TiddlyWiki export file<br>");\n out.push("Source"+": <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");\n out.push("Title: <b>"+title+"</b><br>");\n out.push("Subtitle: <b>"+subtitle+"</b><br>");\n out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");\n out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");\n out.push("Notes:<hr><pre>"+document.getElementById("exportNotes").value.replace(regexpNewLine,"<br>")+"</pre>");\n out.push("</div>");\n out.push("<div id=\s"storeArea\s">");\n return out;\n}\n//}}}\n\n// // exportDIVFooter()\n//{{{\nfunction exportDIVFooter()\n{\n var out=[];\n out.push("</div><!--POST-BODY-START-->\sn<!--POST-BODY-END--></body></html>");\n return out;\n}\n//}}}\n\n// // exportXMLHeader()\n//{{{\nfunction exportXMLHeader()\n{\n var out=[];\n var now = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<" + "?xml version=\s"1.0\s"?" + ">");\n out.push("<rss version=\s"2.0\s">");\n out.push("<channel>");\n out.push("<title>" + title + "</title>");\n if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");\n out.push("<description>" + subtitle + "</description>");\n out.push("<language>en-us</language>");\n out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");\n out.push("<pubDate>" + now.toGMTString() + "</pubDate>");\n out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");\n out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");\n return out;\n}\n//}}}\n\n// // exportXMLFooter()\n//{{{\nfunction exportXMLFooter()\n{\n var out=[];\n out.push("</channel></rss>");\n return out;\n}\n//}}}\n\n// // exportData()\n//{{{\nfunction exportData(theList,theFormat)\n{\n // scan export listbox and collect DIVs or XML for selected tiddler content\n var out=[];\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-selected items and section headings\n var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; \n if (theFormat=="TW") out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));\n if (theFormat=="DIV") out.push(convertUnicodeToUTF8(thisTiddler.title+"\sn"+thisTiddler.saveToDiv()));\n if (theFormat=="XML") out.push(convertUnicodeToUTF8(thisTiddler.saveToRss(store.getTiddlerText("SiteUrl",""))));\n }\n return out;\n}\n//}}}\n\n// // exportTiddlers(): output selected data to local or server\n//{{{\nfunction exportTiddlers()\n{\n var theList = document.getElementById("exportList"); if (!theList) return;\n\n // get the export settings\n var theProtocol = document.getElementById("exportTo").value;\n var theFormat = document.getElementById("exportFormat").value;\n\n // assemble output: header + tiddlers + footer\n var theData=exportData(theList,theFormat);\n var count=theData.length;\n var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\sn");\n var msg="";\n switch (theProtocol) {\n case "file:":\n var theTarget = document.getElementById("exportFilename").value.trim();\n if (!theTarget.length) msg = "A local path/filename is required\sn";\n if (!msg && saveFile(theTarget,txt))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "http:":\n case "https:":\n var theTarget = document.getElementById("exportHTTPServerURL").value.trim();\n if (!theTarget.length) msg = "A server URL is required\sn";\n if (document.getElementById('exportNotify').checked)\n theTarget+="&notify="+encodeURIComponent(document.getElementById('exportNotifyTo').value);\n if (document.getElementById('exportNotes').value.trim().length)\n theTarget+="&notes="+encodeURIComponent(document.getElementById('exportNotes').value);\n if (!msg && exportPost(theTarget+encodeURIComponent(txt)))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "ftp:":\n default:\n msg="Sorry, export to "+theLocation+" is not yet available";\n break;\n }\n clearMessage(); displayMessage(msg,theTarget);\n}\n//}}}\n\n// // exportPost(url): cross-domain post uses hidden iframe to submit url and capture responses\n//{{{\nfunction exportPost(url)\n{\n var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="exportFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\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 d.location.replace(url);\n return true;\n}\n//}}}\n\n// // promptForFilename(msg,path,file) uses platform/browser specific functions to get local filespec\n//{{{\nfunction promptForExportFilename(here)\n{\n var msg=here.title; // use tooltip as dialog box message\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n var file=config.macros.exportTiddlers.newdefault;\n var result="";\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeSave);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XP only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE\n }\n return result;\n}\n//}}}
If you can help someone understand something thats good. Pointing out what they need to understand isn't always helpful. They can't handle what information is coming their way now. But I think this is a little like the "productivity paradox", you're too busy getting things done to learn how to do things better.
iPhoto Buddy - Multiple Library Manager For iPhoto
http://akamai.infoworld.com/weblog/udell/gems/ju_fielding.mp3
/***\n|Name|DcTableOfContentsPlugin|\n|Author|[[Doug Compton|http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin]]|\n|Contributors|[[Lewcid|http://lewcid.org]], [[FND|http://devpad.tiddlyspot.com]], [[ELS|http://www.tiddlytools.com]]|\n|Source|[[FND's DevPad|http://devpad.tiddlyspot.com#DcTableOfContentsPlugin]]|\n|Version|0.4.1|\n|~CoreVersion|2.2|\n<<showtoc>>\n!Description\nThis macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes. Each item in the table of contents can be clicked on to jump to that heading. It can be used either inside of select tiddlers or inside a system wide template.\n\nA parameter can be used to show the table of contents of a seperate tiddler, &lt;<showtoc tiddlerTitle>&gt;\n\nIt will also place a link beside each header which will jump the screen to the top of the current tiddler. This will only be displayed if the current tiddler is using the &lt;<showtoc>&gt; macro.\n\nThe appearance of the table of contents and the link to jump to the top can be modified using CSS. An example of this is given below.\n\n!Usage\n!!Only in select tiddlers\nThe table of contents above is an example of how to use this macro in a tiddler. Just insert &lt;<showtoc>&gt; in a tiddler on a line by itself.\n\nIt can also display the table of contents of another tiddler by using the macro with a parameter, &lt;<showtoc tiddlerTitle>&gt;\n!!On every tiddler\nIt can also be used in a template to have it show on every tiddler. An example ViewTemplate is shown below.\n\n//{{{\n<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'>Created <span macro='view created date DD-MM-YY'></span>, updated <span macro='view modified date DD-MM-YY'></span></div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class="toc" macro='showtoc'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n//}}}\n\n!Examples\nIf you had a tiddler with the following headings:\n{{{\n!Heading1a\n!!Heading2a\n!!Heading2b\n!!!Heading3\n!Heading1b\n}}}\nthis table of contents would be automatically generated:\n* Heading1a\n** Heading2a\n** Heading2b\n*** Heading3\n* Heading1b\n!Changing how it looks\nTo modifiy the appearance, you can use CSS similiar to the below.\n//{{{\n.dcTOC ul {\n color: red;\n list-style-type: lower-roman;\n}\n.dcTOC a {\n color: green;\n border: none;\n}\n\n.dcTOC a:hover {\n background: white;\n border: solid 1px;\n}\n.dcTOCTop {\n font-size: 2em;\n color: green;\n}\n//}}}\n\n!Revision History\n!!v0.1.0 (2006-04-07)\n* initial release\n!!v0.2.0 (2006-04-10)\n* added the [top] link on headings to jump to the top of the current tiddler\n* appearance can now be customized using CSS\n* all event handlers now return false\n!!v0.3.0 (2006-04-12)\n* added the ability to show the table of contents of a seperate tiddler\n* fixed an error when a heading had a ~WikiLink in it\n!!v0.3.5 (2007-10-16)\n* updated formatter object for compatibility with TiddlyWiki v2.2 (by Lewcid)\n!!v0.4.0 (2007-11-14)\n* added toggle button for collapsing/expanding table of contents element\n* refactored documentation\n!To Do\n* code sanitizing/rewrite\n* documentation refactoring\n* use shadow tiddler for styles\n!Code\n***/\n//{{{\n\nversion.extensions.DcTableOfContentsPlugin= {\n major: 0, minor: 4, revision: 0,\n type: "macro",\n source: "http://devpad.tiddlyspot.com#DcTableOfContentsPlugin"\n};\n\n// Replace heading formatter with our own\nfor (var n=0; n<config.formatters.length; n++) {\n var format = config.formatters[n];\n if (format.name == 'heading') {\n format.handler = function(w) {\n // following two lines is the default handler\n var e = createTiddlyElement(w.output, "h" + w.matchLength);\n w.subWikifyTerm(e, this.termRegExp); //updated for TW 2.2+\n\n // Only show [top] if current tiddler is using showtoc\n if (w.tiddler && w.tiddler.isTOCInTiddler == 1) {\n // Create a container for the default CSS values\n var c = createTiddlyElement(e, "div");\n c.setAttribute("style", "font-size: 0.5em; color: blue;");\n // Create the link to jump to the top\n createTiddlyButton(c, " [top]", "Go to top of tiddler", window.scrollToTop, "dcTOCTop", null, null);\n }\n }\n break;\n }\n}\n\nconfig.macros.showtoc = {\n handler: function(place, macroName, params, wikifier, paramString, tiddler) {\n var text = "";\n var title = "";\n var myTiddler = null;\n\n // Did they pass in a tiddler?\n if (params.length) {\n title = params[0];\n myTiddler = store.getTiddler(title);\n } else {\n myTiddler = tiddler;\n }\n\n if (myTiddler == null) {\n wikify("ERROR: Could not find " + title, place);\n return;\n }\n\n var lines = myTiddler .text.split("\sn");\n myTiddler.isTOCInTiddler = 1;\n\n // Create a parent container so the TOC can be customized using CSS\n var r = createTiddlyElement(place, "div", null, "dcTOC");\n // create toggle button\n createTiddlyButton(r, "toggle", "show/collapse table of contents",\n function() { config.macros.showtoc.toggleElement(this.nextSibling); },\n "toggleButton")\n // Create a container so the TOC can be customized using CSS\n var c = createTiddlyElement(r, "div");\n\n if (lines != null) {\n for (var x=0; x<lines.length; x++) {\n var line = lines[x];\n if (line.substr(0,1) == "!") {\n // Find first non ! char\n for (var i=0; i<line.length; i++) {\n if (line.substr(i, 1) != "!") {\n break;\n }\n }\n var desc = line.substring(i);\n // Remove WikiLinks\n desc = desc.replace(/\s[\s[/g, "");\n desc = desc.replace(/\s]\s]/g, "");\n\n text += line.substr(0, i).replace(/[!]/g, '*');\n text += '<html><a href="javascript:;" onClick="window.scrollToHeading(\s'' + title + '\s', \s'' + desc+ '\s', event)">' + desc+ '</a></html>\sn';\n }\n }\n }\n wikify(text, c);\n }\n}\n\nconfig.macros.showtoc.toggleElement = function(e) {\n if(e) {\n if(e.style.display != "none") {\n e.style.display = "none";\n } else {\n e.style.display = "";\n }\n }\n};\n\nwindow.scrollToTop = function(evt) {\n if (! evt)\n var evt = window.event;\n\n var target = resolveTarget(evt);\n var tiddler = story.findContainingTiddler(target);\n\n if (! tiddler)\n return false;\n\n window.scrollTo(0, ensureVisible(tiddler));\n\n return false;\n};\n\nwindow.scrollToHeading = function(title, anchorName, evt) {\n var tiddler = null;\n\n if (! evt)\n var evt = window.event;\n\n if (title) {\n story.displayTiddler(store.getTiddler(title), title, null, false);\n tiddler = document.getElementById(story.idPrefix + title);\n } else {\n var target = resolveTarget(evt);\n tiddler = story.findContainingTiddler(target);\n }\n\n if (tiddler == null)\n return false;\n \n var children1 = tiddler.getElementsByTagName("h1");\n var children2 = tiddler.getElementsByTagName("h2");\n var children3 = tiddler.getElementsByTagName("h3");\n var children4 = tiddler.getElementsByTagName("h4");\n var children5 = tiddler.getElementsByTagName("h5");\n\n var children = new Array();\n children = children.concat(children1, children2, children3, children4, children5);\n\n for (var i = 0; i < children.length; i++) {\n for (var j = 0; j < children[i].length; j++) {\n var heading = children[i][j].innerHTML;\n\n // Remove all HTML tags\n while (heading.indexOf("<") >= 0) {\n heading = heading.substring(0, heading.indexOf("<")) + heading.substring(heading.indexOf(">") + 1);\n }\n\n // Cut off the code added in showtoc for TOP\n heading = heading.substr(0, heading.length-6);\n\n if (heading == anchorName) {\n var y = findPosY(children[i][j]);\n window.scrollTo(0,y);\n return false;\n }\n }\n }\n return false\n};\n//}}}
--Potenza G 019 Grid (what size?) [high performance and too expensive]--\n\nGeneral Altimax HP (from the tirerack) $70-75 195/65R15\n\n
http://lonelycoder.com/hts/ Runs on Linux
+++[This is a slider]\nYou can type as much as you need under it \nand it will show up\n===\n\n@@color:#C06;''~TiddlyWiki is great!'' @@\n\n|!column1|!column2|\n|borderless|k|\n\n<<tiddler Camera>>