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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!!! marriage counsel

# 2nd seesion with SL three days ago.
# So far in talking this week ...
## Big family talk about communications. With P.. This is just after most of us have seen the movie __Temple__.
*** How not to just walk out when T. is talking.
*** We resolve it's important to give a verbal cue indicating we are done.  Note this has limitations (see next journal).
*** We talk about the topic-to-topic free association.
*** Discovery my physical restraint, mistreatment (?) of R. in 2000 is something he remembers and is aggrieved about.
*** On the way to that, T. calls me a "hypocrite" -- framed somewhat softly.
*** Later she answers an acknowledgment of mine with "DUH".  Then she passes it off as California talk.
**** Lots of follow-up about why she really //does// think of me as an hypocrite.
**** Also elucidation of "safe to share angry feelings" and what that looks like, feels like..
*** T. also says the family talk is a quarrel.  This is part of justifying "Duh".
*** Sense of being like Snoopy when he finally decides not to be Charlie's headrest any longer.
# Big realization just now:  More difficult for me to share about an SA issue because she IS IN TOUCH with her feelings and responses are kinda out of control.  This is important and a relief to put into words.
# Earlier this morning, we got to ML.

!!! Computer victory
* Laptop is up again, and now I have wireless because I tried plugging in the PMA card. 
* I'm ready to prepare to ask T. to create a better organized shopping list.
* And ready to prepare to ask T. for a standing list for the [[CorePantry]].
* Affirming moment for me back in November:  Cindy Fincher broke out with statements of appreciation about me -- //He works with you on open questions?  Do you realize how much he loves you, how much he's committed to you?//
!!! Jan 30
So many victories.
* Today, at just a couple minutes past the time to leave for Dr. Walia's, I noticed the __clock__!  I arrived just in time.
* The men's conference with Temple Bible Church was wonderful.
* Including the great ultimate frisbie and wall-climbing
* And especially that i did not have leg cramps (one twinge only), thank You Lord.
* Completed hours 8 and 9 with Shawn Langford.  Got closure on sexual issue of last February.
* And kept T. from noticing deer carcass on way home.  
!!! Our Family Bible Discussion
T. helped correct my understanding of Phil 2:10 and the "emptying" of Christ.  This was exciting.

A few nights later, last night it was, I related this at the dinner table.  But T. became privately upset and indignant.  This because R. asked some normal teenage investigative questions about the Deity of Christ.  Besides this, she was upset with my presentation of doctrine, which apparently was just not good enough or had problems with delivery -- I looked at the ceiling a lot.

I told her I'd thought relating the doctrinal edification would be a good idea:
# It would be humble of me to relate a point of personal growth.
# It would reflect well on T., due to the credit of her having helped me.
# We would talk about the Bible as a family.
But it just made her disturbed for the evening.  She could not comprehend my explanation that it is completely normal for a teenager to re-investigate the faith, starting with basic points.  To her it's simply evidence that R. is probably a reprobate.

!!! The stun gun
* [[DreadfulShockingImplement]]
These notes are an analysis of challenges raised by Asperger's Condition of my wife.  
''The information is personal and sensitive.''
----
* These notes are much more negative than I wish them to be.  Many anecdotes and observations are from journal entries when I often was in anguish. I hope I can balance things, with more time.  
* I am concerned about my possible self-pity and my simultaneous need for grieving and validation.  I wonder if the picture of me that emerges is true.  I wonder if that matters, if I should care.  
*If my narrative voice seems inconsistent, it's probably because my motivation for collecting these notes has wobbled over time on a variety of goals: 
## A catalog of T.'s pathology. 
## A collection point for observations that helps to identify patterns. 
## A way to [[validate|Validation-for-spouse]] the seriousness of the challenges I face. 
## A way to [[validate|Validation-for-spouse]] the seriousness of the challenges //she// faces. 
## A way to secure lasting understanding of [[Ineffable-hardship]].  
## A personal memoir of struggle - and occasional victory for me, her, our marriage. 
...T. has Asperger's Condition (a nicer word than Disorder, and a truer word).  We learned this only in the last few years.  Many adults are identified late.  T. differs from the norm in that she doesn't have the trait of perseveration.  For which I do thank God.  This probably prevented earlier identification.

Asperger's Condition is the reason for countless grievances and stresses.  Those who engage T. discover her to be perfectionistic, prone to make judgments that have a legalistic cast, people-pleasing, easily offended, confrontational, fearful, burdened with shame, wrong-thinking and self-absorbed.  Working from her perceptions, they conclude that our marriage has big problems, largely due to my own weak character or ADHD (exaggerated in her mind).

But those awful-sounding descriptions are superficial.  At the root level, the issues look very different.  Rather, her mind doesn't have (much of) some capacities we take for granted:  
 -- ability to tolerate ambiguity, uneveness, assymmetry, non-absolutes or "gray areas"; 
 -- familiarity with social structures, conversational dynamics, and the physical-mechanical world;
 -- optimism and trust.

If you have seen any good in us, it is genuine, thanks to Jesus.  We offer no surprises, as long as all this stuff is known.  (Well, I haven't inventoried my faults for you yet.)  We love the Lord with a whole heart.  I think you ought to receive us -- only wisely.  You will make your own conclusions about us and our marriage and you don't need to buy into the diagnosis.  I can still spare you some frustration, so read on.  

T. does well when she 
 -- Has someone who will pray for her on request
 -- Has someone who represents pastoral authority and blesses her verbally 
 -- Feels that her husband is held to moral accountability.

T. is perceptive and discerning.  Because she is over-sensitive, over-righteous, and confused over the details, there is a lot of "noise in the signal".  The brother who is able to listen will be edified.  The brother who wants to avoid criticism will find limitless opportunity, because of her litigious approach.  In the end, even a brother of very generous spirit will feel vexed.  T. has worn out a dozen church leaders in my experience.  So back to the practical advice:  

 -- Bless her verbally.  Don't let her doubts build up and smite her.
 -- Assign us to a "section leader" or cell group leader; Katheryn will do fine.  T. needs to feel she is "under the umbrella of authority."
 -- Prepare the Katheryn-person, for she must maintain boundaries.  T. will be demanding at times on a leader's time and energy, but it needn't spin ingloriously out of control.  The information here is important.
 -- Inform T. that concerning her husband, "the men of the church are on the case".  If my Internet filter shows I made a bad choice in browsing, I ought to check in with someone -- true, of course, but the point here is that life is easier if T. knows and esteems that someone.   (I have a structure for accountability, but T. needs to see it in the local scene.)  
 -- A pastor usually tries (in self-preservation) to argue with T.'s distorted concepts of authority and accountability.  That debate doesn't work out well.  Understand the issue is neurological, not theological or volitional or emotional.

You may be uncomfortable with the burdens I've outlined, even more with my approach in presenting them.  I decided over the last few years that it's not tenable to share all my communications with T. in advance.  You can show this to her; I have only a mild preference against it.  T. and I are agreed in general about getting these issues declared early, so she is not surprised if I move ahead on that.

One final thought.  T. won't be the last Aspie you meet, and I won't be the last stressed husband.  We're actually a terrific event because we are gifted with self-awareness to go with our frailties.  Still looking to God for guidance, but as of now I am happy about nominating CCC San Marcos for this unique opportunity of pastoring us.
''A low tolerance for ambiguity, unevenness, asymmetry, non-absolutes or "gray areas".''
* Rigid categories. 
** [[Ironing-pants]]
* A strong [[Closure-need]].
* My pensive insecure "yes" is taken a serious Yes.  

----
2013-06

T. regularly asks me to bring clarity to confusing issues.  When the issues pertain to me, the request takes the form of a demand.  

The problem with trying to be a resource for T. in her thinking is the pattern that follows: 
# She makes an assertion based in error due to some rigid categorization. 
# Reality comes in and upsets her assertion.  
# She comes to me and asks that i reconcile them.   
# I reconcile them, favoring reality .
# This does not make reality any more tolerable.  She is still up against the same basic conflict.
## She may be able to settle on the side of reality, sometimes I can help.
## If she isn't able, she retreats to a position of censure. 

So ~All-or-Nothing thinking is linked to 
* [[Negative-outlook]]
* [[Perfectionism]] and [[Moral-scrupulosity]]
----
* She is overwhelmed by the prospect of a truly clean kitchen area.  So she doesn't acknowledge a collection of crumbs under the toaster, or accumulated grease on the wall above the splashboard.  
* That spoon touched salt: it is dirty. (I believe she's over that one; it would still require a mental and volitional effort.)   
----
A recent trial is that she believes I'm losing my clarity on the inspiration of the Bible.  This is based on my answers to questions she's asked.  They are important to her and have now been discussed a great deal between us, as well as with her and other people.  
# The necessity and validity of the historic process which resulted in our canon of Scripture. 
# The prophecy in Isaiah which points to the Messiah saying a virgin will be with child. I had told her that the Jews of Jesus' time were not particularly expecting the Messiah to be born of a virgin.  Explained further that the Hebrew does not make a precise or unambiguous prediction about the miracle of virgin conception.  Now she thinks I don't believe in the reality of that miracle, despite my affirmations.  
----
* [[Zero-sum-game]]
2012-02  
A few weeks ago I asked my wife, "How can I know if you'll want toast with your breakfast?  I never know whether to make it or not."  She replied, "When I wake up, I know whether I want toast.  In fact, there's usually a reason -- but that would be a lot to explain.  It's //nicest// if you just ask me once I'm out of bed."  Wanting to be //nicest,// of course, I said "Okay!"

A few days later, I was in front of the toaster feeling confused.  //She gave me a simple rule for knowing whether she wants the toast,// I thought to myself. //What was it?// I smiled and remembered:  //There's no rule!  I have to ask her!//

I wonder if God thinks it's //nicest// when we ask Him what He wants, instead of standing at the counter and worrying whether we'll get it right?
!! Asperger's condition for T.
[[Central-Coherence]]        
[[Negative-outlook]]
[[Theory-of-Mind]] 
[[All-or-nothing-perception]]     
[[Fixed-perception]]                            
[[Associative-thinking]] 

A list of traits usually includes perseveration.  T. doesn't have the trait, at least not directly, so it isn't on this list.  (But she does have some [[similar traits|Perseveration]].)
!! Out-workings of these traits
[[Social-interaction]]
[[Stress]] and [[Trauma]] 
[[Shame]] and [[Fear]]

/% 
|border-width:11px;border-color:#fff;           |border-width:11px;border-color:#fff; [[Central-Coherence]]        |border-width:11px;border-color:#fff; [[Negative-outlook]]|
|border-width:11px;border-color:#fff; [[Theory-of-Mind]]   |~|~|
|~|border-width:11px;border-color:#fff; [[Trauma]]<br><br>[[Stress]]  |border-width:11px;border-color:#fff; [[Shame]]<br><br>[[Fear]] |
|border-width:11px;border-color:#fff; [[All-or-nothing-perception]]     |border-width:11px;border-color:#fff;                   |~|
|border-width:11px;border-color:#fff; <br>[[Fixed-perception]]          |border-width:11px;border-color:#fff;                   |border-width:11px;border-color:#fff; [[Associative-thinking]] |

        use #eee to see where the borders are.
    
%/

//{{left{See also the [[Aspergers-traits-worksheet]]}}}//
As I sought to understand T.'s traits and their out-workings, they usually seemed to be an [[inseparable cluster|Behaviors-inseparable]].  But Tony Atwood presents them separately, and I wanted to do the same.  I discovered it was possible.  Then I wanted to find a good order to list them.  Now I was really stumped because of the manifold connections and triggers between them.  Mind-mapping gave me the non-linear approach I needed.  

After using a dozen or so large sheets of paper for this kind of analysis, I settled on a reusable template that showed the major traits (but not in an ordered list).  By "reusable", I mean that I could print copies on letter-size paper and start marking up a fresh copy whenever an episode needed analysis.  

I believe this approach could help others.  It might help you, but you would need to compose your own version.  Every aspie is different.  In fact, I've learned so much over the last five years that my old template would need changes to be useful to ME again.  

The [[worksheet|./Matrix to catch all the pebbles 3.pdf]]
T’s Autism – May 22, 2013.  See full document.

T coddles the dog, imputes her with human feelings and then is feels disappointed or betrayed when they don’t come true.

//Hello, Lydia.  Oh, good dog, good lovies.  That’s the way.  Nice dog.  No, don’t jump.  Oh, kisses, that’s nice.  No, not like that.  Are you going to be nice?  Kisses.  Ow!  No!  That hurts!  There.  That’s better.   Ow!  Yip!  Stop that!  Ow, you’re hurting me!  Don’t do that to mommy!  Get down!  No!  No!//


R. commented two months ago, When the dog is nipping, I don’t hear Mom telling her “no”.   My perception is __the dog__ doesn’t hear the “no”.  T has something wrong with her timing.  The dog doesn’t receive the “Yip” on the instinctive level.  I suppose it’s due to slow processing and decision-making by T.  Our recent studies about autism confirm there is a hindrance to real-time processing, and it affects relationships.

The dog is afraid of her, I think.   //Here comes mistress.  Does she want to “take me for a walk,” contend with me and scold me?  Is she going to talk with me gently, then change to an angry fearful tone?  I want to make her happy, but she doesn’t tell me how – not in a way I can understand.  //

!!! T walks the dog

When the dog pulls, T resists by going the opposite direction.  This is her application of dog training.  After a few minutes of this T is too aggrieved in her body and soul to continue, so they go indoors.

T can feel successful if the “gentle leader” training device is on dog.  But she can hardly get the GL on because the dog resists, evades and snaps at T.

!!! I walk the dog

When the dog pulls, I communicate disapproval:  I plant my feet, perhaps pull an opposite direction, I say “No”, and I give a shake to a metal shaker I carry.  (It’s in my leash-holding hand, so it automatically delivers a metallic shake if dog lunges.)  When the dog agrees to good behavior by easing all tension and looking back to me, I give her a positive sound using the clicker.  We resume walking.

When dog is walking with a loose leash, she knows a meat crumb is going to appear on the sidewalk in front of her (along with a click).  This will happen often, every 4-8 of my paces.  We go though a lot of meat crumbs this way.  (It turns out we may have to stay in this phase of training for a while.)

If the dog starts pulling repeatedly after some initial success, I stop and put the GL on her.  Now she is basically tractable.  I give her treats, but less often.  I figure on this remedy becoming unnecessary at some point in the future.  I have to resort to the GL on many walks, maybe half (I am including times I forgot to bring the GL; on those occasions, we return home sooner.)

My walks with dog are becoming longer and better.

!!! T and I walk the dog together

We tried it once recently.  T talked a lot, correcting my training.  You are letting the dog pull too much.  You are not doing what Andrea said.  I can’t do that – see? that’s more pulling than I can tolerate.  T inserted herself physically between me and the dog, or next to the dog.  Dog pulled constantly.  Most actions by me or dog provoked harsh words from T.

!!! I walk the dog for T today

This morning I showed T my dog walk.  This was unplanned both as a dog walk and a demonstration, so I didn’t have the shaker, meat crumbs, or clicker.  But, I thought //I bet dog can do this.//

I made sure T was away from us; dog not aware of her.  We had our usual halting start to the sidewalk.  T began her verbal protests.  I signaled her brusquely to be quiet and she was.

The dog started walking peaceably when we got to the sidewalk, with a loose leash.  At moments she looked up at me, expecting a treat, even drooling.  I had to make her happy with verbal approval.  We walked like that for 3-4 minutes.  There were a half-dozen times dog pulled or lunged -- about like usual.  I would plant myself until she let up, and then we would resume.

T was unwilling to express delight or allow more than a bare forced admission that she hadn’t understood.

T recriminates me every day for the dog’s condition.  //Why do you not do what Andrea says?  Didn’t you listen to her on the first day of training?  She said zero tolerance!  You allow the dog to pull.  You went a long time allowing her to pull constantly.  //

My replies have largely gone unsaid.
* The GL should not be permanent – it’s difficult for me to put on and it requires more dexterity than you have.   Dog won’t let you put on the GL.
* Dog won’t walk with you peaceably because you are not peaceable.  When dog is walking, you aren’t ready with the response that signals approval.  Dog has a merely negative experience.
* I’m the one training the dog.  Why I am the one with all the blame?  Why do you continually press your wrong views as correct?
* My method requires planning, concentration, and patience.  Also it requires dexterity to handle all the items.  It requires a bond with dog.  Finally, it requires the ability to respond “in real time”.  Almost all that is difficult for you.  You need to find goals and methods that can work for you, instead of trying to make me obey your version of dog-walk training.
* There will come a time when I can’t walk the dog daily.  What will happen then?

----
T’s perfectionism can’t effectively process terms like //zero tolerance// (from Andrea).   T believes in rewarding the dog for a perfect act of compliance.  Dog can hardly sustain this, so there are few rewards.

Perfectionism prevents T from recognizing and rewarding dog’s intermediary improvements.  This is essential to training; you look not for full-blown success, but steps in the right direction.  T protests that her physical weaknesses don’t give her the margins she needs to deal with partial success.  It’s true; but the important problem is her incapacity to nurture incremental growth.

At the basic level, T rules but does not relate to the dog.  This hinders bonding:
# T is afraid to bond with dog (because of ASD);
# T compensates by applying external rules;
# Dog experiences disapproval, but not to the benefit of her training;
# Dog’s failure to comply creates frustration and fear for T.

Another dynamic of T’s approach to dog is worry.  She believes the dog is sickly and requires extra care and intervention.  We buy expensive dog food “for sensitive stomach” and give two doses daily of Pepcid.  We go to the vet for constipation or vomiting.  In reality the dog has normal vicissitudes of appetite, digestion and bowel action.  I think constipation would eventually result in a bowel movement, given normal exercise, but we go to the vet to accommodate T.

Not all the trips have been needless.  But, to give an outstanding example of one that wasn’t, T took dog to the vet because dog’s tongue appeared to her to be too red.

T likes or dislikes veterinary personnel according to how they respond to her concerns.  Of course, the “dislike” list tends to grow.  This is another (more excusable) instance of her tendency to know people by superficial models.

The dog responds to the “homeostasis” of worry and dissatisfaction.  Naturally it affects dog’s digestion.  Thus a cycle is established.

----

This entire set of patterns applies to more than the dog.  It’s a frame that allows substitution for each element.  Currently we have stress in our home because of my son’s approach to his new relationship with a girlfriend.  All the issues above can be found.

T regards R. according to several shallow images, whichever seems to fit the situation.  During unremarkable times, she assumes he is a bit perfect.  At least, I infer she does – how else would I account for her distress when something bad comes up?  Then it’s as if there is a bad weed inside R. that has taken root and grown large.  It was our responsibility to remove the weed, but we didn’t.  Now it brings danger for him, danger for us, and the realization of failure.

T believes in giving approval for perfect acts of obedience.  This is difficult because ultimately perfection requires the heart, and she can’t see enough of that.  Sometimes she decides the heart is perfect.  Later, if some defect is revealed, she has to retract her approval.  More often, she withholds approval.  But perhaps it’s more a case of postponing than withholding; a period of gathering evidence has to come first.  Still, it means a “step in the right direction” often goes unappreciated.  Because approval requires effort and planning, it is never spontaneous and usually downright awkward.  This results in the same failed transaction as with the dog, both for positive and negative feedback.

T’s [[All-or-nothing-perception]] adds stress to every emotional transaction.  Good relationships allow the other person a lot of unknown-ness.  [[Perfectionism]] does the opposite:  it restricts freedom.  T’s family members want to preserve their necessary freedom, so they push back against the perfectionism.

T continues to try to rule rather than relate:
# T is afraid to know R. as he really is.  She seems to view him through a couple of superficial models, either positive or negative.
# She imposes rigid, superficial rules.  She has trouble explaining these and often assumes are understood.  For her, they are codified; when she learns others haven’t signed on, it’s taken as a moral failure on their part.
# R. experiences T’s disapproval.
# There isn’t a way to earn her satisfaction or even a well-disposed interest.  R. gives up trying to be “problem-free”.
# T becomes more distrustful and coercive.

Naturally, his digestion is affected.

Unlike the dog, he’s an 18-year-old man who now expresses contempt for topics like allergies, asthma, ADHD, Asperger’s Disorder, Ehlers-Danlos Syndrome, and vitamin deficiencies.  He’s not subject to his mother’s translation of these ailments, and he knows listening to her reiterations isn’t helpful or healthy.

He shows the same contempt for T’s fear and outrage over his relationship with Zoe.  She’s an exemplary young woman from an intelligent, caring family.  R. and Zoe seem to treat each other with full courtesy and respect.  We met her parents over the phone a week ago.   Zoe’s mother was positively in awe of R.’s upright behavior.  T was thrilled to hear about it – briefly.  Now she knows the family may attend a church that doesn’t meet the evangelical standard.  She’s alarmed, and R. isn’t responding in a way that reassures her.

R. is done with the cycle of coercion and evasion.  He has the classic adolescent confusions on how to escape, but his occasional moments of grace are inspiring for me.

T perceives betrayal on every front.  Each party has had their point of critical failure; it may thus be culpable for problems with one of the other parties.  This insulates  T from seeing her unhelpful patterns.  T’s case-building takes elaborate forms.

As you will guess, I can review the whole frame as it pertains to me.

R.’s girlfriend may turn out to be a half-hearted believer or no believer at all.  Because the “good model” of R. isn’t available, she must insert the “bad model” for him -- and also for me.  This is my fault, says T.  Some weed took root, and I didn’t pull it.

I don’t have any “good model” options for T’s view of me.  I haven’t for years.

My opinion is that R. should grow through his time of love in the ordinary way, and the dog should have some play time until the next poop.  But those ideas are condemned by T, along with these:
* R. is outside our control; coercive levers aren’t available anymore.
* Trying to act controlling anyway can cause damage.
* We can’t prevent R. from accepting outside views.
* When fully mature, R. will not agree with us about some essentials.  This is natural and good.
* R. isn’t a self-declaring Christian now, but this is not a prospect of doom.  He may become one later -- a natural pattern for maturing.

T knows these things are true (or some of them), but only superficially.  She rejects them absolutely in her thinking and behaviors.  Nonetheless, when confronted, she is very angry over what she takes as a false (and often malicious) accusation.  T will deny or contradict most of what I’ve written here.  Because T can’t identify the break between her stated and actual beliefs, we use terms like intimacy and trust for different things.  This makes family discussions unproductive.

We are all afraid of dealing with T.  Her mood is fickle; she expresses disapproval in strident terms; she remembers past offenses and brings them up often.  She often grows morose or agitated over a memory from some other season of life.  By often, I mean several times a day.  Any turn of discussion can provoke a negative response.  We all know a down-ward turn can mark the beginning of a crisis, and a crisis could descend into disaster.  There is no such thing as a relaxed conversation.  Conversations are rare.

Now T has entered menopause, adding volatility to the mix.  (I’m fairly sure the episodes I’ve described would be less emotionally stressful except for menopause.)

I am discouraged.  But I do have some points of hope.  Although the diagnosis of ASD took a decade to develop, it is here.  I believe T’s relational frailties are intransigent; but if there are remedies, I think therapy for ASD has the best chance of applying them.

We begin to have a contingent of people whom are trusted by T and really have some insight:  Marilyn Ross, Shawn Langford, perhaps some others.  We also have Debi Marshall who specializes in autism.  Could dog training provide T with useful handles for other areas of life?

But really, is there hope?  I don’t know.  It is a depressing time, largely because I am concerned for R.’s condition, but perhaps more because I am weighted down with T’s negative opinions.
* This contributes to a sense of obsessive-compulsive disorder, together with [[Fixed-perception]] and [[Perseveration]]. 
* Also [[Intrusive-thoughts]]
About photographs, and how the kids did not get to see them and missed out on a lot of family history, because of the difficult effects it would have on T..
!!! My indicators
* speeding ticket - not so much from a bigger readiness to go fast as an inability to monitor speed. 
* headlights left on, need jump start
* blurting out jokes
** good timing makes it effective
** good timing requires a fast decision
** a fast decision conflicts with [[Decide]]
* misplacing the order of routines that are otherwise unconscious (ex, brushing teeth)
* leave lunch misplaced
* procrastinate, even on tiny things
* anxiety builds as procrastination collects
2016-20

@@##@@ = relevant to recent [[Stun-gun-episode]].

# ''Home Life -- ''  humorless home atmosphere
# can't play music recordings with freedom
# must give rides in evening
# can't travel
# can't enjoy night-life with T.
# @@##@@ children are sometimes angry
# In crisis, I must manage for T. -- extra stress
# In crisis, I must manage for T. -- can't help others in need
# no alcohol
# delay before social event -- crisis briefing
# delay before social event -- non-crisis briefing
# delay after social event -- after-care
# ''Marriage Relationship -- ''  must plan all my interactions with T.
# @@##@@ must carefully phrase all communications
# often must refrain from expressing difficult feelings
# sometimes must avoid disclosing activities (pawn shop, knife sharpening)
# must plan household activities that would feel disruptive
## home repair, cleaning, organizing
## home furnishings
# sex is constrained -- potentially infrequent
# [[ [ T ]|Defenses-and-Attacks]]  often misunderstood -- general alienation
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@subject to false accusations of misconduct
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@subject to long discussions rooted in T's defensiveness
# [[ [ T ]|Defenses-and-Attacks]]  lack of encouragement in affirmation; lack of daily grace
# [[ [ T ]|Defenses-and-Attacks]]  subject to long reviews of past history
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@subject to negative assessments of people
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@must be available for 'counseling sessions' or 'urgent prayer for us'
# @@##@@ ''Outside Relationships -- '' behavior is occasionally publicly embarrassing
# must change church due to offense
# limits on hospitality
# can't disclose to relatives and friends
# [[ [ T ]|Defenses-and-Attacks]]  people think I am needy by association
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@sometimes falsely accused of misconduct to other people
# [[ [ T ]|Defenses-and-Attacks]]  some friendships unavailable (not approved)
# [[ [ T ]|Defenses-and-Attacks]]  some mentors unavailable (pastor is bad guy)
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@others often misunderstood -- I must interpret
# [[ [ T ]|Defenses-and-Attacks]]   @@##@@others seem threatening -- I must stand by
# [[ [ T ]|Defenses-and-Attacks]]  outsiders are sometimes angry
# @@##@@ subject to telephone interruptions when out of the house -- always "on call"
# can't work in marriage-team ministry
# can't work in ministry vocation (pastor, missionary)
# ''Work and Finance -- ''  must live on one income (thus less wealthy)
# must support many medical expenses
# limited income potential (no travel, commute, or irregular schedule)
# can't plan finances easily
# expenses from forgetfulness or poor judgment (inc. bad driving)
# must own suitable car for T
In late 2013 I was uncertain if a wiki about Asperger's had any useful purpose.  The wiki construct has many times enabled me to shape and model the connections between discrete ideas.  But Asperger's presented a gordian knot: everything is connected, and it felt difficult to lay hold of the discrete ideas. 

In 2023, I feel differently.  The challenge is still there, but the wiki is possible and the challenge makes it seem all the more necessary.  
* Examples
** [[Breakthrough-family-discussion]]
** [[Placed-on-Trial-etc]]
* "You don't want to grow up and be like your father."  Spoken to R. around 2014; the context was career and prosperity.  I was able to address this insulting speech effectively.  
!!!! When organizing, two goals:
# Overall improvement by my standard
# No disruption for her
## Loose ends are tidied up
## Her domain is not disturbed
!!!! Codified rules for communication
* [[Idiolect-FamilyTalkDynamics]]
!!!! Codified rules for other
# Oven rack in middle position
# Pen by telephone
2013-09

We learn this week that there are wildfires in the area around Yosemite National Park.  She goes on the Internet to find out how much danger her parents are in Oakhurst.  The news is that apparently they aren't.  She won't accept this reassurance.  She finds phone numbers for the sheriff, etc., and asks me to print out that page.  This strikes me as unproductive and unhelpful.

We learn about why the government of Syria has provoked such a worldwide outcry.  After some Internet research, T. says she wants to call our former missions agency and find out if they have anyone in Syria or Jordan, and whether they have been pulled out.  She has no doubt this should happen, and she should know – and advise the agency, presumably.  This strikes me as a completely inappropriate level of concern.  I tell her that they may be getting calls like that, and probably their response is to simply say "We have no one there" (anything else is a security mistake).   
/***
|Name|BreadcrumbsPlugin|
|Author|Eric Shulman|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|Documentation|http://www.TiddlyTools.com/#BreadcrumbsPluginInfo|
|Version|2.1.5|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|list/jump to tiddlers viewed during this session plus "back" button/macro|
This plugin provides a list of links to all tiddlers opened during the session, creating a "trail of breadcrumbs" from one tiddler to the next, allowing you to quickly navigate to any previously viewed tiddler, or select 'home' to reset the display to the initial set of tiddlers that were open at the start of the session (i.e., when the document was loaded into the browser).
!!!!!Documentation
<<<
see [[BreadcrumbsPluginInfo]]
<<<
!!!!!Configuration
<<<
<<option chkCreateDefaultBreadcrumbs>> automatically create breadcrumbs display (if needed)
<<option chkShowBreadcrumbs>> show/hide breadcrumbs display
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
<<option chkBreadcrumbsHideHomeLink>> omit 'Home' link from breadcrumbs display
<<option chkBreadcrumbsSave>> prompt to save breadcrumbs when 'Home' link is pressed
<<option chkShowStartupBreadcrumbs>> show breadcrumbs for 'startup' tiddlers
<<option chkBreadcrumbsReverse>> show breadcrumbs in reverse order (most recent first)
<<option chkBreadcrumbsLimit>> limit breadcrumbs display to {{twochar{<<option txtBreadcrumbsLimit>>}}} items
<<option chkBreadcrumbsLimitOpenTiddlers>> limit open tiddlers to {{twochar{<<option txtBreadcrumbsLimitOpenTiddlers>>}}} items

<<<
!!!!!Revisions
<<<
2012.06.10 2.1.5 refactored default options to eliminate global variable and use init() handling
| Please see [[BreadcrumbsPluginInfo]] for previous revision details |
2006.02.01 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.BreadcrumbsPlugin = { major: 2, minor: 1, revision: 5, date: new Date(2012,6,10) };
config.macros.breadcrumbs = {
	crumbs: [], // the list of current breadcrumbs
	askMsg: "Save current breadcrumbs before clearing?\n"
		+"Press OK to save, or CANCEL to continue without saving.",
	saveMsg: 'Enter the name of a tiddler in which to save the current breadcrumbs',
	saveTitle: 'SavedBreadcrumbs',
	options: {
		chkShowBreadcrumbs:		true,
		chkReorderBreadcrumbs:		true,
		chkCreateDefaultBreadcrumbs:	true,
		chkShowStartupBreadcrumbs:	false,
		chkBreadcrumbsReverse:		false,
		chkBreadcrumbsLimit:		false,
		txtBreadcrumbsLimit:		5,
		chkBreadcrumbsLimitOpenTiddlers:false,
		txtBreadcrumbsLimitOpenTiddlers:5,
		chkBreadcrumbsHideHomeLink:	false,
		chkBreadcrumbsSave:		false,
		txtBreadcrumbsHomeSeparator:	' | ',
		txtBreadcrumbsCrumbSeparator:	' > '
	},
	init: function() {
		merge(config.options,this.options,true);
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var area=createTiddlyElement(place,"span",null,"breadCrumbs",null);
		area.setAttribute("homeSep",params[0]||config.options.txtBreadcrumbsHomeSeparator);
		area.setAttribute("crumbSep",params[1]||config.options.txtBreadcrumbsCrumbSeparator);
		this.render(area);
	},
	add: function (title) {
		var thisCrumb = title;
		var ind = this.crumbs.indexOf(thisCrumb);
		if(ind === -1)
			this.crumbs.push(thisCrumb);
		else if (config.options.chkReorderBreadcrumbs)
			this.crumbs.push(this.crumbs.splice(ind,1)[0]); // reorder crumbs
		else
			this.crumbs=this.crumbs.slice(0,ind+1); // trim crumbs
		if (config.options.chkBreadcrumbsLimitOpenTiddlers)
			this.limitOpenTiddlers();
		this.refresh();
		return false;
	},
	getAreas: function() {
		var crumbAreas=[];
		// find all DIVs with classname=="breadCrumbs"
		var all=document.getElementsByTagName("*");
		for (var i=0; i<all.length; i++)
			try{ if (hasClass(all[i],"breadCrumbs")) crumbAreas.push(all[i]); } catch(e) {;}
		// or, find single DIV w/fixed ID (backward compatibility)
		var byID=document.getElementById("breadCrumbs")
		if (byID && !hasClass(byID,"breadCrumbs")) crumbAreas.push(byID);
		if (!crumbAreas.length && config.options.chkCreateDefaultBreadcrumbs) {
			// no crumbs display... create one
			var defaultArea = createTiddlyElement(null,"span",null,"breadCrumbs",null);
		 	defaultArea.style.display= "none";
			var targetArea= document.getElementById("tiddlerDisplay");
		 	targetArea.parentNode.insertBefore(defaultArea,targetArea);
			crumbAreas.push(defaultArea);
		}
		return crumbAreas;
	},
	refresh: function() {
		var crumbAreas=this.getAreas();
		for (var i=0; i<crumbAreas.length; i++) {
			crumbAreas[i].style.display = config.options.chkShowBreadcrumbs?"inline":"none";
			removeChildren(crumbAreas[i]);
			this.render(crumbAreas[i]);
		}
	},
	render: function(here) {
		var co=config.options; var out=""
		if (!co.chkBreadcrumbsHideHomeLink) {
			createTiddlyButton(here,"Home",null,this.home,"tiddlyLink tiddlyLinkExisting");
			out+=here.getAttribute("homeSep")||config.options.txtBreadcrumbsHomeSeparator;
		}
		for (c=0; c<this.crumbs.length; c++) // remove non-existing tiddlers from crumbs
			if (!store.tiddlerExists(this.crumbs[c]) && !store.isShadowTiddler(this.crumbs[c]))
				this.crumbs.splice(c,1);
		var count=this.crumbs.length;
		if (co.chkBreadcrumbsLimit && co.txtBreadcrumbsLimit<count) count=co.txtBreadcrumbsLimit;
		var list=[];
		for (c=this.crumbs.length-count; c<this.crumbs.length; c++) list.push('[['+this.crumbs[c]+']]');
		if (co.chkBreadcrumbsReverse) list.reverse();
		out+=list.join(here.getAttribute("crumbSep")||config.options.txtBreadcrumbsCrumbSeparator);
		wikify(out,here);
	},
	home: function() {
		var cmb=config.macros.breadcrumbs;
		if (config.options.chkBreadcrumbsSave && confirm(cmb.askMsg)) cmb.saveCrumbs();
		story.closeAllTiddlers(); restart();
		cmb.crumbs = []; var crumbAreas=cmb.getAreas();
		for (var i=0; i<crumbAreas.length; i++) crumbAreas[i].style.display = "none";
		return false;
	},
	saveCrumbs: function() {
		var tid=prompt(this.saveMsg,this.saveTitle); if (!tid||!tid.length) return; // cancelled by user
		var t=store.getTiddler(tid);
		if(t && !confirm(config.messages.overwriteWarning.format([tid]))) return;
		var who=config.options.txtUserName;
		var when=new Date();
		var text='[['+this.crumbs.join(']]\n[[')+']]';
		var tags=t?t.tags:[]; tags.pushUnique('story');
		var fields=t?t.fields:{};
		store.saveTiddler(tid,tid,text,who,when,tags,fields);
		story.displayTiddler(null,tid);
		story.refreshTiddler(tid,null,true);
		displayMessage(tid+' has been '+(t?'updated':'created'));
	},
	limitOpenTiddlers: function() {
		var limit=config.options.txtBreadcrumbsLimitOpenTiddlers; if (limit<1) limit=1;
		for (c=this.crumbs.length-1; c>=0; c--) {
			var tid=this.crumbs[c];
			var elem=story.getTiddler(tid);
			if (elem) { // tiddler is displayed
				if (limit <=0) { // display limit has been reached
					if (elem.getAttribute("dirty")=="true") { // tiddler is being edited
						var msg= "'"+tid+"' is currently being edited.\n\n"
							+"Press OK to save and close this tiddler\n"
							+"or press Cancel to leave it opened";
						if (confirm(msg)) {
							story.saveTiddler(tid);
							story.closeTiddler(tid);
						}
					}
					else story.closeTiddler(this.crumbs[c]);
				}
				limit--;
			}
		}
	}
};
//}}}
// // PreviousTiddler ('back') command and macro
//{{{
config.commands.previousTiddler = {
	text: 'back',
	tooltip: 'view the previous tiddler',
	handler: function(event,src,title) {
		var crumbs=config.macros.breadcrumbs.crumbs;
		if (crumbs.length<2) config.macros.breadcrumbs.home();
		else story.displayTiddler(story.findContainingTiddler(src),crumbs[crumbs.length-2]);
		return false;
	}
};
config.macros.previousTiddler= {
	label: 'back',
	prompt: 'view the previous tiddler',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var label=params.shift(); if (!label) label=this.label;
		var prompt=params.shift(); if (!prompt) prompt=this.prompt;
		createTiddlyButton(place,label,prompt,function(ev){
			return config.commands.previousTiddler.handler(ev,this)
		});
	}
}
//}}}
// // HIJACKS
//{{{
// update crumbs when a tiddler is displayed
if (Story.prototype.breadCrumbs_coreDisplayTiddler==undefined)
	Story.prototype.breadCrumbs_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler) {
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	this.breadCrumbs_coreDisplayTiddler.apply(this,arguments);
	if (!startingUp || config.options.chkShowStartupBreadcrumbs)
		config.macros.breadcrumbs.add(title);
}

// update crumbs when a tiddler is deleted
if (TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined)
	TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler= function() {
	this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);
	config.macros.breadcrumbs.refresh();
}
//}}}
/***
|Name|BreadcrumbsPluginInfo|
|Author|Eric Shulman|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|Documentation|http://www.TiddlyTools.com/#BreadcrumbsPluginInfo|
|Version|2.1.5|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for BreadcrumbsPlugin|
This plugin provides a list of links to all tiddlers opened during the session, creating a "trail of breadcrumbs" from one tiddler to the next, allowing you to quickly navigate to any previously viewed tiddler, or select 'home' to reset the display to the initial set of tiddlers that were open at the start of the session (i.e., when the document was loaded into the browser).
!!!!!Usage
<<<
{{{
<<breadcrumbs homeSeparator crumbSeparator>>
}}}
By default, the breadcrumbs are displayed as a continuous, //horizontal// word-wrapped line of text, using default character sequences for ''homeSeparator'' (" | ") and ''crumbSeparator'' (" > ").  The //optional// ''homeSeparator'' and ''crumbSeparator'' macro parameters allow you to specify alternative separators.  For example, to display the breadcrumbs //vertically// (in a stack, rather than a row), set the separator values to use {{{[[<br>]]}}}... and, to display a horizontal line as the home separator, use {{{[[<html><hr></html>]]}}}.
{{{
<<previousTiddler>>
}}}
This macro embeds a 'back' button in your content.  Clicking the button opens/scrolls to the most recent previously viewed tiddler.  You can also add the {{{previousTiddler}}} keyword to the ~ViewToolbar slice definition in ToolbarCommands.  This adds a 'back' button directly to the toolbar of each tiddler that is displayed.
<<<
!!!!!Examples:
<<<
{{{
<<breadcrumbs>>
}}}
<<breadcrumbs>>
{{{
<<breadcrumbs [[<html><hr></html>]] [[<br>]]>>
}}}
<<breadcrumbs [[<html><hr></html>]] [[<br>]]>>
<<<
!!!!!Customization
<<<
Using CSS and a few of the plugin configuration options (see below), you can make the breadcrumbs display resemble browser tabs by adding the following to your [[StyleSheet]]:
{{{
.breadCrumbs { border-bottom:1px solid; }
.breadCrumbs a {
	border: 1px solid; padding: 0px 1em;
	-moz-border-radius-topleft:.5em; -moz-border-radius-topright:.5em;
	-webkit-border-top-left-radius:.5em; -webkit-border-top-right-radius:.5em;
}
}}}
and this in [[ConfigTweaks]] (tagged with systemConfig, of course):
{{{
config.options.chkShowStartupBreadcrumbs=true;
config.options.chkBreadcrumbsLimitOpenTiddlers=true;
config.options.txtBreadcrumbsLimitOpenTiddlers=1;
config.macros.breadcrumbs.homeSeparator=" ";
config.macros.breadcrumbs.crumbSeparator=" ";
}}}
<<<
!!!!!Configuration
<<<
__''display placement:''__
<<option chkCreateDefaultBreadcrumbs>> automatically create breadcrumbs display (if needed)
{{{<<option chkCreateDefaultBreadcrumbs>>}}}
>By default, the plugin automatically creates the "breadCrumbs" display element at the top of the story column, just above the tiddlerDisplay area.  To manually control the display and placement of the breadcrumbs display, you can define a DIV with class="breadCrumbs" in a custom [[PageTemplate]] or embed the {{{<<breadcrumbs>>}}} macro in specific tiddler content.
>
>For example, to add the breadcrumbs below the mainMenu, change this:
{{{
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
}}}
>to:
{{{
<div id='mainMenu'>
	<div refresh='content' tiddler='MainMenu'></div>
	<div id='breadCrumbs' class='breadCrumbs'></div>
</div>
}}}
>You can also block automatic creation of the breadcrumbs display by setting
{{{
config.options.chkCreateDefaultBreadcrumbs=false;
}}}
>in a [[CookieJar]]/[[ConfigTweaks]] plugin tiddler.

__''other settings:''__
<<option chkShowBreadcrumbs>> show/hide breadcrumbs display
{{{<<option chkShowBreadcrumbs>>}}}
>This checkbox toggles the visibility of the breadcrumbs display.  However, the display is not updated until the next crumb is added (or a previous crumb is clicked on).  For immediate effect, you can use [[ToggleBreadcrumbs]] to synchronize the checkbox setting and the breadcrumbs display.
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
{{{<<option chkReorderBreadcrumbs>>}}}
>When visiting a previously viewed tiddler, the title of the most-recently displayed tiddler is simply moved to the end of the list and individual breadcrumbs are not removed from the list unless the underlying tiddler is deleted.  When ''re-ordering'' is disabled, the breadcrumbs list is ''trimmed'' so that all crumbs following that tiddler are removed from the list.
<<option chkBreadcrumbsHideHomeLink>> omit 'Home' link from breadcrumbs display
{{{<<option chkBreadcrumbsHideHomeLink>>}}}
>Enabling this option suppresses the automatic display of the "Home" link (and home separator).  To manually add the home link elsewhere in your document, use the following HTML:
{{{
<html><a href="javascript:;" onclick="config.macros.breadcrumbs.home()">home</a></html>
}}}
<<option chkBreadcrumbsSave>> prompt to save breadcrumbs when 'Home' link is pressed
{{{<<option chkBreadcrumbsSave>>}}}
>Whenever you press the 'home' button, you can be prompted to save the current breadcrumbs in a tiddler as a space-separated list of tiddler links (default title="SavedBreadcrumbs").
<<option chkShowStartupBreadcrumbs>> show breadcrumbs for 'startup' tiddlers
{{{<<option chkShowStartupBreadcrumbs>>}}}
>Breadcrumbs are usually only added for tiddlers that are opened after the document has been loaded, and not for tiddlers displayed during initial startup (e.g., [[DefaultTiddlers]]).  Enabling this option displays breadcrumbs for all viewed tiddlers, regardless of when they are opened.
<<option chkBreadcrumbsReverse>> show breadcrumbs in reverse order
{{{<<option chkBreadcrumbsReverse>>}}}
>As tiddlers are displayed, breadcrumbs are usually added to the //end// of the list.  Enabling this option displays breadcrumbs in reverse order, so that the most recently visited tiddlers are listed first.
<<option chkBreadcrumbsLimit>> limit breadcrumbs display to {{twochar{<<option txtBreadcrumbsLimit>>}}} items
{{{<<option chkBreadcrumbsLimit>>}}} and {{{<<option txtBreadcrumbsLimit>>}}}
>By default, breadcrumbs are displayed for all tiddlers that have been visited (unless the list is being 'trimmed' by disabling the chkReorderBreadcrumbs option above).  Enabling this option limits the display of the list to a maximum specified number of breadcrumbs.
<<option chkBreadcrumbsLimitOpenTiddlers>> limit open tiddlers to {{twochar{<<option txtBreadcrumbsLimitOpenTiddlers>>}}} items
{{{<<option chkBreadcrumbsLimitOpenTiddlers>>}}} and {{{<<option txtBreadcrumbsLimitOpenTiddlers>>}}}
>By default, tiddlers remain open (e.g., displayed in the story column) until you explicitly close them.  When this option is enabled, only the most recently opened tiddlers will remain open: ''any tiddlers in excess of the specified limit are automatically closed.''  //Note: for 'data safety', if a tiddler is being edited, you will be asked for permission to "save-and-close" that tiddler or leave it open (even if that would exceed the specified limit).//
<<<
!!!!!Revisions
<<<
2012.06.10 2.1.5 refactored default options to eliminate global variable and use init() handling
2011.02.16 2.1.4 in refresh(), use 'inline' instead of 'block' style (avoids unwanted linebreak).  In previousTiddler(), allow handling even if not in a tiddler so that back button can be placed in ~MainMenu or ~SidebarOptions.
2010.11.30 2.1.3 use story.getTiddler()
2009.10.19 2.1.2 code reduction
2009.03.22 2.1.0 added 'save breadcrumbs to tiddler' feature
2008.05.01 2.0.0 added 'limit open tiddlers' feature (with safety check for tiddler in edit mode)
2008.04.06 1.9.1 corrected 'limit' logic so that //last// N crumbs are shown instead of //first// N crumbs.  Also, added chkBreadcrumbsHideHomeLink
2008.04.04 1.9.0 added chkBreadcrumbsReverse and chk/txtBreadcrumbsLimit
2008.03.29 1.8.4 in displayTiddler(), get title from tiddler object (if needed).  Fixes errors caused when calling function passes a tiddler *object* instead of a tiddler *title*
2008.03.24 1.8.3 include shadow tiddlers in breadcrumbs list.  Also changed settings so that "reordering" breadcrumbs is the default, instead of "trimming" the list
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.10.26 1.8.2 documentation cleanup
2007.10.18 1.8.1 in GetAreas(), use try/catch to avoid "Bad NPObject as private data" fatal error caused when embedded QuickTime player element is accessed by hasClass() function.
2007.10.02 1.8.0 major documentation and code cleanup.  Moved config.breadCrumbs.* to config.macros.breadcrumbs.* to consolidate objects.  Also, fixed homeSeparator and crumbSeparator default handling.
2007.10.02 1.7.0 added config.options.chkShowStartupBreadcrumbs option
2007.09.16 1.6.1 in getAreas(), removed errant use of 'place' (was causing fatal error when creating default breadcrumbs display element).  Also, added chkCreateDefaultBreadcrumbs configuration setting to enable/disable automatic creation of a default breadcrumbs display.
2007.09.16 1.6.0 re-wrote refresh() to enable multiple display instances, by finding elements with "breadCrumbs" classname.  Fallback to fixed ID (="breadCrumbs") is still used for backward-compatibility.  move rendering code from refresh() to separate render() function, and added definition for {{{<<breadCrumbs>>}}} macro to support embedding breadcrumbs displays in tiddler content.
2007.09.15 [1.5.9.1] updated documentation
2007.09.15 1.5.9 defined homeSeparator (" | ") and crumbSeparator (" > ") as object properties so that they can be redefined as desired for different layouts (e.g., using 'newline' for the crumbSeparator will arrange crumbs in a column rather than a row.
2007.06.21 [1.5.8.1] in home(), return false to prevent IE from attempting to navigate away...
2007.05.26 1.5.8 added support for {{{<<option chkReorderBreadcrumbs>>}}} to toggle trim vs. re-order behavior when visiting previously viewed tiddlers
2007.05.25 1.5.7 added support for {{{<<option chkShowBreadcrumbs>>}}} to toggle //display// of breadcrumbs
2007.05.24 1.5.6 in refresh(), remove non-existing tiddler titles from crumb list.  Also, hijack removeTiddler() so crumbs can be updated after tiddler is deleted.
2007.04.11 1.5.5 added optional params to previousTiddler macro handler() to allow alternative label and tooltip text (instead of default "back")
2007.03.02 1.5.4 in refresh(), for TW2.2, look for "storyDisplay" instead of "tiddlerDisplay" but keep fallback to "tiddlerDisplay" for TW2.1 or earlier
2007.02.24 1.5.3 changed from hijack of onClickTiddlerLink to hijack of displayTiddler() so that ALL displayed tiddlers are recorded in the crumbs, including programmatically displayed tiddlers opened by macros, scripts, etc., (such as [[GotoPlugin]], among many others) in addition to those opened by clicks on links.
2007.02.24 [1.5.2.0] eliminated global space clutter by moving function and data declarations so they are contained inside config.breadCrumbs object.
2007.02.06 1.5.1 added "previousTiddler" macro (for use in sidebar)
2007.02.05 1.5.0 added "previousTiddler" toolbar command (aka, "back")
2006.08.04 [1.4.0.1] change spaces to tabs
2006.08.04 1.4.0 modified from 1.4.0 distro: in refresh(), set {{{display:none/block}}} instead of {{{visibility:hidden/visible}}}.  In home(), check for valid crumbArea before setting style.
2006.08.02 1.4.0 Fixed bug, the redefined onClickTiddlerLink_orig_breadCrumbs works incorrectly on IE
2006.07.20 1.3.0 Runs compatibly with TW 2.1.0 (rev #403+)
2006.02.07 1.2.0 change global array breadCrumbs to config.breadCrumbs by Eric's suggestion
2006.02.04 1.1.0 JSLint checked
2006.02.01 1.0.0 initial release
<<<
2011-12

Big family talk about communications. With P.. This is just after most of us have seen the movie __Temple__.
* How not to just walk out when T. is talking - she can't tell you left.
** We resolve it's important to give a verbal cue indicating we are done.  Note this has limitations (see next journal).
* We talk about [[Associative-thinking]].
* Discovery that my physical restraint, mistreatment (?) of R. in 2000 is something he remembers and is aggrieved about.
* On the way to that, T. calls me a "hypocrite" -- framed somewhat softly.
* Later she answers an acknowledgment of mine with "DUH".  Then she passes it off as California talk.
** Lots of follow-up about why she really //does// think of me as an hypocrite.
** Elucidation of "safe to share angry feelings" and what that looks like, feels like..
* T. says the current conversation is a quarrel.  This comes up as part of justifying her "Duh" response.

I feel like Snoopy when he finally decides not to be Charlie's headrest any longer.
<<top>> <<closeAll>><<renameButton c 'Close all tiddlers'>> <<toggleSideBar '' '' hide>><<renameButton '>' >>  <<jump j '' top>> <<saveChanges>><<renameButton s 'Save TiddlyWiki'>> {{button{[[B|Bible-Index]]}}} <<newTiddler>><<renameButton n>>
! 2011-01

I must buy the medications, support her many consultations, keep her from panic, type up the Moms In Touch prayer letter, print incoming prayer letters, ship packages, be always ready to sit and listen and pray, absorb nagging, head off her more dangerous misconceptions, protect her from her relatives and the church and my relatives. 
stub
A.k.a. Reality coherence.
This is needed to interpret the physical world.  I see it as fundamental to possibly all the other traits of Asperger's condition. 
* Perceptual frailty
* [[Pasta-preparation]]
* [[Spatial-perception]]
* [[Dyspraxia]]
* [[Leaving-the-room]]
!! T., the Aspie
* Year 22, probably - identified as Asperger's.

!! Me, her husband
* Year 14 - informal diagnosis ADHD.
Dear God,

I am so afraid to open my clenched fists!  Who will I be when I have nothing left to hold on to?  Who will I be when I stand before you with empty hands?

Please help me to gradually open my hands
and to discover that I am not what I own,
but what you want to give me.

And what you want to give me is love,
unconditional, everlasting love.

Amen.

// -- Henri Neuwen//
Contributes to a [[Fixit-coping-tactic]]. 
The hook on the wall that was in place 20 years, then the outrage. 

/***
|Name|CollapseTiddlersPlugin|
|Source|http://gensoft.revhost.net/Collapse.html|
|Version|2008.10.05|
|Author|Bradley Meck (modified by ELS)|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|CollapsedTemplate|
|Overrides||
|Description|show/hide content of a tiddler while leaving tiddler title visible|

|ELS 10/5/2008: collapseAll() and expandAll(): added "return false" to button handlers to prevent IE page transition |
|ELS 3/6/2008: refactored code for size reduction, readability, and I18N/L10N-readiness.  Also added 'folded' flag to tiddler elements (for use by other plugins that need to know if tiddler is folded (e.g., [[SinglePageModePlugin]]) |
|ELS 10/11/2007: moved [[FoldFirst]] inline script and converted to {{{<<foldFirst>>}}} macro. |
|ELS 9/12/2007: suspend/resume SinglePageMode (SPM/TPM/BPM) when folding/unfolding tiddlers |
|ELS 6/5/2007: add "return false" at the end of each command handler to prevent IE 'page transition' problem. |
|ELS 3/30/2007: add a shadow definition for CollapsedTemplate.  Tweak ViewTemplate shadow so "fold/unfold" and "focus" toolbar items automatically appear when using default templates.  Remove error check for "CollapsedTemplate" existence, since shadow version will now always work as a fallback. |
|ELS 2/24/2006: added fallback to "CollapsedTemplate" if "WebCollapsedTemplate" is not found |
|ELS 2/6/2006: added check for 'readOnly' flag to use alternative "WebCollapsedTemplate" |

***/

//{{{
config.shadowTiddlers.CollapsedTemplate=
    "<!--{{{-->\
    <div class='toolbar' macro='toolbar expandTiddler collapseOthers closeTiddler closeOthers +editTiddler permalink references jump'></div>\
    <div class='title' macro='view title'></div>\
    <!--}}}-->";

// automatically tweak shadow ViewTemplate to add "collapseTiddler collapseOthers" commands
config.shadowTiddlers.ViewTemplate=config.shadowTiddlers.ViewTemplate.replace(/closeTiddler/,"collapseTiddler collapseOthers closeTiddler");

config.commands.collapseTiddler = {
    text: "fold",
    tooltip: "Collapse this tiddler",
    collapsedTemplate: "CollapsedTemplate",
    webCollapsedTemplate: "WebCollapsedTemplate",
    handler: function(event,src,title) {
        var e = story.findContainingTiddler(src); if (!e) return false;
        // don't fold tiddlers that are being edited!
        if(story.isDirty(e.getAttribute("tiddler"))) return false;
        var t=config.commands.collapseTiddler.getCollapsedTemplate();
        config.commands.collapseTiddler.saveTemplate(e);
        config.commands.collapseTiddler.display(title,t);
        e.setAttribute("folded","true");
        return false;
    },
    getCollapsedTemplate: function() {
        if (readOnly&&store.tiddlerExists(this.webCollapsedTemplate))
            return this.webCollapsedTemplate;
        else
            return this.collapsedTemplate
    },
    saveTemplate: function(e) {
        if (e.getAttribute("savedTemplate")==undefined)
            e.setAttribute("savedTemplate",e.getAttribute("template"));

    },
    // fold/unfold tiddler with suspend/resume of single/top/bottom-of-page mode
    display: function(title,t) {
        var opt=config.options;
        var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
        var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
        var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
        story.displayTiddler(null,title,t);
        opt.chkBottomOfPageMode=saveBPM;
        opt.chkTopOfPageMode=saveTPM;
        opt.chkSinglePageMode=saveSPM;
    }
}

config.commands.expandTiddler = {
    text: "unfold",
    tooltip: "Expand this tiddler",
    handler: function(event,src,title) {
        var e = story.findContainingTiddler(src); if (!e) return false;
        var t = e.getAttribute("savedTemplate");
        config.commands.collapseTiddler.display(title,t);
        e.setAttribute("folded","false");
        return false;
    }
}

config.macros.collapseAll = {
    text: "collapse all",
    tooltip: "Collapse all tiddlers",
    handler: function(place,macroName,params,wikifier,paramString,tiddler){
        createTiddlyButton(place,this.text,this.tooltip,function(){
            story.forEachTiddler(function(title,tiddler){
                if(story.isDirty(title)) return;
                var t=config.commands.collapseTiddler.getCollapsedTemplate();


                config.commands.collapseTiddler.saveTemplate(tiddler);
                config.commands.collapseTiddler.display(title,t);
                tiddler.folded=true;
            });
            return false;
        })
    }
}

config.macros.expandAll = {
    text: "expand all",
    tooltip: "Expand all tiddlers",
    handler: function(place,macroName,params,wikifier,paramString,tiddler){
        createTiddlyButton(place,this.text,this.tooltip,function(){
            story.forEachTiddler(function(title,tiddler){
                var t=config.commands.collapseTiddler.getCollapsedTemplate();
                if(tiddler.getAttribute("template")!=t) return; // re-display only if collapsed
                var t=tiddler.getAttribute("savedTemplate");
                config.commands.collapseTiddler.display(title,t);
                tiddler.folded=false;
            });
            return false;
        })
    }
}

config.commands.collapseOthers = {
    text: "focus",
    tooltip: "Expand this tiddler and collapse all others",
    handler: function(event,src,title) {
        var e = story.findContainingTiddler(src); if (!e) return false;
        story.forEachTiddler(function(title,tiddler) {
            if(story.isDirty(title)) return;
            var t=config.commands.collapseTiddler.getCollapsedTemplate();
            if (e==tiddler) t=e.getAttribute("savedTemplate");
            config.commands.collapseTiddler.saveTemplate(tiddler);
            config.commands.collapseTiddler.display(title,t);
            tiddler.folded=(e!=tiddler);
        })
        return false;
    }
}

// {{{<<foldFirst>>}}} macro forces tiddler to be folded when *initially* displayed.
// Subsequent re-render does NOT re-fold tiddler, but closing/re-opening tiddler DOES cause it to fold first again.
config.macros.foldFirst = {
    handler: function(place,macroName,params,wikifier,paramString,tiddler){
        var e=story.findContainingTiddler(place);
        if (e.getAttribute("foldedFirst")=="true") return; // already been folded once
        var title=e.getAttribute("tiddler")
        var t=config.commands.collapseTiddler.getCollapsedTemplate();
        config.commands.collapseTiddler.saveTemplate(e);
        config.commands.collapseTiddler.display(title,t);
        e.setAttribute("folded","true");
        e.setAttribute("foldedFirst","true"); // only when tiddler is first rendered
        return false;
    }
}
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::CollapsedToolbar]]'></div>
<div class='title' macro='view title'></div>
<!--}}}-->
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #699
PrimaryMid: #366
PrimaryDark: #033
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
QuaternaryPale: #aef
QuaternaryLight: #8ad
QuaternaryMid: #38c
QuaternaryDark: #026
Error: #f88
[[ColorPalette]]
<<paletteView [[ColorPalette]]>>

[[ColorPaletteBAK]]
<<paletteView [[ColorPaletteBAK]]>>
2011-06

What is difficult about confessing to T.. She will say, Aha! This explains the trouble I've been having. This explains the trouble Scott has been having. This explains why Scott thinks I been having a hard time. It is like that passage from Paul Tournier. She is too self-righteous to understand her position. So to confess is to take all the blame for all the problems.
Conflict is threatening.  
Dissent signals conflict.  
Uncertainty signals dissent.  
2014-03

T. had given me a sticky note upon which he had written, I'm proud of you for getting a good report from Covenant Eyes this week. Receiving this sticky note gave me an immediate dose of negative emotions. Now, so much more than a decade ago, I have the ability to review my feelings, what prompts them, and how they may work out in my soul. I tried – not tried – I talked with T. about it. It seemed approachable, and when the event came up between P. and T., it seemed germane. My problem was that I don't want to be graded on an artificial scorecard. Talking with T., I tried to consider what would hit the mark. What would hit the mark, I decided, was a statement like this. I'm so proud of you for growing in honesty; it isn't easy for your wife to receive a weekly report of your Internet use, of course, but you do that, and it shows that you care about me. Why was this so much better, I wondered. I understood two reasons. First, it is about me, my character; it says something about me as opposed to my actions, or a report which is reflective of my actions. Second, no less important, it suggests that I have acceptance regardless of my weekly performance. If T.'s affirmation is based on my good report or good conduct, then what does that mean for a week when my conduct is not good? This problem isn't found with the response I was imagining as preferable. If T. is affirming for being honest offering my report, then I may have a good report or a bad report – I am still fulfilling the standard of honesty. There is a third aspect, and that is the difference between assessing character and reviewing a scorecard. Obviously this is closely related to the first item, but perhaps it needs an explanation of its own. For T., I tried to use the analogy of a report card. The report card says how my teachers think I am doing. It is intended to reflect something much larger and more important, which is my actual learning. If I could choose on which to be praised, of course I would not pick the report card, because it is superficial. It is not only superficial, but it can be gamed or manipulated. So, I would rather be recognized for gaining maturity before the Lord as opposed to not triggering the Internet filter.

And there is a fourth thing: if I am graded on the Internet content filter report, I become aware of all the little cheats I may use, all the ways that I tend to groom a image rather than my holiness.

Right now T. is stuck on the report card analogy. Why isn't a report card a good thing to give praise for, she even has a list of questions relating to this on the table with some other sticky notes. Who would try to make their report card reflect something fake? 

[[Monitoring-Controlling]]
Stub
/***
|Name|CopyTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#CopyTiddlerPlugin|
|Version|3.2.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Description|Quickly create a copy of any existing tiddler|
!!!Usage
<<<
The plugin automatically updates the default (shadow) ToolbarCommands definitions to insert the ''copyTiddler'' command, which will appear as ''copy'' when a tiddler is rendered.  If you are already using customized toolbar definitions, you will need to manually add the ''copyTiddler'' toolbar command to your existing ToolbarCommands tiddler, e.g.:
{{{
|EditToolbar|... copyTiddler ... |
}}}
When the ''copy'' command is selected, a new tiddler is created containing an exact copy of the current text/tags/fields, using a title of "{{{TiddlerName (n)}}}", where ''(n)'' is the next available number (starting with 1, of course).  If you copy while //editing// a tiddler, the current values displayed in the editor are used (including any changes you may have already made to those values), and the new tiddler is immediately opened for editing.

The plugin also provides a macro that allows you to embed a ''copy'' command directly in specific tiddler content:
{{{
<<copyTiddler TidderName label:"..." prompt:"...">>
}}}
where
* ''TiddlerName'' (optional)<br>specifies the //source// tiddler to be copied.  If omitted, the current containing tiddler (if any) will be copied.
* ''label:"..."'' (optional)<br>specifies text to use for the embedded link (default="copy TiddlerName")
* ''prompt:"..."'' (optional)<br>specifies mouseover 'tooltip' help text for link
//Note: to use non-default label/prompt values with the current containing tiddler, use "" for the TiddlerName//
<<<
!!!Configuration
<<<
<<option chkCopyTiddlerDate>> use date/time from existing tiddler (otherwise, use current date/time)
{{{<<option chkCopyTiddlerDate>>}}}
<<<
!!!Revisions
<<<
2009.06.08 [3.2.5] added option to use timestamp from source tiddler
2009.03.09 [3.2.4] fixed IE-specific syntax error
2009.03.02 [3.2.3] refactored code (again) to restore use of config.commands.copyTiddler.* custom settings
2009.02.13 [3.2.2] in click(), fix calls to displayTiddler() to use current tiddlerElem and use getTiddlerText() to permit copying of shadow tiddler content
2009.01.30 [3.2.1] fixed handling for copying field values when in edit mode
2009.01.23 [3.2.0] refactored code and added {{{<<copyTiddler TiddlerName>>}}} macro
2008.12.18 [3.1.4] corrected code for finding next (n) value when 'sparse' handling is in effect (thanks to RussThomas for identifying and diagnosing the problem)
2008.11.14 [3.1.3] added optional 'sparse' setting (avoids 'filling in' missing numbers that may have been previously deleted)
2008.11.14 [3.1.2] added optional 'zeroPad' setting
2008.11.14 [3.1.1] moved hard-coded '(n)' regex into 'suffixPattern' object property so it can be customized
2008.09.26 [3.1.0] changed new title generation to use '(n)' suffix instead of 'Copy of' prefix
2008.05.20 [3.0.3] in handler, when copying from VIEW mode, create duplicate array from existing tags array before saving new tiddler.
2007.12.19 [3.0.2] in handler, when copying from VIEW mode, duplicate custom fields before saving new tiddler. Thanks to bug report from Ken Girard.
2007.09.26 [3.0.1] in handler, use findContainingTiddler(src) to get tiddlerElem (and title).  Allows 'copy' command to find correct tiddler when transcluded using {{{<<tiddler>>}}} macro or enhanced toolbar inclusion (see [[CoreTweaks]])
2007.06.28 [3.0.0] complete re-write to handle custom fields and alternative view/edit templates
2007.05.17 [2.1.2] use store.getTiddlerText() to retrieve tiddler content, so that SHADOW tiddlers can be copied correctly when in VIEW mode
2007.04.01 [2.1.1] in copyTiddler.handler(), fix check for editor fields by ensuring that found field actually has edit=='text' attribute
2007.02.05 [2.1.0] in copyTiddler.handler(), if editor fields (textfield and/or tagsfield) can't be found (i.e., tiddler is in VIEW mode, not EDIT mode), then get text/tags values from stored tiddler instead of active editor fields.  Allows use of COPY toolbar directly from VIEW mode (based on a request from LaurentCharles)
2006.12.12 [2.0.0] completely rewritten so plugin just creates a new tiddler EDITOR with a copy of the current tiddler EDITOR contents, instead of creating the new tiddler in the STORE by copying the current tiddler values from the STORE.
2005.xx.xx [1.0.0] original version by Tim Morgan
<<<
!!!Code
***/
//{{{
version.extensions.CopyTiddlerPlugin= {major: 3, minor: 2, revision: 5, date: new Date(2009,6,8)};

// automatically tweak shadow EditTemplate to add 'copyTiddler' toolbar command (following 'cancelTiddler')
config.shadowTiddlers.ToolbarCommands=config.shadowTiddlers.ToolbarCommands.replace(/cancelTiddler/,'cancelTiddler copyTiddler');

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

config.commands.copyTiddler = {
    text: 'copy',
    hideReadOnly: true,
    tooltip: 'Make a copy of this tiddler',
    notitle: 'this tiddler',
    prefix: '',
    suffixText: ' (%0)',
    suffixPattern: / \(([0-9]+)\)$/,
    zeroPad: 0,
    sparse: false,
    handler: function(event,src,title)
        { return config.commands.copyTiddler.click(src,event); },
    click: function(here,ev) {
        var tiddlerElem=story.findContainingTiddler(here);
        var template=tiddlerElem?tiddlerElem.getAttribute('template'):null;
        var title=here.getAttribute('from');
        if (!title || !title.length) {
            if (!tiddlerElem) return false;
            else title=tiddlerElem.getAttribute('tiddler');
        }
        var root=title.replace(this.suffixPattern,''); // title without suffix
        // find last matching title
        var last=title;
        if (this.sparse) { // don't fill-in holes... really find LAST matching title
            var tids=store.getTiddlers('title','excludeLists');
            for (var t=0; t<tids.length; t++) if (tids[t].title.startsWith(root)) last=tids[t].title;
        }
        // get next number (increment from last matching title)
        var n=1; var match=this.suffixPattern.exec(last); if (match) n=parseInt(match[1])+1;
        var newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]);
        // if not sparse mode, find the next hole to fill in...
        while (store.tiddlerExists(newTitle)||document.getElementById(story.idPrefix+newTitle))
            { n++; newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]); }
        if (!story.isDirty(title)) { // if tiddler is not being EDITED
            // duplicate stored tiddler (if any)
            var text=store.getTiddlerText(title,'');
            var who=config.options.txtUserName;
            var when=new Date();
            var newtags=[]; var newfields={};
            var tid=store.getTiddler(title); if (tid) {
                if (config.options.chkCopyTiddlerDate) var when=tid.modified;
                for (var t=0; t<tid.tags.length; t++) newtags.push(tid.tags[t]);
                store.forEachField(tid,function(t,f,v){newfields[f]=v;},true);
            }
                    store.saveTiddler(newTitle,newTitle,text,who,when,newtags,newfields,true);
            story.displayTiddler(tiddlerElem,newTitle,template);
        } else {
            story.displayTiddler(tiddlerElem,newTitle,template);
            var fields=config.commands.copyTiddler.gatherFields(tiddlerElem); // get current editor fields
            var newTiddlerElem=document.getElementById(story.idPrefix+newTitle);
            for (var f=0; f<fields.length; f++) {  // set fields in new editor
                if (fields[f].name=='title') fields[f].value=newTitle; // rename title in new tiddler
                var fieldElem=config.commands.copyTiddler.findField(newTiddlerElem,fields[f].name);
                if (fieldElem) {
                    if (fieldElem.getAttribute('type')=='checkbox')
                        fieldElem.checked=fields[f].value;
                    else
                        fieldElem.value=fields[f].value;
                }
            }
        }
        story.focusTiddler(newTitle,'title');
        return false;
    },
    findField: function(tiddlerElem,field) {
        var inputs=tiddlerElem.getElementsByTagName('input');
        for (var i=0; i<inputs.length; i++) {
            if (inputs[i].getAttribute('type')=='checkbox' && inputs[i].field == field) return inputs[i];
            if (inputs[i].getAttribute('type')=='text' && inputs[i].getAttribute('edit') == field) return inputs[i];
        }
        var tas=tiddlerElem.getElementsByTagName('textarea');
        for (var i=0; i<tas.length; i++) if (tas[i].getAttribute('edit') == field) return tas[i];
        var sels=tiddlerElem.getElementsByTagName('select');
        for (var i=0; i<sels.length; i++) if (sels[i].getAttribute('edit') == field) return sels[i];
        return null;
    },
    gatherFields: function(tiddlerElem) { // get field names and values from current tiddler editor
        var fields=[];
        // get checkboxes and edit fields
        var inputs=tiddlerElem.getElementsByTagName('input');
        for (var i=0; i<inputs.length; i++) {
            if (inputs[i].getAttribute('type')=='checkbox')
                if (inputs[i].field) fields.push({name:inputs[i].field,value:inputs[i].checked});
            if (inputs[i].getAttribute('type')=='text')
                if (inputs[i].getAttribute('edit')) fields.push({name:inputs[i].getAttribute('edit'),value:inputs[i].value});
        }
        // get textareas (multi-line edit fields)
        var tas=tiddlerElem.getElementsByTagName('textarea');
        for (var i=0; i<tas.length; i++)
            if (tas[i].getAttribute('edit')) fields.push({name:tas[i].getAttribute('edit'),value:tas[i].value});
        // get selection lists (droplist or listbox)
        var sels=tiddlerElem.getElementsByTagName('select');
        for (var i=0; i<sels.length; i++)
            if (sels[i].getAttribute('edit')) fields.push({name:sels[i].getAttribute('edit'),value:sels[i].value});
        return fields;
    }
};
//}}}
// // MACRO DEFINITION
//{{{
config.macros.copyTiddler = {
    label: 'copy',
    prompt: 'Make a copy of %0',
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var title=params.shift();
        params=paramString.parseParams('anon',null,true,false,false);
        var label   =getParam(params,'label',this.label+(title?' '+title:''));
        var prompt  =getParam(params,'prompt',this.prompt).format([title||this.notitle]);
        var b=createTiddlyButton(place,label,prompt,
            function(ev){return config.commands.copyTiddler.click(this,ev)});
        b.setAttribute('from',title||'');
    }
};
//}}}
/***
|Name|CoreTweaks|
|Source|http://www.TiddlyTools.com/#CoreTweaks|
|Version||
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.2.0|
|Type|plugin|
|Description|a small collection of overrides to TW core functions|
This tiddler contains small changes to TW core functions that correct or enhance standard features or behaviors.
***/
//{{{
// calculate TW version number - used to determine which tweaks should be applied
var ver=version.major+version.minor/10+version.revision/100;
//}}}
/***
----

***/
// // closed: won't fix //(leave as core tweaks)//
// // {{block{
/***
!!!637 TiddlyLink tooltip - custom formatting
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/637 - CLOSED: WON'T FIX
This tweak modifies the tooltip format that appears when you mouseover a link to a tiddler.  It adds an option to control the date format, as well as displaying the size of the tiddler (in bytes)

Tiddler link tooltip format:
{{stretch{<<option txtTiddlerLinkTootip>>}}}
^^where: %0=title, %1=username, %2=modification date, %3=size in bytes, %4=description slice, %5=first N characters of tiddler content^^
Tiddler link tooltip date format:
{{stretch{<<option txtTiddlerLinkTooltipDate>>}}}
Tiddler excerpt limit (chars):
{{stretch{<<option txtTiddlerLinkTooltipLimit>>}}}
***/
//{{{
config.messages.tiddlerLinkTooltip='%0 - %1, %2 (%3 bytes) - %4';
config.messages.tiddlerLinkTooltipDate='DDD, MMM DDth YYYY 0hh12:0mm AM';
config.messages.tiddlerLinkTooltipLimit=50;

config.options.txtTiddlerLinkTootip=
	config.options.txtTiddlerLinkTootip||config.messages.tiddlerLinkTooltip;
config.options.txtTiddlerLinkTooltipDate=
	config.options.txtTiddlerLinkTooltipDate||config.messages.tiddlerLinkTooltipDate;
config.options.txtTiddlerLinkTooltipLimit=
	config.options.txtTiddlerLinkTooltipLimit||config.messages.tiddlerLinkTooltipLimit;

Tiddler.prototype.getSubtitle = function() {
	var modifier = this.modifier;
	if(!modifier) modifier = config.messages.subtitleUnknown;
	var modified = this.modified;
	if(modified) modified = modified.formatString(config.options.txtTiddlerLinkTooltipDate);
	else modified = config.messages.subtitleUnknown;
	var descr=store.getTiddlerSlice(this.title,'Description')||'';
	var txt=this.text.substr(0,config.options.txtTiddlerLinkTooltipLimit);
	if (this.text.length>config.options.txtTiddlerLinkTooltipLimit) txt+="...";
	return config.options.txtTiddlerLinkTootip.format([this.title,modifier,modified,this.text.length,descr,txt]);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!607 add HREF link on permaview command
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/607 - CLOSED: WON'T FIX
This tweak automatically sets the HREF for the 'permaview' sidebar command link so you can use the 'right click' context menu for faster, easier bookmarking.  Note that this does ''not'' automatically set the permaview in the browser's current location URL... it just sets the HREF on the command link.  You still have to click the link to apply the permaview.
***/
//{{{
config.macros.permaview.handler = function(place)
{
	var btn=createTiddlyButton(place,this.label,this.prompt,this.onClick);
	addEvent(btn,'mouseover',this.setHREF);
	addEvent(btn,'focus',this.setHREF);
};
config.macros.permaview.setHREF = function(event){
	var links = [];
	story.forEachTiddler(function(title,element) {
		links.push(String.encodeTiddlyLink(title));
	});
	var newURL=document.location.href;
	var hashPos=newURL.indexOf('#');
	if (hashPos!=-1) newURL=newURL.substr(0,hashPos);
	this.href=newURL+'#'+encodeURIComponent(links.join(' '));
}
//}}}
// // }}}}}}// // {{block{
/***
!!!458 add permalink-like HREFs on internal TiddlyLinks
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/458 - CLOSED: WON'T FIX
This tweak assigns a permalink-like HREF to internal Tiddler links (which normally do not have any HREF defined).  This permits the link's context menu (right-click) to include 'open link in another window/tab' command.  Based on a request from Dustin Spicuzza.
***/
//{{{
window.coreTweaks_createTiddlyLink=window.createTiddlyLink;
window.createTiddlyLink=function(place,title,includeText,theClass,isStatic,linkedFromTiddler,noToggle)
{
	// create the core button, then add the HREF (to internal links only)
	var link=window.coreTweaks_createTiddlyLink.apply(this,arguments);
	if (!isStatic)
		link.href=document.location.href.split('#')[0]+'#'+encodeURIComponent(String.encodeTiddlyLink(title));
	return link;
}
//}}}
// // }}}}}}
// // to be fixed in 2.6.0:
// // {{block{
/***
!!!1151 adjust popup placement when root element is in scrolled DIV
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/1151
When a popup link is placed inside a DIV with style "overflow:scroll" or "overflow:auto" and that DIV is then scrolled, the position of the resulting popup appears further down the page that intended, because it is not adjusting for the relative scroll offset of the containing DIV.  This tweak patches the Popup.place() function to calculate and subtract the current scroll offset from the computed popup position, so that it appears in the correct location on the page.

Test case: //(scroll to the bottom of this DIV and click on "test popup")//
{{groupbox{
 <<tiddler ScrollBox with: CoreTweaks##1151test 12em>>}}}/%
!1151test
<<tiddler About>>
<<showPopup tiddler:About label:"test popup" tip:About popupClass:sticky>>
!end
%/
***/
//{{{
window.findScrollOffsetX=function(obj) {
	var x=0;
	while(obj) {
		if (obj.scrollLeft && obj.nodeName!='HTML')
			x+=obj.scrollLeft;
		obj=obj.parentNode;
	}
	return -x;
}

window.findScrollOffsetY=function(obj) {
	var y=0;
	while(obj) {
		if (obj.scrollTop && obj.nodeName!='HTML')
			y+=obj.scrollTop;
		obj=obj.parentNode;
	}
	return -y;
}

var fn=Popup.place.toString();
if (fn.indexOf('findScrollOffsetX')==-1) { // only once
	fn=fn.replace(/var\s*rootLeft\s*=/,'var rootLeft = window.findScrollOffsetX(root) +');
	fn=fn.replace(/var\s*rootTop\s*=/,'var rootTop = window.findScrollOffsetY(root) +');
	eval('Popup.place='+fn);
}
//}}}
// // }}}}}}// // {{block{
/***
!!!1147 tiddler macro with params does not refresh
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/1147
when the {{{<<tiddler SomeTiddler>>}}} macro is handled, the resulting span has extra attributes: {{{refresh='content'}}} and {{{tiddler='SomeTiddler'}}}.  If SomeTiddler is changed, {{{store.notify('SomeTiddler')}}} triggers {{{refreshDisplay()}}}, which automatically re-renders transcluded content in any span that has these extra attributes.  However, when additional arguments are passed by using {{{<<tiddler SomeTiddler with: arg arg arg ...>>}}} then the resulting span does NOT get the extra attributes noted above and, as a consequence, the transcluded content is not being refreshed, even though the underlying tiddler has changed

To correct this, in {{{config.macros.tiddler.handler}}}:
*set the 'refresh' and 'tiddler' attributes even when arguments are present in the macro
*store the arguments themselves in an attribute (e.g, 'args'), using as a space-separated, bracketed list
Then, in {{{config.refreshers.content}}}:
*retrieve the stored arguments (if any) and the tiddler source
*substitute arguments into source and re-render the span with the updated content

***/
//{{{
config.refreshers.content=function(e,changeList) {
		var title = e.getAttribute("tiddler");
		var force = e.getAttribute("force");
		var args = e.getAttribute("args"); // ADDED
		if(force != null || changeList == null || changeList.indexOf(title) != -1) {
			removeChildren(e);
//			wikify(store.getTiddlerText(title,""),e,null,store.fetchTiddler(title)); // REMOVED
			config.macros.tiddler.transclude(e,title,args); // ADDED
			return true;
		} else
			return false;
};

config.macros.tiddler.handler=function(place,macroName,params,wikifier,paramString,tiddler) {
	params = paramString.parseParams("name",null,true,false,true);
	var names = params[0]["name"];
	var tiddlerName = names[0];
	var className = names[1] || null;
	var args = params[0]["with"];
	var wrapper = createTiddlyElement(place,"span",null,className);
//	if(!args) { // REMOVED
		wrapper.setAttribute("refresh","content");
		wrapper.setAttribute("tiddler",tiddlerName);
// 	} // REMOVED
	if(args!==undefined) wrapper.setAttribute("args",'[['+args.join(']] [[')+']]'); // ADDED
	this.transclude(wrapper,tiddlerName,args); // REFACTORED TO ...tiddler.transclude
}

// REFACTORED FROM ...tiddler.handler
config.macros.tiddler.transclude=function(wrapper,tiddlerName,args) {
	var text = store.getTiddlerText(tiddlerName); if (!text) return;
	var stack = config.macros.tiddler.tiddlerStack;
	if(stack.indexOf(tiddlerName) !== -1) return;
	stack.push(tiddlerName);
	try {
		if (typeof args == "string") args=args.readBracketedList(); // ADDED
		var n = args ? Math.min(args.length,9) : 0;
		for(var i=0; i<n; i++) {
			var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
			text = text.replace(placeholderRE,args[i]);
		}
		config.macros.tiddler.renderText(wrapper,text,tiddlerName,null); // REMOVED UNUSED 'params'
	} finally {
		stack.pop();
	}
};
//}}}
// // }}}}}}// // {{block{
/***
!!!1134 allow leading whitespace in section headings / TBD handle shadow tiddler sections
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/1134
This tweak REPLACES and extends {{{store.getTiddlerText()}}} so it can return sections defined in shadow tiddlers as well as permitting use of leading whitespace in section headings.
***/
//{{{
TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
{
	if(!title) return defaultText;
	var parts = title.split(config.textPrimitives.sectionSeparator);
	var title = parts[0];
	var section = parts[1];
	var parts = title.split(config.textPrimitives.sliceSeparator);
	var title = parts[0];
	var slice = parts[1]?this.getTiddlerSlice(title,parts[1]):null;
	if(slice) return slice;
	var tiddler = this.fetchTiddler(title);
	var text = defaultText;
	if(this.isShadowTiddler(title))
		text = this.getShadowTiddlerText(title);
	if(tiddler)
		text = tiddler.text;
	if(!section) return text;
	var re = new RegExp("(^!{1,6}[ \t]*" + section.escapeRegExp() + "[ \t]*\n)","mg");
	re.lastIndex = 0;
	var match = re.exec(text);
	if(match) {
		var t = text.substr(match.index+match[1].length);
		var re2 = /^!/mg;
		re2.lastIndex = 0;
		match = re2.exec(t); //# search for the next heading
		if(match)
			t = t.substr(0,match.index-1);//# don't include final \n
		return t;
	}
	return defaultText;
};
//}}}
// // }}}}}}// // {{block{
/***
!!!824 ~WindowTitle - alternative to combined ~SiteTitle/~SiteSubtitle in window titlebar
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/824 - OPEN
This tweak allows definition of an optional [[WindowTitle]] tiddler that, when present, provides alternative text for display in the browser window's titlebar, instead of using the combined text content from [[SiteTitle]] and [[SiteSubtitle]] (which will still be displayed as usual in the TiddlyWiki document header area).

Note: this ticket replaces http://trac.tiddlywiki.org/ticket/401 (closed), which proposed using a custom [[PageTitle]] tiddler for this purpose.  ''If you were using the previous '401 ~PageTitle' tweak, you will need to rename [[PageTitle]] to [[WindowTitle]] to continue to use your custom window title text''
***/
//{{{
config.shadowTiddlers.WindowTitle='<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>';
window.getPageTitle=function() { return wikifyPlain('WindowTitle'); }
store.addNotification('WindowTitle',refreshPageTitle); // so title stays in sync with tiddler changes
//}}}
// // }}}}}}// // {{block{
/***
!!!471 'creator' field for new tiddlers
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/471 - OPEN
This tweak HIJACKS the core's saveTiddler() function to automatically add a 'creator' field to a tiddler when it is FIRST created. You can use """<<view creator>>""" (or """<<view creator wikified>>""" if you prefer) to show this value embedded directly within the tiddler content, or {{{<span macro="view creator"></span>}}} in the ViewTemplate and/or EditTemplate to display the creator value in each tiddler.
***/
//{{{
// hijack saveTiddler()
TiddlyWiki.prototype.CoreTweaks_creatorSaveTiddler=TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler=function(title,newTitle,newBody,modifier,modified,tags,fields)
{
	var existing=store.tiddlerExists(title);
	var tiddler=this.CoreTweaks_creatorSaveTiddler.apply(this,arguments);
	if (!existing) store.setValue(title,'creator',config.options.txtUserName);
	return tiddler;
}
//}}}
// // }}}}}}
// // fixed in ~TW2.4.3
// // {{block{
/***
!!!444 'tiddler' and 'place' - global variables for use in computed macro parameters
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/444 - CLOSED:FIXED - TW2.4.3 - http://trac.tiddlywiki.org/changeset/8367
When invoking a macro, this tweak makes the current containing tiddler object and DOM rendering location available as global variables (window.tiddler and window.place, respectively).  These globals can then be used within //computed macro parameters// to retrieve tiddler-relative and/or DOM-relative values or perform tiddler-specific side-effect functionality.
***/
//{{{
if (ver<2.43) {
window.coreTweaks_invokeMacro = window.invokeMacro;
window.invokeMacro = function(place,macro,params,wikifier,tiddler) {
	var here=story.findContainingTiddler(place);
	window.tiddler=here?store.getTiddler(here.getAttribute('tiddler')):tiddler;
	window.place=place;
	window.coreTweaks_invokeMacro.apply(this,arguments);
}
}
//}}}
// // }}}}}}
// // fixed in ~TW2.4.2:
// // {{block{
/***
!!!823 apply option values via paramifiers (e.g. #chk...and #txt...)
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/823 - CLOSED:FIXED - TW2.4.2 http://trac.tiddlywiki.org/changeset/7988
This tweak extends and ''//replaces//'' the core {{{invokeParamifier()}}} function to support use of ''option paramifiers'' that set TiddlyWiki option values on-the-fly, directly from a document URL.

If a paramifier begins with 'chk' (checkbox) or 'txt' (text field), it's value will be automatically stored in {{{config.options.*}}}, adding to or overriding any existing 'chk' or 'txt' option values that may have already been loaded from browser cookies and/or assigned by the TW core or plugin initialization functions using hard-coded default values.  Note: option values that have been overriden by paramifiers are only applied during the current document session, and are not //automatically// retained.  However, if you edit an overridden option value during that session, then the modified value is, of course, saved in a browser cookie, as usual.
***/
//{{{
if (ver<2.42) {
function invokeParamifier(params,handler)
{
	if(!params || params.length == undefined || params.length <= 1)
		return;
	for(var t=1; t<params.length; t++) {
		var p = config.paramifiers[params[t].name];
		if(p && p[handler] instanceof Function)
			p[handler](params[t].value);
		else { // not a paramifier with handler()... check for an 'option' prefix
			var h=config.optionHandlers[params[t].name.substr(0,3)];
			if (h && h.set instanceof Function)
				h.set(params[t].name,params[t].value);
		}
	}
}
}
//}}}
// // }}}}}}
// // open tickets:
// // {{block{
/***
!!!608/609/610 toolbars - toggles, separators and transclusion
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/608 - OPEN (more/less toggle)
http://trac.tiddlywiki.org/ticket/609 - OPEN (separators)
http://trac.tiddlywiki.org/ticket/610 - OPEN (wikify tiddler/slice/section content)

This combination tweak extends the """<<toolbar>>""" macro to add use of '<' to insert a 'less' menu command (the opposite of '>' == 'more'), as well as use of '*' to insert linebreaks and "!" to insert a vertical line separator between toolbar items.  In addition, this tweak add the ability to use references to tiddlernames, slices, or sections and render their content inline within the toolbar, allowing easy creation of new toolbar commands using TW content (such as macros, links, inline scripts, etc.)

To produce a one-line style, with "less" at the end, use
| ViewToolbar| foo bar baz > yabba dabba doo < |
or to use a two-line style with more/less toggle:
| ViewToolbar| foo bar baz > < * yabba dabba doo |
***/
//{{{
merge(config.macros.toolbar,{
	moreLabel: 'more\u25BC',
	morePrompt: 'Show additional commands',
	lessLabel: '\u25C4less',
	lessPrompt: 'Hide additional commands',
	separator: '|'
});
config.macros.toolbar.onClickMore = function(ev) {
	var e = this.nextSibling;
	e.style.display = 'inline'; // show menu
	this.style.display = 'none'; // hide button
	return false;
};
config.macros.toolbar.onClickLess = function(ev) {
	var e = this.parentNode;
	var m = e.previousSibling;
	e.style.display = 'none'; // hide menu
	m.style.display = 'inline'; // show button
	return false;
};
config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	for(var t=0; t<params.length; t++) {
		var c = params[t];
		switch(c) {
			case '!':  // ELS - SEPARATOR (added)
				createTiddlyText(place,this.separator);
				break;
			case '*':  // ELS - LINEBREAK (added)
				createTiddlyElement(place,'BR');
				break;
			case '<': // ELS - LESS COMMAND (added)
				var btn = createTiddlyButton(place,
					this.lessLabel,this.lessPrompt,config.macros.toolbar.onClickLess,'moreCommand');
				break;
			case '>':
				var btn = createTiddlyButton(place,
					this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore,'moreCommand');
				var e = createTiddlyElement(place,'span',null,'moreCommand');
				e.style.display = 'none';
				place = e;
				break;
			default:
				var theClass = '';
				switch(c.substr(0,1)) {
					case '+':
						theClass = 'defaultCommand';
						c = c.substr(1);
						break;
					case '-':
						theClass = 'cancelCommand';
						c = c.substr(1);
						break;
				}
				if(c in config.commands)

					this.createCommand(place,c,tiddler,theClass);
				else { // ELS - WIKIFY TIDDLER/SLICE/SECTION (added)
					if (c.substr(0,1)=='~') c=c.substr(1); // ignore leading ~
					var txt=store.getTiddlerText(c);
					if (txt) {
						// trim any leading/trailing newlines
						txt=txt.replace(/^\n*/,'').replace(/\n*$/,'');
						// trim PRE format wrapper if any
						txt=txt.replace(/^\{\{\{\n/,'').replace(/\n\}\}\}$/,'');
						// render content into toolbar
						wikify(txt,createTiddlyElement(place,'span'),null,tiddler);
					}
				} // ELS - end WIKIFY CONTENT
				break;
		}
	}
};
//}}}
// // }}}}}}// // {{block{
/***
!!!529 IE fixup - case-sensitive element lookup of tiddler elements
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/529 - OPEN
This tweak hijacks the standard browser function, document.getElementById(), to work-around the case-INsensitivity error in Internet Explorer (all versions up to and including IE7) //''Note: This tweak is only applied when using IE, and only for lookups of rendered tiddler elements within the containing 'tiddlerDisplay' element.''//
***/
//{{{
if (config.browser.isIE) {
document.coreTweaks_coreGetElementById=document.getElementById;
document.getElementById=function(id) {
	var e=document.coreTweaks_coreGetElementById(id);
	if (!e || !e.parentNode || e.parentNode.id!='tiddlerDisplay') return e;
	for (var i=0; i<e.parentNode.childNodes.length; i++)
		if (id==e.parentNode.childNodes[i].id) return e.parentNode.childNodes[i];
	return null;
};
}
//}}}
// // }}}}}}// // {{block{
/***
!!!890 add conditional test to """<<tiddler>>""" macro
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/890 - OPEN
This tweak extends the {{{<<tiddler>>}}} macro syntax so you can include a javascript-based //test expression// to determine if the tiddler transclusion should be performed:
{{{
<<tiddler TiddlerName if:{{...}} with: param param etc.>>
}}}
If the test is ''true'', then the tiddler is transcluded as usual.  If the test is ''false'', then the transclusion is skipped and //no output is produced//.
***/
//{{{
config.macros.tiddler.if_handler = config.macros.tiddler.handler;
config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	params = paramString.parseParams('name',null,true,false,true);
	if (!getParam(params,'if',true)) return;
	this.if_handler.apply(this,arguments);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!831 backslash-quoting for embedding newlines in 'line-mode' formats
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/831 - OPEN
This tweak pre-processes source content to convert 'double-backslash-newline' into {{{<br>}}} before wikify(), so that literal newlines can be embedded in line-mode wiki syntax (e.g., tables, bullets, etc.)
***/
//{{{
window.coreWikify = wikify;
window.wikify = function(source,output,highlightRegExp,tiddler)
{
	if (source) arguments[0]=source.replace(/\\\\\n/mg,'<br>');
	coreWikify.apply(this,arguments);
}
//}}}
// // }}}}}}// // {{block{
/***
!!!683 FireFox3 Import bug: 'browse' button replacement
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/683 - OPEN
The web standard 'type=file' input control that has been used as a local path/file picker for TiddlyWiki no longer works as expected in FireFox3, which has, for security reasons, limited javascript access to this control so that *no* local filesystem path information can be revealed, even when it is intentional and necessary, as it is with TiddlyWiki.  This tweak provides alternative HTML source that patches the backstage import panel.  It replaces the 'type=file' input control with a text+button combination of controls that invokes a system-native secure 'file-chooser' dialog box to provide TiddlyWiki with access to a complete path+filename so that TW functions properly locate user-selected local files.
>Note: ''This tweak also requires http://trac.tiddlywiki.org/ticket/604 - cross-platform askForFilename()''
***/
//{{{
//if (window.Components) {  SDM per Eric S.
if (false) {
	var fixhtml='<input name="txtBrowse" style="width:30em"><input type="button" value="..."'
		+' onClick="window.browseForFilename(this.previousSibling,true)">';
	var cmi=config.macros.importTiddlers;
	cmi.step1Html=cmi.step1Html.replace(/<input type='file' size=50 name='txtBrowse'>/,fixhtml);
}

merge(config.messages,{selectFile:'Please enter or select a file'}); // ready for I18N translation

window.browseForFilename=function(target,mustExist) { // note: both params are optional
	var msg=config.messages.selectFile;
	if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
	// get local path for current document
	var path=getLocalPath(document.location.href);
	var p=path.lastIndexOf('/'); if (p==-1) p=path.lastIndexOf('\\'); // Unix or Windows
	if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
	var file=''
	var result=window.askForFilename(msg,path,file,mustExist); // requires #604
	if (target && result.length) // set target field and trigger handling
		{ target.value=result; target.onchange(); }
	return result;
}
//}}}
// // }}}}}}// // {{block{
/***
!!!604 cross-platform askForFilename()
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/604 - OPEN
invokes a system-native secure 'file-chooser' dialog box to provide TiddlyWiki with access to a complete path+filename so that TW functions properly locate user-selected local files.
***/
//{{{
window.askForFilename=function(msg,path,file,mustExist) {
	var r = window.mozAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = window.ieAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = window.javaAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = prompt(msg,path+file);
	return r||'';
}

window.mozAskForFilename=function(msg,path,file,mustExist) {
	if(!window.Components) return false;
	try {
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
		var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
		picker.init(window, msg, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
		var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
		thispath.initWithPath(path);
		picker.displayDirectory=thispath;
		picker.defaultExtension='html';
		picker.defaultString=file;
		picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
		if (picker.show()!=nsIFilePicker.returnCancel)
			var result=picker.file.path;
	}
	catch(ex) { displayMessage(ex.toString()); }
	return result;
}

window.ieAskForFilename=function(msg,path,file,mustExist) {
	if(!config.browser.isIE) return false;
	try {
		var s = new ActiveXObject('UserAccounts.CommonDialog');
		s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
		s.FilterIndex=3; // default to HTML files;
		s.InitialDir=path;
		s.FileName=file;
		return s.showOpen()?s.FileName:'';
	}
	catch(ex) { displayMessage(ex.toString()); }
	return result;
}

window.javaAskForFilename=function(msg,path,file,mustExist) {
	if(!document.applets['TiddlySaver']) return false;
	// TBD: implement java-based askFile(...) function
	try { return document.applets['TiddlySaver'].askFile(msg,path,file,mustExist); }
	catch(ex) { displayMessage(ex.toString()); }
}
//}}}
// // }}}}}}// // {{block{
/***
!!!657 wrap tabs onto multiple lines
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/657 - OPEN
This tweak inserts an extra space element following each tab, allowing them to wrap onto multiple lines if needed.
***/
//{{{
config.macros.tabs.handler = function(place,macroName,params)
{
	var cookie = params[0];
	var numTabs = (params.length-1)/3;
	var wrapper = createTiddlyElement(null,'div',null,'tabsetWrapper ' + cookie);
	var tabset = createTiddlyElement(wrapper,'div',null,'tabset');
	tabset.setAttribute('cookie',cookie);
	var validTab = false;
	for(var t=0; t<numTabs; t++) {
		var label = params[t*3+1];
		var prompt = params[t*3+2];
		var content = params[t*3+3];
		var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,'tab tabUnselected');
		createTiddlyElement(tab,'span',null,null,' ',{style:'font-size:0pt;line-height:0px'}); // ELS
		tab.setAttribute('tab',label);
		tab.setAttribute('content',content);
		tab.title = prompt;
		if(config.options[cookie] == label)
			validTab = true;
	}
	if(!validTab)
		config.options[cookie] = params[1];
	place.appendChild(wrapper);
	this.switchTab(tabset,config.options[cookie]);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!628 hide 'no such macro' errors
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/628 - OPEN
When invoking a macro that is not defined, this tweak prevents the display of the 'error in macro... no such macro' message.  This is useful when rendering tiddler content or templates that reference macros that are defined by //optional// plugins that have not been installed in the current document.

<<option chkHideMissingMacros>> hide 'no such macro' error messages
***/
//{{{
if (config.options.chkHideMissingMacros===undefined)
	config.options.chkHideMissingMacros=false;

window.coreTweaks_missingMacro_invokeMacro = window.invokeMacro;
window.invokeMacro = function(place,macro,params,wikifier,tiddler) {
	if (!config.macros[macro] || !config.macros[macro].handler)
		if (config.options.chkHideMissingMacros) return;
	window.coreTweaks_missingMacro_invokeMacro.apply(this,arguments);
}
//}}}
// // }}}}}}
// // <<foldHeadings>>
Saying "I am well".

Today during supper T instructed or mildly confronted me on the topic of how I respond to people when they say, how are you doing? And I reply, I am well.  T believes that people are put off by this.  Then she really showed her colors by saying she thinks it could be a contributor to reason why “people think we are judgmental.”

We talked for a while about this and I smirked a lot, like the moment in “Julia and Julia” when Paul is asked if he is a homosexual and he can’t restrain himself.  Her feeling was that it is good to say, fine, or I'm doing fine.  I'm doing well is slightly better than I am well.  

I am well, she believes, is reserved for when you are sick and you gotten better and we agreed the most common response in Texas is I'm good or I'm doing good.  She agreed that she cringes when she hears it, because it is not good grammar, but it seems that is the price for being socially acceptable.

She adduced as evidence of her view that the “I am well” phrase as not included in the inventory of acceptable phrases provided by the people of Cares clinic.  

I told her I would make an inquiry and check into it and encouraged her to do the same.  I also told her that I don’t believe it has anything at all to do with people perceiving us as judgmental, and that I don't have any real intention of a changing my custom. 
/***
|Name|DOMTweaksPlugin|
|Source|http://www.TiddlyTools.com/#DOMTweaksPlugin|
|Version|1.0.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|set DOM element IDs, add/remove classes and/or reposition rendered elements|
This plugin defines several useful macro-based functions for performing direct manipulation of DOM elements, including setting element ID's, moving elements, and adding/removing classnames from elements.
!!!!!Usage
<<<
{{{<<DOM setID id force>>}}}
>assign an ID to the DOM element in which this macro is being rendered.  If the current DOM element already has an ID, the new ID will //not// replace  the current ID, unless you include the additional "''force''" keyword parameter.  (note: requiring this extra parameter helps minimize any problems that may arise if an existing, system-assigned ID is unintentionally re-assigned due to mis-placement of the macro... e.g., renaming 'mainMenu' or 'header' is NOT a good idea, and is prevented unless "force" is used)
{{{<<DOM move id>>}}}
>Move any uniquely identified DOM element to the current rendering location.  Allows dynamic relocation of standard TW elements such as 'sidebar', 'mainMenu', as well as any other DOM elements that have an ID assigned to them (via the {{{<<DOM setID id>>}}} macro).  You can also use this macro to move [[NestedSlidersPlugin]]-generated slider/floating panels that have had an ID assigned to them (using either the {{{<<DOM setID id>>}}} macro or the NestedSlidersPlugin {{{#panelID:}}} syntax).
{{{<<DOM addclass classname>>}}}
>add a classname to the DOM element in which this macro is being rendered
{{{<<DOM removeClass classname>>}}}
>remove a classname from the DOM element in which this macro is being rendered
<<<
!!!!!Revisions
<<<
2007.07.20 [1.0.1] in setID handler, check for existing ID so multiple elements don't get the same ID.  Also added basic parameter checks.
2007.07.20 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.DOMTweaksPlugin= {major: 1, minor: 0, revision: 1, date: new Date(2007,7,20)};
config.macros.DOM= {
    handler: function(place,macroName,params) {
        if (!params.length) return;
        switch (params[0].toUpperCase()) {
            case "SETID":
                if (!params[1]) return;
                if (place.id==params[1]) break; // already has this ID... do nothing!
                if (document.getElementById(params[1])) // if ID is already used by something else
                    displayMessage("DOMTweaks: ID already in use: '"+params[1]+"'");
                else if (!place.id.length || params[2]&&params[2].toUpperCase=="FORCE")
                    place.id=params[1]; // set (or clear) the ID
                else
                    displayMessage("DOMTweaks: to re-assign existing ID for '"+place.id+"', use the 'Force' option... Luke. :-)" );
                break;
            case "MOVE":
                if (!params[1]) return;
                var e=document.getElementById(params[1]); if (e) place.insertBefore(e,null);
                break;
            case "ADDCLASS":
                if (!params[1]) return;
                if (addClass instanceof Function) addClass(place,params[1]);
                break;
            case "REMOVECLASS":
                if (!params[1]) return;
                if (removeClass instanceof Function) removeClass(place,params[1]);
                break;
        }
    }
}
//}}}
/***
|Name|DOMViewerPlugin|
|Source|http://www.TiddlyTools.com/#DOMViewerPlugin|
|Version|1.8.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|display internal Document Object Model for wiki-formatted content|
Whenever TiddlyWiki renders a given tiddler, it creates a 'tree' of DOM (Document Object Model) elements that represent the information that is displayed by the browser.  You can use the ''DOMViewer'' macro to examine the internal DOM elements that are produced by TiddlyWiki's formatter (the 'wikifier'), or elements directly produced by embedded macros that create custom formatted output.  This can be particularly helpful when trying to fine tune the layout and appearance of your tiddler content.
!!!!! Usage/Example:
<<<
syntax: {{{<<DOMViewer rows:nn indent:xxxx inline path elementID|tiddlertitle>>}}}

DOMViewer creates a textarea control and reports the DOM tree for the current 'insertion point' where the DOMViewer macro is being placed.  ''inline'' flag uses TiddlyWiki rendering instead of textarea control. ''path'' shows the relative location of each child element in the DOM tree, using subscript notation, ''[elementID or tiddlertitle]'' displays DOM elements starting from the node with the specified ID.  If that ID is not found in the DOM tree, the macro attempts to open a tiddler with that title and then displays the DOM elements that were rendered for that tiddler.

<<DOMViewer tiddlerDOMViewerPlugin>>
<<<
!!!!!Revisions
<<<
2010.11.30 1.8.1 use story.getTiddler()
2007.09.27 1.8.0 split DOMViewer macro into separate plugin (see [[TidIDEPlugin]])
|please see [[TidIDEPluginInfo]] for additional revision details|
2006.04.15 0.5.0 Initial ALPHA release. Converted from inline script.
<<<
!!!!!Code
***/
//{{{
version.extensions.DOMViewerPlugin= {major: 1, minor: 8, revision: 1, date: new Date(2010,11,30)};
config.macros.DOMViewer = {
    handler: function(place,macroName,params) {
        // set default params
        var inline=false;
        var theRows=15;
        var theIndent="|  ";
        var showPath=false;
        var theTarget=place;
        // unpack options parameters
        if (params[0]=='inline') { inline=true; theIndent=">"; params.shift(); }
        if (params[0]&&(params[0].substr(0,7)=="indent:")) { theIndent=params[0].substr(7); params.shift(); }
        if (params[0]&&(params[0].substr(0,5)=="rows:")) { theRows=params[0].substr(5); params.shift(); }
        if (params[0]=='path') { showPath=true; params.shift(); }
        if (params[0]) { var title=params[0]
            theTarget=document.getElementById(title);
            if (!theTarget)
                if (store.getTiddler(title)!=undefined) {
                    theTarget=story.getTiddler(title);
                    if (!theTarget && confirm("DOMViewer asks:\n\nIs it OK to open tiddler '"+title+"' now?")) {
                        story.displayTiddler(null,title,1,null,null,false);
                        theTarget=story.getTiddler(title);
                    }
                }
            params.shift();
        }
        // generate and display DOM tree
        if (inline) {
            var out=this.getNodeTree(theTarget,theIndent,showPath,inline);
            wikify(out,place);
        }
        else {
            var out=this.getNodeTree(theTarget,theIndent,showPath,inline);
            var css=".DOMViewer{width:100%;font-size:8pt;color:inherit;background:transparent;border:0px;}";
            setStylesheet(css,"DOMViewerStylesheet");
            var theTextArea=createTiddlyElement(place,"textarea",null,"DOMViewer",out);
            theTextArea.rows=theRows;
            theTextArea.cols=60;
            theTextArea.wrap="off";
            theTextArea.theTarget=theTarget;
            theTextArea.theIndent=theIndent;
            theTextArea.showPath=showPath;
        }
    },
    getNodeTree: function(theNode,theIndent,showPath,inline,thePrefix,thePath) {
        if (!theNode) return "";
        if (!thePrefix) thePrefix="";
        if (!thePath) thePath="";
        var mquote='"'+(inline?"{{{":"");
        var endmquote=(inline?"}}}":"")+'"';
        // generate output for this node
        var out = thePrefix;
        if (showPath && thePath.length)
            out += (inline?"//":"")+thePath.substr(1)+":"+(inline?"//":"")+"\r\n"+thePrefix;
        if (theNode.className=="DOMViewer")
            return out+'[DOMViewer]\r\n'; // avoid self-referential recursion
        out += (inline?"''":"")+theNode.nodeName.toUpperCase()+(inline?"''":"");
        if (theNode.nodeName=="#text")
            out += ' '+mquote+theNode.nodeValue.replace(/\n/g,'\\n')+endmquote;
        if (theNode.className)
            out += ' class='+mquote+theNode.className+endmquote;
        if (theNode.type)
            out += ' type='+mquote+theNode.type+endmquote;
        if (theNode.id)
            out += ' id='+mquote+theNode.id+endmquote;
        if (theNode.name)
            out += " "+theNode.name+(theNode.value?"="+mquote+theNode.value+endmquote:"");
        if (theNode.href)
            out += ' href='+mquote+theNode.href+endmquote;
        if (theNode.src)
            out += ' src='+mquote+theNode.src+endmquote;
        if (theNode.attributes && theNode.getAttribute("tiddlyLink")!=undefined)
            out += ' tiddler='+mquote+theNode.getAttribute("tiddlyLink")+endmquote;
        out += "\r\n";
        // recursively generate output for child nodes
        thePath=thePath+"."+theNode.nodeName.toLowerCase();
        thePrefix=theIndent+thePrefix;
        for (var i=0;i<theNode.childNodes.length;i++) {
            var thisChild=theNode.childNodes.item(i);
            var theNum=(inline?"~~":"(")+(i+1)+(inline?"~~":")");
            out += this.getNodeTree(thisChild,theIndent,showPath,inline,thePrefix,thePath+theNum);
        }
        return out;
    }
}
//}}}
* [[Correcting-speech]]
[[About These Notes]]
[[Aspergers-traits-overview]]
[[Topic-Index]]
[[AutismSpectrum-MyTrials]]
Probably in 2016 I brought this list to a counseling session.  We worked through it over a month or two.  Praise God: they are mostly reduced, and when I point one out she sometimes listens and relents.  
# Minimize the problem (try to make it go away) by saying the problem is mine, not hers.
# Minimize by saying we have different perspectives due to upbringing.
# Minimize  ... due to gender.
# Minimize  ... due to inherent personality.
# Discredit my view, due to any of the above.
# Tell me I am not listening to her.
# Tell me I am not respecting her values.
# Tell me I am not respecting her emotions.
# Rehearse background information that is sometimes radically skewed to support her position.
# Deliver a personal attack against me that is completely unrelated.
# Deliver a personal attack against me that is related, but based in distant past which we understand to be resolved.
# Make an outlandish accusation.
# Make me responsible for fixing her (I should change so she can change).
# Discredit the source of support I offer (that pastor was mean, that person's not a believer).
# Tell me I'm unfit to lead for this week (or this year), due to any of the above.
# Offer to fix the problem by fixing herself somehow (or say it is already fixed); a form of minimizing.
# Withhold another relational blessing.
# ''Delaying tactics:'' Say it reminds her of something from her past; start re-experiencing.
# Attach background information and apply one of the other defensive tactics.
# Demand we bring someone else into the discussion.  Sometimes there is no one qualified and available.
# Start a dispute on a peripheral issue; deny it's peripheral.
# Shift from the specific to the general, or the general to the specific, to add complexity or extraneous aspects.
# Demand we pray about it some more.
# Fall into introspective despair about how to change her fault that is creating the problem.
# Fall into introspective despair about how to change her weakness that is creating the defensiveness.
# Launch into action plans to fix her fault that is creating the problem or the defensiveness.
# Launch into action plans to fix the problem with me ("Make me responsible" above).
# Compare herself to others who are bad or good for validation
# Compare me to others who are bad or good for validation
* Desensitization training for the dog is immoral, for it amounts to defrauding the dog.  For example, the dog expects a treat whenever that kitchen drawer is opened.  Therefore one must avoid opening the drawer unless a treat is offered. The standard advice is to open and close the drawer randomly until the dog ceases expecting a treat; To her this is deliberate cruelty. 
* [[Coat-hook-in-living-room]]
* Painful sex. Reported late. Then much recrimination, and eventually understanding and peace.  This is probably a typical patten in marriage -- but the cycle for her, I believe, takes a magnitude longer than typical. 
Adoni-Zedek
Adoni-Bezek
McClung

URLs
FoO (family of origin)
BeBroken

HowTo To-Do ToDo
FireFox
PalmOne
SafeEyes
DansGuardian
DreamHost
PortableApps
CherishTheCross
SharePoint
OutReach
TEK-Systems KForce
NetID
NiceForms
O-Desk ODesk
OpenID
PDFs DVDs CDs
SX100
NiMH
DejaVu San-Serif
AutoSave
HTML5 CSS3 PHP5
PayPal
PostgreSQL
SnappyWords
PottyBot
SoF
RPGs
Saint-Exup�ry
AmEx
Aubrey-Maturin
BoD BoM
Full-Time Part-Time

A-Z

TiddlyWiki TiddlyTools TiddlyTech TiddlySpace
WikiWord
$1 $2 $3 $4 $5 $6 A-Z
PrimaryDark PrimaryLight PrimaryMid PrimaryPale
SecondaryDark SecondaryLight SecondaryMid SecondaryPale
TertiaryDark TertiaryLight TertiaryMid TertiaryPale
QuaternaryPale QuaternaryLight QuaternaryMid QuaternaryDark
/***
|Name|DisableWikiLinksPlugin|
|Source|http://www.TiddlyTools.com/#DisableWikiLinksPlugin|
|Version|1.6.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|
This plugin allows you to disable TiddlyWiki's automatic ~WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links.  To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.
!!!!!Usage
<<<
You can block automatic WikiWord linking behavior for any specific tiddler by ''tagging it with<<tag excludeWikiWords>>'' (see configuration below) or, check a plugin option to disable automatic WikiWord links to non-existing tiddler titles, while still linking WikiWords that correspond to existing tiddlers titles or shadow tiddler titles.  You can also block specific selected WikiWords from being automatically linked by listing them in [[DisableWikiLinksList]] (see configuration below), separated by whitespace.  This tiddler is optional and, when present, causes the listed words to always be excluded, even if automatic linking of other WikiWords is being permitted.

Note: WikiWords contained in default ''shadow'' tiddlers will be automatically linked unless you select an additional checkbox option lets you disable these automatic links as well, though this is not recommended, since it can make it more difficult to access some TiddlyWiki standard default content (such as AdvancedOptions or SideBarTabs)
<<<
!!!!!Configuration
<<<
<<option chkDisableWikiLinks>> Disable ALL automatic WikiWord tiddler links
<<option chkAllowLinksFromShadowTiddlers>> ... except for WikiWords //contained in// shadow tiddlers
<<option chkDisableNonExistingWikiLinks>> Disable automatic WikiWord links for non-existing tiddlers
Disable automatic WikiWord links for words listed in: <<option txtDisableWikiLinksList>>
Disable automatic WikiWord links for tiddlers tagged with: <<option txtDisableWikiLinksTag>>
<<<
!!!!!Code
***/
//{{{
version.extensions.DisableWikiLinksPlugin= {major: 1, minor: 6, revision: 0, date: new Date(2008,7,22)};

if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks=false;
if (config.options.txtDisableWikiLinksList==undefined) config.options.txtDisableWikiLinksList="DisableWikiLinksList";
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;
if (config.options.txtDisableWikiLinksTag==undefined) config.options.txtDisableWikiLinksTag="excludeWikiWords";

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
    for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
    config.formatters[i].coreHandler=config.formatters[i].handler;
    config.formatters[i].handler=function(w) {
        // supress any leading "~" (if present)
        var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
        var title=w.matchText.substr(skip);
        var exists=store.tiddlerExists(title);
        var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);
        // check for excluded Tiddler
        if (w.tiddler && w.tiddler.isTagged(config.options.txtDisableWikiLinksTag))
            { w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
        // check for specific excluded wiki words
        var t=store.getTiddlerText(config.options.txtDisableWikiLinksList);
        if (t && t.length && t.indexOf(w.matchText)!=-1)
            { w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
        // if not disabling links from shadows (default setting)
        if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)
            return this.coreHandler(w);
        // check for non-existing non-shadow tiddler
        if (config.options.chkDisableNonExistingWikiLinks && !exists)
            { w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
        // if not enabled, just do standard WikiWord link formatting
        if (!config.options.chkDisableWikiLinks)
            return this.coreHandler(w);
        // just return text without linking
        w.outputText(w.output,w.matchStart+skip,w.nextMatch)
    }
}

Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
    // if all automatic links are not disabled, just return results from core function
    if (!config.options.chkDisableWikiLinks)
        return this.coreAutoLinkWikiWords.apply(this,arguments);
    return false;
}

Tiddler.prototype.disableWikiLinks_changed = Tiddler.prototype.changed;
Tiddler.prototype.changed = function()
{
    this.disableWikiLinks_changed.apply(this,arguments);
    // remove excluded wiki words from links array
    var t=store.getTiddlerText(config.options.txtDisableWikiLinksList,"").readBracketedList();
    if (t.length) for (var i=0; i<t.length; i++)
        if (this.links.contains(t[i]))
            this.links.splice(this.links.indexOf(t[i]),1);
};
//}}}
2014-05

(Follows [[Onerous-discussion]])

Another difficult aspect is all those things that don't get shared. I am so afraid to bring many matters to T. Right now I need to explain to her that the insurance at Robert half technology is perhaps not suitable for us because there is no benefit at all for mental health, or behavioral health as they call it. This is a task I do not anticipate with pleasure, because T will be outraged and angry, and it is very hard not to take it as a personal slight against me, even though of course I should not. I will not hear from T the helpful thing I wish I could hear: oh, that's sad news, I wish they would not do that; now we are going to have to figure out something else. That would be the kind of thing you say that leads to a sense of solidarity, but T has trouble with solidarity.

Then I must explain to T, if it were possible, that perhaps it is just the insurance we need anyway because if we add up all of her psychiatrist visits in counseling visits, we still come out ahead compared with paying this incredible insurance bill which is dragging us into destitution. I don't think that conversation will be very easy.

Maybe it would be a good idea if we set aside time for me to have my own time to monologue on some evenings. I'm not sure that really works out so well. I think what tends to happen is that we both watch the clock till I'm done, then T says, is it my turn now? And then she starts talking, and the weight of stones begins to gather. But how can that be any worse?
EMERGENCY (DISSOCIATION) PROCEDURES
On rare occasions, T may have a dissociative episode that is triggered by
something that has happened. Sometimes, this occurs in response to a graphic
description of violence or threats. T does her best therefore to avoid such
situations, but sometimes is unaware that they are about to occur. When this
occurs, she may have difficulty getting out of the episode. This is quite distressful
for her, not in small amount because she has difficulty describing what is going on
and what she needs at the time. During the times that she dissociates, T
typically has a great deal of fear. She may visibly tremble, and will have difficulty
speaking. Her face becomes slack or blank, and it will be difficult tor read her
feelings. There is associated physical weakness that makes walking difficult.
While these episodes are mentally taxing for her, she is in no physical danger and
does not need to see a physician. This list has been prepared to be an aide in
dealing with such dissociative episodes. When the episode has passed, T will
be able to clearly tell the helper that she is feeling better. It may take minutes or
hours to get to this point. The following are helpful:
1. Provide a lighted environment. Darkness does not work well at
all during these times.
2. Get a blanket, pillows. Wrap tightly to have the feeling of safety
and containment. Place the pillows around and over bod to
continue to reinforce the feeling of containment.
3. Make and hold eye contact. Hold hand or rub arms.
4. Pray audibly for containment. Particularly useful is to pray for
God to provide containment and armor against the intrusive
thoughts that are disturbing.
5. Give reminders that T is here in the present: Remind of
date, place, relationships, abilities.
6. Have her tap her feet on the floor to give a sense of grounding.
7. Offer food. She may be too upset to have an appetite, but these
episodes are very draining and likely to deplete her energy, plus
they may be more likely to be triggered when she needs to eat.
Replenishing protein would be particularly useful (nuts, cheese,
meat, yogurt).
8. Ask if T has taken her last prescribed doses of medication.
9. Read scripture aloud, particularly of God's promises to us. See
other side of this page.
Thanks for being a helper.
[[GettingStarted]]
[[AdvancedOptions]]
[[cookieJar]]
----
<<tiddler ShowPopup with:
    DocumentSetup##cookies ~CookieManager "view/modify option cookie settings" tiddlyLinkExisting auto sticky>>
<<tiddler ShowPopup with:
    DocumentSetup##tweaker ~TiddlerTweaker "view/modify tiddler values" tiddlyLinkExisting auto sticky>>
----
<<tiddler ShowPopup with:
    DocumentSetup##templates templates "list templates" tiddlyLinkExisting auto>>
<<tiddler ShowPopup with:
    DocumentSetup##stylesheets stylesheets "list stylesheets" tiddlyLinkExisting auto>>
<<tiddler ShowPopup with:
    DocumentSetup##menus menus "list menus" tiddlyLinkExisting auto>>/%
!cookies
{{center{
[[Browser cookies:|CookieManagerPlugin]] {{fine{<<option chkAllowBrowserCookies>>enable <<option chkMonitorBrowserCookies>>monitor}}}
{{fine{
----
{{smallform small{<<cookieManager>>}}}
}}}
!tweaker
{{smallform{
<<tiddlerTweaker>>}}}
!templates
<<matchTags "%0" "<br>" sort:title template>>
!stylesheets
<<matchTags "%0" "<br>" sort:title stylesheet>>
!menus
<<matchTags "%0" "<br>" sort:title menu>>
!end
%/
[[Proprioception]]
[[Spatial-perception]]

* When turns on or off a lamp, looks at the lamp, perhaps at the bulb.
* When reading, does not perceive her own shadow blocking the light.
* When speaking or thinking, inattentive with her eyes, gazes at the light.
* Breaks the sponge mop by trying to wring the sponge after a brief dip, when it isn't yet pliable.  I instruct her to give let in soak for one minute, so from then on she sets a timer for sixty seconds.  
* Stowing the cord for the vacuum cleaner:  first too tight; I protest repeatedly.  Finally the insulation shows a break.  She is convinced.  Now too loose, so the cord falls off the hooks very easily.  
* Meat doesn't thaw in fridge.  An explicit instruction with authority can overrule this (notably the Thanksgiving turkey).  A loaf of sliced bread can hardly be trusted to thaw in the refrigerator.
* Meat can't thaw if it's on wrong counter, it doesn't get enough of the circulated heat.  (This is regardless of the season or climate control setting.) 
* Meats thaw at same rate.  Pork chops are not known to thaw more quickly than chicken breast; hamburger is not known to thaw more quickly than pork chops.  
* I see Melisa putting the cap on the ballpoint pen; her urgency prompts me to ask why she does that. It turns out she thinks ballpoint pens dry out if the cap is off. I say, "Ball pens don't dry out. Remember at the bank, they had those pens attached by a chain to the counter? They had no cap, and they didn't dry out." She is struck, shocked - so severe it suggests a betrayal. (Year 31)
* When she's using a knife to chop food and moving the pieces out of the way, she //s-c-r-a-p-e-s// the edge of the blade on the surface of the board.   (Year 33)
** I realize this is why I have to sharpen the knives so often. 
** I think most of us avoid of this easily, possibly without ever being told. But Melisa needs several rounds and an exact description of the motion, how you lift the knife high enough to not contact the board but low enough to move the food.  
** And a week later, there she is scraping again. 
* The MW leaks electricity, or worse.  She tries to talk herself out of this one.  
* How a road drains water after a rain: You mean it has a shape?  They must plan it that way? 
* [[Glass-on-the-edge]]
/***
|Name|[[EditFieldPlugin]]|
|Source|http://www.TiddlyTools.com/#EditFieldPlugin|
|Version|1.6.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|extend core edit macro for use in ViewTemplates or direct embedding in tiddler content|
!!!!!Documentation
>see [[EditFieldPluginInfo]]
!!!!!Revisions
<<<
2011.04.10 1.6.2 fixed 'null' fieldname handling in Chrome
| Please see [[EditFieldPluginInfo]] for previous revision details |
2007.08.22 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.EditFieldPlugin= {major: 1, minor: 6, revision: 2, date: new Date(2011,4,10)};

config.macros.edit.editFieldPlugin_savedHandler=config.macros.edit.handler;
config.macros.edit.cancelMsg = "Abandon changes to %0@%1?";
config.macros.edit.saveMsg = "Save changes to %0@%1?";
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) {

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

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

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

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

    // if viewing tiddler, add autosave handlers
    var here=story.findContainingTiddler(place);
    var isViewed=here&&here.getAttribute("template").indexOf("ViewTemplate")!=-1;
    if (parts[1]||isViewed) { // remote reference or view mode editing...
        story.setDirty(tiddler.title,false); // clear tiddler ("dirty") flag (set by core)
        e.onkeydown=function(ev) { // ENTER key=save (for single-line input)
            var event=ev?ev:window.event;
            this.setAttribute("keyCode",event.keyCode); // save last keyCode (for blur)
            if (event.keyCode==13 && this.nodeName.toUpperCase()!="TEXTAREA")
                this.saveField(); // save input to tiddler field
        }
        e.onblur=function(ev) { // confirm input when focus moves away
            var event=ev?ev:window.event;
            var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
            var field=this.getAttribute("edit")||this.getAttribute("field");
            if (this.value==this.getAttribute("currval")) return; // no change
            if (this.getAttribute("keyCode")=="27") { // if user pressed ESC
                var msg=config.macros.edit.cancelMsg.format([field,tid]);
                if (!msg.length || confirm(msg))
                    this.value=this.getAttribute("currval"); // reset value
                this.id=new Date().getTime(); // unique ID for re-focus after blur
                setTimeout("document.getElementById('"+this.id+"').focus()",1);
            } else { // other focus change events
                var msg=config.macros.edit.saveMsg.format([field,tid]);
                if (!msg.length || confirm(msg)) this.saveField(); // save value
                else this.value=this.getAttribute("currval");
            }
        };
        e.saveField=function() { // unpack/validate attribs and then save the field
            var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
            var field=this.getAttribute("edit")||this.getAttribute("field");
            var title=(field=="title")?this.value:tid;
            if (!title.length) { // error: blank tiddler title
                this.value=this.getAttribute("currval"); // reset value
                this.id=new Date().getTime(); // unique ID for delayed messages/refocus
                setTimeout("displayMessage('Please enter a non-blank value')",1);
                setTimeout("document.getElementById('"+this.id+"').focus()",2);
                return;
            }
            config.macros.edit.saveField(tid,title,field,this.value);
            this.setAttribute("currval",this.value); // remember new starting value
        };
    }
}
//}}}
//{{{
// save input value to tiddler field (create/touch/rename tiddler as needed)
config.macros.edit.saveField = function(tid,title,field,val) {
    var t=store.getTiddler(tid);
    store.suspendNotifications();
    var anim=config.options.chkAnimate; config.options.chkAnimate=false; // suspend animation
    var who=t&&config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
    var when=t&&config.options.chkForceMinorUpdate?t.modified:new Date();
    store.saveTiddler(t?tid:title,title,t?t.text:"",who,when,t?t.tags:[],t?t.fields:null);
    store.setValue(title,field,val); // save field
    if (tid!=title) // new title... show renamed tiddler in place of current one
        { story.displayTiddler(story.getTiddler(tid),title); story.closeTiddler(tid); }
    if (field=="text") // content changed, refresh tiddler display
        { story.refreshTiddler(title,null,true); }
    config.options.chkAnimate=anim; // resume animation
    store.resumeNotifications();
    store.notify(title,true);
}
//}}}
<!--{{{-->
<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><span macro='tiddler QuickEditToolbar with: show'></span></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>
<!--}}}--><span macro='resizeEditor'></span>
<!--{{{-->
<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><span macro='tiddler QuickEditToolbar with: show'></span></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>
<!--}}}--><span macro='resizeEditor'></span>
/***
|Name|EditTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#EditTiddlerPlugin|
|Version|1.3.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|embed an 'edit' link in tiddler content to invoke edit on any specified tiddler title|
!!!!!Usage
<<<
{{{
<<editTiddler TiddlerName label>>
}}}
*''~TiddlerName''<br>the title of the tiddler to edit (omit or use the keyword 'here' for current //containing// tiddler)
*''label''<br>command link text (default="edit")
The plugin also adds ''ctrl-enter'' as a ''keyboard shortcut to start editing'' the current //selected// tiddler (the one with an active toolbar menu)
<<<
!!!!!Revisions
<<<
2009.08.15 1.3.1 in shortcut, invoke editTiddler command handler (sets focus and custom fields)
2009.08.14 1.3.0 added CTRL-ENTER keyboard shortcut to invoke edit for 'selected' tiddlers
2007.03.22 1.2.0 added 'here' keyword and optional 2nd param to specify label text
2007.03.15 1.1.1 fixed 'get tiddler ID' logic so it actually works! D'oh!
2007.03.11 1.1.0 changed 'get tiddler ID' logic so that macro can be used outside a tiddler (i.e., in mainMenu) by specifying the ID
2006.10.04 1.0.1 invoke findContainingTiddler() as fallback when 'tiddler' param is null
2006.04.28 1.0.0 Initial release
<<<
!!!Code
***/
//{{{
version.extensions.EditTiddlerPlugin={major:1, minor:3, revision:1, date: new Date(2009,8,15)};

config.macros.editTiddler={
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var tid=params.shift(); // use specified tiddler ID (or "here")
        if (!tid || tid=="here") {
            var here=story.findContainingTiddler(place);
            if (!here) return; // not in a tiddler, do nothing
            tid=here.getAttribute('tiddler'); // get ID from tiddler element
        }
        var label="edit"; if (params[0]) label=params.shift();
        createTiddlyButton(place,label,'edit tiddler: '+tid,this.onclick).setAttribute('which',tid);
    },
    onclick: function(e) {
        story.displayTiddler(null,this.getAttribute('which'),DEFAULT_EDIT_TEMPLATE);
    }
}
//}}}
//{{{
    addEvent(document,'keypress', function(ev) { var ev=ev||window.event;
        if (!ev.ctrlKey || ev.keyCode!=13) return; // CTRL-ENTER = edit tiddler
        story.forEachTiddler(function(title,tiddler){
            if (hasClass(tiddler,'selected') && !story.isDirty(title))
                config.commands.editTiddler.handler(ev,null,title);
        });
        return false;
    });
//}}}
/***
!Description

!CSS
***/
/*{{{*/
.main{position:relative;}
.lf0,.lf5,.lf10,.lf15,.lf20,.lf25,.lf30,.lf35,.lf40,.lf45,.lf50,.lf55,.lf60,.lf65,.lf70,.lf75,.lf80,.lf85,.lfn5,.lfn10,.lfn15,.lfn20,.lfn25,.lfn30,
.tp0,.tp5,.tp10,.tp15,.tp20,.tp25,.tp30,.tp35,.tp40,.tp45,.tp50,
.bt0,.bt5,.bt10,.bt15,.bt20,.bt25,.bt30,.bt35,.bt40,.bt45,.bt50,
.rtn5,.rtn10,.rtn20,.rtn30{position:absolute;}
.lf0{left:0em;}
.lf5{left:5em;}
.lf10{left:10em;}
.lf15{left:15em;}
.lf20{left:20em;}
.lf25{left:25em;}
.lf30{left:30em;}
.lf35{left:35em;}
.lf40{left:40em;}
.lf45{left:45em;}
.lf50{left:50em;}
.lf55{left:55em;}
.lf60{left:60em;}
.lf65{left:65em;}
.lf70{left:70em;}
.lf75{left:75em;}
.lf80{left:80em;}
.lf85{left:85em;}
.lfn5{left:-5em;}
.lfn10{left:-10em;}
.lfn15{left:-15em;}
.lfn20{left:-20em;}
.lfn25{left:-25em;}
.lfn30{left:-30em;}

.rtn5{right:-5em;}
.rtn10{right:-10em;}
.rtn15{right:-15em;}
.rtn20{right:-20em;}
.rtn25{right:-25em;}
.rtn30{right:-30em;}

.tp0{top:0em;}
.tp5{top:5em;}
.tp10{top:10em;}
.tp15{top:15em;}
.tp20{top:20em;}
.tp25{top:25em;}
.tp30{top:30em;}
.tp35{top:35em;}
.tp40{top:40em;}
.tp45{top:45em;}
.tp50{top:50em;}
.bt0{bottom:0em;}
.bt5{bottom:0em;}
.bt10{bottom:10em;}
.bt15{bottom:15em;}
.bt20{bottom:20em;}
.bt25{bottom:25em;}
.bt30{bottom:30em;}
.bt35{bottom:35em;}
.bt40{bottom:40em;}
.bt45{bottom:45em;}
.bt50{bottom:50em;}
.zi1{ z-index:1;}
.zi2{ z-index:2;}
.zi3{ z-index:3;}
.zi4{ z-index:4;}
.zi5{ z-index:5;}
/*}}}*/
/***
!Description
2010.01.21
<<<
*pplx added
<<<
!CSS
***/
/*{{{*/
/* CSS Document */
.rc {border-radius:3px; border:1px solid #fff; }
.fr {border:1px solid #ccc; padding:0.25em;}

.byline {
font-family: "Lucida Grande", Tahoma;
    font-size: 0.865em;
    font-weight: lighter;
    font-variant: normal;
    text-transform: uppercase;
    color: #666666;
    letter-spacing: 0.4em;
    display: block;
    margin-bottom: 1.734em;
    padding:0em 0em 0em 1em;
    }

.and {font-family: Baskerville, "Goudy Old Style", "Palatino", "Book Antiqua", serif;
    font-style: italic;
    color: #777;
    }



.tc {text-align:center;}
.tr {text-align:right;}
.tl {text-align:left;}
.b{ font-weight:bold;}
.pl1{padding-left:1em;}
.pl2{padding-left:2em;}
.pl3{padding-left:3em;}

.ppl2{padding-left:1.8%;}
.ppl3{padding-left:3.13%;}
.ppl5{padding-left:4.8%;}


.water{color:#5582d1;}
.earth{color:#4e3e2c;}
.air{color:#f1fff7;}
.fire{ color:#ff8a19;}
 /* drinks food */
 .wine{color:#4a040a;}
 .beer{color:#F0C030;}
 .caffe{color:#473523;}
 .caffe-cream{color:#b68d3d;}
 .espresso{color:#2c1901;}
 .caramel{color:#ab671f;}
 .chocolate{color:#290200;}
 .black-pepper{color:#444334;}
 .pepper-lite{color:#8d8a72;}

 .lipstick{color:#c20c0c;}
 .oldbook{font-family:"Book Antiqua","Warnock Pr","Goudy Old Style","Palatino",Georgia,serif;}
.note{font-family:Georgia, "Times New Roman", Times, serif; font-style:italic; font-size:0.9em; margin:0.1em; color:#333;}
.mono{font-family:"Courier New", Courier, monospace;}
/*}}}*/
/***
!Description

!CSS
***/
/*{{{*/
.main {
width:70em;margin:0 auto;text-align:left;  }

.clear {clear:both;}

.dl1,
.dl2,
.dl5,
.dl10,
.dl15,
.dl20,
.dl25,
.dl30,
.dl35,
.dl40,
.dl45,
.dl50,
.dl55,
.dl60,
.dl65,
.dl70,
.dl75{float:left; display: inline; }

.dr1,
.dr2,
.dr5,
.dr10,
.dr15,
.dr20,
.dr25,
.dr30,
.dr35,
.dr40,
.dr45,
.dr50,
.dr55,
.dr60,
.dr65,
.dr70,
.dr75
{float:right; display: inline; }

.dl1, .dr1 {width:1em;}
.dl2, .dr2 {width:2em;}
.dl5, .dr5{width:5em;}
.dl10, .dr10{width:10em;}
.dl15, .dr15{width:15em;}
.dl20, .dr20{width:20em;}
.dl25, .dr25{width:25em;}
.dl30, .dr30{width:30em;}
.dl35, .dr35{width:35em;}
.dl40, .dr40{width:40em;}
.dl45, .dr45{width:45em;}
.dl50, .dr50{width:50em;}
.dl55, .dr55{width:55em;}
.dl60, .dr60{width:60em;}
.dl65, .dr65{width:65em;}
.dl70, .dr70{width:70em;}
.dl75, .dr75{width:75em;}


.ml5{margin-left:5em;}
.ml10{margin-left:10em;}
.ml15{margin-left:15em;}
.ml20{margin-left:20em;}
.ml25{margin-left:25em;}
.ml30{margin-left:30em;}
.ml35{margin-left:35em;}
.ml40{margin-left:40em;}
.ml45{margin-left:45em;}
.ml50{margin-left:50em;}
.ml55{margin-left:55em;}
.ml60{margin-left:60em;}
.ml65{margin-left:65em;}
.ml70{margin-left:70em;}
.ml75{margin-left:75em;}

.mr5{margin-right:5em;}
.mr10{margin-right:10em;}
.mr15{margin-right:15em;}
.mr20{margin-right:20em;}
.mr25{margin-right:25em;}
.mr30{margin-right:30em;}
.mr35{margin-right:35em;}
.mr40{margin-right:40em;}
.mr45{margin-right:45em;}
.mr50{margin-right:50em;}
.mr55{margin-right:55em;}
.mr60{margin-right:60em;}
.mr65{margin-right:65em;}
.mr70{margin-right:70em;}
.mr75{margin-right:75em;}

.mt1{margin-top:1em;}
.mt5{margin-top:5em;}
.mt10{margin-top:10em;}
.mt20{margin-top:20em;}
.mt30{margin-top:30em;}
.mt40{margin-top:40em;}
.mt50{margin-top:50em;}

.fluid {width:auto;    float:none;}

.hp{width:100%;  float:left; }

.clearfix, .main{ display:block;}

.clearfix:after, .main:after {
     visibility: hidden;
     display: block;
     font-size: 0;
     content: " ";
     clear: both;
     height: 0;

     }

/* IE5/MAC hack \*/
* html .clearfix{ display: inline;  height: 1px;}
/* close */
/*}}}*/
/*{{{*/
.dp5,
.dp10,
.dp15,
.dp20,
.dp25,
.dp30,
.dp33,
.dp35,
.dp40,
.dp45,
.dp50,
.dp55,
.dp60,
.dp65,
.dp67,
.dp70,
.dp75,
.dp80,
.dp85,
.dp90,
.dp95,
.dp100
{float:left; display: inline; }

.dp5{width:5%;}
.dp10{width:10%;*width:9.9%;}
.dp15{width:15%;*width:14.9%;}
.dp20{width:20%;*width:19.9%;}
.dp25{width:25%;*width:24.9%; }
.dp30{width:30%;*width:29.9%;}
.dp33{width:33.33%;*width:33.3%;}
.dp35{width:35%;*width:34.9%;}
.dp40{width:40%;*width:39.9%;}
.dp45{width:45%;*width:44.9%;}
.dp50{width:50%;*width:49.9%;}
.dp55{width:55%;*width:54.9%;}
.dp60{width:60%;*width:59.9%;}
.dp65{width:65%;*width:64.9%;}
.dp67{width:66.67%;*width:66.6%;}
.dp70{width:70%;*width:69.9%;}
.dp75{width:75%;*width:74.9%;}
.dp80{width:80%;*width:79.9%;}
.dp85{width:85%;*width:84.9%;}
.dp90{width:90%;*width:89.9%;}
.dp95{width:95%;*width:94.9%;}
.dp100{width:100%;*width:99.9%;}
/*}}}*/
/***
Here are the changes, that have to be made, to overwrite the core predefinitions.
***/
/*{{{*/
/*-- new for clearing floats --*/
.outer{
    overflow: auto;
}

.tabContents {
    overflow: auto;
}

/* new for emastic */
.box {
    background: [[ColorPalette::Background]];
    border-right: 1px [[ColorPalette::TertiaryMid]] solid;
    border-bottom: 1px [[ColorPalette::TertiaryMid]] solid;
    padding: 1px 1em 0.75em;
    margin:  1em .5em 0.25em;
}

#sidebarOptions .input {
    margin: 0.4em 5%;
}

.txtOptionInput, .pasOptionInput {
    width: 90%;
}
/*}}}*/
So seldom does a conversation with emotion feel complete. 

The worst thing is discovering that underneath the memorized responses, there is no music and no emotional transaction.  And wondering if that is the way it always is, forever.  

I haven't given up. 
You have to reach a certain level of intimacy.  Sharing the space in a home will do.  
* We will be gone and, in the event we are gone too long, the dog will experience trauma due to the onset of darkness.  So for an outing from 8AM to 1PM, a light is left on. 
/***
|Name|ExportTiddlersPluginInfo|
|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExportTiddlersPluginInfo|
|Version|2.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for ExportTiddlersPlugin|
interactively select and extract tiddlers from your ~TiddlyWiki document, and write them into another file, using one of several different file formats:
* ~TiddlyWiki - a complete, stand-alone, standard TiddlyWiki HTML document
* ~PureStore - a small HTML archive file containing tiddler data only (no core code)
* ~PlainText - a simple TXT text file with tiddler source listings
* Comma - a "Comma Separated Value" data/spreadsheet file
* ~NewsFeed  - an XML-format file that can be published for RSS syndication.
!!!!!Usage
<<<
{{{
<<exportTiddlers>> (sidebar menu item)
<<exportTiddlers inline>> (embedded control panel)
}}}

Inline control panel (live):
<<exportTiddlers inline>>

Optional "special tiddlers" used by this plugin:
* SiteUrl<br>URL for official server-published version of document being viewed (used in XML export). Default: //none//
<<<
!!!!!Revisions
<<<
2010.02.25 2.9.5 added merge checkbox option and improved 'merge' status message
2009.09.12 2.9.4 fixed 'return false' to prevent IE page transitions
2009.07.06 2.9.3 moved HTML to section for size reduction
2009.07.03 2.9.2 TW252 fixup: don't call convertUTF8ToUnicode() for local loadFile() I/O
2009.04.30 2.9.1 custom fields in CSV output
2009.04.19 2.9.0 added CSV format
2009.02.26 2.8.5 use macro-specific definition of $() function abbreviation (avoids conflict with JQuery)
2008.09.29 2.8.4 in getData(), convert existing TW file from UTF8 to Unicode before merging to correct handling of international characters and symbols.
2008.09.26 2.8.3 in go(), if rewriting *current* file and chkSaveBackups and/or chkGenerateAnRssFeed is enabled, then write a backup file or RSS feed, respectively.
2008.09.24 2.8.2 in assembleFile(), make sure that markup block is updated if corresponding Markup* tiddler is exported.
2008.09.19 2.8.1 in formatItem(), removed unnecessary convertUnicodeToUTF8() (was causing double-conversion!)
2008.09.11 2.8.0 extensive code cleanup: moved all global functions inside macro object. Re-wrote file generator and I/O to support TiddlyWiki, PlainText, PureStore, and NewsFeed file formats.  Replaced inline 'match tags' code with use of getMatchingTiddlers() from [[MatchTagsPlugin]] (if installed), with fallback to core getTaggedTiddlers() otherwise.
2008.05.27 2.7.0 added ability to 'merge' with existing export file.  Also, revised 'matchTags' functionality to be more robust and more efficient
2008.05.12 2.6.1 automatically add 'export' task to backstage (moved from BackstageTweaks)
2008.03.10 2.6.0 added "delete tiddlers" button
2007.12.04 *.*.* update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.11.10 2.5.1 removed debugging alert messages from promptForExportFilename()
2007.10.31 2.5.0 code reduction: removed incomplete/unused interface and supporting functions for exporting directly to http, https or ftp servers.  Plugin now supports exporting to local file only.  Also, updated TW document output to generate TW2.2 compatible file format.
2007.10.30 2.4.2 added automatic shadow tiddler definition for [[ExportTiddlers]]
2007.07.16 2.4.1 in exportTWHeader(), reset HTML source 'markup' so installed markup is NOT copied to new file.
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).
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.
2007.03.02 2.2.6 in onClickExportButton(), when selecting open tiddlers for TW2.2, look for "storyDisplay" with fallback to "tiddlerDisplay" for TW2.1 or earlier
2007.03.01 2.2.5 removed hijack of store.saveChanges()
2006.11.08 2.2.4 added promptForExportFilename() and replaced type="file" control with edit field + browse button ("...").
2006.10.12 2.2.3 in exportDIVFooter(), write POST-BODY-START/END markers for compatibility with TW2.1 core file format.
2006.05.11 2.2.2 in createExportPanel, removed call to addNotification() to reduce unneeded feedback messages and increase overall document performance.
2006.05.02 2.2.1 Use displayMessage() to show number of selected tiddlers instead of updating listbox 'header' item after each selection.  Prevents awkward 'scroll-to-top' behavior that made multi-select via ctrl-click nearly impossible.
2006.04.29 2.2.0 New features: free-form "Notes" text inserted in the header of PureStore files.
2006.03.29 2.1.3 added calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.
2006.02.12 2.1.2 more FF1501 bug fixes.
2006.02.04 2.1.1 added var to unintended globals to avoids FireFox1501 crash bug
2006.02.02 2.1.0 Added support for output of complete TiddlyWiki documents
2006.01.21 2.0.1 Defer initial panel creation and only register a notification function when panel first is created
in saveChanges 'hijack', create panel as needed.  Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.
2005.12.27 2.0.0 Update for TW2.0.
2005.12.24 0.9.5 Minor adjustments to CSS to force correct link colors regardless of TW stylesheet selection
2005.12.16 0.9.4 Dynamically create/remove exportPanel so only one instance exists at a time
2005.11.15 0.9.2 added non-Ajax post to bypass cross-domain security restrictions.
2005.11.08 0.9.1 moved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time.
2005.10.28 0.9.0 added 'select opened tiddlers' feature. Based on a suggestion by Geoff Slocock
2005.10.24 0.8.3 Corrected hijack of 'save changes' when using http:
2005.10.18 0.8.2 added AJAX functions
2005.10.18 0.8.1 Corrected timezone handling and error checking/reporting when filtering tiddlers. More style tweaks, minor text changes and some assorted layout cleanup.
2005.10.17 0.8.0 First pre-release.
2005.10.16 0.7.0 filter by tags
2005.10.15 0.6.0 filter by title/text
2005.10.14 0.5.0 export to local file (DIV or XML)
2005.10.14 0.4.0 filter by start/end date
2005.10.13 0.3.0 panel interaction
2005.10.11 0.2.0 panel layout
2005.10.10 0.1.0 code framework
2005.10.09 0.0.0 development started
<<<
|Name|ExternalTiddlersPluginInfo|
|Source|http://www.TiddlyTools.com/#ExternalTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExternalTiddlersPluginInfo|
|Version|1.3.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for ExternalTiddlersPlugin|
This plugin extends the {{{<<tiddler>>}}} macro syntax so you can retrieve and wikify content directly from external files or remote URLs.  You can also define alternative "fallback" sources to provide basic "import on demand" handling by automatically creating/importing tiddler content from external sources when the specified ~TiddlerName does not already exist in your document.
!!!!!Configuration
>see ExternalTiddlersPlugin
!!!!!Usage
<<<
The standard TiddlyWiki core syntax for the {{{<<tiddler>>}}} macro is:
>{{{<<tiddler TiddlerName with: param param param ...>>}}}
where the optional {{{with: param param param...}}} values are used to replace any corresponding "substitution markers" ($1 to $9) that may be embedded in the referenced tiddler content.

This plugin allows the {{{<<tiddler>>}}} macro to ''use external file/URL references in place of the usual ~TiddlerName parameter'', so that you can render wiki-formatted source content retrieved from an external file/URL reference (as determined by the core's isExternalLink() test function), ''//as if// it had come from a tiddler in the current document''.  The external file/URL can be either ''a relative or absolute reference'' and can contain ''"plain text" or a full TiddlyWiki document''.  When using a TiddlyWiki document, you must specify which tiddlers should be included in the output by appending a permaview-like suffix to the file or URL reference, e.g.:
>{{{<<tiddler "myfile.txt" with: param param param...>>}}}
>or
>{{{<<tiddler "myfile.html#TiddlerName TiddlerName..." with: param param param...>>}}}
>or
>{{{<<tiddler "http://www.TiddlyWiki.com/index.html#HelloThere" with: param param param...>>}}}
If the plugin-enhanced {{{<<tiddler>>}}} macro is unable to retrieve the external content --  perhaps because the file doesn't exist or doesn't contain the requested tiddler(s), or cross-domain security blocked file access, or the network/server "timed out", etc., -- then it produces no output (i.e., just as when the standard {{{<<tiddler>>}}} macro is given a ~TiddlerName does not exist in the current document.)
<<<
!!!!!Using alternative "fallback" references
<<<
In addition to using external file/URL references in place of the usual ~TiddlerName, the plugin also allows you to use a ''fallback list'' consisting of a combination of alternative sources: tiddlers, local files, and/or URL references, each separated by "|".  The first reference in a fallback list is the "primary source"; the remaining references are "fallback sources".  The plugin will attempt to retrieve content from each fallback source until one is successfully retrieved or all alternatives have been tried.

For example, if you create a tiddler called [[HelloThere]], as well as a remotely-hosted TW document containing a published tiddler, also called [[HelloThere]], then you can write:
>{{{<<tiddler [[HelloThere|http://www.TiddlyWiki.com/#HelloThere]]>>}}}
When [[HelloThere]] is present in the local document, it is processed in the normal manner.  However, if you delete the  local [[HelloThere]] tiddler, the plugin will attempt to retrieve the [[HelloThere]] tiddler from the indicated remote URL.

Please note: although you can list any number of alternative sources, in whatever order you prefer, retrieval from a remote URL occurs asynchronously via XMLHttpRequest() processing.  As a consequence, there can be ''no more than one remote URL reference in the fallback list'', and any alternatives that follow a remote URL reference will not be processed.
<<<
!!!!!Automatically import/create missing tiddlers
<<<
When content is retrieved from an external fallback source, the plugin can automatically import/create tiddler(s) containing that content into your document, allowing you to display, modify, save and/or search for text in that tiddler from within your own document, without needing to retrieve it again from the external source.

If no local ~TiddlerName(s) are specified in the fallback list (i.e., only direct file/URL references are present), then a tiddler will NOT be created, so that each time you render the tiddler display the external source will be re-read in order to render the most recently saved external file content.  To illustrate using the example from above:
>&nbsp;&nbsp;&nbsp;{{{<<tiddler [[HelloThere|http://www.TiddlyWiki.com/#HelloThere]]>>}}}
will automatically create a locally-stored [[HelloThere]] tiddler, so that the external source is only accessed the first time the content is rendered, while:
>&nbsp;&nbsp;&nbsp;{{{<<tiddler [[http://www.TiddlyWiki.com/#HelloThere]]>>}}}
will re-load the content from the external source each time the display is rendered.

For easy identification, any tiddlers that are automatically created/imported are tagged with <<tag external>> (or other custom-defined tag values).  These tiddlers can also be automatically tagged with <<tag temporary>> for use with [[TemporaryTiddlersPlugin]], which will skip over those tiddlers when saving changes to your document so that when you reload the document, the temporary tiddlers will no longer be present and will be retrieved anew from the external source, on demand, when (or if) they are needed.  Important reminder: ''If you modify a temporary tiddler and want to retain it in your local document, be sure to remove the <<tag temporary>> tag from the tiddler before saving.''
<<<
!!!!!~XMLHttpRequest: performance and security issues
<<<
This plugin uses asynchronous XMLHttpRequest() processing to access external content directly from URLs hosted on remote web servers.  However, ''cross-domain access from one remote domain to another using XMLHttpRequest() processing is generally restricted for security reasons''.  As a result, URL references between server-hosted documents will not work unless those documents are located within the same domain.  In order to ensure that external content included in server-hosted documents will be displayed as intended, you should ''always use either a relative path/file reference or an http: reference located on the same domain as the published document.'' for any document you intend to publish.

Note: Some hosting providers, such as http://www.TiddlySpot.com/ offer ''"proxy" services that may allow you to bypass the security restrictions'' for certain designated remote web sites.  Consult your hosting service for information regarding their proxy arrangments (if any).
<<<
!!!!!Revisions
<<<
2011.04.27 1.3.3 merge/clone defaultCustomFields for saving in TiddlySpace
2011.02.08 1.3.2 fixed parsing of external links to allow retrieval of tiddler sections from remote files.  NOTE: //requires SectionLinksPlugin v1.4.1 or above//).  Also, calls to saveTiddler() use config.defaultCustomFields for TiddlySpace compatibility.
2008.10.27 1.3.1 in insertTiddler(), fixed Safari bug by replacing static Array.concat(...) with new Array().concat(...)
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ExternalTiddlersPluginInfo
2008.01.03 1.3.0 use lower-level doHttp() instead loadRemoteFile() so that optional username/password values can be used in XMLHttpRequest
2007.12.22 1.2.2 in handler(), when reading from local file with relative path fixup, use decodeURIComponent() instead of decodeURI
2007.11.30 1.2.1 lots of code/documentation cleanup.  renamed option cookies.  changed auto tag value to "external".
2007.11.27 1.2.0 added support for automatically importing external tiddlers
2007.11.26 1.1.1 improved XMLHttpRequest() error reporting for cross-domain security issues
2007.11.26 1.1.0 added support for multiple alternative fallback references
2007.11.25 1.0.0 initial release - moved from CoreTweaks
<<<
* [[Heebie-jeebies]]
* [[Control-seeking]]
* Fear is related to shame, mixed with shame, even intrinsic to shame. 
** A good example is [[Locking-the-back-door]].  
* Alcohol and drinking
* Firearms
* Pets being in danger of any kind
* Animals fighting
* People arguing, any kind of violence
* Some aspects of sexual intimacy (genitalia, self-stim)
* Pronounced masculinity
* Rural life (rural music, small towns as gossipy)

!! Remedies
* Sticky notes in books to cover strong scenes
* Verbal reassurances that must be repeated immediately, successively, and with extrapolative clauses. 
** ''Her:'' //I need you to tell me the therapist can't make me do that, ever.//  ''Me:'' // Right.  The therapist can't do that.//  But this is false grounds for assurance, a guarantee that can't be enforced and that is likely based on her inaccurate perceptions and premises.  
Word picture of two scuba divers unwilling to share the single oxygen supply
* As if your mind is a white board and someone left a note using a permanent marker.
* This contributes to a sense of obsessive-compulsive disorder, together with [[Perseveration]] and [[Associative-thinking]]. 
* [[AutismSpectrum]]

2013-09


These negative perceptions of T about me, are now white-boarded.  They can't be erased.  It doesn't matter how much I reviewed with her how much I to explain, even if I go over all of her theory, point by point I want to win her.  I won't persuade her on every point, and as soon as I am in danger of persuading her on a point she often makes one of her evasive maneuvers.  These consist either of switching to another nearby but unrelated topic, or making a sudden shift from the specific to the general or from the general to the specific even if I work through all of this I can never revise her essential perception, because even if I persuade her completely, on one point, it cannot then be laid aside so we can move to the next point because when we do that the first point will pop up again, she will reassert her original perception and all of these perceptions have already been integrated in her mind.  They are a complete case that she already proved in her mind and reported to others, and it cannot be moved.  I can never again have a place of reliability in her site explaining the Bible, there will always be a reservation based on this, it's not as if this is so conclusive in itself, after many years T has established many negative points about me that are anchored in these entrenched perceptions.  There's no way to overrule them.
----
[[Language-word-definitions]]
!!! Formulas for future responses
If the remedy is applied and seems to fail, the result may be a more complex or nuanced formula.  
* For herself.  
* For me. 
** There's a trap where I am cornered into agreeing on a formulaic remedy.  If I forget to apply it in some later episode, [[Censure-of-others]] follows.  But I may not always feel this is deserved.  
!!! Reinterpretations of past situations
* [[All-or-nothing-perception]]

Another interesting saga is the front-entrance flowers.  Our house has flowerbeds.  The brick walls were filled with hard-packed sterile dirt when we arrived.  These flowerbeds immediately started to send shame messages to T, and the only way to resolve these was to put some nice flowers in.  There were many ramifications and chapters of activity devoted to this challenge.
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 20 05-20 07 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

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

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

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

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

!Code
***/
//{{{


//============================================================================
//============================================================================
//         ForEachTiddlerPlugin
//============================================================================
//============================================================================

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Get the action parameter
    // (the parsing is done inside the individual action implementation.)
    var actionParameter = params.slice(i);


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

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

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

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

    var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
    context["tiddlyWiki"] = tiddlyWiki;

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

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

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

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

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

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

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

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

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

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

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

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

        return config.macros.forEachTiddler.paramEncode(parameter[i]);
    }
    return null;
}

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

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

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

    // Parse the "toFile" option
    var filename = null;
    var lineSeparator = undefined;
    if ((p < parameter.length) && parameter[p] == "toFile") {
        p++;
        if (p >= parameter.length) {
            this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
            return;
        }

        filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
        p++;
        if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
            p++;
            if (p >= parameter.length) {
                this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
                return;
            }
            lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
            p++;
        }
    }

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

    // Perform the action.
    var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
    var count = tiddlers.length;
    var text = "";
    if (count > 0 && beginExpression)
        text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);

    for (var i = 0; i < count; i++) {
        var tiddler = tiddlers[i];
        text += func(tiddler, context, count, i);
    }

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

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


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


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

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

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
    if (!idPrefix) {
        idPrefix = "store";
    }
    var lenPrefix = idPrefix.length;

    // Read the content of the given file
    var content = loadFile(this.getLocalPath(path));
    if(content === null) {
        throw "TiddlyWiki '"+path+"' not found.";
    }

    var tiddlyWiki = new TiddlyWiki();

    // Starting with TW 2.2 there is a helper function to import the tiddlers
    if (tiddlyWiki.importTiddlyWiki) {
        if (!tiddlyWiki.importTiddlyWiki(content))
            throw "File '"+path+"' is not a TiddlyWiki.";
        tiddlyWiki.dirty = false;
        return tiddlyWiki;
    }

    // The legacy code, for TW < 2.2

    // Locate the storeArea div's
    var posOpeningDiv = content.indexOf(startSaveArea);
    var posClosingDiv = content.lastIndexOf(endSaveArea);
    if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
        throw "File '"+path+"' is not a TiddlyWiki.";
    }
    var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);

    // Create a "div" element that contains the storage text
    var myStorageDiv = document.createElement("div");
    myStorageDiv.innerHTML = storageText;
    myStorageDiv.normalize();

    // Create all tiddlers in a new TiddlyWiki
    // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
    var store = myStorageDiv.childNodes;
    for(var t = 0; t < store.length; t++) {
        var e = store[t];
        var title = null;
        if(e.getAttribute)
            title = e.getAttribute("tiddler");
        if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
            title = e.id.substr(lenPrefix);
        if(title && title !== "") {
            var tiddler = tiddlyWiki.createTiddler(title);
            tiddler.loadFromDiv(e,title);
        }
    }
    tiddlyWiki.dirty = false;

    return tiddlyWiki;
};



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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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


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



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


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

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

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

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


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


} // of "install only once"

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


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

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

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

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

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

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

Our conflicts are ''mostly'' based in the same Venus and Mars attributes that counselors understand.  What differs in the intensity and the intransigence of Asperger's -- and what a difference it is.  
* Year 2009: A glass tumbler is left precariously on the side of the drainer. A few of us warn her several times. Eventually it falls to the floor and breaks.  
** Now she understands, so she sets the rule to prohibit leaving a glass tumbler precariously on the side of the drainer. 
** Due to her misunderstanding the effects of gravity and such, her rule has too wide an application. It joins the large onerous set of household rules that are onerous due to a misguided application. 
** If a person breaks this rule, she gives a scolding that refers back to the breaking of that original glass tumbler.  
There's this one small vestige of my father's money that has been haunting my mailbox in the form of an annual stockholders' report. I never could figure out how to divest myself of a small bit of stock in Cusac Gold Mining.  One of the these came last week, so I decided to open it up -- for the first time in many years. In fact, to my surprise the company is now the China Minerals Mining Corporation. I went to their website and learned the name change was very recent -- just earlier this month. All the names connected to all the names connected with the enterprise were no longer proper British Canadian names, but Chinese. I searched around and found a graph to show the relative value of the stock overtime, what I found is that after 2008 it plummeted and has been scraping along at $.30 a share since then.

This was disappointing, of course, because I had heard that gold mining shares can reflect the price of gold to some degree. At about this moment, T came by and asked what I was up to. I explained to her, and she proceeded to become very angry . We spent the next few hours working through the trouble caused by her perception that I have been holding out as a secret stockholder. This was very amusing, except for the fact that she wants so very angry; and as is sometimes the case, I had to work very hard to not laugh while giving her my best attention. R. was listening from the kitchen, and he finally intervened. He said, //Mom, Dad is not hiding anything. We used to joke about this stock that he had. It was a family joke, because that piece of mail would come now and then and he would tell us about the gold-mining stock and how it was a very small amount. You've just forgotten.//
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!Documentation
>see [[GotoPluginInfo]]
!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!Revisions
<<<
2009.05.22 [1.9.2] use reverseLookup() for IncludePlugin
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!Code
***/
//{{{
version.extensions.GotoPlugin= {major: 1, minor: 9, revision: 2, date: new Date(2009,5,22)};

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

if (config.options.txtIncrementalSearchMin===undefined) config.options.txtIncrementalSearchMin=3;

config.macros.gotoTiddler= {
    listMaxSize: 10,
    listHeading: 'Found %0 matching title%1...',
    searchItem: "Search for '%0'...",
    handler:
    function(place,macroName,params,wikifier,paramString,tiddler) {
        var quiet   =params.contains("quiet");
        var showlist    =params.contains("showlist");
        var search  =params.contains("search");
        params = paramString.parseParams("anon",null,true,false,false);
        var instyle =getParam(params,"inputstyle","");
        var liststyle   =getParam(params,"liststyle","");
        var filter  =getParam(params,"filter","");
        var html=this.html;
        var keyevent=window.event?"onkeydown":"onkeypress"; // IE event fixup for ESC handling
        html=html.replace(/%keyevent%/g,keyevent);
        html=html.replace(/%search%/g,search);
        html=html.replace(/%quiet%/g,quiet);
        html=html.replace(/%showlist%/g,showlist);
        html=html.replace(/%display%/g,showlist?'block':'none');
        html=html.replace(/%position%/g,showlist?'static':'absolute');
        html=html.replace(/%instyle%/g,instyle);
        html=html.replace(/%liststyle%/g,liststyle);
        html=html.replace(/%filter%/g,filter);
        if (config.browser.isIE) html=this.IEtableFixup.format([html]);
        var span=createTiddlyElement(place,'span');
        span.innerHTML=html; var form=span.getElementsByTagName("form")[0];
        if (showlist) this.fillList(form.list,'',filter,search,0);
    },
    html:
    '<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
        <input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
            title="Enter title text... ENTER=goto, SHIFT-ENTER=search for text, DOWN=select from list"\
            onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
            %keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list,%search%,%showlist%);"\
            onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,%quiet%,%search%,%showlist%);">\
        <select name=list style="display:%display%;position:%position%;%liststyle%"\
            onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
            onblur="this.style.display=%showlist%?\'block\':\'none\';"\
            %keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%showlist%);"\
            onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%showlist%);">\
        </select><input name="filter" type="hidden" value="%filter%">\
    </form>',
    IEtableFixup:
    "<table style='width:100%;display:inline;padding:0;margin:0;border:0;'>\
        <tr style='padding:0;margin:0;border:0;'><td style='padding:0;margin:0;border:0;'>\
        %0</td></tr></table>",
    getItems:
    function(list,val,filter) {
        if (!list.cache || !list.cache.length || val.length<=config.options.txtIncrementalSearchMin) {
            // starting new search, fetch and cache list of tiddlers/shadows/tags
            list.cache=new Array();
            if (filter.length) {
                var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
                var tiddlers=store.sortTiddlers(fn.apply(store,[filter]),'title');
            } else
                var tiddlers=store.reverseLookup('tags','excludeLists');
            for(var t=0; t<tiddlers.length; t++) list.cache.push(tiddlers[t].title);
            if (!filter.length) {
                for (var t in config.shadowTiddlers) list.cache.pushUnique(t);
                var tags=store.getTags();
                for(var t=0; t<tags.length; t++) list.cache.pushUnique(tags[t][0]);
            }
        }
        var found = [];
        var match=val.toLowerCase();
        for(var i=0; i<list.cache.length; i++)
            if (list.cache[i].toLowerCase().indexOf(match)!=-1) found.push(list.cache[i]);
        return found;
    },
    getItemSuffix:
    function(t) {
        if (store.tiddlerExists(t)) return "";  // tiddler
        if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
        return " (tag)"; // tag
    },
    fillList:
    function(list,val,filter,search,key) {
        if (list.style.display=="none") return; // not visible... do nothing!
        var indent='\xa0\xa0\xa0';
        var found = this.getItems(list,val,filter); // find matching items...
        found.sort(); // alpha by title
        while (list.length > 0) list.options[0]=null; // clear list
        var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
        list.options[0]=new Option(hdr,"",false,false);
        for (var t=0; t<found.length; t++) list.options[list.length]=
            new Option(indent+found[t]+this.getItemSuffix(found[t]),found[t],false,false);
        if (search)
            list.options[list.length]=new Option(this.searchItem.format([val]),"*",false,false);
        list.size=(list.length<this.listMaxSize?list.length:this.listMaxSize); // resize list...
        list.selectedIndex=key==38?list.length-1:key==40?1:0;
    },
    keyProcessed:
    function(ev) { // utility function
        ev.cancelBubble=true; // IE4+
        try{event.keyCode=0;}catch(e){}; // IE5
        if (window.event) ev.returnValue=false; // IE6
        if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
        if (ev.stopPropagation) ev.stopPropagation(); // all
        return false;
    },
    inputEscKeyHandler:
    function(event,here,list,search,showlist) {
        if (event.keyCode==27) {
            if (showlist) { // clear input, reset list
                here.value=here.defaultValue;
                this.fillList(list,'',here.form.filter.value,search,0);
            }
            else if (list.style.display=="none") // clear input
                here.value=here.defaultValue;
            else list.style.display="none"; // hide list
            return this.keyProcessed(event);
        }
        return true; // key bubbles up
    },
    inputKeyHandler:
    function(event,here,quiet,search,showlist) {
        var key=event.keyCode;
        var list=here.form.list;
        var filter=here.form.filter;
        // non-printing chars bubble up, except for a few:
        if (key<48) switch(key) {
            // backspace=8, enter=13, space=32, up=38, down=40, delete=46
            case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
        }
        // blank input... if down/enter... fall through (list all)... else, and hide or reset list
        if (!here.value.length && !(key==40 || key==13)) {
            if (showlist) this.fillList(here.form.list,'',here.form.filter.value,search,0);
            else list.style.display="none";
            return this.keyProcessed(event);
        }
        // hide list if quiet, or below input minimum (and not showlist)
        list.style.display=(!showlist&&(quiet||here.value.length<config.options.txtIncrementalSearchMin))?'none':'block';
        // non-blank input... enter=show/create tiddler, SHIFT-enter=search for text
        if (key==13 && here.value.length) return this.processItem(event.shiftKey?'*':here.value,here,list,showlist);
        // up or down key, or enter with blank input... shows and moves to list...
        if (key==38 || key==40 || key==13) { list.style.display="block"; list.focus(); }
        this.fillList(list,here.value,filter.value,search,key);
        return true; // key bubbles up
    },
    selectKeyHandler:
    function(event,list,editfield,showlist) {
        if (event.keyCode==27) // escape... hide list, move to edit field
            { editfield.focus(); list.style.display=showlist?'block':'none'; return this.keyProcessed(event); }
        if (event.keyCode==13 && list.value.length) // enter... view selected item
            { this.processItem(list.value,editfield,list,showlist); return this.keyProcessed(event); }
        return true; // key bubbles up
    },
    processItem:
    function(title,here,list,showlist) {
        if (!title.length) return;
        list.style.display=showlist?'block':'none';
        if (title=="*")   { story.search(here.value); return false; } // do full-text search
        if (!showlist) here.value=title;
        story.displayTiddler(null,title); // show selected tiddler
        return false;
    }
}
//}}}
/***
|Name|GotoPluginInfo|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for GotoPlugin|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!!!Usage/Examples
<<<
syntax: {{{<<gotoTiddler quiet search inputstyle:... liststyle:... filter:...>>}}}
All parameters are optional.
* ''quiet'' (//keyword//)<br>list will not be automatically display as each character is typed.  Use //down// or //enter// to view the list.
* ''showlist'' (//keyword//)<br>list will always be displayed, inline, directly below the input field.
* ''search'' (//keyword//)<br>adds an extra 'command item' to the list that can be used to invoke a full-text search using the entered value.  This can be especially useful when no matching tiddler titles have been found.
* ''inputstyle:'' and ''liststyle:''<br>are CSS declarations that modify the default input and listbox styles, respectively.  Note: the CSS styles must be surrounded by ({{{"..."}}} or {{{'...'}}}) or ({{{[[...]]}}}) (e.g., {{{liststyle:"border:1px dotted blue;color:green;..."}}}.
* ''filter:''<br>is a single tag value (or a boolean tag expression if MatchTagsPlugin is installed), and is used to limit the search to only those tiddlers matching the indicated tag or tag expression (e.g., {{{<<gotoTiddler filter:"faq or help">>}}})
{{{<<gotoTiddler>>}}}
<<gotoTiddler>>
{{{<<gotoTiddler search>>}}}
<<gotoTiddler search>>
{{{<<gotoTiddler showlist filter:"pluginInfo" liststyle:"height:10em;width:auto;">>}}}
<<gotoTiddler showlist filter:"pluginInfo" liststyle:"height:10em;width:auto;">>
<<<
!!!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!!!Revisions
<<<
2009.05.22 1.9.2 use reverseLookup() for IncludePlugin
2009.04.12 1.9.1 support multiple instances with different filters by using per-element tiddler cache instead of shared static cache
2009.04.05 1.9.0 added 'showlist' parameter for inline display with listbox always visible.
2009.03.23 1.8.0 added txtIncrementalSearchMin (default=3).  Avoids fetching long lists.  Use down arrow to force search with short input.
2008.12.15 1.7.1 up arrow from input field now moves to end of droplist (search for input).  Also, shift+enter cam now be used to quickly invoke search for text.
2008.10.16 1.7.0 in macro handler(), changed to use //named// params instead of positional params, and added optional "filter:" param for tag filtering.  Removed 'insert' handling (now provided by [[QuickEditPlugin]]).
2008.10.02 1.6.1 for IE, wrap controls in a table.  Corrects placement of listbox so it is below input field.
2008.10.02 1.6.0 added 'search' param for optional "Search for:" item that invokes full text search (especially useful when no title matches are found)
2008.02.17 1.5.0 ENTER key always displays tiddler based on current input regardless of whether input matches any existing tiddler
2007.10.31 1.4.3 removed extra trailing comma on last property of config.macros.gotoTiddler object.  This fixes an error under InternetExplorer that was introduced 6 days ago... sure, I should have found it sooner, but... WHY DON'T PEOPLE TELL ME WHEN THINGS ARE BROKEN!!!!
2007.10.25 1.4.2 added onclick handler for input field, so that clicking in field hides the listbox.
2007.10.25 1.4.1 re-wrote getItems() to cache list of tiddlers/shadows/tags and use case-folded simple text match instead of regular expression to find matching tiddlers.  This *vastly* reduces processing overhead between keystrokes, especially for documents with many (>1000) tiddlers.  Also, removed local definition of replaceSelection(), now supported directly by the TW2.2+ core, as well as via backward-compatible plugin
2007.04.25 1.4.0 renamed macro from "goto" to "gotoTiddler".  This was necessary to avoid a fatal syntax error in Opera (and other browsers) that require strict adherence to ECMAScript 1.5 standards which defines the identifier "goto" as "reserved for FUTURE USE"... *sigh*
2007.04.21 1.3.2 in html definition, removed DIV around droplist (see 1.2.6 below).  It created more layout problems then it solved. :-(
2007.04.01 1.3.1 in processItem(), ensure that correct textarea field is found by checking for edit=="text" attribute
2007.03.30 1.3.0 tweak SideBarOptions shadow to automatically add {{{<<goto>>}}} when using default sidebar content
2007.03.30 1.2.6 in html definition, added DIV around droplist to fix IE problem where list appears next to input field instead of below it.
2007.03.28 1.2.5 in processItem(), set focus to text area before setting selection (needed for IE to get correct selection 'range')
2007.03.28 1.2.4 added prompt for 'pretty text' when inserting a link into tiddler content
2007.03.28 1.2.3 added local copy of core replaceSelection() and modified for different replace logic
2007.03.27 1.2.2 in processItem(), use story.getTiddlerField() to retrieve textarea control
2007.03.26 1.2.1 in html, use either 'onkeydown' (IE) or 'onkeypress' (Moz) event to process <esc> key sooner, to prevent <esc> from 'bubbling up' to the tiddler (which will close the current editor).
2007.03.26 1.2.0 added support for optional "insert" keyword param.
2006.05.10 1.1.2 when filling listbox, set selection to 'heading' item... auto-select first tiddler title when down/enter moves focus into listbox
2006.05.08 1.1.1 added accesskey ("G") to input field html (also set when field gets focus).  Also, inputKeyHandler() skips non-printing/non-editing keys.
2006.05.08 1.1.0 added heading to listbox for better feedback (also avoids problems with 1-line droplist)
2006.05.07 1.0.0 list matches against tiddlers/shadows/tags.  input field auto-completion... 1st enter=complete matching input (or show list)... 2nd enter=view tiddler.  "quiet" param controls when listbox appears.  handling for enter (13), escape(27), and down(40) keys.   Change 'ondblclick' to 'onclick' to avoid unintended triggering of tiddler editor).  Shadow titles inserted into list instead of appended to the end.
2006.05.05 0.0.0 started
<<<
/***
|Name|GridPluginInfo|
|Source|http://www.TiddlyTools.com/#GridPlugin|
|Documentation|http://www.TiddlyTools.com/#GridPluginInfo|
|Version|2.0.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1.3|
|Type|documentation|
|Description|documentation for GridPlugin|
!!!!!Usage
<<<
The {{{<<grid>>}}} macro generates a table, where ''rows are tiddlers, columns are any combination of slices, sections or field names'', and grid cells display individual values (or colored boxes with mouseover 'tooltips' to view values).
*Use tag filtering to select and display specific subsets of tiddlers.
*Grid column headings can be shown/hidden by clicking the {{{>>>}}} symbol in the upper-left corner
*Optionally, clicking on a cell allows you to edit the value in that cell.  Pressing enter (or moving away from the input field) saves the changed value.  Pressing escape cancels the changes (after confirming)
{{{
<<grid    columns:[[name name name...]]
    tags:[[tag tag...]]
    filter:...
    clip:...
    inline wikify edit all>>
}}}
//all parameters are optional//
*''columns:...'' (list) default=use all slices defined in the document<br>display columns using the specified names, which refer to any combination of slices, sections and fields.
**If a column name begins with '=' (equal sign), then it is a tiddler field reference.
**If a column name begins with '!' (exclamation), then it is a tiddler section reference.
**Column names without either prefix are tiddler slice references.
**''{{{+TiddlerName}}}'' uses a space-separated list of column names stored in another tiddler.
**''{{{@TiddlerName}}}'' uses the slices from a given tiddler as column names.
**''{{{@!TiddlerName}}}'' uses the sections from a given tiddler.
**''{{{@=TiddlerName}}}'' uses the fields from a given tiddler.
**A special read-only 'fake' slice name, ''~TiddlerSize'', can be used to automatically compute and show the tiddler's size in bytes.
*''tags:...'' (list) default=show all tiddlers<br>display tiddlers that match at least ONE of the specified tags.
**''{{{+TiddlerName}}}'' uses a space-separated list of tags stored in another tiddler.
**''{{{@TiddlerName}}}'' uses the tags assigned to the indicated tiddler.
*''filter:...'' (filter syntax) default=none<br>enhanced tiddler selection by tags, using core filter syntax (e.g., {{{"[tag[tag1]][tag[tag2]]"}}}) or MatchTagsPlugin's compound //Boolean tag expressions// (e.g., {{{"tag1 or (tag2 and tag3) and not tag4)"}}})
*''clip:...'' (number) default=no clip length limit<br>maximum # of characters to show in a grid cell when using 'inline' keyword.  Text values are truncated with '...'
*''inline'' (keyword)<br>displays column values directly in grid cells.  Default=use a colored block if a value is defined, with mouseover 'tooltip' to show the actual value
*''wikify'' (keyword)<br>parses and formats wiki-syntax contained in values.  Default=show values ''as-is'', without wiki formatting
*''edit'' (keyword)<br>enables click-to-edit to change values.  Default=read-only display of values.
*''all'' (keyword)<br>displays a row for each tiddler, even tiddlers that have NO non-blank values. Default=show only tiddlers that have at least one defined value.
Note: this plugin uses a modified version of slices pattern:
{{{
slicesRE = /(?:^\|[\'\/]*~?(\w+)\:?[\'\/]*\|\s*(.*?)\s*\|$)/gm;
}}}
* eliminates TONS of spurious slices caused by over-eager 'description' format pattern matches
* enforces beginning-of-line and end-of-line sequences.  (Allows slice values to contain |, such as in pretty links)
<<<
!!!!!Examples
<<<
*{{block{
View 'mouseover' summary of slices
for tiddlers matching at least one tag from a list of tags
using slices from this tiddler as columns
<<<
{{{
<<grid tags:[[systemConfig pluginInfo script]] columns:@GridPluginInfo>>
}}}
+++[show results...]...
<<grid tags:[[systemConfig pluginInfo script]] columns:@GridPluginInfo>>
===
<<<
}}}
*{{block{
Edit slices (Description, Version), fields (changecount) and sections (Revisions)
for tiddlers using TW core filter syntax:
<<<
{{{
<<grid filter:[tag[systemConfig]][tag[pluginInfo]][tag[script]]
    columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
}}}
+++[show results...]...
<<grid filter:[tag[systemConfig]][tag[pluginInfo]][tag[script]]
    columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
===
<<<
}}}
*{{block{
Edit slices (Description, Version), fields (changecount) and sections (Revisions)
for tiddlers using enhanced boolean filter syntax (requires [[MatchTagsPlugin]])
<<<
{{{
<<grid filter:[[systemConfig or pluginInfo or script]]
    columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
}}}
+++[show results...]...
<<grid filter:[[systemConfig or pluginInfo or script]]
    columns:[[Description Version =changecount !Revisions]] inline wikify edit>>
===
<<<
}}}
<<<
!!!!!Revisions
<<<
2010.03.06 2.0.7 fixed setSection()
2009.09.26 2.0.6 fixed setSlice() for existing slices with empty values
2009.09.25 2.0.5 fixed cell redraw after edit-in-place
2009.09.25 2.0.4 fixed ({{{@!name}}} ) and {{{@=name}}} handling
2009.09.24 2.0.3 added handling for getting columns from tiddler sections ({{{@!name}}} ) or fields {{{@=name}}}
2009.09.23 2.0.2 fixed handling for {{{@TiddlerName/+TiddlerName}}}
2009.09.21 2.0.1 split keydown() and blur() functions from editInPlace() and added confirmation for escape key (discard changes)
2009.09.20 2.0.0 Complete re-write.  Renamed [[GridPlugin]].  View and/or edit any tiddler section, slice or field.  Renamed 'slices:...' param to 'columns:...'
2009.09.17 1.1.1 added textarea handling for multi-line fields (e.g., 'text')
2009.09.17 1.1.0 added '=fieldname' syntax for 'field grid'
2008.08.15 1.0.3 add brackets around row headings when wikifying so that non-wikiword tiddler titles are linked
2008.08.13 1.0.2 wikify row headings (in addition to slice value cells) whenever 'wikify' param is used
2008.05.01 1.0.1 in editSlice(), corrected fixup for titles containing double-quotes
2007.09.18 1.0.0 added 'wikify' param and handling to format wiki-syntax contained in slice values
2008.05.01 1.0.1 in editSlice(), corrected fixup for titles containing double-quotes
2007.09.18 1.0.0 added 'wikify' param and handling to format wiki-syntax contained in slice values
2007.08.02 0.9.8 when generating HTML, replace double-quotes in tiddler titles with {{{&#x22;}}} to avoid ambiguity with quotes used as HTML attribute syntax delimiters.
2007.07.22 0.9.7 removed hard-coded 99% 'width bias' and wordwrap from Description cells, default to autosize (equal size for all columns).  Added width:xxxx param to easily stretch table to fit containing space
2007.06.08 0.9.6 fixed generated code for row headings and edit_slice() handlers, so titles with single-quotes will work
2007.04.24 0.9.5 added 'fake' slicename: 'TiddlerSize', to display # of bytes in tiddler as a grid column.
2007.04.13 0.9.4 honor 'excludeLists' tag so that 'hidden' tiddlers aren't displayed in the grid
2007.04.08 0.9.3 fixed cell bgcolor (non-inline grid 'blocks') after edit-in-place adds/clears a slice value
2007.04.07 0.9.2 support edit in place for non-inline grids (color 'blocks').  Also create new slices in tiddlers if slice not already present
2007.04.07 0.9.1 use locally-defined slicesRE (and getSlice() method) instead of re-defining core slicesRE.  Avoids breaking use of shadow ColorPalette slices.
2007.04.05 0.9.0 Added functioning 'set slice' handler and 'edit-in-place' feature.  Eliminated mouseover popups (use tooltips instead).  Added ''tags:'', ''slices:'' and ''edit'' params.  Lots of code cleanup.
2007.04.04 0.8.1 in info() and popup() functions, instead of creating popup display, use element tooltip to show mouseover details.
2007.03.25 0.8.0 change to BETA status and added support for 'tags:tag tag tag tag' filtering param
2007.02.03 0.0.2 change display of slices from 'tiddler[slidename]' to 'tiddler:slicename' to match TW slice syntax
2007.01.30 0.0.1 started (adapted from TagGridPlugin)
<<<
<<Bbl Is 30:21 >>, <<Bbl Is 49:10 >>
* //Advice, direction,// [[Vision]], [[Counsel]]
!!!! Geographical guidance from God
* the cloud and fire
* the star leading to Bethlehem's stable
* the cows leading the cart on which rested the Ark
* Acts 15 (?) -- on the way to Macedonia
* And of course, there is always bodily translation...
!!!! Pictures
* John Glenn in flight, low on fuel, during an exercise in which the carrier was blacked out.  Below he sees the wake in phosphorescent glow and this guides him to safety.  //The Right Stuff// probably.
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2009.01.05 [2.4.0] in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 4, revision: 0, date: new Date(2009,1,5)};

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

// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode,w)
{
    function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
    switch (theNode.nodeName.toLowerCase()) {
        case 'style': case 'option': case 'select':
            theNode.innerHTML=unmask(theNode.innerHTML);
            break;
        case 'textarea':
            theNode.value=unmask(theNode.value);
            break;
        case '#text':
            var txt=unmask(theNode.nodeValue);
            var newNode=createTiddlyElement(null,"span");
            theNode.parentNode.replaceChild(newNode,theNode);
            wikify(txt,newNode,highlightHack,w.tiddler);
            break;
        default:
            for (var i=0;i<theNode.childNodes.length;i++)
                wikifyTextNodes(theNode.childNodes.item(i),w); // recursion
            break;
    }
}
//}}}
|Name|HTMLFormattingPluginInfo|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for HTMLFormattingPlugin|
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Usage
<<<
The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.

When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within {{{<html>}}} and {{{</html>}}} markers.  When present, the TiddlyWiki core simply passes this content directly to the browser's internal "rendering engine" to process as ~HTML-formatted content.  However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain.  This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.

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

Note: To bypass this extended processing for a specific section of HTML content, embed ''{{{<nowiki>}}}'' //anywhere// inside the {{{<html>...</html>}}} delimiters, and wiki formatting will not be applied to that content.
<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.

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

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

Alternatively, if you //always// want to omit all line breaks from the rendered output, you can set this option:
><<option chkHTMLHideLinebreaks>> ignore all line breaks
which can also be 'hard coded' into your document by adding the following to a tiddler, tagged with <<tag systemConfig>>
>{{{config.options.chkHTMLHideLinebreaks=true;}}}

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

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

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

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

After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements.  The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node.  At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Revisions
<<<
2010.05.07 2.4.1 added chkHTMLHideLinebreaks option
2009.01.05 2.4.0 in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
2008.10.02 2.3.0 added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
2008.09.19 2.2.0 in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
2008.04.26 [*.*.*] plugin size reduction: more documentation moved to HTMLFormattingInfo
2008.01.08 [*.*.*] plugin size reduction: documentation moved to HTMLFormattingInfo
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.06.14 2.1.5 in formatter, removed call to e.normalize().  Creates an INFINITE RECURSION error in Safari!!!!
2006.09.10 2.1.4 update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
2006.05.28 2.1.3 in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children.  (thanks to "ayj" for bug report)
2006.02.19 2.1.2 in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content.  This ensures that the 'place' pasced to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
2006.02.05 2.1.1 wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.01 2.1.0 don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
2005.11.06 2.0.1 code cleanup
2005.10.31 2.0.  replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
2005.10.09 1.0.2 combined documentation and code into a single tiddleb
2005.08.05 1.0.1 moved HTML and CSS definitions into plugin code instead of using separate tiddlers
2005.07.26 1.0.1 Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
2005.06.26 1.0.0 Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
It's an issue.  
Used-good stores, garage sales.
Pawnshops - they are immoral.
Small towns - gossip, community-imposed shame.  
Rurality. 
/%
|Name|HideTiddlerBackground|
|Source|http://www.TiddlyTools.com/#HideTiddlerBackground|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's background and border (if any)|

Usage: <<tiddler HideTiddlerBackground>>

%/<script>
    var t=story.findContainingTiddler(place);
    if (!t || t.id=="HideTiddlerBackground") return;
    var nodes=t.getElementsByTagName("*");
    for (var i=0; i<nodes.length; i++) if (hasClass(nodes[i],"viewer")) {
        var s=nodes[i].style;
        s.backgroundImage="none";
        s.backgroundColor="transparent"
        s.borderColor="transparent";
        s.borderWidth=0;
        s.margin=0;
        s.padding=0;
        break;
    }
</script>
/%
|Name|HideTiddlerTags|
|Source|http://www.TiddlyTools.com/#HideTiddlerTags|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's tagged/tagging display elements|

Usage: <<tiddler HideTiddlerTags>>

%/<script>
    var t=story.findContainingTiddler(place);
    if (!t || t.id=="tiddlerHideTiddlerTags") return;
    var nodes=t.getElementsByTagName("div");
    for (var i=0; i<nodes.length; i++)
        if (hasClass(nodes[i],"tagged"))
            nodes[i].style.display="none";
</script>
* <<Bbl Ez 12:23 >>
* <<Bbl Jer 29:11 >>-14
* <<Bbl Rom 15:4 >>
* <<Bbl Rom 8:24 >>-25
* <<Bbl Col 1:23 >>
* <<Bbl Heb 6:18 >>-19
* [[Faith]], [[Security]]
* [[Christ]] our Hope
* [[Heaven]]
* Hope of [[Resurrection]]
<<top>>
<<closeAll>><<renameButton c 'Close all tiddlers'>><<toggleSideBar '' '' hide>><<renameButton '>' >>
<<jump j '' top>>
<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>
{{button{[[Bible-Index]]}}}<<renameButton b 'Open Bible Index'>>
<<newTiddler>><<renameButton n>>
/***
Start ToggleSideBarMacro code
***/
//{{{
config.macros.toggleSideBar={};

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

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

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

     return false;
}

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

//start JumpToTopMacro code
//{{{
config.macros.top={};
config.macros.top.handler=function(place,macroName)
{
               createTiddlyButton(place,"^","jump to top",this.onclick);
}
config.macros.top.onclick=function()
{
               window.scrollTo(0,0);
};

config.commands.top =
{
               text:" ^ ",
               tooltip:"jump to top"
};

config.commands.top.handler = function(event,src,title)
{
               window.scrollTo(0,0);
}
//}}}
//end JumpToStartMacro code

//start JumpMacro code
//{{{
config.macros.jump= {};
config.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
        var label = (params[0] && params[0]!=".")? params[0]: 'jump';
        var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';
        var top = (params[2] && params[2]=='top') ? true: false;

        var btn =createTiddlyButton(place,label,tooltip,this.onclick);
        if (top==true)
              btn.setAttribute("top","true")
}

config.macros.jump.onclick = function(e)
{
        if (!e) var e = window.event;
        var theTarget = resolveTarget(e);
        var top = theTarget.getAttribute("top");
    var popup = Popup.create(this);
    if(popup)
        {
                 if(top=="true")
                                {createTiddlyButton(createTiddlyElement(popup,"li"),'Top ?','Top of TW',config.macros.jump.top);
                                 createTiddlyElement(popup,"hr");}

        story.forEachTiddler(function(title,element) {
            createTiddlyLink(createTiddlyElement(popup,"li"),title,true);
            });
                }
    Popup.show(popup,false);
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    return false;
}

config.macros.jump.top = function()
{
       window.scrollTo(0,0);
}
//}}}
//end JumpMacro code

//utility functions
//{{{
Popup.show = function(unused,slowly)
{
    var curr = Popup.stack[Popup.stack.length-1];
    var rootLeft = findPosX(curr.root);
    var rootTop = findPosY(curr.root);
    var rootHeight = curr.root.offsetHeight;
    var popupLeft = rootLeft;
    var popupTop = rootTop + rootHeight;
    var popupWidth = curr.popup.offsetWidth;
    var winWidth = findWindowWidth();
        if (isChild(curr.root,'hoverMenu'))
              var x = config.hoverMenu.settings.x;
        else
              var x = 0;
    if(popupLeft + popupWidth+x > winWidth)
        popupLeft = winWidth - popupWidth -x;
        if (isChild(curr.root,'hoverMenu'))
            {curr.popup.style.right = x + "px";}
        else
                curr.popup.style.left = popupLeft + "px";
    curr.popup.style.top = popupTop + "px";
    curr.popup.style.display = "block";
    addClass(curr.root,"highlight");
    if(config.options.chkAnimate)
        anim.startAnimating(new Scroller(curr.popup,slowly));
    else
        window.scrollTo(0,ensureVisible(curr.popup));
}

window.isChild = function(e,parentId) {
        while (e != null) {
                var parent = document.getElementById(parentId);
                if (parent == e) return true;
                e = e.parentNode;
                }
        return false;
};


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

               if (place.lastChild.tagName!="BR")
                     {
                      place.lastChild.firstChild.data = params[0];
                      if (params[1]) {place.lastChild.title = params[1];}
                     }
};
//}}}
!!! Search for marriage counsel
* My presentation list
## T denigrates me morally; disparaging, belittling view of me.
## Always needy.  Melt-down and make-up cycle.  Always a crisis.
## Asperger's -- Unable to view past her self-referential understanding.  Not capable of seeing harm she causes or effects on relationships.
## Consistently distorts communications as she receives them, and cannot revise.
* T's presentation list
## She has Asperger's and I have ADHD; creates conflict.
## I am depressed with a history of SA.  I have no job.  My statements are unreliable and untrustworthy.
## She has chronic pain.  Sex is a challenge.
## We have teenagers with problems.
!!! Marriage Counseling
[[Defenses-T]]
# Our first "homework" talk.  She asks me to review the teaching on shame and healing for her.  I talk about how I am straightening up and sorting my possessions, and must pursue this while she is gone.  She reviews 3 tragic episodes from early relationship:
## I opened kitchen window and her Grandpa was incensed (I have no memory of this)
## I drug her Mom's typewriter out in the open
## I put Genevieve's baby toys on the FLOOR, and we had to pack up and leave for the grandparents right away.
# After a long silence I talk about my need to be able to do my own communications with my Dad.  She agrees to a six-month period.  Her need is pray for her about something (usual); I tell her that doesn't really fulfill the thing, so she talks aobut need to make love (also evening rubs) and we deicde to aim for Tuesday.  After that, I go through the Bible teaching about shame.  Overshadowing all this is R.'s pending request to go to Gruene Hall.
# We talk about R.'s invitation to Gruene Hall.
# It's Tuesday and I'm against making love.  Later I go over some of my new list of her defensive tactics.  She requests some better verbal resoponses.  She asks about unemployment dso I have to fess about that.
* [[Idiolect-T]]
!! New year's time end of 2011
!!!! Sat 12/31
* Her need is to review the chart of facial emotions.  We work on disambiguating "enraged" and "aggressive."
* My need to explain her remarkable lack of //peripheral awareness//.
!!!! Before 12/31
* I express need to open letters from my Dad without supervision.  She agrees six-month trial.  I should put in tickler for end-of-June.
* She has a need for reviewing Matt 7 together.
!!!! Mon 1/2
* My need is for her to know I have grief about losing some relationships (particularly mentor).  She presses on this -- //Who?  All I can think of is Rob Campbell.  Well, and Tim Clemens.//  I am reticent to share.  She over-blows the mentor term.  I talk about it in relation to my Dad.  She says, well (in effect) that was forfeited because she didn't get to meet him before the wedding.  I return repeatedly to //this is how I feel// .. as opposed to her fixing it.
* Her need is for me to not reveal to her FoO that I am considering a career in Interior Design.  Stressful exchange I am not up to recounting.
* She affirms me on inventiveness.  That's nice.  This is during a perfect-weather walk.  After the walk I end up giving her a 30-min orientation on the computer -- very frustrating and I turn surly at the end.  I haven't thought of an aff for her yet.
!!! ~Mid-January
* I tell her I need her to represent me well to others:  If she is angry, it is good to put this into words, and it is bad to portray my part of a discussion and color up the representation because "she felt angry about it."  She did it a week ago with Laurie -- "And Scott is like, well you have to do this!" in a harsh grating tone.
* But methinks a problem goes deeper than that.  She RECEIVES what I am saying in this colored-up way.
* We have a few sessions going over the "Defenses" list.  
* if a man doesn't know how to rule his own house, how will he take care of the assembly of God? -- Applied to the Valdez sex life.  ?!?!
* Titus 1.6-7 children not accused (WEB) or not open to the charge (NIV) -- T unable to separate us from this liability, with out children
* [[BestPractices-T]]
* [[Idiolect-MCounsel]]
!! 2011 early
* Wedding vow 'loop holes'
* My political views - keep quiet
* Pawn shops
* 'without anyone askinq?'
* I have to raise the two of you right
* Elders mtg - she recalls decision
* //So we took it to the elders// -- when relating to Eddie about calling Mike D. for counsel.  //Well, he wasn't an elder yet, but we regarded him as one.//
* BeBroken wants to have a marketing plan -- this is evil.
!! Defensiveness
Lashing out defense +++
## That's the dumbest thing I've ever heard anyone say (2011)
## That's one of the most satanic things I've ever heard (2011)
## You're being like Tom (2011)
===
* 3 things that made T say, 'I've had enough of the 80% rule.'
## lapse
## J's grades
## T/W clean
Defensive scene -- Dr Slaughter and elders +++
I arrive as planned for a consultation with Dr. S.  I am a bit late and T is found crestfallen, shattered.  The news is bad; Dr. S can't help her, though perhaps he can recommend a scan.  She is angry, feels slighted and disbelieved.  I tell her I see no real difference tween Dr. S and the 2002 Doctor Shea.  We talk a while and Dr. S summons us back into the offices.  He says his position and then says, "I am trying to address fixed thinking here ... I'm just trying to deal with some deep-seated misconceptions."  I note these words very carefully because they are the words I use so often; I note also that he is signaling me with his eyes.  When he is gone, I say //T, God is speaking something to you very directly here.//  I liken Dr. S. to Balaam's donkey.
# This medical disappointment
# The approach toward supporting foreign missions of our elders
# My recent emotional challenges
//T, I can't give you the peace of God.//  I speak about her giving up control.  She argues and is obtuse.  She does give up control, she says; for example, she assented on the congreg. survey.  I explain that she gives up control only when she is convinced she will not get her way; and that doesn't count.  She assented because the entire room was agreed that congreg. input was appropriate.  I think of Saturday night, when I refused her:  //One thing I can say for sure, I am not going to go to church and sign a statement saying I will go see a psychiatrist.//  She quickly replies with a sigh and the words, "Well, it has to be for you."  Yet obviously it was never for me.

I return to work, but decide to cease for the day and return home (battery light showing in the Ford; new fridge to be delivered; her regular HEB shopping; tonight's elders meeting to which she and MA have been  belatedly summoned).

I think:  //it can't be much clearer than all this.  Will she respond?//  Later she seeks to ask me about this control issue as it pertains to the meeting tonight, and I find she has twisted my admonishment to mean "give control to the elders."  I make her retrace the earlier time and she gets to "give control to God."  I affirm this restatement.

!! Over-interpreting
* Eddie on 1/24/12 exhorts T to //take people's statements at face value.  //
* But T later reviews:  //Other times, people tell me "don't take it at face-value; you have to also take into account the tone."  And I say back the words I remember (face-value), but I'm told I changed the tone.  //
* Andrew calls it over-interpreting (the next morning).
* She did it the next morning -- made a wrong inference by extended what I said and concluded the whole room was upset with her last Thursday.
* Often comes up as jumping to the hope, or, the fear.  On 1/29 I say //I wonder if Mike DeBow might have something to say about these issues// of the Valdez'.  She responded with alarm because of assumption I want to talk to Mike.  Usual sense of hard, sustained work to correct her misconstruction.
!! Judgmental
* Judgmental I:  We are discussing freedom and respect of other values in Romans 14.  In passionate affirmation of the latter, she spoke of //some campus leaders who decide they're just not going to have any alcohol while int hat position -- it's just a cost of the ministry.//  Later I point out to her that Andrew (almost certainly) enjoys beer, and in effect she's calling him out.  I don;t think she really sees what's happening there ... even though we're trying to be less judgmental AND these relationships are at risk.
* Judgmental II:  At home, on our way to bed (Wed. night) she is asking about freedom of conscience in Christ and grace.  //I mean, do you just 'have grace' for that// -- waving vaguely across the room -- //or do you have guilt, or how do you deal with it?//  I ask, //do you mean my desk?//  "Yes."  I give a closed non-response, and proceed toward sleep.
!! Optimism.
I share my realization that optimism comes more easily to me because I think there is less risk in a given situation.  From here T proceeds to observe that she is naturally more pessimistic because married.  This puts some tension in the conversation:
* MY stance is that
## objectively and Biblically, marriage is good (assuming stable), and we have a stable marriage;
## she would be unable to cope as a single, so marriage is particularly good for her;
## our children are grown, so risks are lessened;
* HER stance is that
## the precedent in her family is for women to marry and then divorce, generally miserable and endangered, so for her to embrace marriage is basically a hazardous step.
## Also that Paul said "such will have trouble in this life."
* ''What I foolishly react to'' is that her pessimism results from doubting my own faithfulness and stability.  This is true to some degree, but naturally due to FoO.
* ''What I need to take to heart'' is that even though the danger still looms in her imagination, she continues in marriage, and she wants me to appreciate her courage and faithfulness.
!! Big from Small
* Marilyn told her (mid-Jan 2012) she often can't distinguish big from small, and this is a trait of obsessive-compulsive people.  This does seem to describe a lot.  Inability to establish scope or scale.
* Mental picture of an old-time movie -- the man ascends the stairs, and behind him his shadow looms large.
* Relates to "What it takes to be Safe" and "What it takes to be righteous."
!! Instant law
* Our agreement signed and good through 2040 -- no '12-hour rule' for check-in.
* Later that Thursday, she finally comes out with a 'no sex maybe forever' doctrine.
More +++
* Talking this through is very disturbing for me, but I remain very calm and husband-like, and the mood proceeds to life.  We have a sweet St. Val's Day on Saturday (R. is on a field trip).  But I also write Dr. W and others with a high level of alert -- //resume psychotropic medications.//
* In Jan 2012 we have a session with Shawn Langford and I ask her forgiveness for the perceived "bad vow".  Big relief.
* Newbie check in and her likely assumption that I would use it to weasel out of rigorous check-in.  I frame it with some care, and she acquits herself just fine.
===
!! Fear and comforting
* It is hard for her to ask a question, a real question.  The trouble is the answer is already in place for her.  It has to be, because the tension of a question with no answer yet is unbearable for her.  Also, the wrong answer is unbearable.  When she asks, "What's wrong?", any answer that maintains something is wrong is already disbarred.  Therefore it is greeted with denial, justification, defensiveness.

More +++
* Arguing about whether or when to give money to one's parents.  The "corban" passage makes her feel guilty all the time.  T has no measure for when to know parents have been "honored", and it seems she would have no limit to the money she gives.
* [On awakening] I guess it was a dream ... Were you teaching R. how to masturbate?  //No.  That was a dream.//  Oh.  P. was there too.  I called the police ... //That was pretty high on the dream scale.//  Okay.  Thank you.
* [30 min. later]  I'm going to walk with Peggy tomorrow at 7:00 in the morning!  Unless you disapprove.  //Why would I disapprove?  That's a good plan, I'm glad you're going to get to see her.//
* I announce I want to keep a house key hidden outside the back door.  T is resistant.  The real reason is prolly about danger from intruders; but she says, "If you forget your key, you deserve to be locked out of the house."
* The classic pattern:
## I have a concern
## T feels overwhelmed
## T challenges me
## I give supporting details about concern
## T feels overwhelmed
## T feels threatened by me -- {{{Why do you share this stuff with me?}}}
## T challenges my details -- {{{That's not true!}}}
## I give supporting details about concern
## T feels overwhelmed
## T feels threatened by me ...
===

Timeline +++
2011 Feb -- * T Ross seems ready to start DBT (dielectic behavior therapy)
===
* [[Forty_Disappointments-Autism]]
* T would not enjoy a pot luck fundraiser.  :-)
* "All I have left is my frontal lobe."
* R. says, you shouldn't stare
* //Walking on a fault line.//
* Intimacy must precede insight.
* Insight does not mean expression or understanding of the insight. 
* It's not only that no one would believe you about the intensity of this experience. It's that you don't believe yourself: it's difficult to put in words because you don't dare to, actually because it's unimaginable.  
* It would require a theory of mind for her -- which is as difficult as her theory of mind for me. And, again mutually, it's easiest to assume that theory of mind is established.

Cassandra syndrome.  
[[Onerous-discussion]]
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.04.11 [1.9.5] pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};

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

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

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

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
/***
|Name|InlineJavascriptPluginInfo|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for InlineJavascriptPlugin|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code.  When a tiddler is rendered, the plugin automatically invokes any embedded scripts, which can be used to construct and return dynamically-generated output that is inserted into the tiddler content.
{{{
<script type="..." src="..." label="..." title="..." key="..." show>
    /* javascript code goes here... */
</script>
}}}
All parameters are //optional//.    When the ''show'' keyword is used, the plugin will also include the script source code in the output that it displays in the tiddler.  This is helpful when creating examples for documentation purposes (such as used in this tiddler!)

__''Deferred execution from an 'onClick' link''__
<script label="click here" title="mouseover tooltip text" key="X" show>
    /* javascript code goes here... */
    alert('you clicked on the link!');
</script>
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text, and a {{{key="X"}}} parameter to specify an //access key// (which must be a //single// letter or numeric digit only).

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

In addition to loading the javascript from the external file, you can also use this feature to invoke javascript code contained within the {{{<script>...</script>}}} markers.  This code is invoked //after// the external script file has been processed, and can make immediate use of the functions and/or global variables defined by the external script file.
>Note: To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that is rendered as soon as your TiddlyWiki document is opened, such as MainMenu.  For example: put your {{{<script src="..."></script>}}} syntax into a separate 'library' tiddler (e.g., LoadScripts), and then add {{{<<tiddler LoadScripts>>}}} to MainMenu so that the library is loaded before any other tiddlers that rely upon the functions it defines.
>
>Normally, loading external javascript in this way does not produce any direct output, and should not have any impact on the appearance of your MainMenu.  However, if your LoadScripts tiddler contains notes or other visible content, you can suppress this output by using 'inline CSS' in the MainMenu, like this: {{{@@display:none;<<tiddler LoadScripts>>@@}}}
<<<
!!!!!Creating dynamic tiddler content and accessing the ~TiddlyWiki DOM
<<<
An important difference between TiddlyWiki inline scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document: in a typical web document, you use the {{{document.write()}}} (or {{{document.writeln()}}}) function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.

However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and instead will //completely replace the entire ~TiddlyWiki document in your browser window (which is clearly not a good thing!)//.  In order to allow scripts to use {{{document.write()}}}, the plugin automatically converts and buffers all HTML output so it can be safely inserted into your tiddler content, immediately following the script.

''Note that {{{document.write()}}} can only be used to output "pure HTML" syntax.  To produce //wiki-formatted// output, your script should instead return a text value containing the desired wiki-syntax content'', which will then be automatically rendered immediately following the script.  If returning a text value is not sufficient for your needs, the plugin also provides an automatically-defined variable, 'place', that gives the script code ''direct access to the //containing DOM element//'' into which the tiddler output is being rendered.  You can use this variable to ''perform direct DOM manipulations'' that can, for example:
* generate wiki-formatted output using {{{wikify("...content...",place)}}}
* vary the script's actions based upon the DOM element in which it is embedded
* access 'tiddler-relative' DOM information using {{{story.findContainingTiddler(place)}}}
Note:
''When using an 'onclick' script, the 'place' element actually refers to the onclick //link text// itself, instead of the containing DOM element.''  This permits you to directly reference or modify the link text to reflect any 'stateful' conditions that might set by the script.  To refer to the containing DOM element from within an 'onclick' script, you can use "place.parentNode" instead.
<<<
!!!!!Instant "bookmarklets"
<<<
You can also use an 'onclick' link to define a "bookmarklet": a small piece of javascript that can be ''invoked directly from the browser without having to be defined within the current document.''  This allows you to create 'stand-alone' commands that can be applied to virtually ANY TiddlyWiki document... even remotely-hosted documents that have been written by others!!  To create a bookmarklet, simply define an 'onclick' script and then grab the resulting link text and drag-and-drop it onto your browser's toolbar (or right-click and use the 'bookmark this link' command to add it to the browser's menu).

Notes:
*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script.  As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,''  and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
<<<
!!!!!Special reserved function name
<<<
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
<<<
!!!!!$(...) 'shorthand' function
<<<
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
{{{
$(id)
}}}
in place of the normal standard javascript syntax:
{{{
document.getElementById(id)
}}}
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
<<<
!!!!!Examples
<<<
simple dynamic output:
><script show>
    document.write("The current date/time is: "+(new Date())+"<br>");
    return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
    if (!window.story) window.story=window;
    var title=story.findContainingTiddler(place).getAttribute("tiddler");
    var size=store.getTiddlerText(title).length;
    return title+" is using "+size+" bytes";
</script>
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
    document.write("<br>The current date/time is: "+(new Date())+"<br>");
    return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
    if (!window.story) window.story=window;
    var txt=place.firstChild.data;
    var tid=story.findContainingTiddler(place).getAttribute('tiddler');
    alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
</script>
dynamically setting onclick link text based on stateful information:
>{{block{
{{{
<script label="click here">
    /* toggle "txtSomething" value */
    var on=(config.txtSomething=="ON");
    place.innerHTML=on?"enable":"disable";
    config.txtSomething=on?"OFF":"ON";
    return "\nThe current value is: "+config.txtSomething;
</script><script>
    /* initialize onclick link text based on current "txtSomething" value */
    var on=(config.txtSomething=="ON");
    place.lastChild.previousSibling.innerHTML=on?"disable":"enable";
</script>
}}}
<script label="click here">
    /* toggle "txtSomething" value */
    var on=(config.txtSomething=="ON");
    place.innerHTML=on?"enable":"disable";
    config.txtSomething=on?"OFF":"ON";
    return "\nThe current value is: "+config.txtSomething;
</script><script>
    /* initialize onclick link text based on current "txtSomething" value */
    var on=(config.txtSomething=="ON");
    place.lastChild.innerHTML=on?"enable":"disable";
</script>
}}}
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
>
><script src="demo.js" show>
    return "inlineJavascriptDemo() function has been defined"
</script>
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
    inlineJavascriptDemo();
</script>
<<<
!!!!!Revisions
<<<
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
2009.04.11 1.9.5 pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 1.9.4 in $(), handle leading '#' on ID for compatibility with JQuery syntax
2008.06.11 1.9.3 added $(...) function as 'shorthand' for document.getElementById()
2008.03.03 1.9.2 corrected fallback declaration of wikifyPlainText() (fixes Safari "parse error")
2008.02.23 1.9.1 in onclick function, use string instead of array for 'bufferedHTML' (fixes IE errors)
2008.02.21 1.9.0 output from 'onclick' scripts (return value or document.write() calls) are now buffered and rendered into into a span following the script.  Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed).  Thanks to Xavier Verges for suggestion and preliminary code.
2008.02.14 1.8.1 added backward-compatibility for use of wikifyPlainText() in TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 1.8.0 added support for key="X" syntax to specify custom access key definitions
2007.12.15 1.7.0 autogenerate URI encoded HREF on links for onclick scripts.  Drag links to browser toolbar to create bookmarklets.  IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets.  In addition, double-quotes will cause syntax errors.  Thanks to PaulReiber for debugging and brainstorming.
2007.11.26 1.6.2 when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 1.6.1 when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 1.6.0 added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 1.5.2 add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
2006.06.01 1.5.1 when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 1.5.0 added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 1.4.0 added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
2005.12.13 1.3.1 when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
2005.11.09 1.3.0 for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
2005.11.08 1.2.0 handle loading of javascript from an external URL via src="..." syntax
2005.11.08 1.1.0 pass 'place' param into scripts to provide direct DOM access
2005.11.08 1.0.0 initial release
<<<
T helped correct my understanding of Phil 2:10 and the "emptying" of Christ.  This was exciting.

A few nights later, last night it was, I related this at the dinner table.  But T became privately upset and indignant.  This because R. asked some normal teenage investigative questions about the Deity of Christ.  Besides this, she was upset with my presentation of doctrine, which apparently was just not good enough or had problems with delivery - (she says I looked at the ceiling a lot).

I told her I'd thought relating the doctrinal edification would be a good idea:
# It would be humble of me to relate a point of personal growth.
# It would reflect well on T, due to the credit of her having helped me.
# We would talk about the Bible as a family.
But it just made her disturbed for the evening.  She could not comprehend my explanation that it is completely normal for a teenager to re-investigate the faith, starting with basic points.  To her it's simply evidence that R. is probably a reprobate (my words).
This goes with the complex of [[Perseveration]] and [[Associative-thinking]]. 
* Creases on pants: She believes the crease should be at the exact midpoint between inseam and outseam.  The factory had a different opinion.  The factory crease is more permanent.  The result of her ironing is a double crease.  
Language is often strident.  
Some tendency to compressed speech when upset.  
!!! Only one definition accepted
This can mean favoring to the exclusion of others:
# the most literal meaning, which is usually the denotative meaning (listed first in a dictionary).
# the more negative meaning.  
----
* "Dreadful" was taken in it's literal and negative sense, which caused a very big upset in Year 2009.  
* I usually decide that opening a dictionary will add clarity and even deescalate a conflict.  
** This usually vindicates her perspective.  (It takes a neurotypical to routinely favor the //non-literal// meaning of a word").
** Nonetheless, she is offended by reaching for the dictionary -- less so nowadays, I think.  
!!! Different assumptions made for clause-level ambiguities.
* When relating a story about persons, pronoun referents are left ambiguous or changed without notice.  
* When listening, she loses track of pronoun referents... rather as ''I'' had the problem described above.  
!!! My explanations are prone to radical misconstruction
* Future decisions with uncertain outcomes are carefully explained, and received by her as certain.  
** I may say the person (someone she fears) could be potentially expected to visit, even as soon as Monday; on Monday she is preparing the house as for a set appointment.  
** Because "that's what you said!"  
* My tentative assent is taken as a commitment... which is taken as a promise.
** I have learned to be explicit, using statements such as "I'm not committing myself." 
* Strange conversation, Jan 15.  T is talking to R. through is doorway, ajar.  I am half-aware of the conversation, in the kitchen.  I realize as she walks into the room that she is having the conversation with me.  R. has shut his door.  T has continued the topic and is addressing me, but I don;t know what she's talking about.
* Two weeks earlier, a significant strange conversation.  We are talking in the kitchen about something fairly inconsequential.  I decide the conversation seems to be over and i exit the room , closing the door (which is heavy and easy to notice).  I hear her add something to the conversation; so I open the door and pop in my head:  //I'm out of the room now.//  She says //Oh okay.//
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1a|
|Date:|27-Jun-20 11|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
  config.lessBackups = {
    // comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
    modes: [
      //["YYYY",  365*DAYS], // one per year for ever
      ["MMM",   31*DAYS],  // one per month
      //["ddd",   7*DAYS],   // one per weekday
      //["d0DD",  1*DAYS],   // one per day of month
      ["h0hh",  24*HOURS], // one per hour
      //["m0mm",  1*HOURS],  // one per minute
      //["s0ss",  1*MINS],   // one per second
      ["latest",0]         // always keep last version. (leave this).
    ]
  };
}

window.getSpecialBackupPath = function(backupPath) {

  var now = new Date();

  var modes = config.lessBackups.modes;

  for (var i=0;i<modes.length;i++) {

    // the filename we will try
    var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
        '$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

    // open the file
    try {
      if (config.browser.isIE) {
        var fsobject = new ActiveXObject("Scripting.FileSystemObject")
        var fileExists  = fsobject.FileExists(specialBackupPath);
        if (fileExists) {
          var fileObject = fsobject.GetFile(specialBackupPath);
          var modDate = new Date(fileObject.DateLastModified).valueOf();
        }
      }
      else {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
        file.initWithPath(specialBackupPath);
        var fileExists = file.exists();
        if (fileExists) {
          var modDate = file.lastModifiedTime;
        }
      }
    }
    catch(e) {
      // give up
      return backupPath;
    }

    // expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
    // June file on disk that's more than an month old then it must be stale so overwrite
    // note that "latest" should be always written because the expiration period is zero (see above)
    var expiry = new Date(modDate + modes[i][1]);
    if (!fileExists || now > expiry)
      return specialBackupPath;
  }
}

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
  return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}

//}}}
/***
|''Name''|LineBreakHack|
|''Description''|formatter modifying TiddlyWiki's handling of line breaks, before and after headings, lists and quots|
|''Author:''|Piesch Mario|
|''Version''|0.2.1|
|''Status''|@@beta@@|
|''Source''|http://apm-plugins.tiddlyspot.com/#LineBreakHack|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|

!Description

This formatter modifies the way line breaks in ~TiddlyWiki markup are rendered;
A linebreak at the end of the line and all following empty lines are replaced by: one {{{<br>}}}
One linebreak in front of a heading will be removed.


!!Examples
{{{
<<<
!Heading 1 at the beginning
Some distance also in editmode possible. As many lines as you wish.


!!Heading 2

Some text

Some more text<br>
Break the line with {{{<br>}}} <br>
forced linebreak and "new Line" produce an empty line
<<<

<<<
# numbered list

# one empty line <br> a line after a < br>
## doesn't break the list


# two empty lines do <br><br><br>
# br in front: does never break the list
<<<

<<<
>Quote by Line

>one empty line


>two empty lines
<<<
}}}
<<<
!Heading 1 at the beginning
Some distance also in editmode possible. As many lines as you wish.


!!Heading 2

Some text

Some more text<br>
Break the line with {{{<br>}}} <br>
forced linebreak and "new Line" produce an empty line
<<<

<<<
# numbered list

# one empty line <br>a line after a < br>
## doesn't break the list


# two empty lines do <br><br><br>
# br in front: does never break the list
<<<

<<<
>Quote by Line

>one empty line


>two empty lines
<<<
!Revision History

!!V0.2.1 (2010-02-24)
*Little changes in the description.

!!V0.2 (2010-01-01)
* removes all linebreaks after headings
* deals with lists
* changes blockqoute and linequote

!!V0.1 (2009-12-20)
* initial release


!Code
***/
//{{{
(function(formatters) { //# set up alias

    // modify line-break formatter to find more than one \n
    var lineBreak = formatters[formatters.findByField("name", "lineBreak")];
    lineBreak.match = "\\n+|<br ?/?>";
//  lineBreak.match = "\\n{1,2}|<br ?/?>";


    //remove one line break before heading.
    var heading = formatters[formatters.findByField("name", "heading")];
        merge( heading, {termRegExp: /(\n+)/mg});

        heading.match = "^\n?!{1,6}";
        heading.handler = function(w) {
            if (w.matchText[0]=='\n') w.matchLength = w.matchLength - 1;
            w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength), this.termRegExp);
        };

    for (var i=0; i<formatters.length; i++) {
        if (formatters[i].name == "list") {
            merge( formatters[i], {termRegExp: /(\n{1,2})/mg});
        }

        if (formatters[i].name == "quoteByBlock") {
            merge( formatters[i], {termRegExp: /(^<<<(\n{1,2}|$))/mg});
        }

        if (formatters[i].name == "quoteByLine") {
            merge( formatters[i], {termRegExp: /(\n{1,2})/mg});
            break;
        } // if ..
    } // for ..


})(config.formatters); //# end of alias
//}}}
Tacit invitation to the less-licit. 
{{{ }}}
{{small{
<<tiddler StoryMenu>>
}}}

----
{{tiny{
<<version>>
Updated
<script>return document.lastModified.toString();</script>}}}
Year 30:  
Me: I think we've spent more hours in marriage counseling than any of our friends. 
Her: I think we've spent more hours than all of them put together.  

I understood a year later why m.c. fails.  It's because one person only imagines she understands what was said.  The dynamic is the same as with a narcissist.  The point is emphasized heavily by the negative websites, and it's true.  

The m.c. always has a difficult job of gaining and retaining the trust of both people.  To the degree those people doubt or deny each other, the m.c. fails.  

We found our best counselor in that same Year 30.  He fully understood these challenges.  

[[Gender-dynamics]]
/***
|Name|MatchTagsPlugin|
|Source|http://www.TiddlyTools.com/#MatchTagsPlugin|
|Documentation|http://www.TiddlyTools.com/#MatchTagsPluginInfo|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|'tag matching' with full boolean expressions (AND, OR, NOT, and nested parentheses)|
!!!!!Documentation
> see [[MatchTagsPluginInfo]]
!!!!!Revisions
<<<
2008.09.04 [2.0.0] added "report" and "panel" options to generate formatted results and store in a tiddler.  Also, added config.macros.matchTags.formatList(place,fmt,sep) API to return formatted output for use with other plugins/scripts
| please see [[MatchTagsPluginInfo]] for additional revision details |
2008.02.28 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.MatchTagsPlugin= {major: 2, minor: 0, revision: 0, date: new Date(2008,9,4)};

// store.getMatchingTiddlers() processes boolean expressions for tag matching
//    sortfield (optional) sets sort order for tiddlers - default=title
//    tiddlers (optional) use alternative set of tiddlers (instead of current store)
TiddlyWiki.prototype.getMatchingTiddlers = function(tagexpr,sortfield,tiddlers) {

    var debug=config.options.chkDebug; // abbreviation
    var cmm=config.macros.matchTags; // abbreviation
    var r=[]; // results are an array of tiddlers
    var tids=tiddlers||store.getTiddlers(sortfield||"title");
    if (tiddlers && sortfield) store.sortTiddlers(tids,sortfield);
    if (debug) displayMessage(cmm.msg1.format([tids.length]));

    // try simple lookup to quickly find single tags or tags that
    // contain boolean operators as literals, e.g. "foo and bar"
    for (var t=0; t<tids.length; t++)
        if (tids[t].isTagged(tagexpr)) r.pushUnique(tids[t]);
    if (r.length) {
        if (debug) displayMessage(cmm.msg4.format([r.length,tagexpr]));
        return r;
    }

    // convert expression into javascript code with regexp tests,
    // so that "tag1 AND ( tag2 OR NOT tag3 )" becomes
    // "/\~tag1\~/.test(...) && ( /\~tag2\~/.test(...) || ! /\~tag3\~/.test(...) )"

    // normalize whitespace, tokenize operators, delimit with "~"
    var c=tagexpr.trim(); // remove leading/trailing spaces
    c = c.replace(/\s+/ig," "); // reduce multiple spaces to single spaces
    c = c.replace(/\(\s?/ig,"~(~"); // open parens
    c = c.replace(/\s?\)/ig,"~)~"); // close parens
    c = c.replace(/(\s|~)?&&(\s|~)?/ig,"~&&~"); // &&
    c = c.replace(/(\s|~)AND(\s|~)/ig,"~&&~"); // AND
    c = c.replace(/(\s|~)?\|\|(\s|~)?/ig,"~||~"); // ||
    c = c.replace(/(\s|~)OR(\s|~)/ig,"~||~"); // OR
    c = c.replace(/(\s|~)?!(\s|~)?/ig,"~!~"); // !
    c = c.replace(/(^|~|\s)NOT(\s|~)/ig,"~!~"); // NOT
    c = c.replace(/(^|~|\s)NOT~\(/ig,"~!~("); // NOT(
    // change tag terms to regexp tests
    var terms=c.split("~"); for (var i=0; i<terms.length; i++) { var t=terms[i];
        if (/(&&)|(\|\|)|[!\(\)]/.test(t) || t=="") continue; // skip operators/parens/spaces
        if (t==config.macros.matchTags.untaggedKeyword)
            terms[i]="tiddlertags=='~~'"; // 'untagged' tiddlers
        else
            terms[i]="/\\~"+t+"\\~/.test(tiddlertags)";
    }
    c=terms.join(" ");
    if (debug) { displayMessage(cmm.msg2.format([tagexpr])); displayMessage(cmm.msg3.format([c])); }

    // scan tiddlers for matches
    for (var t=0; t<tids.length; t++) {
        // assemble tags from tiddler into string "~tag1~tag2~tag3~"
        var tiddlertags = "~"+tids[t].tags.join("~")+"~";
        try { if(eval(c)) r.push(tids[t]); } // test tags
        catch(e) { // error in test
            displayMessage(cmm.msg2.format([tagexpr]));
            displayMessage(cmm.msg3.format([c]));
            displayMessage(e.toString());
            break; // skip remaining tiddlers
        }
    }
    if (debug) displayMessage(cmm.msg4.format([r.length,tagexpr]));
    return r;
}
//}}}
//{{{
config.macros.matchTags = {
    msg1: "scanning %0 input tiddlers",
    msg2: "looking for '%0'",
    msg3: "using expression: '%0'",
    msg4: "found %0 tiddlers matching '%1'",
    noMatch: "no matching tiddlers",
    untaggedKeyword: "-",



    untaggedLabel: "no tags",
    untaggedPrompt: "show tiddlers with no tags",
    defTiddler: "MatchingTiddlers",
    defFormat: "%0",
    defSeparator: "\n",
    reportHeading: "Found %0 tiddlers tagged with: '{{{%1}}}'\n----\n",
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var mode=params[0]?params[0].toLowerCase():'';
        if (mode=="inline")
            params.shift();
        if (mode=="report" || mode=="panel") {
            params.shift();
            var target=params.shift()||this.defTiddler;
        }
        if (mode=="popup") {
            params.shift();
            if (params[0]&&params[0].substr(0,6)=="label:") var label=params.shift().substr(6);
            if (params[0]&&params[0].substr(0,7)=="prompt:") var prompt=params.shift().substr(7);
        } else {
            var fmt=(params.shift()||this.defFormat).unescapeLineBreaks();
            var sep=(params.shift()||this.defSeparator).unescapeLineBreaks();
        }
        var sortBy="+title";
        if (params[0]&&params[0].substr(0,5)=="sort:") sortBy=params.shift().substr(5);
        var expr = params.join(" ");
        if (mode!="panel" && (!expr||!expr.trim().length)) return;
        if (expr==this.untaggedKeyword)
            { var label=this.untaggedLabel; var prompt=this.untaggedPrompt };
        switch (mode) {
            case "popup": this.createPopup(place,label,expr,prompt,sortBy); break;
            case "panel": this.createPanel(place,expr,fmt,sep,sortBy,target); break;
            case "report": this.createReport(target,expr,fmt,sep,sortBy); break;
            case "inline": default: this.createInline(place,expr,fmt,sep,sortBy); break;
        }
    },
    formatList: function(tids,fmt,sep) {
        var out=[];
        for (var t=0; t<tids.length; t++) {
            var title="[["+tids[t].title+"]]";
            var who=tids[t].modifier;
            var when=tids[t].modified.toLocaleString();
            var text=tids[t].text;
            var first=tids[t].text.split("\n")[0];
            var desc=store.getTiddlerSlice(tids[t].title,"description");
            desc=desc||store.getTiddlerSlice(tids[t].title,"Description");
            desc=desc||store.getTiddlerText(tids[t].title+"##description");
            desc=desc||store.getTiddlerText(tids[t].title+"##Description");
            out.push(fmt.format([title,who,when,text,first,desc]));
        }
        return out.join(sep);
    },
    createInline: function(place,expr,fmt,sep,sortBy) {
        wikify(this.formatList(store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy),fmt,sep),place);
    },
    createPopup: function(place,label,expr,prompt,sortBy) {
        var btn=createTiddlyButton(place,
            (label||expr).format([expr]),
            (prompt||config.views.wikified.tag.tooltip).format([expr]),
            function(ev){ return config.macros.matchTags.showPopup(this,ev||window.event); });
        btn.setAttribute("sortBy",sortBy);
        btn.setAttribute("expr",expr);
    },
    showPopup: function(here,ev) {
        var p=Popup.create(here); if (!p) return false;
        var tids=store.getMatchingTiddlers(here.getAttribute("expr"));
        store.sortTiddlers(tids,here.getAttribute("sortBy"));
        var list=[]; for (var t=0; t<tids.length; t++) list.push(tids[t].title);
        if (!list.length) createTiddlyText(p,this.noMatch);
        else {
            var b=createTiddlyButton(createTiddlyElement(p,"li"),
                config.views.wikified.tag.openAllText,
                config.views.wikified.tag.openAllTooltip,
                function() {
                    var list=this.getAttribute("list").readBracketedList();
                    story.displayTiddlers(null,tids);
                });
            b.setAttribute("list","[["+list.join("]] [[")+"]]");
            createTiddlyElement(p,"hr");
        }
        var out=this.formatList(tids," &nbsp;%0&nbsp; ","\n"); wikify(out,p);
        Popup.show(p,false);
        ev.cancelBubble=true;
        if(ev.stopPropagation) ev.stopPropagation();
        return false;
    },
    createReport: function(target,expr,fmt,sep,sortBy) {
        var tids=store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy);
        if (!tids.length) { displayMessage('no matches for: '+expr); return false; }
        var msg=config.messages.overwriteWarning.format([target]);
        if (store.tiddlerExists(target) && !confirm(msg)) return false;
        var out=this.reportHeading.format([tids.length,expr])
        out+=this.formatList(tids,fmt,sep);
        store.saveTiddler(target,target,out,config.options.txtUserName,new Date(),[],{});
        story.closeTiddler(target); story.displayTiddler(null,target);
    },
    createPanel: function(place,expr,fmt,sep,sortBy,tid) {
        var html="<form style='display:inline'><!-- \
            --><input type='text'    name='expr' style='width:55%' title='tag expression'><!-- \
            --><input type='text'    name='fmt'  style='width:10%' title='list item format'><!-- \
            --><input type='text'    name='sep'  style='width:5%'  title='list item separator'><!-- \
            --><input type='text'    name='tid'  style='width:20%' title='target tiddler title'><!-- \
            --><input type='button'  name='go'   style='width:8%'  value='go' onclick=\" \
                var expr=this.form.expr.value; \
                if (!expr.length) { alert('Enter a boolean tag expression'); return false; } \
                var fmt=this.form.fmt.value; \
                if (!fmt.length) { alert('Enter the list item output format'); return false; } \
                var sep=this.form.sep.value.unescapeLineBreaks(); \
                var tid=this.form.tid.value; \
                if (!tid.length) { alert('Enter a target tiddler title'); return false; } \
                config.macros.matchTags.createReport(tid,expr,fmt,sep,'title'); \
                return false;\"> \
            </form>";
        var s=createTiddlyElement(place,"span"); s.innerHTML=html;
        var f=s.getElementsByTagName("form")[0];
        f.expr.value=expr; f.fmt.value=fmt; f.sep.value=sep.escapeLineBreaks(); f.tid.value=tid;
    }
};
//}}}
//{{{
// SHADOW TIDDLER for displaying default panel input form
config.shadowTiddlers.MatchTags="{{smallform{<<matchTags panel>>}}}";
//}}}
//{{{
// TWEAK core filterTiddlers() for enhanced boolean matching in [tag[...]] syntax:
// use getMatchingTiddlers instead getTaggedTiddlers
var fn=TiddlyWiki.prototype.filterTiddlers;
fn=fn.toString().replace(/getTaggedTiddlers/g,"getMatchingTiddlers");
eval("TiddlyWiki.prototype.filterTiddlers="+fn);
//}}}
//{{{
// REDEFINE core handler for enhanced boolean matching in tag:"..." paramifier
// use filterTiddlers() instead of getTaggedTiddlers() to get list of tiddlers.
config.paramifiers.tag = {
    onstart: function(v) {
        var tagged = store.filterTiddlers("[tag["+v+"]]");
        story.displayTiddlers(null,tagged,null,false,null);
    }
};
//}}}
/***
|Name|MatchTagsPluginInfo|
|Source|http://www.TiddlyTools.com/#MatchTagsPlugin|
|Documentation|http://www.TiddlyTools.com/#MatchTagsPluginInfo|
|Version|2.0.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for MatchTagsPlugin|
!!!!!Usage
<<<
This plugin extends the {{{[tag[tagname]]}}} macro parameter syntax used by the TiddlyWiki core {{{<<list>>}}} macro so that, instead of a simple tagname value, you can specify a complex combination of tagname values using a //boolean expression// containing AND, OR, and NOT operators, enclosed in nested parentheses if needed.
{{{
<<list filter "[tag[expression]]">>
}}}
In addition, the plugin defines a new macro, {{{<<matchTags ...>>}}} that can be used instead of the core {{{<<list>>}}} macro to output a list of matching tiddlers //using a custom 'item format' and 'separator'//.  You can also use this macro to create a command link that displays the matching tiddlers within a popup list, similar to the standard {{{<<tag tagName>>}}} macro, but matching a combination of tag values rather than a single tag value.
{{{
<<matchTags inline "format" "separator" sort:fieldname tag expression>>
<<matchTags popup "label:..." "prompt:..." sort:fieldname tag expression>>
<<matchTags report TiddlerName "format" "separator" sort:fieldname tag expression>>
<<matchTags panel  Tiddlername "format" "separator" sort:fieldname tag expression>>
}}}
where:
* ''inline'', ''report'', ''panel'', and ''popup''<br>are keywords that indicate the type of output that the macro should produce:
** ''inline'' //(default)// - displays a list of matching tiddlers embedded directly in tiddler content
** ''popup'' - embeds a command button that, when clicked, lists matching tiddlers in a ~TiddlyWiki popup display
** ''report'' - generates a list of matching tiddler in a separate [[MatchingTiddlers]] report tiddler
** ''panel'' - displays an interactive form for generating a [[MatchingTiddlers]] report
* ''format''<br>defines the wiki-syntax for rendering list items.  The following //substitution markers// can be used to insert tiddler-specific information for each matched tiddler:
** {{{%0}}} - title
** {{{%1}}} - modifier (author)
** {{{%2}}} - modified (date of last change)
** {{{%3}}} - text (all tiddler content)
** {{{%4}}} - firstline (tiddler content up to the first newline)
** {{{%5}}} - description (tiddler slice or section content named "description" or "Description")
** {{{%6}}} - tags (space-separated, bracketed list)
* ''separator''<br>defines the wiki-syntax to use //between// each matching title (e.g., ", " creates a comma-separated list, while "\n" displays one tiddler per line).
* ''sort:fieldname'' (optional)<br>specifies the sort order for the resulting list of tiddlers.  You can specify any tiddler field name (standard or custom-defined).  Standard tiddler fieldnames include: //title, created, modified, modifier//.  If not specified, tiddlers are sorted by title.  You can prefix the fieldname with "+" or "-" to indicate ascending or descending order, respectively.
* ''tag expression''<br>the remaining parameter(s) are joined together to define the boolean expression to be matched.
When using the ''popup'' option, there are two additional (and optional) parameters you can specify:
* ''"label:..."''(optional)<br> indicates the text for the popup command link.  The default is to display the specified tag expression itself.
* ''"prompt:..."'' (optional)<br>indicates the mouseover 'tooltip' for the popup command link.
* note: you can apply custom CSS styles (e.g., font size) to the popup by adding a rule for ".matchTags .popup" to your [[StyleSheet]].
When using the ''report'' or ''panel'' option, an additional parameter may be provided:
* ''~TiddlerName''<br>specifies the target tiddler into which the output will be generated (default: [[MatchingTiddlers]])
Notes:
*A tag expression can use any combination of text operators: ''AND'', ''OR'', ''NOT'' (or their equivalent javascript operators: ''&&'', ''||'', ''!''), contained in nested parentheses as needed.
*Operators should be delimited by spaces or parentheses.
*Before matching, leading/trailing spaces are automatically trimmed and multiple spaces are reduced to single spaces.
*Tag values containing embedded spaces do //not// have to be enclosed in {{{[[...]]}}}.
*Tag values that contain boolean operators as ''literal text'' (e.g., {{{"foo and bar"}}} or {{{"foo && bar"}}} cannot be used within a compound boolean expression, but //can// be matched if specified by themselves, without any other tag values or operators.
*To match tiddlers that are untagged, use "-" as a special tag value within the expression.
*You can match "wildcard" tags  by using //regular expression// (i.e., "text pattern") syntax within a tag value, e.g. {{{[Tt]agvalue.*}}}
<<<
!!!!!Examples:
<<<
display a popup list:
{{{
<<matchTags popup sample OR (settings AND systemConfig)>>
}}}
><<matchTags popup sample OR (settings AND systemConfig)>>
display a popup list with custom label:
{{{
<<matchTags popup "label:samples and settings" sample OR (settings AND systemConfig)>>
}}}
><<matchTags popup "label:samples and settings" sample OR (settings AND systemConfig)>>
display a popup list of untagged tiddlers:
{{{
<<matchTags popup ->>
}}}
><<matchTags popup ->>
generate a report using interactive form control panel
{{{
<<matchTags panel "MatchingTiddlers" "[[%0]]" "\n" sample OR (settings AND systemConfig)>>
}}}
>{{smallform{<<matchTags panel "MatchingTiddlers" "[[%0]]" "\n" sample OR (settings AND systemConfig)>>}}}
comma-separated list:
{{{
<<matchTags "[[%0]]" ", " sample OR (settings AND systemConfig)>>
}}}
><<matchTags "[[%0]]" ", " sample OR (settings AND systemConfig)>>
numbered list (sorted by modification date, most recent first):
{{{
<<matchTags "#[[%0]] (%2)<br>^^%5^^" "\n" sort:-modified sample OR (settings AND systemConfig)>>
}}}
><<matchTags "#[[%0]] (%2)<br>^^%5^^" "\n" sort:-modified sample OR (settings AND systemConfig)>>
bullet-item list (using the TiddlyWiki core {{{<<list filter ...>>}}} macro):
//(Note: when using the core {{{<<list>>}}} macro, you should always enclose the entire tag filter parameter within quotes)//
{{{
<<list filter "[tag[sample OR (settings AND systemConfig)]]">>
}}}
><<list filter "[tag[sample OR (settings AND systemConfig)]]">>
<<<
!!!!!Revisions
<<<
2011.10.28 2.0.6 added .matchTags CSS class to popups to enable custom styling via StyleSheet
2011.01.22 2.0.5 fix core tweak for TW262+: adjust code in config.filters['tag'] instead of filterTiddlers()
2010.08.11 2.0.4 in getMatchingTiddlers(), fixed sorting for descending order (e.g, "-created")
2010.03.02 2.0.3 added %6 format (tags)
2010.03.01 2.0.2 in formatList(), don't automatically put '[[' and ']]' around title (%0) in formatted output
2009.08.29 2.0.1 added support for {{{config.macros.matchTags.defTags}}} to auto-tag [[MatchingTiddlers]] output
2008.09.04 2.0.0 added "report" and "panel" options to generate formatted results and store in a tiddler.  Also, added config.macros.matchTags.formatList(place,fmt,sep) API to return formatted output for use with other plugins/scripts
2008.09.01 1.9.2 fixed return value from popup button handler so IE doesn't attempt to leave the page
2008.08.31 1.9.1 improved expression conversion handling to permit use of regular expressions for "wildcard" matching within tag values
2008.06.12 1.9.0 added support for formatted output of: title, who, when, text, firstline, description (slice or section)
2008.06.05 1.8.0 in getMatchingTiddlers(), added optional sortfield and tiddlers params to support use of alternative set of tiddlers instead of using current store content (provides filtering support for ImportTiddlersPlugin)
2008.06.04 1.7.1 in getMatchingTiddlers(), reworked conversion of expression for more robust parsing of whitespace, parentheses and javascript operators and allow use of "-" (untagged) //within// expressions
2008.05.19 1.7.0 in getMatchingTiddlers(), use reverseLookup() instead of forEachTiddler() to permit access to tiddlers included via [[IncludePlugin|http://tiddlywiki.abego-software.de/#IncludePlugin]]
2008.05.17 1.6.0 in getMatchingTiddlers(), rewrote expression conversion to handle tags with spaces tag values that are substrings of other tag values.
2008.05.16 1.5.0 added special case using "-" to find UNTAGGED tiddlers
2008.05.15 1.4.0 added "popup" output option
2008.05.14 1.3.4 instead of hijacking getTaggedTiddlers(), added tweak of filterTiddlers() prototype to replace getTaggedTiddlers() with getMatchingTiddler() so that core use of getTaggedTiddlers() does not perform boolean processing of tiddler titles such as [[To Be or not To Be]].  Also, improved "filter error" messages in getMatchingTiddlers() to report tag expression in addition to actual eval error.
2008.04.25 1.3.3 in getTaggedTiddlers(), fixed handling for "not" embedded within a tag
2008.04.21 1.3.2 in getTaggedTiddlers(), fixed handling for initial "NOT" and "NOT(expr)" syntax
2008.04.20 1.3.1 in getTaggedTiddlers(), corrected check for boolean expression to avoid excess processing of tags containing spaces.  Also, improved handling for non-existing tags that contain text of existing tags
2008.04.19 1.3.0 in filterTiddlers(), use getTaggedTiddlers() instead of matchTags(), and then hijack getTaggedTiddlers() to add matchTags() handling
2008.04.19 [*.*.*] plugin size reduction: moved documentation to [[MatchTagsPluginInfo]]
2008.03.25 1.2.0 added optional "sort:fieldname" parameter
2008.03.20 1.1.2 in handler(), replace 'encodeTiddlyLink' with explicit [[...]] brackets to ensure that one-word tiddler titles are properly rendered as TiddlyLinks
2008.02.29 1.1.1 in matchTags(), added handling to skip remaining tiddlers if expression has an error
2008.02.29 1.1.0 refactored to define store.matchTags() and extend store.filterTiddlers()
2008.02.28 1.0.0 initial release
<<<
{{{<<matchTags panel 'TestMatchTags2' 'label:buzza' 'attitude' >>}}}

<<matchTags panel  TestMatchTags2 '%0' '\n'  'attitude'>>


sort:fieldname
/***
|''Name''|MediaWikiTableFormatterPlugin|
|''Description''|Allows MediaWiki style tables in TiddlyWiki|
|''Author''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Contributors''|FND|
|''Version''|0.1.2|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#MediaWikiTableFormatterPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/MediaWikiTableFormatterPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.1.0|
!Description
Enables [[MediaWiki|http://www.mediawiki.org]]'s table markup in TiddlyWiki, allowing for multi-line contents within table cells.
(Note that all TiddlyWiki markup still applies.)
!Usage
Detailed documentation available at [[MediaWiki.org|http://www.mediawiki.org/wiki/Help:Tables]].
!!Examples
{{{
{|
! Heading 1
! Heading 2
! Heading 3
|-
| row 1, column 1
| row 1, column 2
| row 1, column 3
|-
| row 2, column 1
| row 2, column 2
| row 2, column 3
|}
}}}
{|
! Heading 1
! Heading 2
! Heading 3
|-
| row 1, column 1
| row 1, column 2
| row 1, column 3
|-
| row 2, column 1
| row 2, column 2
| row 2, column 3
|}
!Revision History
!!v0.1 (2008-10-31)
* initial release
!!v0.1.2 (2008-11-05)
* removed unnecessary code
!Code
***/
//{{{
if(!version.extensions.MediaWikiTableFormatterPlugin) { //# ensure that the plugin is only installed once
version.extensions.MediaWikiTableFormatterPlugin = {installed:true};

if(version.major < 2 || (version.major == 2 && version.minor < 1)) {
    alertAndThrow('MediaWikiTableFormatterPlugin requires TiddlyWiki 2.1 or later.');
}

config.formatters.push({
    name: 'enhancedTable',
    match: '^\\{\\|',
    handler: function(w) {
        var pair = MediaWikiTemplate.findTableBracePair(w.source,w.matchStart);
        if(pair.start==w.matchStart) {
            w.nextMatch = w.matchStart;
            var table = MediaWikiTemplate.createElement(w.output,'table');
            var tbody = MediaWikiTemplate.createElement(table,'tbody'); // required for IE
            var mwt = new MediaWikiTemplate();
            mwt.wikifyTable(tbody,w,pair);
        }
    }
});


MediaWikiTemplate = function()
{
    this.stack = [];
    this.error = false;
    this.tiddler = null;
};

MediaWikiTemplate.createElement = function(parent,element)
{
    return parent.appendChild(document.createElement(element));
}

MediaWikiTemplate.setAttributesFromParams = function(e,p)
{
    var re = /\s*(.*?)=(?:(?:"(.*?)")|(?:'(.*?)')|((?:\w|%|#)*))/mg;
    var match = re.exec(p);
    while(match) {
        var s = match[1].unDash();
        if(s == 'bgcolor') {
            s = 'backgroundColor';
        }
        try {
            if(match[2]) {
                e.setAttribute(s,match[2]);
            } else if(match[3]) {
                e.setAttribute(s,match[3]);
            } else {
                e.setAttribute(s,match[4]);
            }
        }
        catch(ex) {}
        match = re.exec(p);
    }
};

MediaWikiTemplate.findRawDelimiter = function(delimiter,text,start)
//# find a delimiter that is not enclosed by [[..]]
{
    var d = text.indexOf(delimiter,start);
    if(d==-1)
        return -1;
    var b = {start:-1,end:-1};
    var bs = text.indexOf('[[',start);
    if(bs==-1 || bs >d)
        return d;
    var s1 = -1;
    if(bs!=-1 && bs <d) {
        var be = text.indexOf(']]',bs);
        if(be!=-1) {
            b.start = bs;
            b.end = be;
        }
    }
    if(b.start!=-1 && d>b.start)
        s1 = b.end+2;
    return s1==-1 ? d : MediaWikiTemplate.findRawDelimiter(delimiter,text,s1);
};

MediaWikiTemplate.findTableBracePair = function(text,start)
{
    var ret = {start:-1,end:-1};
    var s = text.indexOf('{|',start);
    if(s==-1)
        return ret;
    var e = text.indexOf('\n|}',s+2);
    if(e==-1)
        return ret;
    e++;
    var s2 = text.indexOf('{|',s+2);
    if(s2==-1 || s2 > e)
        return {start:s,end:e};
    var tp = MediaWikiTemplate.findTableBracePair(text,s+2);
    while(tp.end!=-1 && e>tp.start && e<=tp.end) {
        //# intervening table brace pair, so skip over
        e = tp.end+2;
        tp = MediaWikiTemplate.findTableBracePair(text,e);
        e = text.indexOf('\n|}',e);
        if(e==-1)
            return ret;
        e++;
    }
    return {start:s,end:e};
};

MediaWikiTemplate.prototype.wikifyTable = function(table,w,pair)
{
    function lineEnd(w) {
        var r = w.source.indexOf('\n',w.nextMatch);
        while(r!=-1) {
            var n = w.source.substr(r+1,1);
            if(n=='|' || n=='!' || (n=='{' && w.source.substr(r+2,1)=='|'))
                break;
            r = w.source.indexOf('\n',r+1);
        }
        return r;
    }
    function subWikifyText(e,w,text) {
            var oldSource = w.source; var oldMatch = w.nextMatch;
            w.source = text; w.nextMatch = 0;
            w.subWikifyUnterm(e);
            w.source = oldSource; w.nextMatch = oldMatch;
    }
    //# skip over {|
    w.nextMatch += 2;
    var i = lineEnd(w);
    if(i>w.nextMatch) {
        MediaWikiTemplate.setAttributesFromParams(table.parentNode,w.source.substring(w.nextMatch,i));
        w.nextMatch = i;
    }
    w.nextMatch++;
    if(w.source.substr(w.nextMatch,2)=='|+') {
        var caption = MediaWikiTemplate.createElement(table,'caption');
        w.nextMatch += 2;
        i = lineEnd(w);
        var d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
        if(d!=-1 && d<i) {
            MediaWikiTemplate.setAttributesFromParams(caption,w.source.substring(w.nextMatch,d));
            w.nextMatch = d+1;
        }
        w.subWikifyTerm(caption,/(\n)/mg);
    }
    var tr = MediaWikiTemplate.createElement(table,'tr');
    if(w.source.substr(w.nextMatch,2)=='|-') {
        w.nextMatch += 2;
        i = lineEnd(w);
        if(i>w.nextMatch) {
            MediaWikiTemplate.setAttributesFromParams(tr,w.source.substring(w.nextMatch,i));
            w.nextMatch = i;
        }
        w.nextMatch++;
    }
    var x = w.source.substr(w.nextMatch,2);
    while(x!='|}') {
        if(x=='{|') {
            //# nested table
            var pair2 = MediaWikiTemplate.findTableBracePair(w.source,w.nextMatch);
            if(pair2.start==w.nextMatch) {
                var table2 = MediaWikiTemplate.createElement(cell,'table');
                this.wikifyTable(table2,w,pair2);
            }
        } else if(x=='|-') {
            //# new row
            tr = MediaWikiTemplate.createElement(table,'tr');
            w.nextMatch += 2;
            i = lineEnd(w);
            if(i==-1)
                break;
            if(i>w.nextMatch) {
                MediaWikiTemplate.setAttributesFromParams(tr,w.source.substring(w.nextMatch,i));
                w.nextMatch = i;
            }
            w.nextMatch++;
        } else if(x.substr(0,1)=='!') {
            //# header cell
            w.nextMatch++;
            i = lineEnd(w);
            if(i==-1)
                break;
            var cell = MediaWikiTemplate.createElement(tr,'th');
            var c = w.source.indexOf('!!',w.nextMatch);
            while(c!=-1 && c<i) {
                d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
                if(d!=-1 && d<c) {
                    MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
                    w.nextMatch = d+1;
                }
                while(w.source.substr(w.nextMatch,1)==' ') {
                    w.nextMatch++;
                }
                w.subWikifyTerm(cell,/(\!\!)/mg);
                cell = MediaWikiTemplate.createElement(tr,'th');
                c = w.source.indexOf('!!',w.nextMatch);
            }
            d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
            if(d!=-1 && d<i) {
                MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
                w.nextMatch = d+1;
            }
            while(w.source.substr(w.nextMatch,1)==' ') {
                w.nextMatch++;
            }
            subWikifyText(cell,w,w.source.substring(w.nextMatch,i));
            w.nextMatch = i+1;
        } else if(x.substr(0,1)=='|') {
            //# cell
            w.nextMatch++;
            i = lineEnd(w);
            if(i==-1)
                break;
            cell = MediaWikiTemplate.createElement(tr,'td');
            c = w.source.indexOf('||',w.nextMatch);
            while(c!=-1 && c<i) {
                d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
                if(d!=-1 && d<c) {
                    MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
                    w.nextMatch = d+1;
                }
                while(w.source.substr(w.nextMatch,1)==' ') {
                    w.nextMatch++;
                }
                w.subWikifyTerm(cell,/(\|\|)/mg);
                cell = MediaWikiTemplate.createElement(tr,'td');
                c = w.source.indexOf('||',w.nextMatch);
            }
            d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
            if(d!=-1 && d<i) {
                MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
                w.nextMatch = d+1;
            }
            while(w.source.substr(w.nextMatch,1)==' ') {
                w.nextMatch++;
            }
            subWikifyText(cell,w,w.source.substring(w.nextMatch,i));
            w.nextMatch = i+1;
        }
        x = w.source.substr(w.nextMatch,2);
    }
    w.nextMatch = pair.end + 3;
    return;
};

} //# end of 'install only once'
//}}}
2011-04

T requests my help and asks how she can know if something is merely a mistake, as opposed to a sin.  She gives an example.  If you had a bad day, and you took the SAT but you went through the questions in a hurried way, so you got a poor score -- that would be a sin.  

This obviously sounds strange, so I propose T define “sin” and “mistake” as a first step to knowing the difference.  

I ask T for definition of sin.  Sin is missing the mark, she replies.

No that is not the definition of sin, I say.  That is given as the origin of the word, but it's not the definition; when preachers bring it up, they may need to explain more.  

But this is the Aspie way.  Grab the negative meaning and put it on the white board.  It doesn’t matter you have heard a correct definition far more times than that.

T says:  Then, sin is going against what the Bible says.  This definition alarms me also, and we have a somewhat long contest about what is wrong with it.  I'm trying to point out the sin must be understood in terms of our relationship with God.  “But God gave us the Bible so that we would know what's right and wrong.”  There's a clipboard with my to-do list on the table, so I pick it up.  “Okay, so I’m God.  And there’s T.  Let’s she how she’s doing.  Looking down the Bible checklist, good, good – Oh oh, item 37 wasn’t done.”  And yes, that's how T looks at it.  I try to re-establish sin as a matter of relationship, not rule-keeping.  In response, T gradually adjusts her definition of sin to something that includes God, but it seems too forced to be meaningful.

I ask, can you think of something that is unambiguously a sin and not a mistake?  She can’t.  So I offer one: suppose I hate someone in my heart, and then call him a bad name.  She agrees that is certainly a matter of sin.

I ask, can you think of something that is a mistake and not a sin?  She thinks for a little while.  During this time she has a fixedly puzzled look on her face.  She says, say I'm going down the sidewalk, and I trip and fall; that would not be a sin.  I ask, what if you were being sloppy where you put your feet.  Isn't that a sin?

T smiles and agrees that might change things.

This is the problem with legalism, I declare.  You only look at outside behaviors.  God never does that.

Another approach I take is to narrow down the SAT scenario.   Say you got Question 37 wrong, and on a better day you would have gotten it right.  Did you sin?  T perseveres.  Yes, a sin: you were being careless. 

I respond Oh?  What if there was a homeless man right outside the door of the building, and you get partway through presenting the Gospel and you have to go because the test is starting.  He says, I must hear more, I have questions.  You say, I’ll come back just as soon as I can.  

T starts laughing.  I pour it on a bit more:  Wait, he cries, Could you just leave me a Number Two pencil, freshly sharpened?  And you, T, only brought two pencils.  

T says, you ask really hard questions.  I say when you want simple answers every question seems difficult.
2013-06

After my lapse, Marilyn Ross recommends that I check in daily for three months.  Of course this is immediately followed by T's demand that she review and approve the list of people with whom I check in.  There are about half a dozen names on the list.  We argue over whether William should be on the list.   At the last meeting it was just me and William (Labor Day holiday); I came back in a bad mood and was confrontational towards her.  T has thus determined the meeting was, so William is bad, so he is off the list.  
''Everything must be done right.  And there are no gray areas.'' 
T identifies the feeling "like a pounding in my head" when compliance seems less than complete.  
* [[Moral-scrupulosity]]
* [[Mistake-as-allowable]]
* Don't waste the mint.  There is no such thing as "excess" or "more than we ended up needing."  You can't pour out the last of the tea.
* Pickle rinds in the strainer.  She took them out to eat them, and expressed mild regret.  
* Sweeping only the traffic areas strikes her as an 80% cop-out.  Even if she does use that approach sometimes, she doesn't feel good about it.
Quoted section from __The Heart of Female Same Sex Attraction__.
She reproaches me for leaving teabag wrappers out on the counter.  When she upbraids me with her habitual harsh tone I feel threatened and attacked. it leaves me feeling unloved. also  confused because I don't know to what degree she is right or she is wrong  - which translates into the degree of my own culpability (and need to comply or repent). This ethical and relational confusion coincides with a fight/flight response. Together these pressure me to respond (conversationally and in terms of behavioral resolve) to comply, refuse, or deny the problem. In addition to the harsh tone, other ASD dynamics add noise to the signal. 
* [[All-or-nothing-perception]] induces use of the word "always". 
* [[Associative-thinking]] prevents her from treating the problem as discrete; it is tied in to other challenges, offenses. 
In a conflict, I have these options:
# Comply with her requirement. 
# Openly confront her, or defy her requirement.  
# Secretly defy her requirement. 
## "Don't ask, don't tell."
## "It's easier to beg for forgiveness than ask for permission." 
! 2013-06
It discourages me to go over all of this.  I don't want to do anything, and sleep is not a refuge.  I told T three hours ago that if I want to be by myself for a while, including church, that's my decision and perhaps necessary at this time.  I did specify that recovery continues with daily and weekly check-ins.  
''Let's stick it all in one place''  ... we'll call it "the pity pot".  

2023-01

I'm angry with T as I consider that she does not accommodate me, although I accommodate her in so many ways. 

I'm angry with ADHD as I consider that the end of each day is unplanned, a tailspin into bed. Not always, but usually and if care and attention is lacking. And in the morning, part of my day is picking up the pieces: Locating my glasses, taking debris off my workspace, and so on. I'm angry with ADHD as I consider that the end of each day is unplanned, a tailspin into bed. Not always, but usually and if care and attention is lacking. And in the morning, part of my day is picking up the pieces: Locating my glasses, taking debris off my workspace, and so on.
!! 2014-03

I deal with a lot of personal shame from having this awkward and disabled wife. I tried putting into words for myself what I feel, for example, when I am thinking about people I respect or want to impress – maybe the pastor, or Joel Schwartz – I believe what goes through my mind is, they think I'm some kind of fool, some kind of chump, to have married this woman who is so hard to be around. They can see that I could be a minister or a change agent in the community, if I weren't so tied up caring for her. What do my friends and – horrors – my relatives think about me running around, propping her up and fixing everything, defending her virtue and good qualities? They think I'm a fool.

I have to put this before the Lord. Am I a fool, or not? What does God think about it?

!! 2013-06

Now we are planning to change churches, and I hope to clear my name with people that she has used as sympathetic confidants – who have heard how unstable I am, how my commitment to God and reliance on the Bible seem uncertain, and how much she has done to try to help me, to no avail.
OTS: Ongoing trauma syndrome
''She takes a pessimistic view.''  
The robot ~C-3PO from Star Wars is a comical caricature.  So is Popeye's worrying wife Olive Oil. 
# Trauma from the past informs her present life -- which of course is the nature of trauma.  
# When uncertain, the default is taken as the only option (due to [[All-or-nothing-perception]]; and because of this trait, the negative position is the default.  
!!! Many things are ''bad''.  
# To not be bad, something must be perfectly or unambiguously good.  
** [[All-or-nothing-perception]]
** [[Moral-scrupulosity]]
# To not be bad, something must be perfectly or unambiguously understandable.  
** [[Theory-of-Mind]]
# Situations and their outcomes are perceived and remembered as bad.  
** Complexity triggers her [[All-or-nothing-perception]].  Life often is complicated, and my attempt to meet a situation thoughtfully can have a big negative rebound.  This caused many mutual griefs during our children's teenage years.  
# Pessimism 
** They say optimism is helpful for facing the day, but pessimism makes for much better predictions! 
** I often conclude she wants to make me feel ashamed for being optimistic.  
** In year 26, a counselor asked me during the first or second session, "Is she able to look at the future with hope?"  I recounted this to T and we shared a wry chuckle.  
----
* Combined with [[Fixed-perception]], her assessments of me can tend to remain negative and are subject to a kind of downward gravity.  
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.9|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.11.15 - 2.4.9 in adjustNestedSlider(), don't make adjustments if panel is marked as 'undocked' (CSS class).  In onClickNestedSlider(), SHIFT-CLICK docks panel (see [[MoveablePanelPlugin]])
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release.  Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
<<<
!!!!!Code
***/
//{{{
version.extensions.NestedSlidersPlugin= {major: 2, minor: 4, revision: 9, date: new Date(2008,11,15)};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
    Morpher.prototype.coreStop = Morpher.prototype.stop;
    Morpher.prototype.stop = function() {
        this.coreStop.apply(this,arguments);
        var e=this.element;
        if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
            // adjust panel overflow and position after animation
            e.style.overflow = "visible";
            if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
        }
    };
}
//}}}
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0a|
|Date:|27-Jun-20 11|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
  newHere: {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
    }
  },
  newJournalHere: {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
      wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
    }
  }
});

//}}}

/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1a|
|Date:|27-Jun-20 11|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
  numberRegExp = / \(([0-9]+)\)$/;
  var match = numberRegExp.exec(this);
  if (match) {
  var num = parseInt(match[1]) + 1;
    return this.replace(numberRegExp," ("+num+")");
  }
  else {
    return this + " (1)";
  }
}

config.macros.newTiddler.checkForUnsaved = function(newName) {
  var r = false;
  story.forEachTiddler(function(title,element) {
    if (title == newName)
      r = true;
  });
  return r;
}

config.macros.newTiddler.getName = function(newName) {
  while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
    newName = newName.getNextFreeName();
  return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
  var title = this.getAttribute("newTitle");
  if(this.getAttribute("isJournal") == "true") {
    title = new Date().formatString(title.trim());
  }

  // ---- these three lines should be the only difference between this and the core onClickNewTiddler
  if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
    title = config.macros.newTiddler.getName(title);

  var params = this.getAttribute("params");
  var tags = params ? params.split("|") : [];
  var focus = this.getAttribute("newFocus");
  var template = this.getAttribute("newTemplate");
  var customFields = this.getAttribute("customFields");
  if(!customFields && !store.isShadowTiddler(title))
    customFields = String.encodeHashMap(config.defaultCustomFields);
  story.displayTiddler(null,title,template,false,null,null);
  var tiddlerElem = story.getTiddler(title);
  if(customFields)
    story.addCustomFields(tiddlerElem,customFields);
  var text = this.getAttribute("newText");
  if(typeof text == "string")
    story.getTiddlerField(title,"text").value = text.format([title]);
  for(var t=0;t<tags.length;t++)
    story.setTiddlerTag(title,tags[t],+1);
  story.focusTiddler(title,focus);
  return false;
};

//}}}

/***
|''Name:''|NoCaseListPlugin|
|''Description:''|Adds a new command ''noCase'' to the core list macro|
|''Author:''|Mario Pietsch|
|''Version:''|0.2.0|
|''Date:''|2010.07.28|
|''Status:''|''beta''|
|''Source:''|http://apm-plugins.tiddlyspot.com/#NoCaseListPlugin|
|''License''|[[MIT License]]|
|''CoreVersion:''|2.5.0|
|''Requires:''||
|''Documentation:''|this file|
|''Keywords:''|list, sort, not case sensitive, filter|

!Description
This plugin performs a alphabetical sort for tiddlers, but it is not case sensitive. That means ab = AB = aB = Ab! And it does some little filtering using the RegExp syntax.
The RegExp Syntax can be a little bit tricky to read and configure. But the best description I have found is at [[regular-expressions.info]]. This plugin is aware of 'excludeLists', and does not display them.

!Example
{{{
<<list noCase title '[m]'>>
}}}
<<list noCase title '[m]'>>

!Default Format
{{{
<<list noCase>>
}}}

!Other Possibilities
<<<
!!!Reverse order
{{{
<<list noCase -title >>
}}}

!!!Some basic filtering
*Every tiddler title, that starts with a number from 0 to 9.
**Alphabetically sorted
{{{
<<list noCase -title '[0-9]'>>
}}}

*Every tiddler title, that starts with an ''"a"'' or ''"b"'' or ''"c"''.
{{{
<<list noCase title '[abc]'>>
}}}

*Every tiddler title, that starts with exactly ''abc''.
{{{
<<list noCase title 'abc'>>
}}}

I think this is enough power, for the beginning. See [[XCaseListPlugin|http://apm-plugins.tiddlyspot.com/#XCaseListPlugin]] for more.
<<<
!History
V 0.2.0 - 2010.07.28
*sorting can be done by custom field now

V 0.1.2 - 2010.03.04
*Fixed the source links

V 0.1.1 - 2010.02.24
*some minimum changes
*some more docu

V 0.1.0 - 2010.02.19
*Initial release

!Code
***/

/*{{{*/

if(!version.extensions.NoCaseListPlugin) { //# ensure that the plugin is only installed once
version.extensions.NoCaseListPlugin = { installed: true };

config.macros.list.noCase = {};
config.macros.list.noCase.handler = function(params)
{

var defaultField = "+title";
var lookupField  = "tags";
var lookupValue  = "excludeLists";
var lookupMatch  = false;
var results      = [];
var match        = null;

var sortField = params[1] || defaultField;

// get the sorting order
var asc = 1;
switch (sortField.substr(0, 1)) {
    case "-":
        asc = -1;
    case "+":
        sortField = sortField.substr(1);
        break;
    default:;
}

// define regExp and add ^ .. start of string
var regSnip = params[2] || '.'
var regExp = new RegExp('^' + regSnip, 'im');

store.forEachTiddler(
    function (title, tiddler) {
        var f = !lookupMatch;
        for (var lookup = 0; lookup < tiddler[lookupField].length; lookup++) {
            if (tiddler[lookupField][lookup] == lookupValue) {
                f = lookupMatch;
            }
        }
        if (f) {
            // check if tiddler sortField matches regExp
//          match = tiddler[sortField].match(regExp);
            match = tiddler.title.match(regExp);
            if (match) results.push(tiddler);
        }
    }
);

// check, if sortField is a custom field
// sort and return the results.

//console.log('isStandard: ', TiddlyWiki.isStandardField(sortField), sortField, results);

if (TiddlyWiki.isStandardField(sortField)) {
    results.sort(function (a,b) {
        return a[sortField].toLowerCase() < b[sortField].toLowerCase() ? -asc : a[sortField].toLowerCase() == b[sortField].toLowerCase() ? 0 : asc;});
}
else {
    results.sort(function (a, b) {
        return a.fields[sortField].toLowerCase() < b.fields[sortField].toLowerCase() ? - asc : a.fields[sortField].toLowerCase() == b.fields[sortField].toLowerCase() ? 0 : + asc;});
}

return results;
} // handler

} //# end of "install only once"

/*}}}*/
2014-04

Last night I came home from work and felt a familiar burden, the burden of listening to T talk, to her pressing home her points and giving voice to her needs and hurts. It seemed to me I should try to describe what happens and how I feel and how I respond.

How I feel, described in unpleasantly negative terms: when I arrive and T speaks, I feel like a small stone has been placed on top of me, and with each statement she adds, I feel a new stone has been placed on top of the stones that are already there, until the weight becomes intolerable and each new stone feels unbearably heavy. I feel despair and discouragement, and I think of things that I wish I could say own part, things perhaps that really need to be said if only from a practical point of view, not even to mention things that are the burdens of my own life.

I hardly know how to continue this description. Somehow I need to make it meaningful, I mean meaningful to someone else like a counselor. It can't just be my own world, my own perception, because that would leave me terribly at fault; and really I don't think I am. I don't want the blame, of course, but there are other needs also: surely somehow the conversation can be improved?

I sit and I'm thinking of what, and T breaks in with something. She breaks in with a statement and it's disruptive to my thought. It doesn't feel normal; I could be visiting with anyone and they would have this sense of what my silence is and how to interact with me, how to somehow look for the little break in my silence; or if not of that, then to somehow signal, a sort of excuse me, that does not seem to be in T's vocabulary. Of course it is not in her vocabulary.

And she continues talking, and I tighten my forehead a bit and look straight ahead and just try to keep hold of the thought I was thinking as she goes on. Depending on the relative importance of things, I decide how long to try the attempt; then I give up, shake my head, look at T and make a response to what she is saying – even if that consists only of asking her to repeat it because I was trying to think of something at the time.

When this interruption happens, often it is T continuing her own discourse. She sees the new statement as a continuation in a coherent stream, an unbroken account. To me it is not that. To me she stopped talking about whatever she was talking about a few minutes ago, and now perhaps it is time for a new conversation; it comes as a petty, unpleasant shock that it is really the same conversation, and I feel that good etiquette would be for her perhaps to say something like, as I was saying about this or that earlier…

But I am thinking again now of the sense of stones settling on top of me. When T begins stringing together her associative memories each jump requires a shift of focus that is uncomfortable and leaves me feeling that there is something still unprocessed from the last focus; and these unresolved topics accumulate. That is part of this sense of weight.  I know this is partly due to my selfish desire to fix everything. Sometimes it is that I have taken a moment to identify with her in some moment or memory – of course these are more often painful than not – and having identified, the request to make a sudden switch – probably to something else that is painful – seems unfair. It certainly seems exhausting.

Each new junction of this process also carries pitfalls and dangers. We ran into one or two of these last night. I made a remark about a book that we've both spent some time on – I wondered why the author did not deal with a particular topic in detail. T replied in a way that seems to be scolding me: well it's the way it always is, she said, of course he did this or that. I protest mildly, I wanted to see what he would say about it, though. What you say may be true, but I was interested in what he would say. But T takes up from the same point and continues, explaining that this piece of information I'm looking for is completely obvious. When I express some irritation about this, or simply reiterate my own personal need which is not getting answered, she becomes mildly apologetic. She backs down a bit, and she asks me: what is your opinion, then what do you think would have happened? This is T 's idea of an open question. To be sure, it is an open question. But I explain again I don't really have a theory. I'm sure that your viewpoint is correct. But I noticed he didn't cover in the book, and I wonder what he has to say about it. By this time I feel quite sour. But T goes on saying about how well this is how it was done when she was in a certain situation, but it didn't work because of this or that painful reality – and another stone settles on the heap. At this point I feel a bit desperate and I start responding out of desperation. I had wanted to do a number of different things – do some work on the computer, possibly talk with T about some practical matters, or take a shower. But at this point I start yawning and collapsing into sleep. It feels somewhat contrived. I don't have to be literally falling asleep at this moment. But I do want to shut her out, to shut her down, and I know if I go to sleep that she will feel she does have to be silent, and then I will have made an escape. And perhaps it seems less ungracious then going to the computer and turning it on. Also, if I go to the computer and turn it on, somehow this weight of unresolved topics is still hanging between us, the weight is on us, and I can't shower it off, but I'm good at going to sleep – so I can sleep it off. That will work.

I am very sad when I review all this. It is not really as if T talks my ear off, as they say. But when I am with her there is this draining sense of being always on call. It is like the feature on this voice recorder called a voice-activation. It is as if I am supposed to be voice-activated by her, so that when she speaks I must wake up and returned to that point of attention and that point of comprehension where I was before. Somehow this effect is exacerbated by the Asperger's.

I don't like feeling uncomfortable at home all evening long. Unfortunately, to add to my sense of personal confusion, there is in reality no way I could get enough time by myself do all the things that need to be done. If I made into a fantasy or a desire the wish that T would be absent, I would then live with the reality that it doesn't all get done anyway.
* Thoughts like banana slices -- only room for one on the butter knife blade; the next one pushes it right off.
* Cafeteria scene in movie __Temple__.
* I try to take one day at a time, but lately days are ganging up and clobbering me together (or something like that.)
* [[Stress]], AttentionDeficit, //Synaesthesia//
* [[Clutter]]
[[Overfocus]]
<!--{{{-->
<div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/***
|''Name''|PaletteViewMacro|
|''Version''|0.2|
|''Author''|FND|
|''Source''|[[FND's DevPad|http://devpad.tiddlyspot.com/#PaletteViewMacro]]|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.1|
|''Type''|macro|
|''Requires''|N/A|
|''Overrides''|N/A|
|''Description''|Displays color palettes.|
!Notes
There is also [[ViewPalettePlugin|http://simon.tiddlyspot.com/#ViewPalettePlugin]], which currently does not work with TiddlyWiki v2.2 though.
!Usage
{{{
<<paletteView [tiddler name]>>
}}}
!!Example
<<paletteView [[ColorPalette]]>>
!Revision History
!!v0.1 (2007-11-18)
* initial release
!!v0.2 (2007-11-20)
* limited processing to slices containing [[actual color values|http://www.w3.org/TR/CSS21/syndata.html#color-units]]
* changed fallback value to the tiddler the macro is called from (instead of using [[ColorPalette]])
!To Do
* selection list for all available palettes (tag-based)
* parameter for custom table class
* customizable column order
* documentation (e.g. using from within [[ViewTemplate]])
!Code
***/
//{{{
config.macros.paletteView = {};

config.macros.paletteView.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
    var title = params[0] || tiddler.title;
    //var palettes = store.getTaggedTiddlers(params[0]); // DEBUG: yet to be implemented
    var colors = store.calcAllSlices(title);
    var labels = [];
    for(var c in colors) {
        if(this.isColor(colors[c])) {
            labels.push(c);
        }
    }
    if(labels.length > 0) {
        var output = "|!Sample|!Value|!Name|h\n";
        for(var i = 0; i < labels.length; i++) {
            output += "|padding:0 4em;background-color:" + colors[labels[i]] + ";&nbsp;|"
                + "{{{" + colors[labels[i]] + "}}}|"
                + "[[" + labels[i] + "|" + title + "]]|\n";
        }
        wikify(output, place);
    }
};

config.macros.paletteView.isColor = function(s) {
    var colors = ["Black", "Green", "Silver", "Lime", "Gray", "Olive", "White", "Yellow",
        "Maroon", "Navy", "Red", "Blue", "Purple", "Teal", "Fuchsia", "Aqua", "Orange"];
    var match = s.match(/^#[0-9A-F]{3}$|^#[0-9A-F]{6}$|^RGB\([\d,\s]{5,}\)$/i);
    if(match) return true;
    if(colors.contains(s)) return true;
    return false;
};
//}}}
2015-05

T started preparing some components of the evening meal before I was out of bed this morning.  Noodles were boiling rampantly when I came into the kitchen.  That's quite a boil, I remarked.  //It's a ro-olling boil,// she exclaimed with a hint of exasperation at my habitual readiness to turn a stove knob down too early.  A minute later the boil started to rise to the top.  She scooted the pot over to a cold spot and put a big spoon into the noodles.  It needs to stay on the heat, I interjected.  //But the noodles are sticking,// she replied, while pulling the pot back into place.
* Too much water in the pot.
* Needed stirring earlier - noodles were sticking
* Over-compensation on the stove settings. 
* Danger from the steam.
''Factors:''   
# core physics comprehension;  //pervasive ignorance of how things work, weak central coherence.//
# ability to observe; //obtuseness.//
# freedom from anxiety; //anxiety.//
# presence of mind;  //absent-mindedness.//
These are all locked together.  They are separable through heavy analysis.  After the analysis is done, the value of its result is important but ineffable, just like the factors themselves. 

What appears as confusion is weak central coherence.  That in turn appears as seeming absent-mindedness.  The inability to observe yields physical danger, which leads to fear.  The combined result will be perceived as lack of common sense.  

Anxiety is transmuted into anger and shame.  My concern about the boil evinced her own oblique reproof; this probably interfered with her already-tenuous ability to observe.  If the pot were not too full of water by half, the other factors could settle; seemingly insignificant decisions roll to a boil.  My attempt to thwart many small causes has the result of making me a nag.  My actual reasoning is based on things not seen, accepted on intuition.  When I'm unable to explain at the granular innate level, we experience mutual confusion and withdrawal.  
''This is the trait T mostly __doesn't__ have!''
 -- and I am grateful to God.  The absence of this trait makes for a much easier companion.  It also probably delayed her being identified as an aspie for many years. 
----
TODO: definition.
----
''Perseveration'' relates or contributes to (and also must not be confused with) some traits T. ''does'' have: 
* [[Fixed-perception]] - difficulty revising one's initial or "frozen" understanding
* [[Intrusive-thoughts]]
* [[Associative-thinking]]
* a sense of obsessive-compulsive disorder
2013-06

I feel unable to tolerate feeling alone in my marriage and in my community (apart from men's group).   I feel unable to hold up cheerfully or patiently under T's oppressive behaviors.  When she interrogates me about my own behaviors, or her behaviors, or even some outside topic.  When she uses emotional manipulation based on fear and shame.  When she threatens (overtly or tacitly, deliberately or unconsciously) a shut-down or a melt-down.

I want to successfully draw boundaries so I can breathe, and escape the punishment of her responses.    She condemns me to defend herself; I become discouraged, and she feels justified in ignoring the boundary.

It is very difficult when T starts spreading out the case against me.  She brings up dozens of instances of my weakness, selfishness, or immaturity.  Against this, I seem to have no recourse.  

She gives episodes, concrete evidence for everything.  Some things are true, some are false; some are uncertain to me, and some are radically distorted.  

If I contest her version of the history, she brings up a supporting fact that demonstrates that she is right.  She is right more often than wrong, but if she is wrong, she is likely to stand by her version – it’s the only one she has.  

Sometimes she is correct about the history, wrong about the conclusion – and the conclusion touches on my character.  

Often I simply can’t remember the circumstance from two years or 20 years ago, at least on the spot.  I cannot make an answer.   

If I ask her memory, she seizes on this is further evidence of my carelessness and culpability.

However my failure of memory becomes known, she adds that to the evidence.   It is not merely that I forgot: the problem is this episode was truly important.  How could I, Scott, have forgotten it?  What does this reveal about how I was doing at the time, and how I am doing now?

So, much of my current journaling is perhaps an attempt to out-do her in case-building.  But this can never succeed, I suppose; and I don't want it, and I can't keep it up in any case.  No counselor wants to hear it all.

In between times she softens and seeks my companionship, and wants to call some kind of truce – based on what?  My guilty plea?  Her forbearance?  Neither.  Her need for physical comfort and companionship has eclipsed her distress over the other issues.  Time passes, I still have no words, and T uses this to further seal the case against me.

My most common facial expression towards T now, the one I most use if she has set her attention directly on me, is one of suppressed offense and exasperation.  If I want the frustration show more, I put my head in my hands and slump in my chair.  Otherwise, I look at her with distress, an undone look that says: How can I deal with this latest utterance or question?  What is next?  It is a rude expression that used to come over Mary McGinnis.  Or, I allow myself an overtly negative or disdainful expression.  I give a little snort, and come back with something confrontational.  She says I am angry, and I often deny it, but more and more it is true.  I can say that I do not raise my voice or acted violently, and that my frame of mind is less pernicious than she interprets it to be, which I am sure is true.  

Should I read this to her, she will escalate all her concerns.  She will interrogate me many points and deny them.  She will concede a few points, apologizing here, making excuses there.  She will accuse me of resorting to writing, my chosen medium, at which she is at a disadvantage – just another way of emphasizing the adversarial position.  She will be outraged at my choice of words:  Sometimes she only accepts them in their most negative or insulting meaning (I can anticipate most of these misconstructions, but not all), and other times it’s a way to deny the point. 

----

I need Steve to do what he did, which is override her protests and overrule her objections.  But I need Steve to be more of a gentleman and less of an asshole.  He subtly mocked, needled and provoked.  At times he offered rectifying or soothing measures, but these sometimes had a perfunctory feeling.  Sometimes they seemed to contain a challenge, even a sly shaming tone.  

I need someone who can check T on interrupting, overriding and manipulating.  Someone who can deal with her excuses:  ASD, PTSD, shifting the blame.
!![[Plugin-defined options|PluginManager]]
>@@text-align:left;<<tabs ''
[[AdvancedOptionsPlugin ]] [[view options for AdvancedOptionsPlugin]] [[AdvancedOptionsPlugin##Configuration]]
 [[BreadcrumbsPlugin ]] [[view options for BreadcrumbsPlugin]] [[BreadcrumbsPlugin##Configuration]]
 [[CookieManagerPlugin ]] [[view options for CookieManagerPlugin]] [[CookieManagerPlugin##Configuration]]
 [[CopyTiddlerPlugin ]] [[view options for CopyTiddlerPlugin]] [[CopyTiddlerPlugin##Configuration]]
 [[FileDropPluginConfig ]] [[view options for FileDropPluginConfig]] [[FileDropPluginConfig##Configuration]]
 [[GotoPlugin ]] [[view options for GotoPlugin]] [[GotoPlugin##Configuration]]
 [[NestedSlidersPlugin ]] [[view options for NestedSlidersPlugin]] [[NestedSlidersPlugin##Configuration]]
 [[RelatedTiddlersPlugin ]] [[view options for RelatedTiddlersPlugin]] [[RelatedTiddlersPlugin##Configuration]]
 [[SearchOptionsPlugin ]] [[view options for SearchOptionsPlugin]] [[SearchOptionsPlugin##Configuration]]
 [[SinglePageModePlugin ]] [[view options for SinglePageModePlugin]] [[SinglePageModePlugin##Configuration]]
 [[SnapshotPlugin ]] [[view options for SnapshotPlugin]] [[SnapshotPlugin##Configuration]]
 [[StickyPopupPlugin ]] [[view options for StickyPopupPlugin]] [[StickyPopupPlugin##Configuration]]
 [[StorySaverPlugin ]] [[view options for StorySaverPlugin]] [[StorySaverPlugin##Configuration]]
 [[TextAreaPlugin ]] [[view options for TextAreaPlugin]] [[TextAreaPlugin##Configuration]]
>>@@
/***
|Name|PopupPreviewPlugin|
|Source|http://www.TiddlyTools.com/#PopupPreviewPlugin|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|StickyPopupPlugin (optional, recommended)|
|Description|popup a formatted preview of a linked tiddler's content|
This plugin adds a custom 'shift-click' or mouseover handler to all tiddler links (or images with tiddler links) to display a popup with a fully-formatted preview of the linked tiddler's content.
!!!!!Usage
<<<
SHIFT-click to display a popup containing the fully-formatted content of the linked tiddler, in a fixed size, scrolling area.  Click anywhere to dismiss the popup.  Clicking on the link will open the tiddler in the normal manner.  If the linked tiddler contains a section named "preview", the popup displays that section content rather than the entire tiddler.  You can hide the "preview" section by enclosing it within comment markers ({{{/%...%/}}}) or a CSS wrapper ({{{@@display:none;...@@}}} or <html><nowiki><code>{{hidden{...}}}</code></html>) so that you can display alternative "summary" content in the popup preview while still showing the entire content when viewing the tiddler directly.
<<<
!!!!!Configuration
<<<
<<option chkPopupPreviews>> enable popup previews (shift-click)
{{{usage: <<option chkPopupPreviews>>}}}
<<option chkPopupPreviewMouseover>> show previews on mouseover (no click needed)
{{{usage: <<option chkPopupPreviewMouseover>>}}}
width of popup: <<option txtPopupPreviewWidth>> height of popup: <<option txtPopupPreviewHeight>>
//(width and height may be specified using any valid CSS units, e.g., "px", "em", "in", "cm", "%")//
{{{usage: <<option txtPopupPreviewWidth>> <<option txtPopupPreviewHeight>>}}}
preview section name: <<option txtPopupPreviewSection>>
{{{usage: <<option txtPopupPreviewSection>>}}}
<<<
!!!!!Preview
<<<
The contents of this section are displayed when SHIFT-clicking on a link to [[PopupPreviewPlugin]].  This section can be hidden using comment markers or a CSS wrapper so that alternative, "summary" content can be displayed in the popup.
<<<
!!!!!Revisions
<<<
2012.05.23 1.2.0 added chkPopupPreviewSection (for showing summary content in popup)
2011.09.22 1.1.1 fixed default setting for chkPopupPreviewMouseover
2009.09.22 1.1.0 added chkPopupPreviewMouseover option
2007.11.19 1.0.0 fixed handling for imageLinks ('tiddlylink' attrib is on the *parentNode* of target image element)
2007.11.10 0.5.0 alpha development - use with care
<<<
!!!!!Code
***/
//{{{
version.extensions.PopupPreviewPlugin= {major: 1, minor: 2, revision: 0, date: new Date(2012,5,23)};

var co=config.options; // abbrev
if (co.chkPopupPreviews===undefined) co.chkPopupPreviews=true;
if (co.txtPopupPreviewWidth==undefined) co.txtPopupPreviewWidth="50%";
if (co.txtPopupPreviewHeight==undefined) co.txtPopupPreviewHeight="10em";
if (co.chkPopupPreviewMouseover===undefined) co.chkPopupPreviewMouseover=false;
if (co.txtPopupPreviewSection===undefined) co.txtPopupPreviewSection="Preview";


if (window.popupPreview_createTiddlyLink===undefined) { // only once
window.popupPreview_createTiddlyLink=window.createTiddlyLink;
window.createTiddlyLink=function()
{
	var btn=this.popupPreview_createTiddlyLink.apply(this,arguments);
	var handler=config.options.chkPopupPreviewMouseover?'onmouseover':'onclick';
	btn.savedHandler=btn[handler];
	btn[handler]=function(e) {
		var co=config.options; // abbrev
		if (!e) var e=window.event; var theTarget=resolveTarget(e);
		if (!e.shiftKey&&!co.chkPopupPreviewMouseover || !co.chkPopupPreviews)
			return this.savedHandler?this.savedHandler.apply(this,arguments):false;
		else { // show tiddler preview if enabled and SHIFT is pressed
			var tid=theTarget.getAttribute("tiddlylink");
			if (!tid) tid=theTarget.parentNode.getAttribute("tiddlylink"); // for "imageLink"
			var text=store.getTiddlerText(tid+"##"+co.txtPopupPreviewSection,store.getTiddlerText(tid));
			if (text && text.length) {
				var popup = Popup.create(this,null,"sticky popup");
				popup.style.width=co.txtPopupPreviewWidth;
				popup.style.padding=".5em";
				var msg="%0 %1".format([tid,config.views.wikified.shadowModifier]);
				var tiddler=store.getTiddler(tid); if (tiddler) msg=tiddler.getSubtitle();
				wikify("@@display:block;font-size:80%;line-height:110%;"+msg+"@@",popup);
				var div=createTiddlyElement(popup,"DIV",null,"popupPreview viewer");
				div.style.overflow="auto";
				div.style.whiteSpace="normal";
				div.style[config.browser.isIE?'height':'maxHeight']=co.txtPopupPreviewHeight;
				wikify(text,div);
				Popup.show('bottom','left');
			}
			e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); return false;
		}
	}
	return btn;
}
}
//}}}
Once T and I had a discussion at the dinner table about condiments.  I was in a short phase in which I enjoyed putting hot sauce on my food, and this was mildly intolerable for T.  It's interesting because it contains within itself the image of a bland versus a varied and individualistic taste.  It's also interesting because of the fear and shame messages T was giving out to deal with this. 
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0a|
|Date:|27-Jun-20 11|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
  var diff = (((new Date()).getTime() - this.getTime()) / 1000);
  var day_diff = Math.floor(diff / 86400);

  if (isNaN(day_diff))      return "";
  else if (diff < 0)        return "in the future";
  else if (diff < 60)       return "just now";
  else if (diff < 120)      return "1 minute ago";
  else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
  else if (diff < 7200)     return "1 hour ago";
  else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
  else if (day_diff == 1)   return "Yesterday";
  else if (day_diff < 7)    return day_diff + " days ago";
  else if (day_diff < 14)   return  "a week ago";
  else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
  else if (day_diff < 62)   return "a month ago";
  else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
  else if (day_diff < 730)  return "a year ago";
  else                      return Math.ceil(day_diff/365) + " years ago";
}

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
  return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)';
config.mptwDateFormat = 'pppp';

//}}}

/***
|Name|QuickEditPlugin|
|Source|http://www.TiddlyTools.com/#QuickEditPlugin|
|Documentation|http://www.TiddlyTools.com/#QuickEditPackage|
|Version|2.4.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Support functions for [[QuickEditPackage]]: utility functions, toolbar commands, stylesheets|
!!!!!Documentation
>see [[QuickEditPackage]] for details
!!!!!Revisions
<<<
2011.02.14 2.4.4 fix OSX error: use picker.file.path
2009.06.11 2.4.3 added keyup() function to abbreviate listbox handling for CR and ESC
2009.05.07 2.4.2 added processed() function to abbreviate event handler code
2008.09.07 2.4.1 added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.17 2.4.0 copied code from StickyPopupPlugin to remove dependency
2008.05.12 2.3.0 added "toggleQuickEdit" command handler (replaces inline script command)
2008.01.11 2.2.0 converted from inline script
2007.03.29 1.0.0 initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.QuickEditPlugin= {major: 2, minor: 4, revision: 4, date: new Date(2011,2,14)};

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

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

// UTILITY FUNCTIONS
config.quickEdit = {
    processed: function(ev) { ev=ev||window.event;
        ev.cancelBubble=true;
        if(ev.stopPropagation) ev.stopPropagation();
        return false;
    },
    keyup: function(ev){ var k=(ev||window.event).keyCode;
        if (k==13) this.onclick();
        if (k==27) Popup.remove();
    },
    getField: function(where) {
        var here=story.findContainingTiddler(where); if (!here) return null;
        var e=story.getTiddlerField(here.getAttribute("tiddler"),"text");
        if (e&&e.getAttribute("edit")=="text") return e;
        return null;
    },
    setSelection: function(where,newtext) {
        var e=this.getField(where); if (!e) return false;
        e.focus(); replaceSelection(e,newtext);
        return false;
    },
    wrapSelection: function(where,before,after) {
        var e=this.getField(where); if (!e) return false;
        e.focus(); replaceSelection(e,before+config.quickEdit.getSelection(e)+after);
        return false;
    },
    getSelection: function(e) {
        var seltext="";
        if (e&&e.setSelectionRange)
            seltext=e.value.substr(e.selectionStart,e.selectionEnd-e.selectionStart);
        else if (document.selection) {
            var range = document.selection.createRange();
            if (range.parentElement()==e) seltext=range.text
        }
        return seltext;
    },
    promptForFilename: function(msg,path,file) {
        if(window.Components) { // moz
            try {
                netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
                var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
                picker.init(window, msg, nsIFilePicker.modeOpen);
                var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
                thispath.initWithPath(path);
                picker.displayDirectory=thispath;
                picker.defaultExtension='jpg';
                picker.defaultString=file;
                picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterImages);
                if (picker.show()!=nsIFilePicker.returnCancel)
                    var result="file:///"+picker.file.path.replace(/\\/g,'/');
            }
            catch(e) { alert('error during local file access: '+e.toString()) }
        }
        else { // IE
            try { // XP only
                var s = new ActiveXObject('UserAccounts.CommonDialog');
                s.Filter='All files|*.*|JPG files|*.jpg|GIF files|*.gif|PNG files|*.png|';
                s.FilterIndex=1; // default to JPG
                s.InitialDir=path;
                s.FileName=file;
                if (s.showOpen()) var result=s.FileName;
            }
            catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
        }
        return result;
    }
}
//}}}

//{{{
if (config.options.chkShowQuickEdit===undefined) config.options.chkShowQuickEdit=false;
config.commands.toggleQuickEdit = {
    hideReadOnly: true,
    getText: function() { return config.options.chkShowQuickEdit?'\u221Aquickedit':'quickedit'; },

    tooltip: 'show QuickEdit toolbar buttons',
    handler: function(event,src,title) {
        var opt='chkShowQuickEdit';
        config.options[opt]=!config.options[opt];
        config.macros.option.propagateOption(opt,"checked", config.options[opt],"input");
        if (config.options[opt]) saveOptionCookie(opt); else removeCookie(opt);
        src.innerHTML=config.commands.toggleQuickEdit.getText();
        story.forEachTiddler(function(t,e){if (story.isDirty(t)) refreshElements(e);});
        return false;
    }
};
//}}}

// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;
Popup.stickyPopup_onDocumentClick = function(ev)
{
    // if click is in a sticky popup, ignore it so popup will remain visible
    var e = ev ? ev : window.event; var target = resolveTarget(e);
    var p=target; while (p) {
        if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
        else p=p.parentNode;
    }
    if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
        Popup.onDocumentClick(ev);
    return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
/%
|Name|QuickEditToolbar|
|Source|http://www.TiddlyTools.com/#QuickEditToolbar|
|Version|2.4.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.2|
|Type|transclusion|
|Requires|QuickEditPlugin|
|Optional|QuickEdit_*|
|Description|format/insert TiddlyWiki content using toolbar buttons|

Usage:
* install [[QuickEditPlugin]] (runtime support functions)

* add the toolbar to [[EditTemplate]]:
    <div macro='tiddler QuickEditToolbar with: show'></div>

* 'show' (optional) forces the toolbar to always be displayed or,
  omit keyword and use <<option chkShowQuickEdit>> setting

* selected QuickEdit buttons can also be added individually to the
  regular tiddler toolbar by adding references directly in [[EditTemplate]]:
    <span class='toolbar' macro='tiddler QuickEdit_...'></span>

* see [[QuickEditPackage]] for additional installation options

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

TOOLBAR DEFINITION - add, remove, or re-order items as desired:
= = = = = = = = = =
%/<<tiddler QuickEdit_format>>/%
%/<<tiddler QuickEdit_align>>/%
%/<<tiddler QuickEdit_color>>/%
%/<<tiddler QuickEdit_font>>/%
%/<<tiddler QuickEdit_custom>>/%
%/ &nbsp;/% (SPACER)
%/<<tiddler QuickEdit_replace>>/%
%/<<tiddler QuickEdit_split>>/%
%/<<tiddler QuickEdit_sort>>/%
%/<<tiddler QuickEdit_convert>>/%
%/ &nbsp;/% (SPACER)
%/<<tiddler QuickEdit_link>>/%
%/<<tiddler QuickEdit_insert>>/%
%/<<tiddler QuickEdit_macro>>/%
%/<<tiddler QuickEdit_image>>/%
%/}}}
/%
|Name|QuickEdit_align|
|Source|http://www.TiddlyTools.com/#QuickEdit_align|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - text alignment|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="align text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select text alignment...','');
    s.options[s.length]=new Option('left','left');
    s.options[s.length-1].title='{{left{...}}}';
    s.options[s.length]=new Option('center','center');
    s.options[s.length-1].title='{{center{...}}}';
    s.options[s.length]=new Option('right','right');
    s.options[s.length-1].title='{{right{...}}}';
    s.options[s.length]=new Option('justify','justify');
    s.options[s.length-1].title='{{justify{...}}}';
    s.options[s.length]=new Option('float left','floatleft');
    s.options[s.length-1].title='{{floatleft{...}}}';
    s.options[s.length]=new Option('float right','floatright');
    s.options[s.length-1].title='{{floatright{...}}}';
    s.size=s.length;
    s.onclick=function(){ if (!this.value.length) return;
        config.quickEdit.wrapSelection(this.button,'{{'+this.value+'{','}}}');
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>align</a></html>
/%
|Name|QuickEdit_color|
|Source|http://www.TiddlyTools.com/#QuickEdit_color|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - text/background color|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

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

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="convert between comma/tab-separated and TW table format"
onclick="var e=config.quickEdit.getField(this);
    if (e) e.focus(); var txt=config.quickEdit.getSelection(e);
    if (txt.indexOf(',')+txt.indexOf('\t')+txt.indexOf('|')==-3) {
        alert('Please select text containing tabs, commas, or TiddlyWiki table syntax.');
        return false;
    }
    var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select a converter...','');
    if (txt.indexOf(',')!=-1) {
        s.options[s.length]=new Option('commas -> table','commasToTable');
        s.options[s.length]=new Option('commas -> tabs','commasToTabs');
    }
    if (txt.indexOf('\t')!=-1) {
        s.options[s.length]=new Option('tabs -> table','tabsToTable');
        s.options[s.length]=new Option('tabs -> commas','tabsToCommas');
    }
    if (txt.indexOf('|')!=-1) {
        s.options[s.length]=new Option('table -> tabs','tableToTabs');
        s.options[s.length]=new Option('table -> commas','tableToCommas');
    }
    s.size=s.length;
    s.onclick=function(){ if (!this.value.length) return;
            var e=config.quickEdit.getField(this.button); if (!e) return false;
        e.focus(); var txt=config.quickEdit.getSelection(e);
        switch(this.value) {
            case 'tabsToTable':
                txt=txt.replace(/\t/g,'|').replace(/^|$/g,'|');
                txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
                break;
            case 'tableToTabs':
                txt=txt.replace(/\t/g,' ').replace(/\|/g,'\t');
                txt=txt.replace(/^\t/g,'').replace(/\t$/g,'');
                txt=txt.replace(/\n\t/g,'\n').replace(/\t\n/g,'\n');
                break;
            case 'commasToTable':
                txt=txt.replace(/,/g,'|').replace(/^|$/g,'|');
                txt=txt.replace(/\n/g,'|\n|').replace(/^\|$/g,'');
                break;
            case 'tableToCommas':
                txt=txt.replace(/,/g,' ').replace(/\|/g,',');
                txt=txt.replace(/^,/g,'').replace(/,$/g,'');
                txt=txt.replace(/\n,/g,'\n').replace(/,\n/g,'\n');
                break;
            case 'tabsToCommas':
                txt=txt.replace(/\t/g,',');
                break;
            case 'commasToTabs':
                txt=txt.replace(/,/g,'\t');
                break;
        }
        replaceSelection(e,txt);
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>convert</a></html>
/%
|Name|QuickEdit_custom|
|Source|http://www.TiddlyTools.com/#QuickEdit_custom|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - custom defined formats|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

!help
Reminders:

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

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

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1" title="custom defined formats"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select a custom format...','');
    var items=store.getTiddlerText('QuickEdit_customList','').split('\n----\n');
    for (var i=0; i<items.length; i++) {
        if (!items[i].length) continue; var lines=items[i].split('\n');
        var label=lines.shift(); var val=lines.join('\n');
        s.options[s.length]=new Option(label,val); s.options[s.length-1].title=val;
    }
    s.options[s.length]=new Option('[Edit custom formats...]','_edit');
    s.options[s.length-1].title='add/change custom format definitions...';
    s.size=Math.min(s.length,15);
    s.onclick=function(){ if (!this.value.length) return;
        if (this.value=='_edit') {
            alert(store.getTiddlerText('QuickEdit_custom##help'));
            story.displayTiddler(story.findContainingTiddler(this.button),
                'QuickEdit_customList',DEFAULT_EDIT_TEMPLATE);
        } else {
                var e=config.quickEdit.getField(this.button); if (!e) return false;
            e.focus(); var txt=config.quickEdit.getSelection(e);
            replaceSelection(e, this.value.replace(/\$\x31/g,txt)
                .replace(/\$\[\[[^\]]+\]\]/g, function(t){
                    x=t.substr(3,t.length-5).split('|');
                    var msg=x[0]; var def=x[1]||'';
                    if (def.startsWith('{{')) {
                        try{def=eval(def.substr(2,def.length-4))} catch(ex){showException(ex)}
                    }
                    return prompt(msg,def)||'';
                })
            );
        }
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>custom</a></html>
timestamp
$[[enter a date|{{new Date().formatString('DDD, MMM DDth, YYYY hh12:0mm:0ssam')}}]]
----
scrollbox
@@display:block;height:10em;overflow:auto;$[[enter scrolling content|$1]]@@@@display:block;text-align:right;^^scroll for more...^^@@
----
nested slider
+++[$1]<<tiddler $1>>===
----
big red
@@font-size:36pt;color:red;$1@@
----
/%
|Name|QuickEdit_font|
|Source|http://www.TiddlyTools.com/#QuickEdit_font|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - select font family|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="set font-family CSS attribute - @@font-family:facename;...@@"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select a font family...','');
    var fonts=store.getTiddlerText('QuickEdit_fontList','').split('\n');
    for (var i=0; i<fonts.length; i++) {
        if (!fonts[i].length) continue;
        s.options[s.length]=new Option(fonts[i],fonts[i]);
        s.options[s.length-1].style.fontFamily=fonts[i];
    }
    s.options[s.length]=new Option('[Edit font list...]','_edit');
    s.options[s.length-1].title='enter fonts, one per line...';
    s.size=Math.min(s.length,15);
    s.onclick=function(){
        if (this.value=='_edit')
            story.displayTiddler(story.findContainingTiddler(this.button),'QuickEdit_fontList',DEFAULT_EDIT_TEMPLATE);
        else
            config.quickEdit.wrapSelection(this.button,'@@font-family:\x22'+this.value+'\x22;','@@');
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>font</a></html>
Arial,helvetica,sans-serif
Times New Roman,times,serif
Courier,monospace
/%
|Name|QuickEdit_format|
|Source|http://www.TiddlyTools.com/#QuickEdit_format|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - basic text formats, headings, blockquotes, etc.|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

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

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

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

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

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

%/ &nbsp;/%  SPACER

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="format text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select text format...','');
    s.options[s.length]=new Option('CSS class wrapper','{{$1{,}}},Enter a CSS classname');
    s.options[s.length-1].title='CSS class wrapper - {{classname classname etc{...}}}';
    s.options[s.length]=new Option('inline CSS styles','@@$1,@@,Enter CSS (attribute:value;attribute:value;...;)');
    s.options[s.length-1].title='inline CSS styles - @@attr:value;attr:value;...@@';
    s.options[s.length]=new Option('heading 1','\n!,\n');
    s.options[s.length-1].title='H1 heading - !';
    s.options[s.length]=new Option('heading 2','\n!!,\n');
    s.options[s.length-1].title='H2 heading - !!';
    s.options[s.length]=new Option('heading 3','\n!!!,\n');
    s.options[s.length-1].title='H3 heading - !!!';
    s.options[s.length]=new Option('heading 4','\n!!!!,\n');
    s.options[s.length-1].title='H4 heading - !!!!';
    s.options[s.length]=new Option('heading 5','\n!!!!!,\n');
    s.options[s.length-1].title='H5 heading - !!!!!';
    s.options[s.length]=new Option('blockquote','\n\<\<\<\n,\n\<\<\<\n');
    s.options[s.length-1].title='indented blockquote - \<\<\<';
    s.options[s.length]=new Option('monospace','{{{,}}}');
    s.options[s.length-1].title='inline monospaced text - {{{...}}}';
    s.options[s.length]=new Option('plain text','\n{{{\n,\n}}}\n');
    s.options[s.length-1].title='multi-line monospaced text box - {{{...}}}';
    s.options[s.length]=new Option('superscript','^^,^^');
    s.options[s.length-1].title='^^superscript^^';
    s.options[s.length]=new Option('subscript','~~,~~');
    s.options[s.length-1].title='~~subscript~~';
    s.options[s.length]=new Option('HTML','<html>,<\x2fhtml>');
    s.options[s.length-1].title='HTML syntax - <html>...<\x2fhtml>';
    s.options[s.length]=new Option('comment','/%,%/');
    s.options[s.length-1].title='comment (hidden content) - /%...%/';
    s.size=s.length;
    s.onclick=function(){ if (!this.value.length) return;
        var parts=this.value.split(',');
        var prefix=parts[0]; var suffix=parts[1]; var ask=parts[2];
        if (ask) {
            var val=prompt(ask); if (!val) { Popup.remove(); return false; }
            prefix=prefix.replace(/\$1/g,val); suffix=suffix.replace(/\$1/g,val);
        }
        config.quickEdit.wrapSelection(this.button,prefix,suffix);
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>format</a></html>
/%
|Name|QuickEdit_image|
|Source|http://www.TiddlyTools.com/#QuickEdit_image|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - embed an image|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
    title="embed an image (jpg/gif/png) - [img[tooltip|URL]] or [img[tooltip|path/to/file.ext]]"
    onclick="var fn=config.quickEdit.promptForFilename(
        'Enter/select an image file',getLocalPath(document.location.href),'');
    if (!fn) return false;  /* cancelled by user */
    var h=document.location.href; var p=decodeURIComponent(h.substr(0,h.lastIndexOf('/')+1));
    if (fn.startsWith(p)) fn=fn.substr(p.length); /* use RELATIVE path/filename.ext */
    var tip=prompt('Enter a tooltip for this image',''); if (!tip) tip=''; else tip+='|';
    return config.quickEdit.setSelection(this,'[img['+tip+fn+']]');"
>image</a></html>
/%
|Name|QuickEdit_insert|
|Source|http://www.TiddlyTools.com/#QuickEdit_insert|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - insert content from another tiddler or external file|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

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

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

    var s=createTiddlyElement(p,'select'); s.button=this;
    s.title='select a tiddler or file';
    s.options[0]=new Option('select a tiddler or file...','');
    s.options[s.length]=new Option('[browse for file...]','_file');
    var tids=store.reverseLookup('tags','excludeLists');
    for (var t=0; t<tids.length; t++) {
        s.options[s.length]=new Option(tids[t].title,tids[t].title);
        s.options[s.length-1].title=tids[t].getSubtitle();
    }
    s.size=Math.min(s.length,10);
    s.onclick=function(){ if (!this.value.length) return false;
        if (this.value=='_file') {
            var fn=config.quickEdit.promptForFilename(
                'Enter/select a text file',getLocalPath(document.location.href),'');
            if (!fn) return false; /* cancelled by user */
            var txt=loadFile(getLocalPath(fn));
            if (!txt) { alert('Error: unable to read contents from \0027'+fn+'\0027'); return; }
        }
        else var txt=store.getTiddlerText(this.value);
        if (!txt) {
            displayMessage(this.value+' not found');
            this.selectedIndex=0; this.focus();
            return false;
        }
        config.quickEdit.setSelection(this.button,txt);
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s2.style.width=s.offsetWidth+'px';
    s.focus();
    return config.quickEdit.processed(event);"
>insert</a></html>
/%
|Name|QuickEdit_link|
|Source|http://www.TiddlyTools.com/#QuickEdit_link|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - link to tiddler or external file|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

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

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

    var s=createTiddlyElement(p,'select'); s.button=this;
    s.title='select a tiddler or file';
    s.options[0]=new Option('select a tiddler or file...','');
    s.options[s.length]=new Option('[browse for file...]','_file');
    var tids=store.reverseLookup('tags','excludeLists');
    for (var t=0; t<tids.length; t++) {
        s.options[s.length]=new Option(tids[t].title,tids[t].title);
        s.options[s.length-1].title=tids[t].getSubtitle();
    }
    s.size=Math.min(s.length,10);
    s.onclick=function(){ if (!this.value.length) return false;
        var title=this.value; var txt=title;
        if (title=='_file') {
            title=config.quickEdit.promptForFilename('Select a file',
                getLocalPath(document.location.href),'');
            if (!title) { this.selectedIndex=0; this.focus(); return false; }
            var txt=title.substr(title.lastIndexOf('/')+1);
        }
        var txt=prompt('Enter the text to display for this link',txt);
        if (!txt) { this.selectedIndex=0; this.focus(); return false; }
        config.quickEdit.setSelection(this.button,'[['+txt+'|'+title+']]');
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s2.style.width=s.offsetWidth+'px';
    s.focus();
    return config.quickEdit.processed(event);"
>link</a></html>
/%
|Name|QuickEdit_macro|
|Source|http://www.TiddlyTools.com/#QuickEdit_macro|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - embed a macro with 'guide text'|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

Note:
Optional 'guideText' can be used to add suggested defaults/placeholders for specific macro parameters.
Add guideText to your own plugin-defined macros using:
    config.macros.macroName.guideText='guide text goes here';

%/<<tiddler {{
    /* define guide text for a few common TW core macros */
    config.macros.edit.guideText='fieldname #rows';
    config.macros.view.guideText='fieldname (link,wikified,date) format';
    config.macros.slider.guideText='cookie TiddlerName label tooltip';
    config.macros.option.guideText='(txtCookieName,chkCookieName)';
    config.macros.tiddler.guideText='TiddlerName with: params...';
    ''; /* must return blank to suppress output */ }}>>/%

%/<html><hide linebreaks><a href='javascript:;' class='tiddlyLink' tabindex='-1'
title='add a macro - \<\<macroName ...\>\>'
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select a macro...','');
    var macros=[]; for (var m in config.macros) if (config.macros[m].handler) macros.push(m); macros.sort();
    for (var i=0; i<macros.length; i++) { var m=macros[i];
        var help=config.macros[m].guideText; if (!help) help=''; else help=' '+help;
        s.options[s.length]=new Option(m,m+help);
        s.options[s.length-1].title='\<\<'+m+help+'\>\>';
    }
    s.size=Math.min(s.length,15);
    s.onclick=function(){ if (!this.value.length) return;
        config.quickEdit.setSelection(this.button,'\<\<'+this.value+'\>\>');
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>macro</a></html>
/%
|Name|QuickEdit_replace|
|Source|http://www.TiddlyTools.com/#QuickEdit_replace|
|Version|2.4.5|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - find/replace selected text with replacement text|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar
!!!Revisions
<<<
2010.12.26 2.4.5 fix use getField(this) to support hijacks by editSectionPlugin
<<<
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="find/replace selected text with replacement text"
onclick="var p=Popup.create(this,null,'popup sticky smallform'); if (!p) return false;
    var e=config.quickEdit.getField(this);
    var s=config.quickEdit.getSelection(e);
    var t=createTiddlyElement(p,'input'); t.onfocus=function(){this.select()};
    t.value=s.length?s:'enter target text';
    var r=createTiddlyElement(p,'input'); r.onfocus=function(){this.select()};
    r.value='enter replacement text';
    var b=createTiddlyElement(p,'button',null,null,'?');
    b.style.width='2em';
    b.title='FIND/FIND NEXT target text';
    b.root=this;
    b.onclick=function(ev) { /* FIND */
        var e=config.quickEdit.getField(this.root);
        var t=this.previousSibling.previousSibling;
        var tv=t.value.replace(/\\t/mg,'\t').unescapeLineBreaks();
        e.focus();
        if (e.setSelectionRange) { /* MOZ */
            var newstart=e.value.indexOf(tv,e.selectionStart+1);
            if (newstart==-1) newstart=e.value.indexOf(tv); /* wrap around */
            if (newstart==-1) { alert('\u0022'+t.value+'\u0022 not found'); t.focus(); return; }
            e.setSelectionRange(newstart,newstart+tv.length);
            var linecount=e.value.split('\n').length;
            var thisline=e.value.substr(0,e.selectionStart).split('\n').length;
            e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);
        } else if (document.selection) { /* IE */
            var range=document.selection.createRange();
            if(range.parentElement()==e) {
                range.collapse(false);
                var found=false; try{found=range.findText(v,e.value.length,4)}catch(e){}
                if (found) range.select();
                else { alert('\u0022'+t.value+'\u0022 not found'); t.focus(); }
            }
        }
    };
    b=createTiddlyElement(p,'button',null,null,'=');
    b.style.width='2em';
    b.title='REPLACE selected text';
    b.root=this;
    b.onclick=function(ev) { /* REPLACE */
        var e=config.quickEdit.getField(this.root);
        var t=this.previousSibling.previousSibling.previousSibling;
        var r=this.previousSibling.previousSibling;
        var rv=r.value.replace(/\\t/mg,'\t').unescapeLineBreaks();
        if (   (e.selectionStart!==undefined && e.selectionEnd==e.selectionStart)
            || (document.selection && document.selection.createRange().text==''))
            this.previousSibling.click(); /* no selection... do FIND first */
        if (   (e.selectionStart!==undefined && e.selectionEnd==e.selectionStart)
            || (document.selection && document.selection.createRange().text==''))
            { t.focus(); return; } /* still no selection... goto target input */
        e.focus(); replaceSelection(e,rv);
    };
    b=createTiddlyElement(p,'button',null,null,'+');
    b.style.width='2em';
    b.title='REPLACE selected text AND FIND NEXT target text';
    b.onclick=function(ev) { /* REPLACE and FIND NEXT */
        this.previousSibling.click();
        this.previousSibling.previousSibling.click();
    };
    b=createTiddlyElement(p,'button',null,null,'!');
    b.style.width='2em';
    b.title='REPLACE ALL occurrences of target text';
    b.root=this;
    b.onclick=function(ev) { /* REPLACE ALL */
        var e=config.quickEdit.getField(this.root);
        var t=this.previousSibling.previousSibling.previousSibling.previousSibling.previousSibling;
        var r=this.previousSibling.previousSibling.previousSibling.previousSibling;
        var tv=t.value.replace(/\\t/mg,'\t').unescapeLineBreaks();
        var rv=r.value.replace(/\\t/mg,'\t').unescapeLineBreaks();
        if (!tv.length) { alert('Please enter the target text'); t.focus(); return; }
        var m='This will replace all occurrences of:\n\n'+tv+'\n\nwith:\n\n'+rv+'\n\nAre you sure?';
        if (!confirm(m)) { r.focus(); r.select(); return; }
        e.value=e.value.replace(new RegExp(tv.escapeRegExp(),'gm'),rv);
        e.focus(); e.select(); Popup.remove();
    };
    Popup.show();
    if (!s.length) {t.focus();t.select()} else {r.focus();r.select()}
    event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>replace</a></html>
/%
|Name|QuickEdit_sort|
|Source|http://www.TiddlyTools.com/#QuickEdit_sort|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - sort lines of text|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="sort lines of text"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select sort order...','');
    s.options[s.length]=new Option('ascending','A');
    s.options[s.length-1].title='ascending';
    s.options[s.length]=new Option('descending','D');
    s.options[s.length-1].title='descending';
    s.size=s.length;
    s.onclick=function(){ if (!this.value.length) return;
        var e=config.quickEdit.getField(this.button); if (!e) return false;
        var lines=config.quickEdit.getSelection(e).split('\n').sort();
        if (this.value=='D') lines=lines.reverse();
        replaceSelection(e,lines.join('\n'));
        e.focus();
        Popup.remove(); return false;
    };
    s.onkeyup=config.quickEdit.keyup;
    Popup.show();
    s.focus();
    return config.quickEdit.processed(event);"
>sort</a></html>
/%
|Name|QuickEdit_split|
|Source|http://www.TiddlyTools.com/#QuickEdit_split|
|Version|2.4.3|
|Author|Eric Shulman|
|License|see http://www.TiddlyTools.com/#QuickEditPlugin|
|Type|html|
|Requires|QuickEditPlugin|
|Description|quickedit - move selection to new tiddler and insert link, embedded tiddler, or slider|

Usage: see  http://www.TiddlyTools.com/#QuickEditToolbar

Based on ideas originally developed by YannPerrin
(http://yann.perrin.googlepages.com/twkd.html#easySlicer)

%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink" tabindex="-1"
title="move selection to new tiddler and insert link, embedded tiddler, or slider"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    p.style.whiteSpace='nowrap';
    var i=createTiddlyElement(p,'input');
    i.defaultValue='Enter a new tiddler title';
    i.onfocus=function(){this.select()};
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select type...','');
    s.options[0].title='select split type';
    s.options[1]=new Option('link','link');
    s.options[1].title='replace with [[TiddlerName]]';
    s.options[2]=new Option('embed','embed');
    s.options[2].title='replace with \<\<tiddler TiddlerName\>\>';
    s.options[3]=new Option('slider','slider');
    s.options[3].title='replace with \<\<slider \u0022\u0022 [[TiddlerName]] [[label]] [[tooltip]]\>\>';
    s.onchange=function(){
        if (s.previousSibling.value==s.previousSibling.defaultValue)
            { alert('A tiddler title is required'); s.selectedIndex=0; s.previousSibling.focus(); return false; }
        var tid=s.previousSibling.value;
        if (store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid])))
            { s.previousSibling.focus(); return false; }
        switch(s.value) {
            case 'link':
                var newtxt='[['+tid+']]';
                break;
            case 'embed':
                var newtxt='\<\<tiddler [['+tid+']]\>\>';
                break;
            case 'slider':
                var label=prompt('Enter a slider label',tid);
                if (!label) { Popup.remove(); return false; }
                var tip=prompt('Enter a slider tooltip',label);
                if (!tip) { Popup.remove(); return false; }
                var newtxt='\<\<slider \u0022\u0022 [['+tid+']] [['+label+']] [['+tip+']]\>\>';
                break;
        }
        var txt=config.quickEdit.getSelection(config.quickEdit.getField(this.button));
        store.saveTiddler(tid,tid,txt,config.options.txtUserName,new Date(),[],{});
        story.displayTiddler(story.findContainingTiddler(this.button),tid);
        config.quickEdit.setSelection(this.button,newtxt);
        Popup.remove(); return false;
    };
    Popup.show();
    event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>split</a></html>
/%
|Name|QuickEdit_tiddler|
|Source|http://www.TiddlyTools.com/#QuickEdit_tiddler|
|Version|2.2.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|QuickEditPlugin|
|Overrides||
|Description|definition for toolbar button that inserts content from another tiddler|

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

**** INSERT TIDDLER ****
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="copy content from another tiddler"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
    var s=createTiddlyElement(p,'select'); s.button=this;
    s.options[0]=new Option('select a tiddler...','');
    s.onchange=function(){
        var txt=store.getTiddlerText(this.value);
        if (!txt) { displayMessage(this.value+' not found'); this.selectedIndex=0; this.focus(); return false; }
        config.quickEdit.setSelection(this.button,txt);
        Popup.remove(); return false;
    };
    var tids=store.getTiddlers('title');
    for (var t=0; t<tids.length; t++) {
        s.options[s.length]=new Option(tids[t].title,tids[t].title);
        s.options[s.length-1].title=tids[t].getSubtitle();
    }
    var s=createTiddlyElement(p,'select');
    s.options[0]=new Option('match tag...','');
    s.onchange=function(){
        var tag=this.value;
        var tids=tag.length?store.getTaggedTiddlers(tag,'title'):store.getTiddlers('title');
        var list=this.previousSibling;
        while (list.length) list.options[0]=null;
        var prompt='select a '+(tag.length?'tagged ':'')+'tiddler'+(tag.length?(' ['+tids.length+' matches]'):'')+'...';
        list.options[0]=new Option(prompt,'');
        for (var t=0; t<tids.length; t++) {
            list.options[list.length]=new Option(tids[t].title,tids[t].title);
            list.options[list.length-1].title=tids[t].getSubtitle();
        }
    };
    var tags=store.getTags();
    for (var t=0; t<tags.length; t++) s.options[s.length]=new Option(tags[t][0],tags[t][0]);
    Popup.show(p,false);
    event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>tiddler</a></html>
/***
|Name|[[QuickNotePlugin]]|
|Source|http://www.TiddlyTools.com/#QuickNotePlugin|
|Version|2.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|create quick notes using username+timestamp as tiddler titles|
!!!!!Documenatation
>see [[QuickNotePluginInfo]]
!!!!!Revisions
<<<
2011.06.07 2.1.0 added tiddler:... parameter (default=username)
2011.04.27 2.0.1 merge/clone defaultCustomFields for saving on TiddlySpace
| Please see [[QuickNotePluginInfo]] for previous revision details |
2009.09.15 1.0.0 initial release (transclusion)
<<<
!!!!!Code
***/
//{{{
version.extensions.QuickNotePlugin={ major:2, minor:1, revision:0, date:new Date(2011,6,7) };
config.macros.quickNote = {
    addedMsg: 'Note added to: "%0"',
    createdMsg: 'Created new note tiddler: "%0"',
    shadow: function(tid,txt) {
        config.shadowTiddlers[tid]=txt;
        config.annotations[tid]='see QuickNotePlugin';
    },
    init: function() {
        this.shadow('QuickNote',
            '<<quickNote dateformat:"$1" tags:"$2" tiddler:"$3">>');
        this.shadow('QuickNotePluginPanel',
            store.getTiddlerText('QuickNotePlugin##html',''));
    },
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var p=paramString.parseParams('name',null,true,false,true);
        var s=createTiddlyElement(place,'span');
        s.innerHTML=store.getTiddlerText('QuickNotePluginPanel','');
        var f=s.getElementsByTagName('form')[0]; if (!f) return;
        f.id=new Date().getTime()+Math.random().toString(); // globally unique ID
        var v=getParam(p,'dateformat',''); v=v=='$1'?'':v; f.dateformat.value=v;
        var v=getParam(p,'tags'      ,''); v=v=='$2'?'':v; f.tags.value=v;
        var v=getParam(p,'tiddler'   ,config.options.txtUserName); v=v=='$3'?'':v; f.target.value=v;
        if (v=='here') {
            var here=story.findContainingTiddler(place);
            if (here) f.target.value=here.getAttribute('tiddler');
        }
        this.tick(f.id);
    },
    tick: function(id) {
        var f=document.getElementById(id); if (!f) return;
        f.title.value=f.target.value+new Date().formatString(f.dateformat.value);
        window.setTimeout('config.macros.quickNote.tick("'+id+'")',1000);
    },
    saveNote: function(f) {
        var tid=f.title.value; if (!tid.length) return;
        var t=store.getTiddler(tid); var existing=t!=null;
        if (!existing) { t=new Tiddler(); t.text=store.getTiddlerText(tid,''); }
        var who =t&&config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
        var when=t&&config.options.chkForceMinorUpdate?t.modified:new Date();
        var txt =t.text+(t.text.length?'\n':'')+f.txt.value;
        var tags=t.tags.slice(0); var newtags=f.tags.value.readBracketedList();
        for (var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
        var fields=merge({},config.defaultCustomFields,true)
        store.saveTiddler(tid,tid,txt,who,when,tags,fields);
        autoSaveChanges(); story.displayTiddler(null,tid);
        if (existing) displayMessage(this.addedMsg.format([tid]));
        else displayMessage(this.createdMsg.format([tid]));
    }
}
//}}}
/***
!!!!!Shadow tiddler: QuickNotePluginPanel
{{{
!html
<html><nowiki><form class="quickNote" style="display:inline;margin:0;padding:0;white-space:nowrap;">
<input type=hidden name="dateformat" disabled value="">
<input type=hidden name="target" disabled value="">
<input type=text name="title" disabled value="" title="title for new tiddler" style="width:50%">
<input type=text name="tags" value="" title="tags for new tiddler" style="width:40%">
<input type=button value="save" style="width:8%"
    onclick="config.macros.quickNote.saveNote(this.form); return false;"><br>
<textarea name="txt" rows="5" cols="60" style="width:100%"></textarea>
</form></html>
!end
}}}
***/
 
/***
|Name|QuickNotePluginInfo|
|Source|http://www.TiddlyTools.com/#QuickNotePlugin|
|Documentation|http://www.TiddlyTools.com/#QuickNotePluginInfo|
|Version|2.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for QuickNotePlugin|
!!!!!Usage
<<<
{{{
<<quickNote tiddler:"..." dateformat:"..." taglist:"...">>
}}}
*''tiddler'' //(default=username)//<br>target tiddler in which to add note text.  Note: to refer to the current tiddler, use special //keyword value:// ''"here"'' (i.e., "tiddler:here")
*''dateformat'' //(default=none)//<br>format string (e.g. """YYYY0MM0DD0hh0mm0ss""") used to generate a unique tiddler title for each new note that is created, by combining the TW username with a //timestamp// for the current time.
*''taglist'' //(optional)//<br>one or more space-separated tag values (e.g., "tag tag [[tag with spaces]] tag tag ...") that will be added to newly created notes.
For backward-compatibility with existing document content, you can also use the {{{<<tiddler>>}}} macro to transclude the [[QuickNote]] //shadow tiddler//, like this:
{{{
<<tiddler QuickNote with: "dateformat" "taglist" "tiddler">>
}}}
Note: transclusion uses //unnamed// parameters that ''must occur in the order shown above''.  You can use "" as placeholders to apply default parameter values.
<<<
!!!!!Examples
<<<
{{{<<quickNote dateformat:"-YYYY0MM0DD0hh0mm0ss" tags:"quicknote journal">>}}}
<<quickNote dateformat:"-YYYY0MM0DD0hh0mm0ss" tags:"quicknote journal">>
<<<
!!!!!Revisions:
<<<
2011.06.07 2.1.0 added tiddler: macro parameter
2011.04.27 2.0.1 merge/clone defaultCustomFields for saving on TiddlySpace
2011.03.06 2.0.0 converted to plugin.  Handle append to existing tiddler.  Added autosave.
2009.09.15 1.0.0 initial release (transclusion)
<<<
!!!! Below are notes for a randomly selected passage of the Bible
{{fyi{
{{{ If you want to edit this, don't open this tiddler!  Click on header below. }}}
{{{   | }}}
{{{   V }}}
}}}
@@display:block;height:24em;overflow:auto;
{{fyi{
<script>
  var tids=store.getMatchingTiddlers("NOT excludeLists AND NOT wiki");
  //var tids=store.getTaggedTidlers("Comment");
  var randex = Math.floor(Math.random()*tids.length) ;
  if (tids.length)
    return "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[["+tids[randex].title+"]]<br><br><<tiddler "+tids[randex].title+">>";
</script>
}}}
stub
/***
|Name|RearrangeTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#RearrangeTiddlersPlugin|
|Version|2.0.0|
|Author|Eric Shulman|
|OriginalAuthor|Joe Raii|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.refreshTiddler|
|Description|drag tiddlers by title to re-order story column display|

adapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable
changes by ELS:
* hijack refreshTiddler() instead of overridding createTiddler()
* find title element by className instead of elementID
* set cursor style via code instead of stylesheet
* set tooltip help text
* set tiddler "position:relative" when starting drag event, restore saved value when drag ends
* update 2006.08.07: use getElementsByTagName("*") to find title element, even when it is 'buried' deep in tiddler DOM elements (due to custom template usage)
* update 2007.03.01: use apply() to invoke hijacked core function
* update 2008.01.13: only hijack core function once.  (allows for dynamic loading of plugin via bookmarklet)
* update 2008.10.19: added onclick popup menu with 'move to top' and 'move to bottom' commands

***/
//{{{

if (Story.prototype.rearrangeTiddlersHijack_refreshTiddler===undefined) {
Story.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template)
{
    this.rearrangeTiddlersHijack_refreshTiddler.apply(this,arguments);
    var theTiddler = document.getElementById(this.idPrefix + title); if (!theTiddler) return;
    var theHandle;
    var children=theTiddler.getElementsByTagName("*");
    for (var i=0; i<children.length; i++) if (hasClass(children[i],"title")) { theHandle=children[i]; break; }
    if (!theHandle) return theTiddler;

    Drag.init(theHandle, theTiddler, 0, 0, null, null);
    theHandle.style.cursor="move";
    theHandle.title="drag title to re-arrange tiddlers, click for more options..."
    theTiddler.onDrag = function(x,y,myElem) {
        if (this.style.position!="relative")
            { this.savedstyle=this.style.position; this.style.position="relative"; }
        y = myElem.offsetTop;
        var next = myElem.nextSibling;
        var prev = myElem.previousSibling;
        if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) {
            myElem.parentNode.removeChild(myElem);
            next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);
            myElem.style["top"] = -next.offsetHeight/2+"px";
        }
        if (prev && y < prev.offsetTop + prev.offsetHeight/2) {
            myElem.parentNode.removeChild(myElem);
            prev.parentNode.insertBefore(myElem, prev);
            myElem.style["top"] = prev.offsetHeight/2+"px";
        }
    };
    theTiddler.onDragEnd = function(x,y,myElem) {
        myElem.style["top"] = "0px";
        if (this.savedstyle!=undefined)
            this.style.position=this.savedstyle;
    };
    theHandle.onclick=function(ev) {
        ev=ev||window.event;
        var p=Popup.create(this); if (!p) return;
        var b=createTiddlyButton(createTiddlyElement(p,"li"),
            "\u25B2 move to top of column ","move this tiddler to the top of the story column",
            function() {
                var t=story.getTiddler(this.getAttribute("tid"));
                t.parentNode.insertBefore(t,t.parentNode.firstChild); // move to top of column
                window.scrollTo(0,ensureVisible(t));
                return false;
            });
        b.setAttribute("tid",title);
        var b=createTiddlyButton(createTiddlyElement(p,"li"),
            "\u25BC move to bottom of column ","move this tiddler to the bottom of the story column",
            function() {
                var t=story.getTiddler(this.getAttribute("tid"));
                t.parentNode.insertBefore(t,null); // move to bottom of column
                window.scrollTo(0,ensureVisible(t));
                return false;
            });
        b.setAttribute("tid",title);
        Popup.show(p,false);
        ev.cancelBubble=true; if (ev.stopPropagation) ev.stopPropagation(); return(false);
    };
    return theTiddler;
}
}

/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 **************************************************/

var Drag = {
    obj:null,

    init:
    function(o, oRoot, minX, maxX, minY, maxY) {
        o.onmousedown = Drag.start;
        o.root = oRoot && oRoot != null ? oRoot : o ;
        if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";
        if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";
        o.minX = typeof minX != 'undefined' ? minX : null;
        o.minY = typeof minY != 'undefined' ? minY : null;
        o.maxX = typeof maxX != 'undefined' ? maxX : null;
        o.maxY = typeof maxY != 'undefined' ? maxY : null;
        o.root.onDragStart = new Function();
        o.root.onDragEnd = new Function();
        o.root.onDrag = new Function();
    },

    start:
    function(e) {
        var o = Drag.obj = this;
        e = Drag.fixE(e);
        var y = parseInt(o.root.style.top);
        var x = parseInt(o.root.style.left);
        o.root.onDragStart(x, y, Drag.obj.root);
        o.lastMouseX = e.clientX;
        o.lastMouseY = e.clientY;
        if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;
        if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;
        if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;
        if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;
        document.onmousemove = Drag.drag;
        document.onmouseup = Drag.end;
        Drag.obj.root.style["z-index"] = "10";
        return false;
    },

    drag:
    function(e) {
        e = Drag.fixE(e);
        var o = Drag.obj;
        var ey = e.clientY;
        var ex = e.clientX;
        var y = parseInt(o.root.style.top);
        var x = parseInt(o.root.style.left);
        var nx, ny;
        if (o.minX != null) ex = Math.max(ex, o.minMouseX);
        if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);
        if (o.minY != null) ey = Math.max(ey, o.minMouseY);
        if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);
        nx = x + (ex - o.lastMouseX);
        ny = y + (ey - o.lastMouseY);
        Drag.obj.root.style["left"] = nx + "px";
        Drag.obj.root.style["top"] = ny + "px";
        Drag.obj.lastMouseX = ex;
        Drag.obj.lastMouseY = ey;
        Drag.obj.root.onDrag(nx, ny, Drag.obj.root);
        return false;
    },

    end:
    function() {
        document.onmousemove = null;
        document.onmouseup = null;
        Drag.obj.root.style["z-index"] = "0";
        Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);
        Drag.obj = null;
    },

    fixE:
    function(e) {
        if (typeof e == 'undefined') e = window.event;
        if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
        if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
        return e;
    }
};
//}}}
<<tiddler HideTiddlerBackground>><<tiddler HideTiddlerTags>>{{transparent smallform{<<recentChanges 30>>}}}
/***
|Name|RecentChangesPlugin|
|Source|http://www.TiddlyTools.com/#RecentChangesPlugin|
|Version|2.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|display droplist of recently changed tiddlers with goto, edit, and preview buttons|
!!!!!Usage
<<<
The {{{<<recentChanges>>}}} macro displays a droplist of all tiddlers that have been changed within the last N days (default=10 days).
{{{
<<recentChanges>>
<<recentChanges #ofdays summary noEdit previewheight previewclass>>
}}}
where:
* #ofdays specifies the time limit for listing changed tiddlers.  Use 0 (zero) to list all tiddlers in the document.
* ''summary'' is an optional keyword that outputs only the summary text (without the droplist or buttons)
* ''noEdit'' is an optional keyword that hides the 'edit' button
* previewheight is a CSS height measurement and sets the FIXED height of the tiddler preview area (default is 15em)
* previewclass is any CSS classname, and can be used to apply custom styles to the preview area (default is to use the standard 'viewer' class)
<<<
!!!!!Examples
<<<
{{smallform{
{{{<<recentChanges>>}}}
<<recentChanges>>
{{{<<recentChanges 30 summary>>}}}
<<recentChanges 30 summary>>

{{{<<recentChanges 30 noedit 10em groupbox>>}}}
<<recentChanges 30 noedit 10em groupbox>>
}}}
<<<
!!!!!Revisions
<<<
2009.07.02 [2.2.0] added optional 'noedit' keyword to hide 'edit' button
2008.07.01 [2.1.0] added optional 'summary' keyword for simple text output
2008.05.01 [2.0.1] fixup for titles with double-quotes
2007.07.26 [2.0.0] re-written as plugin
2006.10.02 [1.0.0] initial release (as inline script ShowRecentChanges)
<<<
!!!!!Code
***/
//{{{
version.extensions.RecentChangesPlugin= {major: 2, minor: 2, revision: 0, date: new Date(2009,7,2)};

config.shadowTiddlers.RecentChanges='<recentChanges>>';

config.macros.recentChanges = {
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var days=10; if (!isNaN(params[0])) days=parseInt(params[0]); // time limit in days (use 0 for all tiddlers)
        var summary=params[1]&&params[1].toLowerCase()=='summary'; if (summary) params.shift();
        var noedit=params[1]&&params[1].toLowerCase()=='noedit'; if (noedit) params.shift();
        var height='15em'; if (params[1]) height=params[1]; // preview area fixed height
        var previewclass='viewer'; if (params[2]) previewclass=params[2]; // preview area CSS class
        var tiddlers=store.getTiddlers('modified','excludeLists').reverse();
        var count=tiddlers.length;
        if (days) {
            var timelimit=(new Date()).getTime()-86400000*days;
            for (var count=0; count<tiddlers.length && tiddlers[count].modified>timelimit; count++);
        }
        var s=count+' tiddlers have changed since ';
        s+=new Date(timelimit).formatString('DDD, MMM DDth YYYY 0hh:0mm');
        s+=' ('+days+' days ago)';
        if (summary)
            { wikify(s,place); return; }
        var opts='<option value="">'+s+'</option>';
        for (var i=0; i<count; i++) { var t=tiddlers[i];
            opts+='<option value="'+t.title.replace(/"/g,"&#x22;")+'">';
            opts+=t.modified.formatString('YYYY.0MM.0DD 0hh:0mm')+' - '+t.title;
            opts+='</option>';
        }
        var h=store.getTiddlerText('RecentChangesPlugin##html')
        h=h.replace(/%options%/,opts);
        h=h.replace(/%listwidth%/,noedit?79.5:69.5);
        h=h.replace(/%noedit%/,noedit?'none':'inline');
        createTiddlyElement(place,'div').innerHTML=h;
        var preview=createTiddlyElement(place,'div',null,previewclass);
        preview.style.display='none';
        preview.style.whiteSpace='normal';
        preview.style.overflow='auto';
        preview.style.height=height;
    }
}
//}}}
/***
//{{{
!html
<form><select size=1 name="list" style="width:%listwidth%%"
    onchange="this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length;
        var target=this.parentNode.parentNode.nextSibling; removeChildren(target);
        if (!this.value.length)
            { target.style.display='none'; this.form.preview.value='preview'; }
        else if (target.style.display=='block') {
            wikify('<'+'<tiddler [['+this.value+']]>'+'>',target);
            target.style.display='block';
            this.form.preview.value='done';
        }
">%options%</select><!--
--><input type="button" name="goto" value="goto" disabled title="view selected tiddler" style="width:10%"
    onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target);
        target.style.display='none'; this.form.preview.value='preview';
        story.displayTiddler(story.findContainingTiddler(this),this.form.list.value);
"><input type="button" name="edit" value="edit" disabled title="edit selected tiddler" style="width:10%;display:%noedit%"
    onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target);
        target.style.display='none'; this.form.preview.value='preview';
        story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE);
"><input type="button" name="preview" value="preview" disabled title="show/hide tiddler preview" style="width:10%"
    onclick="var target=this.parentNode.parentNode.nextSibling;
        if (this.value=='preview') {
            removeChildren(target);
            wikify('<'+'<tiddler [['+this.form.list.value+']]>'+'>',target);
            target.style.display=this.form.list.value.length?'block':'none'; this.value='done';
        } else {
            removeChildren(target);
            target.style.display='none'; this.value='preview';
        }
"></form>
!end
//}}}
***/
 
<script label="refresh" title="re-render this tiddler">
        var here=story.findContainingTiddler(place); if (!here) return false;
        story.refreshTiddler(here.getAttribute("tiddler"),null,true);
</script><script>place.lastChild.className='button';</script>
/***
|Name|RelatedTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#RelatedTiddlersPlugin|
|Version|1.1.8|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|InlineJavascriptPlugin, NestedSlidersPlugin, StyleSheetShortcuts|
|Description|starting from a selected tiddler, display a list and/or tree of linked or transcluded tiddlers|
!!!!!Usage
<<<
Starting from a specified tiddler (default=current tiddler), {{{<<relatedTiddlers>>}}} recursively follows the internal links[] data to find all other tiddlers that are related to it by linking (e.g., {{{[[TiddlerName]]}}}) or used as macro parameter (e.g., {{{<<tiddler TiddlerName>>}}}).

The results can be displayed as a simple flat list of related tiddler titles, or as an indented tree diagram that shows the specific connections between the related tiddlers, and can be helpful for identifying clusters of interdependent tiddlers or simply generating an on-the-fly site map for quick discovery and navigation through complex or unfamiliar document content.
//{{{
<<relatedTiddlers TiddlerName hideform "exclude list">>
//}}}
*''TiddlerName'' (optional)<br>specifies the starting tiddler (and hides the 'select a tiddler' form controls).  Use keyword ''here'' to specify the current tiddler.
*''hideform'' (optional)<br>when present, suppress display of 'select tiddler' droplist and buttons.
*''"exclude list"'' (optional)<br>space-separated list of tiddlers whose links should not be followed.  Use quotes or double-square brackets to ensure list is processed as a single parameter.
The plugin also defines two functions that can be called externally (from other plugins or scripts) to generate and retrieve either a list of links or a formatted "tree view":
>{{{var list=config.macros.relatedTiddlers.getList(start,exclude,callback);}}}
>{{{var tree=config.macros.relatedTiddlers.getTree(start,exclude,callback);}}}
where ''start'' and ''exclude'' are the same as the macro parameters described above, plus an optional reference to a callback function that allows you to generate an alternative list/tree, based on application-specific data (such tiddler references contained in tags or custom fields), rather than using the default "links" list, like this:
>{{block{
{{{
window.myCallback=function(tiddler) {
    var list=[];
    // ... fill the list based on the specified tiddler ...
    return list;
}
}}}
}}}
The function takes a tiddler object as input, and returns a list of tiddler titles that are //directly// linked (or otherwise related) to that specific tiddler.  {{{getList()}}} and {{{getTree()}}} then use this information to find all the //indirect// connections between tiddlers to produce the list or tree output.
<<<
!!!!!Configuration
<<<
<<option chkRelatedTiddlersShowList>> show list display
<<option chkRelatedTiddlersShowTree>> show tree display
<<option chkRelatedTiddlersZoom>> enable autosizing of tree display //(aka, "zoom" or "shrink-and-grow")//
don't follow links contained in these tiddlers: <<option txtRelatedTiddlersExclude>>
<<<
!!!!!Examples
<<<
{{smallform{<<relatedTiddlers>>}}}

Using getList()/getTree() public API from other scripts/plugins:
><script show>
    var start="About";
    var exclude=config.options.txtRelatedTiddlersExclude.readBracketedList();
    var callback=null;
    var list=config.macros.relatedTiddlers.getList(start,exclude,callback);
    var tree=config.macros.relatedTiddlers.getTree(start,exclude,callback);
    return "There are "+list.length+" tiddlers related to [["+start+"]]...\n"+tree;
</script>
<<<
!!!!!Revisions
<<<
2009.09.29 [1.1.8] in findRelatedTiddlers(), fixed recursion when using non-null callback
2007.11.11 [1.1.7] in findRelatedTiddlers(), refactored into separate getlinks(),<br>and added param for optional callback function that can be used to return an alternative set of links.<br>Also added API functions, getTree() and getList() for use by other scripts
2007.07.13 [1.1.6] performance optimizations, more code cleanup
2007.07.10 [1.1.5] extensive code cleanup
2007.07.08 [1.1.0] converted from inline script
2007.06.29 [1.0.0] started (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.RelatedTiddlersPlugin={major: 1, minor: 1, revision: 8, date: new Date(2009,9,29)};

// initialize 'autozoom' and 'exclude' tree options (defaults are not to zoom, and to follow all links)
if (config.options.chkRelatedTiddlersZoom===undefined)
    config.options.chkRelatedTiddlersZoom=false;
if (config.options.txtRelatedTiddlersExclude===undefined)
    config.options.txtRelatedTiddlersExclude='GettingStarted DefaultTiddlers';
if (config.options.chkRelatedTiddlersShowList===undefined)
    config.options.chkRelatedTiddlersShowList=true;
if (config.options.chkRelatedTiddlersShowTree===undefined)
    config.options.chkRelatedTiddlersShowTree=false;

config.macros.relatedTiddlers={
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {

        // create form with unique DOM element ID (using current timestamp)... permits multiple form instances
        var now=new Date().getTime();
        var span=createTiddlyElement(place,"span");
        span.innerHTML=this.form.format(["relatedTiddlers_form"+now]);
        var form=span.getElementsByTagName("form")[0]; // find form that we just created
        var target=createTiddlyElement(span,"div"); // create target block in which generated output will be placed

        // initialize droplist contents (all tiddlers except hidden ones)
        var tids=store.getTiddlers('title','excludeLists');
        for (i=0; i<tids.length; i++) form.list.options[form.list.options.length]=new Option(tids[i].title,tids[i].title,false,false);

        // initialize exclude field (space-separated list)
        if (config.options.txtRelatedTiddlersExclude) form.exclude.value=config.options.txtRelatedTiddlersExclude;

        // set starting tiddler, form display, and/or exclude list from macro params (if present) and then show the results!
        var root="";
        var hide=false;
        var exclude=config.options.txtRelatedTiddlersExclude;
        if (params[0]) root=params[0]; // TiddlerName
        if (params[1]) hide=(params[1].toLowerCase()=="hideform"); // keyword: "hideform" or "showform" (default)
        if (params[2]) exclude=params[2]; // list of tiddlers whose links should not be followed
        if (root=="here") { var tid=story.findContainingTiddler(place); if (tid) root=tid.getAttribute("tiddler"); }
        if (store.tiddlerExists(root)) {
            // NOTE:  don't hide form when running IE, where putting initial focus on hidden form creates an error
            if (!config.browser.isIE) form.style.display=hide?"none":"block"; // show/hide the controls
            form.list.value=root; // set the root
            form.exclude.value=exclude; // set 'exclude' field
            form.get.click(); // DISPLAY INITIAL RESULTS (if tiddler is selected)
        }
    },
    form:
        "<form id='%0' action='javascript:;' style='display:inline;margin:0;padding:0;' onsubmit='return false'><!-- \
        --><span class='fine' style='float:left;vertical-align:bottom;width:39.5%;'><i>find all tiddlers related to:</i></span><!-- \
        --><span class='fine' style='float:left;vertical-align:bottom;'><i>exclude links contained in:</i></span><!-- \
        --><div style='clear:both'><!-- \
        --><select name=list size=1 style='width:39.5%' onchange='this.form.get.click()'><!-- \
        --><option value=''>select a tiddler...</option><!-- \
        --></select><!-- \
        --><input type='text' option='txtRelatedTiddlersExclude' name='exclude' value='' style='width:40%' \
            title='enter the names of tiddlers whose links should NOT be followed' \
            onkeyup='if (event.keyCode==13) { this.blur(); this.form.get.click(); }'  \
            onchange='config.options[this.getAttribute(\"option\")]=this.value;saveOptionCookie(this.getAttribute(\"option\"));'><!-- \
        --><input type=button name=get value='get related' style='width:10%'  \
            onclick='config.macros.relatedTiddlers.show(this.form,this.form.nextSibling);'><!-- \
        --><input type=button name=done value='done' disabled style='width:10%'  \
            onclick='this.form.list.selectedIndex=0; this.form.get.click();'><!-- \
        --></div><!-- \
        --></form>",
    styles:
        ".relatedTiddlers blockquote \
            { border-left:1px dotted #999; margin:0 25px; padding-left:.5em; font-size:%0%; line-height:115%; } \
        .relatedTiddlers .borderleft \
            { margin:0; padding:0; margin-left:1em; border-left:1px dotted #999; padding-left:.5em; } \
        .relatedTiddlers .fourcolumns \
            { display:block; -moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%} \
        .relatedTiddlers a \
            { font-weight:normal; } \
        .relatedTiddlers .bold, .relatedTiddlers .bold a \
            { font-weight:bold; } \
        .relatedTiddlers .floatright \
            { float:right; } \
        .relatedTiddlers .clear \
            { clear:both; } ",
    toggleform:
        "{{floatright{<html><a href='javascript:;' class='button' title='show/hide tiddler selection droplist and buttons' \
        onclick='var here=story.findContainingTiddler(this); var tid=here?here.getAttribute(\"tiddler\"):\"\"; \
            var f=document.getElementById(\"%0\"); var hide=(f.style.display!=\"none\"); \
            f.style.display=hide?\"none\":\"inline\"; this.innerHTML=hide?\"show form\":\"hide form\"; return false;'>%1</a></html>}}}",
    treecheck:
        "{{floatright{@@display:none;<<option chkRelatedTiddlersShowTree>>@@<html><a href='javascript:;' class='button' onclick='this.parentNode.previousSibling.firstChild.click(); return false;'>tree view</a></html>}}}",
    tree:
        "{{clear{\n----\n}}} \
        {{floatright small{<<option chkRelatedTiddlersZoom>>autosize tree display}}} \
        {{fine{\n''tiddlers linked from or included by'' [[%0]]\n}}}%1",
    listcheck:
        "{{floatright{@@display:none;<<option chkRelatedTiddlersShowList>>@@<html><a href='javascript:;' class='button' onclick='this.parentNode.previousSibling.firstChild.click(); return false;'>list view</a></html>}}}",
    list:
        "{{clear{\n----\n}}} \
        {{fine{\n''tiddlers containing links to'' [[%0]]\n}}} \
        {{small fourcolumns borderleft{\n%1}}} \
        {{fine{\n''tiddlers linked from or included by'' [[%0]]\n}}} \
        {{borderleft{\n \
            {{fine{\n''bold''=//direct links//, plain=//indirect links//, ''...''=//links not followed//}}} \
            {{small fourcolumns{\n%2}}} \
        }}}",
    skipped:
        "<html><span title='links from %0 have NOT been followed'>...</span></html>",
    mouseover: function(ev) {
        this.saveSize=this.style.fontSize;
        this.style.fontSize='100%';
        this.style.borderLeftStyle='solid';
    },
    mouseout: function(ev) {
        this.style.fontSize=this.saveSize;
        this.style.borderLeftStyle='dotted';
    },
    findRelatedTiddlers: function(tid,tids,treeout,level,exclude,callback) {
        // recursively build list of related tids (links and includes FROM the root tiddler) and generate treeview output
        var t=store.getTiddler(tid);
        if (!t || tids.contains(tid)) return tids; // tiddler already in results (or missing tiddler)... just return current results
        tids.push(t.title); // add tiddler to results
        var skip=exclude && exclude.contains(tid);
        treeout.text+=level+"[["+tid+"]]"+(skip?this.skipped.format([tid]):"")+"\n";
        if (skip) return tids; // branch is pruned... don't follow links
        var links=callback?callback(t):this.getLinks(t);
        var limit = (links.length - level + 5 );
        //SDM
        if ( limit > 10 ) { limit = 10; }
        limit = (limit-level);
        if ( limit < 0 ) { limit = 0; }
        for (var i=0; i<limit; i++) tids=this.findRelatedTiddlers(links[i],tids,treeout,level+">",exclude,callback);
        return tids;
    },
    getLinks: function(tiddler) {
        if (!tiddler.linksUpdated) tiddler.changed();
        return tiddler.links;
    },
    getTree: function(start,exclude,callback) {
        // get related tiddlers and generate blockquote-indented tree output
        var list=[]; var tree={text:""}; var level="";
        list=this.findRelatedTiddlers(start,list,tree,level,exclude,callback);
        return tree.text;
    },
    getList: function(start,exclude,callback) {
        // get related tiddlers and generate blockquote-indented tree output
        var list=[]; var tree={text:""}; var level="";
        list=this.findRelatedTiddlers(start,list,tree,level,exclude,callback);
        return list;
    },
    show: function(form,target) {
        removeChildren(target); form.done.disabled=true; // clear any existing output and disable 'done' button
        var start=form.list.value; if (!start.length) return; // get selected starting tiddler.  If blank value (heading), do nothing

        // get related tiddlers and generate blockquote-indented tree output
        var rels=[]; var treeview={text:""}; var level="";
        var exclude=config.options.txtRelatedTiddlersExclude.readBracketedList();
        var rels=this.findRelatedTiddlers(start,rels,treeview,level,exclude);
        rels.shift(); // remove self from list
        rels.sort(); // sort titles alphabetically

        // generate list output
        var tid=store.getTiddler(start);
        var relsview=""; for (t=0; t<rels.length; t++) {
            relsview+=tid.links.contains(rels[t])?("{{bold{[["+rels[t]+"]]}}}"):("[["+rels[t]+"]]");
            if (exclude && exclude.contains(rels[t])) relsview+=this.skipped.format([rels[t]]);
            relsview+="\n";
        }

        // get references TO the root tiddler, add to related tiddlers and generate refsview output
        var refs=[]; var referers=store.getReferringTiddlers(start);
        for(var r=0; r<referers.length; r++)
            if(referers[r].title!=start && !referers[r].tags.contains("excludeLists")) refs.push(referers[r].title);
        var refcount=refs.length; var relcount=rels.length; // remember individual counts
        for (var r=0; r<refs.length; r++) rels.pushUnique(refs[r]); // combine lists without duplicates
        var total=rels.length; // get combined total
        var refsview="[["+refs.sort().join("]]\n[[")+"]]\n";

        // set custom blockquote styles for treeview
        setStylesheet(this.styles.format([config.options.chkRelatedTiddlersZoom?80:100]),'relatedTiddlers_styles');

        // assemble and render output
        var summary=(total?(total+" tiddler"+(total==1?" is":"s are")):"There are no tiddlers")+" related to: [["+start+"]]";
        var list=this.list.format([start,refsview.length?refsview:"//none//",relsview.length?relsview:"//none//"]);
        var tree=this.tree.format([start,treeview.text]);
        var toggle=this.toggleform.format([form.id,(form.style.display=='none'?'show form':'hide form')]);
        var sep="{{floatright{ | }}}";
        var showList=total && config.options.chkRelatedTiddlersShowList;
        var showTree=relcount && config.options.chkRelatedTiddlersShowTree;
        var out="{{relatedTiddlers{"+toggle+(relcount?sep+this.treecheck:"")+(total?sep+this.listcheck:"")+summary+(showList?list:"")+(showTree?tree:"")+"}}}";
        wikify(out,target);
        form.done.disabled=false; // enable 'done' button

        // add mouseover/mouseout handling to blockquotes (for autosizing)
        var blocks=target.getElementsByTagName("blockquote");
        for (var b=0; b<blocks.length; b++)
            { blocks[b].onmouseover=this.mouseover; blocks[b].onmouseout=this.mouseout; }

        // add side-effect to checkboxes so that display is refreshed when a checkbox state is changed
        var checks=target.getElementsByTagName("input");
        for (var c=0; c<checks.length; c++) {
            if (checks[c].type.toLowerCase()!="checkbox") continue;
            checks[c].coreClick=checks[c].onclick; // save standard click handler
            checks[c].formID=form.id; // link checkbox with correponding form
            checks[c].onclick=function() { this.coreClick.apply(this,arguments); document.getElementById(this.formID).get.click(); }
        }
    }
}
//}}}
2013-05

I try to share a version of this in session.  It doesn't go well at all. 
----

It is a difficult time, like many other difficult times.  The reasons are hard to tag and explain.  But I must try.

The dog is one year old and we have had her for 8 months.  She is difficult for all of us.  For T she is more difficult.  T tends to have high expectations and is disappointed when they aren’t fulfilled.  

Hello, Lydia.  Oh, good dog, good lovies.  That’s the way.  Nice dog.  No, don’t jump.  Oh, kisses, that’s nice.  No, not like that.  Are you going to be nice?  Kisses.  Ow!  No!  That hurts!  There.  That’s better.   Ow!  YIP!  Stop that!  Don’t do that to Mommy!  Get down!  No!  No!

The “YIP” part is from the training books.  It’s where you act like a mother dog and give a louder, high-pitched yelp.  This is an “interrupter” and puts the puppy on warning.  T has something wrong with her timing.  The dog doesn’t receive her message on the instinctive level.  I suppose it’s due to slow processing and decision-making by T.  Was that a bad enough snap?  Should I do the “yip”?  Yes, I will do the “yip”.  Our recent studies about autism confirm there is a hindrance to real-time processing, and it affects relationships.

R. commented two months ago, 
When the dog is nipping, I don’t hear Mom telling her “no”.   

My perception is when the dog is nipping, 
the dog doesn’t hear Mom telling her “no”.  

T doesn’t agree with either description.

The dog is afraid of her, I think.   Here comes mistress.  Does she want to “take me for a walk,” contend with me and scold me?  Is she going to talk with me gently, then change to an angry fearful tone?  I want to make her happy, but she doesn’t tell me how – not in a way I can understand.  

!! T walks the dog  

T walks the dog.  When the dog pulls, T resists by going the opposite direction.  This is her application of dog training.  After a few minutes of this T is too aggrieved in her body and soul to continue, so they go indoors.  

T can feel successful if the “gentle leader” (GL) training device is on dog.  The GL makes dog tractable at the expense of freedom because of discomfort when she pulls.  (The GL is humane compared to the old-fashioned choke chain, which has gone into disfavor with trainers.)  But she is mostly unable to get the GL on, because the dog resists, evades and snaps at T.  

!! I walk the dog

I walk the dog.  When the dog pulls, I communicate disapproval:  I plant my feet, perhaps pull an opposite direction, I say “No”, and I give a shake to a metal shaker I carry.  (It’s in my leash-holding hand, so it automatically delivers a metallic shake if dog lunges.)  When the dog agrees to good behavior by easing all tension and looking back to me, I give her a positive sound using the clicker.  We resume walking.  

When dog is walking with a loose leash, she knows a meat crumb is going to appear on the sidewalk in front of her (along with a click).  This will happen often, every 4-8 of my paces.  We go though a lot of meat crumbs this way.  (It turns out we may have to stay in this phase of training for a while.)

If the dog starts pulling repeatedly after some initial success, I stop and put the GL on her.  After that she receives treats, but less often (maybe she shouldn’t).  I figure on this remedy becoming unnecessary at some point in the future.  I have to resort to the GL on many walks, maybe half (I am including times I forgot to bring the GL; on those occasions, we return home sooner.)  

My walks with dog are becoming longer and better.  

!! T and I walk the dog together

We tried it once recently.  T talked a lot, correcting my training.  You are letting the dog pull too much.  You are not doing what Andrea said.  I can’t do that – see? that’s more pulling than I can tolerate.  T inserted herself physically between me and the dog, or next to the dog.  Dog pulled constantly.  Most actions by me or dog provoked harsh words from T.

!! I walk the dog for T today

This morning I showed T my dog walk.  This was unplanned both as a dog walk and a demonstration, so I didn’t have the shaker, meat crumbs, or clicker.  But, I thought I bet dog can do this.   

I made sure T was away from us; dog not aware of her.  We had our usual halting start to the sidewalk.  T began her verbal protests.  I signaled her brusquely to be quiet and she was.

The dog started walking peaceably when we got to the sidewalk, with a loose leash.  At moments she looked up at me, expecting a treat, even drooling.  I had to make her happy with verbal approval.  We walked like that for 3-4 minutes.  There were a half-dozen times dog pulled or lunged -- about like usual.  I would plant myself until she let up, and then we would resume.  

I wanted T to realize Lydia can put on a good walk when conditions are right.  I am sure she’s disbelieved me until now.  She was unwilling to express much delight or allow more than a bare admission that she hadn’t known the dog is heeding so well.  As usual, she wanted to criticize.

T recriminates me every day for the dog’s condition.  

Why do you not do what Andrea says?  Didn’t you listen to her on the first day of training?  She said zero tolerance!  You allow the dog to pull.  You went a long time allowing her to pull constantly.  

My replies have largely gone unsaid.  

The GL should not be permanent – it’s difficult for me to put on and it requires more dexterity than you have.   Dog won’t let you put on the GL.  

Dog won’t walk with you peaceably because you are not peaceable.  When dog is walking, you aren’t ready with the response that signals approval.  Dog has a merely negative experience.  

I’m the one training the dog.  Why I am the one with all the blame?  Why do you continually press your wrong views as correct?

My method requires planning, concentration, and patience.  Also it requires dexterity to handle all the items.  It requires a bond with dog.  Finally, it requires the ability to respond “in real time”.  Almost all that is difficult for you.  You need to find goals and methods that can work for you, instead of trying to make me obey your version of dog-walk training.

There will come a time when I can’t walk the dog daily.  What will happen then?  

We both have had a long process understanding the training process (T is correct I’ve had to adjust.) Andrea is a very good coach.  But T has wrong interpretations.  Andrea’s instructions have gone through the ASD filter and become stuck.  

Andrea has probably said zero tolerance.  I understand this to mean total consistency.  This is a good corrective stance for me because I am by nature inconsistent.  

Two months ago Andrea told me to use the GL early in the walk if dog was pulling; she used the baseball term one strike only.  I tried it, but I decided dog is not yet ready to benefit from this.  I think dog now may be close.  

To T, this deferment means I’m repudiating Andrea’s wisdom and damaging dog’s training.  

T’s perfectionism can’t effectively process terms like zero tolerance.   T believes in rewarding the dog for a perfect act of compliance.  Dog can hardly sustain this, so there are few rewards.  

There is the same problem here as for the negative feedback of “yip”.  When a reward comes, it is after a period of processing on T’s part.  By then the dog has missed the benefit.  These transactions happen at a subtle level and T doesn’t register them.  

Perfectionism prevents T from recognizing and rewarding dog’s intermediary improvements.  This is essential to training; you look not for full-blown success, but steps in the right direction.  T protests that her physical weaknesses don’t give her the margins she needs to deal with partial success.  It’s true; but the important problem is her incapacity to nurture incremental growth.

At the basic level, T rules but does not relate to the dog.  This hinders bonding:  
* T is afraid to bond with dog (because of ASD); 
* T compensates by applying external rules; 
* Dog experiences disapproval, but not to the benefit of her training; 
* Dog’s failure to comply creates frustration and fear for T.

Another dynamic of T’s approach to dog is worry.  She believes the dog is sickly and requires extra care and intervention.  We take her to the vet for constipation or vomiting.  We buy expensive dog food “for sensitive stomach” and give a daily dose of Pepcid.  A vet also recommended a probiotic supplement, so we do that.  (T has taken dog off benedryl.)  

In reality the dog has normal vicissitudes of appetite, digestion and bowel action.  I think constipation would eventually be resolved by a bowel movement, given normal exercise, but we go to the vet to accommodate T.  Later on, if I question our regimens and whether they’re needed, T sharply replies “That’s what the vet recommended, because our dog has a sensitive stomach.”  There is a note of emotional blackmail:  You don’t want the dog to get sick and die, do you?   

Not all the trips are needless in my opinion.  But, to give an outstanding example of one that wasn’t, once T brought the dog in because her tongue appeared to T to be too red.  The vet showed a bit of amusement, which made T unhappy.  T likes or dislikes veterinary personnel according to how they respond to her concerns.  Of course, the “dislike” list tends to grow.  This is another (more excusable) instance of her tendency to know people by superficial models.

The dog responds to the “homeostasis” of worry and dissatisfaction.  Naturally it affects dog’s digestion.  Thus a cycle is established.

This entire set of patterns applies to more than the dog.  It’s a frame that allows substitution for each element.  Currently we have stress in our home because of my son’s approach to his new relationship with a girlfriend.  All the issues above can be found. 

T regards R. according to several shallow images, whichever seems to fit the situation.  During unremarkable times, she assumes he is a bit perfect.  At least, I infer she does – how else would I account for her distress when something bad comes up?  Then it’s as if there is a bad weed inside R. that has taken root and grown large.  It was our responsibility to remove the weed, but we didn’t.  Now it brings danger for him, danger for us, and the realization of failure.  

T believes in giving approval for perfect acts of obedience.  This is difficult because ultimately perfection requires the heart, and she can’t see enough of that.  Sometimes she decides the heart is perfect.  Later, if some defect is revealed, she has to retract her approval.

More often, she withholds approval.  But perhaps it’s more a case of postponing than withholding; a period of gathering evidence has to come first.  Still, it means a “step in the right direction” often goes unappreciated.  

Because approval requires effort and planning, it is never spontaneous and usually downright awkward.  This results in the same failed transaction as with the dog, both for positive and negative feedback.  

Early in our relationship T offered spontaneous praise and affirmation, so I know she isn’t incapable.  But these days she is functionally incapable.  Sometimes it comes to her attention in a limited way and she feels sad.  If I bring it up, she is likely to make a defensive reply.

T’s all-or-nothing assessments put stress on every emotional transaction.  Good relationships allow the other person a lot of unknown-ness.  Perfectionism does the opposite:  it restricts freedom.  T’s family members want to preserve their necessary freedom, so they push back against the perfectionism.  

T continues to try to rule rather than relate:
* T is afraid to know R. as he really is.  She seems to view him through a couple of superficial models, either positive or negative.
* She imposes rigid, superficial rules.  She has trouble explaining these and often assumes are understood.  For her, they are codified; when she learns others haven’t signed on, it’s taken as a moral failure on their part.
* R. experiences T’s disapproval.  
* There isn’t a way to earn her satisfaction or even a well-disposed interest.  R. gives up trying to be “problem-free”.  
* T becomes more distrustful and coercive.

Naturally, his digestion is affected.  

Like the dog, R. endures T’s worry.  Unlike the dog, he’s an 18-year-old man who now expresses contempt for topics like allergies, asthma, ADHD, Asperger’s Disorder, Ehlers-Danlos Syndrome, and vitamin deficiencies.  He’s not subject to his mother’s translation of these ailments, and he knows listening to her go on about them isn’t helpful or healthy.

He shows the same contempt for T’s fear and outrage over his relationship with Zoe.  She’s an exemplary young woman from an intelligent, caring family.  R. and Zoe seem to treat each other with full courtesy and respect.  We met her parents over the phone a week ago.   Zoe’s mother was positively in awe of R.’s upright behavior.  T was thrilled to hear about it – briefly.  Now she knows the family may attend a church that doesn’t meet the evangelical standard.  She’s alarmed, and R. isn’t responding in a way that reassures her.

R. is done with the cycle of coercion and evasion.  He has the classic adolescent confusions on how to escape, but his occasional moments of grace are inspiring for me.  

T perceives betrayal on every front.  Each party has had their point of critical failure; it may thus be culpable for problems with one of the other parties.  This insulates  T from seeing her unhelpful patterns.  T’s case-building takes elaborate forms.  

As you will guess, I can review the whole frame as it pertains to me.

R.’s girlfriend may turn out to be a half-hearted believer or no believer at all.  Because the “good model” of R. isn’t available, she must insert the “bad model” for him -- and also for me.  This is my fault, says T.  Some weed took root, and I didn’t pull it.  

I don’t have any “good model” options for T’s view of me.  I haven’t for years.  

My opinion is that R. should grow through his time of love in the ordinary way, and the dog should have some play time until the next poop.  But those ideas are condemned by T, along with these:
R. is outside our control; coercive levers aren’t available anymore.
Trying to act controlling anyway can cause damage.
We can’t prevent R. from accepting outside views.  
When fully mature, R. will not agree with us about some essentials.  This is natural and good.  
R. isn’t a self-declaring Christian now, but this is not a prospect of doom.  He may become one later -- a natural pattern for maturing.  

T knows these things are true (or some of them), but only superficially.  She rejects them absolutely in her thinking and behaviors.  Nonetheless, when confronted, she is very angry over what she takes as a false (even malicious) accusation.  T will deny or contradict most of what I’ve written here.  Much of it I haven’t dared say to her.

Because T can’t identify the break between her stated and actual beliefs, we use terms like intimacy and trust for different things.  This makes family discussions unproductive.  

We are all afraid of dealing with T.  Her mood is fickle; she expresses disapproval in strident terms; she remembers past offenses and brings them up often.  She often grows morose or agitated over a memory from some other season of life.  By often, I mean five to ten times a week.  (It must be considerably more; she keeps these to herself when she feels she able.)  Any turn of discussion can provoke a negative response.  We all know a downward turn can mark the beginning of a crisis, and a crisis could descend into disaster.  

There is no such thing as a relaxed conversation.  Conversations of substance are rare.  

Now T has entered menopause, adding volatility to the mix.  (I’m sure some or most of the episodes I’ve described would be less emotionally stressful except for menopause.)

I am discouraged.  But I do have some points of hope.  Although the diagnosis of ASD took a decade to develop, it is here.  I believe T’s relational frailties are intransigent; but if there are remedies, I think therapy for ASD has the best chance of applying them.  

We begin to have a contingent of people whom are trusted by T and really have some insight:  Marilyn Ross, Shawn Langford, perhaps some others.  We also have Debi Marshall who specializes in autism.  

Could dog training provide T with useful handles for other areas of life?  

But really, is there hope?  I don’t know.  It is a depressing time, largely because I am concerned for R.’s condition, but perhaps more because I am weighed down with bitterness from T’s negative pronouncements.
Conflict for the trust of the child
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0a|
|Date:|27-Jun-20 11|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

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

  },

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

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

  storeMethods: {

    saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

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

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

    removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

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

  },

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

config.renameTags.init();

//}}}

/***
|Name|SaveAsPlugin|
|Source|http://www.TiddlyTools.com/#SaveAsPlugin|
|Documentation|http://www.TiddlyTools.com/#SaveAsPluginInfo|
|Version|2.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Save current document to a different path/filename|
Adds 'save as' command to 'backstage' menu and {{{<<saveAs>>}}} macro (to embed command link wherever you like).
>//Note: This plugin replaces functionality previously provided by [[NewDocumentPlugin]], except for the HTML+CSS 'snapshot' feature, which has been moved to a separate [[SnapshotPlugin]].//
!!!!!Documentation
<<<
see [[SaveAsPluginInfo]]
<<<
!!!!!Revisions
<<<
2009.08.04 [2.6.1] fixed handling when limit is omitted
| Please see [[SaveAsPluginInfo]] for additional revision details |
2006.02.03 [1.0.0] Created
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveAsPlugin= {major: 2, minor: 6, revision: 1, date: new Date(2009,8,4)};

config.macros.saveAs = {
    label: 'save as...',
    labelparam: 'label:',
    prompt: 'Save current document to a different path/file',
    promptparam: 'prompt:',
    filePrompt: 'Please select or enter a target path/filename',
    targetparam: 'target:',
    defaultFilename: 'new.html',
    filenameparam: 'filename:',
    currfilekeyword: 'here',
    typeparam: 'type:',
    type_TW: 'tw', type_PS: 'ps', type_TX: 'tx', type_CS: 'cs', type_NF: 'nf', // file type tokens
    type_map: { // map filetype param alternatives/abbreviations to token values
        tiddlywiki:'tw', tw:'tw', wiki: 'tw',
        purestore: 'ps', ps:'ps', store:'ps',
        plaintext: 'tx', tx:'tx', text: 'tx',
        comma:     'cs', cs:'cs', csv:  'cs',
        newsfeed:  'nf', nf:'nf', xml:  'nf', rss:'nf'
    },
    limitparam: 'limit:',
    replaceparam: 'replace',
    mergeparam: 'merge',
    quietparam: 'quiet',
    openparam: 'open',
    askParam: 'ask',
    askMsg: "Enter a tag filter (use * for all tiddlers, 'none' for blank document)",
    emptyParam: 'none',
    confirmmsg: "Found %0 tiddlers matching\n\n'%1'\n\nPress OK to proceed",
    mergeprompt: '%0\nalready contains tiddler definitions.\n'
        +'\nPress OK to add new/revised tiddlers to current file contents.'
        +'\nPress Cancel to completely replace file contents',
    mergestatus: 'Merged %0 new/revised tiddlers and %1 existing tiddlers',
    okmsg: '%0 tiddlers written to %1',
    failmsg: 'An error occurred while creating %1',
    filter: '',
    handler: function(place,macroName,params) {
        if ((params[0]||'').startsWith(this.labelparam))
            var label=params.shift().substr(this.labelparam.length);
        if ((params[0]||'').startsWith(this.promptparam))
            var prompt=params.shift().substr(this.promptparam.length);
        if ((params[0]||'').startsWith(this.targetparam))
            var target=params.shift().substr(this.targetparam.length);
        if ((params[0]||'').startsWith(this.filenameparam))
            var filename=params.shift().substr(this.filenameparam.length);
        if ((params[0]||'').startsWith(this.typeparam))
            var filetype=this.type_map[params.shift().substr(this.typeparam.length).toLowerCase()];
        if ((params[0]||'').startsWith(this.limitparam))
            var limit=params.shift().substr(this.limitparam.length);
        var q=((params[0]||'')==this.quietparam);   if (q) params.shift();
        var o=((params[0]||'')==this.replaceparam); if (o) params.shift();
        var m=((params[0]||'')==this.mergeparam);   if (m) params.shift();
        var a=((params[0]||'')==this.openparam);    if (a) params.shift();
        var btn=createTiddlyButton(place,label||this.label,prompt||this.prompt,
            function(){ config.macros.saveAs.go( this.getAttribute('target'),
                this.getAttribute('filename'), this.getAttribute('filetype'),
                this.getAttribute('filter'), this.getAttribute('limit'),
                this.getAttribute('quiet')=='true', this.getAttribute('overwrite')=='true',
                this.getAttribute('merge')=='true', this.getAttribute('autoopen')=='true');
                return false; }
        );
        if (target) btn.setAttribute('target',target);
        if (filename) btn.setAttribute('filename',filename);
        btn.setAttribute('filetype',filetype||this.type_TW);
        btn.setAttribute('filter',params.join(' '));
        btn.setAttribute('limit',limit||0);
        btn.setAttribute('quiet',q?'true':'false');
        btn.setAttribute('overwrite',o?'true':'false');
        btn.setAttribute('merge',m?'true':'false');
        btn.setAttribute('autoopen',a?'true':'false');
    },
    go: function(target,filename,filetype,filter,limit,quiet,overwrite,merge,autoopen) {
        var cm=config.messages; // abbreviation
        var cms=config.macros.saveAs; // abbreviation
        if (window.location.protocol!='file:') // make sure we are local
            { displayMessage(cm.notFileUrlError); return; }

        // get tidders, confirm filtered results
        var tids=cms.selectTiddlers(filter);
        if (tids===false) return; // cancelled by user
        if (cms.filter!=cms.emptyParam && cms.filter.length && !quiet)
            if (!confirm(cms.confirmmsg.format([tids.length,cms.filter]))) return;

        // get target path/filename
        if (!filetype) filetype=this.type_TW;
        target=target||cms.getTarget(filename,filetype==this.type_TX?'txt':filetype==this.type_CS?'csv':'html');
        if (!target) return; // cancelled by user

        var link='file:///'+target.replace(/\\/g,'/');
        var samefile=link==decodeURIComponent(window.location.href);
        var p=getLocalPath(document.location.href);
        if (samefile) {
            if (config.options.chkSaveBackups) { var t=loadOriginal(p);if(t)saveBackup(p,t); }
            if (config.options.chkGenerateAnRssFeed && saveRss instanceof Function) saveRss(p);
        }
        var notes='';
        var total={val:0};
        var out=this.assembleFile(target,filetype,tids,limit,notes,quiet,overwrite,merge,total);
        var ok=saveFile(target,out);
        if (ok && autoopen) {
            if (!samefile) window.open(link).focus();
            else { store.setDirty(false); window.location.reload(); }
        }
        if (!quiet || !(ok && autoopen))
            displayMessage((ok?this.okmsg:this.failmsg).format([total.val,target]),link);
    },
    selectTiddlers: function(filter) {
        var cms=config.macros.saveAs; // abbreviation
        var tids=[]; cms.filter=filter||'';
        if (filter==cms.emptyParam) tids=[];
        if (filter==config.macros.saveAs.askParam) {
            filter=prompt(config.macros.saveAs.askMsg,'');
            if (!filter) return false;  // cancelled by user
            cms.filter=filter=='*'?'':filter;
        }
        if (!filter||!filter.length||filter=='*') tids=store.getTiddlers('title');
        else tids=store.filterTiddlers('[tag['+filter+']]');
        return tids;
    },
    getTarget: function(defName,defExt) {
        var cms=config.macros.saveAs; // abbreviation
        // get new target path/filename
        var newPath=getLocalPath(window.location.href);
        var slashpos=newPath.lastIndexOf('/'); if (slashpos==-1) slashpos=newPath.lastIndexOf('\\');
        if (slashpos!=-1) newPath=newPath.substr(0,slashpos+1); // trim filename
        if (!defName||!defName.length) { // use current filename as default
            var p=getLocalPath(window.location.href);
            var s=p.lastIndexOf('/'); if (s==-1) s=p.lastIndexOf('\\');
            if (s!=-1) defName=p.substr(s+1);
        }
        var defFilename=(defName||cms.defaultFilename).replace(/.html$/,'.'+defExt);
        var target=cms.askForFilename(cms.filePrompt,newPath,defFilename,defExt);
        if (!target) return; // cancelled by user
        // if specified file does not include a path, assemble fully qualified path and filename
        var slashpos=target.lastIndexOf('/'); if (slashpos==-1) slashpos=target.lastIndexOf('\\');
        if (slashpos==-1) target=target+(defName||cms.defaultFilename).replace(/.html$/,'.'+defExt);
        return target;
    },
    askForFilename: function(msg,path,file,defExt) {
        if(window.Components) { // moz
            try {
                netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
                var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
                picker.init(window, msg, nsIFilePicker.modeSave);
                var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
                thispath.initWithPath(path);
                picker.displayDirectory=thispath;
                picker.defaultExtension=defExt||'html';
                picker.defaultString=file;
                picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
                if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
            }
            catch(e) { alert('error during local file access: '+e.toString()) }
        }
        else { // IE
            try { // XP/Vista only
                var s = new ActiveXObject('UserAccounts.CommonDialog');
                s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
                s.FilterIndex=(defExt=='txt')?2:3; // default to HTML files;
                s.InitialDir=path;
                s.FileName=file;
                if (s.showOpen()) var result=s.FileName;
            }
            catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
        }
        return result;
    },
    plainTextHeader:
         'Source:\n\t%0\n'
        +'Title:\n\t%1\n'
        +'Subtitle:\n\t%2\n'
        +'Created:\n\t%3 by %4\n'
        +'Application:\n\tTiddlyWiki %5 / %6 %7\n\n',
    plainTextTiddler:
        '- - - - - - - - - - - - - - -\n'
        +'|     title: %0\n'
        +'|   created: %1\n'
        +'|  modified: %2\n'
        +'| edited by: %3\n'
        +'|      tags: %4\n'
        +'- - - - - - - - - - - - - - -\n'
        +'%5\n',
    plainTextFooter:
        '',
    newsFeedHeader:
         '<'+'?xml version="1.0"?'+'>\n'
        +'<rss version="2.0">\n'
        +'<channel>\n'
        +'<title>%1</title>\n'
        +'<link>%0</link>\n'
        +'<description>%2</description>\n'
        +'<language>en-us</language>\n'
        +'<copyright>Copyright '+(new Date().getFullYear())+' %4</copyright>\n'
        +'<pubDate>%3</pubDate>\n'
        +'<lastBuildDate>%3</lastBuildDate>\n'
        +'<docs>http://blogs.law.harvard.edu/tech/rss</docs>\n'
        +'<generator>TiddlyWiki %5 / %6 %7</generator>\n',
    newsFeedTiddler:
        '\n%0\n',
    newsFeedFooter:
        '</channel></rss>',
    pureStoreHeader:
         '<html><body>'
        +'<style type="text/css">'
        +'  #storeArea {display:block;margin:1em;}'
        +'  #storeArea div {padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}'
        +'  #pureStoreHeading {width:100%;text-align:left;background-color:#eeeeee;padding:1em;}'
        +'</style>'
        +'<div id="pureStoreHeading">'
        +'  TiddlyWiki "PureStore" export file<br>'
        +'  Source'+': <b>%0</b><br>'
        +'  Title: <b>%1</b><br>'
        +'  Subtitle: <b>%2</b><br>'
        +'  Created: <b>%3</b> by <b>%4</b><br>'
        +'  TiddlyWiki %5 / %6 %7<br>'
        +'  Notes:<hr><pre>%8</pre>'
        +'</div>'
        +'<div id="storeArea">',
    pureStoreTiddler:
        '%0\n%1',
    pureStoreFooter:
        '</div><!--POST-BODY-START-->\n<!--POST-BODY-END--></body></html>',
    assembleFile: function(target,filetype,tids,limit,notes,quiet,overwrite,merge,total) {
        var revised='';
        var now = new Date().toLocaleString();
        var src=convertUnicodeToUTF8(document.location.href);
        var title = convertUnicodeToUTF8(wikifyPlain('SiteTitle').htmlEncode());
        var subtitle = convertUnicodeToUTF8(wikifyPlain('SiteSubtitle').htmlEncode());
        var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
        var twver = version.major+'.'+version.minor+'.'+version.revision;
        var v=version.extensions.SaveAsPlugin; var pver = v.major+'.'+v.minor+'.'+v.revision;
        var headerargs=[src,title,subtitle,now,user,twver,'SaveAsPlugin',pver,notes];
        switch (filetype) {
            case this.type_TX: // plain text
                var header=this.plainTextHeader.format(headerargs);
                var footer=this.plainTextFooter;
                break;
            case this.type_CS: // comma-separated
                var fields={};
                for (var i=0; i<tids.length; i++) for (var f in tids[i].fields) fields[f]=f;
                var names=['title','created','modified','modifier','tags','text'];
                for (var f in fields) names.push(f);
                var header=names.join(',')+'\n';
                var footer='';
                break;
            case this.type_NF: // news feed (XML)
                headerargs[0]=store.getTiddlerText('SiteUrl','');
                var header=this.newsFeedHeader.format(headerargs);
                var footer=this.newsFeedFooter;
                tids=store.sortTiddlers(tids,'-modified');
                break;
            case this.type_PS: // PureStore (no code)
                var header=this.pureStoreHeader.format(headerargs);
                var footer=this.pureStoreFooter;
                break;
            case this.type_TW: // full TiddlyWiki
            default:
                var currPath=getLocalPath(window.location.href);
                var original=loadFile(currPath);
                if (!original) { alert(config.messages.cantSaveError); return; }
                var posDiv = locateStoreArea(original);
                if (!posDiv) { alert(config.messages.invalidFileError.format([currPath])); return; }
                var header = original.substr(0,posDiv[0]+startSaveArea.length)+'\n';
                var footer = '\n'+original.substr(posDiv[1]);
                break;
        }
        if (parseInt(limit)!=0) tids=tids.slice(0,limit);
        var out=this.getData(target,filetype,tids,quiet,overwrite,merge,fields);
        var revised = header+convertUnicodeToUTF8(out.join('\n'))+footer;
        // if full TW, insert page title and language attr, and reset MARKUP blocks as needed...
        if (filetype==this.type_TW) {
            var newSiteTitle=convertUnicodeToUTF8(getPageTitle()).htmlEncode();
            revised=revised.replaceChunk('<title'+'>','</title'+'>',' ' + newSiteTitle + ' ');
            revised=updateLanguageAttribute(revised);
            var titles=[]; for (var i=0; i<tids.length; i++) titles.push(tids[i].title);
            revised=updateMarkupBlock(revised,'PRE-HEAD',
                titles.contains('MarkupPreHead')? 'MarkupPreHead' :null);
            revised=updateMarkupBlock(revised,'POST-HEAD',
                titles.contains('MarkupPostHead')?'MarkupPostHead':null);
            revised=updateMarkupBlock(revised,'PRE-BODY',
                titles.contains('MarkupPreBody')? 'MarkupPreBody' :null);
            revised=updateMarkupBlock(revised,'POST-SCRIPT',
                titles.contains('MarkupPostBody')?'MarkupPostBody':null);
        }
        total.val=out.length;
        return revised;
    },
    getData: function(target,filetype,tids,quiet,overwrite,merge,fields) {
        // output selected tiddlers and gather list of titles (for use with merge)
        var out=[]; var titles=[];
        var url=store.getTiddlerText('SiteUrl','');
        for (var i=0; i<tids.length; i++) {
            out.push(this.formatItem(store,filetype,tids[i],url,fields));
            titles.push(tids[i].title);
        }
        // if TW or PureStore format, ask to merge with existing tiddlers (if any)
        if (filetype==this.type_TW || filetype==this.type_PS) {
            if (overwrite) return out; // skip merge... forced overwrite
            var txt=loadFile(target);
            if (txt && txt.length) {
                var remoteStore=new TiddlyWiki();
                if (version.major+version.minor*.1+version.revision*.01<2.52) txt=convertUTF8ToUnicode(txt);
                if (remoteStore.importTiddlyWiki(txt) && (merge||confirm(this.mergeprompt.format([target])))) {
                    var existing=remoteStore.getTiddlers('title');
                    for (var i=0; i<existing.length; i++)
                        if (!titles.contains(existing[i].title))
                            out.push(this.formatItem(remoteStore,filetype,existing[i],url));
                    if (!quiet) displayMessage(this.mergestatus.format([tids.length,out.length-tids.length]));
                }
            }
        }
        return out;
    },
    formatItem: function(s,f,t,u,fields) {
        if (f==this.type_TW)
            var r=s.getSaver().externalizeTiddler(s,t);
        if (f==this.type_PS)
            var r=this.pureStoreTiddler.format([t.title,s.getSaver().externalizeTiddler(s,t)]);
        if (f==this.type_NF)
            var r=this.newsFeedTiddler.format([t.saveToRss(u)]);
        if (f==this.type_TX)
            var r=this.plainTextTiddler.format([t.title, t.created.toLocaleString(), t.modified.toLocaleString(),
                t.modifier, String.encodeTiddlyLinkList(t.tags), t.text]);
        if (f==this.type_CS) {
            function toCSV(t) { return '"'+t.replace(/"/g,'""')+'"'; } // always encode CSV
            var out=[ toCSV(t.title), toCSV(t.created.toLocaleString()), toCSV(t.modified.toLocaleString()),
                toCSV(t.modifier), toCSV(String.encodeTiddlyLinkList(t.tags)), toCSV(t.text) ];
            for (var f in fields) out.push(toCSV(t.fields[f]||''));
            var r=out.join(',');
        }
        return r||'';
    }
};
//}}}
//{{{
// automatically add saveAs to backstage
config.tasks.saveAs = {
    text: 'saveAs',
    tooltip: config.macros.saveAs.prompt,
    action: function(){ clearMessage(); config.macros.saveAs.go(); }
}
config.backstageTasks.splice(config.backstageTasks.indexOf('save')+1,0,'saveAs');
//}}}
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{

    saveCloseTiddler: {
        text: 'done/close',
        tooltip: 'Save changes to this tiddler and close it',
        handler: function(ev,src,title) {
            var closeTitle = title;
            var newTitle = story.saveTiddler(title,ev.shiftKey);
            if (newTitle)
                closeTitle = newTitle;
            return config.commands.closeTiddler.handler(ev,src,closeTitle);
        }
    },

    cancelCloseTiddler: {
        text: 'cancel/close',
        tooltip: 'Undo changes to this tiddler and close it',
        handler: function(ev,src,title) {
            // the same as closeTiddler now actually
            return config.commands.closeTiddler.handler(ev,src,title);
        }
    }

});

//}}}
Year 25

I am very anxious about T's views on our health and medical insurance.  She believes we must take every measure to avoid participating in "obamacare" and she anticipates a sort of martyrdom whereby we avoid any subsidies, run ourselves out of money, and then run her out of medications and other care.  Although we're part of a big community that abhors the AHA, I don't know anyone advocating this approach.  I have no way of persuading her out of this view and trying makes me instantly The Dog.  

This is taking an emotional toll on me, and many other matters as well that relate to ASD.  
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.5|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Options|##Configuration|
|Description|extend core search function with additional user-configurable options|
Adds extra options to core search function including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddlers'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
Search in:
<<option chkSearchTitles>> titles <<option chkSearchText>> text <<option chkSearchTags>> tags <<option chkSearchFields>> fields <<option chkSearchShadows>> shadows
<<option chkSearchHighlight>> Highlight matching text in displayed tiddlers
<<option chkSearchList>> Show list of matches
<<option chkSearchListTiddler>> Write list to [[SearchResults]] tiddler
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by modification date (most recent first)
<<option chkIncrementalSearch>> Incremental key-by-key search: {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters,  {{threechar{<<option txtIncrementalSearchDelay>>}}} msec delay
<<option chkSearchOpenTiddlers>> Search only in tiddlers that are currently displayed
<<option chkSearchExcludeTags>> Exclude tiddlers tagged with: <<option txtSearchExcludeTags>>
<<<
!!!!!Revisions
<<<
2009.01.16 [3.0.5] added chkSearchOpenTiddlers option to limit searches to displayed tiddlers only
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 [1.0.0] Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.SearchOptionsPlugin= {major: 3, minor: 0, revision: 5, date: new Date(2009,1,16)};

var co=config.options; // abbrev
if (co.chkSearchTitles===undefined) co.chkSearchTitles=true;
if (co.chkSearchText===undefined) co.chkSearchText=true;
if (co.chkSearchTags===undefined) co.chkSearchTags=true;
if (co.chkSearchFields===undefined) co.chkSearchFields=true;
if (co.chkSearchTitlesFirst===undefined) co.chkSearchTitlesFirst=true;
if (co.chkSearchList===undefined) co.chkSearchList=true;
if (co.chkSearchHighlight===undefined) co.chkSearchHighlight=true;
if (co.chkSearchListTiddler===undefined) co.chkSearchListTiddler=false;
if (co.chkSearchByDate===undefined) co.chkSearchByDate=false;
if (co.chkIncrementalSearch===undefined) co.chkIncrementalSearch=true;
if (co.chkSearchShadows===undefined) co.chkSearchShadows=true;
if (co.txtIncrementalSearchDelay===undefined) co.txtIncrementalSearchDelay=500;
if (co.txtIncrementalSearchMin===undefined) co.txtIncrementalSearchMin=3;
if (co.chkSearchOpenTiddlers===undefined) co.chkSearchOpenTiddlers=false;
if (co.chkSearchExcludeTags===undefined) co.chkSearchExcludeTags=true;
if (co.txtSearchExcludeTags===undefined) co.txtSearchExcludeTags="excludeSearch";
if (config.macros.search.reportTitle==undefined)
    config.macros.search.reportTitle="SearchResults"; // note: not a cookie!
config.macros.search.label+="\xa0"; // a little bit of space just because it looks better
//}}}
// // searchLink: {{{[search[text to find]] OR [search[text to display|text to find]]}}}
//{{{
config.formatters.push( {
    name: "searchLink",
    match: "\\[search\\[",
    lookaheadRegExp: /\[search\[(.*?)(?:\|(.*?))?\]\]/mg,
    prompt: "search for: '%0'",
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
            var label=lookaheadMatch[1];
            var text=lookaheadMatch[2]||label;
            var prompt=this.prompt.format([text]);
            var btn=createTiddlyButton(w.output,label,prompt,
                function(){story.search(this.getAttribute("searchText"))},"searchLink");
            btn.setAttribute("searchText",text);
            w.nextMatch = this.lookaheadRegExp.lastIndex;
        }
    }
});
//}}}
// // incremental search uses option settings instead of hard-coded delay and minimum input values
//{{{
var fn=config.macros.search.onKeyPress;
fn=fn.toString().replace(/500/g, "config.options.txtIncrementalSearchDelay||500");
fn=fn.toString().replace(/> 2/g, ">=(config.options.txtIncrementalSearchMin||3)");
eval("config.macros.search.onKeyPress="+fn);
//}}}
// // REPLACE story.search() for option to "show search results in a list"
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
    var co=config.options; // abbrev
    var re=new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
    if (config.options.chkSearchHighlight) highlightHack=re;
    var matches = store.search(re,co.chkSearchByDate?"modified":"title","");
    if (co.chkSearchByDate) matches=matches.reverse(); // most recent first
    var q = useRegExp ? "/" : "'";
    clearMessage();
    if (!matches.length) {
        if (co.chkSearchListTiddler) discardSearchResults();
        displayMessage(config.macros.search.failureMsg.format([q+text+q]));
    } else {
        if (co.chkSearchList||co.chkSearchListTiddler)
            reportSearchResults(text,matches);
        else {
            var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
            this.closeAllTiddlers(); story.displayTiddlers(null,titles);
            displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
        }
    }
    highlightHack = null;
}
//}}}
// // REPLACE store.search() for enhanced searching/sorting options
//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
    var co=config.options; // abbrev
    var tids = this.reverseLookup("tags",excludeTag,false,sortField);
    var opened=[]; story.forEachTiddler(function(tid,elem){opened.push(tid);});

    // eliminate tiddlers tagged with excluded tags
    if (co.chkSearchExcludeTags&&co.txtSearchExcludeTags.length) {
        var ex=co.txtSearchExcludeTags.readBracketedList();
        var temp=[]; for(var t=tids.length-1; t>=0; t--)
            if (!tids[t].tags.containsAny(ex)) temp.push(tids[t]);
        tids=temp;
    }

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

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

    return results;
}
//}}}
// // HIJACK core {{{<<search>>}}} macro to add "report" and "simple inline" output
//{{{
config.macros.search.SOP_handler=config.macros.search.handler;
config.macros.search.handler = function(place,macroName,params)
{
    // if "report", use SearchOptionsPlugin report generator for inline output
    if (params[1]&&params[1].substr(0,6)=="report") {
        var keyword=params[0];
        var options=params[1].split("=")[1]; // split "report=option+option+..."
        var heading=params[2]?params[2].unescapeLineBreaks():"";
        var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
        if (matches.length) wikify(heading+window.formatSearchResults(keyword,matches,options),place);
    } else if (params[1]) {
        var keyword=params[0];
        var heading=params[1]?params[1].unescapeLineBreaks():"";
        var seperator=params[2]?params[2].unescapeLineBreaks():", ";
        var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
        if (matches.length) {
            var out=[];
            for (var m=0; m<matches.length; m++) out.push("[["+matches[m].title+"]]");
            wikify(heading+out.join(seperator),place);
        }
    } else
        config.macros.search.SOP_handler.apply(this,arguments);
};
//}}}
// // SearchResults panel handling
//{{{
setStylesheet(".searchResults { padding:1em 1em 0 1em; }","searchResults"); // matches std tiddler padding

config.macros.search.createPanel=function(text,matches,body) {

    function getByClass(e,c) { var d=e.getElementsByTagName("div");
        for (var i=0;i<d.length;i++) if (hasClass(d[i],c)) return d[i]; }
    var panel=createTiddlyElement(null,"div","searchPanel","searchPanel");
    this.renderPanel(panel,text,matches,body);
    var oldpanel=document.getElementById("searchPanel");
    if (!oldpanel) { // insert new panel just above tiddlers
        var da=document.getElementById("displayArea");
        da.insertBefore(panel,da.firstChild);
    } else { // if panel exists
        var oldwrap=getByClass(oldpanel,"searchResults");
        var newwrap=getByClass(panel,"searchResults");
        // if no prior content, just insert new content
        if (!oldwrap) oldpanel.insertBefore(newwrap,null);
        else {  // swap search results content but leave containing panel intact
            oldwrap.style.display='block'; // unfold wrapper if needed
            var i=oldwrap.getElementsByTagName("input")[0]; // get input field
            if (i) { var pos=this.getCursorPos(i); i.onblur=null; } // get cursor pos, ignore blur
            oldpanel.replaceChild(newwrap,oldwrap);
            panel=oldpanel; // use existing panel
        }
    }
    this.showPanel(true,pos);
    return panel;
}

config.macros.search.renderPanel=function(panel,text,matches,body) {

    var wrap=createTiddlyElement(panel,"div",null,"searchResults");
    wrap.onmouseover = function(e){ addClass(this,"selected"); }
    wrap.onmouseout = function(e){ removeClass(this,"selected"); }
    // create toolbar: "open all", "fold/unfold", "close"
    var tb=createTiddlyElement(wrap,"div",null,"toolbar");
    var b=createTiddlyButton(tb, "open all", "open all matching tiddlers", function() {
        story.displayTiddlers(null,this.getAttribute("list").readBracketedList()); return false; },"button");
    var list=""; for(var t=0;t<matches.length;t++) list+='[['+matches[t].title+']] ';
    b.setAttribute("list",list);
    var b=createTiddlyButton(tb, "fold", "toggle display of search results", function() {
        config.macros.search.foldPanel(this); return false; },"button");
    var b=createTiddlyButton(tb, "close", "dismiss search results", function() {
        config.macros.search.showPanel(false); return false; },"button");
    createTiddlyText(createTiddlyElement(wrap,"div",null,"title"),"Search for: "+text); // title
    wikify(body,createTiddlyElement(wrap,"div",null,"viewer")); // report
    return panel;
}

config.macros.search.showPanel=function(show,pos) {
    var panel=document.getElementById("searchPanel");
    var i=panel.getElementsByTagName("input")[0];
    i.onfocus=show?function(){config.macros.search.stayFocused(true);}:null;
    i.onblur=show?function(){config.macros.search.stayFocused(false);}:null;
    if (show && panel.style.display=="block") { // if shown, grab focus, restore cursor
        if (i&&this.stayFocused()) { i.focus(); this.setCursorPos(i,pos); }
        return;
    }
    if(!config.options.chkAnimate) {
        panel.style.display=show?"block":"none";
        if (!show) { removeChildren(panel); config.macros.search.stayFocused(false); }
    } else {
        var s=new Slider(panel,show,false,show?"none":"children");
        s.callback=function(e,p){e.style.overflow="visible";}
        anim.startAnimating(s);
    }
    return panel;
}

config.macros.search.foldPanel=function(button) {
    var d=document.getElementById("searchPanel").getElementsByTagName("div");
    for (var i=0;i<d.length;i++) if (hasClass(d[i],"viewer")) var v=d[i]; if (!v) return;
    var show=v.style.display=="none";
    if(!config.options.chkAnimate)
        v.style.display=show?"block":"none";
    else {
        var s=new Slider(v,show,false,"none");
        s.callback=function(e,p){e.style.overflow="visible";}
        anim.startAnimating(s);
    }
    button.innerHTML=show?"fold":"unfold";
    return false;
}

config.macros.search.stayFocused=function(keep) { // TRUE/FALSE=set value, no args=get value
    if (keep===undefined) return this.keepReportInFocus;
    this.keepReportInFocus=keep;
    return keep
}

config.macros.search.getCursorPos=function(i) {
    var s=0; var e=0; if (!i) return { start:s, end:e };
    try {
        if (i.setSelectionRange) // FF
            { s=i.selectionStart; e=i.selectionEnd; }
        if (document.selection && document.selection.createRange) { // IE
            var r=document.selection.createRange().duplicate();
            var len=r.text.length; s=0-r.moveStart('character',-100000); e=s+len;
        }
    }catch(e){};
    return { start:s, end:e };
}
config.macros.search.setCursorPos=function(i,pos) {
    if (!i||!pos) return; var s=pos.start; var e=pos.end;
    if (i.setSelectionRange) //FF
        i.setSelectionRange(s,e);
    if (i.createTextRange) // IE
        { var r=i.createTextRange(); r.collapse(true); r.moveStart("character",s); r.select(); }
}
//}}}
// // SearchResults report generation
// note: these functions are defined globally, so they can be more easily redefined to customize report formats//
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
    var cms=config.macros.search; // abbrev
    var body=window.formatSearchResults(text,matches);
    if (!config.options.chkSearchListTiddler) // show #searchResults panel
        window.scrollTo(0,ensureVisible(cms.createPanel(text,matches,body)));
    else { // write [[SearchResults]] tiddler
        var title=cms.reportTitle;
        var who=config.options.txtUserName;
        var when=new Date();
        var tags="excludeLists excludeSearch temporary";
        var tid=store.getTiddler(title); if (!tid) tid=new Tiddler();
        tid.set(title,body,who,when,tags);
        store.addTiddler(tid);
        story.closeTiddler(title);
        story.displayTiddler(null,title);
    }
}

if (!window.formatSearchResults) window.formatSearchResults=function(text,matches,opt)
{
    var body='';
    var title=config.macros.search.reportTitle
    var q = config.options.chkRegExpSearch ? "/" : "'";
    if (!opt) var opt="all";
    var parts=opt.split("+");
    for (var i=0; i<parts.length; i++) { var p=parts[i].toLowerCase();
        if (p=="again"||p=="all")   body+=window.formatSearchResults_again(text,matches);
        if (p=="summary"||p=="all") body+=window.formatSearchResults_summary(text,matches);
        if (p=="list"||p=="all")    body+=window.formatSearchResults_list(text,matches);
        if (p=="buttons"||p=="all") body+=window.formatSearchResults_buttons(text,matches);
    }
    return body;
}

if (!window.formatSearchResults_again) window.formatSearchResults_again=function(text,matches)
{
    var title=config.macros.search.reportTitle
    var body='';
    // search again
    body+='{{span{<<search "'+text.replace(/"/g,'&#x22;')+'">> /%\n';
    body+='%/<html><input type="button" value="search again"';
    body+=' onclick="var t=this.parentNode.parentNode.getElementsByTagName(\'input\')[0];';
    body+=' config.macros.search.doSearch(t); return false;">';
    body+=' <a href="javascript:;" onclick="';
    body+=' var e=this.parentNode.nextSibling;';
    body+=' var show=e.style.display!=\'block\';';
    body+=' if(!config.options.chkAnimate) e.style.display=show?\'block\':\'none\';';
    body+=' else anim.startAnimating(new Slider(e,show,false,\'none\'));';
    body+=' return false;">options...</a>';
    body+='</html>@@display:none;border-left:1px dotted;margin-left:1em;padding:0;padding-left:.5em;font-size:90%;/%\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>>sorted by date\n';
    body+=' <<option chkSearchHighlight>> highlight matching text in displayed tiddlers\n';
    body+=' <<option chkIncrementalSearch>>incremental key-by-key search: /%\n';
    body+=' %/{{twochar{<<option txtIncrementalSearchMin>>}}} or more characters, /%\n';
    body+=' %/{{threechar{<<option txtIncrementalSearchDelay>>}}} msec delay\n';
    body+=' <<option chkSearchOpenTiddlers>> search only in tiddlers that are currently displayed\n';
    body+=' <<option chkSearchExcludeTags>>exclude tiddlers tagged with:\n';
    body+=' {{editor{<<option txtSearchExcludeTags>>}}}/%\n';
    body+='%/@@}}}\n\n';
    return body;
}

if (!window.formatSearchResults_summary) window.formatSearchResults_summary=function(text,matches)
{
    // summary: nn tiddlers found matching '...', options used
    var body='';
    var co=config.options; // abbrev
    var title=config.macros.search.reportTitle
    var q = co.chkRegExpSearch ? "/" : "'";
    body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
    var opts=[];
    if (co.chkSearchTitles) opts.push("titles");
    if (co.chkSearchText) opts.push("text");
    if (co.chkSearchTags) opts.push("tags");
    if (co.chkSearchFields) opts.push("fields");
    if (co.chkSearchShadows) opts.push("shadows");
    if (co.chkSearchOpenTiddlers) body+="^^//search limited to displayed tiddlers only//^^\n";
    body+="~~&nbsp; searched in "+opts.join(" + ")+"~~\n";
    body+=(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"^^&nbsp; using ":"")
        +(co.chkCaseSensitiveSearch?"case-sensitive ":"")
        +(co.chkRegExpSearch?"pattern ":"")
        +(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"matching^^\n":"");
    return body;
}

if (!window.formatSearchResults_list) window.formatSearchResults_list=function(text,matches)
{
    // bullet list of links to matching tiddlers
    var body='';
    var pattern=co.chkRegExpSearch?text:text.escapeRegExp();
    var sensitive=co.chkCaseSensitiveSearch?"mg":"img";
    var link='{{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="'
        +'if(config.options.chkSearchHighlight)'
        +'  highlightHack=new RegExp(\x27'+pattern+'\x27,\x27'+sensitive+'\x27);'
        +'story.displayTiddler(null,\x27%0\x27);'
        +'highlightHack = null; return false;'
        +'" title="%2">%1</a></html>}}}';
    for(var t=0;t<matches.length;t++) {
        body+="* ";
        if (config.options.chkSearchByDate)
            body+=matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" ";
        var title=matches[t].title;
        var fixup=title.replace(/'/g,"\\x27").replace(/"/g,"\\x22");
        var tid=store.getTiddler(title);
        var tip=tid?tid.getSubtitle():''; tip=tip.replace(/"/g,"&quot;");
        body+=link.format([fixup,title,tip])+'\n';
    }
    return body;
}

if (!window.formatSearchResults_buttons) window.formatSearchResults_buttons=function(text,matches)
{
    // embed buttons only if writing SearchResults to tiddler
    if (!config.options.chkSearchListTiddler) return "";
    // "open all" button
    var title=config.macros.search.reportTitle;
    var body="";
    body+="@@diplay:block;<html><input type=\"button\" href=\"javascript:;\" "
        +"onclick=\"story.displayTiddlers(null,[";
    for(var t=0;t<matches.length;t++)
        body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
    body+="],1);\" accesskey=\"O\" value=\"open all matching tiddlers\"></html> ";
    // "discard SearchResults" button
    body+="<html><input type=\"button\" href=\"javascript:;\" "
        +"onclick=\"discardSearchResults()\" value=\"discard "+title+"\"></html>";
    body+="@@\n";
    return body;
}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
    // remove the tiddler
    story.closeTiddler(config.macros.search.reportTitle);
    store.deleteTiddler(config.macros.search.reportTitle);
    store.notify(config.macros.search.reportTitle,true);
}
//}}}
Year 24

[[Perfectionism]] is trying to speak to you with consistent strident tones, Steve says you should response to perfectionism advice by thanking it.  Thank you for that insight, you should say, and take a moment to acknowledge all the ways perfectionism has helped you, particularly in saving your life.  Then you can explain that right now perfectionism is not offering the best approach for the situation and you would like to consider other options.  

This reminds me of Rick Reynolds and his advice for dealing with obsessive compulsive thoughts, which is to ignore your brain when it wants to act as an independent agent, full of well-intended chatter, yet which sanity and health require you to disobey.  
Steve explained that he likes to hear each person talk, one at a time, so one person may have a while talking and then the other person.  He asked if we have had counseling before.  T said yes, and so it was her turn to talk, and she described counseling from the fitful starts as far back as college, all the way up through Marilyn Ross.  I filled in a bit to mention Shawn Langford.  I prompted her after she seems to be finished to talk about Maryland's conclusion of Asperger's disorder or autism spectrum disorder.  T then made a kind of it due to her, I think, and talked about her pain is pain and pain during intercourse.  She talked about the remedies, and made some mention of EDS, and she sheds some tears describing how difficult this is.  I tried to throw it in a qualifying word that we do actually get to have good sex, but this went awkwardly, and T was unhappy with me.

Then I suppose Steve directed the talking role to me and asked me to explain what the issues were that were indicating counseling at this time.  So I explained about caregiver stress and burnout, and role strain – that took a bit of extra explanation – and I talked about my session over the phone with Judy Bruce yesterday, and her conclusion that I, Scott, am the one who really needs the support, and why this was true – T's own condition is what it is, and is not so amenable to change through counseling; and I have a big need for support, and T needs me to be well supported so that we can continue to function as a marriage, and so that she can have support; and that I am in a good position to receive coaching and support, to benefit from counseling.

And I explained several other things.  I explained that my emotions have been repressed for a long time.  I gave my word picture that I have given to quite a few people, saying that my emotions have been like a chemical reaction that is in stasis, and a drop of catalyst causes the reaction to start: and the new information from Tony Attwood and Katrine Bensley is this catalyst, so that's in the past I've been subject to unmanageable stresses that I could not name or was not willing to try to describe, but now all of these trials and challenges have names – they have handles on them.  The result is my emotions are running over.  Names like these, I said, and gave Steve a blank version of the handful of pebbles worksheet.  Oh, and this is the name of your book or whatever, he said, gesturing to that title; and I said yes, and was tickled because I don't think I've told him that it's in my heart to write a book.  Maybe I have, but I don't think so he went over the worksheet quickly and understood all of the terms; I think there was one term we had to clarify, I'm not sure which one.  Then I said so what I'm doing now is reaching for the sheep.  The plug-in things that we bump into and I can plug-in all the components of autism spectrum disorder under this worksheet.  Also at this time.  I explained the significance of the phrase handful of pebbles.  So I gave him one of the few worksheet I have filled out, which was about walking the dog and the dog going into the street.  And I explained that, for example, under trauma.  I know that T has had the terrible childhood trauma with the dog in the street.  And – but here T interrupted.

It was the second or third time she had interrupted, and I said, please let me just tell my story.  Things had been developing at this point, and I can't remember the precise sequence.  But the rest of the session was largely centered on Steve confronting T with her interruption and the need behind its, which was to make sure that I was reminded and Steve was informed that there was not one childhood trauma relating to the dog in the street, but too.  Well, Steve apprehended this very quickly and he with amazing speed and recognition began to direct T to the idea that her needs were not necessarily central, and that her proclivity to rush in with this correction was not a sign of personal health or relational freedom.

I thought that Steve would be good, and the next few minutes were like watching a kung fu sequence.  He let T know that this tendency to interrupt and correct was not helpful to me, and had the potential to embarrass me, and was not helpful to him as a counselor; and that my needs were real, and that it did not matter at all, for purposes of this part of the session, whether there was one or two traumatic episodes in her childhood.  This was very hard for T to contain.

But Steve went on, and pointed out that if he needed to know more about the trauma, then he could ask her; and, that T could work on clarifying the problem with my recollection I do later time, at the end of the session, or perhaps during the next session; and that I had already been seeking to assert my own speaking.  Space free from interruption, which she had not been respecting, while been fully respectful Probert herd – holding your hand, not interrupting, being a gentleman and a supportive husband.

The most critical 10 minutes of the session consisted of Steve working to persuade T that she does have control over her responses and her emotions, and that she should take control.  He tried to coach her on perfectionism, which he called by name at least 10 times; and he exhorted her to always deal with perfectionism, first by thanking its – that is a new thought – and then, by explaining that she would like perfectionism to back down and be quiet so that she can talk with her husband.  And he talked about rest, and how she must enter into rest, and cannot do this while perfectionism is in the four.

He took a break during this time to ask if she was handling his somewhat provocative approach.  All right, she said.  It looked to me like she wasn't, and I gave her a muted encouragement to go ahead and say so, but she did not wish to make to greater protest later.  Later, she said it was hard to know how to respond to that – if she said it was too directive, maybe that was the end of the session and the end of the help.  I can certainly identify with this uncertainty.  However, I explained to T.  More than once that I think the best thing was to take Steve at his word and see what happened.

At some point there was a knock on the door and he was told that his next appointment had been waiting for some time.  It seems clear that this was not the way things usually go, so Steve made a somewhat curtailed and to our appointment and out.  We went. 
Aftermath of Meeting with Steve Cervantes (Initial)

T was pretty shattered, and I was privately elated, but with a sense of foreboding – this cannot last, this is not something T will put up with.  And, the defensiveness and case building began.

He was very direct with T, and she has been settling into case building mode since we laft Steve's office.  Steve doesn't seem to understand autism spectrum disorder.  He did not seem to have heard key did not seem to have heard of Tony Atwood.  He has a colleague specializes in autism; maybe that is the person that T needs.  Maybe Steve never talks with that colleague.

Steve berated her.  She says.  She was not allowed to interrupt, but no one checks me on interrupting her.  Ever.  I reminded her about Suzanne able.

I heard her converting the tone of voice used by Steve at one point or me at one point into the stern, brusque version that she uses when her perceptions are distorted.

"Steve didn't set down the rules.  If the rules were no interrupting, he should have said so."  No, I protested: Steve did not set a trap for you.  "He should have said what the rules were.  Instead, he berated me."  No, I said that he intervened when she had been when she had shown that the pattern of interrupting me, and after I had made a protest myself.  At that time, he pointed out to her that I had made a protest.  "He used a berating tone of voice."  No, he did not!  And he simply pointed out things that are true.

She has made other insinuations or allegations; the last one was that I should not have brought up the trauma from her childhood about a dog in the street.  So I apologize.  But first I pointed out that I alluded to it.  So she asserted with some of the Hammonds that you can't just allude to something with Asperger's. 

And Aspies don't understand about interrupting.

''Next night:'' T and I talked for an hour last night.  It was very difficult.  She went over her long and growing list of objections to me and Steve Cervantes, and she through lots of virtually all at me, brought up many old behaviors, examples of my own recalcitrance and cruelty – a few of which certainly don't exist, and most of which are very old news, often decades.

She won't be content, unless she can say all the things she wants at the depth and speed that she demands, which means a great deal of wasted time.  It will be interesting to see how Steve handles that.  T beat me down, and kicked me a lot.  And then I woke up this morning and thought, what about all of these unmanageable patterns of behavior that make T so difficult to deal with?  Isn't one of the points of the counseling to get to those, for me?

T envisions herself in several different lights; very often.  She is this virtuous person who has been abandoned, betrayed, and let down by everyone around her.  She prayed and trusted God, and look what happens?  How often I hear that.  And what happened is so distressing – her daughter is gay, her son gets bad grades, and her husband uses porn!  And this is even though she prayed!  How I hear this over and over.

I have many despairing thoughts, and it's hard to know how to make it to the session next Tuesday, much less have a purported anniversary date tomorrow night.

I left a note for T yesterday saying I wanted to work on her so-called quiet space, but all I got in return was a bunch of condemnation about how I have failed to attend to it up till now.
''This has many dimensions.''
* [[Moral-scrupulosity]]
* [[Self-justification]]
* [[Danger-of-social-censure]]
* [[Social-shame]]
/***
|''Name''|SharedTiddlersPlugin|
|''Version''|2.3.0|
|''Type''|plugin|
|''~CoreVersion''|2.2.6|
|''Requires''|UpToDateFiltersPlugin|
|''Requirements note''|[[UpToDateFiltersPlugin|http://yakovl.bplaced.net/TW/ExtraFilters.html#UpToDateFiltersPlugin]] is necessary only for TW below v2.6.2; later it will be moved to a separate repository|
|''Description''|Introduces a possibility to use tiddlers from other ~TiddlyWikis (with or without importing them)|
|''Documentation''|http://yakovl.bplaced.net/TW/STP/STP.html#SharedTiddlersPluginInfo|
|''Source''|http://yakovl.bplaced.net/TW/STP/STP.html#SharedTiddlersPlugin|
|''Author''|Yakov Litvin|
|''Forked from''|[[IncludePlugin|http://tiddlywiki.abego-software.de/#IncludePlugin]], by Udo Borkowski|
|''Contact''|see [[docs|SharedTiddlersPluginInfo]]|
|''Copyright''|Yakov Litvin, 2012|
|''Licence''|[[BSD-like open source license|http://yakovl.bplaced.net/TW/STP/STP.html#%5B%5BYakov%20Litvin%20Public%20Licence%5D%5D]] |
|>| In this tiddler, the code is minified and hidden; the full code can be found [[here|http://yakovl.bplaced.net/TW/STP/STP.html#SharedTiddlersPluginCode]]. |
''Config:''
***/
//{{{
config.options.STP_hijackPrettyLink = true;
config.options.STP_hijackImageFormatter = true;
//}}}
// /%
config.filters.all=function(g,n){if("with included"==n[3]){var h,u=this.reverseLookup();for(h=0;h<u.length;h++)g.pushUnique(u[h])}else this.forEachTiddler(function(h,n){g.pushUnique(n)});return g};config.filters.includedFrom=function(g,n){for(var h=0;h<g.length;h++)g[h].getIncludeURL()!=n[3]&&g.splice(h,1);return g};config.filters.internal=function(g){for(var n=0;n<g.length;n++)g[n].getIncludeURL()&&g.splice(n,1);return g};
(function(){function g(){var a={},b={},c=function(a){return{subs:a,warned:!1}};this.init=function(){void 0==config.options.chkWarnOnSharedTiddlersConflicts&&(config.options.chkWarnOnSharedTiddlersConflicts=!0);void 0==config.options.chkAlertOnSharedTiddlersConflicts&&(config.options.chkAlertOnSharedTiddlersConflicts=!1)};this.checkNew=function(d,l,f,e){var j=store.fetchTiddler(d);if(null!=j&&j.getIncludeURL()!=l){j=p.getSubsUrl(d)?!0:!1;if(f==j)if(a[d])void 0==a[d][l]&&(a[d][l]=c(f));else if(f)a[d]=
{},a[d][l]=c(f),a[d][p.getSubsUrl(d)]=c(f);else{var g=z(function(a,b){return a.fetchTiddler(d)?b:null});g?(a[d]={},a[d][l]=c(f),a[d][g]=c(f)):window.sharedTiddlersAPI.orig_fetchTiddler(d)&&(a[d]={},a[d][l]=c(f),a[d]["main store"]=c(!1))}f&&(!j&&a[d])&&delete a[d];j=p.getSubsShUrl(d);e&&j&&(e=p.containSubsUrl(d,j),f==e&&(b[d]?void 0==b[d][l]&&(b[d][l]=c(f)):(b[d]={},b[d][l]=c(f),b[d][j]=c(f))),f&&(!e&&b[d])&&delete b[d])}};var e=function(a,b){var c="",e=function(a){c+="\n"+a;b&&v(a)},j;for(tName in a){j=
!1;e("* "+tName+" in:");for(tUrl in a[tName])e("** "+tUrl),a[tName][tUrl].subs&&(j=!0);j&&e("  (with the subsitute priority)")}return c};this.notify=function(){var d=config.options.chkWarnOnSharedTiddlersConflicts,c=config.options.chkAlertOnSharedTiddlersConflicts;if(c||d){var f,m,j={},g=!1;for(f in a)for(m in a[f])!1==a[f][m].warned&&(g=!0,null==j[f]&&(j[f]={}),j[f][m]={subs:a[f][m].subs},a[f][m].warned=!0);var k={},h=!1;for(f in b)for(m in b[f])!1==b[f][m].warned&&(h=!0,null==k[f]&&(k[f]={}),k[f][m]=
{subs:b[f][m].subs},b[f][m].warned=!0);f="";g&&(f+="New conflicts:",d&&v(f),f+=e(j,d));h&&(f&&(f+="\n"),f+="New conflicts between those competing for substituting shadows:",d&&v("New conflicts between those competing for substituting shadows:"),f+=e(j,d));c&&f&&alert(f)}}}function n(){var a={};this.add=function(b,c,e,d){if(e||d)void 0==a[b]&&(a[b]={urlsSubs:[],urlsSubsSh:[]}),e&&a[b].urlsSubs.pushUnique(c),d&&a[b].urlsSubsSh.pushUnique(c)};this.getSubsUrl=function(b){b=a[b];return null==b||0==b.urlsSubs.length?
null:b.urlsSubs[0]};this.getSubsShUrl=function(b){b=a[b];if(null==b||0==b.urlsSubsSh.length)return null;var c,e;for(c=0;c<b.urlsSubs.length;c++)for(e=0;c<b.urlsSubsSh.length;e++)if(b.urlsSubs[c]==b.urlsSubsSh[e])return b.urlsSubs[c];return b.urlsSubsSh[0]};this.containSubsUrl=function(b,c){var e=a[b];return null==e?!1:e.urlsSubs.contains(c)};this.getPrefs=function(b){return a[b]}}function h(){var a={};this.isUsed=function(b){return a[b]?!0:!1};this.setUsed=function(b){a[b]=1}}function u(){var a={},
b={},c={},e;this.setSelfNodeName=function(a){e=a};this.getSelfNodeName=function(){return e};this.setNodeDesc=function(b,c){this.getNodeDesc(b)?this.addConflict(b,c):a[b]=c;this.callWaitingTasks(b)};this.getNodeDesc=function(b){return a[b]};this.deleteNodeDesc=function(b){a[b]=null};this.getNodeUrl=function(a){return(a=this.getNodeDesc(a))?a.url:null};this.compareNodeDesc=function(a,b){return a.url==b.url?a:null};this.addConflict=function(a,c){var f=this.compareNodeDesc(c,this.getNodeDesc(a));f?(this.deleteNodeDesc(a),
this.setNodeDesc(a,f)):(b[a]?b[a].push(c):b[a]=[c],alert("Warning: more than one description of the "+a+" node was pushed. The earlier version is kept."))};this.setWaitingTask=function(a,b,f){b={action:b,self:f};c[a]?c[a].push(b):c[a]=[b];this.getNodeUrl(a)&&this.callWaitingTasks(a)};this.callWaitingTasks=function(a){var b=c[a];if(b)for(var f=0;f<b.length;f++)b[f].action.call(b[f].self);c[a]=null};this.addNodeDesc=function(a,b){this.setNodeDesc(a,{url:b})}}var v=function(a,b){displayMessage(a,b);
console.log(a)};window.abego||(window.abego={});if(abego.TiddlyWikiIncluder)alert("Warning: abego.TiddlyWikiIncluder already exists, so probably two copies of SharedTiddlersPlugin and/or IncludePlugin are installed and activated. It is highly recommended to deactivate all but one copy. You can find those by searching 'abego.TiddlyWikiIncluder'.");else{window.sharedTiddlersAPI={};var y=function(a){return-1<a.lastIndexOf("/")?a.substr(0,a.lastIndexOf("/")+1):""},F=function(a){0!=a.search(/^((http(s)?)|(file)):/)&&
(a=0==a.search(/^((.\:\\)|(\\\\)|(\/))/)?"file://"+a:y(document.location.toString())+a,a=a.replace(/\\/mg,"/"));return a},G=function(a){return 0!=a.search(/^(?:((http(s)?)|(file)):)|(.\:\\)|(\\\\)|(\/)/)},A,q=[],k={},B=[],s,C=[],t;conflicts=new g;conflicts.init();var p=new n,L=function(){var a=B;B=[];if(a.length)for(var b=0;b<C.length;b++)C[b](a)},w,H=function(){void 0!==s&&clearInterval(s);w=0;var a=function(){config.extensions.SharedTiddlersPlugin.sendProgress("","","Done")};s=setInterval(function(){w++;
10>=w||(clearInterval(s),s=void 0,config.extensions.SharedTiddlersPlugin.sendProgress("Refreshing...","",""),refreshDisplay(),setTimeout(a,0))},1)},z=function(a){for(var b,c=0;c<q.length;c++){var e=config.extensions.SharedTiddlersPlugin.getStore(q[c]);if(e&&(b=a(e,q[c])))return b}},I=function(){if(!window.store)return setTimeout(I,100);var a=store.fetchTiddler;window.sharedTiddlersAPI.orig_fetchTiddler=a;store.fetchTiddler=function(b){var c;if(c=p.getSubsUrl(b))return k[c].fetchTiddler(b);if(c=a.apply(this,
arguments))return c;if(void 0!==config.shadowTiddlers[b]){if(c=p.getSubsShUrl(b))return k[c].fetchTiddler(b)}else return b==config.macros.newTiddler.title?void 0:z(function(a){return a.fetchTiddler(b)})};q.length&&H()},J=function(){if(!window.store)return setTimeout(J,100);var a=store.getTiddlerText("IncludeList");a&&wikify(a,document.createElement("div"),void 0,store.fetchTiddler("IncludeList"))},D=function(a){return function(){var b=store.forEachTiddler;store.forEachTiddler=function(a){var e={},
d=function(b,d){if(!e[b]&&(!p.getSubsUrl(b)||p.getSubsUrl(b)==d.getIncludeURL()))e[b]=1,a.apply(this,arguments)};b.call(store,d);for(var l in config.shadowTiddlers)p.getSubsShUrl(l)||(e[l]=1);e[config.macros.newTiddler.title]=1;z(function(a){a.forEachTiddler(d)})};try{return a.apply(this,arguments)}finally{store.forEachTiddler=b}}},r=function(a,b){return a[b]=D(a[b])};config.extensions.SharedTiddlersPlugin={setProgressFunction:function(a){t=a},getProgressFunction:function(){return t},sendProgress:function(a,
b,c){t&&t.apply(this,arguments)},onError:function(a,b){v("Error when including '%0':\n%1".format([a,b]))},hasPendingIncludes:function(){for(var a=0;a<q.length;a++){var b=config.extensions.SharedTiddlersPlugin.getState(q[a]);if("waiting"==b||"loading"==b)return!0}return!1},getIncludes:function(){return q.slice()},getState:function(a){var b=k[a];return!b?"No include specified for %0".format([a]):"string"==typeof b?b:null},getStore:function(a){return(a=k[a])&&a instanceof TiddlyWiki?a:null},getFunctionUsingForReallyEachTiddler:D,
useForReallyEachTiddler:r,addListener:function(a){C.push(a)},importIncluded:function(a,b){b=void 0==b?1:parseInt(b);var c,e,d={tiddler:null},l=function(a){store.addTiddler(a);store.setDirty(!0);d.status=0;d.tiddler=a;d.from=f};if(a instanceof Tiddler)d.tiddler=window.sharedTiddlersAPI.orig_fetchTiddler(a.title),c=jQuery.extend(!0,new Tiddler,a);else return d.status=-1,d.errorText="not a Tiddler instance",d;var f;(f=c.getIncludeURL())&&c.deleteIncludeURL();switch(b){case 1:l(c);break;case 3:confirm(c.title+
" from "+f+" is availabe, import?")&&l(c);break;case 2:e=window.sharedTiddlersAPI.orig_fetchTiddler(c.title);(!e||e.modified<c.modified)&&l(c);break;case 4:e=window.sharedTiddlersAPI.orig_fetchTiddler(c.title);(!e||e.modified<c.modified)&&confirm("Up-to-date "+c.title+" from "+f+" is availabe, import?")&&l(c);break;default:d.status=-1,d.errorText="unknown import mode"}return d},importAndLog:function(a,b){var c=a.title,e=config.extensions.SharedTiddlersPlugin.importIncluded(a,b);switch(e.status){case 0:console.log("imported: "+
c+" from "+e.from);break;case -1:console.log("error importing "+c+": "+e.errorText)}}};window.sharedTiddlersAPI.forReallyEachTiddler=function(a){D(function(){store.forEachTiddler(a)}).call(store)};abego.TiddlyWikiIncluder={getIncludes:config.extensions.SharedTiddlersPlugin.getIncludes,getState:config.extensions.SharedTiddlersPlugin.getState,getStore:config.extensions.SharedTiddlersPlugin.getStore};window.sharedTiddlersAPI.getIncludes=config.extensions.SharedTiddlersPlugin.getIncludes;window.sharedTiddlersAPI.getState=
config.extensions.SharedTiddlersPlugin.getState;window.sharedTiddlersAPI.getStore=config.extensions.SharedTiddlersPlugin.getStore;window.sharedTiddlersAPI.importAndLog=config.extensions.SharedTiddlersPlugin.importAndLog;config.extensions.SharedTiddlersPlugin.include=function(a,b){void 0===A&&(A=void 0===config.options.chkUseInclude||config.options.chkUseInclude);if(A){var c=this,e=function(a){var d=function(b,d,f,g){void 0===b?(k[a]=g,c.onError(a,g)):(k[a]=b,k[a].orig_store=new TiddlyWiki,k[a].forEachTiddler(function(b,
c){c.setIncludeURL(a);k[a].orig_store.addTiddler(c)}),k[a].clear(),e())},e=function(){var c=b.substitute,d=b.substituteShadows,f=b.importMode;if(null===config.extensions.SharedTiddlersPlugin.getStore(a))return setTimeout(e,100);var g=k[a].orig_store.filterTiddlers(b.filterLine),j,h;for(j=0;j<g.length;j++)h=jQuery.extend(!0,new Tiddler,g[j]),k[a].orig_store.fetchTiddler(h.title)&&(f?config.extensions.SharedTiddlersPlugin.importAndLog(h,f):(conflicts.checkNew(h.title,a,c,d),k[a].addTiddler(h)),b.evalTiddlers&&
eval(h.text),b.wikifyTiddlers&&wikify(h.text,document.createElement("div"),void 0,h));if(!f&&(c||d))for(j=0;j<g.length;j++)p.add(g[j].title,a,c,d);conflicts.notify();store.slices={};b.noRefresh||(refreshAll(),story.refreshAllTiddlers());B.push(a);setTimeout(L,void 0)},j=function(){k[a]="loading";var b=t,c=function(c,d){b&&b(c,"stp_loadTiddlyWikiStore",d,a,null)},e=function(b){c("Error when loading %0".format([a]),"Failed");d(void 0,a,null,b);return b};c("Start loading %0".format([a]),"Started");var g=
a,j=function(b,g,j,h){if(void 0===b)e(h);else{c("Processing %0".format([a]),"Processing");try{var m=new TiddlyWiki,k=m.importTiddlyWiki(b)?null:"Problem with importing TiddlyWiki, probable reason is: "+"The file '%0' does not appear to be a valid TiddlyWiki file".format([a]);k?e(k):(c("Loaded %0".format([a]),"Done"),d(m,a,null))}catch(n){e(exceptionText(n))}}},g=F(g);var h=g,m=function(a,b,c,d){return a?j(c,d,b):j(void 0,d,b,"Error loading %0".format([d]))};if(2>version.major||2==version.major&&7>
version.minor){g={type:"GET",url:h,processData:!1,data:void 0,cache:!1,beforeSend:function(){},complete:function(a){var b;a:{try{b=!a.status&&"file:"===location.protocol||200<=a.status&&300>a.status||304===a.status||1223===a.status;break a}catch(c){}b=!1}b?m(!0,null,a.responseText,h,a):m(!1,null,null,h,a)}};try{window.Components&&(window.netscape&&window.netscape.security&&-1==document.location.protocol.indexOf("http"))&&window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead")}catch(n){}jQuery.ajax(g)}else httpReq("GET",
h,m,null)},g=!q.contains(a);g&&(q.push(a),k[a]="waiting");g?b.delayMilliSeconds?setTimeout(j,b.delayMilliSeconds):j():e()},d=/node: (.*)/.exec(a);d?d[1]!=twWeb.getSelfNodeName()&&twWeb.setWaitingTask(d[1],function(){var a=twWeb.getNodeUrl(d[1]);e(a)},this):e(a)}};config.extensions.SharedTiddlersPlugin.addListener(H);config.shadowTiddlers.AdvancedOptions+="\n~IncludePlugin settings:\n<<option chkUseInclude>> Include ~TiddlyWikis\n<<option chkAlertOnSharedTiddlersConflicts>> Alert on tiddler name conflicts\n<<option chkWarnOnSharedTiddlersConflicts>> Display messages and write log in the browser console on conflicts\nIncludeList | IncludeState | ImportIncluded | [[help|http://yakovl.bplaced.net/TW/SharedTiddlersPlugin.html/#SharedTiddlersPluginInfo]]\n^^(Reload this ~TiddlyWiki to make changes become effective)^^";
config.shadowTiddlers.IncludeState="<<includeState>>";config.shadowTiddlers.ImportIncluded='| the url of the document to import from | <<option txtStoreUrl>>               |\n|    the filter of tiddlers to import    | <<option txtFilterTiddlersToImport>> |\n|           the importing mode           | <<option txtImportMode>>             |\n<html><a href=\'javascript:;\' onclick=\'\n\tvar storeUrl = config.options.txtStoreUrl,\n\t    params = {\n\t\tfilterLine: config.options.txtFilterTiddlersToImport,\n\t\timportMode: config.options.txtImportMode,\n\t\tnoRefresh: true,\n\t};\n\tif(!storeUrl)\n\t\treturn displayMessage("please specify the url to import from");\n\tif(!params.filterLine)\n\t\treturn displayMessage("please specify the filter of tiddlers to import");\n\tif(!sharedTiddlersAPI.getStore(storeUrl))\n\t\tdisplayMessage("warning: no store was loaded from "+storeUrl+" previously, trying now");\n\tconfig.extensions.SharedTiddlersPlugin.include(storeUrl,params);\n\'>import (without saving)<a/></html>';
var E=function(a,b){a.style.display=b?"block":"none"};config.extensions.SharedTiddlersPlugin.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\nbackground-color:#FFCC00;\nposition:absolute;\nright:0.2em;\ntop:0.2em;\nwidth:7em;\npadding-left:0.2em;\npadding-right:0.2em\n}\n","stp_Include");var a=document.createElement("div");a.className="includeProgressState";a.style.display="none";document.body.appendChild(a);return function(b,c,e){"Done"==e||"Failed"==e?setTimeout(function(){E(a,
!1,1E3)},100):"stp_loadTiddlyWikiStore"==c?(w=0,"Processing"==e&&(removeChildren(a),createTiddlyText(a,"Including..."),E(a,!0,0))):(removeChildren(a),createTiddlyText(a,b),E(a,!0,0))}};config.extensions.SharedTiddlersPlugin.setProgressFunction(config.extensions.SharedTiddlersPlugin.getDefaultProgressFunction());config.macros.include=new h;config.macros.include.handler=function(a,b,c,e,d){b=e.source.substring(e.matchStart,e.nextMatch);pParams=d.parseParams("url",null,!0,!1,!0);!getFlag(pParams,"hide",
!1)&&!c.contains("hide")&&createTiddlyText(createTiddlyElement(a,"code"),b);if(!this.isUsed(b)){this.setUsed(b);a=pParams[0].url;c={delayMilliSeconds:parseInt(getParam(pParams,"delay","0")),filterLine:getParam(pParams,"filters","[all[-]]"),substitute:c.contains("substitute"),substituteShadows:c.contains("substituteShadows"),noRefresh:c.contains("noRefresh"),importMode:getParam(pParams,"import",void 0),evalTiddlers:c.contains("eval"),wikifyTiddlers:c.contains("wikify")};for(d=0;a&&d<a.length;d++)b=
a[d],"hide"==b||("substituteShadows"==b||"substitute"==b||"eval"==b||"wikify"==b||"noRefresh"==b)||config.extensions.SharedTiddlersPlugin.include(b,c)}};config.macros.includeState={};config.macros.includeState.handler=function(a){var b=function(){removeChildren(c);var a=wikify,d;d="";var g=config.extensions.SharedTiddlersPlugin.getIncludes();if(g.length){d+="|!Address|!State|\n";for(var f=0;f<g.length;f++){var h=g[f];d+="|{{{"+h+"}}}|";h=config.extensions.SharedTiddlersPlugin.getState(h);d+=h?"{{{"+
h+"}}}":"included";d+="|\n"}d+="|includeState|k\n"}else d="{{noIncludes{\nNo TiddlyWiki is included or including is disabled (see AdvancedOptions)\n}}}\n";a(d,c);config.extensions.SharedTiddlersPlugin.hasPendingIncludes()&&setTimeout(b,500)},c=createTiddlyElement(a,"div");setTimeout(b,0)};config.macros.wikifyIncluded=new h;config.macros.wikifyIncluded.handler=function(a,b,c,e,d,g){macroTWcode=e.source.substring(e.matchStart,e.nextMatch);deprecationMsg='\nwikifyIncluded macro is now deprecated, please use include macro with the "wikify" parameter instead (wikifyIncluded no longer wikifies anything; in some of the next versions it will be removed entirely, so this message won\'t appear as well)';
createTiddlyText(createTiddlyElement(a,"code"),macroTWcode+" "+deprecationMsg);this.isUsed(macroTWcode)||(this.setUsed(macroTWcode),alert("wikifyIncluded macro was used in the "+g.title+" tiddler; "+deprecationMsg))};var T=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return T.apply(this,arguments)||this.isIncluded()};Tiddler.prototype.isIncluded=function(){return void 0!=this.includeURL};Tiddler.prototype.getIncludeURL=function(){return this.includeURL};Tiddler.prototype.setIncludeURL=
function(a){this.includeURL=a};Tiddler.prototype.deleteIncludeURL=function(){delete this.includeURL};var x={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1},K;for(K in x)r(TiddlyWiki.prototype,K);twWeb=new u;config.macros.describeNode=new h;config.macros.describeNode.handler=function(a,b,c,e,d,g){b=e.source.substring(e.matchStart,e.nextMatch);createTiddlyText(createTiddlyElement(a,"code"),b);if(!this.isUsed(b))if(this.setUsed(b),g=g.getIncludeURL(),a=c[0],c=c[1],b="self"==
c,e=G(c),b){if((c=twWeb.getSelfNodeName())&&c!=a)return alert("The '"+c+"' alias is already assigned as the name of the current TiddlyWiki; the new attempt to assign '"+a+"' is ignored.");twWeb.setSelfNodeName(a)}else c=e?g?y(g)+c:F(c):c,twWeb.addNodeDesc(a,c)};r=function(a){for(var b=0;b<config.formatters.length;b++)if(config.formatters[b].name==a)return b;return null};config.options.STP_hijackPrettyLink&&(x=r("prettyLink"),config.extensions.SharedTiddlersPlugin.orig_prettyLinkFormatter=config.formatters[x],
config.formatters[x]={name:"prettyLink",match:"\\[\\[",lookaheadRegExp:/\[\[(.*?)(?:\|(~)?(.*?))?\]\](?:(?:@(\w+))(?:@([\w\s\:]+)@)?)?/mg,handler:function(a){this.lookaheadRegExp.lastIndex=a.matchStart;var b=this.lookaheadRegExp.exec(a.source);if(b&&b.index==a.matchStart){config.extensions.SharedTiddlersPlugin.orig_prettyLinkFormatter.handler(a);var c=b[4]?b[4]:void 0,e=a.tiddler?a.tiddler.getIncludeURL():null,c=c?"node: "+c:e?e:void 0,e='"'+c+'" filters:"[['+(b[3]?b[3]:b[1])+']]" hide noRefresh ';
b[5]&&(e+=b[5]);c&&config.macros.include.handler(a.output,"include",e.readMacroParams(!0),a,e,a.tiddler);a.nextMatch=this.lookaheadRegExp.lastIndex}}});config.options.STP_hijackImageFormatter&&(r=r("image"),config.extensions.SharedTiddlersPlugin.orig_imageFormatterHandler=config.formatters[r].handler,config.formatters[r].handler=function(a){var b=a.output.lastChild;config.extensions.SharedTiddlersPlugin.orig_imageFormatterHandler.apply(this,arguments);if(a.output.lastChild!=b){var b=a.output.lastChild,
c=a.tiddler.getIncludeURL(),e=jQuery(b).attr("src");G(e)&&c&&(b.src=y(c)+e)}});config.extensions.SharedTiddlersPlugin.orig_editHandler=config.macros.edit.handler;config.macros.edit.handler=function(a,b,c,e,d,g){if("text"==c[0]&&g.getIncludeURL()){var f=createTiddlyElement(null,"div");f.className="manageIncludedPanel";createTiddlyText(f,"manage the included tiddler: ");var h=g.getIncludeURL()+"#[["+g.title+"]]";createExternalLink(f,h,"open in the source TiddlyWiki");readOnly||(createTiddlyText(f," | "),
h=jQuery("<a>",{href:"javascript:;",title:"import this tiddler",text:"import"}).click(function(){config.extensions.SharedTiddlersPlugin.importAndLog(g,1)}),jQuery(f).append(h));a.appendChild(f)}return config.extensions.SharedTiddlersPlugin.orig_editHandler(a,b,c,e,d,g)};I();setTimeout(J,100)}})();
// //%/
/%
!info
|Name|ShowPopup|
|Source|http://www.TiddlyTools.com/#ShowPopup|
|Version|1.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transcluded html|
|Requires||
|Overrides||
|Description|display tiddler content in a TiddlyWiki popup panel|
Usage:
<<<
{{{
<<tiddler ShowPopup with: TiddlerName label tooltip buttonClass width popupClass>>
}}}
*{{{TiddlerName}}} is the title of the tiddler whose content is to be displayed
*{{{label}}} is the text of the popup command
*{{{tooltip}}} is the mouseover help text for the command
*{{{buttonClass}}} is a CSS classname applied to the command text (default=button)
*{{{width}}} is the width of the popup (using CSS measurements, default=auto)
*{{{popupClass}}} is a CSS classname applied to the popup panel (default=none).  Use 'sticky' for persistent popups (requires  StickyPopupPlugin)
<<<
Example:
<<<
{{{
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
}}}
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
<<<
!end

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

%/<<tiddler {{'ShowPopup##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]] [[$6]]>>
/***
|Name|[[ShowPopupPlugin]]|
|Source|http://www.TiddlyTools.com/#ShowPopupPlugin|
|Version|2.1.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|display tiddler content in a TiddlyWiki popup panel|
!!!!!Documenatation
>see [[ShowPopupPluginInfo]]
!!!!!Revisions
<<<
2011.03.13 2.1.1 in click(), removed check for popup already shown (prevents nested popups!)
| Please see [[ShowPopupPluginInfo]] for previous revision details |
2006.09.09 1.0.0 initial release (transclusion)
<<<
!!!!!Code
***/
//{{{
version.extensions.ShowPopupPlugin=
    { major:2, minor:1, revision:1, date:new Date(2011,3,13) };
config.macros.showPopup = {
    tip: 'display "%0" in a popup',
    init: function() {
        config.shadowTiddlers.ShowPopup =
            '<<showPopup tiddler:[[$1]] label:"$2" tip:"$3" buttonClass:"button $4" width:"$5" popupClass:"$6" "$7">>';
        config.annotations.ShowPopup =
            'created by ShowPopupPlugin';
    },
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var p=paramString.parseParams('name',null,true,false,true);
        var tid=getParam(p,'tiddler','TiddlerName');
        var label=getParam(p,'label',tid);
        var tip=getParam(p,'tip',this.tip.format([tid]));
        var buttonClass=getParam(p,'buttonClass','');
        var width=getParam(p,'width','auto');
        var popupClass=getParam(p,'popupClass','');
        var above=params.contains('above');
        var mouseover=params.contains('mouseover');
        var b=createTiddlyButton(place, label, tip, this.click, buttonClass, null, null,
            { tid:tid, popupClass:popupClass, width:width, above:above });
        b.innerHTML=label; // render HTML for entities, images, etc
        if (mouseover) b.onmouseover=b.onclick;  // option: mouseover triggers click
    },
    click: function(ev) { var ev=ev||window.event;
        // DISABLED if (Popup.find(this)!=-1)return false; // popup already shown!
        var p=Popup.create(this); if(!p)return false; // popup not created!
        addClass(p,this.getAttribute('popupClass'));
        var d=createTiddlyElement(p,'div');
        var s=d.style; s.whiteSpace='normal'; s.width=this.getAttribute('width'); s.padding='2px';
        wikify(store.getTiddlerText(this.getAttribute('tid'),''),d);
        if (this.getAttribute('above')!='true') Popup.show();
        else Popup.show('top','left',{x:0,y:-jQuery(d).outerHeight()});
        ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation(); return false;
    }
}
//}}}
<<tabs "A-Z"
"A-Z" "Topical" TabTopicEntries
"recent" "Timeline" TabTimeline
"tag" "All tags" TabTags>>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
{{smallform{
    <script label="tiddler:" title="select a tiddler title or open matching tiddler">
    // send a return key to the gotoTiddler input field
    var form=place.parentNode.nextSibling.firstChild;
    config.macros.gotoTiddler.inputKeyHandler({keyCode:13},form.gotoTiddler,form.list);
    return false;
</script><script>
    place.lastChild.style.fontWeight="normal";
</script>
<<gotoTiddler search inputstyle:"display:block;width:98.5%;margin:0;font-size:8pt;" liststyle:"width:85%;font-size:8pt;">>/%
%/}}}/%
%/{{selected{{{toolbar fine{
    <<tiddler BreadcrumbsCommand>>/%
    %/ <<tiddler ShowPopup with:
        FavoriteTiddlers "favorites" "quick access to favorite tiddlers" button auto>>/%
    %/ <<openStory popup>>/%
    %/ <<tiddler QuickSearchPopup with: {{tiddler?tiddler.title:""}} "see also">>/%
%/}}}}}}{{clear{
}}}
{{tiny left{
<script>
    // timestamp for generating GUID (globally unique ID)
    config.renderTime=new Date().getTime();
</script>/%
%/+++[options|set search options]#sidebarSearchOptions:
    <<tiddler SearchOptions>>===
<script>place.lastChild.id+=config.renderTime;</script>/%
%/{{small {<<search>>}}} }}}
{{outline {
<<gotoTiddler
    search
>>/%
%/<script>
    // timestamp for generating GUID (globally unique ID)
    config.renderTime=new Date().getTime();
</script>/%
%/+++[options|set search options]#sidebarSearchOptions:
    <<tiddler SearchOptions>>===
<script>place.lastChild.id+=config.renderTime;</script> }}}
 sensitive information
Notes about Asperger's
stub
Year 34

''Somnambulance''

She hasn't enough wakefulness for the waking hours, so she has to be fakeful. But I know it's fake because of a preoccupied gaze, a slight slur in her speech, the dismay when she wants to use a common word but can't think of it.   She reserves and summons up her alertness for designated times; particularly driving, and anything that takes her out of the house or with another person.

As for that other person, myself, it's too much time together for her to manage . I have long stretches of time just soothing her through the lullaby, and toward the night, which tragically is not restful. I have a list of things to tell her, so important they require concentration and have decisions attached; as I wait for her working mind to be available.

(We wish for a diagnosis. Excessive daytime sleepiness and unproductive sleep at night, those are just signs, but what's the cause? (Update, T says "excessive daytime sleepiness" is a diagnosis.)  What will the specialist settle on next? We've given up on specialists agreeing. We don't mention fibromyalgia anymore; if it's a true thing, it's doubtless the contributor, but we're not even so sure of that.)
/***
|Name|SnapshotPlugin|
|Source|http://www.TiddlyTools.com/#SnapshotPlugin|
|Documentation|http://www.TiddlyTools.com/#SnapshotPluginInfo|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|save or print HTML+CSS image of rendered document content|
|Status|ALPHA - DO NOT DISTRIBUTE|
This plugin provides a macro as well as tiddler toolbar commands to create a file or browser window containing the //rendered// CSS-and-HTML that is currently being displayed for selected elements of the current document.
!!!!!Documentation
>see [[SnapshotPluginInfo]]
!!!!!Configuration
<<<
<<option chkSnapshotHTMLOnly>> output HTML only (omit CSS)
<<<
!!!!!Revisions
<<<
2009.06.04 [1.2.0] added handling in getSnap() so current form input values are shown in snapshots
|please see [[SnapshotPluginInfo]] for additional revision details|
2008.04.21 [1.0.0] initial release - derived from [[NewDocumentPlugin]] with many improvements...
<<<
!!!!!Code
***/
//{{{
version.extensions.SnapshotPlugin= {major: 1, minor: 2, revision: 0, date: new Date(2009,6,4)};

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

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

        if (id==cms.askID||id==cms.askTiddlerID||id==cms.askDOMID) {
            cms.askForID(here,ev);
        } else {
            // get element
            if (id==cms.storyID) id="tiddlerDisplay";
            if (id==cms.allID) id="contentWrapper";
            var snapElem=document.getElementById(id);
            if (id==cms.hereID || id==cms.viewerID)
                var snapElem=story.findContainingTiddler(here);
            if (snapElem && hasClass(snapElem,"tiddler") && (id==cms.viewerID || HTMLOnly)) {
                // find viewer class element within tiddler element
                var nodes=snapElem.getElementsByTagName("*");
                for (var i=0; i<nodes.length; i++)
                    if (hasClass(nodes[i],"viewer")) { snapElem=nodes[i]; break; }
            }
            if (!snapElem) // not in a tiddler or no viewer element or unknown ID
                { e.cancelBubble=true; if(e.stopPropagation)e.stopPropagation(); return(false); }
            // write or print snapshot
            var out=cms.getsnap(snapElem,id,printing,HTMLOnly);
            if (printing) cms.printsnap(out); else cms.savesnap(out);
        }
        return false;
    },
    askForID: function(here,ev) {
        var ev = ev ? ev : window.event;
        var cms=config.macros.snapshot; // abbreviation
        var id=here.getAttribute("snapID");
        var indent='\xa0\xa0\xa0\xa0';
        var p=Popup.create(here); if (!p) return false; p.className+=' sticky smallform';
        var s=createTiddlyElement(p,'select'); s.button=here;
        if (id==cms.askID) {
            s.options[s.length]=new Option(cms.askMsg,cms.askID);
            var tid=story.findContainingTiddler(here);
            if(tid) {
                var title=tid.getAttribute("tiddler");
                if (here.getAttribute("HTMLOnly")!="true")
                    s.options[s.length]=new Option(indent+cms.hereItem.format([title]),cms.hereID);
                s.options[s.length]=new Option(indent+cms.viewerItem.format([title]),cms.viewerID);
            }
            s.options[s.length]=new Option(indent+cms.tiddlerItem,cms.askTiddlerID);
            s.options[s.length]=new Option(indent+cms.IDItem,cms.askDOMID);
            s.options[s.length]=new Option(indent+cms.storyItem,"tiddlerDisplay");
            s.options[s.length]=new Option(indent+cms.allItem,"contentWrapper");
        }
        if (id==cms.askDOMID) {
            s.options[s.length]=new Option(cms.IDItem,cms.askDOMID);
            var elems=document.getElementsByTagName("*");
            var ids=[];
            for (var i=0;i<elems.length;i++)
                if (elems[i].id.length && elems[i].className!="animationContainer")
                    ids.push(elems[i].id);
            ids.sort();
            for (var i=0;i<ids.length;i++) s.options[s.length]=new Option(indent+ids[i],ids[i]);
        }
        if (id==cms.askTiddlerID) {
            s.options[s.length]=new Option(cms.tiddlerItem,cms.askTiddlerID);
            var elems=document.getElementsByTagName("div");
            var ids=[];
            for (var i=0;i<elems.length;i++) { var id=elems[i].id;
                if (id.length && id.substr(0,story.idPrefix.length)==story.idPrefix && id!="tiddlerDisplay")
                    ids.push(id);
            }
            ids.sort();
            for (var i=0;i<ids.length;i++) s.options[s.length]=new Option(indent+ids[i].substr(story.idPrefix.length),ids[i]);
        }
        s.options[s.length]=new Option(cms.HTMLItem.format([here.getAttribute("HTMLOnly")=="true"?"\u221a":"_"]),cms.HTMLItem);
        s.onchange=function(ev){
            var ev = ev ? ev : window.event;
            var cms=config.macros.snapshot; // abbreviation
            var here=this.button;
            if (this.value==cms.HTMLItem) {
                config.options.chkSnapshotHTMLOnly=!config.options.chkSnapshotHTMLOnly;
                here.setAttribute("HTMLOnly",config.options.chkSnapshotHTMLOnly?"true":"false");
                config.macros.option.propagateOption("chkSnapshotHTMLOnly","checked",
                    config.options.chkSnapshotHTMLOnly,"input");
            } else
                here.setAttribute("snapID",this.value);
            config.macros.snapshot.go(here,ev);
            return false;
        };
        Popup.show();
        ev.cancelBubble=true;
        if(ev.stopPropagation)ev.stopPropagation();
        return false;
    },
    getpath: function() {
        // get current path
        var path=getLocalPath(window.location.href);
        var slashpos=path.lastIndexOf("/");
        if (slashpos==-1) slashpos=path.lastIndexOf("\\");
        if (slashpos!=-1) path=path.substr(0,slashpos+1); // trim filename
        return path;
    },
    getsnap: function(snapElem,id,printing,HTMLOnly) {
        var cms=config.macros.snapshot; // abbreviation
        var out='<head>\n';
        if (printing)
            out+='<base href="file:///'+cms.getpath().replace(/\\/g,'/')+'"></base>\n';
        if (!HTMLOnly) {
            var styles=document.getElementsByTagName('style');
            var fmt='<style>\n/* stylesheet=%0 */\n%1\n\n</style>\n';
            for(var i=0; i < styles.length; i++)
                out+=fmt.format([styles[i].getAttribute('id'),styles[i].innerHTML]);
        }
        out+='</head>\n';

        var elems=snapElem.getElementsByTagName('input');
        for (var i=0; i<elems.length; i++) { var e=elems[i];
            if (e.type=='text')     e.defaultValue=e.value;
            if (e.type=='checkbox')     e.defaultChecked=e.checked;
            if (e.type=='radiobutton')  e.defaultChecked=e.checked;
        }
        var elems=snapElem.getElementsByTagName('textarea');
        for (var i=0; i<elems.length; i++)   elems[i].defaultValue=elems[i].value;

        var fmt='<body>\n\n<div class="%0">%1</div>\n\n</body>\n';
        out+=fmt.format([(id==cms.viewerID?'tiddler viewer':''),snapElem.innerHTML]);

        return '<html>\n'+out+'</html>';
    },
    printsnap: function(out) {
        var win=window.open("","_blank","");
        win.document.open();
        win.document.writeln(out);
        win.document.close();
        win.focus(); // bring to front
        win.print(); // trigger print dialog
    },
    savesnap: function(out) {
        var cms=config.macros.snapshot; // abbreviation
        // make sure we are local
        if (window.location.protocol!="file:")
            { alert(config.messages.notFileUrlError); return; }
        var target=cms.askForFilename(cms.fileMsg,cms.getpath(),cms.defaultFilename);
        if (!target) return; // cancelled by user
        // if specified file does not include a path, assemble fully qualified path and filename
        var slashpos=target.lastIndexOf("/");
        if (slashpos==-1) slashpos=target.lastIndexOf("\\");
        if (slashpos==-1) target=target+cms.defaultFilename;
        var link="file:///"+target.replace(/\\/g,'/'); // link for message text
        var ok=saveFile(target,convertUnicodeToUTF8(out));
        var msg=ok?cms.okmsg.format([target]):cms.failmsg.format([target]);
        clearMessage(); displayMessage(msg,link);
    },
    askForFilename: function(msg,path,file) {
        if(window.Components) { // moz
            try {
                netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
                var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
                picker.init(window, msg, nsIFilePicker.modeSave);
                var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
                thispath.initWithPath(path);
                picker.displayDirectory=thispath;
                picker.defaultExtension='html';
                picker.defaultString=file;
                picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
                if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
            }
            catch(e) { alert('error during local file access: '+e.toString()) }
        }
        else { // IE
            try { // XP/Vista only
                var s = new ActiveXObject('UserAccounts.CommonDialog');
                s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
                s.FilterIndex=3; // default to HTML files;
                s.InitialDir=path;
                s.FileName=file;
                if (s.showOpen()) var result=s.FileName;
            }
            catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
        }
        return result;
    }
};
//}}}

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

// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;
Popup.stickyPopup_onDocumentClick = function(ev)
{
    // if click is in a sticky popup, ignore it so popup will remain visible
    var e = ev ? ev : window.event; var target = resolveTarget(e);
    var p=target; while (p) {
        if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
        else p=p.parentNode;
    }
    if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
        Popup.onDocumentClick(ev);
    return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
* [[BestPractices-T]]
!!!! 12/28 Discussion conversational dynamics
* peripheral awareness
** Mom doesn't know we've left
**   or ... that we've come in.
** it seems like I was eavesdropping
** she can't "abort" a conversational topic when someone comes in; the train is already rolling on the tracks.
** A state of near-undress means I might be seen, so I have to close the door -- even tho I have peripheral awareness.
* Knowing when a conversation is over
* Ill feeling that comes from walking away from a "spiritual" conversation
* One-way conversation.  R. calls it "valueless"; I protest.
----
[[Leaving-the-room]]
* Social cues, difficulty understanding
* [[Face-blindness]]
* [[Social-mischief]]
!!! Scripts
* [[Emotional-transactions]]
''Flirting'' is the sexual under- or overtone that may or may not signal sexual engagement.  
* //Flirting!  That's a happy habit.  Raising my skirt; show a little ankle, what can that hurt?//
* The Song of Songs
''Banter'' is like flirting.  Instead of sexual engagement, the underlying layer is competitive sparring.  

These run counter to [[Literal-perception]]. 
A repeated crisis has been T.'s insistence that family members conform to her understanding of social norms.  Due to [[Theory-of-Mind]] weakness (also [[Negative-perceptions]]), her understanding of these norms is distorted and amplified.  We are asked to behave in ways that strike us as inappropriate, awkward, embarrassing, hazardous in terms of [[Reactions-from-others]] -- ironically, as socially shameful.  Or that simply result in lot of extra effort. 
* [[Flowerbeds]]
* [[Danger-of-social-censure]]
----
I tend to be overly self-confident and dismissive of social norms.  This means her anxiety can be my safety.  Marriage is complicated.  
''In general, gravity and energy transfer and their effects are a cipher.'' 
Any adjustments are made on the basis of a conscious and [[exhausting|Fatigue]] mental effort.  She vaguely infers that the rest of us are under the same constraint, so it's a blow to her self-value that she seems to have a harder time of it. 
* filling the flowerbeds with water, and her defense -- "5 minutes"
* hanging pants to keep the creases -- one problem here is I'm used to hearing her carp about clothes care, so my response is outsize
* washing the salt measuring-spoon
* vacuum cord storage
* wasting the mint
* must cook in spices after draining meat -- to 'prevent waste', we have a less tasty meal
* a pair of dark boxers in the dryer might ruin the load
* how to keep a shower stall dry (air circ.)
* She is certain a car can't be left running in the driveway.  It will start moving by itself.  So one can't run A/C for five minutes to cool the car.  So the windows must be left open.  But only a crack, for if they are left wide open a thief will steal the car.  (A 1998 Ford Crown Vic!)
/%
|Name|SplitTiddler|
|Source|http://www.TiddlyTools.com/#SplitTiddler|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|html|
|Description|split tiddler contents into separate tiddlers|

%/<html><nowiki><style>
#tiddlerSplitTiddler .tagged { display:none; }
#tiddlerSplitTiddler .label { font-size:90%;font-style:italic;white-space:nowrap; }
#tiddlerSplitTiddler table, #tiddlerSplitTiddler tr, #tiddlerSplitTiddler td
    { border:0; margin:0; padding:0; }
</style><table><tr><td><form>
<table style='width:100%'><tr><td style='width:20%'>
    <div class='label'>source tiddler:</div>
    <select name='src' value='' style='width:99%;padding:2px;margin:0'
        title='select a tiddler containing source material'>
    <option value=''>select a tiddler...</option>
    </select>
</td><td style='width:20%'>
    <div class='label'>target title format:</div>
    <input name='titleformat' value='%0 - %1' style='width:99%'
        title='format for target tiddler titles'>
</td><td style='width:20%'>
    <div class='label'>output format:</div>
    <input name='format' value='%4' style='width:99%'
        title='format for target tiddler content'>
</td><td style='width:20%'>
    <div class='label'>target field:</div>
    <input name='fieldname' value='text' style='width:99%'
        title='field to hold content in target tiddler'>
</td><td style='width:20%'>
    <div class='label'>add tags:</div>
    <input name='tags' value='' style='width:99%'
        title='tags for target tiddlers'>
</td></tr></table>
<div style='font-size:80%;font-style:italic;text-align:center;color:gray'>
%0=source title, %1=first line of item, %2=first word of item, %3=item number, %4=item content
</div>
<div style='float:left;margin-right:1em'>
<div class='label'>split source content by:</div>
<div style='line-height:2.1em'>
<input type='radio' name='splitby' value='charcount'>every
<input name='charcount' value='1000' onfocus='this.select()' style='width:3em'
    title='split content every N characters'> characters<br>
<input type='radio' name='splitby' value='linecount'>every
<input name='linecount' value='20' onfocus='this.select()' style='width:3em'
    title='split content every N lines'> lines<br>
<input type='radio' name='splitby' value='match' CHECKED>match
<input name='sep' value='\n----\n' onfocus='this.select()' style='width:8em'
    title='match character sequence to split content'><br>
&nbsp; <input type='checkbox' name='regexp' title='match using regular expressions (text patterns)'>use RegExp text pattern<br>
</div></div>
<div style='float:left;margin-right:1em'>
<div class='label'>options:</div>
<input type='checkbox' name='warn' checked>confirm overwrites<br>
<input type='checkbox' name='show'>show tiddlers when done<br>
<input type='checkbox' name='limit'>create only
<input name='maxtids' value='8' style='width:2em'> tiddlers<br>
<input type='checkbox' name='index' checked>create an index tiddler<br>
&nbsp;&nbsp; index item format:
<input name='indexformat' value='<<tiddler [[%0 - %1]]>>' style='width:10em'
    title='%0=target tiddler title'>
</div>
<input type='button' style='float:right;height:5em;margin-top:2.5em' value='split tiddler' onclick="
    var f=this.form;
    if (!f.src.value.length)
        { alert('select a tiddler title'); f.src.focus(); return false; }
    if (!f.titleformat.value.length)
        { alert('enter a target title format'); f.titleformat.focus(); return false; }
    if (!f.src.value.length)
        { alert('enter an output item format'); f.format.focus(); return false; }
    var start=new Date().getTime();
    var src=store.getTiddlerText(f.src.value);
    if (!src) { displayMessage('\x27'+f.src.value+'\x27 not found'); return false; }
    var tags=f.tags.value;
    var parts=[];
    if (f.splitby[0].checked) { /* chars */
        for (var i=0; i<src.length; i+=f.charcount.value)
            parts.push(src.substr(i,f.charcount.value));
    } else if (f.splitby[1].checked) { /* lines */
        var lines=src.split('\n');
        var t=''; var c=f.linecount.value;
        while (lines.length) {
            t+=lines.shift()+'\n'; c--;
            if (!c) { parts.push(t); var c=f.linecount.value; t=''; }
        }
    } else { /* match text/regexp */
        var sep=!f.regexp.checked?f.sep.value.unescapeLineBreaks():new RegExp(f.sep.value);
        var pieces=src.split(sep);
        for (var i=0; i<pieces.length; i++) if (pieces[i].length) parts.push(pieces[i]);
    }
    var msg='Found '+parts.length+' items in \x27'+f.src.value+'\x27. OK to proceed?';
    if (!confirm(msg)) return false;
    if (parts.length) store.suspendNotifications();
    var pad=parts.length.toString().length;
    var tids=[]; var out=[];
    var srctitle=f.src.value;
    var fmt=f.format.value.unescapeLineBreaks();
    var titlefmt=f.titleformat.value.unescapeLineBreaks();
    var fieldname=f.fieldname.value.toLowerCase();
    var indexfmt=f.indexformat.value.unescapeLineBreaks();
    var max=f.limit.checked?f.maxtids.value:parts.length;
    var warn=f.warn.checked;
    for (var p=0; p<max; p++) {
        var lines=parts[p].split('\n');
        var firstline=lines[0];
        var firstword=firstline.split(' ')[0];
        var itemnum=String.zeroPad(p+1,pad);
        if (titlefmt.indexOf('%2')!=-1) /* remove firstword if used in title */
            { var words=lines[0].split(' '); words.shift(); lines[0]=words.join(' '); var discard=!words.length; }
        if (titlefmt.indexOf('%1')!=-1 || discard) /* remove firstline if used in title */
            lines.shift();
        var content=lines.join('\n');
        var args=[srctitle,firstline,firstword,itemnum,content];
        var tid=titlefmt.format(args).replace(/[\[\]\|]/g,'_');
        var txt=fmt.format(args);
        var fields={}; if (fieldname!='text')
            { fields[fieldname]=txt; txt='<<view '+fieldname+' wikified>>'; }
        var tags=tags.format(args);
        if (warn && store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid])))
            continue;
        store.saveTiddler(tid,tid,txt,config.options.txtUserName,new Date(),tags,fields);
        if (f.index.checked) out.push(indexfmt.format(args));
        tids.pushUnique(tid);
    }
    var elapsed=(new Date().getTime()-start)/1000;
    if (parts.length) store.resumeNotifications();
    if (tids.length) {
        if (f.index.checked) {
            var tid=f.src.value+'Index';
            if (!warn||!store.tiddlerExists(tid)||confirm(config.messages.overwriteWarning.format([tid])))
                store.saveTiddler(tid,tid,out.join('\n'),config.options.txtUserName,new Date(),[],{});
        }
        store.notifyAll();
        if (f.show.checked) story.displayTiddlers(story.findContainingTiddler(this),tids);
        displayMessage('created '+tids.length+' target tiddlers in '+elapsed+' seconds');
    }
"><div style='clear:both'></div>
</form></td></tr></table></html><<tiddler {{
    var list=place.lastChild.getElementsByTagName('form')[0].src;
    store.forEachTiddler(function(title,tiddler){
        list.options[list.length]=new Option(title,title);
    });
'';}}>>
/***
|Name|StickyPopupPlugin|
|Source|http://www.TiddlyTools.com/#StickyPopupPlugin|
|Version|1.0.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Popup.onDocumentClick|
|Options|##Configuration|
|Description|allow mouse interactions inside popups without automatically closing them|
Usually, when a TW popup is displayed, it is automatically closed whenever a click occurs //anywhere// in the document, either //inside// or //outside// the popup itself.  This plugin makes popups persistent (a.k.a, "sticky"), allowing you to perform multiple mouse interactions on content //inside// the popup (e.g., entering form fields, opening links, selecting text, etc.), remaining visible until you click //outside// the popup or perform an action that opens another popup (only one popup can be displayed at any given time).
!!!!!Configuration
<<<
You can cause popups to behave in a persistent ("sticky") manner simply by selecting the option checkbox below.  The selected popup display behavior will be applied to ALL popups in the document automatically.
><<option chkStickyPopups>> make all popups "sticky"
>{{{usage: <<option chkStickyPopups>>}}}
<<<
!!!!!Usage
<<<
If you are developing your own plugins or inline scripts that create popups programmatically using the core function:
{{{
Popup.create(this)
}}}
you can provide additional parameters that specify the desired CSS classname(s) to assign to the popup DOM element.  The default class when none is specified is simply "popup".  To create a //sticky// popup, simply enter a custom class combination like this:
{{{
Popup.create(this,null,"sticky popup")
}}}
<<<
!!!!!Revisions
<<<
2008.05.16 [1.0.1] added try..catch around addEvent/removeEvent calls to avoid error in Opera
2007.11.25 [1.0.0] initial release - moved from [[CoreTweaks]]
<<<
!!!!!Code
***/
//{{{
version.extensions.StickyPopupPlugin= {major: 1, minor: 0, revision: 1, date: new Date(2008,5,16)};

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

Popup.stickyPopup_onDocumentClick = function(ev)
{
    // if click is in a sticky popup, ignore it so popup will remain visible
    var e = ev ? ev : window.event; var target = resolveTarget(e);
    var p=target; while (p) {
        if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
        else p=p.parentNode;
    }
    if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
        Popup.onDocumentClick(ev);
    return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
{{center outline {
{{floatleft{&nbsp;&nbsp;&nbsp;&nbsp;<<tiddler ToggleLeftSidebar>>}}}/%
%/{{small{
<<tiddler ShowPopup with:
    [[DocumentSetup]] "setup" "configuration and setup" tiddlyLinkExisting auto sticky>>/%
%/ &nbsp; {{inline{<<tiddler ToggleBreadcrumbs##show with: "crumbs">> }}} /%
}}}
{{center outline {
{{floatleft{&nbsp;&nbsp;&nbsp;&nbsp;<<tiddler ToggleLeftSidebar>>}}}/%
%/{{small{
<<openStory popup>><script>
    place.lastChild.className='tiddlyLinkExisting';
</script>/%
%/ &nbsp; <<tiddler ShowPopup with:
    [[StoryMenuTop##changes]] "changes" "show recent changes" tiddlyLinkExisting 60em sticky>>/%
%/ &nbsp; {{span{<script>
    place.style.display=readOnly?'none':'inline';
</script><<tiddler ShowPopup with:
    [[DocumentSetup]] "setup" "configuration and setup" tiddlyLinkExisting auto sticky>>/%
%/ &nbsp; {{inline{<<tiddler ToggleBreadcrumbs##show with: "crumbs">> }}} /%
%/
{{smallform{<<unsavedChanges command>>}}}/%
%/}}} }}}/%
!changes
{{smallform{<<recentChanges 30>>}}}
!end
%/}}}
/***
|Name|StorySaverPlugin|
|Source|http://www.TiddlyTools.com/#StorySaverPlugin|
|Documentation|http://www.TiddlyTools.com/#StorySaverPluginInfo|
|Version|1.8.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|MarkupPostBody|
|Description|save/restore current tiddler view between browser sessions|
Automatically save a list of currently viewed tiddlers (the 'story') in a local cookie, {{{txtSavedStory}}} and then open those tiddlers when the document is reloaded, so you can resume working from the same place you left off!!  Also, use {{{<<saveStory>>}}} and {{{<<openStory>>}}} macros to quickly save/re-display stories stored in tiddlers, using a command link, droplist, or popup display.
!!!!!Documentation
>see [[StorySaverPluginInfo]]
!!!!!Configuration
<<<
<<option chkSaveStory>> use automatic story cookie (reopens tiddlers on startup)
<<option chkStoryAllowAdd>>include 'add a story' command in droplist/popup
<<option chkStoryFold>>fold story tiddlers when opening a story (see [[CollapseTiddlersPlugin]])
<<option chkStoryClose>>close other tiddlers when opening a story
<<option chkStoryTop>>open story tiddlers at top of column
<<option chkStoryBottom>>open story tiddlers at bottom of column
<<<
!!!!!Revisions
<<<
2009.10.20 1.8.3 fix handling for 'add' item in popup menu
|please see [[StorySaverPluginInfo]] for additional revision details|
2007.10.05 1.0.0 initial release. Moved [[SetDefaultTiddlers]] inline script and rewrote as a {{{<<saveStory>>}}} macro.
<<<
!!!!!Code
***/
//{{{
version.extensions.StorySaverPlugin= {major: 1, minor: 8, revision: 3, date: new Date(2009,10,20)};

var defaults={
    chkSaveStory:       false,
    chkStoryFold:       true,
    chkStoryClose:      true,
    chkStoryAllowAdd:   true,
    chkStoryTop:        true,
    chkStoryBottom:     false
};
for (var id in defaults) if (config.options[id]===undefined)
    config.options[id]=defaults[id];

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

// save or clear story cookie on exit
if (window.coreTweaks_confirmExit==undefined) {
    window.coreTweaks_confirmExit=window.confirmExit;
    window.confirmExit=function() {
        if (config.options.chkSaveStory) { // save cookie
            var links=[];
            story.forEachTiddler(function(title,element){links.push('[['+title+']]');});
            config.options.txtSavedStory=links.join(' ');
            saveOptionCookie('txtSavedStory');
        } else removeCookie('txtSavedStory');
        return window.coreTweaks_confirmExit.apply(this,arguments);
    }
}
//}}}
/***
''apply saved story on startup:'' //important note: the following code is actually located in [[MarkupPostBody]].  This is because it needs to supercede the core's getParameters() function, which is called BEFORE plugins are loaded, preventing the normal plugin-based hijack method from working, while code loaded into [[MarkupPostBody]] will be processed as soon as the document is read, even before the TW main() function is invoked.//
<<tiddler MarkupPostBody>>
***/
//{{{
config.macros.saveStory = {
    label: 'set default tiddlers',
    defaultTiddler: 'DefaultTiddlers',
    prompt: 'store a list of currently displayed tiddlers in another tiddler',
    askMsg: 'Enter the name of a tiddler in which to save the current story:',
    tag: 'story',
    excludeTag: 'excludeStory',
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var tid=params.shift()||'DefaultTiddlers';
        var label=params.shift()||this.label;
        var tip=params.shift()||this.prompt;
        var btn=createTiddlyButton(place,label,tip,this.setTiddler,'button');
        btn.setAttribute('tid',tid);
        btn.setAttribute('extratags','[['+params.join(']] [[')+']]');
    },
    setTiddler: function() {
        var cms=config.macros.saveStory; // abbrev
        // get list of current open tiddlers
        var tids=[];
        story.forEachTiddler(function(title,element){
            var t=store.getTiddler(title);
            if (!t || !t.isTagged(cms.excludeTag)) tids.push('[['+title+']]');
        });
        // get target tiddler
        var tid=this.getAttribute('tid');
        if (!tid || tid=='ask') {
            tid=prompt(cms.askMsg,cms.defaultTiddler);
            if (!tid || !tid.length) return false; // cancelled by user
        }
        if(store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid])))
            return false;
        tids=tids.join('\n');
        var t=store.getTiddler(tid); var tags=t?t.tags:[];
        var extratags=(this.getAttribute('extratags')||'').readBracketedList();
        for (var i=0; i<extratags.length; i++) tags.pushUnique(extratags[i]);
        tags.pushUnique(cms.tag);
        store.saveTiddler(tid,tid,tids,config.options.txtUserName,new Date(),tags,t?t.fields:null);
        story.displayTiddler(null,tid);
        story.refreshTiddler(tid,null,true);
        displayMessage(tid+' has been '+(t?'updated':'created'));
        return false;
    }
}
//}}}
//{{{
config.macros.openStory = {
    label: 'open story: %0',
    prompt: 'open the set of tiddlers listed in: %0',
    popuplabel: 'stories',
    popupprompt: 'view a set of tiddlers',
    tag: 'story',
    selectprompt: 'select a story...',
    optionsprompt: 'viewing options...',
    foldcmd: '[%0] fold story',
    foldprompt: 'fold story tiddlers when opening a story',
    closecmd: '[%0] close others',
    closeprompt: 'close other tiddlers when opening a story',
    topcmd: '[%0] open at top',
    topprompt: 'open story tiddlers at top of column',
    bottomcmd: '[%0] open at bottom',
    bottomprompt: 'open story tiddlers at bottom of column',
    addcmd: 'add a story...',
    addprompt: 'create a new story',
    excludeTag: 'excludeStory',
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        if (params[0].toLowerCase()=='list') return this.createList(place,params);
        else if (params[0].toLowerCase()=='popup') return this.createPopup(place,params);
        else this.createButton(place,params);
    },
    showStory: function(tid,fold) {
        var co=config.options; // abbrev
        var tids=[];
        var t=store.getTiddler(tid);
        var tagged=store.getTaggedTiddlers(tid,'title');
        if (tagged.length) // if tiddler IS a tag, use tagged tiddlers as story
            for (var i=0; i<tagged.length; i++) tids.push(tagged[i].title);
        else if (t) { // get tiddler list from content
            if (!t.linksUpdated) t.changed();
            for (var i=0; i<t.links.length; i++) {
                var tid=store.getTiddler(t.links[i]);
                if (tid && !tid.isTagged(this.excludeTag))
                    tids.push(t.links[i]);
            }
        }
        var template=null;
        if (fold||co.chkStoryFold) template='CollapsedTemplate'; // see [[CollapseTiddlersPlugin]]
        if (!store.tiddlerExists('CollapsedTemplate')) template=null;
        if (co.chkStoryClose) story.closeAllTiddlers();
        var pos='top'; var first=tids[0];
        if (!story.isEmpty() && co.chkStoryBottom) { pos='bottom'; tids=tids.reverse(); }
        story.displayTiddlers(pos,tids,template);
        var cmd='var t=story.getTiddler("'+first+'");if(t)window.scrollTo(0,t.offsetTop);';
        var delay=config.options.chkAnimate?config.animDuration+100:0;
        setTimeout(cmd,delay);
    },
    createButton: function(place,params) {
        var tid=params[0]||'';
        var label=params[1]||this.label; label=label.format([tid]);
        var tip=params[2]||this.prompt; tip=tip.format([tid]);
        var fold=(params[3]&&(params[3].toLowerCase()=='fold'))||config.options.chkStoryFold;
        var fn=function(){config.macros.openStory.showStory(this.getAttribute('tid'),this.getAttribute('fold')); return false; };
        var btn=createTiddlyButton(place,label,tip,fn,'button');
        btn.setAttribute('tid',tid);
        if (fold) btn.setAttribute('fold',fold);
    },
    createPopup: function(place,params) {
        params.shift(); // discard 'popup' keyword
        var label=params.shift()||this.popuplabel;
        var tip=params.shift()||this.popupprompt;
        var btn=createTiddlyButton(place,label,tip,this.showPopup,'button');
        btn.setAttribute('filter',params.shift()||config.macros.openStory.tag);
    },
    showPopup: function(ev) { var e=ev||window.event;
        var co=config.options; // abbrev
        var cmo=config.macros.openStory; // abbrev
        var indent='\xa0\xa0';
        var p=Popup.create(this); if (!p) return false;
        createTiddlyText(createTiddlyElement(p,'li'),cmo.selectprompt);
        var stories=store.filterTiddlers('[tag['+this.getAttribute('filter')+']]');
        for (var s=0; s<stories.length; s++) {
            var label=indent+stories[s].title;
            var tip=cmo.prompt.format([stories[s].title]);
            var fn=function(){config.macros.openStory.showStory(this.getAttribute('tid'));return false;};
            var btn=createTiddlyButton(createTiddlyElement(p,'li'),label,tip,fn,'button');
            btn.setAttribute('tid',stories[s].title);
        }
        createTiddlyText(createTiddlyElement(p,'li'),cmo.optionsprompt);
        if (store.tiddlerExists('CollapsedTemplate')) {
            var label=indent+cmo.foldcmd.format([co.chkStoryFold?'x':'\xa0\xa0']);
            var tip=cmo.foldprompt;
            var fn=function(){ config.macros.option.propagateOption(
                'chkStoryFold','checked',!config.options.chkStoryFold,'input'); return false; };
            var btn=createTiddlyButton(createTiddlyElement(p,'li'),label,tip,fn,'button');
        }
        var label=indent+cmo.closecmd.format([co.chkStoryClose?'x':'\xa0\xa0']);
        var tip=indent+cmo.closeprompt;
        var fn=function(){ config.macros.option.propagateOption(
            'chkStoryClose','checked',!config.options.chkStoryClose,'input'); return false; };
        var btn=createTiddlyButton(createTiddlyElement(p,'li'),label,tip,fn,'button');
        if (!co.chkStoryClose) {
            var label=indent+cmo.topcmd.format([co.chkStoryTop?'x':'\xa0\xa0']);
            var tip=indent+cmo.topprompt;
            var fn=function(){
                config.macros.option.propagateOption(
                    'chkStoryTop','checked',!config.options.chkStoryTop,'input');
                config.macros.option.propagateOption(
                    'chkStoryBottom','checked',!config.options.chkStoryTop,'input');
                return false;
            };
            var btn=createTiddlyButton(createTiddlyElement(p,'li'),label,tip,fn,'button');
            var label=indent+cmo.bottomcmd.format([co.chkStoryBottom?'x':'\xa0\xa0']);
            var tip=indent+cmo.botprompt;
            var fn=function(){
                config.macros.option.propagateOption(
                    'chkStoryBottom','checked',!config.options.chkStoryBottom,'input');
                config.macros.option.propagateOption(
                    'chkStoryTop','checked',!config.options.chkStoryBottom,'input');
                return false;
            };
            var btn=createTiddlyButton(createTiddlyElement(p,'li'),label,tip,fn,'button');
        }
        if (!readOnly && co.chkStoryAllowAdd) {
            var label=cmo.addcmd;
            var tip=cmo.addprompt;
            var fn=config.macros.saveStory.setTiddler;
            createTiddlyElement(createTiddlyElement(p,'li'),'hr');
            var btn=createTiddlyButton(createTiddlyElement(p,'li'),label,tip,fn,'button');
        }
        Popup.show();
        e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation();
        return false;
    },
    createList: function(place,params) {
        var cmo=config.macros.openStory; // abbrev
        var s=createTiddlyElement(place,'select',null,'storyListbox');
        s.size=1;
        s.onchange=function() {
            if (this.value=='_fold') {
                config.macros.option.propagateOption('chkStoryFold','checked',
                    !config.options.chkStoryFold,'input');
                cmo.refreshList();
            } else if (this.value=='_close') {
                config.macros.option.propagateOption('chkStoryClose','checked',
                    !config.options.chkStoryClose,'input');
                cmo.refreshList();
            } else if (this.value=='_top') {
                config.macros.option.propagateOption('chkStoryTop','checked',
                    !config.options.chkStoryTop,'input');
                cmo.refreshList();
            } else if (this.value=='_bottom') {
                config.macros.option.propagateOption('chkStoryBottom','checked',
                    !config.options.chkStoryBottom,'input');
                cmo.refreshList();
            } else if (this.value=='_add')
                config.macros.saveStory.setTiddler.apply(this,arguments);
            else cmo.showStory(this.value);
        }
        params.shift(); // discard 'list' keyword
        s.setAttribute('filter',params.shift()||cmo.tag);
        setStylesheet('.storyListbox { width:100%; }', 'StorySaverStyles');
        store.addNotification(null,this.refreshList); this.refreshList();
        return;
    },
    refreshList: function() {
        var cmo=config.macros.openStory; // abbrev
        var indent='\xa0\xa0\xa0\xa0';
        var lists=document.getElementsByTagName('select');
        for (var i=0; i<lists.length; i++) { if (lists[i].className!='storyListbox') continue;
            var here=lists[i];
            var stories=store.filterTiddlers('[tag['+here.getAttribute('filter')+']]');
            while (here.length) here.options[0]=null; // remove current list items
            here.options[here.length]=new Option(cmo.selectprompt,'',true,true);
            for (var s=0; s<stories.length; s++)
                here.options[here.length]=new Option(indent+stories[s].title,stories[s].title);
            if (!readOnly && config.options.chkStoryAllowAdd)
                here.options[here.length]=new Option(cmo.addcmd,'_add');
            here.options[here.length]=new Option(cmo.optionsprompt,'');
            if (store.tiddlerExists('CollapsedTemplate')) {
                var msg=cmo.foldcmd.format([config.options.chkStoryFold?'x':'\xa0\xa0']);
                here.options[here.length]=new Option(indent+msg,'_fold');
            }
            var msg=cmo.closecmd.format([config.options.chkStoryClose?'x':'\xa0\xa0']);
            here.options[here.length]=new Option(indent+msg,'_close',false,false);
            if (!config.options.chkStoryClose) {
                var msg=cmo.topcmd.format([config.options.chkStoryTop?'x':'\xa0\xa0']);
                here.options[here.length]=new Option(indent+msg,'_top',false,false);
                var msg=cmo.bottomcmd.format([config.options.chkStoryBottom?'x':'\xa0\xa0']);
                here.options[here.length]=new Option(indent+msg,'_bottom',false,false);
            }
        }
    }
}
//}}}
/***
|Name|StorySaverPlugin|
|Source|http://www.TiddlyTools.com/#StorySaverPlugin|
|Documentation|http://www.TiddlyTools.com/#StorySaverPluginInfo|
|Version|1.8.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Requires|MarkupPostBody|
|Description|documentation for [[StorySaverPlugin]]|
Automatically saves a list of currently viewed tiddlers (the "story") in a local cookie, {{{txtSavedStory}}} and then opens those tiddlers when the document is subsequently reloaded, allowing you to quickly resume working with the document from the same place you left off!! The plugin also defines {{{<<saveStory>>}}} and {{{<<openStory>>}}} macros that allow you to quickly save/re-display stories stored in tiddlers, using simple, one-click command links or droplists.
!!!!!Usage
<<<
If a document URL does not contain a paramifier (i.e., a "#..." suffix), then the saved story cookie (if any) will be used //as if// it had been entered as a permaview (e.g., a "#tiddler tiddler tiddler..." suffix on the URL), bypassing the [[DefaultTiddlers]] definition.  This behavior is automatically applied whenever the plugin is installed in your document.  You can enable/disable the automatic cookie-based StorySaver feature by using the checkbox below:
><<option chkSaveStory>> enable StorySaverPlugin
>//usage:// {{{<<option chkSaveStory>>}}}
You can also temporarily //bypass// the redisplay of a saved story ''without disabling the StorySaver cookie'' by including a trailing "#" at the end of the document URL.  This will cause your document to be loaded into the browser without displaying //any// initial tiddlers at all.  Alternatively, you can enter {{{#story:storyname}}} on the end of the URL (e.g., {{{#story:DefaultTiddlers}}}) to display any specific saved story, regardless of the value of the cookie-based saved story.

__''saveStory macro:''__
The {{{<<saveStory>>}}} macro lets you write the list of currently viewed tiddlers to a specified tiddler name (e.g., DefaultTiddlers, MyFavorites, etc.).  Tiddlers containing saved stories are automatically tagged with <<tag story>>, so that they can be recognized by the {{{<<storyViewer>>}}} macro (see [[StoryViewerPlugin]]).  The syntax for the {{{<<saveStory>>}}} macro is:
{{{
<<saveStory storyname label tooltip tag tag tag...>>
}}}
*''storyname''<br>is the target tiddler in which to save the current story.  If you use the keyword, ''ask'', in place of the tiddlername, you will be prompted to enter a tiddler title when saving the story (default: DefaultTiddlers).
*''label'' and ''tooltip''<br>are the link text and mouseover guide-text
*''tag tag tag...'' (optional)<br>are extra tags that are added when saving a story tiddler (in addition to the default<<tag story>>tag).

__''openStory macro:''__
To redisplay a saved story, the {{{<<openStory>>}}} macro can be used to embed either a droplist of all saved stories, or a link for a specified story.  Selecting from the droplist or clicking the link opens the corresponding set of tiddlers.
{{{
<<openStory list tagValue>>
<<openStory popup label tooltip tagValue>>
<<openStory storyname label tooltip fold>>
}}}
*''list''<br>shows a droplist of all saved stories, plus additional commands/viewing options.  Selecting a story opens the corresponding tiddlers.
*''popup''<br>shows a popup display containing a list of all saved stories, plus additional commands/viewing options.  Selecting a story opens the corresponding tiddlers.  ''label'' and ''tooltip'' are optional and provide alternative display text and mouseover help text, respectively.
*''storyname''<br>is a tiddler containing a saved story.  //Note: You can also use a tag value as a storyname, in which case the story view will be composed of all tiddlers tagged with the specified tag value.//
*''label''<br>is the command link text (default: "open story: %0", where %0 is replaced by the storyname).
*''tooltip''<br>is the command mouseover guide-text (default: "open the set of tiddlers listed in: '%0'"),
*''tagValue'' (optional, default='story')<br>specifies an alternative tag value to match when listing story tiddlers.  Note: if MatchTagsPlugin is installed, you can also use a compound //boolean tag expression//, enclosed within doubled square brackets.
*''fold''<br>If this optional keyword is present, the story tiddlers are initially 'folded' using [[CollapsedTemplate]] instead of the usual [[ViewTemplate]] (see [[CollapseTiddlersPlugin]]).

__''excludeStory tag:''__
Any tiddlers tagged with<<tag excludeStory>>will be automatically omitted when creating new story tiddlers with {{{<<saveStory>>}}}.  Similarly, if a tiddler that is part of a saved story is tagged with<<tag excludeStory>>, it will not be displayed when that story is opened via {{{<<openStory>>}}}.

__''PermaView command link enhancement:''__
In order to further aide in saving/restoring the list of tiddlers currently being viewed, the core {{{<<permaview>>}}} command has been enhanced, so its link value always includes the current story view tiddler list as a paramifier in the URL.  This let you quickly use the browser's right-click menu directly on the permalink command text to "bookmark this link...".  Depending upon your system, you may also be able to drag the 'permaview' link directly from the page and drop it onto your desktop to create an instant permaview-bearing URL shortcut icon.
<<<
!!!!!Examples
<<<
*{{{<<saveStory TestStory "save a test story">>}}}<br>{{smallform{<<saveStory TestStory "save a test story">>}}}
*{{{<<openStory TestStory>>}}}<br><<openStory TestStory>>
*{{{<<openStory list>>}}}<br>{{smallform{<<openStory list>>}}}
*{{{<<openStory popup label tooltip>>}}}<br>{{smallform{<<openStory popup>>}}}
<<<
!!!!!Configuration
<<<
<<option chkSaveStory>> use automatic story cookie (reopens tiddlers on startup)
<<option chkStoryAllowAdd>>include 'add a story' command in droplist/popup
<<option chkStoryFold>>fold story tiddlers when opening a story (see [[CollapseTiddlersPlugin]])
<<option chkStoryClose>>close other tiddlers when opening a story
<<option chkStoryTop>>open story tiddlers at top of column
<<option chkStoryBottom>>open story tiddlers at bottom of column
<<<
!!!!!Revisions
<<<
2009.10.20 1.8.3 fix handling for 'add' item in popup menu
2009.08.29 1.8.2 added 'return false' to all button handlers to fix IE page-transition error
2009.08.23 1.8.1 fixed 'excludeStory' handling for links to missing tiddlers
2009.08.20 1.8.0 added 'excludeStory' tag handling
2009.07.27 1.7.1 corrected test for {{{chkStoryAllowAdd}}} when rendering //list// output
2009.07.27 1.7.0 added options: {{{chkStoryAllowAdd=true}}}, {{{chkStoryTop=true}}}, and {{{chkStoryBottom=false}}}.  Also, autoscroll to first tiddler in story
2009.07.26 1.6.0 added optional 'extratags' param to {{{<<saveStory>>}}} and 'tagfilter' to {{{<<openStory>>}}}
2009.07.06 1.5.1 in setTiddler(), use pushUnique() to avoid double 'story' tag
2009.04.24 1.5.0 added optional 'fold' param to {{{<<openStory StoryName ...>>}}} macro
2008.09.07 1.4.3 added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.07.11 1.4.2 in confirmExit(), corrected bracketing for titles containing spaces
2008.03.10 [*.*.*] plugin size reduction: documentation moved to [[StorySaverPluginInfo]]
2008.01.01 1.4.1 sort list of stories alphabetically
2008.01.01 1.4.0 added popup option
2007.12.31 1.3.1 instead of readBracketedList(), use internal tiddler.links[] to retrieve story list from tiddler content. Allows more flexible formatting of story tiddler content: anything content that is not a tiddler link is automatically filtered out of the list.
2007.10.23 1.3.0 split {{{<<storyViewer>>}}} macro definition into stand-alone [[StoryViewerPlugin]] to allow separate installation of story saving vs. story viewing features.
2007.10.21 1.2.0 added {{{<<openStory>>}}} and {{{<<storyViewer>>}}} macros.
2007.10.20 1.1.0 in setTiddler(), automatically add "story" tag to saved story tiddlers
2007.10.18 1.0.1 added default initialization for chkSaveStory option value.  Also, in setTiddler(), call displayTiddler() after saving story to ensure that altered tiddler is shown to the user.
2007.10.05 1.0.0 initial release.   Moved [[SetDefaultTiddlers]] inline script and rewrote as a {{{<<saveStory>>}}} macro.  Moved permaview "mouseover HREF" enhancement from [[CoreTweaks]].
<<<
/***
|Name|[[StoryViewerPlugin]]|
|Source|http://www.TiddlyTools.com/#StoryViewerPlugin|
|Documentation|http://www.TiddlyTools.com/#StoryViewerPluginInfo|
|Version|1.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|view a set of tiddlers using a droplist, "first/previous/next/last" links, or timed slideshow|
The {{{<<storyViewer>>}}} macro allows you to quickly ''display //and// navigate between a set of tiddlers'', using a droplist of titles and/or individual "first/previous/next/last" buttons/text links.  It also provides a "slideshow" feature that permits you to ''present one tiddler at a time with a countdown timer to automatically advance to the next tiddler'' after a specified number of seconds.
!!!!!Documentation
> see [[StoryViewerPluginInfo]]
!!!!!Revisions
<<<
2011.03.11 1.4.0 added 'sort:fieldname' parameter
2011.01.24 1.3.4 in droplist onchange handler, don't clear slideshow 'started' flag (allows slideshow to continue after manual navigation)
|please see [[StoryViewerPluginInfo]] for additional revision details|
2007.10.23 1.0.0 Initial release, split {{{<<storyViewer>>}}} macro definition from [[StorySaverPlugin]] to allow separate installation of story saving vs. story viewing features.
<<<
!!!!!Code
***/
//{{{
version.extensions.StoryViewerPlugin= {major: 1, minor: 4, revision: 0, date: new Date(2011,3,11)};

config.macros.storyViewer = {
    tag:            "story",
    storynotfoundmsg:   "'%0' is an empty/unrecognized story",
    firstcmd:       "first",
    firstbutton:        "<<",
    firstmsg:       "first: '%0'",
    nextcmd:        "next",
    nextbutton:     ">",
    nextmsg:        "next: '%0'",
    previouscmd:        "previous",
    previousbutton:     "<",
    prevmsg:        "previous: '%0'",
    lastcmd:        "last",
    lastbutton:     ">>",
    lastmsg:        "last: '%0'",
    refreshmsg:     "redisplay '%0'",
    refreshmsg:     "",
    autostart:      false,
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {

        var parsed=paramString.parseParams('anon',null,true,false,false);
        var here=story.findContainingTiddler(place);
        if (here) var tid=here.getAttribute("tiddler");
        var storyname="";
        var p=params.shift();
        var keywords=['first','previous','here','next','last','list','links','timer','sort'];
        if (!p || keywords.indexOf(p.split(':')[0])!=-1) {
            // find story from current tiddler name
            if (!tid) return; // not in a tiddler... do nothing!
            var stories=store.getTaggedTiddlers(this.tag);
            if (!stories) return;
            for (var s=0; s<stories.length; s++) {
                if (!stories[s].linksUpdated) stories[s].changed();
                var tids=stories[s].links.slice(0);
                if (tids.contains(tid)) { storyname=stories[s].title; break; }
            }
            if (!storyname.length) return; // current tiddler is not part of a saved story
        }
        else { storyname=p; p=params.shift(); } // user-specified story name

        var sortby=getParam(parsed,'sort','title');
        var tids=this.getStory(storyname,sortby); // get tiddler list

        var target=null;
        switch (p?p.split(':')[0]:'') {
            case 'first':
                target=tids[0];
                break;
            case 'previous':
                var i=tids.indexOf(tid);
                if (i!=-1) var target=tids[Math.max(i-1,0)];
                break;
            case 'here':
                if (tid) target=tid;
                break;
            case 'next':
                var i=tids.indexOf(tid);
                if (i!=-1) var target=tids[Math.min(i+1,tids.length-1)];
                break;
            case 'last':
                target=tids[tids.length-1];
                break;
            case 'links':
                this.renderAllLinks(place,storyname);
                break;
            case 'timer':
                var delay=parseInt(getParam(parsed,'timer',15))*1000; // msecs between slides
                var autostart=params[0]=='autostart'; if (autostart) params.shift();
                var action=params[0]; // null/close/fold
                this.renderTimer(place,tids,tid,delay,autostart,action);
                break;
            case 'list':
            default:
                var prompt=getParam(parsed,'prompt',storyname+'...');
                var nobuttons=params.contains("nobuttons");
                var allbuttons=params.contains("allbuttons");
                var onlybuttons=params.contains("onlybuttons");
                this.renderList(place,tids,tid,storyname,prompt,nobuttons,allbuttons,onlybuttons);
                break;
        }
        var label=getParam(parsed,'label',params[0]||target);
        if (target) this.renderLink(place,tid,target,label);
    },
    getStory: function(storyname,sortby) { // READ TIDDLER LIST
        var tids=[];
        var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
        var tagged=store.sortTiddlers(fn.apply(store,[storyname]),sortby||'title');
        if (tagged.length) // if storyname is a tag, get tagged tiddlers rather than links
            for (var t=0; t<tagged.length; t++) tids.push(tagged[t].title);
        else {
            var t=store.getTiddler(storyname);
            if (t && !t.linksUpdated) t.changed();
            var tids=t?t.links.slice(0):[];
        }
        return tids;
    },
    renderLink: function(place,tid,target,label) {
        // override default labelling with specified text (if any)
        if (tid==target) { // self-referential links turn into 'refresh links'
            var btn=createTiddlyButton(place,null,this.refreshmsg.format([tid]), function() {
                var here=story.findContainingTiddler(place).getAttribute("tiddler");
                story.refreshTiddler(here,null,true);
            });
            wikify(label,btn);
        }
        else // create link
            wikify(label,createTiddlyLink(place,target,false));
    },
    renderAllLinks: function(place,storyname) {
        var out="{{floatleft{";
        out+="<<storyViewer [["+storyname+"]] first first>> &nbsp;";
        out+="<<storyViewer [["+storyname+"]] previous previous>> &nbsp;";
        out+="}}}";
        out+="{{floatright{";
        out+="&nbsp; <<storyViewer [["+storyname+"]] next next>>";
        out+="&nbsp; <<storyViewer [["+storyname+"]] last last>>";
        out+="}}}";
        out+="{{center{<<storyViewer [["+storyname+"]] here>>}}}";
        wikify(out,place);
    },
    renderList: function(place,tids,tid,storyname,prompt,nobuttons,allbuttons,onlybuttons) {
        var h="";
        h+='<form style="display:inline">';
        if ((!nobuttons||onlybuttons) && allbuttons) {
            h+='<input type="button" value="'+this.firstbutton+'" ';
            h+='    style="padding:0" title="'+(tids[0]?this.firstmsg.format([tids[0]]):'')+'"';
            h+=' onclick="if (this.form.list.length<2) return; ';
            h+='    this.form.list.selectedIndex=1; this.form.list.onchange();">';
        }
        if (!nobuttons||onlybuttons) {
            h+='<input type="button" value="'+this.previousbutton+'" style="padding:0 0.3em"';
            h+=' onclick="if (this.form.list.length<2) return; ';
            h+='    var i=this.form.list.selectedIndex-1; if (i<1) i=1; ';
            h+='    this.form.list.selectedIndex=i; this.form.list.onchange();"';
            h+=' onmouseover="if (this.form.list.length<2) return; ';
            h+='    var i=this.form.list.selectedIndex-1; if (i<1) i=1; ';
            h+='    var v=this.form.list.options[i].value; if (!v.length) return; ';
            h+='    this.title=config.macros.storyViewer.prevmsg.format([v]);">';
        }
        h+='<select size="1" name="list"';
        if (onlybuttons) h+=' style="display:none;"';
        h+=' onchange="if (this.value) story.displayTiddler(this,this.value);">';
        h+='<option value="">'+prompt+'</option>';
        for (i=0; i<tids.length; i++) {
            h+='<option '+
                (tids[i]==tid?'selected ':'')+
                'value="'+tids[i]+'">\xa0\xa0'+tids[i]+'</option>';
        }
        h+='</select>';
        if (!nobuttons||onlybuttons) {
            h+='<input type="button" value="'+this.nextbutton+'" style="padding:0 0.3em"';
            h+=' onclick="var i=this.form.list.selectedIndex+1; ';
            h+='    if (i>this.form.list.options.length-1) i=this.form.list.options.length-1; ';
            h+='    this.form.list.selectedIndex=i; this.form.list.onchange();"';
            h+=' onmouseover="var i=this.form.list.selectedIndex+1; ';
            h+='    if (i>this.form.list.options.length-1) i=this.form.list.options.length-1; ';
            h+='    var v=this.form.list.options[i].value; if (!v.length) return;';
            h+='    this.title=config.macros.storyViewer.nextmsg.format([v]);">';
        }
        if ((!nobuttons||onlybuttons) && allbuttons) {
            h+='<input type="button" value="'+this.lastbutton+'" ';
            h+='    style="padding:0" title="'+(tids[tids.length-1]?this.lastmsg.format([tids[tids.length-1]]):'')+'"';
            h+=' onclick="this.form.list.selectedIndex=this.form.list.options.length-1; this.form.list.onchange();">';
        }
        h+='</form>';
        createTiddlyElement(place,"span").innerHTML=h;
    },
    renderTimer: function(place,tids,tid,delay,autostart,action) {
        var now=new Date().getTime(); // msec
        var target=createTiddlyElement(null,'input',now+Math.random()); // unique ID
        target.setAttribute('type','button'); target.style.padding='0';
        place.appendChild(target);
        target.tid      =tids[Math.min(tids.indexOf(tid)+1,tids.length-1)]||''; // next tiddler
        target.action       =action;
        target.formatTimer  =this.formatTimer;
        target.start        =this.startTimer;
        target.stop     =this.stopTimer;
        target.onmouseover  =this.pauseTimer;
        target.onmouseout   =this.resumeTimer;
        target.tick     =this.timerTick;
        target.onclick      =this.timerClick;
        target.next     =this.timerNext;
        target.start(delay,autostart);
    },
    formatTimer: function(t) {
        return '0:'+String.zeroPad(Math.floor(t/1000),2);
    },
    startTimer: function(delay,start) {
        var co=config.options; // abbrev
        start=config.macros.storyViewer.started=start||config.macros.storyViewer.started;
        var now=new Date().getTime(); // msec
        this.started=start;
        this.delay=delay;
        this.paused=start?0:delay;
        this.stopTime=now+delay; // msec
        this.title='CLICK='+(start?'reset':'start')+" slideshow timer... next: '"+this.tid+"'";
        this.style.cursor='pointer';
        this.value=this.formatTimer(delay);
        if (start) {
            var code="var e=document.getElementById('"+this.id+"'); if(e)e.tick()";
            this.timer=setTimeout(code,500);
        }
        return false;
    },
    stopTimer: function() {
        this.timer=clearTimeout(this.timer);
        this.started=config.macros.storyViewer.started=false;
        this.paused=0;
        this.title="CLICK=start slideshow timer... next: '"+this.tid+"'";
        this.value=this.formatTimer(this.delay);
        return false;
    },
    pauseTimer: function() {
        if (!this.started) return;
        var now=new Date().getTime(); // msec
        this.paused=Math.max(this.stopTime-now,0);
        this.stopTime=now+this.paused;
        return false;
    },
    resumeTimer: function() {
        if (!this.started || !this.paused) return;
        var now=new Date().getTime(); // msec
        this.stopTime=now+this.paused;
        this.paused=0;
        return false;
    },
    timerTick: function() {
        var now=new Date().getTime(); // msec
        if (!this.started)
            this.stopTime=now+this.delay;
        else if (this.paused) {
            this.stopTime=now+this.paused;
            this.title="[PAUSED] MOUSEOUT=resume, CLICK=reset... next: '"+this.tid+"'";
        }
        var remaining=this.stopTime-now;
        if (remaining>0) {
            if (this.started && !this.paused) this.value=this.formatTimer(remaining);
            var code="var e=document.getElementById('"+this.id+"'); if(e)e.tick()";
            this.timer=setTimeout(code,500);
        } else {
            this.stop();
            this.next();
        }
        return false;
    },
    timerClick: function() {
        return this.started?this.stop():this.start(this.delay,true);
    },
    timerNext: function() { // OPEN NEXT TIDDLER
        var here=story.findContainingTiddler(this);
        config.macros.storyViewer.started=true; // next slide autostarts to continue slideshow
        if (this.tid) story.displayTiddler(here,this.tid);
        config.macros.storyViewer.started=false;
        if (!here) return false;
        var t=here.getAttribute('tiddler');
        if (this.action=='close') story.closeTiddler(t);
        if (this.action=='fold' && config.commands.collapseTiddler) // see CollapseTiddlerPlugin
            config.commands.collapseTiddler.handler(null,here,t);
        return false;
    }
}
//}}}
//{{{
config.paramifiers.story = {
    onstart: function(v) {
        var t=store.getTiddler(v); if (t) t.changed();
        var list=t?t.links:store.getTiddlerText(v,"").parseParams("open",null,false);
        story.displayTiddlers(null,list);
    }
};
//}}}
/***
|Name|StoryViewerPluginInfo|
|Source|http://www.TiddlyTools.com/#StoryViewerPlugin|
|Documentation|http://www.TiddlyTools.com/#StoryViewerPluginInfo|
|Version|1.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for StoryViewerPlugin|
The {{{<<storyViewer>>}}} macro allows you to quickly ''display //and// navigate between a set of tiddlers'', using a droplist of titles and/or individual "first/previous/next/last" buttons/text links.  It also provides a "slideshow" feature that permits you to ''present one tiddler at a time with a countdown timer to automatically advance to the next tiddler'' after a specified number of seconds.
!!!!!Usage
<<<
{{{
<<storyViewer storyname|tagvalue list buttonoption prompt:... sort:...>>
<<storyViewer storyname|tagvalue first|previous|here|next|last sort:...>>
<<storyViewer storyname|tagvalue links sort:fieldname>>
<<storyViewer storyname|tagvalue timer:nnn autostart close|fold sort:...>>
}}}
where:
* ''storyname'' or ''tagvalue''<br>specifies a set of tiddler titles, defined either by matching a tag value, or by creating a tiddler, tagged with <<tag story>>, containing a space-separated list of titles.  //Note: You can use the {{{<<saveStory>>}}} macro (see [[StorySaverPlugin]]) to automatically create stories using the titles of the tiddlers that are currently being viewed.//  If you omit the storyname/tagname parameter, the plugin will attempt to identify a suitable story by locating the current tiddler title within a saved story tiddler.  The story view controls are not displayed unless the current tiddler title is explicitly found in at least one saved story.
** Note: if [[MatchTagsPlugin]] is installed, you can use a compound //boolean tag expression//, enclosed within doubled square brackets.  This allows you to generate sets of stories based on complex combinations of tags, rather than matching just one tag value.  [[MatchTagsPlugin]] also allows you to use a //wildcard// expression, ".*" (without quotes), that will match all tiddlers, regardless of their tag value(s).
* ''list''<br>displays a droplist of tiddlers for the specified story, with previous/next pushbuttons on either side of the list.  You can also specify which buttons will appear when using a droplist:
** ''allbuttons''<br>displays buttons for first/last as well as previous/next.
** ''nobuttons''<br>displays the droplist without any buttons
** ''onlybuttons''<br>hides the droplist and shows just the buttons
* ''prompt:...'' (default={{{"storyname..."}}})<br>specifies non-selectable label text to use as the first item in the droplist.
* ''sort:fieldname'' //(optional)//<br>when a ''tagvalue'' is used to select tiddlers, you can specify a tiddler fieldname that can be used to sort the resulting list of tiddlers, with an optional "-" prefix to indicate descending vs. ascending ordering, e.g, "sort:-modified" will generate a list of tiddlers in reverse date order (newest tiddler first).
* ''first'' or ''previous'' or ''here'' or ''next'' or ''last''<br>displays an individual link to the indicated tiddler within the story. The next/previous links are automatically calculated relative to the current tiddler.  ''here'' displays the current tiddler title.
* ''links''<br>displays the set of first, previous, here, next and last links with just one convenient macro invocation, allowing you to quickly and easily embed story navigation links into any tiddler content.
* ''timer:nnn''<br>displays an automatic countdown 'slideshow' timer, where ''nnn'' is the number of seconds between slides.  Click on the timer to start the countdown.  The countdown is paused when hovering over the timer.  Click a //running// timer to immediately advance to the next tiddler in the story.  Optional slideshow parameters:
** ''autostart''<br>automatically starts the countdown without an initial click.
** ''close'' or ''fold''<br>close or fold (see [[CollapseTiddlerPlugin]]) the current tiddler when the next tiddler in the story is opened. The default is to simply display the next tiddler following the current one.
<<<
!!!!!Examples
<<<
{{smallform{
{{{
<<storyViewer MenuDefinitions list nobuttons>>
}}}
><<storyViewer MenuDefinitions list nobuttons>> //uses "saved story" tiddler//
{{{
<<storyViewer pluginInfo>>
}}}
><<storyViewer pluginInfo>>
{{{
<<storyViewer pluginInfo list allbuttons prompt:"TiddlyTools menu definitions...">>
}}}
><<storyViewer pluginInfo list allbuttons prompt:"TiddlyTools menu definitions...">>
{{{
<<storyViewer pluginInfo first>>
<<storyViewer pluginInfo previous>>
<<storyViewer pluginInfo next>>
<<storyViewer pluginInfo last>>
}}}
><<storyViewer pluginInfo first>>
><<storyViewer pluginInfo previous>>
><<storyViewer pluginInfo next>>
><<storyViewer pluginInfo last>>
{{{
<<storyViewer pluginInfo previous label:"back">>
<<storyViewer pluginInfo next label:"forward">>
}}}
><<storyViewer pluginInfo previous label:"back">>
><<storyViewer pluginInfo next label:"forward">>
{{{
<<storyViewer pluginInfo links>>
}}}
><<storyViewer pluginInfo links>>
{{{
<<storyViewer pluginInfo timer:20 fold>>
}}}
><<storyViewer pluginInfo timer:20 fold>>
{{{
<<storyViewer ".*" prompt:"timeline..." sort:-modified>>
}}}
><<storyViewer ".*" prompt:"timeline..." sort:-modified>>
}}}
<<<
!!!!!Revisions
<<<
2011.03.11 1.4.0 added 'sort:fieldname' parameter
2011.01.24 1.3.4 in droplist onchange handler, don't clear slideshow 'started' flag (allows slideshow to continue after manual navigation)
2011.01.12 1.3.3 added config.macros.storyViewer.started (controls 'autostart' for automatic presentation of multiple pages)
2011.01.11 1.3.2 use pushbutton instead of text to display slideshow timer
2011.01.11 1.3.1 code and documentation cleanup
2011.01.10 1.3.0 added slideshow (params= timer:nnn, autostart, close/fold).  Added custom prompt for droplist (param= prompt:"text"). Added support for [[MatchTagsPlugin]]
2008.06.05 1.2.0 added custom story paramifier to extract story titles from tiddler links instead of using parseParams.  Permits use of links from any tiddler as a story, even if it contains wiki-syntax formatting in addition to list of tiddler titles
2008.03.10 *.*.* plugin size reduction: documentation moved to [[StoryViewerPluginInfo]]
2007.12.31 1.1.0 instead of readBracketedList(), use internal tiddler.links[] to retrieve story list from tiddler content.  Allows more flexible formatting of story tiddler content.
2007.12.04 *.*.* update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.10.23 1.0.0 Initial release, split {{{<<storyViewer>>}}} macro definition from [[StorySaverPlugin]] to allow separate installation of story saving vs. story viewing features.
<<<
* [[Stress-internalized]]


Year 24

I have been looking carefully at stress and how it has increased or mounted for us.  I've been reckoning the increase in my personal stress load that is directly based on T's stress load.  Analyzing this, I see that each one of us has a reciprocal response to the others stress.  Her response is based in the strange ownership of another's problems – a characteristic of ASD.  I think that Katrine Bentley discusses this in her book.  My response to her stress is complicated.  I have learned so much about that in the last few weeks.  Basically it involves managing, coaching, and pulling her through all of life's adventures, with many ramifications to my own life management.  A significant aspect is what's the source of stress is before all of that.  We have, of course, our external stressors – things we can't really change.  We have some big ones now, very big; whether you look at the six month window for the three-year window, there is little a lot going on with our children, our church life.

One aspect that is not so stressful as it has been in the past is medical and health issues for T.  But now I have come to see how that sets up dynamics that are difficult to manage in this area of stress.  Her energy has increased a great deal over the last two years.  This energy can be looked at as physical energy (the number of spoonfuls of energy available for the day), and also psychic or soul energy.  (I worry about this term psychic because I think T will conclude I am interested in the occult, but it's the best word I know for the energy of the person at a core level.)  T's available psychic energy is often expressed by her in these words: "I can speak it now."

Because T has more energy to invest in life.  She has more capacity for social interactions and relationships.  This is very good, but the problem is that her stress overhead increases proportionally.  All the new processing creates stress and this adds to her anxiety, worry and guilt autism spectrum disorder creates corollary effects of fear and shame, and of these all add to T's stress level.  And this is what enters the cycle for reciprocating stress response that I mentioned earlier.

So, it seems to me now that measuring external stressors to make an assessment about our overall stress load is not very effective for getting the whole picture.

This explains a great deal about why I turn off and reject T in social situations.  I am defending my own strength and energy by making protests (often passively) about her attempts at ministry for growing friendship, or any public role.
Medical and health issues.  
* teeth grinding
* poor sleep
Nightmares. 
Year 22

R. in HS. 
/*{{{*/

.rf {font-family: calibri, arial; color: brown; font-size:.7em; font-weight: bold; }
.rf .big {font-size:2em; }

.hilite   {background:#ffc; color:#000; border:2px solid #79d; margin:6px 12px 6px 24px;padding:5px;}
.holyquote   {background:#FDF5E6; color:#000; border:1px solid brown; margin:6px 12px 6px 24px;padding:5px;}
.fyi   {background:#FCFDFD; color:#009; border:1px solid #009; margin:6px 12px 6px 24px;padding:5px;}
.anti {color:#903;}
.anti a:link  {color:#903;}

div[tags~="Scriptr"].tiddler .viewer {
   font-family:georgia;
   background: #FDF5E6;
   font-size:1.1em;
   /*background-image: url("./Bbl/parchment.jpg");*/
   /* FFF0F5 */
   /* FFEFD5 */
}

div[tags~="Comment"].tiddler .viewer {
   background-color: #F5F8FA;
}

div[tags~="Comment"].tiddler .viewer a.tiddlyLinkExisting  /*, .tiddlyLink*/
    {
        background-color: #F0F8FF;

    }

.tiddler .viewer a.tiddlyLinkExisting  /*, .tiddlyLink*/
    {
        border: 1px solid #ADD8E6;
        color:  black;
        padding-left:  2px;
        padding-right:  2px;
        margin-left:  2px;
        margin-right:  2px;
    }
.tiddler .viewer a.tiddlyLinkExisting:hover  /*, .tiddlyLink*/
    {
        color:  white;
    }

[[StyleSheetAdjustments]]
[[StyleSheetShortcuts]]

/*.siteNav    { position:absolute;z-index:1;right:.5em;top:2em;width:14em; }
.siteNav    { position:absolute;right:.5em;top:2em;width:14em; }
.siteNav .siteNav .button  { color:#fff }
.siteNav .button:hover  { color:#009 }
.siteNav input[type="checkbox"]   { margin:0; }
*/

/*.matchTags .popup*/

.searchBox { text-align:left; background-color: [[ColorPalette::TertiaryPale]]; font-size:0.8em; position:absolute;left:640px;top:22px;width:200px; }
.searchBox .button:hover  { color:#009 }
.searchBox input[type="text"]   { width:10em; }


.commandBox    { display:block;text-align:left; background-color: [[ColorPalette::TertiaryPale]]; font-size:0.8em; position:absolute;left:340px;top:22px;width:280px; }
.commandBox .button:hover  { color:#009 }
.commandBox input[type="checkbox"]   { margin:0; }

.buttonMenu .imgLink, #hoverMenu .imgLink:hover {border:none; padding:0px; float:right; margin-bottom:2px; margin-top:0px;}
.buttonMenu  .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; margin-bottom:4px;}
.buttonMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#fff; background:#000; padding:0 5px; float:right; margin-bottom:4px;}
.buttonMenu .button {width:7px; text-align:center}
/*.buttonMenu { position:absolute; width:7px;}*/


.tabAllSlider .button
{
display: inline-block;
font-family: Consolas,'Courier New',courier,monospace;
font-weight:bold; border:none; background:[[ColorPalette::SecondaryMid]]; color:#fff;
}

.tabAllSlider .button:hover
{
background:[[ColorPalette::PrimaryDark]];
}

#sidebarTabs .button
{
margin-top: 0em;
margin-right: 0.2em;
margin-bottom: 0em;
margin-left: 0.2em;
padding-top: 0.2em;
padding-right: 0.3em;
padding-bottom: 0.2em;
padding-left: 0.3em;
display: inline;
}

.mapH1 {
    font-weight:bold;
    text-decoration:none;
    display: block;
    font-size: 1.5em; /* 1.35em;*/
    margin-bottom:5px;
    margin-left:12px;
}

.mapH1 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}

.mapH1 {
    /*border-bottom:2px solid [[ColorPalette::TertiaryLight]];*/
}

.sliderPanel .mapH1 {
    font-size: 1em;
    /*border-top:2px solid [[ColorPalette::TertiaryLight]];
    border-bottom:2px solid [[ColorPalette::TertiaryLight]];
    margin-top:5px;*/
}

.tabContents .dp100 {
    font-size: .9em;
        font-weight:normal;
}

.tabContents .dp100 ul {
    margin:     5px 0px;
    /*padding-bottom: 5px;
    border-bottom:   solid 1px [[ColorPalette::TertiaryLight]];*/
    list-style-type: none;
}

[[EmasticStyleSheet]]
[[EmasticPercent]]
/***
!!!Printing
***/
@media print {#mainMenu {display: none ! important;}}
@media print {#topMenu {display: none ! important;}}
@media print {#sidebar {display: none ! important;}}
@media print {#messageArea {display: none ! important;}}
@media print {#toolbar {display: none ! important;}}
@media print {.header {display: none ! important;}}
@media print {.tiddler .subtitle {display: none ! important;}}
@media print {.tiddler .toolbar {display; none ! important; }}
@media print {.tiddler .tagging {display; none ! important; }}
@media print {.tiddler .tagged {display; none ! important; }}

[[StyleSheetPrint]]

/*}}}*/
/*{{{*/
/* ADJUSTMENTS TO STANDARD ELEMENTS */

body {background-color: #FCFDFD; font-size:0.85em; font-family:calibri,arial,helvetica;}

.headerShadow, .headerForeground
    { padding-top:1em; white-space:nowrap; }

#siteNav {top:1em; left:50%; margin:0.5em; padding:0.5em; z-index:1000; _position:absolute;}
.siteNav {display:block; text-align:right; padding:0.2em;}

#mainMenu
    { text-align:left; width:14em; padding:0.5em; }
#mainMenu table, #mainMenu table td
    { border:1px solid #999; border-collapse:collapse; padding:.3em; }
#displayArea
    { margin-left:16em; margin-right:15em; }
.popup
    { max-height:30em; overflow:auto; border-radius:5px;  padding:.5em; }
.popup li
    { white-space:nowrap; line-height:100%; }
.toolbar
    { float:right; white-space:nowrap; }
.viewer
    { border:1px solid gray; border-radius:5px;  padding:.5em; }
.tiddler {background-color: #FFF;}
.tiddler .title
    { color: [[ColorPalette::QuaternaryDark]]; }
.tiddler h1, h2, h3, h4, h5, h6
    { color: [[ColorPalette::QuaternaryDark]]; }
.tiddler .subtitle
    { display:inline; }
.tagged
    { border:1px solid #999; border-radius:3px; }
.tagged
    { opacity:.7; }
.selected .tagged
    { opacity:1; }


a.bibleLink:link
    {
	/*color: brown;*/
	color: black;
        background-color: #FFD;
	border-bottom: 1px solid #FCC;
    }
.button, .tiddler .button, #sidebarTabs .button
    { margin:0px; padding: 0px .3em; border:1px solid transparent;
        border-radius:1px; }
.button:hover
    { border:1px solid #999; }
#sidebarTabs .button
    { margin:0px 0.2em; padding:0.2em 0.3em; border:1px solid transparent;
        border-radius:3px; display:block; }
#sidebarTabs .button:hover
    { border:1px solid #999; }
.editor textarea
    { font-family:monospace; }
.tab
    {   padding-bottom:1px;
        border-radius-topleft:3px;
        border-radius-topright:3px;
    }
.tabContents
    { border-radius:5px;  }
.tabContents, .tabSelected
    { background-color:#eef; }
.tabUnselected
    { background-color:#79d; }
/*}}}*/
/***
|Name|StyleSheetPlugins|
|Source|http://www.TiddlyTools.com/#StyleSheetPlugins|
|Version||
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|CSS|
|Description|custom definitions for plugin-specific ID's and classes|
>Important Note: ''this tiddler is highly-customized for the TiddlyTools document'' and you may need to extensively modify, supplement, replace or remove portions of these definitions in order to best fit //YOUR// document needs.
***/
/***
!MoveablePanelPlugin - searchResults
***/
/*{{{*/
.undocked .searchResults {
    border:1px solid #abe; border-radius:2px;
    padding:0em; background:#003; min-width:35em;
}
.undocked .searchResults .title { margin-left:.5em; }
.undocked .searchResults .viewer { -moz-border-radius: 0 0 1em 1em; }
.undocked .searchResults .viewer ul { max-height:20em; overflow:auto; }
.undocked .searchResults .toolbar { margin-top:.3em; padding-right:.5em; }
/*}}}*/
/***
!PageTemplate - siteMenu
***/
/*{{{*/
.siteMenu
    { background:transparent; padding:.5em; padding-top:0; margin:0; }
.siteMenu a, .siteMenu .button, .siteMenu .tiddlyLinkExisting, .siteMenu .tiddlyLinkNonExisting
    { font-weight: normal; font-style: normal; }
/*** LEAVE THESE OUT FOR NOW
.siteMenu .button, .siteMenu a
    { border:1px solid transparent; background:transparent; margin:0px; padding:0px 1px;  border-radius:3px; }
.siteMenu .button:hover, .siteMenu a:hover
    { border:1px solid #69c; background:#006; color:#fff; }
***/
/*}}}*/
/***
!PageTemplate - storyMenu
***/
/*{{{*/
.storyMenu
    { display:block; margin:0em 1em .5em 1em; }
.storyMenu a, .storyMenu .button, .storyMenu .tiddlyLinkExisting, .storyMenu .tiddlyLinkNonExisting
    { font-weight: normal; font-style: normal; text-decoration:none; }
/*}}}*/
/***
!NestedSlidersPlugin
***/
/*{{{*/
.floatingPanel
    { z-index:700; padding:1em; margin:0em; border:1px solid;  border-radius:2px; font-size:8pt; text-align:left; }
.floatingPanel hr
    { margin:2px 0 1px 0; padding:0; }
#sidebarOptions .sliderPanel
    { margin:0; padding:0; font-size:1em; background:transparent; }
#sidebarOptions .sliderPanel a
    { font-weight:normal; }
#sidebarOptions .sliderPanel blockquote
    { margin:0;padding:0;margin-left:1em; border-left:1px dotted; padding-left:1em }

.selected .floatingPanel .button,
.selected .floatingPanel a:link,
.selected .floatingPanel a:hover,
.selected .floatingPanel a:visited,
.floatingPanel .button,
.floatingPanel a:link,
.floatingPanel a:hover,
.floatingPanel a:visited
    { color:[[ColorPalette::PrimaryDark]] !important; }

/*}}}*/
/***
!CheckboxPlugin
***/
/*{{{*/
input[type="Checkbox"]
    { margin-top:2px;margin-bottom:2px; }
/*}}}*/
/***
!BreadcrumbsPlugin
***/
/*{{{*/
/* smaller size for bread crumbs (see BreadcrumbsPlugin) */
#breadCrumbs
    { display:none; margin:0em 1em; padding-bottom:.5em; font-size:7pt; } /* display:block is set by plugin when crumbs are in use */
/*}}}*/
/***
!TableOfContentsPlugin
***/
/*{{{*/
#sidebarTabs .tabContents *[class="TOCList"] /* MOZ ONLY */
    { background-color: transparent; border-color:transparent !important; }
/*}}}*/
/***
!AttachFilePlugin
***/
/*{{{*/
#sidebar .attachPanel
    { right:115%; top:3em; text-align:left; }
/*}}}*/
/***
!ImportTiddlersPlugin
***/
/*{{{*/
#sidebar #importPanel
    { right:115%; top:6em; text-align:left; }
/*}}}*/
/***
!ExportTiddlersPlugin
***/
/*{{{*/
#sidebar #exportPanel
    { right:115%; top:9em; text-align:left; }
/*}}}*/
/***
!QuoteOfTheDayPlugin
***/
/*{{{*/
.QOTD
    { color:inherit !important; background:inherit !important; }
/*}}}*/
/***
!TableSorterPlugin
***/
/*{{{*/
.sortedCol
    { color:inherit !important; background:inherit !important; }
/*}}}*/
/***
|Name|StyleSheetPrint|
|Source|http://www.TiddlyTools.com/#StyleSheetPrint|
|Version||
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|CSS|
|Description|adjustments for printing|
***/

/*{{{*/
@media print {

#mainMenu, #sidebar, #messageArea, .toolbar, .tagged, .tagging, .subtitle, .header
    {display: none !important;}
#breadCrumbs, #siteMenu, #storyMenu
    { display:none !important; }
#displayArea
    { margin: 1em !important; }
noscript /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
    { display:none; }
.tiddler
    { page-break-after:always; }
/*****
use this for 3x5 index cards:
.tiddler { height:3in !important; width:5in !important; overflow:none !important; }
*****/

}
/*}}}*/
/***
|Name|StyleSheetShortcuts|
|Source|http://www.TiddlyTools.com/#StyleSheetShortcuts|
|Version||
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|CSS|
|Description|'convenience' classes for common formatting, alignment, boxes, tables, etc.|

These 'style tweaks' can be easily included in other stylesheet tiddler so they can share a baseline look-and-feel that can then be customized to create a wide variety of 'flavors'.
***/
/*{{{*/

/* text alignments */
.left
    { display:block;text-align:left; }
.center
    { display:block;text-align:center; }
.center table
    { margin:auto !important; }
.right
    { display:block;text-align:right; }
.justify
    { display:block;text-align:justify; }
.indent
    { display:block;margin:0;padding:0;border:0;margin-left:2em; }
.floatleft
    { float:left; }
.floatright
    { float:right; }
.valignTop, .valignTop table, .valignTop tbody, .valignTop th, .valignTop tr, .valignTop td
    { vertical-align:top; }
.valignBottom, .valignBottom table, .valignBottom tbody, .valignBottom th, .valignBottom tr, .valignBottom td
    { vertical-align:bottom; }
.clear
    { clear:both; }
.wrap
    { white-space:normal; }
.nowrap
    { white-space:nowrap; }
.hidden
    { display:none; }
.show
    { display:inline !important; }
.span
    { display:span; }
.block
    { display:block; }
.relative
    { position:relative; }
.absolute
    { position:absolute; }

/* font sizes */
.big
    { font-size: 1.15em; }
.medium
    { font-size: 1.1em; }
.normal
    { font-size: 1em; }
.small
    { font-size: 0.96em; }
.fine
    { font-size: 0.92em; }
.tiny
    { font-size: 0.86em; }
/*
.big
    { font-size:14pt;line-height:120% }
.medium
    { font-size:12pt;line-height:120% }
.normal
    { font-size:9pt;line-height:120% }
.small
    { font-size:8pt;line-height:120% }
.fine
    { font-size:7pt;line-height:120% }
.tiny
    { font-size:6pt;line-height:120% }
.larger
    { font-size:120%; }
.smaller
    { font-size:80%; }
*/
/* font styles */
.bold
    { font-weight:bold; }
.italic
    { font-style:italic; }
.underline
    { text-decoration:underline; }

/* plain list items (no bullets or indent) */
.nobullets li { list-style-type: none; margin-left:-2em; }

/* vertical tabsets - courtesy of Tobias Beer */
.vTabs .tabset {float:left;display:block;padding:0px;margin-top:.5em;min-width:20%;}
.vTabs .tabset .tab {display:block;text-align:right;padding:2px 3px 2px 7px; margin:0 1px 1px 0;}
.vTabs .tabContents {margin-left:20%;max-width:80%;padding:5px;}
.vTabs .tabContents .tabContents {border:none; background:transparent;}

/* multi-column tiddler content (not supported in Internet Explorer) */
.twocolumns { display:block;
    -moz-column-count:2; -moz-column-gap:1em; -moz-column-width:50%; /* FireFox */
    -webkit-column-count:2; -webkit-column-gap:1em; -webkit-column-width:50%; /* Safari */
    column-count:2; column-gap:1em; column-width:50%; /* Opera */
}
.threecolumns { display:block;
    -moz-column-count:3; -moz-column-gap:1em; -moz-column-width:33%; /* FireFox */
    -webkit-column-count:3; -webkit-column-gap:1em; -webkit-column-width:33%; /* Safari */
    column-count:3; column-gap:1em; column-width:33%; /* Opera */
}
.fourcolumns { display:block;
    -moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%; /* FireFox */
    -webkit-column-count:4; -webkit-column-gap:1em; -webkit-column-width:25%; /* Safari */
    column-count:4; column-gap:1em; column-width:25%; /* Opera */
}

/* page breaks */
.breakbefore { page-break-before:always; }
.breakafter { page-break-before:always; }

/* show/hide browser-specific content for InternetExplorer vs. non-IE ("moz") browsers */
*[class="ieOnly"]
    { display:none; } /* hide in moz (uses CSS selector) */
* html .mozOnly, *:first-child+html .mozOnly
    { display: none; } /* hide in IE (uses IE6/IE7 CSS hacks) */

/* borderless tables */
.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody
    { border:0 !important; margin:0 !important; padding:0 !important; }
.widetable, .widetable table
    { width:98%; }

.fixedtable, .fixedtable table
    { width:98%; table-layout:fixed; }

/* thumbnail images (fixed-sized scaled images) */
.thumbnail img { height:5em !important; }

/* stretchable images (auto-size to fit tiddler) */
.stretch img { width:95%; }

/* grouped content */
.outline
    { display:block; padding:0.5em; border-radius:3px; border:1px solid; }
.menubox
    { display:block; padding:1em; border-radius:3px; border:1px solid; background:#fff; color:#000; }
.menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting
    { color:#009 !important; }
.groupbox
    { display:block; padding:1em; border-radius:5px; border:1px solid; background:#ffe; color:#000; }
.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting
    { color:#009 !important; font-size: 0.9em; }
.groupbox code
    { color:#333 !important; }
.borderleft
    { margin:0;padding:0;border:0;margin-left:1em; border-left:1px dotted; padding-left:.5em; }
.borderright
    { margin:0;padding:0;border:0;margin-right:1em; border-right:1px dotted; padding-right:.5em; }
.borderbottom
    { margin:0;padding:1px 0;border:0;border-bottom:1px dotted; margin-bottom:1px; padding-bottom:1px; }
.bordertop
    { margin:0;padding:0;border:0;border-top:1px dotted; margin-top:1px; padding-top:1px; }

/* scrolled content */
.scrollbars { overflow:auto; }
.height10em { height:10em; }
.height15em { height:15em; }
.height20em { height:20em; }
.height25em { height:25em; }
.height30em { height:30em; }
.height35em { height:35em; }
.height40em { height:40em; }

/* compact form */
.smallform
    { white-space:nowrap; }
.smallform input, .smallform textarea, .smallform button, .smallform checkbox, .smallform radio, .smallform select
    { font-size:8pt; }

/* stretchable edit fields and textareas (auto-size to fit tiddler) */
.stretch input { width:99%; }
.stretch textarea { width:99%; }

/* compact input fields (limited to a few characters for entering percentages and other small values) */
.onechar input   { width:1em; }
.twochar input   { width:2em; }
.threechar input { width:3em; }
.fourchar input  { width:4em; }
.fivechar input  { width:5em; }

/* text colors */
.white { color:#fff !important }
.gray  { color:#999 !important }
.black { color:#000 !important }
.red   { color:#f66 !important }
.green { color:#0c0 !important }
.blue  { color:#99f !important }

/* rollover highlighting */
.mouseover
    {color:[[ColorPalette::TertiaryLight]] !important;}
.mouseover a
    {color:[[ColorPalette::TertiaryLight]] !important;}
.selected .mouseover
    {color:[[ColorPalette::Foreground]] !important;}
.selected .mouseover .button, .selected .mouseover a
    {color:[[ColorPalette::PrimaryDark]] !important;}

/* rollover zoom text */
.zoomover
    { font-size:80% !important; }
.selected .zoomover
    { font-size:100% !important; }

/* [[ColorPalette]] text colors */
.Background { color:[[ColorPalette::Background]];    }
.Foreground { color:[[ColorPalette::Foreground]];    }
.PrimaryPale    { color:[[ColorPalette::PrimaryPale]];   }
.PrimaryLight   { color:[[ColorPalette::PrimaryLight]];  }
.PrimaryMid { color:[[ColorPalette::PrimaryMid]];    }
.PrimaryDark    { color:[[ColorPalette::PrimaryDark]];   }
.SecondaryPale  { color:[[ColorPalette::SecondaryPale]]; }
.SecondaryLight { color:[[ColorPalette::SecondaryLight]];}
.SecondaryMid   { color:[[ColorPalette::SecondaryMid]];  }
.SecondaryDark  { color:[[ColorPalette::SecondaryDark]]; }
.TertiaryPale   { color:[[ColorPalette::TertiaryPale]];  }
.TertiaryLight  { color:[[ColorPalette::TertiaryLight]]; }
.TertiaryMid    { color:[[ColorPalette::TertiaryMid]];   }
.TertiaryDark   { color:[[ColorPalette::TertiaryDark]];  }
.Error      { color:[[ColorPalette::Error]];     }

/* [[ColorPalette]] background colors */
.BGBackground     { background-color:[[ColorPalette::Background]];  }
.BGForeground     { background-color:[[ColorPalette::Foreground]];  }
.BGPrimaryPale    { background-color:[[ColorPalette::PrimaryPale]]; }
.BGPrimaryLight   { background-color:[[ColorPalette::PrimaryLight]];    }
.BGPrimaryMid     { background-color:[[ColorPalette::PrimaryMid]];  }
.BGPrimaryDark    { background-color:[[ColorPalette::PrimaryDark]]; }
.BGSecondaryPale  { background-color:[[ColorPalette::SecondaryPale]];   }
.BGSecondaryLight { background-color:[[ColorPalette::SecondaryLight]];  }
.BGSecondaryMid   { background-color:[[ColorPalette::SecondaryMid]];    }
.BGSecondaryDark  { background-color:[[ColorPalette::SecondaryDark]];   }
.BGTertiaryPale   { background-color:[[ColorPalette::TertiaryPale]];    }
.BGTertiaryLight  { background-color:[[ColorPalette::TertiaryLight]];   }
.BGTertiaryMid    { background-color:[[ColorPalette::TertiaryMid]]; }
.BGTertiaryDark   { background-color:[[ColorPalette::TertiaryDark]];    }
.BGError      { background-color:[[ColorPalette::Error]];       }
/*}}}*/
@@display:block;height:44em;overflow:auto;
<<matchTags "%0" " \n " NOT excludeLists AND NOT Scriptr AND NOT Comment >>
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.6.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for specific tiddlers|
This plugin extends the core function, story.chooseTemplateForTiddler(), so that any given tiddler can be viewed and/or edited using alternatives to the standard tiddler templates.
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.07.31 [1.6.0] added support for using custom field value as prefix
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 6, revision: 0, date: new Date(2009,7,31)};

if (!config.options.txtTemplateTweakFieldname)
    config.options.txtTemplateTweakFieldname='template';

Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
    // get core template and split into theme and template name
    var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
    var theme=""; var template=coreTemplate;
    var parts=template.split(config.textPrimitives.sectionSeparator);
    if (parts[1]) { theme=parts[0]; template=parts[1]; }
    else theme=config.options.txtTheme||""; // if theme is not specified
    theme+=config.textPrimitives.sectionSeparator;

    // look for template using title as prefix
    if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
        if (store.getTiddlerText(theme+title+template))
            { return theme+title+template; } // theme##TitleTemplate
        if (store.getTiddlerText(title+template))
            { return title+template; }   // TitleTemplate
    }

    // look for template using tags as prefix
    var tiddler=store.getTiddler(title);
    if (!tiddler) return coreTemplate; // tiddler doesn't exist... use core result
    for (i=0; i<tiddler.tags.length; i++) {
        var t=tiddler.tags[i]+template; // add tag prefix to template
        var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
        if (store.getTiddlerText(theme+t))  { return theme+t; } // theme##tagTemplate
        if (store.getTiddlerText(theme+c))  { return theme+c; } // theme##TagTemplate
        if (store.getTiddlerText(t))        { return t; }       // tagTemplate
        if (store.getTiddlerText(c))        { return c; }       // TagTemplate
    }

    // look for templates using custom field value as prefix
    var v=store.getValue(title,config.options.txtTemplateTweakFieldname);
    if (store.getTiddlerText(theme+v+template))
        { return theme+v+template; }    // theme##valueTemplate
    if (store.getTiddlerText(v+template))
        { return v+template; }      // valueTemplate

    // no match... use core result
    return coreTemplate;
}
//}}}
/***
|Name|TemporaryTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#TemporaryTiddlersPlugin|
|Version|1.1.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|blocks tiddlers tagged with "temporary" from being saved into the TW file|
!!!!!Usage
<<<
When the TW document is saved (either to local disk or remote URL), any tiddlers tagged with "temporary" will be skipped over, so that they are not written to the file.  To keep a temporary tiddler, simply edit it and remove the tag before saving the file.  This feature can be combined with various plugins that can automatically create new tiddlers, such as [[SearchOptionsPlugin]] ([[SearchResults]]) and [[ImportTiddlersPlugin]] ([[ImportedTiddlers]]) so that these transient results are not retained when you save you document.

You can also use this tag with the {{{<<loadTiddlers>>}}} macro and the //auto-tagging// features provided by [[ImportTiddlersPlugin]], so that each time you open your document, you can automatically retrieve an up-to-date set of common tiddlers that are stored in another document (either local or via remote URL), without those tiddlers being retained when you save your document.
<<<
!!!!!Configuration
<<<
When saving the document:
<<option chkTemporaryQuiet>> Suppress reporting of individual temporary tiddlers that have not been saved
<<option chkTemporaryKeep>> Keep temporary tiddlers (i.e., ignore the 'temporary' tag)
Enter a tag value to use when marking tiddlers as temporary: <<option txtTemporaryTag>>
<<<
!!!!!Revisions
<<<
2008.11.14 [1.1.2] added "nnn temporary tiddlers not saved" summary message
2008.04.08 [1.1.1] don't automatically add configuration options to AdvancedOptions tiddler
2008.03.01 [1.1.0] added support for recognizing 'temporary' flag stored as a tiddler *field* (as an optional alternative to using a tag)
2007.02.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TemporaryTiddlersPlugin= {major: 1, minor: 1, revision: 2, date: new Date(2008,11,14)};

// configuration defaults
if (config.options.chkTemporaryKeep ==undefined) config.options.chkTemporaryKeep =false;
if (config.options.chkTemporaryQuiet==undefined) config.options.chkTemporaryQuiet=true;
if (config.options.txtTemporaryTag==undefined) config.options.txtTemporaryTag="temporary";
// lingo
config.messages.TemporaryWarning = "'%0' ...temporary tiddler";
config.messages.TemporarySummary = "%0 temporary tiddlers will not be saved";
// core override
SaverBase.prototype.externalize = function(store)
{
    var results=[]; var totaltemps=0;
    var tiddlers=store.getTiddlers("title");
    for (var t=0; t<tiddlers.length; t++) {
        if (config.options.chkTemporaryKeep||!(tiddlers[t].fields['temporary']||tiddlers[t].isTagged(config.options.txtTemporaryTag)))
            results.push(this.externalizeTiddler(store, tiddlers[t]));
        else {
            if (!config.options.chkTemporaryQuiet) // notify user that tiddler won't be saved
                displayMessage(config.messages.TemporaryWarning.format([tiddlers[t].title]));
            totaltemps++;
        }
    }
    if (totaltemps) displayMessage(config.messages.TemporarySummary.format([totaltemps]));
    return results.join("\n");
}
//}}}
/***
|Name|TextAreaPlugin|
|Source|http://www.TiddlyTools.com/#TextAreaPlugin|
|Documentation|http://www.TiddlyTools.com/#TextAreaPluginInfo|
|Version|2.2.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.focusTiddler|
|Options|##Configuration|
|Description|Adds Find/Again keyboard search, autosize, and 'stretch bar' resize for textarea controls|
!!!!!Documentation
>see [[TextAreaPluginInfo]]
!!!!!Configuration
<<<
<<option chkTextAreaExtensions>> use control-f (find), control-g (find again) inside text area
<<option chkDisableAutoSelect>> place cursor at start of textarea instead of pre-selecting content
<<option chkResizeEditor>> modify shadow EditTemplate to add resizeable text area (and autosize command)
<<<
!!!!!Revisions
<<<
2009.04.08 [2.2.1] added autosizeEditor macro to enable automatic autosizing without using toolbar command
2009.04.06 [2.2.0] added resizeListbox macro definition and adjusted dragbar width calculation.
|please see [[TextAreaPluginInfo]] for additional revision details|
2006.01.22 [1.0.0] Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.
<<<
!!!!!Code
***/
//{{{
version.extensions.TextAreaPlugin= {major: 2, minor: 2, revision: 1, date: new Date(2009,4,8)};

if (config.options.chkTextAreaExtensions===undefined) config.options.chkTextAreaExtensions=true;
if (config.options.chkDisableAutoSelect===undefined) config.options.chkDisableAutoSelect=true;
if (config.options.chkResizeEditor===undefined) config.options.chkResizeEditor=true;

// automatically tweak shadow EditTemplate to add "autosizeEditor" toolbar command
if (config.options.chkResizeEditor)
    config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/deleteTiddler/,"deleteTiddler autosizeEditor");
// automatically tweak shadow EditTemplate to add "resizeEditor" macro
if (config.options.chkResizeEditor)
    config.shadowTiddlers.EditTemplate+="<span macro='resizeEditor'></span>";

// Put focus in a specified tiddler field
Story.prototype.TextAreaExtensions_focusTiddler=Story.prototype.focusTiddler;
Story.prototype.focusTiddler = function(title,field)
{
    this.TextAreaExtensions_focusTiddler.apply(this,arguments); // first call core
    var e = this.getTiddlerField(title,field);
    if (e && config.options.chkDisableAutoSelect) {
        if (e.setSelectionRange) // FF
            e.setSelectionRange(0,0);
        else if (e.createTextRange) // IE
            { var r=e.createTextRange(); r.collapse(true); r.select(); }
    }
    if (e && config.options.chkTextAreaExtensions) addKeyDownHandlers(e);
}
//}}}

//{{{
function addKeyDownHandlers(e)
{
    // exit if not textarea or element doesn't allow selections
    if (e.tagName.toLowerCase()!="textarea"||!e.setSelectionRange||e.initialized) return;

    // utility function: exits keydown handler and prevents browser from processing the keystroke
    var processed=function(ev) {
        ev.cancelBubble=true; // IE4+
        try{event.keyCode=0;}catch(e){}; // IE5
        if (window.event) ev.returnValue=false; // IE6
        if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
        if (ev.stopPropagation) ev.stopPropagation(); // all
        return false;
    }
    // capture keydown in edit field
    e.saved_onkeydown=e.onkeydown; // save current keydown handler (if any)
    e.onkeydown=function(ev) { if (!ev) var ev=window.event;
        var key=ev.keyCode;
        if (!key) {
            var char=event.which?event.which:event.charCode;
            if (char==102) key=70;
            if (char==103) key=71;
        }
        // process CTRL-F (find matching text) or CTRL-G (find next match)
        if (ev.ctrlKey && (key==70||key==71)) {

            // prompt for text to find
            var defFind=e.findText?e.findText:e.value.substring(e.selectionStart,e.selectionEnd);
            if (key==70||!e.findText||!e.findText.length) // ctrl-f or no saved search text
                { var f=prompt("find:", defFind); e.focus(); if (f) e.findText=f; }
            if (!e.findText||!e.findText.length) return processed(ev); //  if no search text, exit

            // do case-insensitive match with 'wraparound'...  if not found, alert and exit
            var newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase(),e.selectionStart+1);
            if (newstart==-1) newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase());
            if (newstart==-1) { alert("'"+e.findText+"' not found"); e.focus(); return processed(ev); }

            // set new selection, scroll it into view, and report line position in status bar
            e.setSelectionRange(newstart,newstart+e.findText.length);
            var linecount=e.value.split('\n').length;
            var thisline=e.value.substr(0,e.selectionStart).split('\n').length;
            e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);
            window.status="line: "+thisline+"/"+linecount;
            return processed(ev);
        }
        if (e.saved_onkeydown) // call previous keydown handler (if any)
            e.saved_onkeydown(ev);
    }
    e.initialized=true;
}
//}}}

// // 'autosize' toolbar command
//{{{
config.commands.autosizeEditor = {
    text: 'autosize',
    tooltip: 'automatically adjust the editor height to fit the contents',
    text_alt: '\u221Aautosize',
    hideReadOnly: false,
    handler: function(event,src,title) {
        var here=story.findContainingTiddler(src); if (!here) return;
        var ta=here.getElementsByTagName('textarea'); if (!ta) return;
        for (i=0;i<ta.length;i++) {
            // only autosize textareas actually used to edit tiddler fields
            if (ta[i].getAttribute("edit")==undefined) continue;
            ta[i].button=src;
            if (!ta[i].maxed)
                config.commands.autosizeEditor.on(ta[i]);
            else
                config.commands.autosizeEditor.off(ta[i],true);
        }
        return false;
    },
    on: function(e) {
        if (e.maxed) return; // already autosizing!
        if (e.savedheight==undefined)
            e.savedheight=e.style.height;
        if (e.savedkeyup==undefined) {
            e.savedkeyup=e.onkeyup;
            e.onkeyup=function(ev) {
                if (!ev) var ev=window.event; var e=resolveTarget(ev);
                e.style.height=e.scrollHeight+'px';
                if (e.savedkeyup) e.savedkeyup();
            }
        }
        // IE reports error: "not implemented" for onkeypress
        if (!config.browser.isIE && e.savedkeypress==undefined) {
            e.savedkeypress=e.onkeypress;
            e.onkeypress=function(ev) {
                if (!ev) var ev=window.event; var e=resolveTarget(ev);
                if (ev.keyCode==33) { // PGUP
                    if (window.scrollByPages) window.scrollByPages(-1);
                    return false;
                }
                if (ev.keyCode==34) { // PGDN
                    if (window.scrollByPages) window.scrollByPages(1);
                    return false;
                }
                if (e.savedkeypress) e.savedkeypress();
            }
        }
        e.style.height=e.scrollHeight+'px';
        if (e.button) e.button.innerHTML=config.commands.autosizeEditor.text_alt;
        e.maxed=true;
    },
    off: function(e,resetHeight) {
        if (resetHeight) e.style.height=e.savedheight;
        e.onkeyup=e.savedkeyup;
        // IE reports error: "not implemented" for onkeypress
        if (!config.browser.isIE) e.onkeypress=e.savedkeypress;
        if (e.button) e.button.innerHTML=config.commands.autosizeEditor.text;
        e.maxed=false;
    }
};

config.macros.autosizeEditor={
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var here=story.findContainingTiddler(place); if (!here) return;
        var ta=here.getElementsByTagName('textarea'); if (!ta) return;
        for (i=0;i<ta.length;i++) {
            // only autosize textareas actually used to edit tiddler fields
            if (ta[i].getAttribute("edit")==undefined) continue;
            config.commands.autosizeEditor.on(ta[i]);
        }
        return false;
    }
}
//}}}

// // grab-and-stretch handle
//{{{
config.macros.resizeEditor = { // add stretch bar to editor textarea
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var here=story.findContainingTiddler(place); if (!here) return;
        var ta=here.getElementsByTagName('textarea');
        if (ta) for (i=0;i<ta.length;i++) {
            // only resize tiddler editor textareas
            if (ta[i].getAttribute("edit")==undefined) continue;
            new window.TextAreaResizer(ta[i]);
        }
    }
}

config.macros.resizeTiddler = { // add stretch bar to tiddler viewer element
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var here=story.findContainingTiddler(place); if (!here) return;
        var elems=here.getElementsByTagName('div');
        if (elems) for (i=0;i<elems.length;i++) if (hasClass(elems[i],'viewer')) break;
        if (i<elems.length) new window.TextAreaResizer(elems[i]);
    }
}

config.macros.resizeFrame = { // add stretch bar to iframes
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var here=story.findContainingTiddler(place); if (!here) return;
        var fr=here.getElementsByTagName('iframe');
        if (fr) for (i=0;i<fr.length;i++) new window.TextAreaResizer(fr[i]);
    }
}

config.macros.resizeListbox = { // add stretch bar to listbox controls
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var here=story.findContainingTiddler(place); if (!here) here=place;
        var fr=here.getElementsByTagName('select');
        if (fr) for (i=0;i<fr.length;i++) new window.TextAreaResizer(fr[i]);
    }
}

// TextAreaResizer script by Jason Johnston (jj@lojjic.net)
// Created August 2003.  Use freely, but give me credit.
// adds a handle below textareas that the user can drag with the mouse to resize the textarea.
// MODIFIED by ELS for cross-browser (IE) compatibility, including:

window.TextAreaResizer = function(elt) {
    this.element = elt;
    this.create();
}
window.TextAreaResizer.prototype = {
    create : function() {
        var elt = this.element;
        var thisRef = this;
        var h = this.handle = document.createElement("div");
        h.style.height = "2px"; // was 4px... looked too fat!
        h.style.overflow = "hidden"; // ELS: force IE to trim height to < 1em
        var adjust=elt.nodeName=='textarea'?4:0;  // 4 pixels for textarea border edge
//      h.style.width=(elt.offsetWidth-adjust)+"px";
        h.style.width="auto";
        h.style.backgroundColor = "#999"; // ELS: standard mid-tone (dark) gray
        h.style.cursor = "s-resize";
        h.title = "Drag to resize text box";
        h.onmousedown=function(evt){thisRef.dragStart(evt)};
        elt.parentNode.insertBefore(h, elt.nextSibling);
    },
    dragStart : function(evt) {
        if (!evt) var evt=window.event;
        this.dragStop(evt); // ELS: stop any current drag processing first
        var thisRef = this;
        this.dragStartY = evt.clientY;
        this.dragStartH = this.element.offsetHeight;
        document.savedmousemove=document.onmousemove;
        document.onmousemove=this.dragMoveHdlr=function(evt){thisRef.dragMove(evt)};
        document.savedmouseup=document.onmouseup;
        document.onmouseup=this.dragStopHdlr=function(evt){thisRef.dragStop(evt)};
    },
    dragMove : function(evt) {
        if (!evt) var evt=window.event;
        // ELS: make sure height is at least 10px
        var h=this.dragStartH+evt.clientY-this.dragStartY;
        if (h<10) h=10; this.element.style.height=h+"px";
        // ELS: match handle to textarea width (which may have changed due to document scrollbars)
//      var adjust=this.element.nodeName.toLowerCase()=='textarea'?4:0; // 4 pixels for textarea
//      this.handle.style.width=(this.element.offsetWidth-adjust)+"px";
        // ELS: when manually resizing, disable autoresizing (without restoring saved height)
        if (this.element.maxed!=undefined && this.element.maxed)
            config.commands.autosizeEditor.off(this.element,false);
    },
    dragStop : function(evt) {
        if (!evt) var evt=window.event;
        document.onmousemove=(document.savedmousemove!=undefined)?document.savedmousemove:null;
        document.onmousemove=(document.savedmouseup!=undefined)?document.savedmouseup:null;
    },
    destroy : function() {
        var elt = this.element;
        elt.parentNode.removeChild(this.handle);
        elt.style.height = "";
    }
};
//}}}
''The capacity for understanding another's thinking.''  This includes understanding their communication and taking their perspective.  
* [[Social-interaction]]
* [[Boundaries-CircleOfConcern]]
* [[Social-shame]]
| 1A | 1B | 1C |
| 2A | 2B | 2C |
| 3A | 3B | 3C |

| 1/2A | 1B | 1C |
|~| 2B | 2C |
| 3A | 3B | 3C |

| 1A | 1B | 1C |
| 2A | 2B | 2C |
| 3A | 3B-C |>|
| Format | Method |h
|''bold''|{{{''bold''}}} - two single-quotes, not a double-quote|
|//italics//|{{{//italics//}}}|
|''//bold italics//''|{{{''//bold italics//''}}}|
|__underline__|{{{__underline__}}}|
|--strikethrough--|{{{--Strikethrough--}}}|
|super^^script^^|{{{super^^script^^}}}|
|sub~~script~~|{{{sub~~script~~}}}|
|@@color:darkgreen;color@@|{{{@@color:darkgreen;color@@}}}|
|@@highlight@@|{{{@@highlight@@}}}|
|@@bgcolor:#F5F8FA;color highlight@@|{{{@@bgcolor:#F5F8FA;color highlight@@}}}|
|{{{plain text}}}|{{{ {{{PlainText No ''Formatting''}}} }}}|
|/%this text will be invisible%/hidden text|{{{/%this text will be invisible%/}}}|
You can get dashes @@color:#F00; --@@ like @@color:#F00;these -- @@ by making sure you have spaces.  Otherwise you will have strike-through.
|>| !Links |
|[[source|http://tiddlywiki.com]] for ~TiddlyWiki online |{{{[[Link A|http://tiddlywiki.com]]}}} |
|[[Link B|./computer_wiki.htm]] for local reference wiki |{{{[[Link B|./computer_wiki.htm]]}}} |
|[[Link C|GettingStarted]] for Tiddler (~GettingStarted, very useful) |{{{[[Link C|GettingStarted]]}}} |
|[[more|./scott_wiki_docs/BlytheCoMarketingLaughable.pdf]] for supporting PDF |{{{[[Link D|./scott_wiki_docs/BlytheCoMarketingLaughable.pdf]]}}} |
|[[Link E |.././Personal_USB/ComputerGeek/www/codeigniter_guide/helpers/directory_helper.html]] for local in another directory |{{{[[Link E |.././Personal_USB/ComputerGeek/www/codeigniter_guide/helpers/directory_helper.html]]}}} |
|[[Open folder|./]] |{{{[[Open folder|./]] }}} |
!Tables
This is a mark-up demo; not intended for theological instruction.
[[TidW-Table-HowTo]]

{{textleft{
|bgcolor:#F7D8A0;vertical-align:middle;  Humanity |bgcolor:#abf; The Lord |bgcolor:#F7D8A0;vertical-align:middle;  Non-humanity|
|~|bgcolor:#94EDD6; The Angels |~|
|~|bgcolor:#cfc; {{twLink{[[Creation/Internet]]}}} |~|
{{scripture{<<gradient horiz  #ffc #F7D8A0 #ffc #ffc >>Cool gradients -- a bit code intensive.  >>}}}
//SDM// lots of tweaking in the code at bottom
/%
AB:/%%/ <<tiddler TiddlerMap##Col2 with: A B>>

/%
CD:/%%/ <<tiddler TiddlerMap##Col2 with: C D>>

/%
EF:/%%/ <<tiddler TiddlerMap##Col2 with: E F>>

/%
GH:/%%/ <<tiddler TiddlerMap##Col2 with: G H>>

/%
IJKL:/%%/ <<tiddler TiddlerMap##Col2 with: I J K L>>

/%
MNO:/%%/ <<tiddler TiddlerMap##Col with: T N O>>

/%
PQ:/%%/ <<tiddler TiddlerMap##Col2 with: P Q>>

/%
R:/%%/ <<tiddler TiddlerMap##Col1 with: R>>

/%
S:/%%/ <<tiddler TiddlerMap##Col1 with: S>>

/%
T:/%%/ <<tiddler TiddlerMap##Col1 with: T>>

/%
UVW:/%%/ <<tiddler TiddlerMap##Col3 with: U V W>>

/%
XYZ:/%%/ <<tiddler TiddlerMap##Col3 with: X Y Z>>

/%
0to9:/%%/ <<tiddler TiddlerMap##Col3 with: '0-3' '4-6' '7-9'>>

// /%
// 0to9:/%%/ <<tiddler TiddlerMap##Col1 with: '0-9'>>

/%
!!!Col
{{mapH1{$1}}}{{dp33{<<list noCase title '[$1]'>>}}} {{mapH1{$2}}}{{dp33{<<list noCase title '[$2]'>>}}} {{mapH1{$3}}}{{dp33{<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}

!!!Col1
{{mapH1{$1}}}{{dp100{ <<list noCase title '[$1]'>>}}}
!!!end

!!!Col1_backup
<hr>
{{dp100{<<list noCase title '[$1]'>>}}}
<hr>
!!!end

!!!Col2
{{dp50{ {{mapH1{$1}}}<<list noCase title '[$1]'>>}}} {{dp50{ {{mapH1{$2}}}<<list noCase title '[$2]'>>}}}
{{dp100{<br>}}}
!!!end

*Col3
!!!Col3
{{mapH1{$1}}}{{dp33{<<list noCase title '[$1]'>>}}} {{mapH1{$2}}}{{dp33{<<list noCase title '[$2]'>>}}} {{mapH1{$3}}}{{dp33{<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}
!!!end

*Col4
!!!Col4
{{mapH1{$1}}}{{dp25{<<list noCase title '[$1]'>>}}} {{mapH1{$2}}}{{dp25{<<list noCase title '[$2]'>>}}} {{mapH1{$3}}}{{dp25{<<list noCase title '[$3]'>>}}} {{mapH1{$4}}}{{dp25{<<list noCase title '[$4]'>>}}}
{{dp100{<br>}}}
!!!end

!!!ColAZ3
{{dp33{''$1''-[$2]
<<list noCase title '$1[$2]'>>}}} {{dp33{''$1''-[$3]
<<list noCase title '$1[$3]'>>}}} {{dp33{''$1''-[$4]
<<list noCase title '$1[$4]'>>}}}
{{dp100{<br>}}}
!!!end

!!!ColAZ4
{{dp25{''$1''-[$2]
<<list noCase title '$1[$2]'>>}}} {{dp25{''$1''-[$3]
<<list noCase title '$1[$3]'>>}}} {{dp25{''$1''-[$4]
<<list noCase title '$1[$4]'>>}}} {{dp25{''$1''-[$5]
<<list noCase title '$1[$5]'>>}}}
{{dp100{<br>}}}
!!!end

!!!Col0to9
{{dp33{''$1''<<list noCase title '[$1]'>>}}} {{dp33{''$2''
<<list noCase title '[$2]'>>}}} {{dp33{''$3''
<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}
!!!end
%/
/%
A:/%%/ <<tiddler TiddlerMap##Col1 with: A>>
/%
B:/%%/ <<tiddler TiddlerMap##Col1 with: B>>
/%
C:/%%/ <<tiddler TiddlerMap##Col1 with: C>>
/%
D:/%%/ <<tiddler TiddlerMap##Col1 with: D>>
/%
E:/%%/ <<tiddler TiddlerMap##Col1 with: E>>
/%
F:/%%/ <<tiddler TiddlerMap##Col1 with: F>>
/%
G:/%%/ <<tiddler TiddlerMap##Col1 with: G>>
/%
H:/%%/ <<tiddler TiddlerMap##Col1 with: H>>
/%
I:/%%/ <<tiddler TiddlerMap##Col1 with: I>>
/%
J:/%%/ <<tiddler TiddlerMap##Col1 with: J>>
/%
K:/%%/ <<tiddler TiddlerMap##Col1 with: K>>
/%
L:/%%/ <<tiddler TiddlerMap##Col1 with: L>>
/%
T:/%%/ <<tiddler TiddlerMap##Col1 with: T>>
/%
N:/%%/ <<tiddler TiddlerMap##Col1 with: N>>
/%
O:/%%/ <<tiddler TiddlerMap##Col1 with: O>>
/%
P:/%%/ <<tiddler TiddlerMap##Col1 with: P>>
/%
Q:/%%/ <<tiddler TiddlerMap##Col1 with: Q>>
/%
R:/%%/ <<tiddler TiddlerMap##Col1 with: R>>
/%
S:/%%/ <<tiddler TiddlerMap##Col1 with: S>>
/%
T:/%%/ <<tiddler TiddlerMap##Col1 with: T>>
/%
U:/%%/ <<tiddler TiddlerMap##Col1 with: U>>
/%
V:/%%/ <<tiddler TiddlerMap##Col1 with: V>>
/%
W:/%%/ <<tiddler TiddlerMap##Col1 with: W>>
/%
X:/%%/ <<tiddler TiddlerMap##Col1 with: X>>
/%
Y:/%%/ <<tiddler TiddlerMap##Col1 with: Y>>
/%
Z:/%%/ <<tiddler TiddlerMap##Col1 with: Z>>
/%
0to9:/%%/ <<tiddler TiddlerMap##Col1 with: '0-9'>>
/%
0:/%%/ <<tiddler TiddlerMap##Col1 with: 0>>
/%
1:/%%/ <<tiddler TiddlerMap##Col1 with: 1>>
/%
2:/%%/ <<tiddler TiddlerMap##Col1 with: 2>>
/%
3:/%%/ <<tiddler TiddlerMap##Col1 with: 3>>
/%
4:/%%/ <<tiddler TiddlerMap##Col1 with: 4>>
/%
5:/%%/ <<tiddler TiddlerMap##Col1 with: 5>>
/%
6:/%%/ <<tiddler TiddlerMap##Col1 with: 6>>
/%
7:/%%/ <<tiddler TiddlerMap##Col1 with: 7>>
/%
8:/%%/ <<tiddler TiddlerMap##Col1 with: 8>>
/%
9:/%%/ <<tiddler TiddlerMap##Col1 with: 9>>
//SDM// lots of tweaking in the code at bottom
/%
AB:/%%/ <<tiddler TiddlerMapX##Col2 with: A B>>

/%
CD:/%%/ <<tiddler TiddlerMapX##Col2 with: C D>>

/%
EF:/%%/ <<tiddler TiddlerMapX##Col2 with: E F>>

/%
GH:/%%/ <<tiddler TiddlerMapX##Col2 with: G H>>

/%
IJKL:/%%/ <<tiddler TiddlerMapX##Col4 with: I J K L>>

/%
MNO:/%%/ <<tiddler TiddlerMapX##Col3 with: T N O>>

/%
PQ:/%%/ <<tiddler TiddlerMapX##Col2 with: P Q>>

/%
R:/%%/ <<tiddler TiddlerMapX##Col1 with: R>>

/%
S:/%%/ <<tiddler TiddlerMapX##Col1 with: S>>

/%
TUV:/%%/ <<tiddler TiddlerMapX##Col3 with: T U V>>

/%
W:/%%/ <<tiddler TiddlerMapX##Col1 with: W>>

/%
XYZ:/%%/ <<tiddler TiddlerMapX##Col3 with: X Y Z>>

/%
0to9:/%%/ <<tiddler TiddlerMapX##Col3 with: '0-3' '4-6' '7-9'>>

/%
!!!Col
{{mapH1{$1}}}{{dp33{<<list noCase title '[$1]'>>}}} {{mapH1{$2}}}{{dp33{<<list noCase title '[$2]'>>}}} {{mapH1{$3}}}{{dp33{<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}

!!!Col1
{{dp100{<<list xCase title '[$1]' filter '[tag[NOT Comment AND NOT Scriptr]]'>>}}}
!!!end

!!!Col1_backup
<hr>
{{dp100{<<list noCase title '[$1]'>>}}}
<hr>
!!!end

*Col2
!!!Col2
{{fourcolumns{''$1'' <<list xCase title '[$1]' [tag[(NOT Comment AND NOT Scriptr)]]>> ''$2''<<list xCase title '[$2]' [tag[(NOT Comment AND NOT Scriptr)]]>>}}}
!!!end

*Col3
!!!Col3
{{mapH1{$1}}}{{dp33{<<list xCase title '[$1]' '[tag[NOT Comment AND NOT Scriptr]]'>>}}} {{mapH1{$2}}}{{dp33{<<list noCase title '[$2]' '[tag[NOT Comment AND NOT Scriptr]]'>>}}} {{mapH1{$3}}}{{dp33{<<list noCase title '[$3]' '[tag[NOT Comment AND NOT Scriptr]]'>>}}}
{{dp100{<br>}}}
!!!end

*Col4
!!!Col4
{{fourcolumns{
{{mapH1{$1}}}<<list xCase title '[$1]' '[tag[NOT Comment]]'>> {{mapH1{$2}}}<<list xCase title '[$2]' '[tag[NOT Comment]]'>> {{mapH1{$3}}}<<list xCase title '[$3]' '[tag[NOT Comment]]'>> {{mapH1{$4}}}<<list xCase title '[$4]' '[tag[NOT Comment]]'>>
}}}
!!!end

!!!ColAZ3
{{dp33{''$1''-[$2]
<<list noCase title '$1[$2]'>>}}} {{dp33{''$1''-[$3]
<<list noCase title '$1[$3]'>>}}} {{dp33{''$1''-[$4]
<<list noCase title '$1[$4]'>>}}}
{{dp100{<br>}}}
!!!end

!!!ColAZ4
{{dp25{''$1''-[$2]
<<list noCase title '$1[$2]'>>}}} {{dp25{''$1''-[$3]
<<list noCase title '$1[$3]'>>}}} {{dp25{''$1''-[$4]
<<list noCase title '$1[$4]'>>}}} {{dp25{''$1''-[$5]
<<list noCase title '$1[$5]'>>}}}
{{dp100{<br>}}}
!!!end

!!!Col0to9
{{dp33{''$1''<<list noCase title '[$1]'>>}}} {{dp33{''$2''
<<list noCase title '[$2]'>>}}} {{dp33{''$3''
<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}
!!!end
%/
/***
|Name|TiddlerTweakerPlugin|
|Source|http://www.TiddlyTools.com/#TiddlerTweakerPlugin|
|Version|2.4.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|select multiple tiddlers and modify author, created, modified and/or tag values|
~TiddlerTweaker is a tool for TiddlyWiki authors.  It allows you to select multiple tiddlers from a listbox, either by direct interaction or automatically matching specific criteria.  You can then modify the creator, author, created, modified and/or tag values of those tiddlers using a compact set of form fields.  The values you enter into the fields simultantously overwrite the existing values in all tiddlers you have selected.
!!!!!Usage
<<<
{{{<<tiddlerTweaker>>}}}
{{smallform{<<tiddlerTweaker>>}}}
By default, any tags you enter into the TiddlerTweaker will //replace// the existing tags in all the tiddlers you have selected.  However, you can also use TiddlerTweaker to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged:
>Any tag preceded by a "+" (plus) or "-" (minus), will be added or removed from the existing tags //instead of replacing the entire tag definition// of each tiddler (e.g., enter "-excludeLists" to remove that tag from all selected tiddlers.  When using this syntax, care should be taken to ensure that //every// tag is preceded by "+" or "-", to avoid inadvertently overwriting any other existing tags on the selected tiddlers.  (note: the "+" or "-" prefix on each tag value is NOT part of the tag value, and is only used by TiddlerTweaker to control how that tag value is processed)
Important Notes:
* Inasmuch as TiddlerTweaker is a 'power user' tool that can perform 'batch' functions (operating on many tiddlers at once), you should always have a recent backup of your document (or "save changes" just *before* tweaking the tiddlers), just in case you "shoot yourself in the foot".
* The date and author information on any tiddlers you tweak will ONLY be updated if the corresponding  TiddlyTweaker checkboxes have been selected.  As a general rule, after using TiddlerTweaker, always ''//remember to save your document//'' when you are done, even though the tiddler timeline tab may not show any recently modified tiddlers.
* Selecting and updating all tiddlers in a document can take a while.  Your browser may warn about an "unresponsive script".  Usually, if you allow it to continue, it should complete the processing... eventually.  Nonetheless, be sure to save your work before you begin tweaking lots of tiddlers, just in case something does get 'stuck'.
<<<
!!!!!Revisions
<<<
2009.06.26 [2.4.2] only add brackets around tags containing spaces
2009.06.22 [2.4.1] in setFields(), add brackets around all tags shown tweaker edit field
2009.03.30 [2.4.0] added 'sort by modifier'
2009.01.22 [2.3.0] added support for text pattern find/replace
2008.10.27 [2.2.3] in setTiddlers(), fixed Safari bug by replacing static Array.concat(...) with new Array().concat(...)
2008.09.07 [2.2.2] added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.12 [2.2.1] replace built-in backstage "tweak" task with tiddler tweaker control panel (moved from BackstageTweaks)
2008.01.13 [2.2.0] added "auto-selection" links: all, changed, tags, title, text
2007.12.26 [2.1.0] added support for managing 'creator' custom field (see [[CoreTweaks]])
2007.11.01 [2.0.3] added config.options.txtTweakerSortBy for cookie-based persistence of list display order preference setting.
2007.09.28 [2.0.2] in settiddlers() and deltiddlers(), added suspend/resume notification handling (improves performance when operating on multiple tiddlers)
2007.08.03 [2.0.1] added shadow definition for [[TiddlerTweaker]] tiddler for use as parameter references with {{{<<tiddler>>, <<slider>> or <<tabs>>}}} macros.
2007.08.03 [2.0.0] converted from inline script
2006.01.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlerTweakerPlugin= {major: 2, minor: 4, revision: 1, date: new Date(2009,6,22)};

// shadow tiddler
config.shadowTiddlers.TiddlerTweaker="<<tiddlerTweaker>>";

/// backstage task
if (config.tasks) { // for TW2.2b3 or above
    config.tasks.tweak.tooltip="review/modify tiddler internals: dates, authors, tags, etc.";
    config.tasks.tweak.content="{{smallform small groupbox{<<tiddlerTweaker>>}}}";
}

if (config.options.txtTweakerSortBy==undefined) config.options.txtTweakerSortBy="modified";

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

config.macros.tiddlerTweaker = {
    html: '<form style="display:inline"><!--\
        --><table style="padding:0;margin:0;border:0;width:100%"><tr valign="top" style="padding:0;margin:0;border:0"><!--\
        --><td style="text-align:center;white-space:nowrap;width:99%;padding:0;margin:0;border:0"><!--\
            --><font size=-2><div style="text-align:left;"><span style="float:right"><!--\
            -->&nbsp; <a href="javascript:;" \
                title="select all tiddlers"\
                onclick="\
                var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
                for (var t=0; t<f.list.options.length; t++)\
                    if (f.list.options[t].value.length) f.list.options[t].selected=true;\
                config.macros.tiddlerTweaker.selecttiddlers(f.list);\
                return false">all</a><!--\
            -->&nbsp; <a href="javascript:;" \
                title="select tiddlers that are new/changed since the last file save"\
                onclick="\
                var lastmod=new Date(document.lastModified);\
                var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
                for (var t=0; t<f.list.options.length; t++) {\
                    var tid=store.getTiddler(f.list.options[t].value);\
                    f.list.options[t].selected=tid&&tid.modified>lastmod;\
                }\
                config.macros.tiddlerTweaker.selecttiddlers(f.list);\
                return false">changed</a><!--\
            -->&nbsp; <a href="javascript:;" \
                title="select tiddlers with at least one matching tag"\
                onclick="\
                var t=prompt(\'Enter space-separated tags (match ONE)\');\
                if (!t||!t.length) return false;\
                var tags=t.readBracketedList();\
                var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
                for (var t=0; t<f.list.options.length; t++) {\
                    f.list.options[t].selected=false;\
                    var tid=store.getTiddler(f.list.options[t].value);\
                    if (tid&&tid.tags.containsAny(tags)) f.list.options[t].selected=true;\
                }\
                config.macros.tiddlerTweaker.selecttiddlers(f.list);\
                return false">tags</a><!--\
            -->&nbsp; <a href="javascript:;" \
                title="select tiddlers whose titles include matching text"\
                onclick="\
                var txt=prompt(\'Enter a title (or portion of a title) to match\');\
                if (!txt||!txt.length) return false;\
                var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
                for (var t=0; t<f.list.options.length; t++) {\
                    f.list.options[t].selected=f.list.options[t].value.indexOf(txt)!=-1;\
                }\
                config.macros.tiddlerTweaker.selecttiddlers(f.list);\
                return false">titles</a><!--\
            -->&nbsp; <a href="javascript:;" \
                title="select tiddlers containing matching text"\
                onclick="\
                var txt=prompt(\'Enter tiddler text (content) to match\');\
                if (!txt||!txt.length) return false;\
                var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
                for (var t=0; t<f.list.options.length; t++) {\
                    var tt=store.getTiddlerText(f.list.options[t].value,\'\');\
                    f.list.options[t].selected=(tt.indexOf(txt)!=-1);\
                }\
                config.macros.tiddlerTweaker.selecttiddlers(f.list);\
                return false">text</a> &nbsp;<!--\
            --></span><span>select tiddlers</span><!--\
            --></div><!--\
            --></font><select multiple name=list size="30" style="width:99.99%" \
                title="use click, shift-click and/or ctrl-click to select multiple tiddler titles" \
                onclick="config.macros.tiddlerTweaker.selecttiddlers(this)" \
                onchange="config.macros.tiddlerTweaker.setfields(this)"><!--\
            --></select><br><!--\
            -->show<input type=text size=1 value="30" \
                onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--\
            -->by<!--\
            --><select name=sortby size=1 \
                onchange="config.macros.tiddlerTweaker.init(this.form,this.value)"><!--\
            --><option value="title">title</option><!--\
            --><option value="size">size</option><!--\
            --><option value="modified">modified</option><!--\
            --><option value="created">created</option><!--\
            --><option value="modifier">modifier</option><!--\
            --></select><!--\
            --><input type="button" value="refresh" \
                onclick="config.macros.tiddlerTweaker.init(this.form,this.form.sortby.value)"<!--\
            --> <input type="button" name="stats" disabled value="totals..." \
                onclick="config.macros.tiddlerTweaker.stats(this)"><!--\
        --></td><td style="white-space:nowrap;padding:0;margin:0;border:0;width:1%"><!--\
            --><div style="text-align:left"><font size=-2>&nbsp;modify values</font></div><!--\
            --><table border=0 style="width:100%;padding:0;margin:0;border:0;"><tr style="padding:0;border:0;"><!--\
            --><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=settitle unchecked \
                    title="allow changes to tiddler title (rename tiddler)" \
                    onclick="this.form.title.disabled=!this.checked">title<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=title size=35 style="width:98%" disabled><!--\
            --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=setcreator unchecked \
                    title="allow changes to tiddler creator" \
                    onclick="this.form.creator.disabled=!this.checked">created by<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=creator size=35 style="width:98%" disabled><!--\
            --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=setwho unchecked \
                    title="allow changes to tiddler author" \
                    onclick="this.form.who.disabled=!this.checked">modified by<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=who size=35 style="width:98%" disabled><!--\
            --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=setcdate unchecked \
                    title="allow changes to created date" \
                    onclick="var f=this.form; f.cm.disabled=f.cd.disabled=f.cy.disabled=f.ch.disabled=f.cn.disabled=!this.checked"><!--\
                -->created on<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=cm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
                --> / <input type=text name=cd size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
                --> / <input type=text name=cy size=4 style="width:3em;padding:0;text-align:center" disabled><!--\
                --> at <input type=text name=ch size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
                --> : <input type=text name=cn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
            --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=setmdate unchecked \
                    title="allow changes to modified date" \
                    onclick="var f=this.form; f.mm.disabled=f.md.disabled=f.my.disabled=f.mh.disabled=f.mn.disabled=!this.checked"><!--\
                -->modified on<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=mm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
                --> / <input type=text name=md size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
                --> / <input type=text name=my size=4 style="width:3em;padding:0;text-align:center" disabled><!--\
                --> at <input type=text name=mh size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
                --> : <input type=text name=mn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
            --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=replacetext unchecked\
                    title="find/replace matching text" \
                    onclick="this.form.pattern.disabled=this.form.replacement.disabled=!this.checked">replace text<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=pattern size=15 value="" style="width:40%" disabled \
                    title="enter TEXT PATTERN (regular expression)"> with <!--\
                --><input type=text name=replacement size=15 value="" style="width:40%" disabled \
                    title="enter REPLACEMENT TEXT"><!--\
            --></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=checkbox name=settags checked \
                    title="allow changes to tiddler tags" \
                    onclick="this.form.tags.disabled=!this.checked">tags<!--\
            --></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
                --><input type=text name=tags size=35 value="" style="width:98%" \
                    title="enter new tags or use \'+tag\' and \'-tag\' to add/remove tags from existing tags"><!--\
            --></td></tr></table><!--\
            --><div style="text-align:center"><!--\
            --><nobr><input type=button name=display disabled style="width:32%" value="display tiddlers" \
                onclick="config.macros.tiddlerTweaker.displaytiddlers(this)"><!--\
            --> <input type=button name=del disabled style="width:32%" value="delete tiddlers" \
                onclick="config.macros.tiddlerTweaker.deltiddlers(this)"><!--\
            --> <input type=button name=set disabled style="width:32%" value="update tiddlers" \
                onclick="config.macros.tiddlerTweaker.settiddlers(this)"></nobr><!--\
            --></div><!--\
        --></td></tr></table><!--\
        --></form><span style="display:none"><!--content replaced by tiddler "stats"--></span>\
    ',
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var span=createTiddlyElement(place,"span");
        span.innerHTML=this.html;
        this.init(span.firstChild,config.options.txtTweakerSortBy);
    },
    init: function(f,sortby) { // initialize form controls
        if (!f) return; // form might not be rendered yet...
        while (f.list.options[0]) f.list.options[0]=null; // empty current list content
        var tids=store.getTiddlers(sortby);
        if (sortby=='size') // descending order
            tids.sort(function(a,b) {return a.text.length > b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});
        var who='';
        for (i=0; i<tids.length; i++) { var t=tids[i];
            var label=t.title; var value=t.title;
            switch (sortby) {
                case 'modified':
                case 'created':
                    var t=tids[tids.length-i-1]; // reverse order
                    var when=t[sortby].formatString('YY.0MM.0DD 0hh:0mm ');
                    label=when+t.title;
                    value=t.title;
                    break;
                case 'size':
                    label='['+t.text.length+'] '+label;
                    break;
                case 'modifier':
                case 'creator':
                    if (who!=t[sortby]) {
                        who=t[sortby];
                        f.list.options[f.list.length]=new Option('by '+who+':','',false,false);
                    }
                    label='\xa0\xa0\xa0'+label; // indent
                    break;
            }
            f.list.options[f.list.length]=new Option(label,value,false,false);
        }
        f.title.value=f.who.value=f.creator.value=f.tags.value="";
        f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";
        f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";
        f.stats.disabled=f.set.disabled=f.del.disabled=f.display.disabled=true;
        f.settitle.disabled=false;
        config.options.txtTweakerSortBy=sortby; // remember current setting
        f.sortby.value=sortby; // sync droplist selection with current setting
        if (sortby!="modified") // non-default preference... save cookie
            saveOptionCookie("txtTweakerSortBy");
        else removeCookie("txtTweakerSortBy"); // default preference... clear cookie
    },
    selecttiddlers: function(here) { // enable/disable tweaker fields based on number of items selected
        // count how many tiddlers are selected
        var f=here.form; var list=f.list;
        var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
        if (c>1) f.title.disabled=true;
        if (c>1) f.settitle.checked=false;
        f.set.disabled=(c==0);
        f.del.disabled=(c==0);
        f.display.disabled=(c==0);
        f.settitle.disabled=(c>1);
        f.stats.disabled=(c==0);
        var msg=(c==0)?'select tiddlers':(c+' tiddler'+(c!=1?'s':'')+' selected');
        here.previousSibling.firstChild.firstChild.nextSibling.innerHTML=msg;
        if (c) clearMessage(); else displayMessage("no tiddlers selected");
    },
    setfields: function(here) { // set tweaker edit fields from first selected tiddler
        var f=here.form;
        if (!here.value.length) {
            f.title.value=f.who.value=f.creator.value=f.tags.value="";
            f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";
            f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";
            return;
        }
        var tid=store.getTiddler(here.value); if (!tid) return;
        f.title.value=tid.title;
        f.who.value=tid.modifier;
        f.creator.value=tid.fields['creator']||''; // custom field - might not exist
        f.tags.value=tid.tags.map(function(t){return String.encodeTiddlyLink(t)}).join(' ');
        var c=tid.created; var m=tid.modified;
        f.cm.value=c.getMonth()+1;
        f.cd.value=c.getDate();
        f.cy.value=c.getFullYear();
        f.ch.value=c.getHours();
        f.cn.value=c.getMinutes();
        f.mm.value=m.getMonth()+1;
        f.md.value=m.getDate();
        f.my.value=m.getFullYear();
        f.mh.value=m.getHours();
        f.mn.value=m.getMinutes();
    },
    settiddlers: function(here) {
        var f=here.form; var list=f.list;
        var tids=[];
        for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
        if (!tids.length) { alert("please select at least one tiddler"); return; }
        var cdate=new Date(f.cy.value,f.cm.value-1,f.cd.value,f.ch.value,f.cn.value);
        var mdate=new Date(f.my.value,f.mm.value-1,f.md.value,f.mh.value,f.mn.value);
        if (tids.length>1 && !confirm("Are you sure you want to update these tiddlers:\n\n"+tids.join(', '))) return;
        store.suspendNotifications();
        for (t=0;t<tids.length;t++) {
            var tid=store.getTiddler(tids[t]); if (!tid) continue;
            var title=!f.settitle.checked?tid.title:f.title.value;
            var who=!f.setwho.checked?tid.modifier:f.who.value;
            var text=tid.text;
            if (f.replacetext.checked) text=text.replace(new RegExp(f.pattern.value,'mg'),f.replacement.value);
            var tags=tid.tags;
            if (f.settags.checked) {
                var intags=f.tags.value.readBracketedList();
                var addtags=[]; var deltags=[]; var reptags=[];
                for (i=0;i<intags.length;i++) {
                    if (intags[i].substr(0,1)=='+')
                        addtags.push(intags[i].substr(1));
                    else if (intags[i].substr(0,1)=='-')
                        deltags.push(intags[i].substr(1));
                    else
                        reptags.push(intags[i]);
                }
                if (reptags.length)
                    tags=reptags;
                if (addtags.length)
                    tags=new Array().concat(tags,addtags);
                if (deltags.length)
                    for (i=0;i<deltags.length;i++)
                        { var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }
            }
            if (!f.setcdate.checked) cdate=tid.created;
            if (!f.setmdate.checked) mdate=tid.modified;
            store.saveTiddler(tid.title,title,text,who,mdate,tags,tid.fields);
            if (f.setcreator.checked) store.setValue(tid.title,'creator',f.creator.value); // set creator
            if (f.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date
        }
        store.resumeNotifications();
        this.init(f,f.sortby.value);
    },
    displaytiddlers: function(here) {
        var f=here.form; var list=f.list;
        var tids=[];
        for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
        if (!tids.length) { alert("please select at least one tiddler"); return; }
        story.displayTiddlers(story.findContainingTiddler(f),tids)
    },
    deltiddlers: function(here) {
        var f=here.form; var list=f.list;
        var tids=[];
        for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
        if (!tids.length) { alert("please select at least one tiddler"); return; }
        if (!confirm("Are you sure you want to delete these tiddlers:\n\n"+tids.join(', '))) return;
        store.suspendNotifications();
        for (t=0;t<tids.length;t++) {
            var tid=store.getTiddler(tids[t]); if (!tid) continue;
            if (tid.tags.contains("systemConfig"))
                if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\n\nRemoving this tiddler may cause unexpected results.  Are you sure?"))
                    continue;
            store.removeTiddler(tid.title);
            story.closeTiddler(tid.title);
        }
        store.resumeNotifications();
        this.init(f,f.sortby.value);
    },
    stats: function(here) {
        var f=here.form; var list=f.list; var tids=[]; var out=''; var tot=0;
        var target=f.nextSibling;
        for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
        if (!tids.length) { alert("please select at least one tiddler"); return; }
        for (t=0;t<tids.length;t++) {
            var tid=store.getTiddler(tids[t]); if (!tid) continue;
            out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
        }
        var avg=tot/tids.length;
        out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<\n';
        removeChildren(target);
        target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' "
            +"onclick='this.parentNode.parentNode.style.display=\"none\"'>close</a></font>";
        wikify(out,target);
        target.style.display="block";
    }
};
//}}}
''This is version <<version>> of ~TiddlyWiki Classic.''

@@font-size:24pt;[[download now...|http://classic.TiddlyWiki.com/beta/empty.zip]]@@

You can view other versions of ~TiddlyWiki from the following locations:
| current release of ~TiddlyWiki|!http://TiddlyWiki.com/ |
| beta pre-release of ~TiddlyWiki Classic|!http://classic.TiddlyWiki.com/beta |
| current release of ~TiddlyWiki Classic|!http://classic.TiddlyWiki.com/ |
| previous releases of ~TiddlyWiki Classic|!http://classic.tiddlywiki.com/archive/ |
/%
!info
|Name|ToggleBreadcrumbs|
|Source|http://www.TiddlyTools.com/#ToggleBreadcrumbs|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|enable/disable display of breadcrumbs (uses BreadcrumbsPlugin)|
Usage
<<<
{{{
<<tiddler ToggleBreadcrumbs>>
<<tiddler ToggleBreadcrumbs with: label tip>>
}}}
<<<
Example
<<<
{{{<<tiddler ToggleBreadcrumbs>>}}}
<<tiddler ToggleBreadcrumbs##show with: "crumbs">>
<<<
!end
!show
<<tiddler {{
	if (config.options.chkShowBreadcrumbs===undefined) config.options.chkShowBreadcrumbs=true;
'';}}>><<option chkShowBreadcrumbs>><<tiddler {{
	var chk=place.lastChild;
	if (!chk.coreOnChange) { // only once
		chk.coreOnChange=chk.onchange;
		chk.onchange=function() {
			if (this.coreOnChange) this.coreOnChange.apply(this,arguments);
			this.checked=config.options.chkShowBreadcrumbs;
			if (config.macros.breadcrumbs) config.macros.breadcrumbs.refresh();
		};
	}
'';}}>> $1
!end

%/<<tiddler {{var src='ToggleBreadcrumbs'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}
with:	{{'$1'!='$'+'1'?'$1':'show breadcrumbs'}}
	{{'$2'!='$'+'2'?'$2':'toggle breadcrumbs display'}}>>
/%
!info
|Name|ToggleSliders|
|Source|http://www.TiddlyTools.com/#ToggleSliders|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|toggle (expand/collapse) all sliders in a tiddler (or ID'd DOM element)|
Usage
<<<
{{{
<<tiddler ToggleSliders with: elementID expandlabel collapselabel>>
}}}
*''elementID'' is one of:
**"" (empty quotes) = the current tiddler
**''here'' = the current container
**''ID'' = specific DOM element ID (e.g., "mainMenu")
*''expandlabel/collapselabel'' (optional)<br>are alternative link text to display when sliders are closed (expandlabel) or opened (collapselabel)
<<<
Example
<<<
{{{
<<tiddler ToggleSliders with: "" "open all" "close all">>
}}}
with sample sliders:
{{{
<<slider chkExample ToggleSliders::slider1 Example1 Example1>>
<<slider chkExample ToggleSliders::slider2 Example2 Example2>>
Example1: |This is example slider 1|
Example2: |This is example slider 2|
}}}
<<tiddler ToggleSliders##show with: "" "open all" "close all">>
<<slider chkExample1 ToggleSliders::Example1 Example1 Example1>>
<<slider chkExample2 ToggleSliders::Example2 Example2 Example2>>
<<<
!end

!show
<html><a href="javascript:;" class="TiddlyLink" title="toggle sliders"
onclick="
    if ('$1'=='here') var here=this.parentNode.parentNode.parentNode.parentNode; // container
    else if ('$1'!='$'+'1' && '$1'.length) here=document.getElementById('$1'); // ID
    else var here=story.findContainingTiddler(this); // tiddler
    if (!here) return false;
    var elems=here.getElementsByTagName('*');
    var state=(this.innerHTML.toLowerCase()=='$2')?'none':'block';
    for (var e=0; e<elems.length; e++) { var p=elems[e];
        if (p.className!='sliderPanel' || p.style.display!=state) continue;
        if (p.button) window.onClickNestedSlider({target:p.button}); // see NestedSlidersPlugin
        else p.previousSibling.onclick();
    }
    this.innerHTML=state=='none'?'$3':'$2';
    return false;
">$2</a><nowiki></html>
!end
%/<<tiddler {{ var src='ToggleSliders'; src+(tiddler&&tiddler.title==src?'##info':'##show')}}
    with:   [[$1]]
        {{'$2'!='$'+'2'?'$2':'expand'}}
        {{'$3'!='$'+'3'?'$3':'collapse'}}
        {{'$4'!='$'+'4'?'$4':'toggle sliders'}}
>>
!!!!!toolbar definitions for templates
<<<
Uses CoreTweaks (#609/#610) for extended "!" and 'toolbar include' syntax
See also [[ToolbarCommands-AttemptMaybeDangerous]] and [[ToolbarCommandsInfy]]

|~ViewToolbar|closeTiddler ~ToolbarCommands##spacer ~ToolbarCommands##spacer ~ToolbarCommands##spacer collapseTiddler ! ~ToolbarCommands##editTiddler collapseOthers closeOthers ! ~ToolbarCommands##goto ! ~ToolbarCommands##deleteTiddler ! ~ToolbarCommands##spacer > < * ~ToolbarCommands##copyTiddler ~ToolbarCommands##snapshotSave ~ToolbarCommands##snapshotPrint ~ToolbarCommands##refreshTiddler ~ToolbarCommands##spacer ! ~ToolbarCommands##permalink ~ToolbarCommands##revertTiddler |
|~CollapsedToolbar|closeTiddler expandTiddler ! ~ToolbarCommands##editTiddler collapseOthers closeOthers ! ~ToolbarCommands##related ~ToolbarCommands##goto ! ~ToolbarCommands##deleteTiddler ! ~ToolbarCommands##spacer > < * ~ToolbarCommands##copyTiddler ~ToolbarCommands##deleteTiddler ! ~ToolbarCommands##fields |
|~EditToolbar|~ToolbarCommands##saveTiddler ~ToolbarCommands##saveCloseTiddler ~ToolbarCommands##cancelTiddler ~ToolbarCommands##spacer ! ~ToolbarCommands##spacer ~ToolbarCommands##options ~ToolbarCommands##autosizeCheckbox ~ToolbarCommands##quickeditCheckbox ToolbarCommands##minorchangesCheckbox ! ~ToolbarCommands##spacer > < * ~ToolbarCommands##copyTiddler ~ToolbarCommands##deleteTiddler ! ~ToolbarCommands##fields |
|~EditToolbarReadOnly|~ToolbarCommands##spacer closeTiddler ! ~ToolbarCommands##fields  |
<<<
!!!!! wiki-syntax toolbar commands+++
<<<
!!!!!spacer
{{{
/% force whitespace separation and baseline alignment of toolbar with tiddler title %/@@font-size:12pt;&nbsp;@@
}}}
!!!!!goto
{{{
@@position:static;+++^25em^*[goto|view another tiddler]...
    {{fine{
    {{floatright{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}}/%
    %/<<tiddler SiteMenuGoto>>}}}===@@
}}}
!!!!!editTiddler
{{{
<script>
    if (readOnly) return "<<toolbar +editTiddler>>"; // view
    else return "<<toolbar +editTiddler>>"; // edit
</script>
}}}
!!!!!refreshTiddler
{{{
<script label="refresh" title="redisplay the contents of this tiddler">
    story.refreshTiddler(story.findContainingTiddler(place).getAttribute("tiddler"),null,true);
</script><script>
    place.lastChild.style.fontWeight="normal";
</script>
}}}
!!!!!related
{{{
@@position:static;+++^65em^[related|show list/tree view of tiddlers related to the current tiddler]...
    {{smallform{
    {{floatright{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}}/%
    %/<<relatedTiddlers here hideform>>}}}===@@
}}}
!!!!!permalink
{{{
<<toolbar permalink>>
}}}
!!!!!copyTiddler
{{{
<script> if (!readOnly) return "<<toolbar copyTiddler>>"; </script>
}}}
!!!!!snapshotSave
{{{
<<toolbar snapshotSave>>
}}}
!!!!!snapshotPrint
{{{
<<toolbar snapshotPrint>>
}}}
!!!!!saveTiddlerToFile
{{{
<<toolbar saveTiddlerToFile>>
}}}
!!!!!sendTiddler
{{{
<<toolbar sendTiddler>>
}}}
!!!!!runTiddler
{{{
<<toolbar runTiddler>>
}}}
!!!!!revertTiddler
{{{
<html><hide linebreaks><a href="javascript:;"
    title="reload the last SAVED version of this tiddler"
    onclick="
        var here=story.findContainingTiddler(this); if (!here) return;
        var tid=here.getAttribute('tiddler');
        var t='\<\<loadTiddlers [[tiddler:'+tid+']] '+document.location.href+' confirm force noreport\>\>';
        var e=document.getElementById('executeRevertTiddler');
        if (e) e.parentNode.removeChild(e);
        e=document.createElement('span'); e.id='executeRevertTiddler';
        wikify(t,e);
    ">revert</a>
</html>
}}}
!!!!!saveTiddler
{{{
<<toolbar +saveTiddler>>
}}}
!!!!!saveCloseTiddler
{{{
<<toolbar +saveCloseTiddler>>
}}}
!!!!!cancelTiddler
{{{
<script> return "<<toolbar -cancelTiddler>>"; </script>
}}}
!!!!!deleteTiddler
{{{
<<toolbar deleteTiddler>>
}}}
!!!!!fields
{{{
<<toolbar fields>>
}}}
!!!!!options
{{{
&nbsp;{{fine{//options://}}}&nbsp;
}}}
!!!!!autosizeCheckbox
{{{
<script label="autosize" title="automatically resize editor to fit contents">
    var txt="<input type='checkbox' style='padding:0;margin:0;' %0>autosize";
    var chk=place.innerHTML.toLowerCase().indexOf("checked")==-1?"checked":"";
    config.commands.autosizeEditor.handler(null,place,null);
    place.innerHTML=txt.format([chk]);
</script><script>
    place.lastChild.innerHTML="<input type='checkbox' style='padding:0;margin:0;'>autosize";
    place.lastChild.style.fontWeight="normal";
    place.lastChild.style.fontSize="90%";
</script>
}}}
!!!!!previewCheckbox
{{{
<script label="preview" title="show key-by-key preview">
    var txt="<input type='checkbox' style='padding:0;margin:0;' %0>preview";
    var chk=place.innerHTML.toLowerCase().indexOf("checked")==-1?"checked":"";
    config.commands.previewTiddler.handler(null,place,null);
    place.innerHTML=txt.format([chk]);
</script><script>
    place.lastChild.innerHTML="<input type='checkbox' style='padding:0;margin:0;'>preview";
    place.lastChild.style.fontWeight="normal";
    place.lastChild.style.fontSize="90%";
</script>
}}}
!!!!!quickeditCheckbox
{{{
<script label="quickedit" title="show QuickEdit toolbar buttons">
    var opt="chkShowQuickEdit";
    config.commands.toggleQuickEdit.handler(null,place,null);
    var chk=config.options[opt]?"CHECKED":"";
    var txt="<input type='checkbox' style='padding:0;margin:0;' option='%0' %1>quickedit";
    place.innerHTML=txt.format([opt,chk]);
</script><script>
    var opt="chkShowQuickEdit";
    var chk=config.options[opt]?"CHECKED":"";
    var txt="<input type='checkbox' style='padding:0;margin:0;' option='%0' %1>quickedit";
    place.lastChild.innerHTML=txt.format([opt,chk]);
    place.lastChild.style.fontWeight="normal";
    place.lastChild.style.fontSize="90%";
</script>
}}}
!!!!!minorchangesCheckbox
{{{
<script label="minor changes">
    var opt="chkForceMinorUpdate";
    config.options[opt]=!config.options[opt];
    config.macros.option.propagateOption(opt,"checked", config.options[opt],"input");
    var chk=config.options[opt]?"CHECKED":"";
    var txt="<input type='checkbox' style='padding:0;margin:0;' option='%0' %1>minor changes";
    place.innerHTML=txt.format([opt,chk]);
</script><script>
    var opt="chkForceMinorUpdate";
    var chk=config.options[opt]?"CHECKED":"";
    var txt="<input type='checkbox' style='padding:0;margin:0;' option='%0' %1>minor changes";
    place.lastChild.innerHTML=txt.format([opt,chk]);
    place.lastChild.style.fontWeight="normal";
    place.lastChild.style.fontSize="90%";
    place.lastChild.title=config.optionsDesc[opt];
</script>
}}}
!!!!!end of extra commands
<<<
===
<<tabs txtTopic-IndexTabs
AB 'list "A/B" tiddlers' [[Topic-Index::AB]]
C 'list "C" tiddlers' [[Topic-Index::C]]
DEF 'list "D/E/F" tiddlers' [[Topic-Index::DEF]]
GHI 'list "G/H/I" tiddlers' [[Topic-Index::GHI]]
JKL 'list "J/K/L" tiddlers' [[Topic-Index::JKL]]
MNO 'list "T/N/O" tiddlers' [[Topic-Index::MNO]]
P 'list "P" tiddlers' [[Topic-Index::P]]
QR 'list "Q/R" tiddlers' [[Topic-Index::QR]]
S 'list "S" tiddlers' [[Topic-Index::S]]
T 'list "T" tiddlers' [[Topic-Index::T]]
UVW 'list "U/V/W" tiddlers' [[Topic-Index::UVW]]
etc 'list "X/Y/Z/0-9" tiddlers' [[Topic-Index::XYZ09]]
>> {{hidden{

/%
AB:/%%/ <<tiddler Topic-Index##Col2 with: A B>>

/%
C:/%%/ <<tiddler Topic-Index##Col3-span with: C>>

/%
DEF:/%%/ <<tiddler Topic-Index##Col3 with: D E F>>

/%
GHI:/%%/ <<tiddler Topic-Index##Col3 with: G H I>>

/%
JKL:/%%/ <<tiddler Topic-Index##Col3 with: J K L>>

/%
MNO:/%%/ <<tiddler Topic-Index##Col3 with: T N O>>

/%
P:/%%/ <<tiddler Topic-Index##Col3-span with: P>>

/%
QR:/%%/ <<tiddler Topic-Index##Col2 with: Q R>>

/%
S:/%%/ <<tiddler Topic-Index##Col3-span with: S>>

/%
T:/%%/ <<tiddler Topic-Index##Col3-span with: T>>

/%
UVW:/%%/ <<tiddler Topic-Index##Col3 with: U V W>>

/%
XYZ:/%%/ <<tiddler Topic-Index##Col3 with: X Y Z>>

/%
XYZ09:/%%/ <<tiddler Topic-Index##Col4 with: X Y Z '0-9'>>

/%
0to9:/%%/ <<tiddler Topic-Index##Col3 with: '0-3' '4-6' '7-9'>>

// /%
// 0to9:/%%/ <<tiddler Topic-Index##Col1 with: '0-9'>>

/%
*Col
!!!Col
{{mapH1{$1}}}{{dp33{<<list noCase title '[$1]'>>}}} {{mapH1{$2}}}{{dp33{<<list noCase title '[$2]'>>}}} {{mapH1{$3}}}{{dp33{<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}

!!!Col1
{{mapH1{$1}}}{{dp100{ <<list noCase title '[$1]'>>}}}
!!!end

*Col2
!!!Col2
{{dp50{ {{mapH1{$1}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$1")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}} {{dp50{ {{mapH1{$2}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$2")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}}
{{dp100{<br>}}}
!!!end

*Col3
!!!Col3
{{dp33{ {{mapH1{$1}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$1")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}} {{dp33{ {{mapH1{$2}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$2")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}} {{dp33{ {{mapH1{$3}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$3")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}}
{{dp100{<br>}}}
!!!end

*Col3-span
!!!Col3-span
{{threecolumns{ {{mapH1{$1}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$1")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}}
{{dp100{<br>}}}
!!!end

*Col4
!!!Col4
{{dp25{ {{mapH1{$1}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$1")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}} {{dp25{ {{mapH1{$2}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$2")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}} {{dp25{ {{mapH1{$3}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$3")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}} {{dp25{ {{mapH1{$4}}}
<<forEachTiddler
 where
 '! tiddler.tags.contains("Comment") && ! tiddler.tags.contains("excludeLists") && tiddler.title.startsWith("$4")'
    write
        '"* [["+tiddler.title+"]]\n"'
>>
}}}
{{dp100{<br>}}}
!!!end

!!!ColAZ3
{{dp33{''$1''-[$2]
<<list noCase title '$1[$2]'>>}}} {{dp33{''$1''-[$3]
<<list noCase title '$1[$3]'>>}}} {{dp33{''$1''-[$4]
<<list noCase title '$1[$4]'>>}}}
{{dp100{<br>}}}
!!!end

!!!ColAZ4
{{dp25{''$1''-[$2]
<<list noCase title '$1[$2]'>>}}} {{dp25{''$1''-[$3]
<<list noCase title '$1[$3]'>>}}} {{dp25{''$1''-[$4]
<<list noCase title '$1[$4]'>>}}} {{dp25{''$1''-[$5]
<<list noCase title '$1[$5]'>>}}}
{{dp100{<br>}}}
!!!end

!!!Col0to9
{{dp33{''$1''<<list noCase title '[$1]'>>}}} {{dp33{''$2''
<<list noCase title '[$2]'>>}}} {{dp33{''$3''
<<list noCase title '[$3]'>>}}}
{{dp100{<br>}}}
!!!end
%/

 <<tiddler HideTiddlerTags>>
}}}
! Causes
!! Premature birth
!! FoO abuse
!! FoO neglect
!! Social isolation
!! Shame imprinting
! Effects
!! Detachment
* [[Disassociation]]
* Re-experiencing, [[Psychotic-features]]
* [[Sleep-troubles]], [[Stress-internalized]]
/***
|Name|UnsavedChangesPlugin|
|Source|http://www.TiddlyTools.com/#UnsavedChangesPlugin|
|Version|3.3.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|TiddlyWiki.prototype.setDirty,store.saveTiddler,store.removeTiddler|
|Description|show droplist of tiddlers that have changed since the last time the document was saved|
Display a list of tiddlers that have been changed since the last time the document was saved.  The list includes all new/modified tiddlers as well as those changed with "minor edits" enabled and any tiddlers that you import during the session, regardless of their modification date.
!!!!!Usage
<<<
{{{
<<unsavedChanges panel>> or <<unsavedChanges>>
}}}
{{indent{
the ''panel'' keyword displays a 'control panel' interface containing a droplist of unsaved tiddlers and a 'goto' button, along with a command link to 'save changes'.  Depending upon what other plugins are installed, several additional elements will also be displayed: When [[NestedSlidersPlugin]] is installed, the entire control panel is contained within a ''SLIDER''.  When [[LoadTiddlersPlugin]] is installed, a ''REVERT'' button is added.  When [[SaveAsPlugin]] is installed, a ''SAVE AS'' link is added.  When [[UploadPlugin]] is installed, an ''UPLOAD'' (or ''save to web'') link is added.  When [[TrashPlugin]] is installed and there are tiddlers tagged with<<tag Trash>>, an ''EMPTY TRASH'' link is added.
}}}
{{{
<<unsavedChanges list separator>>
}}}
{{indent{
the ''list'' keyword displays a simple space-separated list of unsaved tiddlers without any other command links.  You can specify an optional ''separator'' value that can be used in place of the default space character.  For example, you can specify {{{"<br>"}}} as the separator in order to display each link, one per line.
}}}
{{{
<<unsavedChanges command label tip>>
}}}
{{indent{
the ''command'' keyword displays a single 'command link' that, when clicked, displays a ~TiddlyWiki popup containing the list of unsaved tiddlers, the 'save changes' command and, depending upon what other plugins are installed, additional commands for 'save as', 'upload', and 'empty trash' (similar to the panel display described above).

You can specify optional ''label'' and ''tip'' parameters in the macro to customize the command link text and tooltip.  The default label for the command link is: "There %1 %0 unsaved tiddler%2...", where:
* %0 is automatically replaced with the number of unsaved changes
* %1 is either "is" (if changes=1) or "are" (if changes>1)
* %2 is either blank (if changes=1) or "s" (if changes>1)
resulting in the text: //"There is 1 unsaved tiddler...", "There are 2 unsaved tiddlers...", etc.//
}}}
<<<
!!!!!Examples
<<<
^^//note: the following examples will not display any output unless you have already created/modified tiddlers in the current document.//^^
{{{<<unsavedChanges>>}}}
<<unsavedChanges>>
----
{{{<<unsavedChanges command>>}}}
<<unsavedChanges command>>
----
{{{<<unsavedChanges list>>}}}
<<unsavedChanges list>>
----
{{{<<unsavedChanges list "<br>">>}}}
<<unsavedChanges list "<br>">>
<<<
!!!!!Revisions
<<<
2009.03.02 [3.3.3] fix handling for titles that contain HTML special chars (lt,gt,quot,amp)
2008.09.02 [3.3.2] cleanup popup list output generation and added timestamps/sizes to popup display
2008.08.23 [3.3.1] added optional custom 'label' and 'tip' params to 'command' mode and defined default values for mode, label, tip, and separator as object properties for I18N/L10N-readiness.
2008.08.21 [3.3.0] complete re-write of rendering and refresh processing to support multiple instances and automatic self-refresh (no longer depends upon core refresh notifications)
2008.08.21 [3.2.0] added 'command' option for link+popup as alternative to 'control panel' interface
2008.04.22 [3.1.2] use SaveAsPlugin instead of obsolete NewDocumentPlugin to add "save as" link
2007.12.22 [3.1.1] hijack removeTiddler() instead of low-level deleteTiddler() to correct tracking and refresh handling issues.  in saveTiddler(), check for 'tiddler rename' (title!=newtitle) and adjust list accordingly.
2007.12.21 [3.1.0] added support for {{{<<unsavedChanges list separator>>}}} usage to unsaved tiddlers as a simple list of links, embedded in tiddler content (e.g., [[MainMenu]])
2007.12.20 [3.0.0] rewrite to track ALL changed tiddlers, including imports and minor edits, regardless of saved modification dates.  Also, rewrote display logic to directly refresh macro output instead of triggering a page refresh.  The entire process is MUCH more efficient now.
2007.08.02 [2.0.0] converted from inline script
2007.01.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.UnsavedChangesPlugin= {major: 3, minor: 3, revision: 3, date: new Date(2009,3,2)};

config.macros.unsavedChanges = {
    changed: [], // list of currently unsaved tiddler titles
    defMode: "panel",
    defSep: " ",
    defLabel: "There %1 %0 unsaved tiddler%2...",
    defTip: "view a list of unsaved tiddler changes",
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var wrapper=createTiddlyElement(place,"span",null,"unsavedChanges");
        wrapper.setAttribute("mode",params[0]||this.defMode);
        wrapper.setAttribute("sep",params[1]||this.defSep); // for 'list' mode
        wrapper.setAttribute("label",params[1]||this.defLabel); // for 'command' mode
        wrapper.setAttribute("tip",params[2]||this.defTip); // for 'command' mode
        this.render(wrapper);
    },
    render: function(wrapper) {
        removeChildren(wrapper); // make sure its empty
        if (!this.changed.length) return; // no changes = no output
        switch (wrapper.getAttribute("mode")) {
            case "command": this.command(wrapper); break;
            case "list": this.list(wrapper); break;
            case "panel": default: this.panel(wrapper); break;
        }
    },
    refresh: function() {
        var wrappers=document.getElementsByTagName("span");
        for (var w=0; w<wrappers.length; w++)
            if (hasClass(wrappers[w],"unsavedChanges"))
                this.render(wrappers[w]);
    },
    list: function(place) { // show simple list of unsaved tiddlers
        wikify("[["+this.changed.join("]]"+place.getAttribute("sep")+"[[")+"]]",place);
    },
    command: function(place) { // show command link with popup list
        var c=this.changed.length;
        var txt=place.getAttribute("label").format([c,c==1?'is':'are',c==1?'':'s']);
        var tip=place.getAttribute("tip");
        var action=function(ev) { if (!ev) var ev=window.event;
            var p=Popup.create(this); if (!p) return false;
            var d=createTiddlyElement(p,"div");
            d.style.whiteSpace="normal"; d.style.width="auto"; d.style.padding="2px";
            // gather pretty links for changed tiddlers
            var list=[]; var item=" &nbsp;[[%1 - %0 (%2 bytes)|%0]]&nbsp; ";
            for (var i=config.macros.unsavedChanges.changed.length-1; i>=0; i--) {
                var tid=store.getTiddler(config.macros.unsavedChanges.changed[i]);
                if (!tid) continue;
                var when=tid.modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
                list.push(item.format([tid.title,when,tid.text.length]));
            }
            wikify("@@white-space:nowrap;"+list.join("<br>")+"@@",d);
            if (!readOnly) {
                var t="\n----\n";
                t+="@@white-space:nowrap;display:block;text-align:center; &nbsp;";
                t+="<<saveChanges>>";
                t+=config.macros.saveAs?" | <<saveAs>>":"";
                t+=config.macros.upload?" | <<upload>>":"";
                t+=(config.macros.emptyTrash&&store.getTaggedTiddlers("Trash").length)?" | <<emptyTrash>>":"";
                t+="&nbsp; @@";
                wikify(t,d);
            }
            Popup.show(p,false);
            ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation();
            return(false);
        }
        createTiddlyButton(place,txt,tip,action,"button");
    },
    panel: function(place) { // show composite droplist+buttons+commands
        // gather changed tiddlers (in reverse order by date - most recent first)
        var tids=[]; for (var i=this.changed.length-1; i>=0; i--)
            { var t=store.getTiddler(this.changed[i]); if (t) tids.push(t); }
        tids.sort(function(a,b){return a.modified<b.modified?-1:(a.modified==b.modified?0:1);});
        // generate droplist items
        var list=[]; var item='<option value="%0">%1 - %0 (%2 bytes)</option>';
        for (var i=tids.length-1; i>=0; i--) {
            var when=tids[i].modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
            list.push(item.format([tids[i].title.htmlEncode(),when,tids[i].text.length]));
        }
        // display droplist, buttons, and command links
        var out=''; var c=this.changed.length;
        var NSP=config.formatters.findByField("name","nestedSliders");
        var summary=this.defLabel.format([c,c==1?'is':'are',c==1?'':'s'])
        out+=NSP?'+++(unsaved)['+summary+'|'+this.defTip+']...':(summary+"\n");
        out+='<html><form style="display:inline"><!--\
            --><select size="1" name="list" \
                title="select a tiddler to view" \
                onchange="var v=this.value; if (v.length) story.displayTiddler(null,v);"><!--\
            -->'+list.join('')+'<!--\
            --></select><!--\
            --><input type="button" value="goto" onclick="this.form.list.onchange();">';
        if (config.macros.loadTiddlers)  {
            out+='<input type="button" value="revert" \
                title="import the last saved version of this tiddler" \
                onclick="var v=this.form.list.value; if (!v.length) return; \
                    var t=\'<\'+\'<loadTiddlers [[tiddler:\'+v+\']] \'; \
                    t+=document.location.href; \
                    t+=\' confirm force noreport>\'+\'>\'; \
                    var e=document.getElementById(\'executeRevert\'); \
                    if (e) e.parentNode.removeChild(e); \
                    e=document.createElement(\'span\'); \
                    e.id=\'executeRevert\'; \
                    wikify(t,e);">';
        }
        out+='</form></html>';
        if (!readOnly) {
            out+='\n{{small nowrap{';
            out+="<<saveChanges>>";
            out+=config.macros.saveAs?" | <<saveAs>>":"";
            out+=config.macros.upload?" | <<upload>>":"";
            out+=(config.macros.emptyTrash&&store.getTaggedTiddlers("Trash").length)?" | <<emptyTrash>>":"";
            out+='}}}';
        }
        out+=NSP?'===':'';
        wikify(out,place);
    }
};

// hijack store.saveTiddler() to track changes to tiddlers
if (store.showUnsaved_saveTiddler==undefined) {
    store.showUnsaved_saveTiddler=store.saveTiddler;
    store.saveTiddler=function(title,newtitle) {
        if (title!=newtitle) {
            var i=config.macros.unsavedChanges.changed.indexOf(title);
            if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove old from list
        }
        var i=config.macros.unsavedChanges.changed.indexOf(newtitle);
        if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove new title from list
        config.macros.unsavedChanges.changed.push(newtitle); // add new title to END of list
        var t=this.showUnsaved_saveTiddler.apply(this,arguments);
        if (!this.notificationLevel) config.macros.unsavedChanges.refresh();
        return t;
    }
}

// hijack store.removeTiddler() to track changes to tiddlers
if (store.showUnsaved_removeTiddler==undefined) {
    store.showUnsaved_removeTiddler=store.removeTiddler;
    store.removeTiddler=function(title) {
        var i=config.macros.unsavedChanges.changed.indexOf(title);
        if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove from list
        this.showUnsaved_removeTiddler.apply(this,arguments);
        if (!this.notificationLevel) config.macros.unsavedChanges.refresh();
    }
}

// hijack store.setDirty() function to reset change list after file save
// note: do NOT hijack the prototype function.  This hijack should only be applied to
// the main 'store' instance only (i.e., don't refresh when loading temporary store
// as part of ImportTiddlers processing)
if (store.showUnsaved_setDirty==undefined) {
    store.showUnsaved_setDirty=store.setDirty;
    store.setDirty = function(flag) {
        var refresh=this.isDirty() && !flag; // 'dirty' to 'clean', force a refresh...
        this.showUnsaved_setDirty.apply(this,arguments); // but change the flag first.
        if (refresh) {
            config.macros.unsavedChanges.changed=[]; // clear changed list
            config.macros.unsavedChanges.refresh();
        }
    }
}
//}}}
Part of me wants to put links for some of drivel out there, but I don't have the energy or the stomach.  

Suffice to say that long before diagnosis, the two of us would joke about a proposed anniversary ritual in which we set fire to a couple of "marriage help" books.  

Only sometimes is it a matter of bad guidance.  More often it's that we are immune to it, the same way we are immune to [[Marriage-counseling]].  
This does awaken deep respect for the writer or social worker who can gently and unobtrusively include a wide range of people, even those who cannot readily respond to the counsel.  
There are some informative and horrifying web sites about Asperger's written from a spouse's perspective.  Intensely negative, presented in the voice of an angry //exposé//, they warn about emotional damage that accrues from not being validated.  //No one can comprehend or believe what you are going through!// - which means that
* attempts to get marriage counseling are unproductive, 
* a supportive social network is unobtainable, 
* and burn-out is inevitable for the spouse.
In my experience, this is all been largely true - but not totally.  

On the other side of the Information Space, big names in health care have posted lots of advice that is [[ignorant, insipid and unhelpful|Useless-Resources]].  Nothing reinforces one's sense of isolation like reading a few articles that pretend to offer hope while failing to discuss the cost of loneliness in marriage or the need for diligent [[Self-care]].  Most articles on "Cassandra Syndrome" are pointless or confused (as with any on the Internet); the better ones dwell on the sense of being misunderstood within marriage, but not enough on the isolation within the larger social, family and healthcare community.  
* [[Ineffable-hardship]]
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<span class='title' macro='view title'></span>
<!-- <div class='subtitle fine'>
<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='subtitle fine'>
<!-- <span macro='view modified date'></span> --> </div>
<div class='tagClear'></div>
<!--- <div class='tagging' macro='tagging'></div> //SDM -->
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='toolbar' style='line-height:100%;margin-top:.5em;'><a href="javascript:;"
    onclick="window.scrollTo(0,ensureVisible(story.findContainingTiddler(this)));return false;"
    onmouseover="this.title='scroll to top of '+story.findContainingTiddler(this).getAttribute('tiddler')">&#x25b2;</a>
</div>
<div class='tagClear'></div>
<!--}}}-->
Year 24

Once again, the dog rises as a prime subject for difficulty in our marriage.  I have spent a few moments of the day chaffing as T promises and feeds the dog treats from the counter and allows the dog to come up on to the edge of the bed and wake her up.

T is incensed at my handling of moments when the dog strays into the roadway because she feels I do not counter this with enough instant and forceful decision.  I disagree.  I feel that I am training the dog to stay out of the roadway.  In contrast, T is not teaching anything to the dog but simply satisfying her own rigid requirement.

!! Keeping the dog safe from the street

At the close of the day yesterday T wanted to talk more about walking the dog and the concern about my approach forward the dog and the street.  

I made a resolve to be clear and gracious, and we had a short prayer to start with.  

I made a diagram of the street.  It didn’t add much.  

The upshot was that she believes I'm endangering the dog.  T believes in not allowing the dog to remain street for any amount of time, which is prevented by pulling on her collar and also scolding the dog and saying no in a sharp tone.  

I explained my own procedure, emphasizing that if there is a vehicle in the roadway, everything becomes more urgent and that I do make allowance for stressful circumstances and easily make the dog more prone to step into the roadway or the gutter, 

the main difference I think can be boiled down to.  I don't well on the colors are urgently or scold T objects that I reward the dog for getting onto the sidewalk from the road.  She voiced again and again are worried I was training the dog into the road to get a reward which we have talked about before.  

As a general problem in behavior.  I told her I do let the dog knows what should not be in the road.  Although I'm sure I cannot scold is definitely as T

My approach is different in that if there is no car in the roadway.  I am less reticence to quickly pull in the dog's collar and I don't scold so sharply, though I do say no and use positive commands to bring… On the sidewalk.  Visually, the command and I give a reward, and that was a think that the rewards inappropriate to do larger pattern of behavior to the dog so it will reinforce them into the road.
!! The dog in the park

It is the evening dog walk and I'm letting the dog run around in a park area without her lead.  This is about the sixth occasion for that.  On the fourth occasion I had to temper my approach because she got excited running around and would not return to me.  I've decided to try and do it when I think she's more tractable.  

I should mention that I do follow some rules.  There are two places of parkland near our house that are convenient because they have very limited egress they are formed by bows in the river and the result is I can feel confident the dog will not wander off in just any direction.  I try to make sure there aren’t a lot of people around, and there is no left-over barbeque garbage.

Of course, this decision to let her run a bit brings to the fore all the Asperger's stuff, because T does not countenance this.  [[My-limited-options]]

!! Later

What I'm realizing about the dog walking issue is that T is now experiencing strain, because she has to walk Lydia or the dog will be unsafe.  This is because of a misguided view that I'm endangering the dog.  

So we both experience role strain, but a lot of T's strain is based in crazy thinking.  In her effort to make life okay, she shoulders an extra load – which, of course, leaves her with less energy for other tasks; and these I might pick up, which contributes to my role strain.  

My matrix chart about walking the dog is growing.  We have T's resolve against letting me walk the dog, which leads to her role strain, which leads to my role strain –reciprocal stress.  We have the incident when I described the issues and did not remember a second dog-related trauma (I still remember only one, although I have not said so) – which provoked her feelings of betrayal and being uncared for.  And we should count the reaction by the therapist when she cut me off.  He said the interruption was inappropriate – and indeed, that behavior complicates conversations generally, not just in the laboratory setting of counseling.
This revision includes updates to resolve the following open issues and/or pull requests:
^^''//(click an individual heading below to toggle details, or click here to <html><a href="javascript:;" class="TiddlyLink"
onclick="
	var show='show all details';
        var hide='hide all details';
	var here=story.findContainingTiddler(this); if (!here) return false;
	var elems=here.getElementsByTagName('*');
	var state=(this.innerHTML==show)?'none':'block';
	for (var e=0; e<elems.length; e++) { var p=elems[e];
		if (p.className!='sliderPanel' || p.style.display!=state) continue;
		p.previousSibling.onclick();
	}
	this.innerHTML=state=='none'?hide:show;
	return false;
">show all details</a><nowiki></html>)//''^^
*<<slider "" "WhatsNew##112" "112: Allow international characters and leading/trailing whitespace in slice names">>
*<<slider "" "WhatsNew##132" "132: URLs containing square brackets not recognized">>
*<<slider "" "WhatsNew##147" "147: Transclusion problem on startup">>
*<<slider "" "WhatsNew##154" "154: Parametric transclusion doesn't work properly with refreshing">>
*<<slider "" "WhatsNew##156" "156: Fix javaDebugInformation function">>
*<<slider "" "WhatsNew##157" "157: Improve the String.prototype.escapeRegExp utility">>
*<<slider "" "WhatsNew##159" "159: Cookies are not working in Opera">>
*<<slider "" "WhatsNew##160" "160: Remove the syncing item from the default ToolbarCommands">>
*<<slider "" "WhatsNew##161" "161: Make new tiddlers open below below the one containing newTiddler macro">>
*<<slider "" "WhatsNew##162" "162: Substitute missing arguments of parametric transclusions with an empty line">>
*<<slider "" "WhatsNew##166" "166: Use default editmode text for themes with non-standard template names">>
*<<slider "" "WhatsNew##170" "170: literal embedded HTML syntax breaks PhoneGap">>
/%
!!!112
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/pull/112
Slice names currently only recognize standard Latin characters, and do not permit flexible use of whitespace both within and/or surrounding a slice name.
''Changes:''
The {{{TiddlyWiki.prototype.slicesRE}}} regular expression has been updated to allow international characters and variable whitespace.
''Expected Impact:''
Slice names currently recognized in existing documents will continue to be handled as before.  Slice names may now contain international characters and/or spaces within the slice name, and can use variable surrounding whitespace to help format the slice table defintion (e.g., for readability of slice tables in edit mode).
<<<
!!!132
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/132
If a URL embedded in tiddler content contains square brackets (e.g., using literal {{{"[["}}} and {{{"]]"}}} for a perma-link to another ~TiddlyWiki document), the brackets are not properly recognized by ~TiddlyWiki as being part of the URL, and the resulting link is incorrect.
''Changes:''
The {{{config.textPrimitives.urlPattern}}} regular expression has been updated to permit square brackets to occur within the URL text.
''Expected Impact:''
Embedded URLs that contain perma-links using square brackets will now be properly recognized.  No impact on URLs not containing square brackets.  No impact on other wiki formats.
<<<
!!!147
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/147
During startup processing, tiddlers are being rendered and then automatically refreshed.  When a tiddler contains transcluded content that uses macro parameter substitutions, the additional refresh handling will re-process any substitution macro parameters, which can cause unintended side effects due to processing of evaluated parameters.
''Changes:''
The refresh handler for tiddlers now checks for the 'startingUp' global flag, and bypasses the extra (and unnecessary) re-rendering of the tiddler.
''Expected Impact:''
This only affects startup processing, and will have no impact on subsequent display updates during the session.
For additional technical details, see http://startuptransclusions.tiddlyspot.com/ and http://tobibeer.tiddlyspace.com/#startingUp
<<<
!!!154
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/154
If a parameter used with the {{{<<tiddler>>}}} macro contains square brackets, the transclusion will render properly when first displayed, but will incorrectly re-parse the parameters when automatically refreshing the transcluded content in response to changes in the source tiddler.
''Changes:''
The parameters used with {{{<<tiddler>>}}} are now stored as a pre-parsed data object, rather than a text attribute, so they don't need to be re-parsed during a refresh.
''Expected Impact:''
{{{<<tiddler>>}}} parameters with square brackets will be processed correctly when content is refreshed.  No impact on parameters not containing square brackets.
<<<
!!!156
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/pull/156
javaDebugInformation() function was calling a misnamed applet function
''Changes:''
The function name has been corrected.
''Expected Impact:''
This is a development utility function that is only invoked manually when debugging a failure in TiddlySaver.jar, and will have NO effect during normal TiddlyWiki operation.
<<<
!!!157
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/157
The ~TWCore utility function, escapeRegExp(), does not properly handle special symbols, "dash" (-) and "slash" (/).  In addition, this same function has been re-implemented in ~TiddlyWiki5, using a much more efficient method that is 100% backward-compatible with ~TiddlyWiki Classic.
''Changes:''
The code for {{{String.escapeRegExp()}}} has been replaced with the newer implementation from ~TiddlyWiki5.
''Expected Impact:''
Unknown, but none expected.
<<<
!!!159
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/159
The ~TWCore utility function, encodeHashMap() is used to "pack" the ~TiddlyWiki option values when storing persistent settings in a browser-based cookie.  This function uses double-quotes around the options value.  However, double-quotes are officially illegal in a cookie value.  Although many browsers allow the use of double-quotes anyway, some browsers, such as Opera, will reject cookie values containing double-quotes.
''Changes:''
The ~TWCore {{{saveCookie()}}} and {{{loadCookies()}}} functions have been updated to encode/decode all double-quotes into "%22" character codes, allowing them to be stored and retrieved from all browsers, without violating formal specifications for allowed cookie values.  To preserve backward compatibility, the new, quote-encoded cookie is named "~TiddlyWikiOptions" rather than just "~TiddlyWiki", so that previous versions of TiddlyWiki will continue to use the old cookie name, while new version will use the updated cookie name.
''Expected Impact:''
The first time a copy of TW290 or above is opened, the option values from any existing "~TiddlyWiki" cookie will be copied to the new "~TiddlyWikiOptions" cookie and use %22 encoding whenever a cookie value is changed.  Once the new option cookie is stored, changes to option values made using older versions of TiddlyWiki will not be reflected in version TW290 and above.
<<<
!!!160
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/160
The default ~ViewToolbar definition in ~ToolbarCommands, includes a command for "syncing".  However, the supporting 'sync' handlers were removed from ~TiddlyWiki some time ago, so this command item produces a non-functional blank space when the toolbar is displayed.
''Changes:''
The default Shadow definition for ~ToolbarCommands has been updated.
''Expected Impact:''
Elimination of errant whitespace between toolbar command items.  Custom server-side environments such as TiddlySpace that provide their own 'sync' handlers may need to update the default ~ToolbarCommands to restore the 'sync' menu item.
<<<
!!!161
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/161
By default, the {{{<<newTiddler>>}}} and {{{<<newJournal>>}}} macros open a newly created tiddler at the top of the story column.  For the default use from the sidebar controls, this is a reasonable behavior.  However, if the newTiddler/newJournal macro is placed within tiddler content, then the placement of the newly created tiddler can cause the page display to scroll the current tiddler out of view, which can disrupt the workflow.
''Changes:''
The newTiddler/newJournal macro handler has been updated so that new tiddlers will automatically appear below the one that contains the macro, rather than always at the top of the story column.
''Expected Impact:''
Reduced scrolling and improved workflow when creating new tiddlers.
<<<
!!!162
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/162
When using {{{<<tiddler TiddlerName with: param param ...>>}}}, occurences of $1 through $9 contained in the source tiddler are replaced with the corresponding parameter values from the {{{<<tiddler>>}}} macro.  However, any unused markers are left as-is; e.g., if only two parameters are provided, only $1 and $2 will be replaced, and instances of $3 through $9 will remain in the rendered content.  For some use-cases, removing any remaining markers is preferable; however, changing the current default behavior may result in unexpected results for existing users.
''Changes:''
A new option, ''chkRemoveExtraMarkers'', has been added to AdvancedOptions to permit the alternative handling for markers.  The option defaults to undefined/false, which results in the existing behavior.  Setting this option enables the alternative handling that removes any transcluded markers not otherwise replaced by macro parameter values.
''Expected Impact:''
None, unless chkRemoveExtraMarkers option flag is enabled.
<<<
!!!166
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/166
When a theme defines an edit template with a name other than "~EditTemplate", the default text shown when editing a new tiddler was incorrectly using the viewmode text ("The tiddler '...' doesn't yet exist. Double-click to create it"), instead of the correct editmode text ("Type the text for '...'").
''Changes:''
The tiddler display handler now checks for the edit template name as defined by the current theme, rather than always looking for the standard template name.
''Expected impact:''
Themes that use an alternative name for the ~EditTemplate will now use the correct default text when editing a new tiddler.
<<<
!!!170
<<<
''Description:''
https://github.com/TiddlyWiki/tiddlywiki/issues/170
When submitting ~TiddlyWiki documents to http://build.phonegap.com, they produced mangled output because the recreateOriginal() function includes embedded /body and /html syntax.
''Changes:''
The code within recreateOriginal() has been changed to split literal HTML syntax into pieces and use '+' to rejoin them, so that the strings are unaffected, but PhoneGap will not stumble on them.
''Expected impact:''
No effect on TiddlyWiki usage.  Allows TiddlyWiki Classic documents to be correctly used in PhoneGap projects.
<<<
!
%/
<<matchTags "* %0" "\n" wiki >>
* http://www.headjump.de/article/arrows-and-boxes
* In November 2010 I found the [[Quickstart Basics version|http://www.tiddlytools.com/quickstart/basics.html]] of ~TiddlyWiki.  These plug-ins really made things exciting.
* Thrills of late December 2010 are from http://apm-plugins.tiddlyspot.com.
*  ditto, June 2013:  http://yakovl.bplaced.net/TW/ExtraFilters.html#[[TiddlyWiki%20filters]]
/***
|Name|WikifyPlugin|
|Source|http://www.TiddlyTools.com/#WikifyPlugin|
|Documentation|http://www.TiddlyTools.com/#WikifyPluginInfo|
|Version|1.1.4|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|substitute fields, slices, or computed values into a wiki-syntax format string and render results dynamically|
The {{{<<wikify>>}}} macro allows you to easily retrieve values from custom tiddler fields, tiddler slices, computed values (using javascript) or just plain old literals, and assemble them into small bits of generated wiki-syntax text content that can be rendered directly into a tiddler, or used in the ViewTemplate or EditTemplate to add dynamically-generated content to each tiddler.

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

config.macros.wikify={
    handler: function(place,macroName,params,wikifier,paramString,tiddler) {
        var fmt=params.shift();
        var values=[];
        var out="";
        if (!fmt.match(/\%[0-9]/g) && params.length) // format has no markers, just join all params with spaces
            out=fmt+" "+params.join(" ");
        else { // format param has markers, get values and perform substitution
            while (p=params.shift()) values.push(this.getFieldReference(place,p));
            out=fmt.format(values);
        }
        if (macroName=="wikiCalc") out=eval(out).toString();
        wikify(out.unescapeLineBreaks(),place,null,tiddler);
    },
    getFieldReference: function(place,p) { // "slicename::tiddlername" or "fieldname@tiddlername" or "fieldname"
        if (typeof p != "string") return p; // literal non-string value... just return it...
        var parts=p.split(config.textPrimitives.sliceSeparator);
        if (parts.length==2) {// maybe a slice reference?
            var tid=parts[0]; var slice=parts[1];
            if (!tid || !tid.length || tid=="here") { // no target (or "here"), use containing tiddler
                tid=story.findContainingTiddler(place);
                if (tid) tid=tid.getAttribute("tiddler")
                else tid="SiteSlices"; // fallback for 'non-tiddler' areas (e.g, header, sidebar, etc.)
            }
            var val=store.getTiddlerSlice(tid,slice);  // get tiddler slice value
        }
        if (val==undefined) {// not a slice, or slice not found, maybe a field reference?
            var parts=p.split("@");
            var field=parts[0];
            if (!field || !field.length) field="checked"; // missing fieldname, fallback: checked@tiddlername
            var tid=parts[1];
            if (!tid || !tid.length || tid=="here") { // no target (or "here"), use containing tiddler
                tid=story.findContainingTiddler(place);
                if (tid) tid=tid.getAttribute("tiddler")
                else tid="SiteFields"; // fallback for 'non-tiddler' areas (e.g, header, sidebar, etc.)
            }
            var val=store.getValue(tid,field);
        }
        // not a slice or field, or slice/field not found... return value unchanged
        return val===undefined?p:val;
    }
}
//}}}
//{{{
// define alternative macroName for triggering pre-rendering call to eval()
config.macros.wikiCalc=config.macros.wikify;
//}}}
/***
|Name|WikifyPlugin|
|Source|http://www.TiddlyTools.com/#WikifyPlugin|
|Documentation|http://www.TiddlyTools.com/#WikifyPluginInfo|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for WikifyPlugin|
The {{{<<wikify>>}}} macro retrieves values from tiddler slices, sections, or fields and then inserts those values into wiki-formatted output.  The {{{<<wikiCalc>>}}} macro performs the same processing as {{{<<wikify>>}}} and, in addition, passes the assembled text content through javascript's {{{eval()}}} function before rendering the results.  This allows you to, for example, construct and compute mathematical expressions that use input values extracted from tiddler fields or slices.
!!!!!Usage
<<<
{{{
<<wikify "format" value value value value ...>>
<<wikiCalc "format" value value value value ...>>
}}}
* ''format'' specifies the output format of the wiki-syntax content (or javascript expression, if using {{{<<wikiCalc>>}}}).  Use //substitution markers// "%0" through "%9" to insert each value parameter into the formatted content, replacing its corresponding marker.  If the ''format'' is blank (or does //not// contain any substitution markers), then all values are simply joined together (with spaces) for output.  If {{{<<wikiCalc>>}}} is used, the formatted output is evaluated as a javascript expression before rendering.
* ''value'' parameters (space-separated), specified using any of:
** slices:<br>''::slicename'' or ''tiddlername::slicename'' or ''here::slicename''
** sections:<br>''##sectionname'' or ''tiddlername##sectionname'' or ''here##sectionname''
** fields:<br>''fieldname'' or ''fieldname@tiddlername'' or ''fieldname@here''
** evaluated javascript:<br>''"""{{...}}"""''
** literal text:<br>''"..."''
Note: if a slice/section/field reference omits the tiddlername (or uses the special keyword, ''here''), the current tiddler is implied.
<<<
!!!!!Examples
<<<
{{{
<<wikify [[This tiddler is: %0 using %1 bytes (last author: %2)]] title {{tiddler.text.length}} modifier>>
<<wikify [[The source URL for this plugin is: %0]] 'here::Source'>>
<<wikify [[The tiddler has been changed %0 times]] changecount@here>>
<<wikify [[The Primary Mid color is: @@background:%0;%0@@]] 'ColorPalette::PrimaryMid'>>
<<wikify [[This current user is: %0]] {{config.options.txtUserName}}>>
}}}
<<wikify [[This tiddler is: %0 using %1 bytes (last author: %2)]] title {{tiddler.text.length}} modifier>>
<<wikify [[The source URL for this plugin is: %0]] 'here::Source'>>
<<wikify [[The tiddler has been changed %0 times]] changecount@here>>
<<wikify [[The Primary Mid color is: @@background:%0;%0@@]] 'ColorPalette::PrimaryMid'>>
<<wikify [[This current user is: %0]] {{config.options.txtUserName}}>>
<<<
!!!!!Revisions
<<<
2011.03.07 1.2.0 added handling in getFieldReference() for retrieving section values and eliminated ~SiteSlices, ~SiteFields and 'checked' (fieldname) fallbacks.
2009.03.29 1.1.4 in handler(), pass 'tiddler' value to wikify() to fix macro errors in rendered content
2009.03.26 1.1.3 unescape output before wikify so that \n can be used in formatting string
2008.11.16 1.1.2 in getFieldReference(), if not a field/slice reference (or field/slice is not found), return string input unchanged instead of returning a blank string.
2008.03.08 1.1.1 size reduction: documentation moved to [[WikifyPluginInfo]]
2008.03.07 1.1.0 added {{{<<wikicalc>>}}} variant for evaluating assembled output as javascript before rendering the result
2007.11.11 1.0.1 in handler(), fixed problem where a trailing space was created when no substitution markers were present in the format param.
2007.06.22 1.0.0 initial release
<<<
ASD Wiki
/***
|''Name:''|XCaseListPlugin|
|''Description:''|Adds a new command ''xCase'' to the core list macro|
|''Author:''|Mario Pietsch|
|''Version:''|0.3|
|''Date:''|2010.08.03|
|''Status:''|''beta''|
|''Source:''|http://apm-plugins.tiddlyspot.com/#XCaseListPlugin|
|''License''|[[MIT License]]|
|''CoreVersion:''|2.5.0|
|''Requires:''||
|''Documentation:''|this file|
|''Keywords:''|list, sort, not case sensitive, filter|

!Description
This plugin performs a alphabetical sort for tiddlers. Default it is not case sensitive. That means ab = AB = aB = Ab! And it does some little more filtering using the RegExp syntax. The RegExp Syntax can be a little bit tricky to read and configure. But the best description I have found is at [[regular-expressions.info]]

!!!Example
{{{
<<list xCase title '[m]'>>
}}}
< <list xCase title '[m]'>>

!Default Format
{{{
<<list xCase>>
}}}

!More Possibilities
<<<
!!!Reverse sort order
{{{
<<list xCase -title >>
}}}

!!!Some basic filtering
*Every tiddler title, that starts with a number from 0 to 9.
{{{
<<list xCase title '[0-9]'>>
}}}

*Every tiddler title, that starts with an ''"a"'' or ''"b"'' or ''"c"''.
{{{
<<list xCase title '[abc]'>>
}}}

*Every tiddler title, that starts with exactly ''abc''.
{{{
<<list xCase title 'abc'>>
}}}
<<<

!!!Some advanced filtering
<<<
*same as above but with a tagList for additional filtering.
*adding the tag filter will disable the "excludeLists" setting !!
**If you need excludeLists, than you have to define it with the expression.
*XCaseListPlugin should be compatible to [[MatchTagsPlugin]] from TiddlyTools!

{{{
<<list xCase title '[a]' "[tag[MyTag]]">>
}}}

!!!Global / Local Settings
|<<option chkXCaseListCaseSensitive>> Global sort case sensitive |Sets case sensitiv sort globally|
|<<option chkXCaseListCheckField>> Sortfield defines case sensitive |Ignores global setting. Evaluates sortField and sets the value everytime <br> {{{<<list xCase sortField ..>>}}} is executed.|

If sortField is eg: 'title' .. not case sensitive (default).
if sortField is eg: 'Title' or 'TITLE' .. case sesitive sort is active.

<<<

!Code
***/

/*{{{*/

if(!version.extensions.XCaseListPlugin) { //# ensure that the plugin is only installed once
version.extensions.XCaseListPlugin = { installed: true };

config.macros.list.xCase = {};
config.macros.list.xCase.handler = function(params){

    var lookupField = 'tags';
    var lookupValue = 'excludeLists';
    var lookupMatch = false;

    var sortField = params[1] || '+title';

    // global setting for case sensitive search
    var caseSensitive = config.options.chkXCaseListCaseSensitive || false;
    var chkSortField = config.options.chkXCaseListCheckField || false;

    // if this option is active the macro parameter sortField is parsed
    // global setting is ignored !!
    if (chkSortField) caseSensitive = (sortField != sortField.toLowerCase());
    sortField = sortField.toLowerCase();

    // check if numberedText called this macro.
    // this parameter is used by <<list numberedText ..>> macro
    // if you directly use it, it will return an unsorted list !!!
    var numberedText = false;
    if (sortField.substr(0, 1)== '#') {
        numberedText = true;
        sortField = sortField.substr(1);
        caseSensitive = false;
    }

    // check for ascending or descending sort order
    var asc = 1;
    switch (sortField.substr(0, 1)) {
        case "-":
            asc = -1;
        case "+":
            sortField = sortField.substr(1);
            break;
        default:    ;
    }

    var results = [];
    var tmpResults = [];

    // set the default for regExp filtering
    var regSnip = params[2] || '.';
    var regExp = new RegExp('^' + regSnip, 'im');
    var match = null;

    // check if [tag[...]] is set
    var tagList = params[3] || '';
    var tagMatch = tagList.length != 0;     // if list is empty everything is valid.

    if (tagMatch) {
        tmpResults = store.filterTiddlers(params[3]);
        for (var i=0, max=tmpResults.length; i<max; i++){
//          match = tmpResults[i][sortField].match(regExp);
            match = tmpResults[i].title.match(regExp);
            if (match) results.push(tmpResults[i]);
        }; // for ..
    }
    else {
        store.forEachTiddler(function(title, tiddler){
            var f = !lookupMatch;
            for (var lookup = 0; lookup < tiddler[lookupField].length; lookup++) {
                if (tiddler[lookupField][lookup] == lookupValue) {
                    f = lookupMatch;
                }
            }; // for..
            if (f) {
//              match = tiddler[sortField].match(regExp);
                match = tiddler.title.match(regExp);
                if (match) results.push(tiddler);
            }; // if (f) ..
        }); // store.forEach ..
    }; // else ..

    if (TiddlyWiki.isStandardField(sortField)) {

        if (caseSensitive) {
            results.sort(function(a, b){
                return a[sortField] < b[sortField] ? -asc : a[sortField] == b[sortField] ? 0 : asc;
            }); // results.sort
        }
        else if (numberedText) {
            // do nothing, return the list, for further processing !
        }
        else {
            results.sort(function(a, b){
                return a[sortField].toLowerCase() < b[sortField].toLowerCase() ? -asc : a[sortField].toLowerCase() == b[sortField].toLowerCase() ? 0 : asc;
            }); // results.sort
        }; // if
    }
    else {
        results.sort(function (a, b) {
            var aField = (a.fields[sortField]) ? a.fields[sortField] : 'zzz';
            var bField = (b.fields[sortField]) ? b.fields[sortField] : 'zzz';

            return aField.toLowerCase() < bField.toLowerCase() ? -asc : aField.toLowerCase() == bField.toLowerCase() ? 0 : +asc;
            });
    }
    return results;
}
} //# end of "install only once"

/*}}}*/
[[Relationship-hostage]]
[[Fight-for-oxygen]]
//{{{
readOnly=false; // TW core setting
config.options.chkInsertTabs=true; // TW core option
config.options.txtMaxEditRows="20"; // TW core option
config.options.chkShowLeftSidebar=false; // ToggleLeftSidebar
config.options.chkShowRightSidebar=true; // ToggleRightSidebar
config.options.chkSliderunsaved=true; // UnsavedChangesPlugin
config.options.chkAutoSave=false; // SDM please no

//config.options.chkStoryFold=false; // StorySaverPlugin
//}}}
The {{{<<list>>}}} macro creates a list of tiddlers of a given type. It takes the following parameters:

{{{
<<list {type} [template:<templateTiddlerName>] [emptyMessage:"<message for when the list is empty>"]>>
}}}

The template tiddlers allows you to customise the text that is displayed about each tiddler. If it is not provided, then the default of "{{{<<view title link>>}}}" is used, which just includes the title of the tiddler as a link. You could add the author to each entry in the list by setting the template to a tiddler with the text "{{{<<view title link>> by <<view modified link>>}}}".

The empty message parameter allows you to specify text to be displayed if the list of tiddlers is empty.

The following types are supported:

!all
To list all tiddlers
{{{
<<list all>>
}}}
!filter
List tiddlers that match a certain [[filter|filters syntax]]. The following example lists all plugins.
{{{
<<list filter [tag[systemConfig]]>>
}}}
!Missing
To list tiddlers that have links to them but are not defined:
{{{
<<list missing>>
}}}
!Orphans
To list tiddlers that are not linked to from any other tiddlers:
{{{
<<list orphans>>
}}}
!Shadowed
To list tiddlers shadowed with default contents:
{{{
<<list shadowed>>
}}}
!Touched
Show tiddlers that have been modified locally:
{{{
<<list touched>>
}}}
Year 24

Continuing to chart, analyze, mull and mope over Asperger's Disorder.  yesterday spent two hours at the library on my 3rd draft mind map.  I am inclined to keep going, to write every anecdote I can think of; maybe an Excel sheet so I can check of commonalities like //increases her stress, causes social friction, escalates in a cycle, relates to shame, boundaries confusion,// and so on.  Or dedicate a tiddlywiki to the subject of her.

But what is that getting me?  Once I have a full analysis, I can plug in any new observation; but what then?
<<list noCase title "2" filter "[tag[Scriptr]]">>
The tiddler macro allows you to [[transclude|Tranclusion]] the text of other tidders, or sections of other tiddlers, into your current tiddler.
!!Basic Usage
The basic usage is:
{{{
<<tiddler tiddlerToTransclude>>
}}}

This displays as:
<<<
<<tiddler tiddlerToTransclude>>
<<<
Have a look at the actual [[tiddlerToTransclude]] tiddler.
!!Transcluding Sections and Slices
Instead of transcluding an entire tiddler, you can also transclude individual [[slices|Tiddler Slices]]  or [[sections|Tiddler Sections]]:
{{{
<<tiddler [[Title::sliceLabel]]>>
<<tiddler [[Title##sectionHeading]]>>
}}}
!!Parameterised Transclusion
Using the {{{with:}}} parameter, placeholders in the transcluded content can be replaced with a desired value. For example:
{{{
<<tiddler anotherTiddlerToTransclude with:"Jim" "Oz">>
}}}
Which displays as:
<<<
<<tiddler anotherTiddlerToTransclude with:"Jim" "Oz">>
<<<
Have a look at the actual [[anotherTiddlerToTransclude]].
The view macro is a powerful macro that allows you to access fields on a given tiddler and format them.

The first parameter is the field to access (note tags does not work).
The second parameter defines a [[view type|view macro types]] which defines how the value of that field should be rendered.

{{{
<<view title link>>
}}}
renders the link of the current tiddler i.e. <<view title link>>
!Text
Renders the field exactly how it is stored.
For example
{{{
<<view modified text>>
<<view title text>>
}}}
gives:
* <<view modified text>>
* <<view title text>>

!Link
Renders the value of the field as a link
{{{
<<view title link>>
}}}
gives
* <<view title link>>

!Date
Applicable to the modified and created fields. Note a further parameter - a date format can be used.
{{{
<<view created date>>
<<view modified date "YYYY">>
}}}
gives:
* <<view created date>>
* <<view modified date "YYYY">>
See [[Date Formats]] for possible date format strings.

!Wikified
Treats the string as wikitext.
e.g.
{{{
<<view customfield wikified>>
}}}

An optional third parameter can be used to transform the text before it is wikified. For example:

{{{
<<view customfield wikified "//$1//"
}}}

The result of this example would be to make the field display in italics.

!TiddlySpace specific
See [[TiddlySpace View Types]]
BasicsPkg EmasticSystem bookmarklet excludeLists excludeSearch html journal menu script settings setup story stylesheet systemConfig template wiki EFCA_Statement Comment
Abraham Atonement Authority Broken Clothing Covenant Faith Faithfulness Family God Humility Priest Shame Sin Virtue Freedom Harvest House Living-Animal Living-Plant Redemption assembly attitude building evil money order
Anointing Christ Food House Image_Metaphor Individual Need