tiddlyspace
savetest
image/svg+xml
The tiddlyspace service uses cookies. By using the service, you are agreeing to the Cookie Policy. We have updated tiddlyspace Terms of Service, effective as of 05 December 2014. By using the service you're agreeing to the updated terms. OK, got it.
Service Update: ***Please read this important Tiddlyspace service announcement December 5th 2016 ***
Katherine Maher Uhler
last modified on 26 January 2014 by
livesentwined
//

Katherine Maher Uhler – 52 Ancestors #3


Born 18 July 1897 in New York City
Married Armin Uhler circa 1932
Death date unknown, possibly in Europe

January 23, 2014
Last night I had a dream that I was talking with a relative of Katherine Uhler. He didn't know her last name, but said that his mother was her niece. Excitedly, I shared her full name with him, and that she married Armin Uhler. Upon waking this morning, I decided that it's time to write about Katherine.

For a few months of last year, I thought Katherine was my great-grandfather's half-sister. DNA testing of Katherine's distant cousins later showed that to be unlikely. But I remain intrigued by Katherine. From the outset of the 52Ancestors Challenge, I planned to write about both Katherine and her father. They are two of my "Orphaned Ancestors" – people who left little trace in genealogical records and are now largely forgotten. These orphans of history have few or no living descendants. I have adopted them and devote some of my time to preserving their memory, even though we have no biological relationship.

Katherine Lavelle Maher was born July 18, 1897, the firstborn of James J. E. Maher and Anna O'Neill. The couple lived in Manhattan, and had married the prior October. James was a surgeon and gynecologist who married when he was nearly 40 years old. He was an Irishman born in Albany, earned his medical degree from McGill University (Montreal, Canada) in 1883, and then began practice in New York City. Anna O'Neill, fifteen years his junior, was born in 1873 in Yonkers, NY. She was the daughter of Francis O'Neill, probably from his second marriage; she had one or two full sisters and nine half-siblings from her father's third marriage.
more/hide

Katherine had no children, so I had to contact Maher cousins of hers to test the hypothesis of Dr. James J. E. Maher being my ancestor. His brother's great-grandson (through Julia Maher Johnson) submitted a DNA sample, as did his sister's great-granddaughter (through Mary Maher Spain.) They matched one another, but not my grandfather's DNA sample. With three samples to compare, it appears very unlikely that my orphaned ancestor was related to the Mahers of Albany, or to Katherine Maher Uhler.

Katherine's husband Armin Uhler:


Her Father's Gravesite
  • not tagging
Show comments for Katherine Maher Uhler //
John Sweeney
last modified on 26 January 2014 by
livesentwined
//

John Sweeney – 52 Ancestors #2


Born 24 December 1903 in Kremlin, Oklahoma
Married Eleanor (Elna) Sharp on 30 October, 1931
Died 19 March 1933, Chicago, Illinois, age 29

My father-in-law Joseph (Joe) Sweeney Jr. is the only male line descendant of his Irish grandfather who came to America in 1882. Joe grew up without his father or any Sweeney uncles. Joseph Michael Sweeney Sr. was killed during World War II in France. His oldest brother Bill died a bachelor in 1947, when Joe Jr. was four years old. One other uncle was John Sweeney, who died in Chicago at age 29 under mysterious circumstances.
more/hide

John's Possible Headstone – we need to verify that Thomas John is one and the same

His Father's Gravesite
  • not tagging
Show comments for John Sweeney //
Elizabeth Breit Jacobs
last modified on 19 January 2014 by
livesentwined
//

Lizzie Breit Jacobs – 52 Ancestors #1



Born 8 October 1882 in Topeka, Kansas
Married John Peter Jacobs on 10 Nov 1903
Married George G. Jacobs circa 1920
Died 27 January 1970, Pfeifer, Kansas, age 87

When I see or hear the name Elizabeth Breit, I think of my Grandma's baby ring. My Grandma Rose was born in her grandmother Lizzie's house "in town" rather than at her parents' farm outside Pfeifer, Kansas. She was the older of twin girls, born April 2, 1938. She and her sister were given matching baby rings.

(I wonder if my Great-Grandma Regina had any idea she was carrying twins … I should ask my Grandma or her older sister Eva if that detail was ever shared with them.)


I seem to recall the rings were given by someone outside the family, due to the special arrival of twins (I doubt their family could have afforded them.) When I was a young boy, my Grandma said that she would give her baby ring to me. About 10 years ago she did, and I have since passed it to my son Evan, wearing it here→

Reflecting more, I think of Grandma Lizzie's hands, which I think look like my Grandma Rose's judging from the first photo above. Hands which I can imagine kneading homemade noodle dough, preparing meals for huge families, mending clothes, or caring for a sick child. These are things which Lizzie taught her daughters, and Regina taught hers, down to my Grandma whom I watched doing these same things. They are strong, but tender and loving hands. A cousin I don't know was kind enough to upload this Breit family photo to Ancestry.com where I discovered it, and so was able to see Lizzie in her youth.

Now I begin this 52Ancestors Challenge, recounting what I know of one woman's life entwined through hundreds of descendants – more than I ever plan to attempt counting. She is the maternal anchor of my father's lineage: his mother's mother's mother.

She was married twice to German men of the Jacobs surname. Her first child was born 110 years ago; she delivered 11 children in total that I know of, and had 11 step-children beyond that. The Jacobs clan is full of inter-marriages, so the children of Lizzie's first marriage were second cousins of her step-children…and as we will see, the branches get even more tangled after that.

Elizabeth ("Lizzie") Breit was born October 8, 1882 to John H. Breit and Katharina Eberle. Both were Volga-Germans whose families had immigrated about a century before from Germany to the Volga River Valley of Russia. I have not substantiated the line back to Germany, but it's thought that her patrilineal ancestor was Franz Anton Breit, born 1752 in Michelstadt, Germany.
more/hide

Elizabeth's Gravesite

Her Father's Gravesite


We won't all be so lucky to live 100 years with full health and mental agility, nor will each of our parents and grandparents. However, in recent times, most people can expect their own lifetime, extended by a child's, will likely reach 100 years. The reach of Lizzie's parent/child lifespan was 123 years. Her youngest daughter Irene Jacobs Simmons died in 2006.
  • not tagging
Show comments for Elizabeth Breit Jacobs //
52 Ancestors in 52 Weeks
last modified on 12 January 2014 by
livesentwined
//
 
52 Ancestors in 52 Weeks is a challenge began by Amy Johnson Crow, on her blog with the lovely name No Story Too Small: Life is made of stories.

Amy describes the premise as:
Write once a week about a specific ancestor. It could be a story, a biography, a photograph, a research problem — anything that focuses on that one ancestor. The next week, write about a different ancestor.
See Amy's list of ancestors.

I learned of this challenge from following Roberta Estes' DNAeXplained blog, which I highly recommend. Roberta shared her first story Searching For Ilo's Son on January 10th.

About This Site's Technology
  • not tagging
Show comments for 52 Ancestors in 52 Weeks //
  • no tags
Lives Entwined In Us
last modified on 11 January 2014 by
livesentwined
//
 
…hidden in ourselves
that code of DNA,
that secret spiral ladder
made up of bits and pieces
of the past that never dies
but lives entwined in us

—From "The Rope" by Loren Eiseley



And yet they, who passed away long ago,
still exist in us, as predisposition,
as burden upon our fate,
as murmuring blood, and as gesture
that rises up from the depths of time.

—From Letter Six, 23 December 1903,
Letters to a Young Poet by Rainer Maria Rilke
  • not tagging
Show comments for Lives Entwined In Us //
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>
<!--}}}-->
/***
|''Name''|RefreshTiddlerCommand|
|''Version''|0.3.0|
***/
//{{{
(function($) {

var cmd = config.commands.refreshTiddler = {
	text: "refresh",
	locale: {
		refreshing: "Refreshing tiddler..."
	},
	tooltip: "refresh this tiddler to be the one on the server",
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(!tiddler) {
			tiddler = new Tiddler(title);
			merge(tiddler.fields, config.defaultCustomFields);
		}
		$(story.getTiddler(title)).find(".viewer").
			empty().text(cmd.locale.refreshing);
		var dirtyStatus = store.isDirty();
		story.loadMissingTiddler(title, {
			"server.workspace": tiddler.fields["server.recipe"]  ? "recipes/" + tiddler.fields["server.recipe"] :
				tiddler.fields["server.workspace"] || "bags/"+tiddler.fields["server.bag"],
			"server.host": tiddler.fields["server.host"],
			"server.type": tiddler.fields["server.type"]
		}, function() {
			store.setDirty(dirtyStatus);
		});
	}
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="72 648 70 70" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 77.59005 669.34003 C 71.532745 681.90424 73.714462 697.4441 84.135193 707.86475 
		C 97.315445 721.0451 118.684715 721.0451 131.8649 707.86475 
		C 145.04515 694.68457 145.04515 673.31537 131.8649 660.13513 
		C 121.4441 649.7141 105.90419 647.53253 93.339905 653.5899 L 102.047455 662.2976 
		C 109.58637 660.2373 117.987976 662.16803 123.90997 668.08997 
		C 132.69673 676.8767 132.69673 691.12317 123.90997 699.90985 
		C 115.12313 708.6966 100.87699 708.6966 92.09012 699.90985 
		C 86.168266 693.98804 84.23744 685.58643 86.297653 678.04755 Z M 72 648 L 72 668.25 L 78.75 661.49957 
		L 99.00019 681.7502 L 105.750175 675.00006 L 85.50013 654.75012 L 92.249985 648 Z" fill="black"
		class="glyph"/>
	</g>
</g>
</svg>
A [[SiteIcon|SiteIcon tiddler]]@glossary helps provide some identity to your space.  Ideally it'd be a square and a minimum of 48*48 pixels size.  You can upload your site icon using the uploader below.

<<binaryUploadPublic title:SiteIcon>>
<<allTags excludeLists>>
!John Sweeney – 52 Ancestors #2
[img[John Sweeney|
http://farm8.staticflickr.com/7317/12145680094_37f2740bb0_z_d.jpg
][http://www.flickr.com/photos/114151783@N05/12145680094/]]
| Born 24 December 1903 in Kremlin, Oklahoma |
| Married Eleanor (Elna) Sharp on 30 October, 1931 |
| Died 19 March 1933, Chicago, Illinois, age 29 |

My father-in-law Joseph (Joe) Sweeney Jr. is the only male line descendant of his Irish grandfather who came to America in 1882.   Joe grew up without his father or any Sweeney uncles.  Joseph Michael Sweeney Sr. was killed during World War II in France.  His oldest brother Bill died a bachelor in 1947, when Joe Jr. was four years old.  One other uncle was John Sweeney, who died in Chicago at age 29 under mysterious circumstances.
{{rjustify{
+++[more/hide]
{{ljustify{
!!!Illinois, Deaths and Stillbirths Index, 1916-1947
| Name:	| John Sweeney |
| Birth Date:	| 24 Dec 1903 |
| Birth Place:	| Kremlin, Okla. |
| Death Date:	| 19 Mar 1933 |
| Death Place: 	| Chicago, Cook, Illinois |
| Burial Date:	| 21 Mar 1933 |
| Burial Place:	| Enid, Okla. |
| Death Age:	| 29 |
| Occupation:	| Brake engineer |
| Race:	| White |
| Marital Status:	| M |
| Gender:	| Male |
| Residence:	| Chicago, Cook, Illinois |
| Father Name:		| Sweeney |
| Mother Name:	| Kate |
| Spouse Name:	| Elna Sharp |
| FHL Film Number:	 | 1893719 |

{{serif{__Length of residence in city or town where death occurred:__ 7 yrs.
__Industry or business in which employed:__ All Weather Tire
__Informant:__ Mrs. Elna Sweeney, 622I Greenwood Avenue
__Injury causing death was:__ Hemorrhage into left lateral cerebral ventricle}}}

The family story is that John got into some trouble with the mafia that ended in his killing.  His death certificate lists a cause of death that could coincide with a blunt head trauma inflicted on him.

To date, I have been unable to find any relatives of Eleanor Sharp Sweeney (also known as Elna Sharp), or what came of her after John's death.

[img[John Sweeney & Eleanor Sharp marriage, 1931|http://farm3.staticflickr.com/2877/12144870345_715b4108bd_c_d.jpg][http://www.flickr.com/photos/114151783@N05/12144870345/]]

[img[John Sweeney death certificate|http://farm3.staticflickr.com/2840/12145101533_6d2d1fea56_c_d.jpg][http://www.flickr.com/photos/114151783@N05/12145101533/]]
}}}
===
}}}
''[[John's Possible Headstone|http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=90458797]]'' //– we need to verify that Thomas John is one and the same//

''[[His Father's Gravesite|http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=90458680]]''
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
!Camilla Broster Williams – 52 Ancestors #4

/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.8|
|''Author''|Ben Gillies|
|''Type''|plugin|
|''Description''|Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.|
!Usage
Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.
!Requires
tiddlyweb
tiddlywebplugins.reflector
!Code
***/
//{{{
(function($){
if(!version.extensions.TiddlyFileImporter)
{ //# ensure that the plugin is only installed once
	version.extensions.TiddlyFileImporter = { installed: true };
}

config.macros.fileImport = {
	reflectorURI: '/reflector?csrf_token=%0',
	incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
	uploadLabel: 'Upload',
	uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
	step1FileText: 'File:',
	step1PostText: 'In the next screen you will select the tiddlers to import.',
	step1Title: 'Step 1: Pick a TiddlyWiki to import',
	step1TypeChooser: 'Import From:',
	step3Html: ['<input type="hidden" name="markList" />',
		'<input type="hidden" checked="true" name="chkSync" />',
		'<input type="hidden" name="chkSave" />',
		'<input type="hidden" name="txtSaveTiddler" />'].join(),

	handler: function(place, macroName, params, wikifier, paramString) {
		var wizard = new Wizard();
		wizard.createWizard(place, 'Import a TiddlyWiki');
		this.restart(wizard);
	},

	restart: function(wizard) {
		var me = config.macros.fileImport;
		wizard.addStep(me.step1Title, ['<input type="hidden" ',
			'name="markList" />'].join(""));
		var markList = wizard.getElement('markList');
		var uploadWrapper = document.createElement('div');
		markList.parentNode.insertBefore(uploadWrapper, markList);
		uploadWrapper.setAttribute('refresh', 'macro');
		uploadWrapper.getAttribute('macroName', 'fileImport');
		var iframeName = 'reflectorImporter' + Math.random().toString();
		me.createForm(uploadWrapper, wizard, iframeName);
		$(uploadWrapper).append('<p>' + me.step1PostText + '</p>');
		wizard.setValue('serverType', 'tiddlyweb');
		wizard.setValue('adaptor', new config.adaptors.file());
		wizard.setValue('host', config.defaultCustomFields['server.host']);
		wizard.setValue('context', {});
		var iframe = $(['<iframe name="' + iframeName + '" ',
			'style="display: none" />'].join("")).appendTo(uploadWrapper);
		var onSubmit = function(ev) {
			var uploadType = $('select[name=uploadtype]', wizard.formElem).val();
			if (uploadType == "file") {
				// set an onload ready to hijack the form
				me.setOnLoad(uploadWrapper, wizard, iframe[0]);
				wizard.importType = 'file';
				wizard.formElem.submit();
			} else {
				var csrf_token = config.extensions.tiddlyspace.getCSRFToken();
				$.ajax({
					url: "%0/reflector?csrf_token=%1".format(
						config.defaultCustomFields["server.host"], csrf_token),
					type: "POST",
					dataType: "text",
					data: {
						uri: $("input", ".importFrom", wizard.formElem).val()
					},
					success: function(data, txtStatus, xhr) {
						wizard.POSTResponse = data;
						me.importTiddlers(uploadWrapper, wizard);
					},
					error: function(xhr, txtStatus, error) {
						displayMessage(["There was an error fetching the ",
							'url: ', txtStatus].join(""));
						me.restart(wizard);
					}
				});
				return false;
			}
		};
		wizard.setButtons([{
			caption: me.uploadLabel,
			tooltip: me.uploadLabelPrompt,
			onClick: onSubmit
		}]);
		$(wizard.formElem).submit(function(ev) {
			onSubmit(ev);
			ev.preventDefault();
		});
	},

	createForm: function(place, wizard, iframeName) {
		var form = wizard.formElem;
		var me = config.macros.fileImport;
		form.action = me.reflectorURI.format(
			config.extensions.tiddlyspace.getCSRFToken());
		form.enctype = 'multipart/form-data';
		form.encoding = 'multipart/form-data';
		form.method = 'POST';
		form.target = iframeName;
		onSelectChange = function(e) {
			var changeTo = $(this).val();
			if (changeTo == "file") {
				$(".importFrom").html('%0 <input type="file" name="file" />'.
					format(me.step1FileText));
			} else {
				$(".importFrom").html('URL: <input type="text" name="uri" />'
					+ ' Do you want <a target="_blank" href="http://faq.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F">inclusion</a> instead?');
			}
		};
		$(place).append('<span>%0</span>'.format(me.step1TypeChooser)).
			append($(['<select name="uploadtype"><option value="file" selected="selected">file',
				'<option value="uri">url</select>'].join("")).change(onSelectChange)).
			append('<div class="importFrom">%0<input type="file" name="file" /></div>'.
					format(me.step1FileText));
	},

	setOnLoad: function(place, wizard, iframe) {
		var me = config.macros.fileImport;
		var loadHandler = function() {
			me.importTiddlers.apply(this, [place, wizard, iframe]);
		};
		iframe.onload = loadHandler;
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 5) {
				loadHandler();
			}
		};
	},

	importTiddlers: function(place, wizard, iframe) {
		var tmpStore = new TiddlyWiki();
		var POSTedWiki = "";
		if (wizard.importType == "file") {
			try {
				POSTedWiki= iframe.contentWindow
					.document.documentElement.innerHTML;
			} catch(e) {
				displayMessage(config.macros.fileImport.incorrectTypeError);
				config.macros.fileImport.restart(wizard);
				return;
			}
			// now we are done, so remove the iframe
			$(iframe).remove();
		} else {
			POSTedWiki = wizard.POSTResponse;
		}

		tmpStore.importTiddlyWiki(POSTedWiki);
		var newTiddlers = tmpStore.getTiddlers();
		var workspace = config.defaultCustomFields['server.workspace'];
		var context = {
			status: true,
			statusText: 'OK',
			httpStatus: 200,
			adaptor: wizard.getValue('adaptor'),
			tiddlers: newTiddlers
		};
		context.adaptor.store = tmpStore;
		wizard.setValue('context', context);
		wizard.setValue('workspace', workspace);
		wizard.setValue('inFileImport', true);
		config.macros.importTiddlers.onGetTiddlerList(context, wizard);
	}
};

var _onGetTiddler = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
	if (wizard.getValue('inFileImport')) {
		var me = config.macros.importTiddlers;
		if(!context.status)
			displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
		var tiddler = context.tiddler;
		var fields = tiddler.fields;
		merge(fields, config.defaultCustomFields);
		fields["server.workspace"] = wizard.getValue('workspace');
		delete fields['server.permissions'];
		delete fields['server.bag'];
		fields['server.page.revision'] = 'false';
		delete fields['server.recipe'];
		fields.changecount = 1;
		store.suspendNotifications();
		store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
			tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
			false, tiddler.created);
		store.resumeNotifications();
		var remainingImports = wizard.getValue("remainingImports")-1;
		wizard.setValue("remainingImports",remainingImports);
		if(remainingImports === 0) {
			if(context.isSynchronous) {
				store.notifyAll();
				refreshDisplay();
			}
			wizard.setButtons([
					{caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
				],me.statusDoneImport);
			autoSaveChanges();
		}
	} else {
		_onGetTiddler.apply(this, arguments);
	}
};

var _onCancel = config.macros.importTiddlers.onCancel;
config.macros.importTiddlers.onCancel = function(e)
{
	var wizard = new Wizard(this);
	if (!wizard.getValue('inFileImport')) {
		return _onCancel.apply(this, arguments);
	}
	var place = wizard.clear();
	config.macros.fileImport.restart(wizard);
	return false;
};

var _step3Html = config.macros.importTiddlers.step3Html;
var _onGetTiddlerList = config.macros.importTiddlers.onGetTiddlerList;
config.macros.importTiddlers.onGetTiddlerList = function(context, wizard) {
	var fileImport = config.macros.fileImport;
	var importTiddlers = config.macros.importTiddlers;
	if (wizard.getValue('inFileImport')) {
		importTiddlers.step3Html = fileImport.step3Html;
	} else {
		importTiddlers.step3Html = _step3Html;
	}
	_onGetTiddlerList.apply(this, arguments);
};
})(jQuery);
//}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Reply</title>
	<link rel="stylesheet" href="//tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}

		#help {
			position: absolute;
			border: 0;
			right: 4px;
			top: 5px;
			text-indent: -9999px;
			color: transparent;
			height: 16px;
			width: 16px;
			background: none;
			background-image: url(/bags/common/tiddlers/help.png);
			background-repeat: no-repeat;
			background-color: white;
			z-index: 2;
			border-radius: 10px;
		}

		#help-info {
			padding: 0;
			border: 1px solid gray;
			width: 60%;
			height: 50px;
			color: #404040;
			background-color: white;
			position: absolute;
			top: 5px;
			right: 5px;
			z-index: 1;
			cursor: auto;
			border-radius: 5px;

		}

		#help-info p {
			padding: 10px 25px;
			margin-bottom: 0;
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<button id="help">help</button>
				<div id="help-info" style="display:none;"><p>
				Found something interesting? Write about it in your own space. <a href="//docs.tiddlyspace.com/Reply to this Tiddler" target="_blank">Find out more</a>
				</p></div>
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li class="active" data-tab-name="post"><a href="#postForm">Reply</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class="checkbox">
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript"
            src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/_reply.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>Account</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/jquery-ui.custom.css" type='text/css' rel='stylesheet' >
</head>
<body>

<div id="container">
	<div class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<div id="siteiconArea">
		<h2>User Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		</div>
		<h2>Find Space</h2>
		<form class="spaceSearch">
			<input class="inputBox" type="text" placeholder="find space" />
			<a href="http://docs.tiddlyspace.com/What%20is%20a%20Space%3F" class="help"
				title="What is a space?">What is a space?</a>
			<button>view all</button>
		</form>
		<div class='list-container'>
			You are a member of the following spaces:
			<ul class='ts-space-search'>
			</ul>
		</div>
		<h2>Create New Space</h2>
		<form class="ts-spaces">
			<input class="inputBox" type="text" name="spacename" placeholder="space name"><span class="hostSuffix">.tiddlyspace.com</span>
			<input type="submit" value="Create Space" />
		</form>
		</div>
		<div class="right">
		<h2>Change Password</h2>
		<form class="ts-password">
			<input class="inputBox" placeholder="existing password" type="password" name="password">
			<input class="inputBox" placeholder="new password" type="password" name="new_password">
			<input class="inputBox" placeholder="new password"	type="password" name="new_password_confirm">
			<input type="submit" value="Change password">
		</form>
		<h2>OpenID</h2>
		<h3>Why OpenID?</h3>
		<a href="http://openid.net/"><img src="/bags/common/tiddlers/openid.png" alt="openid" ></a><br />
		Use just one username and password across hundreds of OpenID-enabled sites.<br />
		It's an open standard.<br />
		<a href="http://openid.net/what/">learn more</a>
		<ul class="ts-identities"></ul>
		<form class="ts-openid" target="_top">
			<div>
				Add an openid:
			</div>
			<input class="inputBox" type="text" name="openid" placeholder="your openid" />
			<input type="submit" value="Register" />
			<a href="http://openid.net/get-an-openid/" class="help"
			title="What is an open id?">What is an open id?</a>
		</form>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src="/bags/common/tiddlers/backstage.js"></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src="/bags/common/tiddlers/jquery-ui.custom.js"></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src='/bags/common/tiddlers/ts.js'></script>
<script src="/status.js"></script>
<script type="text/javascript">
/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function( $ ) {

var proto = $.ui.autocomplete.prototype,
	initSource = proto._initSource;

function filter( array, term ) {
	var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
	return $.grep( array, function(value) {
		return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
	});
}

$.extend( proto, {
	_initSource: function() {
		if ( this.options.html && $.isArray(this.options.source) ) {
			this.source = function( request, response ) {
				response( filter( this.options.source, request.term ) );
			};
		} else {
			initSource.call( this );
		}
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
			.appendTo( ul );
	}
});

})( jQuery );

/***
_accounts application specific javascript
***/
var link;
ts.init(function(ts) {
	if(ts.user.anon) { // redirect to homepage when user not logged in
		window.location = ts.getHost();
	} else if(ts.user.name === ts.currentSpace){
		initSiteIconUpload(ts.user.name);
	} else {
		link = $("<a />").attr("href", ts.getHost(ts.user.name) + "/_account").text("Change User Icon");
		$("#siteiconArea div").empty().append(link);
	}
	$(".hostSuffix").text("." + ts.getHost("").split("//")[1]);
	ts.getSpaces(function(spaces) {
		$("<div class='info' />").text("You have " + spaces.length + " spaces.").insertBefore($(".spaceSearch")[0]);
		$("form.spaceSearch input").autocomplete({
			html: true,
			source: function(req, response) {
				ts.getSpaces(function(spaces) {
					var selected = [];
					for(var i = 0; i < spaces.length; i++) {
						var space = spaces[i];
						if(space.name.indexOf(req.term) > -1) {
							var host = ts.getHost(space.name) ;
							var img = host + "/SiteIcon";
							selected.push({
								value: space.name,
								label: '<a href="' + host + '" target="_parent" class="autocompleteLink"><img src="' + img + '" style="height:24px;width:auto;max-height:24px;max-width:24px;"/>' + space.name + '</a>'
							});
						}
					}
					response(selected);
				});
			},
			select: function(event, ui) {
				window.top.location = ts.getHost(ui.item.value);
			}
		});

		var $ul = $('.ts-space-search');
		$.each(spaces, function(i, space) {
			$ul.append($('<li/>').html($('<a/>').attr('href', space.uri)
				.text(space.name)));
		});

		$('form.spaceSearch button').click(function(ev) {
			$('.list-container').slideToggle('fast');
			ev.preventDefault();
			return false;
		});
	});
});

if(window != window.top) {
	$("html").addClass("iframeMode");
	$("a").live("click",function(ev) {
		$(ev.target).attr("target", "_parent");
	});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>
!Upload an icon
<<tiddler spaceIcon>>
!Describe your space
If you haven't already done so, you should provide a brief decscription of yourself and what you're using this space for. To do this, just edit the [[SiteInfo]] tiddler (keeping the title the same of course).

!Change the title
<<tiddler spaceTitle>>
!Change the theme
<<tiddler colorScheme>>
!Change the menu
If you'd like to change the menu items along the top, you can edit the [[MainMenu]] tiddler.

!Change the default tiddlers
<<tiddler setDefaultTiddlers>>
!More Advanced customisations
If you know HTML and CSS, you can edit some or all of the following tiddlers to customise your space further:
* PageTemplate
* EditTemplate
* ViewTemplate
* StyleSheet
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.7.7|
|''Description''|TiddlySpace configuration|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceConfig.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlyWebConfig ServerSideSavingPlugin TiddlyFileImporter|
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var recipe = config.defaultCustomFields["server.workspace"].split("recipes/")[1];
var currentSpace; // assigned later

var disabledTabs = [];

var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
	return "system-%0_public".format(item);
});

// hijack search macro to add custom attributes for mobile devices
var _search = config.macros.search.handler;
config.macros.search.handler = function(place, macroName, params) {
	_search.apply(this, arguments);
	$(".searchField:input", place).
		attr({ autocapitalize: "off", autocorrect: "off" });
};

// arg is either a container name or a tiddler object
// if fuzzy is truthy, space may be inferred from workspace (for new tiddlers)
// returns space object or false
var determineSpace = function(arg, fuzzy) {
	if(typeof arg == "string") { // container name
		var space = split(arg, "_", "r");
		return ["public", "private"].contains(space.type) ? space : false;
	} else if(arg) { // tiddler
		var container = determineContainer(arg, fuzzy);
		return container ? determineSpace(container.name, fuzzy) : false;
	} else {
		return false;
	}
};

// if fuzzy is truthy, container may be inferred from workspace for new tiddlers
// returns container object or false
var determineContainer = function(tiddler, fuzzy) { // TODO: expose?
	var bag = tiddler.fields["server.bag"];
	var recipe = tiddler.fields["server.recipe"]; // XXX: unused/irrelevant/redundant!?
	if(bag) {
		return { type: "bag", name: bag };
	} else if(recipe) {
		return { type: "recipe", name: recipe };
	} else if(fuzzy) { // new tiddler
		var workspace = tiddler.fields["server.workspace"];
		if(workspace) {
			var container = split(workspace, "/", "l");
			return ["bags", "recipes"].contains(container.type) ? container : false;
		} else {
			return false;
		}
	} else {
		return false;
	}
};

// hijack removeTiddlerCallback to restore tiddler from recipe cascade -- TODO: move into TiddlyWebWiki?
var sssp = config.extensions.ServerSideSavingPlugin;
var _removeTiddlerCallback = sssp.removeTiddlerCallback;
sssp.removeTiddlerCallback = function(context, userParams) {
	var title = context.tiddler.title;
	var recipe = context.tiddler.fields["server.recipe"];
	_removeTiddlerCallback.apply(this, arguments);
	if(recipe) {
		context.workspace = "recipes/" + recipe;
		var callback = function(context, userParams) {
			if(context.status) {
				var dirty = store.isDirty();
				store.saveTiddler(context.tiddler).clearChangeCount();
				store.setDirty(dirty);
			} else {
				store.notify(title, true);
			}
		};
		context.adaptor.getTiddler(title, context, null, callback);
	}
};

// splits a string once using delimiter
// mode "l" splits at the first, "r" at the last occurrence
// returns an object with members type and name
var split = function(str, sep, mode) {
	mode = mode == "r" ? "pop" : "shift"; // TODO: use +/-1 instead of "l"/"r"?
	var arr = str.split(sep);
	var type = arr.length > 1 ? arr[mode]() : null;
	return { type: type, name: arr.join(sep) };
};

var plugin = config.extensions.tiddlyspace = {
	currentSpace: determineSpace(recipe),
	coreBags: coreBags.concat(systemSpaces),

	determineSpace: determineSpace,
	isValidSpaceName: function(name) {
		return name.match(/^[a-z][0-9a-z\-]*[0-9a-z]$/) ? true : false;
	},
	getCurrentBag: function(type) {
		return "%0_%1".format(currentSpace, type);
	},
	getCurrentWorkspace: function(type) {
		return "bags/" + this.getCurrentBag(type);
	},
	// returns the URL for a space's avatar (SiteIcon) based on a server_host
	// object and an optional space name
	// optional nocors argument prevents cross-domain URLs from being generated
	getAvatar: function(host, space, nocors) {
		if(space && typeof space != "string") { // backwards compatibility -- XXX: deprecated
			space = space.name;
		}
		var subdomain = nocors ? currentSpace : space;
		host = host ? this.getHost(host, subdomain) : "";
		var bag = space ? "%0_public".format(space) : "tiddlyspace";
		return "%0/bags/%1/tiddlers/SiteIcon".format(host, bag);
	},
	// returns the URL based on a server_host object (scheme, host, port) and an
	// optional subdomain
	getHost: function(host, subdomain) {
		if(host === undefined) { // offline
			tweb.status.server_host = {}; // prevents exceptions further down the stack -- XXX: hacky workaround, breaks encapsulation
			return null;
		}
		subdomain = subdomain ? subdomain + "." : "";
		var url = "%0://%1%2".format(host.scheme, subdomain, host.host);
		var port = host.port;
		if(port && !["80", "443"].contains(port)) {
			url += ":" + port;
		}
		return url;
	},
	disableTab: function(tabTiddler) {
		if(typeof(tabTiddler) == "string") {
			disabledTabs.push(tabTiddler);
		} else {
			for(var i = 0; i < tabTiddler.length; i++) {
				plugin.disableTab(tabTiddler[i]);
			}
		}
	},
    checkSyncStatus: function(tiddler) {
		if(tiddler) {
			var title = typeof(tiddler) === "string" ? tiddler : tiddler.title;
			var el = story.getTiddler(title) || false;
			if(el) {
				refreshElements(el);
			}
		}
	},
	isDisabledTab: function(tabTitle) {
		var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
		var tabIdentifier = match ? match[1] : tabTitle;
		return disabledTabs.contains(tabIdentifier);
	},
	getCSRFToken: window.getCSRFToken || null // this may not have been processed yet
};

currentSpace = plugin.currentSpace.name;

tweb.serverPrefix = tweb.host.split("/")[3] || ""; // XXX: assumes root handler
tweb.getStatus(function(status) {
	var url = plugin.getHost(status.server_host);
	tweb.status.server_host.url = url;
	config.messages.tsVersion = status.version;
});

if(window.location.protocol == "file:") {
	// enable AutoSave by default
	config.options.chkAutoSave = config.options.chkAutoSave === undefined ?
		true : config.options.chkAutoSave;
} else {
	// set global read-only mode based on membership heuristics
	var indicator = store.getTiddler("SiteTitle") || tiddler;
	readOnly = !(recipe.split("_").pop() == "private" ||
		tweb.hasPermission("write", indicator));
	// replace TiddlyWiki's ImportTiddlers due to cross-domain restrictions
	if(config.macros.fileImport) {
		$.extend(config.macros.importTiddlers, config.macros.fileImport);
	}
}

// hijack saveChanges to ensure SystemSettings is private by default
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(tiddlers && tiddlers.length == 1 &&
			tiddlers[0] && tiddlers[0].title == "SystemSettings") {
		var fields = tiddlers[0].fields;
		delete fields["server.recipe"];
		fields["server.bag"] = plugin.getCurrentBag("private");
		fields["server.workspace"] = plugin.getCurrentWorkspace("private");
	}
	return _saveChanges.apply(this, arguments);
};

// ensure backstage is always initialized
// required to circumvent TiddlyWiki's read-only based handling
config.macros.backstageInit = {
	init: function() {
		showBackstage = true;
	}
};

// disable evaluated macro parameters for security reasons
config.evaluateMacroParameters = "none";
var _parseParams = String.prototype.parseParams;
String.prototype.parseParams = function(defaultName, defaultValue, allowEval,
		noNames, cascadeDefaults) {
	if(config.evaluateMacroParameters == "none") {
		arguments[2] = false;
	}
	return _parseParams.apply(this, arguments);
};

var _tabsMacro = config.macros.tabs.handler;
config.macros.tabs.handler = function(place, macroName, params) {
	var newParams = [params[0]]; // keep cookie name
	for(var i = 1; i < params.length; i += 3) {
		var tabTitle = params[i + 2];
		if(!plugin.isDisabledTab(tabTitle)){
			newParams = newParams.concat(params[i], params[i + 1], tabTitle);
		}
	}
	_tabsMacro.apply(this, [place, macroName, newParams]);
};

// disable ControlView for XHRs by default
$.ajaxSetup({
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	}
});
// TiddlyWeb adaptor currently still uses httpReq, which needs extra magic -- XXX: obsolete this!
var _httpReq = httpReq;
httpReq = function(type, url, callback, params, headers, data, contentType,
		username, password, allowCache) {
	headers = headers || {};
	headers["X-ControlView"] = "false";
	_httpReq.apply(this, arguments);
};

// register style sheet for backstage separately (important)
store.addNotification("StyleSheetBackstage", refreshStyles);

// option for default privacy setting
config.optionsDesc.chkPrivateMode = "Set your default privacy mode to private";
config.optionsSource.chkPrivateMode = "setting";
config.options.chkPrivateMode = config.options.chkPrivateMode || false;
saveSystemSetting("chkPrivateMode", true);
config.defaultCustomFields["server.workspace"] = plugin.
	getCurrentWorkspace(config.options.chkPrivateMode ? "private" : "public");

config.paramifiers.follow = {
	onstart: function(v) {
		if(!readOnly) {
			var bag = "%0_public".format(currentSpace);
			story.displayTiddler(null, v, DEFAULT_EDIT_TEMPLATE, null, null,
				"server.bag:%0 server.workspace:bags/%0".format(bag));
			story.setTiddlerTag(v, "follow", 1);
			story.focusTiddler(v, "text");
		}
	}
};

var fImport = config.macros.fileImport;
if(fImport) {
	fImport.uploadTo = "Upload to: ";
	var _createForm = config.macros.fileImport.createForm;
	config.macros.fileImport.createForm = function(place, wizard, iframeName) {
		var container = $("<div />").text(fImport.uploadTo).appendTo(place);
		var select = $('<select name="mode" />').appendTo(container)[0];
		$('<option value="private" selected>private</a>').appendTo(select);
		$('<option value="public">public</a>').appendTo(select);
		wizard.setValue("importmode", select);
		_createForm.apply(this, [place, wizard, iframeName]);
	};

	var _onGet = config.macros.importTiddlers.onGetTiddler;
	config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
		var type = $(wizard.getValue("importmode")).val();
		var ws =  plugin.getCurrentWorkspace(type);
		wizard.setValue("workspace", ws);
		_onGet.apply(this, [context, wizard]);
	};
}

config.extensions.ServerSideSavingPlugin.reportSuccess = function(msg, tiddler) {
	plugin.checkSyncStatus(tiddler);
	msg = config.extensions.ServerSideSavingPlugin.locale[msg];
	var link = "/" + encodeURIComponent(tiddler.title);
	displayMessage(msg.format([tiddler.title]), link);
};


})(jQuery);
//}}}
!Evan Andreas Unrein
[img[My son wearing his Great-Grandma Rose's baby ring|http://farm8.staticflickr.com/7296/11915567956_9fa2a0c69a_n_d.jpg][http://www.flickr.com/photos/114151783@N05/11915567956/]]
//wearing his ~Great-Grandma Rose's baby ring (one last time)//
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {

var adaptor = config.adaptors.tiddlyweb = function() {};

adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename

// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/status";
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
		null, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
	context.status = responseText ? status : false;
	try {
		context.statusText = xhr.statusText;
	} catch(exc) { // offline (Firefox)
		context.status = false;
		context.statusText = null;
	}
	context.httpStatus = xhr.status;
	if(context.status) {
		context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.workspaces = [];
	var uriTemplate = "%0/recipes"; // XXX: bags?
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var workspaces = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers%3";
	var params = context.filters ? "?" + context.filters : "";
	if(context.format) {
		params = context.format + params;
	}
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), params]);
	var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.tiddlers = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.tiddlers.push(tiddler);
		}
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/search?q=%1%2";
	var filterString = context.filters ? ";" + context.filters : "";
	var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
	var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
	adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};

// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.revisions = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.revisions.push(tiddler);
		}
		var sortField = "server.page.revision";
		context.revisions.sort(function(a, b) {
			return a.fields[sortField] < b.fields[sortField] ? 1 :
				(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
		});
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.revision = revision;
	return this.getTiddler(title, context, userParams, callback);
};

// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	if(context.revision) {
		var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
	} else {
		uriTemplate = "%0/%1/%2/tiddlers/%3";
	}
	if(!context.tiddler) {
		context.tiddler = new Tiddler(title);
	}
	context.tiddler.fields["server.type"] = adaptor.serverType;
	context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
	context.tiddler.fields["server.workspace"] = context.workspace;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
		context.revision]);
	var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
		merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var tid = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false;
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		var tiddler = adaptor.toTiddler(tid, context.host);
		tiddler.title = context.tiddler.title;
		tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		// normally we'd assign context.tiddler = tiddler here - but we can't do
		// that because of IE, which triggers getTiddler in putTiddlerCallback,
		// and since ServerSideSavingPlugin foolishly relies on persistent
		// object references, we need to merge the data into the existing object
		$.extend(context.tiddler, tiddler);
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.responseText = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title;
	context.tiddler = tiddler;
	context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		context.workspace = context.workspace || tiddler.fields["server.workspace"];
		var workspace = adaptor.resolveWorkspace(context.workspace);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var payload = {
		type: tiddler.fields["server.content-type"] || null,
		text: tiddler.text,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	$.each(payload.fields, function(key, value) {
		if(key.indexOf("server.") == 0) {
			delete payload.fields[key];
		}
	});
	payload = $.toJSON(payload);
	var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.status) {
		var loc = xhr.getResponseHeader("Location");
		var etag = xhr.getResponseHeader("Etag");
		if(loc && etag) {
			var bag = loc.split("/bags/").pop().split("/")[0];
			context.tiddler.fields["server.bag"] = bag;
			context.tiddler.fields["server.workspace"] = "bags/" + bag;
			var rev = etag.split("/").pop().split(/;|:/)[0];
			context.tiddler.fields["server.page.revision"] = rev;
			context.tiddler.fields["server.etag"] = etag;
			if(context.callback) {
				context.callback(context, context.userParams);
			}
		} else { // IE
			context.adaptor.getTiddler(context.tiddler.title, context,
				context.userParams, context.callback);
		}
	} else if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = revisions[0].title;
	var headers = null;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(context.title)]);
	if(workspace.type == "bag") { // generate ETag
		var etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
		headers = { "If-Match": '"' + etag + '"' };
	}
	var payload = $.toJSON(revisions);
	var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers";
	var host = context.host;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name)]);
	var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
		context, null, store, "text/x-tiddlywiki", null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
	var self = this;
	var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
	var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
	oldTiddler.title = from.title; //# required for original tiddler's ETag
	var _getTiddlerChronicle = function(title, context, userParams, callback) {
		return self.getTiddlerChronicle(title, context, userParams, callback);
	};
	var _putTiddlerChronicle = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		var revisions = $.evalJSON(context.responseText); // XXX: error handling?
		// change current title while retaining previous location
		for(var i = 0; i < revisions.length; i++) {
			delete revisions[i].revision;
			if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
				revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
			}
			revisions[i].title = to.title;
		}
		// add new revision
		var rev = $.extend({}, revisions[0]);
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.title = to.title;
		rev.created = rev.created.convertToYYYYMMDDHHMM();
		rev.modified = new Date().convertToYYYYMMDDHHMM();
		delete rev.fields.changecount;
		revisions.unshift(rev);
		if(to.workspace) {
			context.workspace = to.workspace;
		} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userParams) {
			if(!context.status) {
				return callback(context, userParams);
			}
			context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
		};
		return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		$.extend(true, newTiddler, context.tiddler);
		context.callback = null;
		return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
	};
	callback = callback || function() {};
	context = this.setContext(context, userParams);
	context.host = context.host || oldTiddler.fields["server.host"];
	context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
	return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};

// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title; // XXX: not required!?
	var uriTemplate = "%0/bags/%1/tiddlers/%2";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var bag = tiddler.fields["server.bag"];
	if(!bag) {
		return adaptor.noBagErrorMessage;
	}
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
		null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;

	var tiddler = store.getTiddler(title);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");

	var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
	var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;

	var uriTemplate = "%0/diff?rev1=%1";
	if(rev2) {
		uriTemplate += "&rev2=%2";
	}
	if(context.format) {
		uriTemplate += "&format=%3";
	}
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
		adaptor.normalizeTitle(rev2), context.format]);

	if(rev2) {
		var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
			null, null, null, null, true);
	} else {
		var payload = {
			title: tiddler.title,
			text: tiddler.text,
			modifier: tiddler.modifier,
			tags: tiddler.tags,
			fields: $.extend({}, tiddler.fields)
		}; // XXX: missing attributes!?
		payload = $.toJSON(payload);
		req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
			null, payload, adaptor.mimeType, null, null, true);
	}
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	context.uri = uri;
	if(status) {
		context.diff = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
	var info = {};
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
	host = this.fullHostName(host);
	var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	info.uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	return info;
};

// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
	var created = Date.convertFromYYYYMMDDHHMM(json.created);
	var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
	var fields = json.fields;
	fields["server.type"] = adaptor.serverType;
	fields["server.host"] = AdaptorBase.minHostName(host);
	fields["server.bag"] = json.bag;
	fields["server.title"] = json.title;
	if(json.recipe) {
		fields["server.recipe"] = json.recipe;
	}
	if(json.type && json.type != "None") {
		fields["server.content-type"] = json.type;
	}
	fields["server.permissions"] = json.permissions.join(", ");
	fields["server.page.revision"] = json.revision;
	fields["server.workspace"] = "bags/" + json.bag;
	var tiddler = new Tiddler(json.title);
	tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
		created, json.fields, json.creator);
	return tiddler;
};

adaptor.resolveWorkspace = function(workspace) {
	var components = workspace.split("/");
	return {
		type: components[0] == "bags" ? "bag" : "recipe",
		name: components[1] || components[0]
	};
};

adaptor.generateETag = function(workspace, tiddler) {
	var revision = tiddler.fields["server.page.revision"];
	var etag = revision == "false" ? null : tiddler.fields["server.etag"];
	if(!etag && workspace.type == "bag") {
		if(typeof revision == "undefined") {
			revision = "0";
		} else if(revision == "false") {
			return null;
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
		etag = '"' + etag + '"';
	}
	return etag;
};

adaptor.normalizeTitle = function(title) {
	return encodeURIComponent(title);
};

})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.3
 * source: http://code.google.com/p/jquery-json/
 * license: MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
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
/*{{{*/
.tiddler .originButton div {
	display: inline-block;
}

.tiddler .spaceSiteIcon .siteIcon {
	_display: inline; /* IE doesn't like inline-block */
}

.tiddler .originButton {
	display: block;
}

.selected .tagging,
.selected .tagging:hover {
	border: none;
	background: none;
}

.tagging {
	float: none;
	background: none;
	border: none;
}

.tagging li.listTitle {
	margin-left: 0px;
}
.tagging li {
	margin: 0 8px;
}

.tagging .tiddlyLink {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	-o-border-radius: 3px;
	border-radius: 3px;
	padding: 1px 2px;
	line-height: 1.2em;
}

/* for following */
#popup .siteIcon {
	float: left;
	height: 25px;
}

.content {
	width: 100%; /* IE */
	font-size: 0.9em;
}

.editorHeading {
	height: 48px;
}

.heading {
	left: 0;
	margin-bottom: 40px;
	position: relative;
	top: 32px;
}

.followButton a {
	display: block;
	margin-top: -20px;
}

.tiddler .followPlaceHolder {
	display: block;
	position: absolute;
	top: 16px;
	right: 64px;
	_right: 138px; // add width of modifierIcon
}

.tiddler .followButton {
	position: relative;
	height: 24px;
	text-align: left;
	color: #fff;
	background: [[ColorPalette::PrimaryMid]];
	padding: 10px 0px 0px 10px;
	width: 38px;
	margin: -16px -8px 24px 0;
}

/* creates the larger triangle */
.followButton:before {
	content: "\00a0";
	display: block; /* reduce the damage in FF3.0 */
	position: relative;
	bottom: -20px;
	right: 0;
	width: 0;
	height: 0;
	border-width: 0 0 20px 20px;
	border-style: solid;
	border-color: transparent [[ColorPalette::PrimaryMid]];
}

.toolbar svg {
	height: 16px;
	width: 16px;
}

.toolbar svg .glyph {
	fill: #ccc;
}

.toolbar a:hover .glyph {
	fill: black;
}

.toolbar a:active .glyph {
	fill: [[ColorPalette::Background]];
}

.originButton,
.followPlaceHolder,
.tiddler .subtitle {
	cursor: pointer;
}

.editSpaceSiteIcon .originButton {
	cursor: auto;
}

.tiddler .subtitle:hover {
	font-weight: bold;
	background: none;
}

.originButton img,
.originButton svg {
	margin-left: 0px;
}

.modifierIcon {
	position: absolute;
	width: 74px;
	top: 0px;
	right: 0px;
	_right: 74px; /* in IE6 positioning works incorrectly so use -width instead */
	text-align: right;
}

.modifierIcon img,
.modifierIcon svg {
	margin-right: 8px;
}

.tiddler .viewer {
	padding-bottom: 16px;
	margin: 0 0 0 56px;
	line-height: 1.4em;
}

.viewer pre {
	margin-left: 0;
}

.siteIcon .label {
	color: [[ColorPalette::TertiaryDark]];
}

.tiddler .spaceSiteIcon {
	float: left;
	margin-right: 0;
	margin-top: 0;
	position: relative;
	display: block;
}

.tiddler .titleBar {
	display: block;
	margin-right: 136px;
	margin-left: 56px;
}

.followButton a {
	color: [[ColorPalette::Background]];
}

.tiddler {
	position: relative;
	padding: 0;
	margin-bottom: 3em;
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	background: #fff;
}

.tiddler .editor {
	padding: 0px 8px;
}

.tiddler .heading .title {
	position: relative;
	display: block;
	word-wrap: break-word;
	font-size: 32px;
	line-height: 32px;
}
.tiddler .heading .editor.title {
	font-size: 1.7em;
	line-height: normal;
}

.tiddler .headingClear {
	clear: both;
}

.tiddler .subtitle {
	font-style: italic;
	font-size: 0.9em;
	color: #a6a59e;
	margin-top: 0;
}

.toolbar {
	position: absolute;
	padding: 0;
	top: 8px;
	right: -8px;
}

.toolbar .moreCommand.highlight {
	background: none;
}

.tiddler .toolbar .button {
	border: none;
	display: inline;
	padding: 0px;
	margin-right: 16px;
}

.tiddler .toolbar a:hover {
	background: none;
}

.tiddler .tagged .listTitle {
	display: none;
}

.revButton {
	float: right;
}

/*! EditTemplate specific*/
.tiddler .privacySettings {
	text-align: center;
}
.tiddler .privacySettings .originButton {
	display: inline;
}

.editSpaceSiteIcon, .privacyEdit {
	float: left;
}

.editSpaceSiteIcon svg,
.editSpaceSiteIcon img,
.editSpaceSiteIcon .roundelLabel {
	float: left;
}

.tagTitle {
	position: absolute;
	text-align: center;
	width: 48px;
	top: 0px;
	left: -56px;
}

.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
	height: 16px;
	margin-left: 24px;
	margin-right: 32px;
	width: 16px;
}

.tagAnnotation {
	margin-top: 8px;
	padding-bottom: 8px;
}
.annotationsBox {
	margin-top: 8px;
}

.editorFooter {
	position: relative;
	padding: 0;
	margin-top: 16px;
	margin-left: 64px;
}

.tiddler .editorFooter .editor {
	padding-left: 0px;
}

.heading .editor input {
	width: 100%;
	font-size: 1.5em;
}

.spaceSiteIcon .externalImage .image a:hover,
.modifierIcon .externalImage .image a:hover {
	background: none;
}

div.toolbar {
	visibility:hidden;
	right:-16px;
}

.selected div.toolbar {
	visibility: visible;
}

.followButton a:hover {
	background: [[ColorPalette::PrimaryMid]];
	text-decoration: underline;
}

a.image:hover {
	background: transparent;
}

@media all and (max-device-width: 480px) {
	div.toolbar {
		visibility:visible;
	}
}
@media only screen and (device-width: 768px) {
	div.toolbar {
		visibility:visible;
	}
}
@media all and (max-width: 960px) {
	.tiddler .titleBar {
		margin-left: 36px;
		margin-right: 80px;
	}

	.tiddler .heading {
		margin-bottom: 48px;
	}

	.tiddler .heading .title {
		font-size: 32px;
		line-height: 32px;
	}

	.tiddler .modifierIcon img,
	.tiddler .modifierIcon svg,
	.tiddler .spaceSiteIcon .originButton img,
	.originButton svg {
		width: 32px;
		height: 32px;
		margin-left: 0px;
		margin-right: 0px;
	}

	.tiddler .followPlaceHolder {
		right: 48px;
	}

	.tiddler .followButton {
		width: 24px;
	}

	.tiddler .viewer {
		margin: 0px 0px 0px 36px;
		padding-top: 0;
	}

	br {
		line-height: 0.5em;
	}
}
/*}}}*/
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
!Lizzie Breit Jacobs – 52 Ancestors #1

[img[Elizabeth Breit Jacobs, 1913, age 25|http://farm4.staticflickr.com/3717/11903119645_c038750ca8_o_d.jpg][http://www.flickr.com/photos/114151783@N05/11903119645/]]
| Born 8 October 1882 in Topeka, Kansas |
| Married John Peter Jacobs on 10 Nov 1903 |
| Married George G. Jacobs circa 1920 |
| Died 27 January 1970, Pfeifer, Kansas, age 87 |

When I see or hear the name Elizabeth Breit, I think of my Grandma's baby ring. My Grandma Rose was born in her grandmother Lizzie's house "in town" rather than at her parents' farm outside Pfeifer, Kansas.  She was the older of twin girls, born April 2, 1938.  She and her sister were given matching baby rings.

(I wonder if my ~Great-Grandma Regina had any idea she was carrying twins … I should ask my Grandma or her older sister Eva if that detail was ever shared with them.)

[img(80%,)[My grandmother Rose Jacobs' baby ring|
http://farm4.staticflickr.com/3826/11914895043_cc4542122b_b_d.jpg][http://www.flickr.com/photos/114151783@N05/11914895043/]]
I seem to recall the rings were given by someone outside the family, due to the special arrival of twins (I doubt their family could have afforded them.)  When I was a young boy, my Grandma said that she would give her baby ring to me. About 10 years ago she did, and I have since passed it to my son [[Evan]], wearing it [[here→|Evan]]

Reflecting more, I think of Grandma Lizzie's hands, which I think look like my Grandma Rose's judging from the first photo above. Hands which I can imagine kneading homemade noodle dough, preparing meals for huge families, mending clothes, or caring for a sick child.  These are things which Lizzie taught her daughters, and Regina taught hers, down to my Grandma whom I watched doing these same things.  They are strong, but tender and loving hands. A cousin I don't know was kind enough to upload this Breit family photo to Ancestry.com where I discovered it, and so was able to see Lizzie in her youth.

Now I begin this [[52Ancestors]] Challenge, recounting what I know of one woman's life [[entwined|Lives Entwined In Us]] through hundreds of descendants – more than I ever plan to attempt counting. She is the [[maternal anchor|female line]] of my father's lineage: his mother's mother's mother.

She was married twice to German men of the Jacobs surname. Her first child was born 110 years ago; she delivered 11 children in total that I know of, and had 11 step-children beyond that. The Jacobs clan is full of inter-marriages, so the children of Lizzie's first marriage were second cousins of her step-children…and as we will see, the branches get even more tangled after that.

Elizabeth ("Lizzie") Breit was born October 8, 1882 to John H. Breit and Katharina Eberle. Both were ~Volga-Germans whose families had immigrated about a century before from Germany to the Volga River Valley of Russia. I have not substantiated the line back to Germany, but it's thought that her patrilineal ancestor was Franz Anton Breit, born 1752 in Michelstadt, Germany.
{{rjustify{
+++[more/hide]
{{ljustify{
According to his obituary, Lizzie's father John "was born in Pfeifer, Russia, on the 22nd day of January 1855.  In 1876 he came to the United States settling in Topeka, Kansas where he remained for about twenty years, working as section foreman for the Santa Fe railroad.  Retiring from railroad work, he came to Ellis County where he farmed for seventeen years near Pfeifer, Kansas." It goes on to say:
<<<
Mr. Breit was married three times being father of seventeen children, of whom four died in infancy and thirteen survive him… Mr. Breit was a man of many lovable qualities, as a man, a neighbor and a friend.  He was a kind husband, a loving father and above all a good Christian, having been a lifelong and faithful member of the Catholic Church.  His remains were laid to rest on the cemetery at Pfeifer, Thursday morning, July 10, 1913.  Nearly the whole congregation attended his funeral.  R.I.P.
{{rjustify{
—//Ellis County News//, July 19, 1913}}}
<<<
[img(95%,)[John H. Breit family, 1913|http://farm8.staticflickr.com/7401/11911955953_442993a781_b_d.jpg][http://www.flickr.com/photos/114151783@N05/11911955953/]]
//This photo was most likely taken within a year of John's passing. I love the simple gesture of Lizzie's hand on her brother Paul's shoulder.
Back row (left to right): Elizabeth 1882, Theodore 1900, Edward 1902, Jacob Dome (Maria's husband), George Dome (Dorothy's husband), Joseph 1893, and Maria 1894. Front row (left to right): Paul 1904, George 1884, photo being held is John H. 1855, Barbara 1872 (John's third wife), Tony 1911, Dorothy Maria 1897, and Leo 1909. [[Zita|Zita Breit Rome]] 1906 is standing in the center behind John's picture. John 1875 not pictured, Peter 1878 not pictured.//
----

Lizzie's parents immigrated from Russia with one child, and had three more while living in Topeka.  Her mother died when she was six years old.  After Katharina's death in Topeka, John married Susanna Stremel on January 29, 1889. She died that same year.   His third wife, Barbara Ostertag, came to America in 1892 at the age of 20 and settled with relatives in Topeka.  According to her obituary, it was there she married "John Breit a widower with four children, George, John, Pete, and Elizabeth. To this union were born nine children… The Breits later moved to Pfeifer, Kansas where most of the children grew up."

A fellow Ancestry.com researcher lists a son Francis Breit who died in Topeka in June of 1896, twelve days old. The next child Dorothy Breit Dome might have been the first born in Pfeifer, in December 1897.

Nearing the turn of the century, Lizzie would have been a newcomer to Pfeifer.  Her brother married Mary Anne Burgardt in 1900, in a triple wedding ceremony where two sisters married two Jacobs men.  I wonder what Lizzy thought of George Jacobs when she saw him in church; if the two knew each other beyond acquaintance or felt any attraction.  Twenty years later after both their spouses were deceased, Lizzie and George would marry.

On February 13, 1900, ''George G. Jacobs'' was married to Eva Urban at Holy Cross Church in Pfeifer, Kansas in a triple ceremony. At the same service two other couples were also married: Casper Jacobs [a third cousin of George] and Magdalena Urban, sister of Eva; as well as ''Peter J. Breit'' and Mary Anne Burgardt.
{{rjustify{
—Based upon the obituary for Casper Jacobs in the
February 1953 //Clark County Clipper//, Ashland, Kansas}}}
George G. Jacobs—son of Michael, grandson of Andreas Jacobs—was Lizzy's future husband, and Peter Breit was her brother.

Elizabeth Breit married John Peter Jacobs—son of Gottlieb, grandson of Andreas Jacobs—on November 10, 1903 in the same church in Pfeifer.  His cousin George may have attended the wedding. Together Lizzie and J.P. had two sons and six daughters, with one pair of twin girls //@@color(mediumblue):(twin instance #1.)@@//  During the 1910 census, they lived in Ogallah, Trego County, Kansas, about 50 miles from Pfeifer, where J. Peter was listed by the census taker in "general farming."  I believe their daughter Frances Jacobs Brackney was born in Kansas in 1913.  They moved to Denver, Colorado sometime in the following years.  According to the stories I've heard, John Peter Jacobs committed suicide March 11, 1915 in Denver, leaving Lizzie with seven children and due to deliver her eighth.  That child Bertha Jacobs Urban was born in May 1915, most likely in Kansas.

During the February 1920 census, Lizzie was back in Pfeifer, listed as the head of her household and widowed.  Her eight children ranged from age 15 to 4.  Within the following month, she conceived another child with George G. Jacobs, her husband J.P.'s first cousin.  George's wife Eva had died in 1918, after they had eleven children together.  George and Lizzie had their first son together, Theodore Jacobs, on December 12, 1920.  They had three children total, ending in a combined total of 22 children and step-children.

Here is where things get really tangled, as I warned you they would!

During the 1925 Kansas census, 16 of their children lived under George and Lizzie's roof: 
* 8 of George and Eva's children: Tony (age 21), Steven (19), Monica (16), Regina (14), Boniface (13), twins //@@color(mediumblue):(instance #2)@@// Helen and Isadore (11), and Mary (9). 
* 5 of Peter and Lizzie's children: another Regina (age 17), another Mary (15), Dorothy (12), Frances (11), and Bertha (9).
* 3 of George and Lizzie's children: Theodore (4), Paul (3), and Irene (1).

Two of George's sons (Tony and John) married two of Lizzie's daughters (Regina and Veronica.)  John and Veronica were already married that year, and their first son Alvin was born in December 1925.  Tony and Regina were not far behind; their first daughter Lucille Jacobs Dreher was born December 17, 1927.

[img[Anthony and Regina Jacobs|http://farm4.staticflickr.com/3699/11911669995_c492853239_o_d.jpg][http://www.flickr.com/photos/114151783@N05/11911669995/]]
//Anthony and Regina Jacobs//

Tony and Regina's seventh child (of 13!) is my grandmother Rosaline (Rose) Jacobs Unrein.  They had eleven daughters and two sons.  Lizzie Breit is the matriarch of a prolific [[female line]].

Lizzie buried several of her children who lived to adulthood.  The first was Helen Jacobs, Regina's twin sister.  She died December 29, 1925 at age 18, I believe without children.

The second was Veronica Jacobs, who like Regina had married her step-brother and second cousin.  She died December 10, 1943 at age 37, and left four children who are double-first cousins to my grandmother. One of them is Doris Jacobs Schreibvogel, who attends annual family reunions of Tony and Regina's children.

Lizzie's second husband George died December 11, 1941, 66 years old.  Their son Theodore died May 30, 1955.
[img[Theodore Jacobs' Military Application for Headstone|http://farm4.staticflickr.com/3667/11912557276_c5679351c6_b_d.jpg][http://www.flickr.com/photos/114151783@N05/11912557276/]]
//Ancestry.com. U.S., Headstone Applications for Military Veterans, 1925-1963 [database on-line]. Provo, UT, USA: Ancestry.com Operations, Inc., 2012.//

Lizzie's granddaughter Rose Jacobs was engaged at this time and married my Grandpa, Elmer Unrein, on August 31, 1955.  Rose has a twin sister //@@color(mediumblue):(instance #3)@@//, Isabelle Jacobs Schuckman – there are lots of twins in this family!  I know of at least one in the next generation, a granddaughter of Regina, who conceived twins.

Elizabeth Breit Jacobs passed away January 27, 1970 and is buried in Pfeifer, Kansas.
}}}
===
}}}
''[[Elizabeth's Gravesite|http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=66178902]]

[[Her Father's Gravesite|http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=44861899]]''

We won't all be so lucky to live 100 years with full health and mental agility, nor will each of our parents and grandparents. However, in recent times, most people can expect their own lifetime, extended by a child's, will likely reach 100 years.  The reach of Lizzie's [[parent/child]] lifespan was 123 years.  Her youngest daughter ''[[Irene Jacobs Simmons|http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=83064002]]'' died in 2006.
The title and subtitle of your space are visible to visitors and are also displayed in your browser's tabs. Click on the SiteTitle and SiteSubtitle tiddler links below to make changes.
* [[SiteTitle]]
* [[SiteSubtitle]]
!OUR FAMILY'S HISTORIES & MYSTERIES
of Ireland and the British Isles;
Germany, Russia and Slovakia;
the Story of an Orphan Train Rider;
and the Paternal ~Y-DNA Group ~T-Z709

''Principal branches of this tree are traced from the following people:''

• Joseph A. Unrein (nėe [[Joseph Magner|Joe's half-sister]]) born 1898 in New York City and adopted by John Peter and Margaretha Unrein of Schoenchen, KS
• Joseph's father was an Irish man who belonged to ~Y-DNA Haplogroup ~T-Z709 -- possibly Dr. James Magner (or Magher, or Maher)
• Angela Werth Unrein (1900-1978), and Anthony and Regina [[Jacobs|Elizabeth Breit Jacobs]] (1907-1978), ~Volga-Germans of Ellis Co., KS
• Jesse L. Butler (British Isles / German), born 1898 in Nebraska, died 1973 in Pueblo, CO, and his wife Mable E. Davis (1902-1988)
• Delbert M. Williams (1909-1997, Irish) and his wife [[Camilla Broster Williams]] (1907-1988, English / German) of Southern Illinois
• Carl and Marie Schuh (mtDNA haplogroup H4a1a4b) who immigrated from Darmstadt, Germany to Wabash Co., Illinois
Marie Schuch is my most distantly known [[matrilineal ancestor|female line]].

• Michael [[Sweeney|John Sweeney]] (1862-1930), who immigrated from Ireland to Oklahoma, and his wife Catherine Roach (1873-1950)
• Mark George Liptak (1886-1956), and Anna Kivadar (1893-1973), who immigrated from Terna, Presov, Slovakia to Pueblo, CO
• Andrew Schwab (nėe Andreas Svab, 1875-1961), and Mary Juhar (1876-1964), of Slovak descent, who lived in Missouri and Colorado
Mary Juhar is my children&#39;s most distantly known matrilineal ancestor.
• Edward ~McCulloch (Scottish) born 1875 in Nebraska, died 1912 in Colorado
• Florence G. ~McNulty (Irish) born 1878 in Tennessee, died 1960 in Pueblo, CO

• The male line of John Baxter Brown (born 1858 in TN), who moved to Kansas City, MO
• Peter F. Plunk (1872-1960, from ~McNairy Co., TN to Beaver Co., OK)
• Eva Sceora Thompson Hayes (1875-1936, from Warrick Co., IN to Texas Co., MO)
• Edith Mae Medlock (1904-1944, of Texas Co., MO) the matrilineal ancestor of Eva Sceoria ~Brown-Hayes, my fiancee

----
''genealogy''
early 14c., "line of descent, pedigree, descent," from Old French //genealogie// (12c.), from Late Latin //genealogia// "tracing of a family," from Greek //genealogia//, from //''genea''// "generation, descent" (see genus) + -//logia// <  root of Greek //legein// "to say, tell, speak, declare," originally, in Homer, "to pick out, select, collect, enumerate;" //lexis// "speech, diction;" //''logos''// "word, speech, thought, account."
An Old English word for genealogy was //folctalu//, literally "folk tale." Meaning "study of family trees" is from 1768.
—[[Etymonline.com entry|http://www.etymonline.com/index.php?term=genealogy]]

Space livesentwined
!Katherine Maher Uhler – 52 Ancestors #3

| [img[Katherine Maher, 1931 University of California|http://farm8.staticflickr.com/7341/12153586804_7c59ede9f8_o_d.jpg][http://www.flickr.com/photos/114151783@N05/12153586804/]] | [img[Katherine Maher, 1930 University of California|http://farm4.staticflickr.com/3709/12153435193_6cc924d01b_o_d.jpg][http://www.flickr.com/photos/114151783@N05/12153435193/]] |
|>| Born 18 July 1897 in New York City |
|>| Married Armin Uhler circa 1932 |
|>| Death date unknown, possibly in Europe |

//January 23, 2014//
Last night I had a dream that I was talking with a relative of Katherine Uhler.  He didn't know her last name, but said that his mother was her niece.  Excitedly, I shared her full name with him, and that she married Armin Uhler.  Upon waking this morning, I decided that it's time to write about Katherine.

For a few months of last year, I thought Katherine was my [[great-grandfather's half-sister|Joe's half-sister]].  DNA testing of Katherine's distant cousins later showed that to be unlikely.  But I remain intrigued by Katherine.  From the outset of the [[52Ancestors]] Challenge, I planned to write about both Katherine and her father.  They are two of my "[[Orphaned Ancestors]]" – people who left little trace in genealogical records and are now largely forgotten.  These orphans of history have few or no living descendants.  I have adopted them and devote some of my time to preserving their memory, even though we have no biological relationship.

Katherine Lavelle Maher was born July 18, 1897, the firstborn of James J. E. Maher and Anna O'Neill.  The couple lived in Manhattan, and had married the prior October.  James was a surgeon and gynecologist who married when he was nearly 40 years old.  He was an Irishman born in Albany, earned his medical degree from ~McGill University (Montreal, Canada) in 1883, and then began practice in New York City.  Anna O'Neill, fifteen years his junior, was born in 1873 in Yonkers, NY.  She was the daughter of [[Francis O'Neill]], probably from his second marriage; she had one or two full sisters and nine half-siblings from her father's third marriage.
{{rjustify{
+++[more/hide]
{{ljustify{
A second daughter, Helen, was born in 1900 but died as an infant that August.  By November 1901, a newspaper reported the couple was in divorce court, stating that Anna's father was
<<<
the late Francis O'Neill, who until after his death was supposed to be wealthy.  She said that her husband's cruelty was due to his disappointment as to the amount of her inheritance.  Mrs. Maher testified that her husband forced her to sleep on a sofa outside of his room for months, neglected her and their two children, and… [alleged] Dr. Maher was addicted to the use of cocaine, and when under its influence, abused and threatened to kill her.  Several nurses corroborated her statements.
<<<
Anna O'Neill Maher died before 1910.  During the 1905 New York state census, her husband was living with a "partner" Emma L. Nichols, age 26.  Marital status was not listed on the state census.  Katherine did not appear with him, so I believe she was living elsewhere with her mother.  I am currently waiting on a death certificate ordered for Anna.  According to an Ancestry.com death index, an "Annie Maher" died June 5, 1908 in Manhattan, and was the correct age (35.)

During the 1910 Federal Census, James was listed as widowed, Katherine was living with him, and Emma Nichols (once partner) was now listed as his "niece."  I can't find James in any subsequent census, but know that he lived until 1931.  My supposition is that he and Katherine were estranged.

Remaining chronology of Katherine's life follows. I exhaustively followed her O'Neill lineage down to living relatives, in an effort to learn more about her.  Most records I discovered were from her academic career.
* 1915 school year, she attended the New York State College for Teachers. This was listed in her educational background when she was teaching at [[Louisburg College|http://archive.org/stream/catalogueserial1936loui#page/n13/mode/2up/search/uhler]].  Text from her transcript I obtained from University at Albany SUNY:
**Name: Maher, Katherine Lavelle //[This is the only document I have showing her middle name.]//
**Place and date of birth: Brooklyn 7/18/97
**Name and address of Father or Guardian: Maher, Miss Anna F., 207 Madison Av., Albany, NY //[Her father's sister who never married.]//
**Where prepared for College: Mt. St. Mary's, Montreal
**Left Dec. 1916; Major Subject: French; Minor Subjects: History, Spanish
**Transcript sent to Univ. of Michigan 9/6/38
* During the 1920 census, Katherine lived with her mother's sister Claire [[O'Neill|Francis O'Neill]] Fleming (1886-1969) and cousin John "Jack" Fleming.  Katherine's occupation was listed as an actress.
*1930-31 school years, Katherine attended the University of California.  Her photographs appeared in the [[yearbooks here|https://archive.org/stream/southerncampus1930univ#page/377/mode/1up]] and [[here|https://archive.org/stream/southerncampushon1931univ#page/369/mode/1up]].
*Her husband Armin Uhler, still single, lived in Charlotte, North Carolina during the 1930 Census.
*Katherine Uhler appeared in a 1932 city directory living in Charlotte.  I have not yet located a marriage record or date.
*In June and December 1932, she returned from Le Havre, France according to New York passenger lists.  Armin appeared on a separate arrival in November.
*Katherine earned a Master of Arts degree from Duke University in 1939. I obtained a copy of her thesis which was approved August 5, 1938.  She seems to have been attending at the University of Michigan in the same time period, where her husband spent three years of research.  By 1940, she and Armin were living in Ada, Ohio, where he was an assistant law professor at Ohio Northern University.
*Sometime in the 1940s, Armin took a position at the National Labor Relations Board and relocated with Katherine to Washington, D.C.  By 1951, according to this [[register|http://books.google.com/books?id=wtQhAAAAMAAJ&pg=PA586]], Armin was the acting chief of the legal reference and publications branch.
*Katherine has one first cousin still living, Connie (Constance) [[O'Neill|Francis O'Neill]] Gourdeau, who remembers visiting Katherine in Washington, D.C. in the early to mid 50's.  Connie is the daughter of Anna O'Neill's youngest brother Charles (1892-1969.)
*Connie confirmed the yearbook pictures above are Katherine's.  She also stated that Armin and Katherine lived in Lugano, Switzerland in 1963.  While there, Armin committed suicide by stepping in front of a train, "and we had notice of Katherine’s passing from a neighbor."  I have not verified death dates for either.
}}}
===
}}}
Katherine had no children, so I had to contact Maher cousins of hers to test the hypothesis of Dr. James J. E. Maher being my ancestor.  His brother's great-grandson (through Julia Maher Johnson) submitted a DNA sample, as did his sister's great-granddaughter (through Mary Maher Spain.)  They matched one another, but not my grandfather's DNA sample.  With three samples to compare, it appears very unlikely that my orphaned ancestor was related to the Mahers of Albany, or to Katherine Maher Uhler.

''Katherine's husband Armin Uhler:
[img(40%,)[Armin Uhler in La Cigale 1962|http://farm3.staticflickr.com/2889/12145008023_8115e358fa_o_d.jpg
][http://www.flickr.com/photos/114151783@N05/12145008023/]]

[[Her Father's Gravesite|http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&GRid=74450743]]''
[tag[post]][sort[-modified]][limit[7]]
[[Lives Entwined In Us]]
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'></div>
	</span>
	<span class='modifierIcon'
		macro='view modifier SiteIcon label:no height:48 width:48 preserveAspectRatio:yes'>
	</span>
	<div class='toolbar'
		macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes height:48 width:48 more:popup'>
	</div>
	<div class='tagClear'></div>
</div>
<div class='content'>
	<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
	<div class='tidTags' macro='tags'></div>
	<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
/%

Hello,

If you choose to change this GettingStarted tiddler, you may wish to add the following to your new content if you expect you space to be included:

<<<
----
Hello,
''This ~GettingStarted tiddler has been customized.''
If you want to see the original system tiddler just click the following link: GettingStarted@system-info at system-info.
<<<
%/

Welcome to your brand new [[TiddlySpace|http://docs.tiddlyspace.com/TiddlySpace]].

You're almost ready to go, there are just a couple of things left to do.

!Customise your space
Go to [[SpaceSettings]] to finish customising  your space. When you're done, come back here (just scroll up). Don't worry though, this will still be open when you've finished.

!Further Customisation

For advanced options, the [[ServerSettings]] tiddler is used to enable the following features:

#index: The value is the name of a tiddler that will be presented when loading the space.  For example, when set to {{{Hello}}} for the space hello.tiddlyspace.com, navigating to that URL will present the Hello tiddler. If there is no {{{Hello}}} you will get an error.
#editor: The name of an [[editor application|http://docs.tiddlyspace.com/Example%20Tiddler%20Editors]] to edit tiddlers with.  Applications come from [[included spaces|http://docs.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F]]

//If you do not need or understand these features there is no need to create a ServerSettings tiddler.//

To edit these options: 

* click [[here|ServerSettings]] to open the [[ServerSettings]] tiddler
* click on the edit button (the pencil icon)
* add the options you wish to set 
* click on the save button (the tick icon).

An example [[ServerSettings]] tiddler:
{{{
index: HelloThere
editor: /edit#{tiddler}
}}}

The additional text after /edit allows a tiddler to be opened in edit mode e.g:
{{{http://hello.tiddlyspace.com/edit#MyTiddler}}}

!!See Also

* [[ServerSettings shadow tiddler|http://docs.tiddlyspace.com/ServerSettings%20shadow%20tiddler]]
* [[Choosing a non-TiddlyWiki Default Application for your Space|http://docs.tiddlyspace.com/Choosing%20a%20non-TiddlyWiki%20Default%20Application%20for%20your%20Space]]

!Finished customising?
You can [[Start writing]] some [[tiddlers|http://docs.tiddlyspace.com/Tiddler]].
If you're not done tweaking yet though, you can always [[Customise this space|SpaceSettings]] a bit more.

You can also [[access and read other tiddlers in various ways|http://docs.tiddlyspace.com/Viewing%20Tiddlers]].

!Administration
If you'd like to change your password or create another space, visit "Your Account" from the [[Universal Backstage|http://docs.tiddlyspace.com/UniversalBackstage]] (the blue dot in the upper right of the page). If you'd like to add a member or [[include a space|http://docs.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F]] visit "This Space" from the [[Universal Backstage|http://docs.tiddlyspace.com/UniversalBackstage]].

You can have as many spaces as you like and each space can have as many members as you or your group need.

!Stuck?
If you're stuck, and would like some help, please visit the [[help|http://help.tiddlyspace.com]] space, which can point you in the right direction.
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.5|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Usage
Provides changeToPrivate, changeToPublic and saveDraft commands
Provides TiddlySpacePublisher macro.
{{{<<TiddlySpacePublisher type:private>>}}} make lots of private tiddlers public.
{{{<<TiddlySpacePublisher type:public>>}}} make lots of public tiddlers public.
!TODO
* add public argument?
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;

tiddlyspace.getTiddlerStatusType = function(tiddler) {
	var isShadow = store.isShadowTiddler(tiddler.title);
	var exists = store.tiddlerExists(tiddler.title);
	if(isShadow && !exists) {
		return "shadow";
	} else if(!exists) {
		return "missing";
	} else {
		var types = ["private", "public"];
		var type = "external";
		for(var i = 0; i < types.length; i++) {
			var t = types[i];
			type = config.filterHelpers.is[t](tiddler) ? t : type;
		}
		if(config.filterHelpers.is.unsynced(tiddler)) {
			type = type == "private" ? "unsyncedPrivate" : "unsyncedPublic";
		}
		return type;
	}
};

var cmd = config.commands.publishTiddler = {
	text: "make public",
	tooltip: "Change this private tiddler into a public tiddler",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["private"](tiddler);
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			var newBag = cmd.toggleBag(tiddler.fields["server.bag"]);
			this.moveTiddler(tiddler, {
				title: tiddler.fields["publish.name"] || tiddler.title,
				fields: { "server.bag": newBag }
			});
		}
	},
	toggleBag: function(bag, to) {
		var newBag;
		if(typeof bag != typeof "") {
			var tiddler = bag;
			bag = tiddler.fields["server.bag"];
		}
		if(bag.indexOf("_private") > -1) { // should make use of endsWith
			to = to ? to : "public";
			newBag = bag.replace("_private", "_" + to);
		} else {
			to = to ? to : "private";
			newBag = bag.replace("_public", "_" + to);
		}
		return newBag;
	},
	copyTiddler: function(title, newTitle, newBag, callback) {
		var original = store.getTiddler(title);
		newTitle = newTitle ? newTitle : title;
		var adaptor = original.getAdaptor();
		var publish = function(original, callback) {
			var tiddler = $.extend(new Tiddler(newTitle), original);
			tiddler.fields = $.extend({}, original.fields, {
				"server.bag": newBag,
				"server.workspace": "bags/%0".format(newBag),
				"server.page.revision": "false"
			});
			delete tiddler.fields["server.title"];
			tiddler.title = newTitle;
			adaptor.putTiddler(tiddler, null, null, callback);
		};
		publish(original, callback);
	},
	moveTiddler: function(tiddler, newTiddler, callback) {
			var info = {
			copyContext: {},
			deleteContext: {}
		};
		var _dirty = store.isDirty();
		var adaptor = tiddler.getAdaptor();
		var newTitle = newTiddler.title;
		var oldTitle = tiddler.title;
		delete tiddler.fields["server.workspace"];
		var oldBag = tiddler.fields["server.bag"];
		var newBag = newTiddler.fields["server.bag"];
		var newWorkspace = "bags/%0".format(newBag);
		cmd.copyTiddler(oldTitle, newTitle, newBag, function(ctx) {
				info.copyContext = ctx;
				var context = {
					tiddler: tiddler,
					workspace: newWorkspace
				};
				store.addTiddler(ctx.tiddler);
				tiddler.title = oldTitle; // for cases where a rename occurs
				if(ctx.status) { // only do if a success
					if(oldBag != newBag) {
						adaptor.deleteTiddler(tiddler, context, {}, function(ctx) {
							info.deleteContext = ctx;
							var el;
							if(tiddler) {
								tiddler.fields["server.workspace"] = newWorkspace;
								tiddler.fields["server.bag"] = newBag;
							}
							el = el ? el : story.refreshTiddler(oldTitle, null, true);
							if(oldTitle != newTitle) {
								store.deleteTiddler(oldTitle);
								store.notify(oldTitle, true);
							}
							if(el) {
								story.displayTiddler(el, newTitle);
							}
							if(oldTitle != newTitle) {
								story.closeTiddler(oldTitle);
							}
							if(callback) {
								callback(info);
							}
							store.setDirty(_dirty);
						});
					} else {
						if(callback) {
							callback(info);
						}
					}
					refreshDisplay();
				}
		});
	}
};

var changeToPrivate = config.commands.changeToPrivate = {
	text: "make private",
	tooltip: "turn this public tiddler into a private tiddler",
	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["public"](tiddler);
	},
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var newBag = cmd.toggleBag(tiddler, "private");
		var newTiddler = { title: title, fields: { "server.bag": newBag }};
		cmd.moveTiddler(tiddler, newTiddler);
	}
};
config.commands.changeToPublic = cmd;

/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
	text: "save draft",
	tooltip: "Save as a private draft",
	isEnabled: function(tiddler) {
		return changeToPrivate.isEnabled(tiddler);
	},
	getDraftTitle: function(title) {
		var draftTitle;
		var draftNum = "";
		while(!draftTitle) {
			var suggestedTitle = "%0 [draft%1]".format(title, draftNum);
			if(store.getTiddler(suggestedTitle)) {
				draftNum = !draftNum ? 2 : draftNum + 1;
			} else {
				draftTitle = suggestedTitle;
			}
		}
		return draftTitle;
	},
	createDraftTiddler: function(title, gatheredFields) {
		var tiddler = store.getTiddler(title);
		var draftTitle = saveDraftCmd.getDraftTitle(title);
		var draftTiddler = new Tiddler(draftTitle);
		if(tiddler) {
			$.extend(true, draftTiddler, tiddler);
		} else {
			$.extend(draftTiddler.fields, config.defaultCustomFields);
		}
		for(var fieldName in gatheredFields) {
			if(TiddlyWiki.isStandardField(fieldName)) {
				draftTiddler[fieldName] = gatheredFields[fieldName];
			} else {
				draftTiddler.fields[fieldName] = gatheredFields[fieldName];
			}
		}
		var privateBag = tiddlyspace.getCurrentBag("private");
		var privateWorkspace = tiddlyspace.getCurrentWorkspace("private");
		draftTiddler.title = draftTitle;
		draftTiddler.fields["publish.name"] = title;
		draftTiddler.fields["server.workspace"] = privateWorkspace;
		draftTiddler.fields["server.bag"] = privateBag;
		draftTiddler.fields["server.title"] = draftTitle;
		draftTiddler.fields["server.page.revision"] = "false";
		delete draftTiddler.fields["server.etag"];
		return draftTiddler;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title); // original tiddler
		var tidEl = story.getTiddler(title);
		var uiFields = {};
		story.gatherSaveFields(tidEl, uiFields);
		var tid = saveDraftCmd.createDraftTiddler(title, uiFields);
		tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier,
			new Date(), tid.tags, tid.fields);
		autoSaveChanges(null, [tid]);
		story.closeTiddler(title);
		story.displayTiddler(src, title);
		story.displayTiddler(src, tid.title);
	}
};

var macro = config.macros.TiddlySpacePublisher = {
	locale: {
		title: "Batch Publisher",
		changeStatusLabel: "Make %0",
		noTiddlersText: "No tiddlers to publish",
		changeStatusPrompt: "Make all the selected tiddlers %0.",
		description: "Change tiddlers from %0 to %1 in this space"
	},

	listViewTemplate: {
		columns: [
			{ name: "Selected", field: "Selected", rowName: "title", type: "Selector" },
			{ name: "Tiddler", field: "tiddler", title: "Tiddler", type: "Tiddler" },
			{ name: "Status", field: "status", title: "Status", type: "WikiText" }
		],
		rowClasses: []
	},

	changeStatus: function(tiddlers, status, callback) { // this is what is called when you click the publish button
		var publicBag;
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var newTiddler = {
				title: tiddler.title,
				fields: { "server.bag": cmd.toggleBag(tiddler, status) }
			};
			cmd.moveTiddler(tiddler, newTiddler, callback);
		}
	},
	getMode: function(paramString) {
		var params = paramString.parseParams("anon")[0];
		var status = params.type ?
			(["public", "private"].contains(params.type[0]) ? params.type[0] : "private") :
			"private";
		var newStatus = status == "public" ? "private" : "public";
		return [status, newStatus];
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var wizard = new Wizard();
		var locale = macro.locale;
		var status = macro.getMode(paramString);
		wizard.createWizard(place, locale.title);
		wizard.addStep(macro.locale.description.format(status[0], status[1]),
			'<input type="hidden" name="markList" />');
		var markList = wizard.getElement("markList");
		var listWrapper = $("<div />").addClass("batchPublisher").
			attr("refresh", "macro").attr("macroName", macroName).
			attr("params", paramString)[0];
		markList.parentNode.insertBefore(listWrapper, markList);
		$.data(listWrapper, "wizard", wizard);
		macro.refresh(listWrapper);
	},
	getCheckedTiddlers: function(listWrapper, titlesOnly) {
		var tiddlers = [];
		$(".chkOptionInput[rowName]:checked", listWrapper).each(function(i, el) {
			var title = $(el).attr("rowName");
			if(titlesOnly) {
				tiddlers.push(title);
			} else {
				tiddlers.push(store.getTiddler(title));
			}
		});
		return tiddlers;
	},
	refresh: function(listWrapper) {
		var checked = macro.getCheckedTiddlers(listWrapper, true);
		var paramString = $(listWrapper).empty().attr("params");
		var wizard = $.data(listWrapper, "wizard");
		var locale = macro.locale;
		var params = paramString.parseParams("anon")[0];
		var publishCandidates = [];
		var status = macro.getMode(paramString);
		var pubType = status[0];
		var newPubType = status[1];
		var tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) :
			store.filterTiddlers("[is[%0]]".format(pubType));
		var enabled = [];
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var title = tiddler.title;
			if(!tiddler.tags.contains("excludePublisher") && title !== "SystemSettings") {
				publishCandidates.push({ title: title, tiddler: tiddler, status: pubType});
			}
			if(checked.contains(title)) {
				enabled.push("[rowname=%0]".format(title));
			}
		}

		if(publishCandidates.length === 0) {
			createTiddlyElement(listWrapper, "em", null, null, locale.noTiddlersText);
		} else {
			var listView = ListView.create(listWrapper, publishCandidates, macro.listViewTemplate);
			wizard.setValue("listView", listView);
			var btnHandler = function(ev) {
				var tiddlers = macro.getCheckedTiddlers(listWrapper);
				var callback = function(status) {
					$(".batchPublisher").each(function(i, el) {
						macro.refresh(el);
					});
				};
				macro.changeStatus(tiddlers, newPubType, callback);
			};
			wizard.setButtons([{
				caption: locale.changeStatusLabel.format(newPubType),
				tooltip: locale.changeStatusPrompt.format(newPubType),
				onClick: btnHandler
			}]);
			$(enabled.join(",")).attr("checked", true); // retain what was checked before
		}
	}
};

})(jQuery);
//}}}
!Spaces
<<groupBy server.bag>>

!Private
<<list filter [is[private]]>>

!Public
<<list filter [is[public]]>>

!Drafts
<<list filter [is[draft]]>>
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.8.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink macro|
|''Status''|@@beta@@|
|''Contributors''|Jon Lister, Jon Robson, Colm Britton|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!StyleSheet
.tiddler .error.annotation .button{
	display: inline-block;
}

#backstageArea {
	z-index: 49;
	color: white;
	background-color: black;
	background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
	height: 25px;
	padding: 0;
}

#backstageButton {
	overflow: hidden;
}

#backstageButton #backstageShow,
#backstageButton #backstageHide {
	margin: 0px;
	padding: 0px;
}

#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
	background: none;
	color: none;
}

#backstageButton img,
#backstageButton svg {
	width: 24px;
	height: 24px;
}

#messageArea {
	top: 50px;
}

#backstageToolbar {
	position: relative;
}

#backstageArea a {
	padding: 0px;
	margin-left: 0px;
	color: white;
	background: none;
}

#backstageArea a:hover {
	background-color: white;
}

#backstage ol,
#backstage ul {
	padding: auto;
}

#backstageButton a {
	margin: 0;
}

.backstagePanelBody ul {
	padding: 5px;
	margin: 5px;
}

#backstage #backstagePanel {
	margin-left: 5%;
	padding: 0em;
	margin-right: 5%;
}

#backstageToolbar a {
	position: relative;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask {
	line-height: 25px;
	color: #767676;
}

.backstageTask .externalImage,
.backstageTask .image {
	display: inline;
}

#backstageToolbar a span {
	z-index: 2;
}

a.backstageTask {
	display: inline;
        margin-left: 1em !important;
}

.backstagePanelBody .button {
	display: inline-block;
	margin-right: 10px;
}

.backstagePanelBody {
	margin: 0 0 0 0.6em;
	padding: 0.4em 0.5em 1px 0.5em;
}

#backstage table {
	margin: auto;
}

#backstage .wizard table {
	border: 0px;
	margin: 0;
}

#backstage div  li.listLink {
	border: 0px;
	width: 78%;
	font-size: 0.7em;
}

#backstage div li.listTitle {
	font-weight: bold;
	text-decoration: underline;
	font-size: 1em;
	background: #ccc;
	width: 100%;
}

#backstage fieldset {
	border: solid 1px [[ColorPalette::Background]];
}

#backstage .viewer table,#backstage table.twtable {
	border: 0px;
}

#backstageToolbar img {
	padding: 0;
}

#backstage .wizard,
#backstage .wizardFooter {
	background: none;
}

.viewer td, .viewer tr, .twtable td, .twtable tr {
	border: 1px solid #eee;
}

#backstage .inlineList ul li {
	background-color: [[ColorPalette::Background]];
	border: solid 1px [[ColorPalette::TertiaryMid]];
	display: block;
	float: left;
	list-style: none;
	margin-right: 1em;
	padding: 0.5em;
}

.backstageClear, .inlineList form {
	clear: both;
	display: block;
	margin-top: 3em;
}

.tiddlyspaceMenu {
	text-align: center;
}

span.chunkyButton {
	display: inline-block;
	padding: 0;
	margin: 0;
	border: solid 2px #000;
	background-color: #04b;
}

span.chunkyButton a.button, span.chunkyButton a:active.button {
	white-space: nowrap;
	font-weight: bold;
	font-size: 1.8em;
	color: #fff;
	text-align: center;
	padding: 0.5em 0.5em;
	margin: 0;
	border-style: none;
	display: block;
}

span.chunkyButton:hover {
	background-color: #014;
}

span.chunkyButton a.button:hover {
	border-style: none;
	background: none;
	color: #fff;
}

#backstage .unpluggedSpaceTab .wizard,
.unpluggedSpaceTab .wizard {
	background: white;
	border: 2px solid #CCC;
	padding: 5px;
}

.syncKey .keyItem {
	border: 1px solid black;
	display: inline-block;
	margin: 0.2em;
	padding: 0.1em 0.1em 0.1em 0.1em;
}

.keyHeading {
	font-size: 2em;
	font-weight: bold;
	margin: 0.4em 0em -0.2em;
}

.unpluggedSpaceTab .putToServer,
.unpluggedSpaceTab .notChanged {
	display: none;
}

.tiddlyspaceMenu ul {
	margin: 0;
	padding: 0;
}

.tiddlyspaceMenu ul li {
	list-style: none;
}

.unsyncedChanges .unsyncedList {
	display: block;
}

.unsyncedList {
	display: none;
}
!Code
***/
//{{{
(function ($) {
    var name = "StyleSheet" + tiddler.title;
    config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
        format(store.getTiddlerText(tiddler.title + "##StyleSheet")); // this accesses the StyleSheet section of the current tiddler (the plugin that contains it)
    store.addNotification(name, refreshStyles);

    if (!config.extensions.tiddlyweb.status.tiddlyspace_version) { // unplugged
        config.extensions.tiddlyweb.status.tiddlyspace_version = "<unknown>";
        config.extensions.tiddlyweb.status.server_host = {
            url:config.extensions.tiddlyweb.host }; // TiddlySpaceLinkPlugin expects this
    }
    var disabled_tasks_for_nonmembers = ["tiddlers", "plugins", "batch", "sync"];

    var tweb = config.extensions.tiddlyweb;
    var tiddlyspace = config.extensions.tiddlyspace;
    var currentSpace = tiddlyspace.currentSpace.name;
    var imageMacro = config.macros.image;

    if (config.options.chkBackstage === undefined) {
        config.options.chkBackstage = false;
    }

// Set up Backstage
    config.tasks = {};
    config.tasks.status = {
        text:"status",
        tooltip:"TiddlySpace Info",
        content:"<<tiddler Backstage##Menu>>"
    };
    config.tasks.tiddlers = {
        text:"tiddlers",
        tooltip:"tiddlers control panel",
        content:"<<tiddler Backstage##BackstageTiddlers>>"
    };
    config.tasks.plugins = {
        text:"plugins",
        tooltip:"Manage installed plugins",
        content:"<<tiddler Backstage##Plugins>>"
    };
    config.tasks.batch = {
        text:"batch",
        tooltip:"Batch manage public/private tiddlers",
        content:"<<tiddler Backstage##BatchOps>>"
    };
    config.tasks.tweaks = {
        text:"tweaks",
        tooltip:"Tweak TiddlyWiki behaviors",
        content:"<<tiddler Backstage##Tweaks>>"
    };
    config.tasks.exportTiddlers = {
        text:"import/export",
        tooltip:"Import/export tiddlers from/to a TiddlyWiki",
        content:"<<tiddler Backstage##ImportExport>>"
    };
    config.tasks.sync = {
        text:"sync",
        tooltip:"Check Sync status",
        content:"<<tiddler Backstage##SpaceUnplugged>>"
    };

    if (window.location.protocol === "file:") {
        config.unplugged = true;
    }

    config.backstageTasks = ["status", "tiddlers", "plugins",
        "batch", "tweaks", "exportTiddlers", "sync"];

    config.messages.backstage.prompt = "";
// initialize state
    var _show = backstage.show;
    backstage.show = function () {
        // selectively hide backstage tasks and tabs based on user status
        var tasks = $("#backstageToolbar .backstageTask").show();
        var bs = backstage.tiddlyspace;
        if (!config.unplugged) {
            tweb.getUserInfo(function (user) {
                if (user.anon) {
                    jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
                        var taskIndex = config.backstageTasks.indexOf(task);
                        if (taskIndex !== -1) {
                            config.backstageTasks.splice(taskIndex, 1);
                        }
                    });
                    config.messages.memberStatus = bs.locale.loggedout;
                } else {
                    config.messages.memberStatus = readOnly ?
                        bs.locale.nonmember : bs.locale.member;
                }
            });
        } else {
            config.messages.memberStatus = bs.locale.unplugged;
        }

        // display backstage
        return _show.apply(this, arguments);
    };
    if (readOnly) {
        jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
            var taskIndex = config.backstageTasks.indexOf(task);
            if (taskIndex !== -1) {
                config.backstageTasks.splice(taskIndex, 1);
            }
        });
    }

    var tasks = config.tasks;
    var commonUrl = "/bags/common/tiddlers/%0";

    backstage.tiddlyspace = {
        locale:{
            member:"You are a member of this space.",
            nonmember:"You are not a member of this space.",
            loggedout:"You are currently logged out of TiddlySpace.",
            unplugged:"You are unplugged."
        },
        showButton:function () {
            var showBtn = $("#backstageShow")[0];
            var altText = $(showBtn).text();
            $(showBtn).empty();
            imageMacro.renderImage(showBtn, "backstage.svg",
                { altImage:commonUrl.format("backstage.png"), alt:altText});
        },
        hideButton:function () {
            var hideBtn = $("#backstageHide")[0];
            var altText = $(hideBtn).text();
            $(hideBtn).empty();
            imageMacro.renderImage(hideBtn, "close.svg",
                { altImage:commonUrl.format("close.png"), alt:altText, width:24, height:24 });
        }
    };

    var _init = backstage.init;
    backstage.init = function () {
        _init.apply(this, arguments);
        var init = function (user) {
            var bs = backstage.tiddlyspace;
            bs.showButton();
            bs.hideButton();
        };
        tweb.getUserInfo(init);
    };

    var home = config.macros.homeLink = {
        locale:{
            linkText:"your home space"
        },
        handler:function (place) {
            var container = $("<span />").appendTo(place)[0];
            tweb.getUserInfo(function (user) {
                if (!user.anon && user.name !== currentSpace) {
                    createSpaceLink(container, user.name, null, home.locale.linkText);
                }
            });
        }
    };

    config.macros.exportSpace = {
        handler:function (place, macroName, params) {
            var filename = params[0] ||
                "/tiddlers.wiki?download=%0.html".format(currentSpace);
            $('<a class="button">download</a>').// XXX: i18n
                attr("href", filename).appendTo(place);
        }
    };

}(jQuery));
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''Description''|Sanitisation for dynamically pulling tiddlers into your space and displaying them|
!Notes
Works both inside and outside TiddlyWiki. Uses the HTML Sanitizer provided by the Google Caja project
(see http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer for more on this), which is licensed under
an Apache License (see http://www.apache.org/licenses/LICENSE-2.0).
!Code
***/
//{{{
(function($) {

var cleanURL = function(url) {
	var regexp = /^(?:http|https|mailto|ftp|irc|news):\/\//;
	return (regexp.test(url)) ? url : null;
};

$.sanitize = function(html) {
	return html_sanitize(html, cleanURL);
};

/*
 * HTML Sanitizer, provided by Google Caja
 */

/* Copyright Google Inc.
 * Licensed under the Apache Licence Version 2.0
 * Autogenerated at Tue May 17 17:39:24 BST 2011
 * @provides html4
 */var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10},html4.ATTRIBS={"*::class":9,"*::dir":0,"*::id":4,"*::lang":0,"*::onclick":2,"*::ondblclick":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::style":3,"*::title":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::rel":0,"a::rev":0,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"del::cite":1,"del::datetime":0,"dir::compact":0,"div::align":0,"dl::compact":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::ismap":0,"input::maxlength":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::readonly":0,"input::size":0,"input::src":1,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"ol::compact":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"p::align":0,"pre::width":0,"q::cite":1,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::size":0,"select::tabindex":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::cols":0,"textarea::disabled":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::readonly":0,"textarea::rows":0,"textarea::tabindex":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"ul::compact":0,"ul::type":0},html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128},html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:16,area:2,b:0,base:18,basefont:18,bdo:0,big:0,blockquote:0,body:49,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,dd:1,del:0,dfn:0,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,font:0,form:0,frame:18,frameset:16,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:49,hr:2,html:49,i:0,iframe:4,img:2,input:2,ins:0,isindex:18,kbd:0,label:0,legend:0,li:1,link:18,map:0,menu:0,meta:18,nobr:0,noframes:20,noscript:20,object:16,ol:0,optgroup:0,option:1,p:1,param:18,pre:0,q:0,s:0,samp:0,script:84,select:0,small:0,span:0,strike:0,strong:0,style:148,sub:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,title:24,tr:1,tt:0,u:0,ul:0,"var":0},html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2},html4.URIEFFECTS={"a::href":2,"area::href":2,"blockquote::cite":0,"body::background":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0},html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0},html4.LOADERTYPES={"a::href":2,"area::href":2,"blockquote::cite":2,"body::background":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2};var html=function(a){function x(b,c,d){var e=[];w(function(b,e){for(var f=0;f<e.length;f+=2){var g=e[f],h=e[f+1],i=null,j;if((j=b+"::"+g,a.ATTRIBS.hasOwnProperty(j))||(j="*::"+g,a.ATTRIBS.hasOwnProperty(j)))i=a.ATTRIBS[j];if(i!==null)switch(i){case a.atype.NONE:break;case a.atype.SCRIPT:case a.atype.STYLE:h=null;break;case a.atype.ID:case a.atype.IDREF:case a.atype.IDREFS:case a.atype.GLOBAL_NAME:case a.atype.LOCAL_NAME:case a.atype.CLASSES:h=d?d(h):h;break;case a.atype.URI:h=c&&c(h);break;case a.atype.URI_FRAGMENT:h&&"#"===h.charAt(0)?(h=d?d(h):h,h&&(h="#"+h)):h=null;break;default:h=null}else h=null;e[f+1]=h}return e})(b,e);return e.join("")}function w(b){var c,d;return v({startDoc:function(a){c=[],d=!1},startTag:function(e,f,g){if(!d){if(!a.ELEMENTS.hasOwnProperty(e))return;var h=a.ELEMENTS[e];if(h&a.eflags.FOLDABLE)return;if(h&a.eflags.UNSAFE){d=!(h&a.eflags.EMPTY);return}f=b(e,f);if(f){h&a.eflags.EMPTY||c.push(e),g.push("<",e);for(var i=0,j=f.length;i<j;i+=2){var k=f[i],l=f[i+1];l!==null&&l!==void 0&&g.push(" ",k,'="',r(l),'"')}g.push(">")}}},endTag:function(b,e){if(d)d=!1;else{if(!a.ELEMENTS.hasOwnProperty(b))return;var f=a.ELEMENTS[b];if(!(f&(a.eflags.UNSAFE|a.eflags.EMPTY|a.eflags.FOLDABLE))){var g;if(f&a.eflags.OPTIONAL_ENDTAG)for(g=c.length;--g>=0;){var h=c[g];if(h===b)break;if(!(a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG))return}else for(g=c.length;--g>=0;)if(c[g]===b)break;if(g<0)return;for(var i=c.length;--i>g;){var h=c[i];a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG||e.push("</",h,">")}c.length=g,e.push("</",b,">")}}},pcdata:function(a,b){d||b.push(a)},rcdata:function(a,b){d||b.push(a)},cdata:function(a,b){d||b.push(a)},endDoc:function(a){for(var b=c.length;--b>=0;)a.push("</",c[b],">");c.length=0}})}function v(c){return function(d,e){d=String(d);var f=null,g=!1,h=[],j=void 0,l=void 0,m=void 0;c.startDoc&&c.startDoc(e);while(d){var n=d.match(g?t:u);d=d.substring(n[0].length);if(g){if(n[1]){var o=b(n[1]),p;if(n[2]){var q=n[3];switch(q.charCodeAt(0)){case 34:case 39:q=q.substring(1,q.length-1)}p=k(i(q))}else p=o;h.push(o,p)}else if(n[4]){l!==void 0&&(m?c.startTag&&c.startTag(j,h,e):c.endTag&&c.endTag(j,e));if(m&&l&(a.eflags.CDATA|a.eflags.RCDATA)){f===null?f=b(d):f=f.substring(f.length-d.length);var r=f.indexOf("</"+j);r<0&&(r=d.length),l&a.eflags.CDATA?c.cdata&&c.cdata(d.substring(0,r),e):c.rcdata&&c.rcdata(s(d.substring(0,r)),e),d=d.substring(r)}j=l=m=void 0,h.length=0,g=!1}}else if(n[1])c.pcdata&&c.pcdata(n[0],e);else if(n[3])m=!n[2],g=!0,j=b(n[3]),l=a.ELEMENTS.hasOwnProperty(j)?a.ELEMENTS[j]:void 0;else if(n[4])c.pcdata&&c.pcdata(n[4],e);else if(n[5]&&c.pcdata)switch(n[5]){case"<":c.pcdata("&lt;",e);break;case">":c.pcdata("&gt;",e);break;default:c.pcdata("&amp;",e)}}c.endDoc&&c.endDoc(e)}}function s(a){return a.replace(m,"&amp;$1").replace(n,"&lt;").replace(o,"&gt;")}function r(a){return a.replace(l,"&amp;").replace(n,"&lt;").replace(o,"&gt;").replace(p,"&#34;").replace(q,"&#61;")}function k(a){return a.replace(j,g)}function i(a){return a.replace(h,"")}function g(a,b){return f(b)}function f(a){a=b(a);if(c.hasOwnProperty(a))return c[a];var f=a.match(d);if(f)return String.fromCharCode(parseInt(f[1],10));if(!!(f=a.match(e)))return String.fromCharCode(parseInt(f[1],16));return""}var b;"script"==="SCRIPT".toLowerCase()?b=function(a){return a.toLowerCase()}:b=function(a){return a.replace(/[A-Z]/g,function(a){return String.fromCharCode(a.charCodeAt(0)|32)})};var c={lt:"<",gt:">",amp:"&",nbsp:"240",quot:'"',apos:"'"},d=/^#(\d+)$/,e=/^#x([0-9A-Fa-f]+)$/,h=/\0/g,j=/&(#\d+|#x[0-9A-Fa-f]+|\w+);/g,l=/&/g,m=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,n=/</g,o=/>/g,p=/\"/g,q=/\=/g,t=new RegExp("^\\s*(?:(?:([a-z][a-z-]*)(\\s*=\\s*(\"[^\"]*\"|'[^']*'|(?=[a-z][a-z-]*\\s*=)|[^>\"'\\s]*))?)|(/?>)|[\\s\\S][^a-z\\s>]*)","i"),u=new RegExp("^(?:&(\\#[0-9]+|\\#[x][0-9a-f]+|\\w+);|<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\?[^>*]*>|<(/)?([a-z][a-z0-9]*)|([^<&>]+)|([<&>]))","i");return{escapeAttrib:r,makeHtmlSanitizer:w,makeSaxParser:v,normalizeRCData:s,sanitize:x,unescapeEntities:k}}(html4),html_sanitize=html.sanitize

// stop here if we're not in TiddlyWiki
// XXX: is this the correct way of checking for TiddlyWiki?
if (!window.TiddlyWiki || !window.store || !store instanceof TiddlyWiki) {
	return;
}

var tiddlyspace = config.extensions.tiddlyspace;

var _subWikify = Wikifier.prototype.subWikify;

var cleanedTitle = 'This section has been cleaned of any potentially harmful code';

var replaceFunctions = {
	html: function(w) {
		var sanitizedHTML, spanEl;
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			sanitizedHTML = $.sanitize(lookaheadMatch[1]);
			spanEl = createTiddlyElement(w.output, 'span', null, 'sanitized');
			spanEl.innerHTML = sanitizedHTML;
			spanEl.setAttribute('title', cleanedTitle);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	},
	customFormat: function(w) {
		switch(w.matchText) {
			case '@@':
				var e = createTiddlyElement(w.output, 'span');
				var styles = config.formatterHelpers.inlineCssHelper(w);
				if (styles.length === 0) {
					e.className = 'marked';
				}
				w.subWikifyTerm(e, /(@@)/mg);
				break;
			case '{{':
				var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
				lookaheadRegExp.lastIndex = w.matchStart;
				var lookaheadMatch = lookaheadRegExp.exec(w.source);
				if(lookaheadMatch) {
					w.nextMatch = lookaheadRegExp.lastIndex;
					e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
					w.subWikifyTerm(e,/(\}\}\})/mg);
				}
				break;
		}
	}
};

Wikifier.prototype.subWikify = function(output, terminator) {
	var tid = this.tiddler,
		spaceName = tiddlyspace.currentSpace.name,
		tidSpace, recipeName, stripped;
	try {
		recipeName = tid.fields['server.recipe'] ||
			tid.fields['server.workspace'];
		tidSpace = tiddlyspace.resolveSpaceName(recipeName);
		if (tidSpace !== spaceName) {
			// external tiddler, so replace dangerous formatters
			stripped = stripHTML(tid, this.formatter);
		}
	} catch(e) {
		// do nothing. There's no tiddler, so assume it's safe (?!?!?)
	}

	_subWikify.apply(this, arguments);

	if (stripped) {
		// change back to the original function
		unstripHTML(stripped, this.formatter);
	}
};

// replace potentially unsafe formatters with versions that strip bad HTML/CSS
var stripHTML = function(tid, formatter) {
	var popped = {}, _handler;
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (replaceFunctions[f.name]) {
			_handler = f.handler;
			popped[f.name] = _handler;
			f.handler = replaceFunctions[f.name];
		}
	};

	return popped;
};

// put the original formatters back where they belong
var unstripHTML = function(stripped, formatter) {
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (stripped[f.name]) {
			f.handler = stripped[f.name];
		}
	};
};

})(jQuery);
//}}}
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
<!--{{{-->
<link href="/bags/livesentwined_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="livesentwined's public feed" />
<link rel="canonical" href="http://livesentwined.tiddlyspace.com/" />
<!--}}}-->
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
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.2|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/BinaryTiddlersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
!Code
***/
//{{{
(function($) {

"use strict";

var ctfield = "server.content-type";

var plugin = config.extensions.BinaryTiddlersPlugin = {
	isWikiText: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		if(ctype) {
			if (ctype === 'text/x-tiddlywiki') {
				return true;
			}
			return !this.isBinary(tiddler) && !this.isTextual(ctype);
		} else {
			return true;
		}
	},
	// NB: pseudo-binaries are considered non-binary here
	isBinary: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		return ctype ? !this.isTextual(ctype) : false;
	},
	isTextual: function(ctype) {
		return ctype.indexOf("text/") === 0
			|| this.endsWith(ctype, "+xml")
			|| ctype === 'application/json'
			|| ctype === 'application/javascript';
	},
	endsWith: function(str, suffix) {
		return str.length >= suffix.length &&
			str.substr(str.length - suffix.length) === suffix;
	},
	isLink: function(tiddler) {
		return this.isBinary(tiddler) && tiddler.text.indexOf("<html>") !== -1;
	}
};

// Disable edit for linked tiddlers (for now)
// This will be changed to a GET then PUT
config.commands.editTiddler.isEnabled = function(tiddler) {
    var existingTest = config.commands.editTiddler.isEnabled;
    if (existingTest) {
        return existingTest && !plugin.isLink(tiddler);
    } else {
        return !plugin.isLink(tiddler);
    }
};

// hijack text viewer to add special handling for binary tiddlers
var _view = config.macros.view.views.wikified;
config.macros.view.views.wikified = function(value, place, params, wikifier,
		paramString, tiddler) {
	var ctype = tiddler.fields["server.content-type"];
	if(params[0] === "text" && ctype && ctype !== 'text/x-tiddlywiki' &&
			!tiddler.tags.contains("systemConfig") && !plugin.isLink(tiddler)) {
		var el;
		if(plugin.isBinary(tiddler)) {
			var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
			if(ctype.indexOf("image/") === 0) {
				el = $("<img />").attr("alt", tiddler.title).attr("src", uri);
			} else {
				el = $("<a />").attr("href", uri).text(tiddler.title);
			}
		} else {
			el = $("<pre />").text(tiddler.text);
		}
		el.appendTo(place);
	} else {
		_view.apply(this, arguments);
	}
};

// hijack edit macro to disable editing of binary tiddlers' body
var _editHandler = config.macros.edit.handler;
config.macros.edit.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	if(params[0] === "text" && plugin.isBinary(tiddler)) {
		return false;
	} else {
		_editHandler.apply(this, arguments);
	}
};

// hijack autoLinkWikiWords to ignore binary tiddlers
var _autoLink = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function() {
	return plugin.isWikiText(this) ? _autoLink.apply(this, arguments) : false;
};

}(jQuery));
//}}}
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.4|
|''Description''|Allows the rendering of svg images in a TiddlyWiki|
|''Author''|Osmosoft|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Notes''|Currently only works in modern browsers (not IE)|
|''Requires''|BinaryTiddlersPlugin|
!Usage
{{{<<image SVG>>}}} will render the text of the tiddler with title SVG as an SVG image (but not in ie where it will fail silently)
!!Parameters
width/height: specify width/height parameters
link: make the image link to a given location
tiddlyLink: link to a tiddler

!Notes
Binary tiddlers in TiddlyWeb when passed through the wikifier will be shown as images.
eg. {{{<<view text wikified>>}}} on a binary tiddler will show the image.
{{{<<view fieldname image>>}}}
will render the value of the tiddler field 'fieldname' as an image. This field can contain a tid
{{{<<image SiteIcon>>}}}
will create an image tag where the tiddler has content type beginning image and not ending +xml
will attempt to create svg object in other scenarios
{{{<<image /photos/x.jpg>>}}}
will create an image tag with src /photos/x.jpg as long as there is not a tiddler called /photos/x.jpg in 
which case it will render that tiddler as an image. Note for the case of svg files it will attempt to render as an svg if possible via the image
tag. It doesn't embed the svg in the dom for security reasons as svg code can contain javascript.
!Code
***/
//{{{
(function($) {

var macro = config.macros.image = {
	shim: "/bags/common/tiddlers/shim",
	ieVersion: config.browser.isIE ? parseInt(config.browser.ieVersion[1], 10) : false,
	svgns: "http://www.w3.org/2000/svg",
	xlinkns: "http://www.w3.org/1999/xlink", 
	svgAvailable: document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
	_fixPrefix: 1,
	_external_cache: {},
	_image_tag_cache: {},
	_image_dimensions: {},
	locale: {
		badImage: "This image cannot be displayed."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler){
		var imageSource = params[0];
		// collect named arguments
		var args = macro.getArguments(paramString, params);
		this.renderImage(place, imageSource, args);
	},
	init: function() {
		var startupImages = store.getTaggedTiddlers("systemImage");
		var place = $("<div />").attr("id", "systemImageArea").appendTo("body").hide()[0];
		for(var i = 0; i < startupImages.length; i++) {
			var image = startupImages[i];
			macro.renderImage(place, image.title, { idPrefix: "" });
		}
		var data = new Image();
		data.onload = function() {
			// note ie 8 only supports data uris up to 32k so cannot be relied on
			macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
			macro.supportsDataUris = macro.ieVersion && macro.ieVersion < 9 ? false : macro.supportsDataUris;
		};
		data.onerror = data.onload;
		data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
	},
	refreshImage: function(src) {
		var elements = macro._image_tag_cache[src] ? macro._image_tag_cache[src] : [];
		if(macro._image_dimensions[src]) {
			macro._image_dimensions[src] = false;
		}
		for(var i = 0; i < elements.length; i++) {
			var el = $(elements[i]);
			var newSrc = "%0?nocache=%1".format(src, Math.random());
			el.attr("src", newSrc); // force reload
		}
	},
	isBinaryImageType: function(contentType) {
		return (contentType && contentType.indexOf("image") === 0 &&
			contentType.indexOf("+xml") != contentType.length - 4) ? true : false;
	},
	isImageTiddler: function(tiddler) {
		return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
	},
	isSVGTiddler: function(tiddler) {
		var type = tiddler ? tiddler.fields['server.content-type'] : false;
		return type == "image/svg+xml";
	},
	isBinaryImageTiddler: function(tiddler) {
		return macro.isBinaryImageType(tiddler.fields['server.content-type']);
	},
	renderImage: function(place, imageSource, options) {
		var imageTiddler = store.getTiddler(imageSource);
		var container;
		var classes = ["image"];
		if(options.link) {
			classes = classes.concat(["imageLink", "externalLink"]);
			container = $("<a />").attr("href", options.link).appendTo(place)[0];
		} else if(options.tiddlyLink) {
			classes.push("imageLink");
			container = createTiddlyLink(place, options.tiddlyLink, false);
		} else {
			container = $("<span />").appendTo(place)[0];
		}
		$(container).addClass(classes.join(" "));

		options = options ? options : {};
		if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
			return macro._renderBinaryImageTiddler(container, imageTiddler, options);
		} else if(imageTiddler){ // handle the case where we have a tiddler
			return macro._renderSVGTiddler(container, imageTiddler, options);
		} else { // we have a string representing a url
			return macro._renderBinaryImageUrl(container, imageSource, options);
		}
	},
	_renderAlternateText: function(container, options) {
		var img;
		var src = options.src || "";
		if(options.width && options.height) {
			img = $("<img />").attr("src", src).addClass("svgImageText").attr("width", options.width).
				attr("height", options.height).appendTo(container);
		}
		var alt = options.alt;
		if(img && alt) {
			img.attr("alt", alt).attr("title", alt);
		} else if(alt) {
			$(container).addClass("svgImageText").text(alt);
		}
		macro._image_tag_cache[src] = img;
	},
	_renderSVGTiddler: function(place, tiddler, options) {
		if(!options) {
			options = {};
		}
		merge(options, { tiddler: tiddler, fix: true});

		if(macro.svgAvailable) {
			this._importSVG(place, options); // display the svg
		} else if(options.altImage) {
			var image = options.altImage;
			delete options.altImage;
			this._renderBinaryImageUrl(place, image, options);
		} else {
			this._renderAlternateText(place, options); // instead of showing the image show the alternate text.
		}
	},
	_renderBinaryImageTiddler: function(place, tiddler, options) {
		var resourceURI;
		var fields = tiddler.fields;
		if(fields["server.type"] == "tiddlyweb") { // construct an accurate url for the resource
			resourceURI = "%0/%1/tiddlers/%2".format(config.defaultCustomFields["server.host"],
				fields["server.workspace"], encodeURI(fields["server.title"]));
		} else { // guess the url for the resource
			resourceURI = tiddler.title;
		}
		var ctype = fields["server.content-type"] || tiddler.type;
		var text = tiddler.text;
		if(macro.supportsDataUris && ctype && text.indexOf("<html") == -1) {
			var uri = "data:%0;base64,%1".format(ctype, text);
			options.src = resourceURI;
			return macro._renderBinaryImageUrl(place, uri, options);
		} else if(options.src) {
			return macro._renderBinaryImageUrl(place, options.src, options);
		} else {
			return macro._renderBinaryImageUrl(place, resourceURI, options);
		}
	},
	_renderImageTag: function(container, src, width, height, options) {
		var img;
		img = $("<img />").appendTo(container);
		if(height) {
			img.attr("height", height);
		}
		if(width) {
			img.attr("width", width);
		}
		if(macro.ieVersion && macro.ieVersion < 7 && macro.shim && options.ie6png) {
			$(img).css({width: userW, height: userH,
					filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%0', sizingMethod='scale')".format(src)
				}).attr("src", macro.shim);
		} else {
			img.attr("src", src);
		}
		if(!macro._image_tag_cache[options.srcUrl]) {
			macro._image_tag_cache[options.srcUrl] = [];
		}
		img = $(img).addClass(options.imageClass)[0];
		macro._image_tag_cache[options.srcUrl].push(img);
		return img;
	},
	_getDimensions: function(realDimensions, reqDimensions, preserve) {
		var w = realDimensions.width;
		var h = realDimensions.height;
		var reqh = reqDimensions.height;
		var reqw = reqDimensions.width;
		var finalw = w, finalh = h;
		var ratiow = reqw / w, ratioh = reqh / h;
		var scaledw = ratioh * w;
		var scaledh = ratiow * h;
		if(!reqw && reqh) {
			finalw = scaledw;
			finalh = reqh;
		} else if(reqw && !reqh) {
			finalw = reqw;
			finalh = scaledh;
		} else if(reqh && reqw) {
			var preserveWidth = w > h ? true : false;
			if(preserve) {
				if(preserveWidth && scaledh < reqh) {
					finalh = scaledh;
					finalw = reqw;
				} else {
					finalh = reqh;
					finalw = scaledw;
				}
			} else {
				finalw = reqw;
				finalh = reqh;
			}
		}
		return { width: parseInt(finalw, 10), height: parseInt(finalh, 10) };
	},
	_renderBinaryImageUrl: function(container, src, options) {
		var srcUrl = options.src ? options.src : src;
		srcUrl = srcUrl.indexOf("/") === -1 ? "/%0".format(srcUrl) : srcUrl; // for IE. 
		var image_dimensions = macro._image_dimensions[srcUrl];
		var image = new Image(); // due to weird scaling issues where you use just a width or just a height
		var createImageTag = function(dimensions, error) {
			if(error) {
				var altImage = options.altImage;
				if(altImage) {
					delete options.altImage;
					macro._renderBinaryImageUrl(container, altImage, options);
				} else {
					options.src = src;
					macro._renderAlternateText(container, options);
				}
			} else {
				var dim = macro._getDimensions(dimensions, { 
					width: options.width, height: options.height }, options.preserveAspectRatio);
				options.srcUrl = srcUrl;
				macro._renderImageTag(container, src, dim.width, dim.height, options);
			}
		};

		if(!image_dimensions) {
			image.onload = function() {
				var dimensions = { width: image.width, height: image.height};
				macro._image_dimensions[srcUrl] = dimensions;
				createImageTag(dimensions);
			};
			image.onerror = function() {
				createImageTag(null, true);
			};
			image.src = src;
		} else {
			createImageTag(image_dimensions);
		}
	},
	_generateIdPrefix: function(){
		return "twsvgfix_" + (this._fixPrefix++).toString() + "_";
	},
	_fixSVG: function(childNodes, idPrefix) {
		var urlPattern = /url\(\#([^\)]*)\)*/ig;
		var fixes = [
		{ attr: "id", pattern: /^(.*)$/ig },
		{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
		];
		var url_fixes = ["filter", "fill", "mask", "stroke", "style"];
		for(var i = 0; i < url_fixes.length; i++) {
			fixes.push({ attr: url_fixes[i], pattern: urlPattern });
		}
		for(var t = 0; t < childNodes.length; t++) {
			var node = childNodes[t];
			for(var a = 0; a < fixes.length; a++) {
				var fix = fixes[a];
				var attr = fix.attr;
				var ns = fix.namespace || "";
				if(node.hasAttributeNS && node.hasAttributeNS(ns, attr)) {
					var v = node.getAttributeNS(ns, attr);
					fix.pattern.lastIndex = 0;
					var match = fix.pattern.exec(v);
					if(match) {
						// Make sure replacement string doesn't contain any single dollar signs
						var toReplace = match[1];
						if(toReplace.indexOf(idPrefix) !== 0 && toReplace.indexOf("twglobal_") !== 0) {
							var replacement = (idPrefix + toReplace).replace("$", "$$$$"); 
							v = v.replace(match[1], replacement);
						}
						node.setAttributeNS(ns, attr,v);
					}
				}
			}
			var children = node.childNodes;
			if(children.length > 0) {
				this._fixSVG(children, idPrefix);
			}
		}
	},
	_importSVG: function(place, options){
		options = options ? options : {};
		var svgDoc, tiddlerText = options.tiddler.text;
		if (window.DOMParser) {
			svgDoc = new DOMParser().parseFromString(tiddlerText, "application/xml").documentElement;
			var idPrefix = options.idPrefix || this._generateIdPrefix();
			this._fixSVG([svgDoc], idPrefix);
			var el = document.importNode(svgDoc, true);
			var svgHolder = document.createElementNS(macro.svgns,"svg");
			var width = options.width;
			var height = options.height;
			if(width || height) {
				if(width && height) { // set view box of containing svg element based on the svg viewbox and width and height.
					var viewBox = el.getAttribute("viewBox");
					var topLeft = "0 0";
					if(viewBox) {
						topLeft = viewBox.replace(/([0-9]*) +([0-9]*) +([0-9]*) +([0-9]*) */gi,"$1 $2");
					}
					svgHolder.setAttributeNS(macro.svgns, "viewBox", "0 0 %0 %1".format(width, height));
				} else {
					if(!width) {
						width = el.getAttribute("width");
					}
					if(!height) {
						height = el.getAttribute("height");
					}
				}
				svgHolder.setAttribute("width", width);
				svgHolder.setAttribute("height", height);

				el.setAttribute("width", "100%");
				el.setAttribute("height", "100%");
				svgHolder.setAttribute("class", "svgImage svgIcon %0".format(options.imageClass || ""));
				svgHolder.appendChild(el);
				place.appendChild(svgHolder);
			}
			else {
				var existing = el.className ? el.className.baseVal : "";
				el.setAttribute("class","svgImage %0".format(existing));
				place.appendChild(el);
			}
			// if a tiddler attribute is set this is read as a link
			$("[tiddler], [tiddlyLink]", place).attr("refresh", "link").click(function(ev) {
				var tiddler = $(ev.target).attr("tiddlyLink");
				if(tiddler) {
					story.displayTiddler(ev.target, tiddler);
				}
			});
		}
	},
	getArguments: function(paramString, params) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = {};
		for(var id in args) {
			if(true) {
				var p = args[id];
				if(id == "def") {
					options[id] = p;
				} else {
					options[id] = p[0];
				}
			}
		}
		var width = isNaN(params[1]) ? false : parseInt(params[1], 10);
		var height = isNaN(params[2]) ? false : parseInt(params[2], 10);

		options.width = macro.lookupArgument(options, "width", width);
		options.height = macro.lookupArgument(options, "height", height);
		options.preserveAspectRatio = args.preserveAspectRatio && 
			args.preserveAspectRatio[0] == "yes" ? true : false;
		options.tiddlyLink = macro.lookupArgument(options, "tiddlyLink", false);
		options.link = macro.lookupArgument(options, "link", false);
		return options;
	},
	lookupArgument: function(args, id, ifEmpty) {
		return args[id] ? args[id] : ifEmpty;
	}
};

// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
merge(config.macros.view.views, {
	wikified: function(value, place, params, wikifier, paramString, tiddler) {
		if(macro.isImageTiddler(tiddler) && params[0] == "text") {
			var newplace = $("<div />").addClass("wikifiedImage").appendTo(place)[0];
			macro.renderImage(newplace, tiddler.title, { alt: macro.locale.badImage });
		} else {
			_oldwikifiedview.apply(this, arguments);
		}
	},
	image: function(value, place, params, wikifier, paramString, tiddler) {
		// a field can point to another tiddler whereas text is the current tiddler.
		var title = params[0] == "text" ? tiddler.title : value;
		var args = macro.getArguments(paramString, params);
		macro.renderImage(place, title, args);
	}
});
config.shadowTiddlers.StyleSheetImageMacro = [".wikifiedImage svg, .wikifiedImage .image { width: 80%; }",
	".svgImageText { background-color:[[ColorPalette::Error]]; color:#ddd; display: inline-block; }",
	"span.svgImageText { display: inline-block; overflow: hidden; }"
].join("");
store.addNotification("StyleSheetImageMacro", refreshStyles);

})(jQuery);
//}}}
Andy Unrein is a father, lifelong reader and student living in Western Nebraska.  He has been researching his family history since he was about ten years old.

Andy networks on Ancestry.com and shares his research via the public tree ''SMEA'', tracing all ancestral lines from his children [[Sara]], who turns 6 this spring, and a son [[Evan]] who is 4.

An [[Outline|Genealogical Outline]] of Andy's research can be found [[here→|Genealogical Outline]]

He can be reached by email via [[andyunrein@gmail.com|mailto:andyunrein@gmail.com]].
/*{{{*/
Background:#FFF
Foreground:#333
PrimaryPale:#999
PrimaryLight:#777
PrimaryMid:#111
PrimaryDark:#000
SecondaryPale:#DDF
SecondaryLight:#CDF
SecondaryMid:#9AF
SecondaryDark:#05A
TertiaryPale:#EEE
TertiaryLight:#CCC
TertiaryMid:#999
TertiaryDark:#333
Error:#F88

PageBackground:#F9F9F9
Dim:#FDFDFF
/*}}}*/
Unless you're delighted with the default theme you can make some quick changes by generating a new random color palette, hit this button to cycle through some alternatives.

<<RandomColorPaletteButton saturation_pale:0.67 saturation_light:0.53
saturation_mid:0.43 saturation_dark:0.06 pale:0.99 light:0.85 mid:0.5 dark:0.31>>

You can also change the look and feel completely by installing a new theme. To do this, find one you like in the @themes space, note down the name, and include it in this space by going to the space menu. You can reach the space menu by clicking on the blue and pink circle at the top-right of the page and chooshing "THIS SPACE". Here are a few to check out:
* @pip
* @caspian-ii
* @basalt
* @simplicity
* @cheesecake
* @jelly-doughnut

(//Note that if you are using a custom TiddlySpace install, these themes may not be present.//)
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.2a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}

Warning: the showWhen and hideWhen macros will blindly eval paramString.
This could be used to execute harmful javascript from a tiddler.

(TODO: Make some effort to sanitize paramString. Perhaps disallow the equals sign?)
***/
//{{{

window.hideWhenLastTest = false;

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

merge(config.macros,{

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

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

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

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

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

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

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

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

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

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

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

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

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

});

//}}}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   version="1.1"
   width="14pt"
   height="14pt"
   viewBox="918 510 14 14"
   id="svg3070">
  <metadata
     id="metadata3089">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs3072">
    <radialGradient
       cx="0"
       cy="0"
       r="1"
       id="Gradient"
       gradientUnits="userSpaceOnUse">
      <stop
         id="stop3075"
         style="stop-color:#ffffff;stop-opacity:1"
         offset="0" />
      <stop
         id="stop3077"
         style="stop-color:#2b2b2b;stop-opacity:1"
         offset="1" />
    </radialGradient>
    <radialGradient
       id="Obj_Gradient"
       xlink:href="#Gradient"
       gradientTransform="matrix(11.473944,0,0,11.473944,922.3752,513.7837)" />
  </defs>
  <g
     id="g3080"
     style="fill:none;stroke:none">
    <g
       id="g3082">
      <path
         d="m 929.6952,512.9018 c -2.5384,-2.53843 -6.654,-2.53843 -9.1924,0 -2.5384,2.5384 -2.5384,6.654 0,9.19238 2.5384,2.53839 6.654,2.53839 9.1924,0 2.5384,-2.53838 2.5384,-6.65398 0,-9.19238 m -4.5962,2.8407 2.07733,-2.07734 1.75547,1.75549 -2.0773,2.07735 2.0773,2.07732 -1.75547,1.75548 -2.07733,-2.07732 -2.07733,2.07732 -1.75547,-1.75548 2.0773,-2.07732 -2.0773,-2.07735 1.75547,-1.75549 z"
         id="path3084"
         style="fill:url(#Obj_Gradient)" />
      <path
         d="m 927.61447,515.38354 a 4.51205,4.2590378 0 1 1 -9.0241,0 4.51205,4.2590378 0 1 1 9.0241,0 z"
         transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
         id="path2394"
         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
    </g>
  </g>
</svg>
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
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="lG3826" x1="7.0996" gradientUnits="userSpaceOnUse" y1="18.829" gradientTransform="matrix(1.5858347,0,0,1.8078238,1098.1851,351.13716)" x2="1.5461" y2="-0.95166"><stop stop-color="#000" offset="0"/><stop stop-color="#9c9b99" offset="1"/></linearGradient><linearGradient id="lG3828" y2="372.44" gradientUnits="userSpaceOnUse" y1="375.7" x2="1111.7" x1="1097.7"><stop style="stop-color:#ac9393;" offset="0"/><stop style="stop-color:#c8b7b7;" offset="1"/></linearGradient></defs><g transform="translate(-1080.9375,-357.3329)"><path style="stroke-width:0;stroke-miterlimit:4;fill:url(#lG3826);" d="m1080.9,357.32,39.996-0.0426-0.01,40.008c-15.507-25.519-15.36-25.95-39.988-39.965z"/><path style="stroke-dashoffset:0;stroke:#7aa3be;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.49999988;fill:#c1e6fd;" d="m1091.9,363.55c6.5716-6.4925,16.576-7.3925,23.147-0.90003,6.5717,6.4925,6.5717,17.019,0,23.511-4.4424-8.6113-12.288-15.713-23.147-22.611z"/><path style="stroke-dashoffset:0;stroke:#ce81b0;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.5;fill:#f4c4e2;" d="m1110.2,367.62c3.217,3.2168,3.217,8.4323,0,11.649-3.8194-4.2357-8.3307-8.1824-11.649-11.649,3.217-3.2168,8.4325-3.2168,11.649-0.00002z"/><path style="stroke-linejoin:bevel;stroke:#000000;stroke-linecap:round;stroke-dasharray:none;stroke-miterlimit:4;stroke-width:0.80000001;fill:url(#lG3828);" d="m1081,357.34c18.79,6.4752,32.53,16.56,39.894,39.892-11.19-17.028-14.878-19.19-27.352-14.96,6.2984-12.098,3.9371-13.19-12.542-24.932z"/></g></svg>
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.3|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/RevisionsCommandPlugin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/plugins/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.2 (2010-03-04)
* suppressed wikification in diff view
!!v0.3 (2010-04-07)
* restored wikification in diff view
* added link to side-by-side diff view
!To Do
* strip server.* fields from revision tiddlers
* resolve naming conflicts
* i18n, l10n
* code sanitizing
* documentation
!Code
***/
//{{{
(function($) {

jQuery.twStylesheet(".diff { white-space: pre, font-family: monospace }",
	{ id: "diff" });

var cmd = config.commands.revisions = {
	type: "popup",
	hideShadow: true,
	text: "revisions",
	tooltip: "display tiddler revisions",
	revTooltip: "", // TODO: populate dynamically?
	loadLabel: "loading...",
	loadTooltip: "loading revision list",
	selectLabel: "select",
	selectTooltip: "select revision for comparison",
	selectedLabel: "selected",
	compareLabel: "compare",
	linkLabel: "side-by-side view",
	revSuffix: " [rev. #%0]",
	diffSuffix: " [diff: #%0 #%1]",
	dateFormat: "YYYY-0MM-0DD 0hh:0mm",
	listError: "revisions could not be retrieved",

	handlePopup: function(popup, title) {
		title = this.stripSuffix("rev", title);
		title = this.stripSuffix("diff", title);
		var tiddler = store.getTiddler(title);
		var type = _getField("server.type", tiddler);
		var adaptor = new config.adaptors[type]();
		var limit = null; // TODO: customizable
		var context = {
			host: _getField("server.host", tiddler),
			workspace: _getField("server.workspace", tiddler)
		};
		var loading = createTiddlyButton(popup, cmd.loadLabel, cmd.loadTooltip);
		var params = { popup: popup, loading: loading, origin: title };
		adaptor.getTiddlerRevisionList(title, limit, context, params, this.displayRevisions);
	},

	displayRevisions: function(context, userParams) {
		removeNode(userParams.loading);
		if(context.status) {
			var callback = function(ev) {
				var e = ev || window.event;
				var revision = resolveTarget(e).getAttribute("revision");
				context.adaptor.getTiddlerRevision(tiddler.title, revision, context,
					userParams, cmd.displayTiddlerRevision);
			};
			var table = createTiddlyElement(userParams.popup, "table");
			for(var i = 0; i < context.revisions.length; i++) {
				var tiddler = context.revisions[i];
				var row = createTiddlyElement(table, "tr");
				var timestamp = tiddler.modified.formatString(cmd.dateFormat);
				var revision = tiddler.fields["server.page.revision"];
				var cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, timestamp, cmd.revTooltip, callback, null,
					null, null, { revision: revision });
				cell = createTiddlyElement(row, "td", null, null, tiddler.modifier);
				cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, cmd.selectLabel, cmd.selectTooltip,
					cmd.revisionSelected, null, null, null,
					{ index:i, revision: revision, col: 2 });
				cmd.context = context; // XXX: unsafe (singleton)!?
			}
		} else {
			$("<li />").text(cmd.listError).appendTo(userParams.popup);
		}
	},

	revisionSelected: function(ev) {
		var e = ev || window.event;
		e.cancelBubble = true;
		if(e.stopPropagation) {
			e.stopPropagation();
		}
		var n = resolveTarget(e);
		var index = n.getAttribute("index");
		var col = n.getAttribute("col");
		while(!index || !col) {
			n = n.parentNode;
			index = n.getAttribute("index");
			col = n.getAttribute("col");
		}
		cmd.revision = n.getAttribute("revision");
		var table = n.parentNode.parentNode.parentNode;
		var rows = table.childNodes;
		for(var i = 0; i < rows.length; i++) {
			var c = rows[i].childNodes[col].firstChild;
			if(i == index) {
				if(c.textContent) {
					c.textContent = cmd.selectedLabel;
				} else {
					c.text = cmd.selectedLabel;
				}
			} else {
				if(c.textContent) {
					c.textContent = cmd.compareLabel;
				} else {
					c.text = cmd.compareLabel;
				}
				c.onclick = cmd.compareSelected;
			}
		}
	},

	compareSelected: function(ev) {
		var e = ev || window.event;
		var n = resolveTarget(e);
		var context = cmd.context;
		context.rev1 = n.getAttribute("revision");
		context.rev2 = cmd.revision;
		context.tiddler = context.revisions[n.getAttribute("index")];
		context.format = "unified";
		context.adaptor.getTiddlerDiff(context.tiddler.title, context,
			context.userParams, cmd.displayTiddlerDiffs);
	},

	displayTiddlerDiffs: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.diffSuffix.format([context.rev1, context.rev2]);
		tiddler.text = "{{diff{\n" + context.diff + "\n}}}";
		tiddler.tags = ["diff"];
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		var tiddlerEl = story.displayTiddler(src, tiddler);
		var uri = context.uri.replace("format=unified", "format=horizontal");
		var link = $('<a target="_blank" />').attr("href", uri).text(cmd.linkLabel);
		$(".viewer", tiddlerEl).prepend(link);
	},

	displayTiddlerRevision: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.revSuffix.format([tiddler.fields["server.page.revision"]]);
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		story.displayTiddler(src, tiddler);
	},

	stripSuffix: function(type, title) {
		var str = cmd[type + "Suffix"];
		var i = str.indexOf("%0");
		i = title.indexOf(str.substr(0, i));
		if(i != -1) {
			title = title.substr(0, i);
		}
		return title;
	}
};

var _getField = function(name, tiddler) {
	return tiddler.fields[name] || config.defaultCustomFields[name];
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="506 234 68 36" width="30" height="30"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-09-16 14:51Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.3 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><rect width="1118" height="783"/><g><path d="M 538.68195 244.31807 C 540.43927 246.07547 540.43927 248.9247 538.68195 250.68204 C 536.92456 252.4394 534.07532 252.4394 532.318 250.68204 C 530.5606 248.9247 530.5606 246.07547 532.318 244.31807 C 534.07532 242.56075 536.92456 242.56075 538.68195 244.31807 M 511.12607 257.99356 C 511.26108 258.13019 511.39728 258.26608 511.53473 258.40121 C 527.2556 273.86606 552.74414 273.86606 568.46515 258.40121 C 568.60248 258.26617 568.73853 258.13037 568.87354 257.9938 C 568.8736 257.99374 568.8736 257.99371 568.8736 257.99362 C 568.87366 257.99371 568.87366 257.9938 568.87372 257.9939 C 570.72504 256.12051 572.35046 254.11153 573.74994 252 C 573.74994 251.99997 573.74994 251.99994 573.74994 251.99992 C 572.35046 249.8884 570.72504 247.87938 568.87372 246.00606 C 568.87366 246.00613 568.87366 246.00621 568.8736 246.00627 C 568.73865 245.86966 568.60254 245.73383 568.46515 245.5987 C 552.74414 230.13387 527.2556 230.13387 511.53473 245.5987 C 511.39728 245.73383 511.26108 245.86974 511.12613 246.00635 C 511.126 246.00624 511.126 246.00616 511.12595 246.00606 C 509.2748 247.87938 507.64954 249.88837 506.24994 251.9998 L 506.24994 251.99983 C 506.24994 251.9999 506.25 251.99992 506.25 251.99997 C 506.25 252 506.24994 252.00005 506.24994 252.00009 L 506.24994 252.00012 C 507.64954 254.11157 509.2748 256.12051 511.12595 257.9939 C 511.126 257.99377 511.126 257.99365 511.12607 257.99359 Z M 515.44916 252 C 515.8548 251.55469 516.27502 251.11778 516.71014 250.68985 C 522.16632 245.32257 529.06055 242.23206 536.17273 241.41824 C 534.6662 241.96199 533.2525 242.83762 532.04498 244.04512 C 527.65155 248.43852 527.65155 255.56163 532.04498 259.95502 C 533.2522 261.16226 534.6656 262.03778 536.17175 262.58154 C 529.05988 261.76761 522.16608 258.6771 516.71014 253.31009 C 516.2751 252.88219 515.85486 252.44528 515.44922 252 Z M 564.55054 251.99995 C 564.14502 252.44525 563.7248 252.88217 563.28973 253.31009 C 557.83368 258.67712 550.93988 261.76764 543.828 262.58157 C 545.33423 262.03781 546.74756 261.1623 547.9549 259.95502 C 552.34833 255.56163 552.34833 248.43852 547.9549 244.04512 C 546.74744 242.83765 545.33374 241.96202 543.82715 241.41824 C 550.9394 242.23206 557.83356 245.3226 563.28973 250.68985 C 563.7248 251.11775 564.14502 251.55467 564.55054 251.99995 Z M 568.8736 257.99362 C 570.7249 256.12033 572.35028 254.11139 573.74988 252.00002" fill="black" class="glyph"/></g></g></svg>
There are a lot of interesting people using ~TiddlySpace that you might like to keep track of and interact with. There are a number of ways of doing this.

If you see a number in the speech bubble in one of your tiddlers, it means that someone is writing about the same thing as you. You can find out what they're saying by clicking on it. Likewise, if you see something interesting in someone else's space, you can respond to it and write up your own thoughts on the subject by clicking "Reply to this tiddler".

Additionally, if you find anyone interesting, or you find an interesting looking space and you'd like to know when it's changed, you can "follow" that space. To do this, simply create a tiddler with the title: {{{@space-name}}} and tag it {{{follow}}}. If you want, you can store some notes about that space in the body of the tiddler.

If you then want to know what happening, simply [[include|How do I include/exclude spaces?]]@docs the @tivity space and then visit your activity stream at [[/activity|/activity]], or just visit the @tapas space directly.

!Not sure who to follow?
Here's a few suggestions:
* @fnd
* @cdent
* @pmario
* @bengillies
* @dickon
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.7.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin ErrorHandler|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
Tag a tiddler with "follow" to express a list of followers.
Using the {{{<<followTiddlers X>>}}}
will reveal the number of tiddlers with name X in the set of spaces the *current* user viewing your space follows.
{{{<<following jon>>}}} will list all the users following Jon.
{{{<<followers jon>>}}} will list all the followers of jon.
{{{<linkedTiddlers>>}}} will list all tiddlers across TiddlySpace linked to the current tiddler
{{{<linkedTiddlers follow:yes>>}}} will list all tiddlers across TiddlySpace that come from your list of followers
adds spaceLink view type {{{<<view server.bag spaceLink>>}}} creates a link to the space described in server.bag
{{{<<view server.bag spaceLink title>>}}} makes a link to the tiddler with title expressed in the field title in space server.bag
If no name is given eg. {{{<<following>>}}} or {{{<<follow>>}}} it will default the current user.
!StyleSheet
.followTiddlersList li {
	list-style:none;
}

.followButton {
	width: 2em;
}

.followTiddlersList li .siteIcon {
	height:48px;
	width: 48px;
}

#sidebarTabs .followers li a,
.followers .siteIcon,
.followers .siteIcon div {
	display: inline;
}

.followTiddlersList li .externalImage, .followTiddlersList li .image {
	display: inline;
}

.scanResults li {
	list-style: none;
}
!Code
***/
//{{{
(function($) {
var LIMIT_FOLLOWING = 100;

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;

var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is the default template used in the display of tiddlers founding using the tsScan macro. To access attributes use the view macro e.g. {{{<<view title text>>}}}";
shadows.ScanTemplate = "<<view modifier SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title link>>";
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>>";
shadows.FollowTiddlersBlackList = "";
shadows.FollowTiddlersHeading = "There are tiddlers in spaces you follow using the follow tag which use the title <<view title text>>";
shadows.FollowTiddlersTemplate = ["* <<view server.space SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
	"<<view server.space spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
	"in the <<view server.space spaceLink>> space (<<view modified date>> @ <<view modified date 0hh:0mm>>).\n"].join("");

var name = "StyleSheetFollowing";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);

// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var adaptor = store.getTiddlers()[0].getAdaptor();
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var tiddler = new Tiddler(localTitle);
	tiddler.text = "Please wait while this tiddler is retrieved...";
	tiddler.fields.doNotSave = "true";
	store.addTiddler(tiddler);
	src = story.displayTiddler(src || null, tiddler.title);
	tweb.getStatus(function(status) {
		var context = {
			host: tweb.host, // TODO: inherit from source tiddler?
			workspace: workspace,
			headers: { "X-ControlView": "false" }
		};
		var getCallback = function(context, userParams) {
			var tiddler = context.tiddler;
			tiddler.title = localTitle;
			store.addTiddler(tiddler);
			story.refreshTiddler(localTitle, null, true); // overriding existing allows updating
			if(callback) {
				callback(src, tiddler);
			}
		};
		adaptor.getTiddler(title, context, null, getCallback);
	});
};

tiddlyspace.scroller = {
	runHandler: function(title, top, bottom, height) {
		var i;
		var handlers = tiddlyspace.scroller.handlers;
		var tidEl = story.getTiddler(title);
		if(tidEl) {
			var topEl = $(tidEl).offset().top + 20;
			if(top === false || (topEl > top && topEl < bottom)) {
				var h = handlers[title];
				for(i = 0; i < h.length; i++) {
					h[i]();
				}
				tiddlyspace.scroller.clearHandlers(title);
			}
		} else {
			tiddlyspace.scroller.clearHandlers(title);
		}
	},
	clearHandlers: function(title) {
		tiddlyspace.scroller.handlers[title] = [];
	},
	registerIsVisibleEvent: function(title, handler) {
		tiddlyspace.scroller.handlers[title] = tiddlyspace.scroller.handlers[title] || [];
		tiddlyspace.scroller.handlers[title].push(handler);
	},
	init: function() {
		this.handlers = {};
		this.interval = window.setInterval(function() {
			var top = $(window).scrollTop();
			var height = $(window).height();
			var bottom = top + height;
			var title;
			for(title in tiddlyspace.scroller.handlers) {
				if(title) {
					tiddlyspace.scroller.runHandler(title, top, bottom, height);
				}
			}
		}, 2000); // every 2 seconds check scroll position
	}
};
tiddlyspace.scroller.init();

var followMacro = config.macros.followTiddlers = {
	locale: {
		followListHeader: "Here are tiddlers from spaces you follow using the follow tag which use this title.",
		noTiddlersFromFollowers: "None of the spaces you follow contain a tiddler with this name.",
		errorMessage: "There was a problem retrieving tiddlers from the server. Please try again later."
	},
	init: function() {
		followMacro.lookup = {};
	},
	followTag: "follow",
	getHosts: function(callback) {
		tweb.getStatus(function(status) {
			callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
		});
	},
	getBlacklist: function() {
		return store.getTiddlerText("FollowTiddlersBlackList").split("\n");
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		var title = (args.anon && args.anon[0]) || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var user = params[1] || false;
		if(tid) {
			followMacro.makeButton(place, {
				url: "/search?q=title:%22" + encodeURIComponent(title) + "%22",
				containingTiddler: containingTiddler,
				blacklisted: followMacro.getBlacklist(), title: title, user: user,
				consultFollowRelationship: (args.follow &&
					args.follow[0] === 'false') ? false : true });
		}
	},
	makeButton: function(place, options) { // this is essentially the same code in TiddlySpaceFollowingPlugin
		var title = options.title;
		var blacklisted = options.blacklisted;
		var tiddler = store.getTiddler(title);
		var btn = $('<div class="followButton" />').addClass("notLoaded").appendTo(place)[0];
		if(blacklisted.contains(title)) {
			$(btn).remove();
			return;
		} else {
			var user = options.user;
			window.setTimeout(function() { // prevent multiple calls due to refresh
				tiddlyspace.scroller.registerIsVisibleEvent(options.containingTiddler, function() {
					var mkButton = function(followers, ignore) {
						if(!followers && !ignore) {
							$(btn).remove();
						} else {
							$("<a />").appendTo(btn);
							var scanOptions = { url: options.url,
								spaceField: options.spaceField || "bag", template: null, sort: "-modified",
								callback: function(tiddlers) {
									$(btn).removeClass("notLoaded");
									followMacro.constructInterface(btn, tiddlers);
								}
							};
							if(!ignore) {
								scanOptions.showBags = followMacro._getFollowerBags(followers);
							}
							scanOptions.hideBags = [tiddler.fields["server.bag"]];
							scanMacro.scan(null, scanOptions, user);
						}
					};
					if(options.consultFollowRelationship) {
						followMacro.getFollowers(mkButton);
					} else {
						mkButton([], true);
					}
				});
			}, 1000);
		}
	},
	constructInterface: function(container, tiddlers) {
		var txt = tiddlers.length;
		var className = txt > 0 ? "hasReplies" : "noReplies";
		var el = $(story.findContainingTiddler(container));
		$(container).empty().addClass(className);
		var btn = $("<a />").addClass("followedTiddlers").text(txt).
			click(function(ev) {
				followMacro.followingOnClick(ev);
			}).appendTo('<div class="followedTiddlers" />').appendTo(container)[0];
		$.data(btn, "tiddlers", tiddlers);
	},
	followingOnClick: function(ev) {
		var target = ev.target;
		var locale = followMacro.locale;
		var el = $('<div class="followTiddlersList" />')[0];
		var popup = Popup.create(target,"div");
		$(popup).addClass("taggedTiddlerList followList").click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
			if(ev.target.parentNode != document) {
				ev.stopPropagation();
			}
		}).append(el);
		var tiddlers = $.data(target, "tiddlers") || [];
		scanMacro.template(el, tiddlers.slice(0,1), "FollowTiddlersHeading");
		scanMacro.template(el, tiddlers, "FollowTiddlersTemplate");
		if(tiddlers.length === 0) {
			$("<li />").text(locale.noTiddlersFromFollowers).appendTo(el);
		}
		Popup.show();
		ev.stopPropagation();
		return popup;
	},
	_getFollowerBags: function(followers) { // XXX: private or not?
		return $.map(followers, function(name, i) {
			return name != currentSpace ? "%0_public".format(name) : null;
		});
	},
	getFollowers: function(callback, username) {
		// returns a list of spaces being followed by the existing space
		var followersCallback = function(user) {
			if(!user.anon) {
				scanMacro.scan(null, { 
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title", template: null, cache: true,
					callback: function(tiddlers) {
						var followers = [];
						for(var i = 0; i < tiddlers.length; i++) {
							followers.push(tiddlyspace.resolveSpaceName(tiddlers[i].title));
						}
						callback(followers);
					}
				});
			} else {
				callback(false);
			}
		};
		return !username ? tweb.getUserInfo(followersCallback) : followersCallback({ name: username });
	}
};

var scanMacro = config.macros.tsScan = {
	init: function () {
		this.scanned = {};
	},
	_tiddlerfy: function(jsontiddlers, options) {
		var tiddlers = [];
		var spaceField = options.spaceField || "bag"; // TODO: phase out use view types instead
		$.each(jsontiddlers, function(i, t) {
			var use = false;
			if(!options.showBags || (options.showBags && options.showBags.contains(t.bag))) {
				use = true;
			}
			if(options.hideBags && options.hideBags.contains(t.bag)) {
				use = false;
			}
			if(use) {
				var spaceName = t[spaceField];
				var tiddler = config.adaptors.tiddlyweb.toTiddler(t, tweb.host);
				tiddler.fields["server.space"] = tiddlyspace.resolveSpaceName(spaceName);
				tiddlers.push(tiddler);
			}
		});
		return tiddlers;
	},
	_scanCallback: function(place, jsontiddlers, options) {
		var locale = followersMacro.locale;
		var tiddlers = scanMacro._tiddlerfy(jsontiddlers, options);
		
		if(options.sort) {
			tiddlers = store.sortTiddlers(tiddlers, options.sort);
		}
		if(options.filter) {
			var _store = new TiddlyWiki();
			config.lastStore = _store;
			for(var i = 0; i < tiddlers.length; i++) {
				var clone = tiddlers[i];
				clone.title = tiddlyspace.getLocalTitle(clone.title, clone.fields['server.workspace']);
				_store.addTiddler(clone);
			}
			tiddlers = _store.filterTiddlers(options.filter);
		}
		if(place) {
			$(place).empty();
			var list = $("<ul />").appendTo(place)[0];
			scanMacro.template(list, tiddlers, options.template);
			if(tiddlers.length === 0) {
				$("<li />").text(options.emptyMessage || locale.noone).appendTo(list);
				$(list).addClass("emptyList");
			}
		}
		if(options.callback) {
			options.callback(tiddlers);
		}
	},
	constructSearchUrl: function(host, options) {
		if(options.url) {
			return options.url;
		}
		var inputs = options.searchValues;
		var tag = options.tag;
		var searchField = options.searchField || "title";
		var searchQuery = [];
		for(var i = 0; i < inputs.length; i++) {
			searchQuery.push('%0:"%1"'.format(searchField, inputs[i]));
		}
		var query = searchQuery.join(" OR ");
		query = tag ? "(%0) AND tag:%1".format(query, tag) : query;
		query = options.query ? "%0;%1;".format(query, options.query) : query;
		query = options.fat ? "%0&fat=1".format(query) : query;
		return '%0/search?q=%1'.format(host, query);
	},
	scan: function(place, options) { // TODO: make use of list macro with url filter
		var locale = followersMacro.locale;
		options.template = options.template ? options.template : "ScanTemplate";
		followMacro.getHosts(function(host, tsHost) {
			$(place).text(followersMacro.locale.pleaseWait);
			options = options ? options: {};
			var url = scanMacro.constructSearchUrl(host, options);
			if(options.cache && scanMacro.scanned[url]) {
				var tiddlers = scanMacro.scanned[url].tiddlers;
				var run = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(tiddlers) {
					run(tiddlers);
				} else {
					scanMacro.scanned[url].callbacks.push(run);
				}
			} else {
				var callback = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(scanMacro.scanned[url] && scanMacro.scanned[url].callbacks) {
					scanMacro.scanned[url].callbacks.push(callback);
				} else {
					scanMacro.scanned[url] = {
						callbacks: [callback]
					};
				}
				ajaxReq({
					url: url,
					dataType: "json",
					success: function(tiddlers) {
						scanMacro.scanned[url].tiddlers = tiddlers;
						var callbacks = scanMacro.scanned[url].callbacks;
						while(callbacks.length > 0) {
							callbacks.pop()(tiddlers);
						}
					},
					error: function(xhr) {
						$(place).empty();
						$("<span />").addClass("annotation error").text(locale.error.format(xhr.status)).appendTo(place);
					}
				});
			}
		});
	},
	template: function(place, tiddlers, template) { // TODO: make use of list macro.
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var item = $('<li class="spaceName" />').appendTo(place)[0];
			var spaceName = tiddler.fields["server.space"] || "";
			var templateText = store.getTiddlerText(template).replace(/\$1/mg, spaceName);
			wikify(templateText, item, null, tiddler);
		}
	},
	getOptions: function(paramString, tiddler) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { query: false, sort: false, tag: false, template: false, showBags: args.show || false,
			hideBags: args.hide || false, filter: false, spaceField: "bag", searchField: "title", fat: false,
			emptyMessage: false };
		for(var name in args) {
			if(name != "name") {
				if(name == "fat") {
					options[name] = true;
				} else {
					options[name] = args[name][0];
				}
			}
		}
		// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
		var searchField = options.searchField;
		var searchValues = args[searchField] ? args[searchField] : args.searchValues;
		// if neither of those were used use the first parameter
		var defaultValues = tiddler ? [ tiddler.title ] : [];
		options.searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
		return options;
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").addClass("scanResults resultsArea").appendTo(place)[0];
		var options = scanMacro.getOptions(paramString, tiddler);
		scanMacro.scan(container, options);
	}
};

var followersMacro = config.macros.followers = {
	locale: {
		loggedOut: "Please login to see the list of followers",
		noSupport: "We were unable to retrieve followers as your browser does not support following.",
		pleaseWait: "Please wait while we look this up...",
		error: "Error %0 occurred whilst retrieving data from server",
		noone: "None."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followersMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="followers" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followersCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=title:@%0 OR title:%0 tag:%1 _limit:%2".
						format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "bag",
					template: options.template ? options.template : "FollowersTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followersCallback({ name: currentSpace }) : followersCallback({ name: username });
	}
};

var followingMacro = config.macros.following = {
	locale: {
		pleaseWait: followersMacro.locale.pleaseWait,
		loggedOut: "Please login to see who you are following",
		noSupport: followersMacro.locale.noSupport,
		error: followersMacro.locale.error,
		noone: followersMacro.locale.noone
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followingMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var fat = args.fat ? true : false;
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="following" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followingCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title",
					template: options.template ? options.template : "FollowingTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followingCallback({ name: currentSpace }) : followingCallback({ name: username });
	}
};

var linkedMacro = config.macros.linkedTiddlers = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		if(tid) {
			followMacro.makeButton(place, {
				spaceField: "recipe",
				url: "/bags/%0/tiddlers/%1/backlinks".format(tid.fields['server.bag'],
					encodeURIComponent(tid.title)),
				blacklisted: followMacro.getBlacklist(),
				title: title,
				containingTiddler: containingTiddler,
				user: params[1] || false,
				consultFollowRelationship: args.follow ? true : false });
		}
	}
};

if(config.options.chkFollowTiddlersIsLinkedTiddlers) {
	merge(config.macros.followTiddlers, config.macros.linkedTiddlers);
	config.shadowTiddlers.FollowTiddlersHeading = "These are the other tiddlers that link to this tiddler.";
}

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="78 222 60 60" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 107.92718 244.14815 L 86.651474 222.89253 L 78.85206 230.69925 L 100.120415 251.9476 L 78.774 273.27396 
		L 86.57342 281.08075 L 107.927216 259.74707 L 129.39981 281.19946 L 137.19922 273.39267 L 115.73397 251.94763 
		L 137.121155 230.58054 L 129.32175 222.77374 Z" fill="grey" class="glyph"/>
	</g>
</g>
</svg>
/*{{{*/
body {
	font-size: 1em;
	font-family: helvetica, arial, sans-serif;
	background-color: #fff;
	color: [[ColorPalette::Foreground]];
}

body ul { margin: 0; }

#popup {
	background-color: [[ColorPalette::TertiaryPale]];
}

#popup.confirmationPopup, .followList {
	font-size: 0.8em;
	padding: 1em;
	border: solid 1px [[ColorPalette::SecondaryMid]];
	background-color: [[ColorPalette::SecondaryPale]];
}

.followList .listTitle {
	text-decoration: underline;
}

#popup .followTiddlersList a {
	display: inline;
	padding: 0;
}

#popup li a {
	color: [[ColorPalette::PrimaryMid]];
	font-weight: bold;
}

#popup li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

#popup li.listTitle {
	border-bottom: 1px solid #000;
	font-weight: bold;
	margin-bottom: 10px;
}

#popup.followList {
	margin-left: 50px;
	margin-top: -30px;
}

.followTiddlersList .label {
	display: block;
	left: 10px;
	top: 0px;
	line-height: 16px;
	position: relative;
}

#popup .followTiddlersList .siteIcon{
	height: auto;
}

#popup .followTiddlersList li{
	clear: both;
	display: block;
	height: 48px;
	margin-bottom: 8px;
	position: relative;
}

#popup .followTiddlersList a{
	display: inline;
}

#displayArea {
	margin: 0;
	top: 0px;
	left: 0px;
	width: 100%;
	position: relative;
}

.revisionCloak {
	position: absolute;
	position: fixed !important;
	height: 100%;
	width: 100%;
	top: 0;
	left: 0;
	border: 0;
	margin: 0;
	padding: 0;
	opacity: 0.5;
	filter: alpha(opacity=50);
	background-color: #000;
}

/* *** Header *** */
.header {
	position: relative;
	background-color: [[ColorPalette::PrimaryMid]];
	_width: 100%; /* ie 6 demands */
}

.headerForeground {
	background-color: [[ColorPalette::PrimaryMid]];
	float: left;
	margin: 24px 16px 0px 72px;
	padding: 0;
	position: relative;
	top: 0;
	_width: 70%; /*ie6: needed for the background to actually be transparent*/
	_background-color: transparent; /*ie6: needed to show the search box*/
}

.clearFloat {
	clear: both;
}

#contentWrapper {
	position: relative;
	padding-top: 1px;
	top: -1px;
}

#tiddlerDisplay {
	_position: relative; /* ie 6*/
}

.siteTitle {
	clear: both;
	display: block;
	font-size: 32px;
	font-weight: bold;
	line-height: 32px;
}

.siteSubtitle {
	display: block;
	font-size: 14px;
	height: 16px;
	margin-bottom: 8px;
}

#sidebarSearch {
	padding: 0;
	position: absolute;
	right: 80px;
	top: 8px;
	width: 176px;
}

#sidebarSearch .txtOptionInput {
	width: 100%;
	margin-top: 5px;
	_color: #bbb; /* ie6 danger */
}

#sidebarSearch .txtOptionInput:focus {
	color: #000;
}

#sidebarSearch .searchButton {
	display: none;
}

/* *** Menu Bar *** */

#mainMenu {
	position: static;
	text-align: left;
	margin-left: 72px;
	float: left;
	width: auto;
	padding: 0;
	font-size: 1em;
	line-height: normal;
}

#mainMenu a {
	color: #fff;
	padding: 8px;
	font-size: 0.9em;
	margin-right: 16px;
}

#mainMenu a:hover {
	background-color: [[ColorPalette::PrimaryMid]];
	color: [[ColorPalette::Background]]
}

#sidebarOptions {
	margin-right: 72px;
	float: right;
	font-size: 1.1em;
	line-height: 1.6em;
	min-height: 1em;
	padding-top: 0;
}

#sidebarOptions a {
	margin-right: 8px;
}

.confirmationPopup .button,
#sidebarOptions .button {
	cursor: pointer;
	line-height: 1.4em;
	text-align: center;
	margin-right: 8px;
	margin-left:-2px;
}

.confirmationPopup .button {
	font-size: 0.9em;
	padding: 2px;
}

#sidebarOptions .button {
	font-size: 0.7em;
	float: left;
	width: 80px;
	padding: 0px;
        color: #fff;
}

.confirmationPopup a.button,
#sidebarOptions a {
	border: none;
	margin: 0 0.2em;
	padding: 0.6em 0.25em;
	display: inline;
	color: #666;
}

.confirmationPopup a.button:hover,
#sidebarOptions a:hover {
	color: #000;
}

.confirmationPopup a.button:active,
#sidebarOptions a:active {
	border: solid 1px [[ColorPalette::PrimaryMid]];
	background-color: #fff;
	background: -webkit-gradient( linear, left bottom, left top, color-stop(0.1,rgb(200,200,200)), color-stop(1, rgb(100,100,100)));
	background: -moz-linear-gradient(center bottom , rgb(200,200,200) 10%,rgb(100,100,100) 100%) repeat scroll 0 0 transparent;
}
/* *** Sidebar *** */

#sidebar .wizard table {
	margin: 0px;
}

.tabContents .listTitle:first-child {
	margin-top: 0px;
}

#menuBar {
	background: [[ColorPalette::PrimaryLight]];
	left: 0;
	right: 0;
	position: relative;
	margin: 0;
	padding: 0.5em 0 0.5em 0;
	min-height: 1em;
	overflow: hidden;
	_width: 100%; /* for ie 6 */
}

#sidebarOptions a.button:hover {
	color: [[ColorPalette::PrimaryPale]];
    background: [[ColorPalette::PrimaryMid]];
}

#tiddlerDisplay, #searchResults {
	margin: 16px 448px 0 72px;
}

#sidebarTabs {
	position: absolute;
	right: 72px;
	width: 352px;
	top: 0;
}

#sidebarTabs .tabsetWrapper .tabset {
	width: 87px;
	border-top: 1px solid [[ColorPalette::PrimaryPale]];
	border-left: 1px solid [[ColorPalette::PrimaryPale]];
	border-bottom: 1px solid [[ColorPalette::PrimaryPale]];
	height: auto;
	float: left;
	word-wrap: break-word;
	top: 0;
	padding: 0;
}

#sidebarTabs .tabsetWrapper .tabContents {
	background-color: [[ColorPalette::PrimaryPale]];
	border: 3px solid [[ColorPalette::PrimaryMid]];
	width: 242px;
	_width: 238px;
	left: -3px;
	_left: -5px;
	position: relative;
	min-height: 34em;
	padding: 8px;
	font-size: 0.8em;
}

/* ---- Side style --- */

#sidebarTabs .tabsetWrapper .tabset .tab {
	font-size: 0.9em;
	padding: 0.7em 8px 0.5em;
	color: #fff;
	background: [[ColorPalette::PrimaryLight]];
	border: none;
	line-height: 16px;
	position: relative;
	display: block;
	margin: 0;
}

#sidebarTabs .tabsetWrapper .tabset .tabSelected {
	color: [[ColorPalette::PrimaryMid]];
	background: [[ColorPalette::PrimaryPale]];
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	border-bottom: 3px solid [[ColorPalette::PrimaryMid]];
	border-left: 3px solid [[ColorPalette::PrimaryMid]];
	z-index: 10;
	margin-top: -1px;
	font-weight: bold;
}

#sidebarTabs .tabContents li {
	border: none;
	margin-left: 0;
	word-wrap: break-word;
}

.tabContents .timeline {
	background: [[ColorPalette::PrimaryPale]];
	margin-bottom: 8px;
}

#sidebarTabs .timeline li.listTitle {
	color: #132E43;
	margin-left: 8px 0;
	padding: 0.3em 0.11em;
	font-size: 1em;
	border-bottom: none;
}

#sidebarTabs .tabContents li a {
	display: block;
	text-align: left;
	margin: 0 0 1px 0;
	padding: 0.3em 1em;
	background: [[ColorPalette::PrimaryPale]];
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabContents li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

/* Activity Stream */
#sidebarTabs .tabContents .activityStream .feedItem a {
	display: inline-block;
	padding: 0;
	background: none;
}

/* ---- Tagging box --- */
.tagInfo {
	border: 1px solid #cccccc;
	padding: 10px 15px;
	-moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
	box-shadow: 0 2px 2px rgba(0,0,0,0.2);
	color: [[ColorPalette::TertiaryMid]];
	background: -moz-linear-gradient(100% 100% 90deg, #f4f4f4, #e5e5e5);
	background: -webkit-gradient(linear, left top, right top, from(#e5e5e5), to(#f4f4f4));
	margin-top: 1em;
	font-size: 13px;
	margin: 0 0 0 56px;
}

.tagInfo ul {
	list-style: none;
	padding-left: 2.2em;
}

.tagInfo ul li {
	display: inline;
}

.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
	color: [[ColorPalette::PrimaryMid]];
	font-size: 13px;
}

.tagInfo ul li a {
	border: none;
}

.tagInfo .tagging ul li {
	float: none;
	display: inline-block;
}

.tagInfo .tagging {
	padding: 0;
}

.viewRevision .toolbar {
	right: 48px;
	top: 8px;
}

.viewRevision .modifierIcon img,
.viewRevision .modifierIcon svg {
	margin-right: 8px;
}

.viewRevision .toolbar svg {
	width: 32px;
	height: 32px;
}

/* --- IE hacks from lattice --- */

/* ie hacks */
* html #menuBar {
	margin-bottom: 8px;
}
.toolbar .svgIconText {
	*display: inline;
}

div.tiddler .toolbar a {
	cursor: pointer;
	float: left\9;
	display: inline\9;
}

* html .toolbar {
	right: 8px;
}
* html .followButton a {
	margin-top: 0px;
	margin-right: 8px;
}
* html #tiddlerDisplay {
	margin-top: 0px;
}

/* for printing purposes */
@media print {
	#mainMenu,
	#sidebar,
	#messageArea,
	.toolbar,
	.followPlaceHolder,
	#backstageButton,
	#backstageArea,
	#sidebarTabs,
	#sidebarSearch .txtOptionInput,
	#sidebarOptions {
		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 */
	}
	#tiddlerDisplay {
		margin: 16px 16px;
	}
}

@media all and (max-width: 960px){
	#tiddlerDisplay,
	#searchResults {
		margin: 16px 366px 0 16px;
	}

	#mainMenu {
		margin-left: 16px;
	}

	.headerForeground {
		margin-left: 16px;
	}

	#sidebarSearch {
		right: 16px;
	}

	#sidebarOptions {
		margin-right: 16px;
	}

	#sidebarTabs {
		right: 16px;
		width: 326px;
	}

	#sidebarTabs .tabsetWrapper .tabset {
		font-size: 0.9em;
		width: 77px;
	}

	#sidebarTabs .tabsetWrapper .tabContents {
		width: 226px;
		_width: 222px;
	}

	#sidebarTabs .tabContents li a {
		font-size: 0.9em;
	}
}
/*}}}*/
[[StyleSheetTiddler]]
|~ViewToolbar|+editTiddler permalink references jump closeTiddler|
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>This Space</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<!--[if lte IE 8]>
	<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/es5-shim.min.js"></script>
	<![endif]-->
</head>
<body>
<div id="container">
	<div id="text-html" class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<h2>About this space <button class='toggleNext'></button></h2>
		<div id="siteinfo"></div>
		<h2>Site Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input class="btn" type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		<h2>Vital Statistics</h2>
		<div id="info">please wait while information is loaded about this space...</div>
		<button class="spacereset">Reset Space</button>
		<div class="reset-confirm-wrap messageArea">
			<button class="close-btn" title="cancel reset">×</button>
			<p>Are you sure you want to reset the space? You can't go back! This will remove all the content from the space!</p>
			<form class="cf">
				<label for="reset-confirm">Enter the space name to confirm.</label>
				<input type="text" name="reset-confirm" class="reset-confirm-input inputBox" />
				<button type="submit">Reset Now</button>
			</form>
			<div class="reset-message-area">
				<p class="performing">Resetting...</p>
				<p class="finished">Reset Done!</p>
				<p class="recipe-error-msg">Error removing includes. Please remove manually.</p>
			</div>
		</div>
		</div>
		<div class="right">
		<div class="ts-membership">
			<h2>
				Add Member
				<a href="http://docs.tiddlyspace.com/What%20is%20a%20member%3F" title="What is a Member?" class="help">What is a Member?</a>
			</h2>
			<div>
				<p>Add a new member to your space by entering their name below. Enter a space name instead and prefix with @ to add everyone who is already a member of that space.</p>
				<form class="ts-members">
					<input class="inputBox" type="text" name="username">
					<input type="submit" value="Add Member" class="btn" />
				</form>
			</div>
			<h2>
				Existing Members <button class='toggleNext'></button>
			</h2>
			<div>
				Your space currently has the following members: 
				<ul class="ts-members"></ul>
			</div>
			<h2>
				Include Space
				<a class="help" href="http://docs.tiddlyspace.com/What%20is%20space%20inclusion%3F" title="What is inclusion?">What is Inclusion?</a>
			</h2>
			<form class="ts-includes">
				<input class="inputBox" type="text" name="spacename">
				<input type="submit" value="Include Space" class="btn" />
			</form>
		</div>
		<div>
			<h2>Included Spaces <button class='toggleNext'></button></h2>
			<div>
			This space includes the following spaces:
			<ul class="ts-includes"></ul>
			</div>
		</div>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src='/bags/common/tiddlers/backstage.js'></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src='/bags/tiddlyspace/tiddlers/TiddlySpaceCSRF'></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src="/bags/common/tiddlers/ts.js"></script>
<script src="/status.js"></script>
<script src="/bags/common/tiddlers/space.js"></script>
</body>
</html>
(function() {
var getCSRFToken = function(window) {
	// XXX: should not use RegEx - cf.
	// http://www.quirksmode.org/js/cookies.html
	// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
	var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
	var match = regex.exec(document.cookie);
	var csrf_token = null;
	if (match && (match.length === 2)) {
		csrf_token = match[1];
	}

	return csrf_token;
};

if (typeof config !== 'undefined' && config.extensions &&
		config.extensions.tiddlyspace &&
		config.extensions.tiddlyspace.getCSRFToken === null) {
	config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
	window.getCSRFToken = getCSRFToken;
}
})(window);
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 478.39694 232.53705 L 478.39694 232.53705 
		C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994 
		L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214 
		L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936 
		L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052 
		C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978 
		L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988 
		L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283 
		L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688 
		C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936 
		L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814 
		L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273 
		C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273 
		C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714 
		C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
		class="glyph"/>
	</g>
</g>
</svg>
Lives Entwined In Us
/***
|''Name:''|ToggleSideBarTB|
|''Description''|allows to toggle left and right sidebar|
|''Version:''|1.1|
|''Type''|macro|
|''Author:''|[[TobiasBeer]]|
|''Info:''|http://tbgtd.tiddlyspot.com/#ToggleSideBarTB|
|''Source:''|http://tbgtd.tiddlyspot.com/#ToggleSideBarTB|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.xx|
!Code
***/
//{{{
config.macros.toggleSideBarTB={
  settings:{
    arr1:"►",arr2:"◄",
    lblToggle:"toggle %0",
    leftBarID:"mainMenu",leftBarLbl:"main menu",
    leftBarHide:"margin-left:2em;",leftBarShow:"margin-left:2em;",
    rightBarID:"sidebarTabs",rightBarLbl:"sidebar",
    rightBarHide:"margin-right:2em;",rightBarShow:"margin-right:24em;"
  },
  handler:function(place,macroName,params,wikifier,paramString,tiddler){
    var l=params[0]&&params[0]=="left";
    var h=params[1]&&params[1]=="hide";
    var no=params[2]&&params[2]=="notip";
    var s=this.settings;
    var el=l?s.leftBarID:s.rightBarID;
    var btnId="ToggleSideBar"+(l?"Left":"Right");
    var arr=l?(h?s.arr1:s.arr2):(h?s.arr2:s.arr1);
    var lbl=(no?'':s.lblToggle.format([(l?s.leftBarLbl:s.rightBarLbl)]));
    var fct=function(){config.macros.toggleSideBarTB.toggle(btnId)};
    document.getElementById(el).setAttribute("toggle","hide");
    createTiddlyButton(place,arr,lbl,fct,"button HideSideBarButton",btnId);
    if(h)config.macros.toggleSideBarTB.toggle(btnId);
  },
  toggle:function(btnId){
    var btn=document.getElementById(btnId);
    var l=btn.id=="ToggleSideBarLeft";
    var s=config.macros.toggleSideBarTB.settings;
    var bl=document.getElementById(s.leftBarID);
    var br=document.getElementById(s.rightBarID);
    var bar=(l?bl:br);
    var hl=bl.getAttribute("toggle")=='show';if(l)hl=!hl;
    var hr=br.getAttribute("toggle")=='show';if(!l)hr=!hr;
    var h=(l?hl:hr);
    setStylesheet("#tiddlerDisplay, #searchResults {"+
        (hl?s.leftBarHide:s.leftBarShow)+
        (hr?s.rightBarHide:s.rightBarShow)+
      "}","ToggleSideBarStyles");
    bar.style.display=h?"none":"block";
    bar.setAttribute("toggle",(h?"show":"hide"));
    arr1=l?s.arr2:s.arr1;arr2=l?s.arr1:s.arr2;
    btn.innerHTML=h?arr2:arr1;
  }
}
//}}}

''Orphaned Ancestors'' are individuals who left little trace in genealogical records and are now largely forgotten.  These orphans of history have few or no living descendants, and they were not famous or influential, so there are few people with an interest to retrieve and assemble the surviving details of their lives.  I have adopted them and devote some of my time to preserving their memory.  I discovered some of these people by happenstance, incorrect hypothesis (such as the Maher lineage of Albany, NY), or because they have a tangential connection to relatives of mine.

Many of these people will disappear into the sands of time, more than we can probably ever prevent.  As time passes, cousins or acquaintances of theirs pass away, first and second-hand stories are not written down, photographs and papers are thrown away, and the chances fade of telling their stories with any personal detail.  Nonetheless, I enjoy discovering and preserving those which I can.
# [[Katherine Maher Uhler]]
<<newTiddler label:+>><<permaview>><<closeAll>>
/***
|Name|SearchOptionsPluginInfo|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.10|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for SearchOptionsPlugin|
Extend core search function with additional user-configurable options including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddler'' 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.
!!!!!Search link Syntax
<<<
To insert a 'search link' into tiddler content, you can write:
{{{
[search[text to find]]
}}}
or
{{{
[search[text to display|text to find]]
}}}
Clicking on the resulting search link will trigger the search functionality, just as if the specified 'text to find' had been entered into the standard search input field usually displayed in the document sidebar.
<<<
!!!!!Inline output: search macro syntax
<<<
Alternatively, to embed search results lists directly into your tiddler content, you can use:
{{{
<<search "text" report>> (report is a literal keyword)
<<search "text" "heading" "separator">> (simple inline generator)
}}}
<<<
!!!!!Inline output examples:
<<<
*+++*[&lt;&lt;search "wood"&gt;&gt;]>...
<<search "wood">>
===

*+++*[&lt;&lt;search "wood" "/%%/"&gt;&gt;]>...
<<search "wood" "/%%/">>
===

*+++*[&lt;&lt;search "wood" "See also: "&gt;&gt;]>...
<<search "wood" "See also: ">>
===

*+++*[&lt;&lt;search "wood" "See also:\n*" "\n*"&gt;&gt;]>...
<<search "wood" "See also:\n*" "\n*">>
===

*+++*[&lt;&lt;search "wood" report=list "See also:"&gt;&gt;]>...
<<search "wood" report=list "See Also:" >>
===

*+++*[&lt;&lt;search "wood" report&gt;&gt;]>...
<<search "wood" report>>
===

*+++*[&lt;&lt;search "wood" report=&gt;&gt;]>...
<<search "wood" report=>>
===

*+++*[&lt;&lt;search "wood" report=all&gt;&gt;]>...
<<search "wood" report=all>>
===

*+++*[&lt;&lt;search "wood" report=summary+buttons+again+list&gt;&gt;]>...
<<search "wood" report=summary+buttons+again+list>>
===

*+++*[&lt;&lt;search "wood" report=summary+again&gt;&gt;]>...
<<search "wood" report=summary+again>>
===

*+++*[&lt;&lt;search "wood" report=summary&gt;&gt;]>...
<<search "wood" report=summary>>
===

<<<
!!!!!Configuration
<<<
<<tiddler SearchOptions>><<option chkSearchResultsOptions>> Include {{{options...}}} slider in "search again" form
>//Note: You can customize the search options display by editing the [[SearchOptions]] shadow tiddler.  You can also embed these options in your content by using any of the following standard TiddlyWiki macros://
{{{
<<tiddler SearchOptions>>
<<slider chkSearchOptions [[SearchOptions]] options "show search options">>
<<tabs chkSomeCookieName ... "options" "show search options" [[SearchOptions]] ... >>
}}}
<<<
!!!!!Revisions
<<<
2011.04.08 3.0.10 fixed typo in CSS in formatSearchResults_buttons().  Restore missing options in Configuration section.
2011.03.18 3.0.9 moved configuration controls to [[SearchOptions]] shadow tiddler
2010.05.03 3.0.8 added chkSearchResultsOptions to allow/omit the "options..." slider from the "search again" form
2010.02.25 3.0.7 in formatSearchResults_list, added declaration of local 'co' variable
2009.09.22 3.0.6 in TiddlyWiki.prototype.search, added 'match' param for core compatibility
2009.01.16 3.0.5 added chkSearchOpenTiddlers option to limit searches to displayed tiddlers only
2009.01.15 3.0.4 in formatSearchResults_list(), corrected link generation to properly handle single-quotes and double-quotes in tiddler titles
2009.01.09 3.0.3 added chkSearchHighlight to optionally disable highlighting of matched text
2009.01.05 3.0.2 in formatSearchResults_list(), set/clear 'highlightHack' via HTML links so that search term will be highlighted when displaying tiddlers.
2008.10.14 3.0.1 changed panel class from "tiddler" to "searchPanel" and added style definition for "searchPanel".  Fixes ticket #771 (in IE, links from search results were reporting errors due to "fake" tiddler class wrapper)
2008.10.02 3.0.0 added optional list of tags to use for excluding tiddler from searches (default="excludeLists").
2008.09.24 2.9.9 performance improvment to reportSearchResults(): when rendering a real SearchResults tiddler, store.notify() isn't needed since the results tiddler is always explicitly closed and redrawn each time.
2008.09.20 2.9.8 corrected createPanel() and renderPanel() so toolbar will be correctly shown/hidden on mouseover/mouseout.
2008.09.19 2.9.7 fixes to panel handling for IE, Safari, and others.  Changed panel id to #searchPanel and added .searchResults CSS class wrapper around panel content.  Fixed fold/unfold handling.
2008.09.18 2.9.6 refactored panel handling code, added 'fold/unfold' panel toolbar command, added dynamic 'title' (shows search term), added txtIncrementalSearchMin option
2008.09.17 2.9.5 added focus and cursor handling for 'search again' field in #searchResults DIV report so that an incremental key-by-key search doesn't interfere with continuous typing into the field.
2008.09.17 2.9.4 fix 'flicker' when updating #searchResults DIV by wikify()ing to an 'offscreen' DIV and then using replaceChild() instead of using removeChildren() followed by wikify()
2008.09.16 2.9.3 changed report layout, added "search again" and collapsible 'options' section with incremental search checkbox and "txtIncrementalSearchDelay" timer tweak to onKeyPress()
2008.08.25 2.9.2 added animation to search results DIV.  Also, the #searchResults DOM element is only auto-created if it does not exist ... and when closed, the DIV is simply hidden rather than removed.  This allows custom placement of search results report in the PageTemplate definition.
2008.08.23 2.9.1 story column search results uses {{{<<moveablePanel>>}}}
2008.08.22 2.9.0 default is now to show search results at top of story column, similar to FND's SimpleSearchPlugin display, with an option to generate SearchResults tiddler as before.  Also changed 'chkSearchIncremental' to 'chkIncrementalSearch' to match core option variable
2008.08.12 2.8.2 change default for chkSearchByDate back to FALSE, and adjusted "list" and "again" output formats (minor tweaks requested by PhilWhitehouse for use on TiddlyWiki.com)
2008.08.11 2.8.1 changed defaults for chkSearchTitlesFirst, chkSearchList and chkSearchShadows to TRUE to enable enhanced search results output as soon as plugin is installed.
2008.06.21 2.8.0 added extended syntax for {{{<<search "text" report heading>> and <<search "text" "heading" "seperator">>}}}
2008.05.03 2.7.1 in searchLink formatter handler(), use separate setAttribute() call instead of passing attribs to createTiddlyButton().  Avoids conflict with errant code in TiddlerNotesPlugin (v2.1 26/10/07)
2008.04.29 2.7.0 added searchLink formatter (syntax: {{{[search[text]]}}} or {{{[search[display|text]]}}})
2008.04.08 2.6.2 don't automatically add options to AdvancedOptions shadow tiddler
2007.02.17 2.6.1 added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0
2007.02.13 2.6.0 remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.
2007.02.08 2.5.1 include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)
2007.01.29 2.5.0 added support for "sort results by date".  Default is to sort alphabetically (standard).  When sorted by dates, most recent changes are shown first
2006.10.10 2.4.0 added support for "search in tiddler data" (tiddler.fields)  Default is to search extended data.
2006.04.06 2.3.0 added support for "search in shadow tiddlers".  Default is *not* to search in the shadows (i.e. standard TW behavior).  Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.
2006.02.03 2.2.1 rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes.  note that core no longer permits "blank=all" searches, so neither does this plugin.  To search for all, use "." with text patterns enabled.
2006.02.02 2.2.0 in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars.  Prevents searching on shorter text when shortened by rapid backspaces (<500msec)
2006.02.01 2.1.9 in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching
also, blank search text now presents "No search text.  Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.
2006.02.01 2.1.8 in doSearch(), added alert/return if search text is blank
2006.01.20 2.1.7 fixed setting of config.macros.search.reportTitle so that Tweaks can override it.
2006.01.19 2.1.6 improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)
define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title
2006.01.18 2.1.5 Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.
2006.01.17 2.1.4 Use regExp.search() instead of regExp.test() to scan for matches.  Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.
2006.01.15 2.1.3 Added information (date/time, username, search options used) to SearchResults output
2006.01.10 2.1.2 use displayTiddlers() to render matched tiddlers.  This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.
2006.01.08 2.1.1 corrected invalid variable reference, "txt.value" to "text" in story.search()
2006.01.08 2.1.0 re-write to match new store.search(), store.search.handler() and story.search() functions.
2005.12.30 2.0.0 Upgraded to TW2.0.  When rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.
2005.12.26 1.4.0 added option to search for matching text in tiddler tags
2005.12.21 1.3.7 use \\ to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link.  Also, added access key: "O", to trigger "open all" link.  Based on a suggestion by UdoBorkowski.
2005.12.18 1.3.6 call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon
2005.12.17 1.3.5 if no matches found, just display message and delete any existing SearchResults tiddler.
2005.12.17 1.3.4 use {/%%/{/%%/{  and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered.  Based on a suggestion by UdoBorkowski.
2005.12.14 1.3.3 tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches. Based on a suggestion by UdoBorkowski.
2005.12.14 1.3.2 added "open all matching tiddlers..." link to search results output. Based on a suggestion by UdoBorkowski.
2005.12.10 1.3.1 added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.
2005.12.01 1.3.0 added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).
added handling for Enter key so it can be used to start a search. Based on a suggestion by LyallPearce
2005.11.25 1.2.1 renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin
2005.11.25 1.2.0 added chkSearchList option.  Based on a suggestion by RodneyGomes
2005.10.19 1.1.0 added chkSearchTitlesFirst option.  Based on a suggestion by ChristianHauck
2005.10.18 1.0.0 Initial Release.  Based on a suggestion by LyallPearce.
<<<
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.10|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|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
<<<
<<tiddler SearchOptions>>
<<option chkSearchResultsOptions>> Include {{{options...}}} slider in "search again" form
<<<
!!!!!Revisions
<<<
2011.04.08 3.0.10 fixed typo in CSS in formatSearchResults_buttons().  Restore missing options in Configuration section.
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 1.0.0 Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.SearchOptionsPlugin= {major: 3, minor: 0, revision: 10, date: new Date(2011,3,18)};
//}}}
//{{{
var defaults={
	chkSearchTitles:	true,
	chkSearchText:		true,
	chkSearchTags:		true,
	chkSearchFields:	true,
	chkSearchTitlesFirst:	true,
	chkSearchList:		true,
	chkSearchHighlight:	true,
	chkSearchListTiddler:	false,
	chkSearchByDate:	false,
	chkIncrementalSearch:	true,
	chkSearchShadows:	true,
	chkSearchOpenTiddlers:	false,
	chkSearchResultsOptions:true,
	chkSearchExcludeTags:	true,
	txtSearchExcludeTags:	'excludeSearch',
	txtIncrementalSearchDelay:	500,
	txtIncrementalSearchMin:	3
}; for (var id in defaults) if (config.options[id]===undefined)
	config.options[id]=defaults[id];
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,match)
{
	var co=config.options; // abbrev
	var tids = this.reverseLookup("tags",excludeTag,!!match,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;">';
	if (!config.options.chkSearchResultsOptions) // omit "options..."
		body+='</html>';
	else {
		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+='	%/<<tiddler SearchOptions>>@@';
	};
	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 co=config.options; // abbrev
	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.escapeRegExp(),\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 (co.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+="@@display: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);
}
//}}}
// // DELIVER [[SearchOptions]] shadow payload
//{{{
config.shadowTiddlers.SearchOptions = store.getTiddlerText('SearchOptionsPlugin##panel','');
config.annotations.SearchOptions    = 'created by SearchOptionsPlugin';
//}}}
/***
//{{{
!panel
search in:
  {{nowrap{<<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags}}} /%
%/{{nowrap{<<option chkSearchFields>>fields <<option chkSearchShadows>>shadows}}}
----
  {{nowrap{<<option chkCaseSensitiveSearch>>case-sensitive}}} /%
%/{{nowrap{<<option chkRegExpSearch>>match text patterns}}}
  {{nowrap{<<option chkIncrementalSearch>>key-by-key search:}}} /%
	%/{{threechar smallform nowrap{<<option txtIncrementalSearchMin>> or more characters}}} /%
	%/{{threechar smallform nowrap{<<option txtIncrementalSearchDelay>> msec delay}}}<hr>
  {{nowrap{<<option chkSearchList>>show results in a list &nbsp; &nbsp;}}} /%
%/{{nowrap{<<option chkSearchListTiddler>>save list in ''[[SearchResults]]''}}}
  {{nowrap{<<option chkSearchTitlesFirst>>show title matches first}}} /%
%/{{nowrap{<<option chkSearchByDate>>sort results by date}}} /%
%/{{nowrap{<<option chkSearchHighlight>>highlight matching text}}}
----
{{nowrap{<<option chkSearchOpenTiddlers>>search open tiddlers only}}}
{{nowrap{<<option chkSearchExcludeTags>>exclude tiddlers tagged with:}}}
{{editor{<<option txtSearchExcludeTags>>}}}
!end
//}}}
***/
 
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
<!--{{{-->
<div class='tagInfo infoTags'>
    <div class='tidTags' macro='tags'></div>
</div>

<div macro="hideWhen readOnly">
    <!-- full toolbar for admin  -->
    <div class='toolbar'
    macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
</div>

<div macro="showWhen readOnly">
<!--simple toolbar for visitors -->
<div class='toolbar'
macro='toolbar [[GuestToolbar::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
</div>

<div class='heading'>
    <span class="titleBar">
        <div class='title' macro='view title text'></div>
        <div class="subtitle">
            <span class='spaceSiteIcon' macro='tiddlerOrigin label:no spaceLink:yes height:16 width:16 preserveAspectRatio:yes'></span>
            last modified on
            <span macro='viewRevisions page:5'>
                <span macro="view modified date"></span>
            </span>
            by
            <span class='hideIcon' macro='view modifier SiteIcon spaceLink:yes label:yes height:16 width:16'></span>
            //
            <span macro="view title replyLink"></span>
        </div>
    </span>
    <span class='followPlaceHolder' macro='followTiddlers'></span>
    <span class='modifierIcon'
        macro='view modifier SiteIcon label:no spaceLink:yes height:32 width:32 preserveAspectRatio:yes'>
    </span>
    <div class='tagClear'></div>
</div>
<div class='content'>
    <div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo infoTagging'>
    <div class='tagging' macro='tagging'></div>
</div>
<div macro="discuss url:'http://andy-discuss.tiddlyspace.com'"></div><span class="openTiddler" macro='tiddler OnLoad'/>
<!--}}}-->
config.options.txtMainTab = "Timeline";
config.options.txtMoreTab = "Orphans";
[[About|Lives Entwined In Us]] """///""" [[The Author]] """///""" <<tag 52Ancestors>> """///""" [[Navigating This Wiki]] <<toggleSideBarTB right show>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 225 48 52"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 333.00003 234 L 306 258.75003 L 301.5 270 L 312.75 265.50003 L 339.75 240.74998 Z M 337.5 229.50002 
		L 335.24988 231.75008 L 341.99997 238.50003 L 344.24997 236.24995 Z M 342 225.00003 L 339.74988 227.25009 
		L 346.5 234.00005 L 348.75 231.75003 Z M 301.5 273.9719 C 301.5 273.9719 309.59888 277.99927 317.70013 273.97183 
		C 325.80066 269.94437 341.99997 276.65686 341.99997 276.65686 L 341.99997 273.97195 
		C 341.99997 273.97195 325.80014 267.2594 317.70013 271.28687 C 309.6 275.31451 301.5 271.28683 301.5 271.28683 Z" 
		fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
/***
https://raw.github.com/tiddlyweb/chrjs/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.14.3

/*jslint vars: true, unparam: true, nomen: true, white: true */
/*global jQuery */

var tiddlyweb = (function($) {

"use strict";

var tw = {
	routes: {
		// host is the TiddlyWeb instance's URI (including server_prefix)
		// placeholders "_type" & "name" refer to the respective bag/recipe
		root     : "{host}/",
		bags     : "{host}/bags",
		bag      : "{host}/bags/{name}",
		recipes  : "{host}/recipes",
		recipe   : "{host}/recipes/{name}",
		tiddlers : "{host}/{_type}s/{name}/tiddlers",
		tiddler  : "{host}/{_type}s/{name}/tiddlers/{title}",
		revisions: "{host}/{_type}s/{name}/tiddlers/{title}/revisions",
		revision : "{host}/{_type}s/{name}/tiddlers/{title}/revisions/{revision}",
		search   : "{host}/search?q={query}"
	}
};

var convertTimestamp, supplant;

// host (optional) is the URI of the originating TiddlyWeb instance
tw.Resource = function(type, host) {
	if(arguments.length) { // initialization
		this._type = type;
		if(host !== false) {
			this.host = host !== undefined ? host.replace(/\/$/, "") : null;
		}
	}
};
$.extend(tw.Resource.prototype, {
	// retrieves resource from server
	// callback is passed resource, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	// filters is an optional filter string (e.g. "select=tag:foo;limit=5")
	get: function(callback, errback, filters) {
		var uri = this.route();
		if(filters) {
			var separator = uri.indexOf("?") === -1 ? "?" : ";";
			uri += separator + filters;
		}
		var self = this;
		return $.ajax({
			url: uri,
			type: "GET",
			dataType: "json",
			success: function(data, status, xhr) {
				var resource = self.parse(data);
				resource.etag = xhr.getResponseHeader("Etag");
				callback(resource, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// sends resource to server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	put: function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "PUT",
			contentType: "application/json",
			data: JSON.stringify(this.baseData()),
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// deletes resource on server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	"delete": function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "DELETE",
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// returns an object carrying only the essential information of the resource
	baseData: function() {
		var data = {},
			self = this;
		$.each(this.data, function(i, item) {
			var value = self[item];
			if(value !== undefined) {
				data[item] = value;
			}
		});
		return data;
	},
	// returns corresponding instance from a raw object (if applicable)
	parse: function(data) {
		return data;
	},
	// list of accepted keys in serialization
	data: [],
	// returns resource's URI
	route: function() {
		return supplant(tw.routes[this._type], this);
	}
});

var Container = function(type, name, host) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		this.name = name;
		this.desc = "";
		this.policy = new tw.Policy({});
	}
};
Container.prototype = new tw.Resource();
$.extend(Container.prototype, {
	tiddlers: function() {
		return new tw.TiddlerCollection(this);
	},
	parse: function(data) {
		var type = tw._capitalize(this._type),
			container = new tw[type](this.name, this.host);
		data.policy = new tw.Policy(data.policy);
		return $.extend(container, data);
	},
	data: ["desc", "policy"]
});

// attribs is an object whose members are merged into the instance (e.g. query)
tw.Collection = function(type, host, attribs) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		$.extend(this, attribs);
	}
};
tw.Collection.prototype = new tw.Resource();

tw.TiddlerCollection = function(container, tiddler) {
	if(arguments.length) { // initialization
		tw.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
		this.container = container || null;
		this.tiddler = tiddler || null;
	}
};
tw.TiddlerCollection.prototype = new tw.Collection();
$.extend(tw.TiddlerCollection.prototype, {
	parse: function(data) {
		var container = this.container;
		return $.map(data, function(item, i) {
			var tiddler = new tw.Tiddler(item.title, container),
				bag = item.bag;
			tiddler = tw.Tiddler.prototype.parse.apply(tiddler, [item]);
			if(!tiddler.bag && bag) { // XXX: bag always present!?
				tiddler.bag = new tw.Bag(bag, container.host);
			}
			if(!tiddler.recipe && item.recipe) {
				tiddler.recipe = new tw.Recipe(item.recipe, container.host);
			}
			delete item.recipe;
			return $.extend(tiddler, item);
		});
	},
	route: function() {
		var params = this.container;
		if(this.tiddler) {
			var container = this.tiddler.bag || this.tiddler.recipe;
			params = {
				_type: container._type,
				host: container.host,
				name: container.name,
				title: this.tiddler.title
			};
		}
		return supplant(tw.routes[this._type], params);
	}
});

tw.Search = function(query, host) {
	tw.Collection.apply(this, ["search", host]);
	this.query = query;
};
tw.Search.prototype = new tw.Collection();
$.extend(tw.Search.prototype, {
	parse: function(data) {
		this.container = { // XXX: hacky
			_type: "bag",
			host: this.host
		};
		var tiddlers = tw.TiddlerCollection.prototype.parse.apply(this, arguments);
		delete this.container;
		return tiddlers;
	}
});

// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
// optionally accepts a single object representing tiddler attributes
tw.Tiddler = function(title, container) {
	tw.Resource.apply(this, ["tiddler", false]);
	this.title = title;
	this.bag = container && container._type === "bag" ? container : null;
	this.recipe = container && container._type === "recipe" ? container : null;
	var self = this;
	$.each(this.data, function(i, item) {
		self[item] = undefined; // exposes list of standard attributes for inspectability
	});
	if(title && title.title) { // title is an object of tiddler attributes
		$.extend(this, title);
	}
};
tw.Tiddler.prototype = new tw.Resource();
$.extend(tw.Tiddler.prototype, {
	revisions: function() {
		return new tw.TiddlerCollection(this.bag || this.recipe, this);
	},
	route: function() {
		var container = this.bag || this.recipe;
		var params = $.extend({}, this, {
			host: container ? container.host : null,
			_type: this.bag ? "bag" : (this.recipe ? "recipe" : null),
			name: container ? container.name : null
		});
		return supplant(tw.routes[this._type], params);
	},
	parse: function(data) {
		var tiddler = new tw.Tiddler(this.title),
			container = this.bag || this.recipe;
		if(data.bag) {
			tiddler.bag = new tw.Bag(data.bag, container.host);
			delete data.bag;
		}
		delete data.recipe;
		tiddler.created = data.created ? convertTimestamp(data.created) : new Date();
		delete data.created;
		tiddler.modified = data.modified ? convertTimestamp(data.modified) : new Date();
		delete data.modified;
		if(this.recipe) {
			tiddler.recipe = this.recipe;
		}
		return $.extend(tiddler, data);
	},
	data: ["created", "creator", "modifier", "modified", "tags", "type", "text",
			"fields"],
	ajaxSetup: function(options) {
		var self = this;
		if(this.etag && (options.type === "PUT" || options.type === "DELETE")) {
			options.beforeSend = function(xhr) {
				xhr.setRequestHeader("If-Match", self.etag);
			};
		}
		if(options.type === "PUT") {
			var callback = options.success;
			options.success = function(data, status, xhr) {
				var loc = xhr.getResponseHeader("Location"),
					etag = xhr.getResponseHeader("Etag");
				if(loc && etag) {
					self.etag = etag;
					if(!self.bag) {
						var bag = loc.split("/bags/").pop().split("/")[0];
						self.bag = new tw.Bag(bag, self.recipe.host);
					}
					callback(self, status, xhr);
				} else { // IE
					self.get(callback, options.error);
				}
			};
		}
	}
});

tw.Revision = function(id, tiddler) {
	var container = tiddler.bag || tiddler.recipe;
	tw.Tiddler.apply(this, [tiddler.title, container]);
	this._type = "revision";
	this.revision = id;
};
tw.Revision.prototype = new tw.Tiddler();
$.extend(tw.Revision.prototype, {
	revisions: false,
	data: false,
	put: false,
	"delete": false
});

tw.Bag = function(name, host) {
	Container.apply(this, ["bag", name, host]);
};
tw.Bag.prototype = new Container();

tw.Recipe = function(name, host) {
	Container.apply(this, ["recipe", name, host]);
	this.recipe = [];
};
tw.Recipe.prototype = new Container();
$.extend(tw.Recipe.prototype, {
	data: ["recipe"].concat(Container.prototype.data)
});

tw.Policy = function(constraints) { // TODO: validation?
	var self = this;
	$.each(this.constraints, function(i, item) {
		self[item] = constraints[item];
	});
};
tw.Policy.prototype.constraints = ["read", "write", "create", "delete",
	"manage", "accept", "owner"];

/*
 * utilities
 */

tw._capitalize = function(str) {
	return str.charAt(0).toUpperCase() + str.slice(1);
};

// convert YYYYMMDDhhmmss timestamp to Date instance
convertTimestamp = function(t) {
	if (t.match(/^\d{12,17}$/)) {
		return new Date(Date.UTC(
			parseInt(t.substr(0, 4), 10),
			parseInt(t.substr(4, 2), 10) - 1,
			parseInt(t.substr(6, 2), 10),
			parseInt(t.substr(8, 2), 10),
			parseInt(t.substr(10, 2), 10),
			parseInt(t.substr(12, 2) || "0", 10),
			parseInt(t.substr(14, 3) || "0", 10)
		));
	} else {
		return new Date(Date.parse(t));
	}
};

// adapted from Crockford (http://javascript.crockford.com/remedial.html)
supplant = function(str, obj) {
	return str.replace(/{([^{}]*)}/g, function (a, b) {
		var r = obj[b];
		r = typeof r === "string" || typeof r === "number" ? r : a;
		return $.inArray(b, ["host", "query"]) !== -1 ? r : encodeURIComponent(r); // XXX: special-casing
	});
};

return tw;

}(jQuery));
//}}}
&nbsp;
[[52 Ancestors in 52 Weeks|http://www.nostorytoosmall.com/52-ancestors-in-52-weeks/]] is a challenge began by Amy Johnson Crow, on her blog with the lovely name ''No Story Too Small:'' //Life is made of stories.//

Amy describes the premise as:
<<<
Write once a week about a specific ancestor. It could be a story, a biography, a photograph, a research problem — anything that focuses on that one ancestor. The next week, write about a different ancestor. 
<<<
See Amy's [[list of ancestors|http://www.nostorytoosmall.com/52-ancestors-in-52-weeks/amys-52-ancestors-in-52-weeks/]].

I learned of this challenge from following Roberta Estes' ~DNAeXplained blog, which I highly recommend.  Roberta shared her first story {{serif{[[Searching For Ilo's Son|http://dna-explained.com/2014/01/10/searching-for-ilos-son/]]}}} on January 10th.

[[About This Site's Technology]]
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AP8zZgAAAGYA//8zAADMMwD/mTMAAGYzAP8zMwAAADMAzP8AAADMAADMmQAAAGYAAMwzAAAAAADuzAAA3QAAALvMAACqAAAAiMwAAHcAAABVmQAARAAAACKZAAARAADuAJkA3QAAALsAmQCqAAAAiACZAHcAAABVAJkARAAAACIAZgARAADuAABm3QAAALsAAGaqAAAAiAAAZncAAABVAABmRAAAACIAAGYRAAAA7u7uM93d3QC7u7szqqqqAIiIiDN3d3cAVVVVM0RERAAiIiIzERERAAAAADMBAQEBAQEBAQEBpXl5eXl5eXl5eXmlAQEBAQEBAQEBAQEBAQEBAQEBgHl5eXl5eXl5eXl5eXl5gAEBAQEBAQEBAQEBAQEB/Xp5eXlVT04qKioqTk9VeXl5ev0BAQEBAQEBAQEBAaV5eXlPKioqKioqKioqKioqT3l5eaUBAQEBAQEBAQGAeXlVTioqKioqKioqKioqKioqTlV5eYABAQEBAQEBgHl5VSoqKioqKioqKioqKioqKioqKlV5eYABAQEBAaV5eVUqKioqKioqKioqKioqKioqKioqKlV5eaUBAQEBeXlVKioqKioqKioqKioqKioqKioqKioqKlV5eQEBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBeXlPKioqKioqKjEyMjIyMjIyMjEqKioqKioqT3l5AXp5eSoqKioqKioxMjIxBwcHBzEyMjEqKioqKioqeXl6eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl5eU8qKioqKioyMgcHBwcHBwcHBwcyMioqKioqKk95eXl5TioqKioqMTIxBwcHBwcHBwcHBzEyMSoqKioqTnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eSoqKioqKjEyBwcHBwcHBwcHBwcHMjEqKioqKip5eXl5KioqKioqMTIHBwcHBwcHBwcHBwcyMSoqKioqKnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eU4qKioqKjEyMQcHBwcHBwcHBwcxMjEqKioqKk55eXl5TyoqKioqKjIyBwcHBwcHBwcHBzIyKioqKioqT3l5eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl6eXkqKioqKioqMTIyMQcHBwcxMjIxKioqKioqKnl5egF5eU8qKioqKioqMTIyMjIyMjIyMSoqKioqKipPeXkBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBAXl5VSoqKioqKioqKioqKioqKioqKioqKipVeXkBAQEB+nl5VSoqKioqKioqKioqKioqKioqKioqVXl5+gEBAQEBenl5VSoqKioqKioqKioqKioqKioqKlV5eXoBAQEBAQEBeXl5VU4qKioqKioqKioqKioqKk5VeXl5AQEBAQEBAQEBenl5eU8qKioqKioqKioqKipPeXl5egEBAQEBAQEBAQEB+nl5eXlVT04qKioqTk9VeXl5efoBAQEBAQEBAQEBAQEBAXl5eXl5eXl5eXl5eXl5eXkBAQEBAQEBAQEBAQEBAQEBAQF6eXl5eXl5eXl5eXoBAQEBAQEBAQEB/+AH//+AAf/+AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAADwAAAA+AAAAfwAAAP+AAAH/wAAD/+AAB//4AB///gB/8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAABG1bSA61m3JXuqB4mbuhd8m9o3jqvaF4+b2hePm9o3jqu6F3ybqgeJm1m3JXbVtIDgAAAAQAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACI98Wye0nXWavKF4876kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev+8oXjztJ11mo98WycAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAAChwcHBKulnGJvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+K6WcYkcHBwSAAAACgAAAAcAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAADAAAABwAAAAtuYkUst552z76kev++pHr+1LuS//Latf/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/8tq1/9S7kv++pHr+vqR6/7eeds9uYkUsAAAACwAAAAcAAAADAAAAAQAAAAAAAAABAAAAAgAAAAQAAAAIi3hbNbqgd+a+pHr/xayD/+3Vr//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr//FrIP/vqR6/7qgd+aJdVg0AAAACAAAAAQAAAACAAAAAQAAAAEAAAACAAAABIl8WSW8oXjlvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7yheOWJfFklAAAABAAAAAIAAAABAAAAAAAAAAFfXz8Iu6F4zL6kev/Msor/+uK+//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//rivv/Msor/vqR6/7uheMxfXz8IAAAAAQAAAAAAAAAAAAAAAbqid4K+pHr/xayD//ngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//fgvP/FrIP/vqR6/7qid4IAAAABAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAALuheJa+pHr/1LuS//zlwP/85cD//OXA//zlwP/85cD//OXA//riwP/Pq8f/r4HM/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HN/6+BzP/Pq8f/+uLA//zlwP/85cD//OXA//zlwP/85cD//OXA/9S5kv++pHr/u6F4lgAAAACii3MLvKF4876kev/y2rX//OXA//zlwP/85cD//OXA//zlwP/64sD/w5vJ/6+Bzf+vg83/w5vc/9W06v/dwPD/3cDw/9W06v/Dm9z/r4PN/6+Bzf/Dm8n/+uLA//zlwP/85cD//OXA//zlwP/85cD/8tq1/76kev+8oXjzootzC72feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVvaF4mL6kev/fxZ7//OXA//zlwP/85cD//OXA//zlwP/v08L/r4HM/6+Dzf/Wtev/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/r4PN/6+BzP/v08L//OXA//zlwP/85cD//OXA//zlwP/fxZ7/vqR6/72heJi8oXfIvqR6/+zUrv/85cD//OXA//zlwP/85cD//OXA/9Crx/+vgc3/w5vc/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Dm9z/r4HN/9Crx//85cD//OXA//zlwP/85cD//OXA/+zUrv++pHr/vKF3yL2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvaF4+b6kev/64r7//OXA//zlwP/85cD//OXA//zlwP+zhsz/r4HN/93A8P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/3cDw/6+Bzf+zhsz//OXA//zlwP/85cD//OXA//zlwP/64r7/vqR6/72hePm9oXj5vqR6//rivv/85cD//OXA//zlwP/85cD//OXA/7OGzP+vgc3/3cDw/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//dwPD/r4HN/7OGzP/85cD//OXA//zlwP/85cD//OXA//rivv++pHr/vaF4+b2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvKF3yL6kev/s1K7//OXA//zlwP/85cD//OXA//zlwP/Qq8f/r4HN/8Ob3P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/w5vc/6+Bzf/Qq8f//OXA//zlwP/85cD//OXA//zlwP/s1K7/vqR6/7yhd8i9oXiYvqR6/9/Fnv/85cD//OXA//zlwP/85cD//OXA/+/Twv+vgcz/r4PN/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9a16/+vg83/r4HM/+/Twv/85cD//OXA//zlwP/85cD//OXA/9/Fnv++pHr/vaF4mL2feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVootzC7yhePO+pHr/8tq1//zlwP/85cD//OXA//zlwP/85cD/+uLA/8Obyf+vgc3/r4PN/8Ob3P/VtOr/3cDw/93A8P/VtOr/w5vc/6+Dzf+vgc3/w5vJ//riwP/85cD//OXA//zlwP/85cD//OXA//Latf++pHr/vKF486KLcwsAAAAAu6N3l76kev/Uu5L//OXA//zlwP/85cD//OXA//zlwP/85cD/+uLA/8+rx/+vgcz/r4HN/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HM/8+rx//64sD//OXA//zlwP/85cD//OXA//zlwP/85cD/1LmS/76kev+7oXiWAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAAAAAAAC6oneCvqR6/8Wsg//54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/34Lz/xayD/76kev+6oneCAAAAAAAAAAAAAAAAAAAAAH9/VQa8oHjLvqR6/8yyiv/64r7//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/+uK+/8yyiv++pHr/vKB4y39/VQYAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh67o3nkvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7ujeeSyoW4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqbdim7o3nkvqR6/8Wsg//t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/t1a//xayD/76kev+7o3nkupt2KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh68oHjLvqR6/76kev7Uu5L/8tq1//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/y2rX/1LmS/76kev6+pHr/vKB4y7Khbh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VQa6oneCvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+Lqid4J/f1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3l28gu6F4lryhePO+pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vKF487uheJa3l28gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAootzC72feFW9oXiYvKF3yL2jeOq9oXj5vaF4+b2jeOq8oXfIvaF4mL2feFWii3MLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/
/***
|''Name''|BinaryUploadPlugin|
|''Version''|0.3.16|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{edit:tags}}}: specifies that you want to tag the file being uploaded
* {{{edit:title}}}: specifies that you want to set the title to something other than the filename
* {{{tags:<default tags>}}}: specifies a default set of tags to apply to the file (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.binaryUpload = {
	locale: {
		titleDefaultValue: "Please enter a title...",
		tagsDefaultValue: "Please enter some tags...",
		titlePrefix: "title: ",
		tagsPrefix: "tags: ",
		loadSuccess: 'Tiddler %0 successfully uploaded',
		loadError: "An error occurred when uploading the tiddler %0",
		uploadInProgress: "Please wait while the file is uploaded...",
		membersOnly: "Only members can upload."
	},
	renderInputFields: function(container, options) {
		var locale = macro.locale;
		var editableFields = options.edit;
		var includeFields = {
			tags:  editableFields && editableFields.contains("tags") ? true : false,
			title: editableFields && editableFields.contains("title") ? true : false
		};
		var fields = ["title", "tags"];
		for(var i = 0; i < fields.length; i++) {
			var fieldName = fields[i];
			var userDefault = options[fieldName];
			var defaultValue = userDefault ? userDefault[0] : false;
			if(includeFields[fieldName] || defaultValue) {
				var localeDefault = locale["%0DefaultValue".format(fieldName)];
				var className = defaultValue ? "userInput" : "userInput notEdited";
				var inputEl;
				var val = defaultValue || localeDefault || "";
				var iContainer = $("<div />").addClass("binaryUpload%0".format(fieldName)).
					appendTo(container);
				if(defaultValue && !includeFields[fieldName]) {
					var label = locale["%0Prefix".format(fieldName)];
					$("<span />").text(label).appendTo(iContainer);
					$("<span />").addClass("disabledInput").text(val).appendTo(iContainer);
					inputEl = $("<input />").attr("type", "hidden");
				} else {
					inputEl = $("<input />").attr("type", "text");
				}
				inputEl.attr("name", fieldName).
					addClass("%0Edit".format(fieldName)).
					val(val).addClass(className).appendTo(iContainer);
			}
		}
	},
	getTiddlerName: function(fileName) {
		var fStart = fileName.lastIndexOf("\\");
		var fStart2 = fileName.lastIndexOf("/");
		fStart = fStart < fStart2 ? fStart2 : fStart;
		fileName = fileName.substr(fStart+1);
		return fileName;
	},
	errorHandler: function(fileName) {
		displayMessage("upload of file %0 failed".format(fileName));
	},
	uploadFile: function(place, baseURL, workspace, options) {
		var pleaseWait = $(".uploadProgress", place);
		var iframeName = options.target;
		var form = $("form", place);
		var existingVal = $("input[name=title]", form).val();
		var fileName = existingVal || $('input:file', form).val();
		if(!fileName) {
			return false; // the user hasn't selected a file yet
		}
		fileName = macro.getTiddlerName(fileName);
		$("input[name=title]", place).val(fileName);
		// we need to go somewhere afterwards to ensure the onload event triggers
		var redirectTo = "/%0/tiddlers.txt?select=title:%1".
			format(workspace, fileName);
		var token = tiddlyspace ? tiddlyspace.getCSRFToken() : "";
		var action = "%0?csrf_token=%1&redirect=%2"
			.format(baseURL, token, redirectTo);
		form[0].action = action; // dont use jquery to work with ie
		form[0].target = iframeName;
		// do not refactor following line... won't work in IE6 otherwise
		$(place).append($('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
		macro.iFrameLoader(iframeName, function() {
			var content = document.getElementById(iframeName).contentWindow.document.documentElement;
			if($(content).text().indexOf(fileName) > -1) {
				options.callback(place, fileName, workspace, baseURL);
			} else {
				macro.errorHandler(fileName);
			}
			form.show(1000);
			pleaseWait.hide(1000);
		});
		form.hide(1000);
		pleaseWait.show(1000);
		return true;
	},
	createUploadForm: function(place, options) {
		var locale = macro.locale;
		if(readOnly) {
			$('<div class="annotation" />').text(locale.membersOnly).
				appendTo(place);
			return;
		}
		var bag = options.bag;
		options.callback = options.callback ? options.callback :
			function(place, fileName, workspace, baseurl) {
				macro.displayFile(place, fileName, workspace);
				displayMessage(locale.loadSuccess.format(fileName));
				$("input[type=text]", place).val("");
			};
		var defaults = config.defaultCustomFields;
		place = $("<div />").addClass("container").appendTo(place)[0];
		var workspace = bag ? "bags/%0".format(bag) : config.defaultCustomFields["server.workspace"];
		var baseURL = defaults["server.host"];
		baseURL += (baseURL[baseURL.length - 1] !== "/") ? "/" : "";
		baseURL = "%0%1/tiddlers".format(baseURL, workspace);
		//create the upload form, complete with invisible iframe
		var iframeName = "binaryUploadiframe%0".format(Math.random());
		// do not refactor following line of code to work in IE6.
		var form = $('<form action="%0" method="POST" enctype="multipart/form-data" />'.
					format(baseURL)).addClass("binaryUploadForm").
			appendTo(place)[0];
		macro.renderInputFields(form, options);
		$(form).
			append('<div class="binaryUploadFile"><input type="file" name="file" /></div>').
			append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" disabled /></div>').
			submit(function(ev) {
				this.target = iframeName;
				options.target = iframeName;
				macro.uploadFile(place, baseURL, workspace, options);
			})
			.find('[type="file"]').bind('change', function() {
				$(form).find('[type="submit"]').prop('disabled', false);
			}).end();
		$('<div />').addClass("uploadProgress").text(locale.uploadInProgress).hide().appendTo(place);
		$("input[name=file]", place).change(function(ev) {
			var target = $(ev.target);
			var fileName = target.val();
			var title = $("input[type=text][name=title]", place);
			if(!title.val()) {
				title.val(fileName);
			}
		});
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true);
		macro.createUploadForm(place, params[0]);
	},
	iFrameLoader: function(iframeName, callback) {
		var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
		var locale = macro.locale;
		$(".userInput").addClass("notEdited"); // reset editing
		var finishedLoading = function() {
			callback();
		};
		var iFrameLoadHandler = function() {
			finishedLoading.apply();
			return;
		};

		iframe.onload = iFrameLoadHandler;
		//IE
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 3) {
				iFrameLoadHandler();
			}
		};
	},
	displayFile: function(place, title, workspace) {
		var adaptor = store.getTiddlers()[0].getAdaptor();
		var context = {
			workspace: workspace,
			host: config.defaultCustomFields['server.host']
		};
		adaptor.getTiddler(title, context, null, function(context) {
			if(context.status) {
				store.addTiddler(context.tiddler);
				story.displayTiddler(place, title);
				var image = config.macros.image;
				if(image && image.refreshImage) {
					image.refreshImage("/%0/tiddlers/%1".format(workspace, title));
					image.refreshImage(title);
					image.refreshImage("/%0".format(title));
					image.refreshImage("%0/%1/tiddlers/%2".format(config.extensions.tiddlyweb.host, workspace, title));
				}
			} else {
				displayMessage(macro.locale.loadError.format(title));
			}
		});
	}
};

if(tiddlyspace) {
	config.macros.binaryUploadPublic = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			var options = paramString.parseParams(null, null, true)[0];
			var bag = tiddlyspace.getCurrentBag("public");
			options.bag = bag;
			macro.createUploadForm(place, options);
		}
	};
	config.messages.privacySetting = config.options.chkPrivateMode ?
		"private" : "public";
	config.macros.binaryUpload.defaultWorkspace = tiddlyspace.
		getCurrentWorkspace(config.messages.privacySetting);
}

})(jQuery);
//}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8"/>
	<title>TiddlySpace Apps</title>
	<link rel="stylesheet" href="/bags/common/tiddlers/reset.css" />
	<link rel="stylesheet" href="/bags/common/tiddlers/appspage.css" />
	<!--[if lt IE 7 ]>
	<link rel="stylesheet" href="/bags/common/tiddlers/appspageie6.css" />
	<![endif]-->
</head>
<body>
	
	<div id="wrapper">
		<div id="TSbar"></div>
		<div id="main-content">
			<div id="space-details">
				<a href="/_space"><img class="siteicon"></a>
				<div id="title-subtitle">
					<h1 class="spaceaddress">
						<span class="spaceName"></span><span class="hostName"></span>
					</h1>
					<p class="tagline"><span class="subTitle"></span><a class="managespaces" href="/_space">manage space</a></p>
				</div>
			</div>
			<div id="holder">
				<div id="appswitcher-wrapper">
					<div id="appswitcher">
						<h2>Your Apps</h2>
						<ul id="app-list">
							<li class="htmlserialisation">
								<a href="/tiddlers.html?select=tag:!excludeLists;sort=-modified">
									<img src="/bags/common/tiddlers/browse_read_blue.png" alt="Icon for the HTML Serialisation" class="app-img" />
									BROWSE
								</a>
							</li>
							<li class="tiddlywiki">
								<a href="/tiddlers.wiki">
									<img src="/bags/common/tiddlers/tiddlywiki2_blue.png" alt="Icon for TiddlyWiki" class="app-img" />
									TIDDLYWIKI
								</a>
							</li>
						</ul>
						<div id="addapp">
							<button class="inactive">Add More!</button>
						</div>
					</div>
					<div id="app-desc">
						<ul>
							<li class="htmlserialisationdesc"><p>an easy to understand HTML representation of your content.</p></li>
							<li class="tiddlywikidesc"><p>use TiddlyWiki to create, edit and organise your content.</p></li>
						</ul>
					</div>
					<div style="clear: both;"></div>
				</div>
			</div>
		</div>
		<div id="footer"><!-- ie doesn't support footer tag -->
			<div id="footer-content">
				<div class="links">
					<a href="http://blog.tiddlyspace.com">blog</a>
					<a href="http://featured.tiddlyspace.com">featured</a>
					<a href="http://docs.tiddlyspace.com">documentation</a>
					<a href="https://github.com/TiddlySpace/tiddlyspace">source</a>
				</div>
				<p>TiddlySpace 2011, created by <a href="http://osmosoft.com">Osmosoft</a></p>
			</div>
		</div>
	</div>
	
	<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/chrjs-store.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery-json.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/appspage.js"></script>
</body>
</html>
<!--{{{-->
<div id='messageArea'></div>

<div id='topMenu'>
    <div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
</div>

<div id='displayArea'>
    <div id='sidebarTabs'>
        <div class='sidebarHeader'>
            <div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
            <div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
            <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
            <div id='sidebarSearch' macro='search'></div>
        </div>
        <div class='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'>
        </div>
    </div>

    <div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.7.3|
|''Description''|Initializes new TiddlySpaces the first time they are created|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpaceInit.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig RandomColorPalettePlugin chrjs ImageMacroPlugin|
!TODO
* robust error notification and recovery
!MarkupPreHead
<!--{{{-->
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="%0's public feed" />
<link rel="canonical" href="%1/" />
<!--}}}-->
!Code
***/
//{{{
(function($) {

var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace;
var tweb = config.extensions.tiddlyweb;

var plugin = config.extensions.TiddlySpaceInit = {
	version: "0.6",
	SiteTitle: "%0",
	SiteSubtitle: "a TiddlySpace",
	flagTitle: "%0SetupFlag",
	flagWarning: "Please do not modify this tiddler; it was created " +
		"automatically upon space creation.",

	dispatch: function(ev) {
		var title = plugin.flagTitle.format([currentSpace.name]);
		config.annotations[title] = plugin.flagWarning;
		if(currentSpace.type != "private") {
			return;
		}
		var tiddlers = [];
		var tid = store.getTiddler(title);
		if(tid) {
			curVersion = parseFloat(tid.fields[versionField]);
			reqVersion = parseFloat(plugin.version);
			if(curVersion < reqVersion) {
				plugin.update(curVersion, tid);
				tid.fields[versionField] = plugin.version;
				tid.incChangeCount();
				tid = store.saveTiddler(tid);
				tiddlers.push(tid);
			}
		} else { // first run
			tid = new Tiddler(title);
			tid.tags = ["excludeLists", "excludeSearch", "excludePublisher"];
			tid.fields = $.extend({}, config.defaultCustomFields);
			tid.fields[versionField] = plugin.version;
			tid.text = "@@%0@@".format([plugin.flagWarning]);
			tid = store.saveTiddler(tid);
			tiddlers = tiddlers.concat(plugin.firstRun(), tid);
		}
		autoSaveChanges(null, tiddlers);
	},
	update: function(curVersion, flagTiddler) {
		if(curVersion < 0.2) {
			this.createAvatar();
		}
		if(curVersion < 0.3) {
			flagTiddler.tags.pushUnique("excludePublisher"); // XXX: never persisted
		}
		if(curVersion < 0.5) { // v0.4 was faulty
			this.setupMarkupPreHead();
		}
		if(curVersion < 0.6) {
			this.purgeSystemSettings();
		}
	},
	pubTid: {
		tags: ["excludeLists", "excludeSearch"],
		fields: $.extend({}, config.defaultCustomFields, {
			"server.workspace": tiddlyspace.getCurrentWorkspace("public")
		})
	},
	makeTiddlerIfNot: function(tiddler) {
		if (!store.tiddlerExists(tiddler.title)) {
			$.extend(true, tiddler, plugin.pubTid);
			return [store.saveTiddler(tiddler)];
		} else {
			return [];
		}
	},
	firstRun: function() {
		var tiddlers = [];
		// generate Site*itle
		$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
			var tid = new Tiddler(item);
			tid.text = plugin[item].format([currentSpace.name]);
			tiddlers.push.apply(tiddlers,
				plugin.makeTiddlerIfNot(tid));
		});
		// generate public ColorPalette
		var tid = new Tiddler("ColorPalette");
		tid.text = config.macros.RandomColorPalette.generatePalette({
			saturation_pale: 0.67, saturation_light: 0.53,
			saturation_mid: 0.43, saturation_dark: 0.06,
			pale: 0.99, light: 0.85, mid: 0.5, dark: 0.31
		},
			false);
		tiddlers.push.apply(tiddlers, plugin.makeTiddlerIfNot(tid));
		this.createAvatar();
		this.setupMarkupPreHead();
		return tiddlers;
	},
	// remove _cookie slices (TiddlyWiki 2.6.2 beta 6 remnants)
	purgeSystemSettings: function() {
		var ss = store.getTiddler("SystemSettings");
		if(ss) {
			var lines = ss.text.split("\n");
			var persistentOptions = $.grep(lines, function(line, i) {
				return line.indexOf("_cookie:") == -1;
			});
			ss.text = persistentOptions.join("\n");
			ss = store.saveTiddler(ss);
			autoSaveChanges(null, [ss]);
		}
	},
	createAvatar: function() {
		var avatar = "SiteIcon";
		var host = tweb.host;
		var notify = function(xhr, error, exc) {
			displayMessage("ERROR: could not create avatar - " + // TODO: i18n
				"%0: %1".format([xhr.statusText, xhr.responseText]));
			// TODO: resolve!?
		};

		var pubBag = tiddlyspace.getCurrentBag("public");
		var tid = new tiddlyweb.Tiddler(avatar);
		tid.bag = new tiddlyweb.Bag(pubBag, host);

		var callback = function(data, status, xhr) {}; // avatar already exists; do nothing
		var errback = function(xhr, error, exc) {
			if(xhr.status != 404) {
				return;
			}
			// copy default avatar
			var _notify = function(tid, status, xhr) {
				displayMessage("created avatar"); // TODO: i18n
				var image = config.macros.image;
				if(image && image.refreshImage) {
					var uri = "/%0/tiddlers/SiteIcon".
						format(tiddlyspace.getCurrentWorkspace("public"));
					image.refreshImage(uri);
					image.refreshImage("SiteIcon");
				}
			};
			var _callback = function(tid, status, xhr) {
				tid.title = avatar;
				tid.bag.name = pubBag;
				delete tid.etag;
				tid.put(_notify, notify); // TODO: add to current session document (via adaptor?)
			};
			tweb.getUserInfo(function(user) {
				var avatarTitle = currentSpace.name == user.name ?
					"defaultUserIcon" : "defaultSiteIcon";
				var tid = new tiddlyweb.Tiddler(avatarTitle);
				tid.bag = new tiddlyweb.Bag("common", host);
				tid.get(_callback, notify);
			});
		};
		tid.get(callback, errback);
	},
	savePublicTiddlerText: function(title, text, pubWorkspace) {
		var tid = new Tiddler(title);
		tid.text = text;
		tid.tags = ["excludeLists"];
		tid.fields = $.extend({}, config.defaultCustomFields);
		tid.fields["server.workspace"] = pubWorkspace;
		tid.fields["server.page.revision"] = "false";
		tid = store.saveTiddler(tid);
		autoSaveChanges(null, [tid]);
	},
	setupMarkupPreHead: function() {
		var pubWorkspace = tiddlyspace.getCurrentWorkspace("public");
		var existing = store.getTiddler("MarkupPreHead");
		if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
			var context = this;
			tweb.getStatus(function(status) {
				var text = markupPreHead.format(currentSpace.name,
					tiddlyspace.getHost(status.server_host, currentSpace.name));
				context.savePublicTiddlerText("MarkupPreHead", text,
					pubWorkspace);
			});
		}
		// also set up DefaultTiddlers
		var title = "DefaultTiddlers";
		existing = store.getTiddler(title) || new Tiddler(title);
		if(existing.fields["server.workspace"] != pubWorkspace) {
			var text = existing.text || store.getShadowTiddlerText(title);
			this.savePublicTiddlerText(title, text, pubWorkspace);
		}
	}
};

$(document).bind("startup", plugin.dispatch);

})(jQuery);
//}}}
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
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.4.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
  {{{@space}}} -- @space 
  {{{~@space}}} -- ~@space 
  {{{Tiddler@space}}} -- Tiddler@space
  {{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space 
  {{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
  {{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
  {{{[[@@space]]}}} -- [[@@space]]
  {{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
  {{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} space and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}.
Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */

function createSpaceLink(place, spaceName, title, alt, isBag) {
	var link, a, currentSpaceName, label;
	try {
		if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
			title = title || spaceName;
			a = createTiddlyLink(place, title, false);
			jQuery(a).text(alt || title);
			return a;
		}
	} catch (ex1) {
		currentSpaceName = false;
	}

	a = jQuery("<a />").addClass('tiddlySpaceLink externalLink').appendTo(place)[0];
	if(title) {
		jQuery(a).attr('tiddler', title);
	}
	if(isBag) {
		jQuery(a).attr('bag', spaceName);
	} else {
		jQuery(a).attr('tiddlyspace', spaceName);
	}

	config.extensions.tiddlyweb.getStatus(function(status) {
		link = status.server_host.url;
		if (title) {
			label = alt || title;
			link = link + "/" + encodeURIComponent(title);
		} else {
			label = alt || spaceName;
		}
		// assumes a http URI without user:pass@ prefix
		if(!isBag) {
			link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
		} else {
			link += "/bags/" + spaceName + "/tiddlers.wiki";
		}
		jQuery(a).attr("href", link).text(label);
	});
	return a;
}

(function ($) {

	config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]";
	config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";
	config.textPrimitives.bareTiddlerLetter = config.textPrimitives.anyLetterStrict;

	config.formatters.splice(0, 0, {
		name: "spacenameLink",
		match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
		lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
				w.outputText(w.output, w.matchStart, w.nextMatch);
				return;
			}
			if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
				w.outputText(w.output, w.matchStart + 1, w.nextMatch);
				return;
			}
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlySpaceLink",
		match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
				var space = lookaheadMatch[2] || alt;
				createSpaceLink(w.output, space, "", alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlyLinkSpacenameLink",
		match: "\\[\\[[^\\[]*\\]\\]@",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var title = lookaheadMatch[2] || lookaheadMatch[1];
				var alt = lookaheadMatch[1] || lookaheadMatch[2];
				createSpaceLink(w.output, lookaheadMatch[3], title, alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	});

	// ensure space links don't appear as missing links
	config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
	config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";

	// reevaluate derrived expressions ..
	config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");
	config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
		config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");

	// treat space links in titledBracketedLink as external links
	var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
	var isExternalLink = config.formatterHelpers.isExternalLink;
	config.formatterHelpers.isExternalLink = function(link) {
		return missingTiddlySpaceLink.test(link) || isExternalLink(link);
	};

}(jQuery));
//}}}
|~ViewToolbar|jump +editTiddler +cloneTiddler > fields refreshTiddler changeToPublic changeToPrivate revisions syncing permalink jump references closeOthers < closeTiddler|
|~EditToolbar|jump +saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
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
"they, who passed away long ago, still exist in us"
//''Lives Entwined In Us''// is a collection of family histories and genealogy research published by [[Andy Unrein|The Author]].

The [[Wiki|About This Site's Technology]] experience is meant to flow in a non-linear path of discovery chosen by each reader. Following a blue hyperlink does not take you to an entirely different webpage, but summons additional stories or pieces of media to flow into a growing column on your screen called "the story river."  This content can be dismissed by clicking or tapping the <<image GreyX 12 12>> close button at the top right of each story, above the icon of my [[daughter's eye|Sara]].

Clicking or tapping the @@color(grey):►@@ arrow at the top of the screen hides the right Wiki title, search box and sidebar, to widen the viewable area of the stories.  This arrow can be tapped again to bring back the sidebar.

Go ahead and try it out: follow the bold word ''Wiki'' in the second paragraph of this article, or here: [[About This Site's Technology]], which will show more content as explained.  What I call stories or articles are known as "tiddlers" by users of ~TiddlyWiki, and that term is used in some of the examples below.

[img[Wiki navigation example|http://farm3.staticflickr.com/2850/12162936064_2ce6496e58_d.jpg][http://www.flickr.com/photos/114151783@N05/12162936064/]] 
Stories are "tagged" with identifiers or categories that allow you to find similar content.  These tags are shown above each tiddler's title.  The above example shows related stories listed when you click/tap on the ''post'' tag.  Those tagged ''post'' automatically load, if recently edited, when you visit the main site //Lives Entwined In Us//.  Tags also exist to identify [[52Ancestors]] and <<tag tangential>> or distant family connections, among other categories.

Clicking on ''references'' at the top of a tiddler links backward to other stories that directly refer to this one.

[img[Wiki navigation example|http://farm4.staticflickr.com/3818/12162521375_b425ec1cba_d.jpg][http://www.flickr.com/photos/114151783@N05/12162521375/]]
Clicking on ''permalink'' creates a web link which you can bookmark or share by email to directly visit this particular story.  The above example also shows by clicking/tapping on ''jump'', a menu is displayed of all active stories you have displayed (and not closed.)  Choosing one from here is faster than scrolling through a long path of stories you've followed.

If you click or tap on the grey "eye" icon to the left of permalink, the raw story text is shown without pictures or formatting (text color, size, and wiki links.)
[img[Wiki navigation example|http://farm4.staticflickr.com/3777/12163181466_6caca8f587_b_d.jpg][http://www.flickr.com/photos/114151783@N05/12163181466/]]
The above example is the text marked up with codes that produces this formatted story for [[Katherine Maher Uhler]].  You can find references online to ~TiddlyWiki markup codes, and reading other people's examples is a good way to learn.

To the right of the stories is a timeline of all recently edited content, and a search box where you can type words to find any place they appear in the wiki.  The ''permaview'' tool above that creates a web link that will recreate the current story river with all the tiddlers presently being viewed, not just a single story's link.

Writing, editing, and assembling this content, from the author's standpoint, is even more dynamic and non-linear compared to traditional websites or blogs, and there are more tools for the writer than those shown above.  I encourage you to check out [[Tiddlyspace.com|http://tiddlyspace.com]], or [[email me|The Author]] with any questions about creating your own wiki.
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.2.0|
|''Status''|beta|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor|
!Usage
The viewRevisions macro can be attached to any element, which should be passed
in as a parameter.

For example:

&lt;&lt;viewRevisions page:10 link:"<<view modified date>>"&gt;&gt;

would show the revisions "stack of cards" view, 10 at a time, when the modified
date is clicked.
!Code
***/
//{{{
(function($) {

var me = config.macros.viewRevisions = {
	revisionTemplate: "RevisionTemplate",
	revSuffix: " [rev. #%0]", // text to append to each tiddler title
	defaultPageSize: 5, // default number of revisions to show
	defaultLinkText: "View Revisions", // when there's nothing else to use
	offsetTop: 30, // in px
	offsetLeft: 10, // in px
	shiftDownDelay: 50, // in ms
	visibleSlideAmount: 20, // amount of revisions to show on left hand edge after sliding
	zIndex: 100, // default z-index
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true)[0];
		var tiddlerElem = story.findContainingTiddler(place);

		var revButton;
		var pageSize = parseInt(params.page[0], 10) || me.defaultPageSize;
		var linkObj = params.link ? params.link[0] || me.defaultLinkText : false;
		if(linkObj) {
			revButton = $('<span class="button openRevisions" />')
				.appendTo(place);
			wikify(linkObj, revButton[0], null, tiddler);
		} else {
			revButton = place;
		}

		$(revButton).click(function() {
			if (!$(tiddlerElem).hasClass("revisions")) {
				me.showRevisions(tiddlerElem, tiddler, pageSize);
			} else {
				me.closeRevisions(tiddlerElem);
			}
		});
	},

	// initialisation for revision view
	showRevisions: function(tiddlerElem, tiddler, pageSize) {
		var context = {
			host: tiddler.fields["server.host"],
			workspace: tiddler.fields["server.workspace"]
		};
		$(tiddlerElem).addClass("revisions").attr("revName", tiddler.title);
		// ensure toolbar commands deactivate RevisionsView
		$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
			var _onclick = btn.onclick;
			btn.onclick = function(e) {
				me.closeRevisions(tiddlerElem);
				_onclick.apply(this, arguments);
			};
		});
		// ensure default action deactivates RevisionsView
		var _ondblclick = tiddlerElem.ondblclick;
		tiddlerElem.ondblclick = function(e) {
			me.closeRevisions(tiddlerElem);
			_ondblclick.apply(this, arguments);
		};
		var type = tiddler.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var userParams = {
			tiddlerElem: tiddlerElem,
			pageSize: pageSize,
			title: tiddler.title
		};
		me.createCloak(tiddlerElem);
		adaptor.getTiddlerRevisionList(tiddler.title, null, context, userParams,
				function(context, userParams) {
					// strip the current revision
					context.revisions.shift();
					me.expandStack(context, userParams);
				});
	},

	// fetch the actual revision and put it in the tiddler div
	showRevision: function(place, revision, callback) {
		var context = {
			host: revision.fields["server.host"],
			workspace: revision.fields["server.workspace"]
		};
		var userParams = {
			revElem: place
		};
		var type = revision.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var revNo = revision.fields["server.page.revision"];
		adaptor.getTiddlerRevision(revision.title, revNo, context, userParams,
			function(context, userParams) {
				var tiddler = context.tiddler;
				tiddler.title += me.revSuffix
					.format([$(place).attr("revision")]);
				tiddler.fields.doNotSave = true;
				if (store.getTiddler(tiddler.title)) {
					store.deleteTiddler(tiddler.title);
				}
				store.addTiddler(tiddler);

				//now, populate the existing div
				var revElem = userParams.revElem;
				$(revElem).attr("id", story.tiddlerId(tiddler.title));
				$(revElem).attr("refresh", "tiddler");
				var getTemplate = function() {
					var themeName = config.options.txtTheme;
					if (themeName) {
						return store.getTiddlerSlice(themeName,
							me.revisionTemplate) || me.revisionTemplate ||
							"ViewTemplate";
					} else {
						return (store.getTiddler(me.revisionTemplate)) ?
							me.revisionTemplate : "ViewTemplate";
					}
				};
				var template = getTemplate();
				story.refreshTiddler(tiddler.title, template, true);
				callback(tiddler);
			});
	},

	createCloak: function(promoteElem) {
		var el = $(promoteElem);
		// cache styles for resetting later
		el.data({
			top: el.css("top"),
			left: el.css("left"),
			zIndex: el.css("z-index")
		});

		$('<div class="revisionCloak" />').css("z-index", me.zIndex)
			.click(function() {
				me.closeRevisions(promoteElem);
			})
			.appendTo(document.body);

		el.css("z-index", me.zIndex + 1);
	},

	// clean up, removing all evidence of revision view
	closeRevisions: function(promoteElem) {
		var el = $(promoteElem);
		// revert the original tiddler back to its previous state
		el.removeAttr("revName").removeClass("revisions").css({
			top: el.data("top"),
			left: el.data("left"),
			zIndex: el.data("zIndex")
		});

		// remove any revisions still in the store
		var revisions = $(".revisions");
		revisions.each(function(index, revision) {
			var revAttributes = revision.attributes;
			if ((revAttributes.revname) &&
					(revAttributes.revision)) {
				var revName = revAttributes.revname.value;
				var revNo = revAttributes.revision.value;
				var title = revName + me.revSuffix.format([revNo]);

				if (store.getTiddler(title)) {
					store.deleteTiddler(title);
				}
			}
		});

		// delete the previous revisions
		revisions.remove();

		// remove the cloak
		$(".revisionCloak").remove();
	},

	// calback from getting list of revisions
	expandStack: function(context, userParams) {
		var pageSize = userParams.pageSize;

		var from = userParams.from || 0;
		var tiddlerElem = userParams.tiddlerElem;

		userParams.defaultHeight = $(tiddlerElem).height();
		userParams.defaultWidth = $(tiddlerElem).width();
		if (from < context.revisions.length) {
			me.displayNextRevision(tiddlerElem, userParams, context, from,
				from + pageSize - 1);
		}
	},

	// place the next div above and behind the previous one
	displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
		var revision = context.revisions[from];
		var callback = function() {
			var revText = revBtn.getRevisionText(tiddlerElem, revision);
			tiddlerElem = me.createRevisionObject(tiddlerElem, context,
				userParams, revText);
			$(tiddlerElem)
				.attr("revision", (context.revisions.length - from));
			if ((from < to) && ((from + 1) < context.revisions.length)){
				me.displayNextRevision(tiddlerElem, userParams, context,
					from + 1, to);
			} else if ((context.revisions.length - 1) > to) {
				me.showMoreButton(tiddlerElem, context, userParams, to + 1);
			}
		};
		me.shiftVisibleDown(userParams.title, callback);
	},

	createRevisionObject: function(tiddlerElem, context, userParams, text) {
		var newPosition = me.calculatePosition(tiddlerElem, context);
		return $('<div class="revisions tiddler" />')
			.css({
				position: "absolute",
				top: newPosition.top,
				left: newPosition.left,
				"z-index": me.zIndex + 1,
				height: userParams.defaultHeight,
				width: userParams.defaultWidth
			})
			.attr("revName", userParams.title)
			.append(text)
			.insertBefore(tiddlerElem);
	},

	// move the already present revisions down by 1 to fit the next one in
	shiftVisibleDown: function(title, callback) {
		var revisions = $("[revName='%0'].revisions".format([title]));
		var revisionCount = revisions.length;

		$(revisions).animate({top: "+=" + me.offsetTop},
				me.shiftDownDelay, function() {
					revisionCount -= 1;
					if ((callback) && (!revisionCount)) {
						callback();
					}
				});
	},

	// where we put the new revision
	calculatePosition: function(elem, context) {
		var offset = $(elem).offset();
		var currentPosition = $(elem).position();
		var newPosition = {
			top: currentPosition.top - me.offsetTop
		};
		if ((context.restrictLeft) ||
				((offset.left - me.offsetLeft) <
				$("#contentWrapper").offset().left)) {
			newPosition.left = $(elem).position().left;
			context.restrictLeft = true;
		} else {
			newPosition.left = currentPosition.left - me.offsetLeft;
		}
		return newPosition;
	},

	// equivalent of displayNextRevision, but for the more button
	showMoreButton: function(tiddlerElem, context, userParams, moreIndex) {
		userParams.from = moreIndex + 1;
		me.shiftVisibleDown(userParams.title, function() {
			var btn = me.createRevisionObject(tiddlerElem, context, userParams,
				"");

			var more = createTiddlyButton(btn[0], "more...", "show more revisions",
				function() {
					if ($(".viewRevision").length) {
						return;
					}
					userParams.tiddlerElem = btn[0];
					$(btn).text("")
						.append(revBtn
							.getRevisionText(btn[0], context.revisions[moreIndex]))
						.attr("revision", context.revisions.length - moreIndex);
					me.expandStack(context, userParams);
				});
			$(more).css("float", "right");
		});
	},

	stripRevFromTitle: function(revisionTitle) {
		return revisionTitle.split(/ ?\[rev\. #[0-9]+\]$/)[0];
	},

	onClickRevision: function(revElem, revision, callback) {
		// don't do anything if we are still loading
		if ($(".revisions").hasClass("loading")) {
			return null;
		}

		var origTitle = me.stripRevFromTitle(revision.title);
		if ($(revElem).hasClass("viewRevision")) {
			$(".revisions").addClass("loading");
			me.slideIn(revElem, revision, origTitle, function() {
				store.deleteTiddler(revision.title);
				revision.title = origTitle;
				$(revElem).text("").append(revBtn.getRevisionText(revElem,
						revision))
					.removeAttr("tags").removeAttr("tiddler")
					.removeAttr("refresh").removeAttr("template")
					.removeAttr("id");
				$(".revisions").removeClass("loading");
				if (callback) {
					callback();
				}
			});
			$(revElem).removeAttr("prevPos").removeClass("viewRevision");
		} else {
			var viewRevision = function() {
				var prevPos = $(revElem).position().left;
				$(revElem).addClass("viewRevision").attr("prevPos", prevPos);
				$(".revisions").addClass("loading");
				me.showRevision(revElem, revision, function(rev) {
					me.slideOut(revElem, rev, origTitle, function() {
						$(".revisions").removeClass("loading");
					});
				});
			};
			// make sure another revision isn't already out
			if ($(".viewRevision").length) {
				var newRevElem = $(".viewRevision")[0];
				var newRevision = store.getTiddler($(newRevElem)
					.attr("tiddler"));
				me.onClickRevision(newRevElem, newRevision, viewRevision);
			} else {
				viewRevision();
			}
		}
	},

	slideOut: function(revElem, revision, title, callback) {
		var leftMostPos = $("[revName='%0'].revisions".format([title]))
			.offset().left;
		var width = $(revElem).width();
		var originalLeftPos = $(story.getTiddler(title))
			.position().left;

		var slideAmount = leftMostPos + width - me.visibleSlideAmount;
		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "-=" + slideAmount}, 1000);
		$(revElem)
			.attr("baseHeight", $(revElem).css("height"))
			.css("height", "auto")
			.animate({left: originalLeftPos}, 1000, callback);
	},

	slideIn: function(revElem, revision, title, callback) {
		var slideAmount = $(revElem).offset().left -
			$(story.getTiddler(title)).offset().left;
		var origRevPos = $(revElem).attr("prevPos");

		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "+=" + slideAmount}, 1000);
		$(revElem).animate({left: origRevPos}, 1000, function() {
			$(revElem)
				.css("height", $(revElem).attr("baseHeight"))
				.removeAttr("baseHeight");
			callback();
		});
	}
};

var revBtn;
config.macros.slideRevision = revBtn = {
	btnText: "created by %0 at %1 on %2",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var btn = revBtn.getRevisionText(place, tiddler);
		$(place).append(btn);
	},

	getRevisionText: function(place, revision) {
		var text = revBtn.btnText.format([revision.modifier,
			revision.modified.formatString("0hh:0mm"),
			revision.modified.formatString("0DD MMM YYYY")]);
		var btn = $('<a href="javascript:;" class="button revButton" />')
			.text(text)
			.click(function() {
				var revElem = story.findContainingTiddler(this);
				me.onClickRevision(revElem, revision);
			});
		return btn;
	}
};

})(jQuery);
//}}}
 /* @@color:red; ''Important'': @@
To get future updates, keep this tiddler as is. Add custom CSS to...
;StyleSheetSpace
:as a user including @White
;StyleSheetApp
:as an app developer using @White */
/*{{{*/

/* DEFAULTS */

.clearFloat {
    clear: both;
}

#bs-serviceUpdate {
display: none;
}

body {
    font-size: 1em;
    font-family: helvetica, arial, sans-serif;
    background-color: [[ColorPalette::PageBackground]];
    color: [[ColorPalette::Foreground]];
}

body ul {
    margin: 0;
}

.right{
    float:right;
}

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

.viewer img {
    max-width:100%;
}

.viewer blockquote {
    border-left: 2px solid [[ColorPalette::TertiaryPale]];
}

.viewer table, table.twtable {
    border-collapse: collapse;
    margin: 5px 0;
    border: 1px solid [[ColorPalette::TertiaryMid]]  !important;
    max-width: 100%;
    word-break: normal;
    word-wrap: break-word;
}

.viewer tr, .viewer td,
.twtable tr, .twtable td {
    vertical-align:top;
    border: 1px solid [[ColorPalette::TertiaryMid]] !important;
}

.viewer th a:hover,
.viewer thead td a:hover,
.twtable th a:hover,
.twtable thead td :hover{
    color:[[ColorPalette::Background]] !important;
}

,viewer .listTitle{
    margin-left:0;
}

a,
.popup .button {
    color:[[ColorPalette::SecondaryDark]];
}

a:hover {
    text-decoration:underline;
    color:[[ColorPalette::SecondaryMid]];
    background:transparent;
}

a.tiddlyLink {
    font-weight:bold;
}

body .linkified .tiddlyLink.shadow,
a.tiddlyLink.shadow{
    color:[[ColorPalette::TertiaryMid]];
}

a.tiddlyLink.tiddlyLinkNonExisting {
    font-style:italic;
    font-weight:normal;
}

a.tiddlyLink:hover,
.popup .button:hover {
    background:none;
    color:[[ColorPalette::SecondaryMid]];
}

body .linkified .tiddlyLink{
    color:[[ColorPalette::SecondaryDark]];
}

body .linkified .tiddlyLink:hover{
    color:[[ColorPalette::SecondaryMid]];
}

.button,
.tagInfo ul li .button {
    color:[[ColorPalette::TertiaryMid]];
    background:[[ColorPalette::TertiaryPale]];
}

.button:hover,
.tagInfo ul li .button:hover {
    text-decoration:none;
    color:[[ColorPalette::Background]];
    background:[[ColorPalette::TertiaryMid]];
    border-color:[[ColorPalette::TertiaryLight]];
}

a.image:hover {
    background: transparent;
}

.tab{
    border: 1px solid [[ColorPalette::TertiaryLight]];
    border-bottom-color: [[ColorPalette::TertiaryPale]];
    background: [[ColorPalette::TertiaryLight]];
}

a.tabSelected,
.tabset .tab:hover {
    color:[[ColorPalette::TertiaryMid]];
    background: [[ColorPalette::PageBackground]];
    text-decoration: none;
}

.tabContents{
    background: [[ColorPalette::PageBackground]];
}

dd {
    margin-left: 20px;
}

dd:before {
    content: '» ';
}

iframe{
    width:98%;
    height:600px;
    border:2px solid [[ColorPalette::TertiaryPale]];
    z-index:0;
    position:relative;
}

object{
    z-index:0;
    position:relative;
}

.noTitle .listTitle{
    display:none !important;
}

.annotation{
    margin:0;
}

/* PAGE LAYOUT */

#displayArea {
    margin: 0;
    top: 0px;
    left: 0px;
    width: 100%;
    position: relative;
}

#contentWrapper {
    position: relative;
    padding-top: 1px;
    top: -1px;
}

#tiddlerDisplay,
#searchResults {
    margin: 8px 390px 0 42px;
    _position: relative; /* ie 6*/
}

* html #tiddlerDisplay {
    margin-top: 0px;
}


/* SEARCH */

#sidebarSearch {
    width: 200px;
}

#sidebarSearch .txtOptionInput {
    width: 100%;
    margin-top: 5px;
    _color: #bbb; /* ie6 danger */
}

#sidebarSearch .txtOptionInput:focus {
    color: #000;
}

#sidebarSearch .searchButton {
    display: none;
}

/* SIMPLESEARCH */
#searchResults {
     margin-top:0;
}

#displayArea #searchResults .button{
    padding:2px 6px;
    margin-right:3px;
    float:right;
}

/* FINDR */

#sidebarTabs #searchResults {
    margin: 0 1em 0 0;
}

#searchResults #findr-buttons{
    margin:0.5em 0 0 5px;
}

#displayArea #searchResults #findr-buttons {
    margin: 2.5em 0 0em 5px;
    float: right;
}

#searchResults .search_list .button{
    float:none !important;
    background:transparent;
    padding:2px;
    margin: 0;
}

#searchResults .search_list .button:hover{
    color:[[ColorPalette::SecondaryMid]];
}

.search_details strong{
   font-weight:normal;
   color:[[ColorPalette::TertiaryMid]];
}

.findr > strong{
    display: block;
    clear: both;
    padding-top: 0.5em;
}


/* TOPMENU */

#topMenu {
    left: 0;
    margin: 0.5em 32px 0 42px;
    clear:left;
    position: relative;
    padding: 0.5em 0 ;
    min-height: 1em;
    overflow: hidden;
    _width: 100%; /* for ie 6 */
}

/* MAIN MENU */

#mainMenu {
    color:[[ColorPalette::TertiaryLight]];
    position: static;
    text-align: left;
    margin: 0;
    float: left;
    width: auto;
    padding: 0;
    margin-left:4px;
    font-size: 1em;
    line-height: normal;
}

#mainMenu br{
   display:none;
}

#topMenu #sideBarOptions {
    margin-right:16px;
}

#mainMenu a,
#mainMenu .tiddlyLink,
#mainMenu .button,
#sidebarOptions a,
#sidebarOptions .button {
    margin: 0;
    background:none;
    color: [[ColorPalette::TertiaryMid]];
    font-size: 0.9em;
    padding: 4px 6px;
}

#sidebarOptions a,
#sidebarOptions .button {
    display:inline-block;
}

#mainMenu a:hover,
#mainMenu .tiddlyLink:hover,
#mainMenu .button:hover,
#sidebarOptions a:hover,
#sidebarOptions .button:hover {
    background:none !important;
    color:[[ColorPalette::TertiaryDark]];
}

#mainMenu .button,
#sidebarOptions .button {
    border: 1px solid transparent;
}

.topMenu #sidebarOptions {
    float: right;
    padding: 0;
    margin: 0 0 0 1em;
}


/* SIDEBAR */

#sidebarTabs {
    width: 360px;
    position: absolute;
    right: 0;
    top: 0;
}

#sidebarTabs .lf-search {
    background:transparent;
    padding:0 0 5px 0;
}
#sidebarTabs .lf-label{
    display:none;
}

#sidebarTabs .sidebarHeader{
    padding: 1em 0 0 10px;
}

#sidebarTabs .siteTitle,
#sidebarTabs .siteTitle a {
    display: block;
    font-size: 32px;
    line-height: 32px;
    font-weight:normal;
    color: [[ColorPalette::SecondaryDark]];
    background: transparent;
}

#sidebarTabs .siteTitle a:hover {
    color: [[ColorPalette::TertiaryDark]];
}

#sidebarTabs .siteSubtitle {
    display: block;
    float: none;
    font-size: 14px;
    margin: 1em 0 0 1em;
    color: [[ColorPalette::TertiaryMid]];
    clear: both;
    margin: 0;
}

#sidebarTabs #sidebarOptions {
    margin-top: 1em;
    padding:0;
}

#sidebarTabs #sidebarOptions .button:hover,
#sidebarTabs #sidebarOptions .button:active {
    color:[[ColorPalette::PrimaryMid]];
    text-decoration:none;
    background:transparent;
}

.sidebarTabs{
    clear:both;
    margin-top:1em;
}

#sidebarTabs .tabsetWrapper .tabset {
    width: 87px;
    text-align:right;
    border: 0;
    height: auto;
    float: left;
    word-wrap: break-word;
    top: 0;
    padding: 0 5px 0 0;
}

#sidebarTabs .tabContents li a:hover {
    color: [[ColorPalette::SecondaryMid]];
}

#sidebarTabs .tabsetWrapper .tabset .tab {
    font-size: 0.9em;
    padding: 2px 5px 2px 2px;
    color: [[ColorPalette::TertiaryMid]];
    background: transparent;
    border: 0;
    border-right: 1px solid [[ColorPalette::TertiaryLight]];
    line-height: 16px;
    position: relative;
    display: block;
    margin: 2px 0 0 0;
    background-color: #f9f9f9;
    background-image: linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -o-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -moz-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -webkit-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -ms-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabsetWrapper .tabset .tabSelected {
    border:0;
    border-right: 1px solid [[ColorPalette::TertiaryLight]];
    z-index: 10;
    color: [[ColorPalette::TertiaryMid]];
    background:transparent;
    text-decoration:none;
}

#sidebarTabs .tabsetWrapper .tabset a:hover{
    color: [[ColorPalette::SecondaryMid]];
}


#sidebarTabs .tabContents li {
    border: none;
    margin-left: 0;
    word-wrap: break-word;
}

#sidebarTabs .tiddlyLinkExisting{
    font-weight:normal;
}

.tabContents li.listTitle{
    font-size: 1em;
    border: 0;
    padding: 0.3em  0.11em;
    color: [[ColorPalette::TertiaryLight]];
}

#sidebarTabs .tabContents .list-missing a {
    font-style:italic;
}

.tabContents .timeline {
    background: transparent;
    margin-bottom: 8px;
}

#sidebarTabs .timeline li.listTitle {
    color: [[ColorPalette::TertiaryLight]];
    margin-left: 8px 0;
    padding: 0.3em 0.11em;
}

#sidebarTabs .tabContents div > ul > li.listTitle {
    padding-top:0;
}

#sidebarTabs .tabContents li a {
    display: block;
    text-align: left;
    margin: 0 0 1px 0;
    padding: 2px 0;
    background: transparent;
}

#sidebarTabs .tabsetWrapper .tabContents {
    position: relative;
    background-color: transparent;
    border: 0;
    width:16em;
    min-height: 200px;
    padding: 0 0 0 5px;;
    font-size: 0.9em;
}

.tabContents .listTitle:first-child {
    margin-top: 0px;
}

/*SUPPORT FOR SECONDARY TABS*/
#sidebarTabs > div > .tabsetWrapper > .tabset{
    padding-left:10px;
    width:90%;
    float:none;
    text-align:left;
}

#sidebarTabs > div > .tabsetWrapper > .tabset > .tab {
    display: inline-block;
    background: transparent;
    margin: 0 3px -1px 0;
    padding:2px 4px;
    color: [[ColorPalette::TertiaryMid]];
    background: [[ColorPalette::TertiaryPale]];
    border: 0;
    border-top: 2px solid [[ColorPalette::TertiaryPale]];
    border-bottom: 2px solid [[ColorPalette::TertiaryPale]];
}

#sidebarTabs > div > .tabsetWrapper > .tabset > .tab:hover,
#sidebarTabs > div > .tabsetWrapper > .tabset > .tabSelected {
    background: transparent;
    border-top-color: transparent;
    color: [[ColorPalette::SecondaryDark]];
}

#sidebarTabs > div > .tabsetWrapper > .tabContents{
    margin-top:5px;
}

#sidebarTabs > div > .tabsetWrapper .tabsetWrapper {
    margin-top:5px;
}

#sidebarTabs > div > .tabsetWrapper .tabsetWrapper > .tabset{
    width:70px;
}

#sidebarTabs > div > .tabsetWrapper .tabsetWrapper,
#sidebarTabs > div > .tabsetWrapper .tabsetWrapper > .tabContents{
    width:auto;
}


/* TIDDLER */

.tiddler {
    position: relative;
    padding:0;
    width: 100%;
    margin-bottom: 2em;
    border-top: 1px solid [[ColorPalette::TertiaryPale]];
    background: [[ColorPalette::Background]];
    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
    -moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
    box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
}

.heading {
    top: 22px;
    left: 0;
    width: 95%;
    padding: 1em 2.5% 5px 2.5%;
    border-bottom:3px solid [[ColorPalette::Dim]];
}

.tiddler .heading .title {
    position: relative;
    display: block;
    font-weight:normal;
    word-wrap: break-word;
    font-size:28px;
    line-height:28px;
    margin-right: 120px;
}

.tiddler .subtitle {
    display:block;
    float:left;
    font-style: normal;
    font-size: 0.9em;
    color: [[ColorPalette::TertiaryMid]];
    margin: 5px 0 0 0;
}

.tiddler .subtitle:hover {
    font-weight: normal;
    background: none;
}

.tiddler .subtitle a {
    color: [[ColorPalette::SecondaryMid]];
}

.tiddler .subtitle a:hover {
    color: [[ColorPalette::SecondaryDark]];
    background: [[ColorPalette::Background]];
}

.tiddler .headingClear {
    clear: both;
}

.tiddler .viewer {
    padding: 5px 2.5% 16px 2.5%;
    width: 95%;
    margin: 0;
    line-height: 1.4em;
    overflow:hidden;
}

.viewer pre {
    margin-left: 0;
}


/* TOOLBAR */

/* ie hacks */
.toolbar .svgIconText {
    *display: inline;
}

* html .toolbar {
    right: 8px;
}

.tiddler .originButton div {
    display: inline-block;
}

.tiddler .spaceSiteIcon .siteIcon {
    _display: inline; /* IE doesn't like inline-block */
}

.tiddler .originButton {
    display: block;
}

.originButton.highlight{
    background:transparent;
}

.content {
    width: 100%; /* IE */
    font-size: 0.9em;
}

/* TOOLBAR */ 


div.toolbar {
    visibility:hidden;
    right: -6px;
    position: absolute;
    padding: 0;
    top: 10px;
    z-index: 1;
}

.selected div.toolbar {
    visibility: visible;
}

div.tiddler .toolbar a {
    cursor: pointer;
    float: left\9;
    display: inline\9;
}

div.tiddler .toolbar a.command_deleteTiddler{
    margin-right: 34px !important;
}

.toolbar svg {
    width: 16px;
    height: 16px;
}

.toolbar svg .glyph {
    fill: #ccc;
}

.toolbar a:hover .glyph {
    fill: black;
}

.toolbar a:active .glyph {
    fill: [[ColorPalette::Background]];
}

.toolbar .moreCommand.highlight {
    background: none;
}

.tiddler .toolbar .button {
    border: none;
    display: inline;
    padding: 0px;
    margin-right: 16px;
    background:transparent;
}

.tiddler .tagged .listTitle {
    display: none;
}


/*! EDITMODE */

.heading.editorHeading {
    margin: 2em 0 0 0;
    width: 100%;
    padding: 0;
}

.tiddler .editor {
    padding: 0px;
    margin: 0 2.5%;
}

.heading .editor input {
    width: 99%;
    padding: 2px 0.5%;
    font-size: 0.8em;
    margin-top:1em;
}

.tiddler .heading .editor.title {
    font-size: 1.7em;
    line-height: normal;
}

.editor input, .editor textarea {
    width: 99%;
    padding: 2px 0.5%;
    border: 2px solid [[ColorPalette::TertiaryPale]];
}

.tagTitle {
    position: absolute;
    text-align: right;
    padding-right: 10px;
    top: 0px;
    margin-left: -95px;
    width: 100px;
}

.tagAnnotation {
    margin: 8px 0 0 20px;
    padding-bottom: 8px;
}

.annotationsBox {
    padding: 0;
    margin: 0 2.2% 0 2.5%;
}

.annotationsBox  .annotation {
    margin: 0;
    padding: 3px 5px;
}

.editorFooter {
    position: relative;
    padding: 0;
    margin-top: 16px;
    margin-left: 64px;
}

.tiddler .editorFooter .editor {
    padding-left: 0px;
}


/* TAGGING */
.selected .tagging,
.selected .tagging:hover {
    border: none;
    background: none;
}
.tagging {
    float: none;
    background: none;
    border: none;
}

.tagInfo {
    color: [[ColorPalette::TertiaryMid]];
    background: [[ColorPalette::Dim]];
    margin: 0;
    padding: 0;
    font-size:0.9em;
}

.tagInfo .tidTags,
.tagInfo .tagging{
    font-size:1em;
    padding: 0 0 2px 0;
}

.tagInfo ul {
    list-style: none;
    padding-left: 10px;
}

.tagInfo ul li {
    display:inline-block;
    margin-top:3px;
}

.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
    display:inline-block;
    width:60px;
    text-align: right;
    padding: 5px 5px 3px 0;
    text-align:right;
    color: [[ColorPalette::TertiaryLight]];
    margin:0;
}

.tagInfo .tagging ul li.listTitle + li {
   margin-top: -20px;
}

.tagInfo .tagging ul li {
    float: none;
    display: block;
    clear:left;
    margin-left: 65px;
}

.tagInfo .tagging ul li a {
    display:block;
}

.infoTags {
    padding: 3px 5px;
}

.infoTags .tidTags{
    max-width:75%;
}

.infoTags ul {
    padding-left:0;
}

/* POPUPS (/ SIDEBAR) */

.popup {
    padding:3px;
    border-color:transparent;
    background-color: [[ColorPalette::Background]];
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    -webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
    -moz-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
    box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
}

.popup ul,
.popup li {
    margin:0;
    padding:0;
    list-style-type:none;
}

.popup.block a{
    display:block;
}

.popup.block br{
    display:none;
}

.popup a,
.popup li a,
.popup a.button {
    padding:3px;
    color: [[ColorPalette::SecondaryDark]];
    border:0;
}

.popup a :hover,
.popup li a:hover,
.popup a.button:hover,
a.popupbutton.highlight {
    color: [[ColorPalette::SecondaryMid]];
    background: transparent;
}

.popup li a.tiddlyLink {
    font-weight: bold;
}

.taggedTiddlerList li:last-child a.tiddlyLink{
    font-weight:normal;
}

.popup li.disabled,
.popup li.listTitle {
    border-bottom: 1px solid [[ColorPalette::TertiaryPale]];
    color: [[ColorPalette::TertiaryMid]];
    font-weight:normal;
    padding:7px 5px;
    margin: 0;
}

.popup .button{
    background:transparent;
}

.popup.confirmationPopup,
.followList {
    font-size: 0.8em;
    padding: 1em;
    border: 0;
}

.popup.confirmationPopup .button {
    border: 0;
    margin: 4px 4px 0 4px;
    display: inline-block;
}

.popup.confirmationPopup .button:hover {
    background:transparent;
    color:[[ColorPalette::SecondaryDark]];
}

.popup hr{
    color: transparent;
    background: transparent;
    border: 0;
    border-bottom: 1px solid #ccc;
}

.listBreak{
   border-bottom: 1px solid  [[ColorPalette::TertiaryPale]];;
}

.listBreak div{
   display:none;
}


/* REVISIONS */

.revButton {
    float: right;
}

.revisionCloak {
    position: absolute;
    position: fixed !important;
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
    border: 0;
    margin: 0;
    padding: 0;
    opacity: 0.5;
    filter: alpha(opacity=50);
    background-color: #000;
}

.viewRevision .toolbar {
    right: 48px;
    top: 8px;
}

.viewRevision .modifierIcon img,
.viewRevision .modifierIcon svg {
    margin-right: 16px;
}

.viewRevision .toolbar svg {
    width: 32px;
    height: 32px;
}


/* ACTIVITY */

#sidebarTabs .tabContents .activityStream .feedItem a {
    display: inline-block;
    padding: 0;
    background: none;
}


/* FOLLOWING */

.tiddler .followPlaceHolder {
    display: block;
    position: absolute;
    top: 58px;
    right: 60px;
    _right: 126px; // add width of modifierIcon
}

.followButton a {
    position: absolute;
    top: 0px;
    right: 0;
    display: block;
    margin: 0;
    padding: 6px 20px;
    background: transparent;
    text-align: center;
    color: [[ColorPalette::TertiaryMid]];
    display: block;
    margin-top: 0px;
}

.followButton a:hover {
    color: [[ColorPalette::TertiaryMid]];
    text-decoration: none;
}

.followButton.hasReplies a {
    font-weight:bold;
    color: [[ColorPalette::SecondaryMid]];
}

.followButton.hasReplies a:hover {
    color: [[ColorPalette::SecondaryDark]];
}


* html .followButton a {
    margin: 0px 8px 0 0;
}

.tiddler .followButton {
    width: 36px;
    position: relative;
    height: 22px;
    text-align: left;
    color:  [[ColorPalette::SecondaryDark]];
    background: [[ColorPalette::TertiaryPale]];
    padding: 10px 0px 0px 10px;
    margin: -16px -8px 0 0;
}

/* the triangle */
.followButton:before {
    content: "\00a0";
    display: block; /* reduce the damage in FF3.0 */
    position: relative;
    bottom: 0px;
    left: -25px;
    width: 0;
    height: 0;
    border-width: 15px 15px 0 0;
    border-style: solid;
    border-color: transparent [[ColorPalette::TertiaryPale]];
}

.followList .listTitle {
    text-decoration: underline;
}

.followTiddlersList .label {
    display: block;
    left: 10px;
    top: 0px;
    line-height: 16px;
    position: relative;
}

#popup.followList {
    margin: 10px 0 0 -335px;
    max-width: 400px;
}

#popup .followTiddlersList a {
    display: inline;
    padding: 0;
}

#popup .followTiddlersList ul{
   margin:0;
   padding:0;
}

#popup .followTiddlersList li{
    position: relative;
    display: block;
    clear: both;
    margin-bottom: 8px;
}

#popup .followTiddlersList .siteIcon{
    height: auto;
    width: auto;
    margin-right:5px;
}


/* ICONS */

.titleBar .hideIcon .image {
    display: none;
}

.titleBar .siteIcon,
.titleBar .label {
    display: inline;
}

.siteIcon .label {
    color: [[ColorPalette::TertiaryDark]];
}

.tiddler .spaceSiteIcon {
    float: left;
    margin: 0 5px 0 0;
    position: relative;
    display: block;
}

/* for following */
#popup .siteIcon {
    float: left;
    height: 25px;
}

.originButton,
.followPlaceHolder,
.tiddler .subtitle {
    cursor: pointer;
}

.originButton img,
.originButton svg {
    margin-left: 0px;
}

.modifierIcon .externalImage .image a:hover,
.spaceSiteIcon .externalImage .image a:hover {
    background: none;
}

.modifierIcon {
    position: absolute;
    width: 42px;
    top: 42px;
    right: 0;
    text-align: right;
}

.modifierIcon img,
.modifierIcon svg {
    margin-right: 16px;
}

.editSpaceSiteIcon .originButton {
    cursor: auto;
}

.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
    margin:  0 5px 5px 3px;
    width: 16px;
    height: 16px;
}

.editSpaceSiteIcon, .privacyEdit {
    float: left;
}

.editSpaceSiteIcon svg,
.editSpaceSiteIcon img,
.editSpaceSiteIcon .roundelLabel {
    float: left;
}

.tiddler .privacySettings {
    text-align: center;
}
.tiddler .privacySettings .originButton {
    display: inline;
}


/* BACKSTAGE */

#app-picker:hover{
    background-color:transparent;
}

#backstageToolbar {
    padding-left: 50px;
}

#backstageToolbar .backstageTask {
    background: transparent;
    color: [[ColorPalette::TertiaryPale]] !important;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask:hover {
    text-decoration:none;
    background: transparent;
    color: [[ColorPalette::Background]] !important;
}

/* MESSAGE AREA */

#messageArea {
    position: fixed;
    top: 0 !important;
    right: 0;
    width:350px;
    margin:0;
    padding:7px 1%;
    font-size:0.9em;
    border:1px solid [[ColorPalette::SecondaryMid]];
    background:[[ColorPalette::SecondaryPale]];
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    border-radius:3px;
}

#messageArea .messageToolbar {
    display:block;
    float:right;
    padding:0.1em;
    text-align:right;
    width:60px;
}

#messageArea a,
#messageArea .button {
    background:transparent;
    text-decoration:none;
    color:[[ColorPalette::TertiaryDark]];
    border:0;
}

#messageArea a:hover{
    color:black;
    border-bottom:1px solid [[ColorPalette::TertiaryDark]];
}

#backstageToolbar {
    text-align:center;
}

/* RESPONSIVE */

@media all and (max-device-width: 480px) {
    div.toolbar {
        visibility:visible;
    }
}

@media only screen and (device-width: 768px) {
    div.toolbar {
        visibility:visible;
    }
}

@media all and (max-width: 960px){
    #tiddlerDisplay,
    #searchResults {
        margin: 16px 366px 0 16px;
    }

    #mainMenu {
        margin-left: 16px;
    }

    #sidebarSearch,
    #sidebarOptions,
    #sidebarTabs {
        right: 16px;
        width: 326px;
    }

    #sidebarTabs .tabsetWrapper .tabset {
        font-size: 0.9em;
        width: 77px;
    }

    #sidebarTabs .tabsetWrapper .tabContents {
        width:auto;
        padding:0 0 0 5px;
    }

    #sidebarTabs .tabContents li a {
        font-size: 0.9em;
    }


     /* TIDDLER */

    .tiddler .modifierIcon img,
    .tiddler .modifierIcon svg,
    .tiddler .spaceSiteIcon .originButton img,
    .originButton svg {
        width: 12px;
        height: 12px;
        margin-left: 0px;
        margin-right: 0px;
    }

    .tiddler .viewer {
        margin: 0;
        padding-top: 0;
    }

    br {
        line-height: 0.5em;
    }
}


/* PRINT */

@media print {
    #mainMenu,
    #sidebar,
    #messageArea,
    .toolbar,
    .followPlaceHolder,
    #backstageButton,
    #backstageArea,
    #sidebarTabs,
    #sidebarSearch .txtOptionInput,
    #sidebarOptions {
        display: none !important;
    }
    #displayArea {
        margin: 1em 1em 0em;
    }

    #tiddlerDisplay {
        margin: 16px 16px;
    }

    /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
    noscript {
        display:none;
    }
}

[[StyleSheetApp]]
[[StyleSheetSpace]]
/*}}}*/
[[Lives Entwined In Us]]
!Sara Madelyn Unrein
[img[SiteIcon]]
//age 4-1/2, summer 2013//

&nbsp;
…hidden in ourselves
that code of DNA,
that secret spiral ladder
made up of bits and pieces
of the past that never dies
but lives entwined in us

—From "The Rope" by Loren Eiseley

----

And yet they, who passed away long ago,
still exist in us, as predisposition,
as burden upon our fate,
as murmuring blood, and as gesture
that rises up from the depths of time.

—From Letter Six, 23 December 1903,
//Letters to a Young Poet// by Rainer Maria Rilke
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.6|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceToolbar.js|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|ImageMacroPlugin|
|''Keywords''|toolbar icons SVG|
!Description
replaces tiddler toolbar commands with SVG icons if available
!Notes
requires [[ImageMacroPlugin|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/ImageMacroPlugin/plugins/ImageMacroPlugin.tid]]

SVG icons are drawn from tiddlers titled {{{<command>.svg}}}
In readonly mode a tiddler called {{{<command>ReadOnly.svg}}} will be used if it exists.
!TODO
* rename (IconToolbarPlugin?)
* support more than one more popup menu in the toolbar.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var macro = config.macros.toolbar;

macro.icons = {
	cloneTiddler: "editTiddler"
};

var _handler = macro.handler;
macro.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	var toolbar = $(place);
	toolbar.attr({
		refresh: "macro",
		macroName: macroName
	}).data("args", arguments);
	var status = _handler.apply(this, arguments);
	if(tiddler.isReadOnly()) {
		toolbar.addClass("toolbarReadOnly");
	} else {
		toolbar.removeClass("toolbarReadOnly");
	}
	var parsedParams = paramString.parseParams("name")[0];
	if(parsedParams.icons && parsedParams.icons == "yes") {
		this.augmentCommandButtons(place);
	}
	if(parsedParams.more && parsedParams.more == "popup") {
		// note we must override the onclick event like in createTiddlyButton
		// otherwise the click event is the popup AND the slider
		$(".moreCommand", place).each(function(i, el) {
			el.onclick = macro.onClickMorePopUp;
		});
		// buttons that are after a less command should not be in more menu.
		$(".lessCommand ~ .button", place).appendTo(place);
		$(".lessCommand", place).remove();
	}
	return status;
};

macro.refresh = function(place, params) {
	var args = $(place).empty().data("args");
	this.handler.apply(this, args);
};

var imageMacro = config.macros.image;
macro.augmentCommandButtons = function(toolbar) {
	$(".button", toolbar).each(function(i, el) {
		var cmd = $(el).attr("commandname");
		cmd = cmd ? cmd : "moreCommand"; // XXX: special-casing of moreCommand due to ticket #1234
		var icon = store.tiddlerExists(cmd) ? cmd : macro.icons[cmd];
		var text = $(el).text();
		if(readOnly) {
			var readOnlyAlternative = "%0ReadOnly".format([icon]);
			if(store.tiddlerExists(readOnlyAlternative)) {
				icon = readOnlyAlternative;
			}
		}
		if(store.tiddlerExists(icon)) {
			$(el).css({display: "inline-block"}).empty();
			imageMacro.renderImage(el, icon, { alt: text });
		}
	});
};

// provide onClickMore to provide extra commands in a popup
macro.onClickMorePopUp = function(ev) {
	ev = ev || window.event;
	var sibling = this.nextSibling;
	if(sibling) {
		var commands = sibling.childNodes;
		var popup = Popup.create(this);
		$(popup).addClass("taggedTiddlerList");
		for(var i = 0; i < commands.length; i++) {
			var li = createTiddlyElement(popup, "li", null);
			var oldCommand = commands[i];
			var command = oldCommand.cloneNode(true);
			command.onclick = oldCommand.onclick;
			li.appendChild(command);
		}
		Popup.show();
	}
	ev.cancelBubble = true;
	if(ev.stopPropagation) {
		ev.stopPropagation();
	}
	return false;
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;

config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
	".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);

var search = config.macros.tsSearch = {
	locale: {
		advanced: "Advanced Options",
		header: "Search",
		resultsHeader: "Results (%0)",
		find: "find",
		noResults: "No tiddlers matched your search query",
		query: "QUERY: ",
		error: "please provide a search query or a tag, modifier or title!",
		titleAdvanced: "where the title is",
		modifierAdvanced: "where the last modifier is",
		spaceAdvanced: "only in the space: ",
		notspaceAdvanced: "but not in the spaces: ",
		tagsAdvanced: "with the tags: "
	},
	andConstructor: function(container, label, fieldname, negationMode) {
		var tags = $("<div />").appendTo(container);
		$('<span />').text(label).appendTo(tags);
		var id = "area" + Math.random();
		container = $("<span />").attr("id", id).appendTo(tags)[0];
		function add(container) {
			var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
			if(negationMode) {
				el.attr("negation", "true");
			}
		}
		add(container);
		var el = $("<button />").text("AND").click(function(ev) {
			add($(ev.target).data("container"));
			ev.preventDefault();
		}).appendTo(tags);
		$(el).data("container", container);
	},
	fieldConstructor: function(container, label, field) {
		container = $("<div />").appendTo(container)[0];
		$("<span />").text(label).appendTo(container);
		$("<input />").attr("text", "input").attr("field", field).appendTo(container);
	},
	advancedOptions: function(form) {
		var locale = search.locale;
		var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
		$("<h2/ >").text(search.locale.advanced).appendTo(container);
		$("<div />").addClass("separator").appendTo(container);
		search.fieldConstructor(container, locale.titleAdvanced, "title");
		search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
		search.fieldConstructor(container, locale.spaceAdvanced, "space");
		search.andConstructor(container, locale.notspaceAdvanced, "space", true);
		search.andConstructor(container, locale.tagsAdvanced, "tag");
	},
	constructSearchQuery: function(form) {
		var data = [], select = [];
		var query = $("[name=q]", form).val();
		if(query) {
			data.push("q=%0".format(query));
		}

		// add tags, fields etc..
		$("[field]", form).each(function(i, el) {
			var val = $(el).val();
			var name = $(el).attr("field");
			var negate = $(el).attr("negation") == "true";
			if(val && name) {
				val = encodeURIComponent(val);
				val = negate ? "!" + val : val;
				if(name == "space") {
					val += "_public";
					name = "bag";
				}
				if(negate) {
					select.push("select=%0:%1".format(name,val));
				} else {
					var prefix = data.length === 0 ? "q=" : "";
					data.push('%0%1:"%2"'.format(prefix, name, val));
				}
			}
		});
		var dataString = data.join(" ");
		if(dataString.length === 0 && !query) {
			return false;
		}
		var selectStatement = select.join("&");
		if(dataString.length > 0 && selectStatement.length > 0) {
			dataString += "&";
		}
		dataString += selectStatement;
		return "/search?%0".format(dataString);
	},
	constructForm: function(place) {
		var locale = search.locale;
		$("<h1 />").text(locale.header).appendTo(place);
		var form = $("<form />").appendTo(place)[0];
		$('<input type="text" name="q" />').appendTo(form);
		$('<input type="submit" />').val(locale.find).appendTo(form);
		search.advancedOptions(form);
		var query = $('<h2 class="query"/>').appendTo(place)[0];
		var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
		var lookup = function(url) {
			if(!url) {
				results.empty().addClass("error").text(locale.error);
				return;
			}
			config.extensions.tiddlyweb.getStatus(function(status) {
				$(query).text(locale.query);
				var href = status.server_host.url + url;
				$("<a />").attr("href", href).text(href).appendTo(query);
				tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
					template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
						$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
					}
				});
			});
		};
		$(form).submit(function(ev) {
			ev.preventDefault();
			var url = search.constructSearchQuery(form);
			config.macros.tsSearch.lastSearch = url;
			lookup(url);
		});
		if(search.lastSearch) {
			lookup(search.lastSearch);
		}
		return form;
	},
	handler: function(place) {
		var container = $("<div />").addClass("searchForm").appendTo(place)[0];
		search.constructForm(container);
	}
};

})(jQuery);
//}}}
Comments on this site are powered by Disqus. Just click the shaded bar at the bottom of each entry / story:
@@background-color:#F0F0F0;font-size:110%;color(grey):&nbsp;&nbsp;Show comments for ''Wiki Entry'' """//"""&nbsp;&nbsp;&nbsp;@@

If you choose to leave a comment, your email address is required, but you can check the box "I'd rather post as guest" so that no password is required.
[img[Powered by Disqus|http://farm6.staticflickr.com/5531/11902485234_269397dc67_o_d.jpg][http://www.flickr.com/photos/114151783@N05/11902485234]]
!What Is A Wiki?
*[[TiddlyWiki|http://tiddlywiki.com/]] was released by Jeremy Ruston in 2004, and created as "a non-linear personal web notebook" which he still actively maintains.  See tips for [[Navigating This Wiki]].
* A Wiki is well suited to genealogy research, allowing spontaneous inter-connections to be made. Stories, lists, images and quoted passages from my research can all be gathered in one portable file. The text portion of ~TiddlyWikis can be edited on or offline.  The technology is explained in more detail in the [[Wikipedia article|http://en.wikipedia.org/wiki/TiddlyWiki]]; Wikipedia itself being a "cousin technology" built on Wiki principles.
* This website is built upon ''~TiddlyWiki'' and hosted by [[Tiddlyspace|http://tiddlyspace.com/]]. Images are stored at Yahoo's Flickr service.
/bags/common/tiddlers/jquery.js
http://htmljs.tiddlyspace.com/htmljs-disqus
Click the "new tiddler" button towards the top right of the screen to write something in your space. You'll need to give it a title, some content and, optionally, some tags that will help you identify it later.

!Stuck for ideas?
Not sure what to write about? Not sure what to keep in your space? Other people use ~TiddlySpace for almost anything. How about some of the following:

* [[Save interesting sites|http://bookmarks.tiddlyspace.com]], images or articles from around the web so that you can refer back to them.
* [[Record your family tree|http://familytree.tiddlyspace.com]], store notes on long lost relatives or ancestors and map their relationship to you.
* [[Make up a pocketbook|http://pocketbook.tiddlyspace.com]] to store some useful information in, then print it out, [[fold it up|http://www.pocketmod.com/]], and take it with you.
* [[Plan your holiday|http://the-web-is-your-oyster.tiddlyspace.com/]], record where you're planning to go, note down places of interest and refer back to it later.
* [[Create a mindmap|http://mindmaps.tiddlyspace.com/]] to visualise your inner thoughts and see how they relate to each other.
* [[Set up a questionnaire|http://questionnaire.tiddlyspace.com/]] and get all your friends to answer it.

If you don't like any of those ideas, you can still use this space directly to keep notes and link them together, make a todo list and keep track of everything you're doing, or any one of a hundred million other things.

Still stuck? Check out the @featured space for more suggestions.

You can also [[socialise with others|How to socialise]].
/* Use this tiddler for your custom CSS and leave StyleSheet to get theme updates. */
/*{{{*/
@font-face {
	font-family: 'Vollkorn';
	font-style: normal;
	font-weight: normal;
	src: local('Vollkorn'), url('http://fonts.tiddlyspace.com/Vollkorn-Regular.ttf') format('truetype');
}
/* I can't get this blue emphasis style to work, upon my first attempt */
.bluem {
 font-style: italic;
 color: [[ColorPalette::SecondaryDark]];
}
.serif {
 font-family: serif;
 font-size: 110%;
}
.rjustify {
 text-align: right;
}
.ljustify {
 text-align: left;
}
.center {
 text-align: center;
}
.font125 {
 font-size: 125%;
}
.font150 {
 font-size: 150%;
}
.siteTitle{
  font-family: 'Vollkorn';
}

#topMenu,
.siteSubtitle {
  font-family: 'Vollkorn';
}

#sidebarOptions .btn-history-none,
#sidebarOptions .popup .btn-history-current{
    color:[[ColorPalette::TertiaryPale]];
    cursor:default !important;
}

.frmTypeWithMe {
    margin-left:1%;
    width:86%;
}

.popList a{
    display: block;
    padding: 5px 7px;
}

.popList br{
    display:none;
}

.admin a.tiddlyLink {
    color:transparent !important;
    margin-left:20px !important;
    padding: 3px 20px !important;
}

.adminLinks a{
    display:block;
}

.infoBox{
    display:block;
    float:right;
    margin: 10px 0 10px 10px;
    text-align:center;
}

.infoBox h1{
    padding:0;
    margin: 0;
}

.infoBox .tiddlyLink{
    display:block;
    font-size:1.4em;
    line-height:1.4em;
}

.viewer .listTitle {
    margin-left:0;
}

.followersFollowers .spaceName {
    list-style-type:none;
    float:left;
    min-height:30px;
    min-width: 150px;
}

#tiddlerDisplay .tbScan,
#tiddlerDisplay .followersFollowers{
    margin:1em 0 0 0;
    overflow:auto;
}

#tiddlerDisplay .scanResults > ul,
.followersFollowers .followers > ul{
    margin:0;
    padding:0;
}

.scanUser {display:block;display:block;font-size:1.5em;height:2em;margin-top:10px;padding:0.5em 0.3em 0;background:[[ColorPalette::TertiaryPale]];margin-top:5px;-moz-border-radius-topleft:10px;-moz-border-radius-topright:10px; -webkit-border-radius-topleft:10px;-webkit-border-radius-topright:10px;border-radius-topleft:10px;border-radius-topright:10px;}
.scanUser .externalImage,.scanUser .image{display:block;float:left;margin:-0.3em 0.5em 0 0 ;}
.scanText {display:block;background:[[ColorPalette::SecondaryPale]];font-size:0.9em;padding:0.5em;-moz-border-radius-bottomleft:10px;-moz-border-radius-bottomright:10px; -webkit-border-radius-bottomleft:10px;-webkit-border-radius-bottomright:10px;border-radius-bottomleft:10px;border-radius-bottomright:10px;}
.tbScan .scanResults blockquote {border-left:2px solid [[ColorPalette::SecondaryDark]];margin:0.7em 0 0.7em 0.7em;padding-left:0.5em;}
.tbScan .scanResults .spaceName li {list-style-type:circle;margin:0.7em 0 0.7em 0.7em;padding-left:0.5em;}
.tbScan .scanResults code{color:[[ColorPalette::SecondaryDark]];}

/* UNVERIFIED */

.video,.video object{z-index:0;position:relative;}

.activityList ul{list-style-type:none;}
.activityList .listItem,.activityList .listLink, .activityList ul, .activityList li,.activityList .image,.activityList .label {display:block;float:left;}
.activityList .listLink, .activityList .groupBy{clear:both;float:left;}
.activityList .label {padding-left:5px;}
.activityList .label a {font-style:normal; font-weight:bold;}
.activityList .siteIcon {padding:5px;float:left;}

.linkified .tiddlyLink {color: #33a !important;}
.iconTabs .tab {padding: 18px 0 1px 0 !important;}
.iconTabs .tabContents .timeline,
.viewer .tabContents .timeline {background: transparent !important;}

#sidebarTabs .tabsetWrapper .iconTabs .tabset {min-height: 32px;margin:-7px 0 7px 0;}
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tabSelected,
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tab {margin: 0 !important; padding: 16px 0 0 0 !important;}
#sidebarTabs .tabIcon {margin: -13px 3px 0 3px;}
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tabSelected,
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tab:hover {background: [[ColorPalette::TertiaryLight]];}

.linkList .lf-list > ul > li em {
    font-size:1.4em;
    font-style:normal;
}

.linkList .lf-list > ul > li li em {
    font-size:1.2em;
}

.toolbarReadOnly .button{
    display: inline;
}

.discuss_panel{
    margin:1em;
}

.pinkish.button, .pinkish.popup{
    background:#fee;
}

.plugin + br{
    display:none;
}

.plugin{
    border:2px solid  [[ColorPalette::PageBackground]];
    padding:5px;
    margin:7px 0;
    background:[[ColorPalette::Dim]];
}

.plugin:hover{
    background:[[ColorPalette::PageBackground]];
}

.plugin > .title > a {
    display:block;
    line-height: 1.4em;
    padding:3px;
}

.plugin .lf-found {
    background:inherit;
}

.plugin.lf-found {
    background: inherit;
}


/* FINDR */
#sidebarTabs #searchResults {
    margin: 0 1em 0 0;
}

#searchResults #findr-buttons{
    margin:0.5em 0 0 5px;
}

#searchResults .search_list .button{
    float:none;
    background:transparent;
    padding:2px;
    margin: 0;
}

#searchResults .search_list .button:hover{
    color:[[ColorPalette::SecondaryMid]];
}

#searchResults #findr-buttons .button{
    float:none;
}

.search_details strong{
   font-weight:normal;
   color:[[ColorPalette::TertiaryMid]];
}

.findr > strong{
    display: block;
    clear: both;
    padding-top: 0.5em;
}

/* PLUGIN PREVIEWS */

.preview img {
    float: right;
    width: 300px;
    margin-left:10px;
    border:5px solid [[ColorPalette::PageBackground]];
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}

.modifierIcon  .siteIcon img {
    z-index: 0;
    -webkit-border-radius: 30px;
    -moz-border-radius: 30px;
    border-radius: 30px;
}

.modifierIcon .siteIcon{
    webkit-border-radius: 30px;
    -moz-border-radius: 30px;
    border-radius: 30px;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
    height: 32px;
    width: 32px;
    border: 10px solid transparent;
    position: absolute;
    left: -20px;
    top: -10px;
}

.tiddler .followPlaceHolder {
    right: 72px;
}

[[StyleSheetContact]]
/*}}}*/
<!--{{{-->
<div class='toolbar'
	macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'>
</div>
<div class='heading editorHeading'>
	<div class='editor title' macro='edit title'></div>
	<div class='tagClear'></div>
</div>
<div class='annotationsBox' macro='annotations'>
	<div class='editSpaceSiteIcon'
		macro='tiddlerOrigin height:16 width:16 label:no interactive:no'>
	</div>
	<div class="privacyEdit" macro='setPrivacy label:no interactive:no'></div>
	<div class='tagClear'></div>
</div>
<div class='editor' macro='edit text'></div>
<div class='editorFooter'>
	<div class='tagTitle'>tags</div>
	<div class='editor' macro='edit tags'></div>
	<div class='tagAnnotation'>
		<span macro='message views.editor.tagPrompt'></span>
		<span macro='tagChooser excludeLists'></span>
	</div>
	<div macro="editFields"></div>
</div>
<!--}}}-->
/***
|''Name''|TiddlySpaceFilters|
|''Description''|provide TiddlySpace-specific filter extensions|
|''Author''|Jon Robson|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''CoreVersion''|2.6.2|
|''Requires''|TiddlySpaceConfig|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>
<<tsList Draft>>
}}}
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var privateBag = tiddlyspace.getCurrentBag("private");
var publicBag = tiddlyspace.getCurrentBag("public");

config.filterHelpers = {
	is: {
		"private": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == privateBag;
		},
		"public": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == publicBag;
		},
		draft: function(tiddler) {
			var fields = tiddler.fields;
			var bag = fields["server.bag"];
			return (privateBag == bag && fields["publish.name"]) ? true : false;
		},
		local: function(tiddler) {
			return config.filterHelpers.is["public"](tiddler) ||
				config.filterHelpers.is["private"](tiddler);
		},
		unsynced: function(tiddler) {
			return tiddler ? tiddler.isTouched() : false;
		}
	}
};

config.filters.is = function(results, match) {
	var candidates = store.getTiddlers("title");
	var type = match[3];
	for (var i = 0; i < candidates.length; i++) {
		var tiddler = candidates[i];
		var helper = config.filterHelpers.is[type];
		if(helper && helper(tiddler)) {
			results.pushUnique(tiddler);
		}
	}
	return results;
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="450 366 38 57"
width="30" height="30">
	<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
		<g>
			<path d="M 452.1094 421.2422 L 450 421.2422 L 450 423 L 487.9688 423 L 487.9688 421.2422 L 485.8595 421.2422 
			L 485.8595 377.29688 L 487.9688 377.29688 L 487.9688 375.53906 L 485.8595 375.53906 
			C 485.8595 375.53906 481.12463 371.59341 473.02023 370.52802 C 472.6824 368.9689 471.72098 366.75 468.9844 366.75 
			C 466.24783 366.75 465.28638 368.9689 464.94864 370.52802 
			C 456.84418 371.59341 452.1094 375.53906 452.1094 375.53906 L 450 375.53906 L 450 377.29688 L 452.1094 377.29688 
			Z M 467.12247 370.32086 L 467.12247 370.32086 C 467.3805 369.42395 467.90762 368.50781 468.9844 368.50781 
			C 470.0612 368.50781 470.5883 369.42395 470.84634 370.32086 
			C 470.24136 370.2848 469.62054 370.26562 468.9844 370.26562 
			C 468.34827 370.26562 467.72748 370.2848 467.12247 370.32086 Z M 454.21875 420.92804 L 454.21875 420.92804 
			C 455.46762 420.42087 456.32816 419.35281 456.32816 418.11716 L 456.32816 377.29688 L 458.4375 377.29688 
			L 458.4375 421.2422 L 454.21875 421.2422 Z M 460.5469 420.92804 L 460.5469 420.92804 
			C 461.79578 420.42087 462.65625 419.35281 462.65625 418.11716 L 462.65625 377.29688 L 464.76566 377.29688 
			L 464.76566 421.2422 L 460.5469 421.2422 Z M 466.87503 420.92804 L 466.87503 420.92804 
			C 468.1239 420.42087 468.9844 419.35281 468.9844 418.11716 L 468.9844 377.29688 L 471.09378 377.29688 
			L 471.09378 421.2422 L 466.87503 421.2422 Z M 473.2032 420.92804 L 473.2032 420.92804 
			C 474.45203 420.42087 475.31256 419.35281 475.31256 418.11716 L 475.31256 377.29688 L 477.4219 377.29688 
			L 477.4219 421.2422 L 473.2032 421.2422 Z M 479.5313 420.92804 L 479.5313 420.92804 
			C 480.78018 420.42087 481.64066 419.35281 481.64066 418.11716 L 481.64066 377.29688 L 483.75006 377.29688 
			L 483.75006 421.2422 L 479.5313 421.2422 Z" fill="black" class="glyph"/>
		</g>
	</g>
</svg>
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.4.0|
|''Status''|stable|
|''Source''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/RandomColorPalettePlugin/RandomColorPalettePlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<RandomColorPalette>>
}}}
Sets and saves a random color palette on execution

{{{
<<RandomColorPaletteButton>>
}}}
Creates a button, which when clicked will change the color palette
More information at http://macros.tiddlyspace.com/#%5B%5BRandomColorPaletteButton%20macro%5D%5D
!Code
***/
//{{{
RGB.prototype.toRGBString = function() {
	return "rgb(%0,%1,%2)".format(parseInt(this.r * 255, 10),
		parseInt(this.g * 255, 10), parseInt(this.b * 255, 10))
}
function HSL_TO_RGB(h, s, l) { // h (hue) between 0 and 360, s (saturation) & l (lightness) between 0 and 1
	var c = l <= 0.5 ? 2 * l * s : ( 2 - (2 * l)) * s;
	var h1 = h / 60;
	var x = c * (1 - Math.abs((h1 % 2) - 1)); 
	var r, g, b;
	if(typeof(h) == 'undefined') {
		r = 0;
		g = 0;
		b = 0;
	} else if(0 <= h1 && h1 < 1) {
		r = c;
		g = x;
		b = 0;
	} else if(1 <= h1 && h1 < 2) {
		r = x;
		g = c;
		b = 0;
	} else if(2 <= h1 && h1 < 3) {
		r = 0;
		g = c;
		b = x;
	} else if(3 <= h1 && h1 < 4) {
		r = 0;
		g = x;
		b = c;
	} else if(4 <= h1 && h1 < 5) {
		r = x;
		g = 0;
		b = c;
	} else if(5 <= h1 && h1 < 6) {
		r = c;
		g = 0;
		b = x;
	}
	m = l - (0.5 * c);
	return new RGB(r + m, g + m, b + m);
}

(function($){
	var macro = config.macros.RandomColorPalette = {
		messagesOn: false, 
		changedPaletteText: "We have assigned you a random theme by adjusting the [[ColorPalette]] tiddler.\nDon't like it? Click <<RandomColorPalette>> for another one.", 
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			paramString = paramString || "";
			var options = macro.getOptions(paramString);
			macro.generatePalette(options, true);
		},
		optionTypes: {
			floats: ["hue", "saturation", "darkest", "lightness", "huevariance", "dark", "pale", "light", "mid",
				"saturation_light", "saturation_pale", "saturation_mid", "saturation_dark"
			]
		},
		getOptions: function(paramString) {
			var args = paramString.parseParams("name", null, true, false, true)[0];
			var options = {};
			var numbers = macro.optionTypes.floats;
			for(var i in args) {
				options[i] = numbers.indexOf(i) > -1 ? parseFloat(args[i][0], 10) : args[i][0];
			}
			return options;
		},
		generateRandomNumber: function(min, max, info) {
			var num = (Math.random() * 1);
			info = !info ? { attempts:0 } : info;
			info.attempts += 1;
			var good = true;
			if(min == max) {
				return max;
			}
			if(min && num < min) {
				good = false;
			} else if(max && num > max) {
				good = false;
			}
			if(!good) {
				if(info.attempts < 5) {
					return macro.generateRandomNumber(min, max, info);
				} else {
					if(max) {
						return max;
					} else if(min) {
						return min;
					} else {
						return 1;
					}
				}
			}
			return num;
		},
		getExistingPalette: function(asJSON) {
			var title = "ColorPalette";
			var tiddlerText;
			if(store.tiddlerExists(title)) {
				tiddlerText = store.getTiddlerText(title);
			} else if(store.isShadowTiddler(title)){
				tiddlerText = config.shadowTiddlers[title];
			}
			if(asJSON) {
				var json = {};
				if(tiddlerText) {
					var lines = tiddlerText.split("\n");
					for(var i = 0; i < lines.length; i++) {
						var definition = lines[i].split(":");
						if(definition.length == 2) {
							var name = definition[0].trim();
							var value = definition[1].trim();
							json[name] = value;
						}
					}
				}
				return json;
			} else {
				return tiddlerText;
			}
		},
		generatePalette: function(options, save) {
			var outputRGB = options.rgb;
			var palette = macro.getExistingPalette(true);
			var hue = options.hue || Math.floor(Math.random() * 359);
			var saturation = options.saturation || macro.generateRandomNumber(0.3, 0.7);
			var dark = options.dark || options.darkest || macro.generateRandomNumber(0, 0.10);
			var pale = options.pale || options.lightness || macro.generateRandomNumber(0.90, 1);
			var delta = ( ( pale - dark ) / 3 );
			var mid = options.mid || dark + delta;
			var light = options.light || dark + (delta * 2);
			var lightness_values = {Dark: dark, Mid: mid, Light: light, Pale: pale};
			var saturation_values = {};
			for(i in lightness_values) {
				if(true) {
					saturation_values[i] = options["saturation_" + i.toLowerCase()] || saturation;
				}
			}

			var opposite_hue = (hue + 180) % 360;
			var seed = options.huevariance || Math.floor((85 * Math.random()) + 5); // we want it to be at least 5 degrees
			var huetwo = (opposite_hue + seed) % 360;
			var huethree = (opposite_hue - seed) % 360;
			if(huetwo < 0) {
				huetwo = 360 + huetwo;
			}
			if(huethree < 0) {
				huethree = 360 + huethree;
			}
			for(var j in lightness_values) {
				if(true) {
					var saturation = saturation_values[j];
					palette["Primary" + j] = HSL_TO_RGB(hue, saturation, lightness_values[j]);
					palette["Secondary" + j] = HSL_TO_RGB(huetwo, saturation, lightness_values[j]);
					palette["Tertiary" + j] = HSL_TO_RGB(huethree, saturation, lightness_values[j]);
				}
			}
			palette.Background = HSL_TO_RGB(hue, saturation, 0.92);
			palette.Foreground = HSL_TO_RGB(hue, saturation, 0.08);
			palette.ColorPaletteParameters = ["HSL([", hue, "|", seed, "], [", saturation_values.Pale, "|",
				saturation_values.Light, "|", saturation_values.Mid, "|", saturation_values.Dark, "],",
				"[", dark, "|", mid, "|", light, "|", pale, "])"].join("");
			// construct new ColorPalette
			var text = ["/*{{{*/\n"];
			var colorcode;
			for(var id in palette) {
				if(true) {
					var color = palette[id];
					colorcode = outputRGB ? color.toRGBString() : color.toString();
					text.push("%0: %1\n".format(id, colorcode));
				}
			}
			text.push("/*}}}*/");
			text = text.join("");
			if(save) {
				macro.saveColorPalette(text);
			}
			return text;
		},
		saveColorPalette: function(text) {
			var tid = store.getTiddler("ColorPalette");
			if(!tid) {
				tid = new Tiddler("ColorPalette");
				tid.fields = merge({}, config.defaultCustomFields);
			} // TODO: detect that the ColorPalette in the space comes from outside recipe
			tid.fields["server.page.revision"] = "false"; // edit conflicts dont matter

			// save the color palette in tid
			tid = store.saveTiddler(tid.title, tid.title, text, tid.modifier, tid.modified,
				tid.tags, tid.fields, false, tid.created, tid.creator);
			// an interval is used to cope with users clicking on the palette button quickly.
			if(macro._nextSave) {
				window.clearTimeout(macro._nextSave);
			}
			macro._nextSave = window.setTimeout(function() {
					autoSaveChanges(null, [tid]);
				}, 2000);
			// temporary workaround for IE.
			$.twStylesheet.remove({ id: "StyleSheetColors" });
			$.twStylesheet.remove({ id: "StyleSheet" });
			refreshAll();
			macro.reportChange();
			return tid;
		},
		reportChange: function() {
			if(macro.messagesOn) { // only display message once..
				var msgPlace = getMessageDiv();
				if(!$(".changedPalette", msgPlace)[0]) {
					var tempPlace = document.createElement("div");
					wikify("{{changedPalette{" + macro.changedPaletteText + "}}}", tempPlace);
					msgPlace.appendChild(tempPlace);
				}
			}
		}
	};
	var btnMacro = config.macros.RandomColorPaletteButton = {
			text: "New ColorPalette",
			tooltip: "Generate a random colour scheme for your TiddlyWiki",
			makeButton: function(place, options) {
				var btnHandler = function(ev) {
					var t = $(ev.target);
					var options = t.data("options");
					macro.generatePalette(options, true);
					ev.preventDefault();
					return false;
				};
				var btn = createTiddlyButton(place, this.text, this.tooltip, btnHandler);
				$(btn).data("options", options);
				return btn;
			},
			handler: function(place, macroName, params, wikifier, paramString, tiddler) {
				var options = macro.getOptions(paramString);
				btnMacro.makeButton(place, options);
			}
	};
})(jQuery);
//}}}
The bond between parent/child is the first and most basic link in a series of relationships that knit families across time.

In normal circumstances, it is probably the most indestructible of all human relationships … and potentially the most harmful when the bond is compromised or blocked.

We won't all be so lucky to live 100 years with full health and mental agility, nor will each of our parents and grandparents. However, in recent times, most people can expect their own lifetime, extended by a child's, will likely reach 100 years.  A century passes like an inhalation and exhalation in the history of the world: a child's birth, a parent's death.

So it is that we gaze further into the future through our children's eyes … while we are their memory and first-hand account of the time before their birth.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="78 222 60 60" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 107.92718 244.14815 L 86.651474 222.89253 L 78.85206 230.69925 L 100.120415 251.9476 L 78.774 273.27396 
		L 86.57342 281.08075 L 107.927216 259.74707 L 129.39981 281.19946 L 137.19922 273.39267 L 115.73397 251.94763 
		L 137.121155 230.58054 L 129.32175 222.77374 Z" fill="black" class="glyph"/>
	</g>
</g>
</svg>
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.2|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/TiddlyWebConfig.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|TiddlyWebAdaptor ServerSideSavingPlugin|
|''Keywords''|serverSide TiddlyWeb|
!Code
***/
//{{{
(function($) {

if(!config.extensions.ServerSideSavingPlugin) {
	throw "Missing dependency: ServerSideSavingPlugin";
}
if(!config.adaptors.tiddlyweb) {
	throw "Missing dependency: TiddlyWebAdaptor";
}

if(window.location.protocol != "file:") {
	config.options.chkAutoSave = true;
}

var adaptor = tiddler.getAdaptor();
var recipe = tiddler.fields["server.recipe"];
var workspace = recipe ? "recipes/" + recipe : "bags/common";

var plugin = config.extensions.tiddlyweb = {
	host: tiddler.fields["server.host"].replace(/\/$/, ""),
	username: null,
	status: {},

	getStatus: null, // assigned later
	getUserInfo: function(callback) {
		this.getStatus(function(status) {
			callback({
				name: plugin.username,
				anon: plugin.username ? plugin.username == "GUEST" : true
			});
		});
	},
	hasPermission: function(type, tiddler) {
		var perms = tiddler.fields["server.permissions"];
		if(perms) {
			return perms.split(", ").contains(type);
		} else {
			return true;
		}
	}
};

config.defaultCustomFields = {
	"server.type": tiddler.getServerType(),
	"server.host": plugin.host,
	"server.workspace": workspace
};

// modify toolbar commands

config.shadowTiddlers.ToolbarCommands = config.shadowTiddlers.ToolbarCommands.
	replace("syncing ", "revisions syncing ");

config.commands.saveTiddler.isEnabled = function(tiddler) {
	return plugin.hasPermission("write", tiddler) && !tiddler.isReadOnly();
};

config.commands.deleteTiddler.isEnabled = function(tiddler) {
	return !readOnly && plugin.hasPermission("delete", tiddler);
};

// hijack option macro to disable username editing
var _optionMacro = config.macros.option.handler;
config.macros.option.handler = function(place, macroName, params, wikifier,
		paramString) {
	if(params[0] == "txtUserName") {
		params[0] = "options." + params[0];
		var self = this;
		var args = arguments;
		args[0] = $("<span />").appendTo(place)[0];
		plugin.getUserInfo(function(user) {
			config.macros.message.handler.apply(self, args);
		});
	} else {
		_optionMacro.apply(this, arguments);
	}
};

// hijack isReadOnly to take into account permissions and content type
var _isReadOnly = Tiddler.prototype.isReadOnly;
Tiddler.prototype.isReadOnly = function() {
	return _isReadOnly.apply(this, arguments) ||
		!plugin.hasPermission("write", this);
};

var getStatus = function(callback) {
	if(plugin.status.version) {
		callback(plugin.status);
	} else {
		var self = getStatus;
		if(self.pending) {
			if(callback) {
				self.queue.push(callback);
			}
		} else {
			self.pending = true;
			self.queue = callback ? [callback] : [];
			var _callback = function(context, userParams) {
				var status = context.serverStatus || {};
				for(var key in status) {
					if(key == "username") {
						plugin.username = status[key];
						config.macros.option.propagateOption("txtUserName",
							"value", plugin.username, "input");
					} else {
						plugin.status[key] = status[key];
					}
				}
				for(var i = 0; i < self.queue.length; i++) {
					self.queue[i](plugin.status);
				}
				delete self.queue;
				delete self.pending;
			};
			adaptor.getStatus({ host: plugin.host }, null, _callback);
		}
	}
};
(plugin.getStatus = getStatus)(); // XXX: hacky (arcane combo of assignment plus execution)

})(jQuery);
//}}}
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.7.1|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate, and allows you to set a default privacy setting|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/ToggleTiddlerPrivacyPlugin.js|
!Notes
When used in conjunction with TiddlySpaceTiddlerIconsPlugin changing the privacy setting will also interact with any privacy icons.

Currently use of
{{{<<setPrivacy defaultValue:public>>}}} is in conflict with {{{<<newTiddler fields:"server.workspace:x_private">>}}}

There is an option, found in the tweak tab of the backstage, called txtPrivacyMode. Set this to either ''public'' or ''private'' depending on your security preference. If you choose not to set it then it will default to ''public''.
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)

!Code
***/
//{{{
(function($) {

	var tiddlyspace = config.extensions.tiddlyspace,
		macro;
	macro = config.macros.setPrivacy = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			if(readOnly) {
				return;
			}
			var el = $(story.findContainingTiddler(place)),
				args = paramString.parseParams("name",
					null, true, false, true)[0],
				container = $("<div />").
					addClass("privacySettings").
					appendTo(place)[0],
				currentSpace = tiddlyspace.currentSpace.name,
				currentBag = tiddler ? tiddler.fields["server.bag"] : false,
				// XXX: is the following reliable?
				isNewTiddler = el.hasClass("missing") || !currentBag,
				tiddlerStatus = tiddlyspace.getTiddlerStatusType(tiddler),
				customFields = el.attr("tiddlyfields"),
				defaultValue = "public",
				options = config.macros.tiddlerOrigin ?
						config.macros.tiddlerOrigin.getOptions(paramString) :
						{};
			customFields = customFields ? customFields.decodeHashMap() : {};
			if(isNewTiddler || !["public", "private", "unsyncedPrivate",
					"unsyncedPublic"].contains(tiddlerStatus)) {
				if(args.defaultValue) {
					defaultValue = args.defaultValue[0].toLowerCase();
				} else {
					defaultValue = config.options.chkPrivateMode ?
							"private" : "public";
				}
				defaultValue = defaultValue ?
						"%0_%1".format(currentSpace, defaultValue) :
						customFields["server.bag"];
				this.createRoundel(container, tiddler, currentSpace,
						defaultValue, options);
			}
		},
		updateEditFields: function(tiddlerEl, bag) {
			var saveBagField = $('[edit="server.bag"]', tiddlerEl),
				saveWorkspaceField = $('[edit="server.workspace"]', tiddlerEl),
				input = $("<input />").attr("type", "hidden"),
				workspace = "bags/" + bag;
			if(saveBagField.length === 0) {
				input.clone().attr("edit", "server.bag").val(bag).
					appendTo(tiddlerEl);
			} else {
				saveBagField.val(bag);
			}
			// reset to prevent side effects
			$(tiddlerEl).attr("tiddlyFields", "");
			if(saveWorkspaceField.length === 0) {
				input.clone().attr("edit", "server.workspace").
					val(workspace).appendTo(tiddlerEl);
			} else {
				saveWorkspaceField.val(workspace);
			}
		},
		setBag: function(tiddlerEl, newBag, options) {
			var bagStatus,
				title = $(tiddlerEl).attr("tiddler"),
				tiddler = store.getTiddler(title),
				originButton = $(".originButton", tiddlerEl)[0],
				refreshIcon,
				newWorkspace = "bags/" + newBag,
				rPrivate = $("input[type=radio].isPrivate", tiddlerEl),
				rPublic = $("input[type=radio].isPublic", tiddlerEl);
			refreshIcon = function(type) {
				var originMacro = config.macros.tiddlerOrigin;
				if(originButton && originMacro) {
					options.noclick = true;
					originMacro.showPrivacyRoundel(tiddler, type,
							originButton, options);
				}
			};
			macro.updateEditFields(tiddlerEl, newBag);
			if(tiddler) {
				tiddler.fields["server.bag"] = newBag;
				// for external tiddlers
				tiddler.fields["server.workspace"] = newWorkspace;
			}
			if(newBag.indexOf("_public") > -1) {
				rPrivate.attr("checked", false);
				rPublic.attr("checked", true);
				bagStatus = "public";
			} else {
				rPublic.attr("checked", false); // explicitly do this for ie
				rPrivate.attr("checked", true);
				bagStatus = "private";
			}
			refreshIcon(bagStatus);
		},
		createRoundel: function(container, tiddler, currentSpace,
							   defaultValue, options) {
			var privateBag = "%0_private".format(currentSpace),
				publicBag = "%0_public".format(currentSpace),
				rbtn = $("<input />").attr("type", "radio").
					attr("name", tiddler.title),
				el = story.findContainingTiddler(container);
			rbtn.clone().val("private").addClass("isPrivate").
				appendTo(container);
			$("<label />").text("private").appendTo(container); // TODO: i18n
			rbtn.clone().val("public").addClass("isPublic")
				.appendTo(container);
			$("<label />").text("public").appendTo(container); // TODO: i18n
			$("[type=radio]", container).click(function(ev) {
				var btn = $(ev.target);
				tiddler.fields["server.page.revision"] = "false";
				if(btn.hasClass("isPrivate")) { // private button clicked.
					$(el).addClass("isPrivate").removeClass("isPublic");
					macro.setBag(el, privateBag, options);
				} else {
					$(el).addClass("isPublic").removeClass("isPrivate");
					macro.setBag(el, publicBag, options);
				}
			});
			window.setTimeout(function() {
				macro.setBag(el, defaultValue, options);
			}, 100);
			// annoyingly this is needed as customFields are added to end of EditTemplate so are not present yet
			// and don't seem to respect any existing customFields.
		}
	};

}(jQuery));
//}}}
!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> Sync is currently unavailable in ~TiddlyWiki due to security constraints in modern browsers. Research is being done to build a suitable alternative. In the meantime if you have changed content in an offline ~TiddlyWiki, you can get your content back into ~TiddlySpace by using the ''import'' functionality from the backstage of the online wiki.
}}}
}}}

!Menu
<<message messages.memberStatus>> <<homeLink>>
{{unsyncedList{<<message messages.syncListHeading>> <<list filter [is[unsynced]]>>}}}

running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
{{autotable{
<<tiddler Backstage##Resources>>
}}}

!Resources
[[blog|@@blog]] [[documentation|@@docs]] [[featured spaces|@@featured]] 

!ImportExport
<<fileImport>>
You can download this TiddlySpace as an offline TiddlyWiki:

{{chunkyButton{<<exportSpace>>}}}

!BackstageTiddlers
|upload a <<message messages.privacySetting>> file: <<binaryUpload>>|<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>>|
|>|<<search>>|
|>|<<tiddler Backstage##Tiddlers>>|

!Tiddlers
<<tabs
	txtMainTab
	"Recent" "Recently edited tiddlers" TabTimeline
	"All" "All tiddlers" TabAll
	"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
	"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
	"Tags" "All tags" TabTags
	"Spaces" "Tiddlers grouped by space" [[TiddlySpaceTabs##Spaces]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>

!BatchOps
<<tabs
	txtPublisherTab
	"Private" "Move tiddlers from private to public" Backstage##BatchPrivate
	"Public" "Move tiddlers from public to private" Backstage##BatchPublic
>>

!BatchPrivate
<<TiddlySpacePublisher type:private>>

!BatchPublic
<<TiddlySpacePublisher type:public>>

!Plugins
''Note:'' Many of these plugins are core TiddlySpace plugins and cannot be changed unless first cloned.

<<tiddler PluginManager>>

!Tweaks
These options change behavior in TiddlyWiki //only// and may be ineffective in TiddlySpace.

<<tiddler AdvancedOptions>>
/***
|''Name''|TiddlySpaceRevertRevision|
|''Description''|Revert to a previous revision|
|''Author''|BenGillies|
|''Version''|0.1|
|''Status''|unstable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor TiddlySpaceRevisionView|
!Usage
Add a control button to revert to a particular revision.

The button must be called from within a revision, as generated by TiddlySpaceRevisionView
!Code
***/
//{{{
(function($) {

config.commands.revert = {
	text: "revert",
	tooltip: "make this revision the current one",
	handler: function(ev, src, title) {
		var revElem = story.getTiddler(title);
		var tidToRevert = store.getTiddler($(revElem).attr("revName"));

		var revision = store.getTiddler(title);
		if ((revision) && (tidToRevert)) {
			tidToRevert.text = revision.text;
			var newFields = merge({}, revision.fields);
			for (var fieldName in newFields) {
				if (fieldName.substr(0, 7) === "server.") {
					delete newFields[fieldName];
				}
			}
			merge(tidToRevert.fields, newFields);
			tidToRevert.tags = merge([], revision.tags);
			tidToRevert.fields.changecount = 1;
			delete tidToRevert.fields.doNotSave;

			store.saveTiddler(tidToRevert.title, tidToRevert.title,
				tidToRevert.text, null, null, tidToRevert.tags,
				tidToRevert.fields, false, tidToRevert.created, tidToRevert.creator);

			autoSaveChanges(true);
		}
	}
};

})(jQuery);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="2 724 68 55" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 2.25 756 L 11.25 747 L 24.75 760.4994 L 60.750004 724.4994 L 69.75 733.49902 
		L 24.749977 778.49976 Z" fill="#101010" class="glyph"/>
	</g>
</g>
</svg>


/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.9|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|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);
		}
	};
}
//}}}
One of [[Elizabeth Breit|Elizabeth Breit Jacobs]]'s half-sisters Zita Clara Breit Rome died in Pueblo, Colorado – coincidentally about a year before my mother and father met there in 1979.  My father is one of Lizzie's 80+ (estimated) great-grandchildren.  My mother was born in Pueblo (1962), as was my first wife (1972) and I (1982.)

Combing Ancestry.com while preparing to write this, I learned that Zita Breit had a son Merlyn Rome (pronounced like //"row-mee"//) who died in Pueblo on May 13, 2000.  I met the mother of my children in Pueblo in October 2000.  At that time, I had no clue my great-grandmother Regina from the tiny, almost forgotten farming community of Pfeifer, Kansas had a first cousin named Merlyn Rome – who had called Pueblo home.
&nbsp;
Here are links to my [[52 Ancestors in 52 Weeks]]:
# [[Elizabeth Breit Jacobs]] (1882-1970)
# [[John Sweeney]] (1903-1933)
# [[Katherine Maher Uhler]] (1897-?)
# [[Camilla Broster Williams]] (1907-1988)
# [[Eva Sceora Thompson]] (1875-1961)
# [[Marie Schuh]] (immigrated from Germany 1885)
# [[Katherina Bieker Werth]] (1860-1943)
# [[James J. E. Maher]] (1857-1931)
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
Once you have some content then you may choose to determine a tiddler, or set of tiddlers to display each time you load ~TiddlySpace. This is determined by the [[DefaultTiddlers]].
<<tabs
	txtMoreTab
	"Spaces" "Tiddlers grouped by space" [[TabMore##Spaces]]
	"Public" "All public tiddlers" [[TabMore##Public]]
	"Private" "All private tiddlers" [[TabMore##Private]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>
/%
!Spaces
<<groupBy server.bag>>
!Private
<<list filter [is[private]]>>
!Public
<<list filter [is[public]]>>
!END%/
User-agent: *
Disallow: /bags
Disallow: /recipes
/***
|''Name''|ErrorHandlerPlugin|
|''Version''|0.4.3|
|''Author''|Jon Robson|
|''Description''|Localised tiddler save errors including edit conflict resolution.|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
tiddlyspace.getLocalTitle = function(title, workspace, suffix) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(!suffix) {
		var isPublic = endsWith(workspace, "_public");
		suffix = tiddlyspace.resolveSpaceName(workspace);
		if(currentSpace == suffix) {
			suffix = isPublic ? "public" : "private";
		} else {
			suffix = "@%0".format(suffix);
		}
	}
	return "%0 *(%1)*".format(title, suffix);
};

var sssp = config.extensions.ServerSideSavingPlugin;

var msgs = config.messages.editConflict = {
	loading: "Loading..",
	resolve: "[[Edit Conflict]]@glossary: this tiddler may have been changed by someone else.",
	reviewDiff: "review (recommended)",
	reviewDiffTooltip: "review changes made to this tiddler",
	reviewDiffError: "error retrieving revision.",
	save: "overwrite",
	saveTooltip: "make this revision the top revision of this tiddler",
	discard: "cancel",
	discardTooltip: "undo changes to this tiddler and get most recent version",
	diffTitle: "%0",
	diffFieldTitle: "%0 - fields",
	diffTextTitle: "%0 - text",
	updating: "updating your version...",
	diffHeader: ["Review the changes that have been made whilst you were editing this tiddler. ",
		"Fold relevant changes back into your version.\n",
		"{{removed{Red}}} highlight shows content removed. ",
		"{{added{Green}}} highlight shows content added.\n"].join(""),
	diffTextHeader: "View changes in text",
	diffFieldsHeader: "View changes in fields"
};

var plugin = config.extensions.errorHandler = {
	diffTags: ["excludeLists", "excludeMissing", "excludeSearch"],
	displayMessage: function(message, tiddler, context) {
		var desc = context && context.httpStatus ? context.statusText :
			sssp.locale.connectionError;
		var reportArea = plugin.reportError(tiddler.title);
		var msg = $("<div />").appendTo(reportArea);
		if(message == "saveConflict") {
			wikify(msgs.resolve, msg[0]);
			var choiceArea = $("<div />").appendTo(reportArea)[0];
			plugin.editConflictHandler(choiceArea, tiddler);
		} else {
			msg.text(sssp.locale[message].format(tiddler.title, desc));
		}
	},
	editConflictHandler: function(container, tiddler) {
		var title = tiddler.title;
		var myrev = tiddler.fields["server.page.revision"];
		// note user now needs to edit, fix problem and save. 
		// TODO: make sure this gets reset in save callback
		store.getTiddler(title).fields["server.page.revision"] = "false";

		var diffBtn = createTiddlyButton(container, msgs.reviewDiff, msgs.reviewDiffTooltip, function(ev) {
			var title = $(ev.target).data("title");
			plugin.displayDiff(ev.target, store.getTiddler(title), myrev);
		});
		var saveBtn = createTiddlyButton(container, msgs.save, msgs.saveTooltip, function(ev) {
				var title = $(ev.target).data("title");
				var tid = store.saveTiddler(store.getTiddler(title));
				autoSaveChanges(null, [tid]);
			});
		var ignoreBtn = createTiddlyButton(container, msgs.discard, msgs.discardTooltip, function(ev) {
			var title = $(ev.target).text(msgs.updating).data("title");
			plugin.resetToServerVersion(store.getTiddler(title));
		});
		$([diffBtn, ignoreBtn, saveBtn]).data("title", title);
	},
	getDiffTiddlerTexts: function(diffText) {
		var chunks = diffText.split("\n  \n");
		if(chunks.length < 2) {
			return [chunks[0], ""];
		} else {
			var diffFieldsText = "{{diff{\n%0\n}}}".format(chunks[0]);
			diffText = '{{diff{\n%0\n}}}'.format(chunks.splice(1, chunks.length).join("\n"));
			return [diffText, diffFieldsText];
		}
	},
	makeDiffTiddler: function(title, diff) {
		var newTiddler = new Tiddler(title);
		var tags = plugin.diffTags;
		newTiddler.text = msgs.loading;
		newTiddler.fields.doNotSave = true;
		newTiddler.tags = diff ? tags.concat(["diff"]) : tags;
		newTiddler = store.saveTiddler(newTiddler);
		$.extend(store.getTiddler(title).fields,
			config.defaultCustomFields); // allow option to save it
		return newTiddler;
	},
	displayDiff: function(src, tiddler, latestRevision) {
		var adaptor = tiddler.getAdaptor();
		var title = tiddler.title;
		var ts = new Date().formatString("0hh:0mm:0ss");
		var suffix = "edit conflict %0".format(ts);
		var diffTitle = tiddlyspace.getLocalTitle(msgs.diffTitle.format(title), "", suffix);
		var diffTextTitle = tiddlyspace.getLocalTitle(msgs.diffTextTitle.format(title), "", suffix);
		var diffFieldsTitle = tiddlyspace.getLocalTitle(msgs.diffFieldTitle.format(title), "", suffix);
		plugin.makeDiffTiddler(diffTextTitle, true);
		plugin.makeDiffTiddler(diffFieldsTitle, true);
		var newTiddler = plugin.makeDiffTiddler(diffTitle, false);
		newTiddler.text = ['%0\n<<slider chkViewDiffText "%1" "%2">>\n',
			'<<slider chkViewDiffField "%3" "%4">>'].join("").
			format(msgs.diffHeader, diffTextTitle, msgs.diffTextHeader,
				diffFieldsTitle, msgs.diffFieldsHeader);
		store.saveTiddler(newTiddler);

		var callback = function(r) {
			var text = plugin.getDiffTiddlerTexts(r);
			store.getTiddler(diffTextTitle).text = text[0];
			store.getTiddler(diffFieldsTitle).text = text[1];
			story.refreshTiddler(diffTitle, null, true);
		};
		var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
		ajaxReq({
			type: "get",
			dataType: "text",
			url: "/diff?format=unified&rev1=%0/%1/%2&rev2=%0/%1".format(workspace, title, latestRevision),
			success: callback,
			error: function() {
				displayMessage(msgs.reviewDiffError);
			}
		});
		story.displayTiddler(src, diffTitle);
	},
	resetToServerVersion: function(tiddler) {
		var adaptor = tiddler.getAdaptor();
		var ctx = { 
			host: tiddler.fields["server.host"],
			workspace: "bags/" + tiddler.fields["server.bag"]
		};
		adaptor.getTiddler(tiddler.title, ctx, null, function(context) {
			store.saveTiddler(context.tiddler);
			story.refreshTiddler(tiddler.title);
			store.setDirty(false);
		});
	},
	reportError: function(title) {
		var el = story.getTiddler(title);
		if(!el) {
			el = story.displayTiddler(null, title);
		}
		return $("<div />").addClass("error annotation").prependTo(el)[0];
	}
};

sssp.reportFailure = function(message, tiddler, context) {
	config.options.chkViewDiffText = config.options.chkViewDiffText === undefined ?
		true : config.options.chkViewDiffText;
	config.options.chkViewDiffFields = config.options.chkViewDiffFields || false;
	plugin.displayMessage(message, tiddler, context);
};

})(jQuery);
//}}}
My father's father's father Joseph Unrein was an orphan born in 1898 in New York City.  I don't know for certain that he had any half-siblings from his biological parents, but if they exist, I'd like to one day learn their identities.

Joseph's father was //thought// to be an ~Irish-American named James Magner.  Katherine Maher was born in 1897 in New York City, to Dr. James Joseph Maher, an ~Irish-American approximately the same age as Joseph's recorded father.  (As shown on the birth certificate.)  For a few months of last year, we appeared to have a promising lead.

DNA testing of Katherine's distant cousins has since led to the conclusion that she and my great-grandfather were unrelated; so his paternity remains a mystery.  But I remain intrigued by [[Katherine Maher Uhler]].

!Francis O'Neill
Born 1835 in Ireland, died 3 February 1895 in Yonkers, New York

[img[Francis O'Neill|http://farm6.staticflickr.com/5481/12156995635_0aac6d5e43_z_d.jpg][http://www.flickr.com/photos/114151783@N05/12156995635/]]
Image courtesy of Louise Snider Dunn, daughter of Margaret O'Meara, granddaughter of Theresa O'Neill O'Meara (one of Francis' daughters.)

Louise's uncle David John O'Meara (1917-2012) was the last grandchild of Francis' whom I have found, with the exception of Connie O'Neill Gourdeau.  They are first cousins of [[Katherine Maher Uhler]] (1897-?) who I extensively researched.  Katherine was born to Francis' daughter ''Anna O'Neill Maher'' (1873-1908?)

Other descendants of Francis O'Neill:
*''Theresa O'Neill'' (1888-1962) married David O'Meara, and her sister ''Agnes O'Neill'' (1873-?) married his brother William O'Meara.  A grandson of Agnes and William is Donald G. O'Meara Jr.
*''Francis O'Neill Jr.'' (1876-1938) married Marie Grace Derickson, and had two sons.  Their grandchildren include Peter S. O'Neill and Derick O'Neill of Idaho.
*''Peter Francis O'Neill'' (1878-1913) married Lillian Hendrickson, and had a son Robert O'Neill (1902-1985.)
*''John Stephen O'Neill'' (1880-1955) died in California, his son John Stephen Jr. (1915-1960) died in Oregon.
*''Elizabeth Mary O'Neill'' (1882-1930) married Carl Keppler, and their children were Elizabeth Hayden (1907-?) and Carl Keppler (1909-1999.)
*''Claire O'Neill'' (1886-1969) married John Joseph Fleming, divorced, and had one son Jack Fleming Jr. (1909-1969.)  His grandchildren living today include Isabell Harrington Fransway and David Harrington Jr.
*''Charles Raymond O'Neill'' (1892-1969) married Constance Mahoney and had twin daughters: Connie O'Neill Gourdeau and Caroline O'Neill Stern.
&nbsp;
The ''maternal anchor'' of my mother's line, whose mitochondrial / mtDNA I carry, was another German woman named Katie Schuh, born 1876 in Westhofen, Darmstadt, Germany.  I have thoroughly documented her descendants, and those of her mother ''Marie'', and found there are only two women of child-bearing years today who are direct female-line descendants (the daughter of a daughter of a daughter, etc…)

In comparison, [[Elizabeth Breit Jacobs]] has more female-line descendants than I can even count!  One of them is my first cousin Katherine (Katie) Rose Franklin, who celebrates her 20th birthday this month.  Katie is descended from Allisa Rose Unrein < Rosaline Frances Jacobs < Regina Jacobs < Elizabeth Breit < Katharina Eberle … stretching back into the distant past with a signature in their DNA they passed to all their children.

This mtDNA lineage stops at each male descendant.  My father did not pass [[Lizzie Breit|Elizabeth Breit Jacobs]]'s mtDNA to me; instead I received ''Marie Schuh'''s from my mother.  I did not pass that mtDNA to my children; they received ''Maria Juhar'''s of Hungary from their mother.

One of these days I will have one of Lizzie Breit's female-line descendants take the basic [[mtDNA test|http://familytreedna.com/]] offered by ~FamilyTreeDNA.com.
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.8.10|
|''Status''|@@beta@@|
|''Author''|Jon Robson|
|''Description''|Provides ability to render SiteIcons and icons that correspond to the home location of given tiddlers|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceTiddlerIconsPlugin.js|
|''Requires''|TiddlySpaceConfig BinaryTiddlersPlugin ImageMacroPlugin TiddlySpacePublishingCommands|
!Notes
{{{<<tiddlerOrigin>>}}} shows the origin of the tiddler it is being run on.
In TiddlySpace terms this means it will determine whether the tiddler is external, public or private.
Where private it will analyse whether a public version exists and distinguish between the different scenarios.
If a tiddler is external, the SiteIcon of that external space will be shown

!Parameters
width / height : define a width or height of the outputted icon
label: if label parameter is set to yes, a label will accompany the icon.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var imageMacro = config.macros.image;
var tiddlyspace = config.extensions.tiddlyspace;
var tweb = config.extensions.tiddlyweb;
var cmds = config.commands;
var cmd = cmds.publishTiddler;
tiddlyspace.resolveSpaceName = function(value) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(value) {
		value = value.indexOf("bags/") === 0 ? value.substr(5) : value;
		value = value.indexOf("recipes/") === 0 ? value.substr(8) : value;
		if(value.indexOf("@") === 0) {
			value = value.substr(1);
		}
		if(endsWith(value, "_public")) {
			value = value.substr(0, value.length - 7);
		} else if(endsWith(value, "_private")) {
			value = value.substr(0, value.length - 8);
		}
		value = value.toLowerCase();
	}
	return value;
};

tiddlyspace.renderAvatar = function(place, value, options) {
	options = options ? options : {};
	options.labelOptions = options.labelOptions ? options.labelOptions : { include: false, height: 48, width: 48 };
	options.imageOptions = options.imageOptions ? options.imageOptions : {};
	options.imageOptions.altImage = "/bags/common/tiddlers/defaultUserIcon";
	var container = $('<div class="siteIcon" />').appendTo(place);
	value = tiddlyspace.resolveSpaceName(value);

	tweb.getStatus(function(status) {
		var link, noLabel;
		if(!value || value == config.views.wikified.defaultModifier ||
			value == config.views.wikified.shadowModifier) {
			var icon = config.views.wikified.shadowModifier == value ? "shadowIcon" : "missingIcon";
			if(store.tiddlerExists(icon)) {
				imageMacro.renderImage(container, icon, options.imageOptions);
			} else {
				noLabel = true;
			}
		} else {
			var spaceURI;
			if(value != tiddlyspace.currentSpace.name) {
				spaceURI = options.notSpace ? tiddlyspace.getHost(status.server_host) :
					tiddlyspace.getHost(status.server_host, value);
			}
			link = spaceURI ? $("<a />").attr("href", spaceURI) : $("<span />");
			link.text(value);

			var imageOptions = options.imageOptions;
			if(options.spaceLink && !imageOptions.link) {
				imageOptions.link = spaceURI;
			}
			var avatar = options.notSpace ? false : value;
			var uri = tiddlyspace.getAvatar(status.server_host, avatar);
			imageMacro.renderImage(container, uri, options.imageOptions);
			if(!value) {
				value = "tiddlyspace";
			}
		}
		if(!noLabel && options.labelOptions.include) {
			var prefix = $("<span />").text(options.labelOptions.prefix || "")[0];
			var suffix = $("<span />").text(options.labelOptions.suffix || "")[0];
			$('<div class="label" />').append(prefix).append(link).
				append(suffix).appendTo(container);
		}
	});
	if(value) {
		var prefix = options.labelOptions.prefix || "";
		var suffix = options.labelOptions.suffix || "";
		var label = "%0%1%2".format(prefix, value, suffix);
		$(container).attr("title", label);
	}
};

var originMacro = config.macros.tiddlerOrigin = {
	locale: {
		"shadow": "shadow tiddler",
		"missing": "missing tiddler",
		"private": "private",
		"unknown": "unknown state",
		"public": "public",
		"unsyncedPrivate": "unsynced and private",
		"unsyncedPublic": "unsynced and public",
		externalPrefix: "from ",
		externalBagSuffix: " bag",
		externalSuffix: " space",
		publishPrivateDeletePrivate: "Are you sure you want to make this tiddler public?",
		moveToPrivate: "Are you sure you want to make this tiddler private? Only members will be able to see it.",
		pleaseWait: "please wait..",
		keepPublic: "keep public",
		cannotPublishDirtyTiddler: "The current tiddler is unsaved so cannot be published. Please save the tiddler first.",
		keepPrivate: "keep private",
		makePublic: "make public",
		makePrivate: "make private"
	},
	handler: function(place, macroName, params,wikifier, paramString, tiddler){
		var adaptor = tiddler.getAdaptor();
		var btn = $("<div />").addClass("originButton").attr("params", paramString).
			attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
		$(btn).data("tiddler", tiddler);
		originMacro.refresh(btn);
	},
	refresh: function(btn) {
		$(btn).empty();
		var paramString = $(btn).attr("params");
		var tiddler = $(btn).data("tiddler");
		var options = originMacro.getOptions(paramString);
		var type = tiddlyspace.getTiddlerStatusType(tiddler);
		originMacro.renderIcon(tiddler, type, btn, options);
	},
	getOptions: function(paramString) {
		paramString = "%0 label:no width:48 height:48 spaceLink:yes preserveAspectRatio:yes".format(paramString);
		var parsedParams = paramString.parseParams("name");
		var params = parsedParams[0].name;
		var options = {
			labelOptions: originMacro._getLabelOptions(parsedParams),
			imageOptions: imageMacro.getArguments(paramString, []),
			noclick: parsedParams[0].interactive &&
				parsedParams[0].interactive[0] == "no" ? true : false
		};
		if(!options.noclick) {
			var spaceLink = parsedParams[0].spaceLink;
			options.spaceLink = spaceLink && spaceLink[0] == "no" ? false : true;
		} else {
			options.spaceLink = false;
		}
		return options;
	},
	_getLabelOptions: function(parsedParams) {
		parsedParams = parsedParams[0];
		var includeLabel = !parsedParams.label || ( parsedParams.label && parsedParams.label[0] == "yes" );
		var prefix = parsedParams.labelPrefix ? parsedParams.labelPrefix[0] : false;
		var suffix = parsedParams.labelSuffix ? parsedParams.labelSuffix[0] : false;
		return { include: includeLabel, suffix: suffix, prefix: prefix };
	},
	_isSpace: function(value) {
		value = value ? value : "";
		var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
		if(endsWith(value, "_private") || endsWith(value, "_public")) {
			return true;
		} else {
			return false;
		}
	},
	renderIcon: function(tiddler, type, button, options) {
		var locale = originMacro.locale;
		originMacro.annotateTiddler(button, type);
		if(type != "external") {
			originMacro.showPrivacyRoundel(tiddler, type, button,
				options);
		} else {
			var prefix = options.labelOptions.prefix, suffix = options.labelOptions.suffix;
			var space = tiddler.fields["server.bag"];
			options.notSpace = !originMacro._isSpace(space);
			options.labelOptions.prefix = prefix ? prefix : locale.externalPrefix;
			options.labelOptions.suffix = suffix ? suffix : (options.notSpace ? locale.externalBagSuffix : locale.externalSuffix);

			tiddlyspace.renderAvatar(button, space, options);
		}
	},
	showPrivacyRoundel: function(thisTiddler, privacyType, button, options) {
		// there is a public tiddler as well as the current tiddler!
		// TODO: not this is not enough.. we also need to check if the public tiddler is the same as..
		// .. the private tiddler to determine whether this is a draft
		// use of hashes would be useful here.
		$(button).empty();
		var icon = "%0Icon".format(privacyType);
		if(privacyType.indexOf("unsynced") === 0 && !store.tiddlerExists(icon)) {
			icon = "unsyncedIcon";
		}
		if(privacyType == "shadow") {
			if(!store.tiddlerExists(icon)) {
				icon = "bags/tiddlyspace/tiddlers/SiteIcon";
			}
		}
		if(privacyType == "missing" && !store.tiddlerExists(icon)) {
			return; // the user is not making use of the missingIcon
		} else {
			imageMacro.renderImage(button, icon, options.imageOptions);
			originMacro.showLabel(button, privacyType, options.labelOptions);
			var cmd = originMacro.iconCommands[privacyType];
			if(cmd && thisTiddler && !options.noclick) {
				$(button).click(function(ev) {
					cmd(ev, thisTiddler);
				});
			}
		}
	},
	annotateTiddler: function(place, type) {
		var tidEl = $(story.findContainingTiddler(place));
		tidEl.
			removeClass("private public external privateAndPublic privateNotPublic shadow").
			addClass(type);
	},
	showLabel: function(button, type, options) {
		var locale = originMacro.locale;
		var label = options.label ? options.label : locale[type];
		label = label ? label : locale.unknown;
		if(options && options.include) {
			$('<div class="roundelLabel" />').html(label).appendTo(button);
		}
		$(button).attr("title", label);
	},
	confirm: function(ev, msg, onYes, options) {
		options = options ? options : {};
		onYes = onYes ? onYes : function(ev) {};
		var btn = $(".originButton", $(ev.target).parents())[0];
		var popup = Popup.create(btn);
		$(popup).addClass("confirmationPopup");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		$("<button />").addClass("button").text(options.yesLabel || "yes").appendTo(popup).click(onYes);
		$("<button />").addClass("button").text(options.noLabel || "no").click(function(ev) {
			Popup.remove();
		}).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	alert: function(ev, msg) {
		var popup = Popup.create(ev.target);
		$(popup).addClass("confirmationPopup alert");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
	},
	reportDirty: function(el) {
		originMacro.alert(el, originMacro.locale.cannotPublishDirtyTiddler);
	},
	iconCommands: {
		"public": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var msg = locale.moveToPrivate;
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var target = $(ev.target);
						var onComplete = function(info) {};
						var privateBag = cmd.toggleBag(tiddler, "private");
						cmd.moveTiddler(tiddler, {
							title: tiddler.title,
							fields: { "server.bag": privateBag }
						}, onComplete);
					}, { yesLabel: locale.makePrivate, noLabel: locale.keepPublic });
				}
			}
		},
		"private": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var adaptor = tiddler.getAdaptor();
				var publishTo = tiddler.fields["publish.name"] || tiddler.title;
				var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
				tiddler.fields["server.workspace"] = workspace;
				var publicBag = cmd.toggleBag(tiddler, "public");
				var msg;
				msg = locale.publishPrivateDeletePrivate;
				var title = tiddler.title;
				var newTitle = publishTo || tiddler.title;
				tiddler.fields["server.page.revision"] = "false";
				store.addTiddler(tiddler);
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var onComplete = function(info) {};
						cmd.moveTiddler(tiddler, {
							title: newTitle,
							fields: { "server.bag": publicBag }
						}, onComplete);
					}, { yesLabel: locale.makePublic, noLabel: locale.keepPrivate });
				}
			}
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!!v0.6 (2010-04-21)
* added notification about cross-domain restrictions to ImportTiddlers
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
(function($) {

readOnly = false; //# enable editing over HTTP

var plugin = config.extensions.ServerSideSavingPlugin = {};

plugin.locale = {
	saved: "%0 saved successfully",
	saveError: "Error saving %0: %1",
	saveConflict: "Error saving %0: edit conflict",
	deleted: "Removed %0",
	deleteError: "Error removing %0: %1",
	deleteLocalError: "Error removing %0 locally",
	removedNotice: "This tiddler has been deleted.",
	connectionError: "connection could not be established",
	hostError: "Unable to import from this location due to cross-domain restrictions."
};

plugin.sync = function(tiddlers) {
	tiddlers = tiddlers && tiddlers[0] ? tiddlers : store.getTiddlers();
	$.each(tiddlers, function(i, tiddler) {
		var changecount = parseInt(tiddler.fields.changecount, 10);
		if(tiddler.fields.deleted === "true" && changecount === 1) {
			plugin.removeTiddler(tiddler);
		} else if(tiddler.isTouched() && !tiddler.doNotSave() &&
				tiddler.getServerType() && tiddler.fields["server.host"]) { // XXX: server.host could be empty string
			delete tiddler.fields.deleted;
			plugin.saveTiddler(tiddler);
		}
	});
};

plugin.saveTiddler = function(tiddler) {
	try {
		var adaptor = this.getTiddlerServerAdaptor(tiddler);
	} catch(ex) {
		return false;
	}
	var context = {
		tiddler: tiddler,
		changecount: tiddler.fields.changecount,
		workspace: tiddler.fields["server.workspace"]
	};
	var serverTitle = tiddler.fields["server.title"]; // indicates renames
	if(!serverTitle) {
		tiddler.fields["server.title"] = tiddler.title;
	} else if(tiddler.title != serverTitle) {
		return adaptor.moveTiddler({ title: serverTitle },
			{ title: tiddler.title }, context, null, this.saveTiddlerCallback);
	}
	var req = adaptor.putTiddler(tiddler, context, {}, this.saveTiddlerCallback);
	return req ? tiddler : false;
};

plugin.saveTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.changecount == context.changecount) { //# check for changes since save was triggered
			tiddler.clearChangeCount();
		} else if(tiddler.fields.changecount > 0) {
			tiddler.fields.changecount -= context.changecount;
		}
		plugin.reportSuccess("saved", tiddler);
		store.setDirty(false);
	} else {
		if(context.httpStatus == 412) {
			plugin.reportFailure("saveConflict", tiddler);
		} else {
			plugin.reportFailure("saveError", tiddler, context);
		}
	}
};

plugin.removeTiddler = function(tiddler) {
	try {
		var adaptor = this.getTiddlerServerAdaptor(tiddler);
	} catch(ex) {
		return false;
	}
	var context = {
		host: tiddler.fields["server.host"],
		workspace: tiddler.fields["server.workspace"],
		tiddler: tiddler
	};
	var req = adaptor.deleteTiddler(tiddler, context, {}, this.removeTiddlerCallback);
	return req ? tiddler : false;
};

plugin.removeTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.deleted === "true") {
			store.deleteTiddler(tiddler.title);
		} else {
			plugin.reportFailure("deleteLocalError", tiddler);
		}
		plugin.reportSuccess("deleted", tiddler);
		store.setDirty(false);
	} else {
		plugin.reportFailure("deleteError", tiddler, context);
	}
};

plugin.getTiddlerServerAdaptor = function(tiddler) { // XXX: rename?
	var type = tiddler.fields["server.type"] || config.defaultCustomFields["server.type"];
	return new config.adaptors[type]();
};

plugin.reportSuccess = function(msg, tiddler) {
	displayMessage(plugin.locale[msg].format([tiddler.title]));
};

plugin.reportFailure = function(msg, tiddler, context) {
	var desc = (context && context.httpStatus) ? context.statusText :
		plugin.locale.connectionError;
	displayMessage(plugin.locale[msg].format([tiddler.title, desc]));
};

config.macros.saveToWeb = { // XXX: hijack existing sync macro?
	locale: { // TODO: merge with plugin.locale?
		btnLabel: "save to web",
		btnTooltip: "synchronize changes",
		btnAccessKey: null
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		createTiddlyButton(place, this.locale.btnLabel, this.locale.btnTooltip,
			plugin.sync, null, null, this.locale.btnAccessKey);
	}
};

// hijack saveChanges to trigger remote saving
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(window.location.protocol == "file:") {
		_saveChanges.apply(this, arguments);
	} else {
		plugin.sync(tiddlers);
	}
};

// override removeTiddler to flag tiddler as deleted -- XXX: use hijack to preserve compatibility?
TiddlyWiki.prototype.removeTiddler = function(title) { // XXX: should override deleteTiddler instance method?
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
		tiddler.text = plugin.locale.removedNotice;
		tiddler.fields.deleted = "true"; // XXX: rename to removed/tiddlerRemoved?
		tiddler.fields.changecount = "1";
		this.notify(title, true);
		this.setDirty(true);
	}
};

// hijack ImportTiddlers wizard to handle cross-domain restrictions
var _onOpen = config.macros.importTiddlers.onOpen;
config.macros.importTiddlers.onOpen = function(ev) {
	var btn = $(resolveTarget(ev));
	var url = btn.closest(".wizard").find("input[name=txtPath]").val();
	if(window.location.protocol != "file:" && url.indexOf("://") != -1) {
		var host = url.split("/")[2];
		var macro = config.macros.importTiddlers;
		if(host != window.location.host) {
			btn.text(macro.cancelLabel).attr("title", macro.cancelPrompt);
			btn[0].onclick = macro.onCancel;
			$('<span class="status" />').text(plugin.locale.hostError).insertAfter(btn);
			return false;
		}
	}
	return _onOpen.apply(this, arguments);
};

})(jQuery);
//}}}
/***
|''Name''|GroupByPlugin|
|''Description''|Mimics allTags macro to provide ways of creating lists grouping tiddlers by any field|
|''Version''|0.6.1|
|''Author''|Jon Robson|
|''Status''|beta|
!Usage
{{{<<groupBy tags>>}}}
mimics allTags macro

{{{<<groupBy server.bag>>}}}
groups by the server.bag field (this version contains TiddlySpace specific code for turning a bag into a space name)

{{{groupBy modified dateFormat:"YYYY"}}}
group tiddlers by year.

{{{<<groupBy tags exclude:excludeLists exclude:systemConfig>>}}}
group tiddlers by tag but exclude the tags with values excludeLists and systemConfig

Within that group you can also exclude things by filter
{{{groupBy modifier filter:[tag[film]]}}}
will group tiddlers tagged with film by modifier.
***/
//{{{
(function($) {
var taglocale = config.views.wikified.tag;
var macro = config.macros.groupBy = {
	locale: {
		tooltip: "all tiddlers in group %0",
		noTiddlers: "no tiddlers",
		openAllText: taglocale.openAllText,
		openAllTooltip: taglocale.openAllTooltip,
		openTiddler: "open tiddler with title %0"
	},
	morpher: {
		// TODO: note currently the following 2 morphers are TiddlySpace specific and probably should be in separate plugin
		"server.workspace": function(value, options) {
			return macro.morpher["server.bag"](value.replace("bags/", "").replace("recipes/", ""));
		},
		"server.bag": function(value, options) {
			if(typeof(value) !== "string") {
				return false;
			} else if(value.indexOf("_public") === -1 && value.indexOf("_private") === -1) {
				value = "*%0".format(value); // add star for non-space bags.
			}
			return value.replace("_public", "").replace("_private", "");
		},
		created: function(value, options) {
			return value.formatString(options.dateFormat || "DD MMM YYYY");
		},
		modified: function(value, options) {
			return macro.morpher.created(value, options);
		}
	},

	handler: function(place, macroName, params, wikifier, paramString) {
		var field = params[0] || "server.workspace";
		var dateFormat = params[1] || "DD MMM YYYY";
		var container = $("<div />").attr("macroName", macroName).addClass("groupBy").
			attr("refresh", "macro").attr("fieldName", field).
			attr("paramString", paramString).
			attr("dateFormat", dateFormat).appendTo(place)[0];
		macro.refresh(container);
	},
	isTypeArray: function(value) {
		var valueType = typeof value;
		if(valueType === "object" && typeof value.length === "number" &&
			!(value.propertyIsEnumerable("length")) &&
			typeof value.splice === "function") { //is Array
			return true;
		} else {
			return false;
		}
	},
	_onClickGroup: function(ev, options) {
		var i, target = ev.target, locale = macro.locale;
		var tiddlers = $(target).closest(".templateContainer").data("tiddlers");
		var popup = $(Popup.create(target)).addClass("taggedTiddlerList")[0];
		var value = $(target).attr("value");
		var openAll = createTiddlyButton($("<li />").appendTo(popup)[0],
			locale.openAllText.format(value), locale.openAllTooltip);
		$(openAll).click(function(ev) {
			story.displayTiddlers(ev.target, tiddlers);
			return false;
		});
		var listBreak = $("<li />").addClass("listBreak").html("<div />").appendTo(popup);
		for(i = 0; i < tiddlers.length; i++) {
			var item = $("<li />").appendTo(popup)[0];
			var template = store.getTiddlerText(options.template) || macro.template;
			wikify(template, item, null, tiddlers[i]);
		}
		listBreak.clone().appendTo(popup);
		$(createTiddlyLink($("<li />").appendTo(popup)[0], value, false)).
			text(locale.openTiddler.format(value));
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	_refresh: function(container, tiddlers, options) {
		var totalGroups = 0, locale = macro.locale, i, j;
		var excludeValues = options.exclude;
		var values = {}, value_ids = [];
		var field = options.field;
		var morpher = macro.morpher[field] || function(value) {
			return value;
		};
		for(i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var value = tiddler[field] || tiddler.fields[field];
			value = macro.isTypeArray(value) ? value : [ value ];
			for(j = 0; j < value.length; j++) {
				var v = morpher(value[j], options);
				if(v && $.inArray(v, excludeValues) === -1) {
					totalGroups += 1;
					if(!values[v]) {
						values[v] = [];
					}
					values[v].push(tiddler);
					value_ids.pushUnique(v);
				}
			}
		}
		var ul = $("<ul />").appendTo(container)[0];
		if(totalGroups === 0) {
			$("<li />").addClass("listTitle").text(locale.noTiddlers);
		}
		value_ids = value_ids.sort();
		var groupTemplate = store.getTiddlerText(options.groupTemplate);
		var onClick = function(ev) {
			macro._onClickGroup(ev, options);
		};
		for(i = 0; i < value_ids.length; i++) {
			var title = value_ids[i];
			var info = getTiddlyLinkInfo(title);
			tiddlers = values[title];
			var btn = createTiddlyButton($("<li />").appendTo(ul)[0],
				"%0 (%1)".format(title, tiddlers.length), locale.tooltip.format(title), null, info.classes);
			if(groupTemplate) {
				$(btn).empty();
				wikify(groupTemplate, btn, null, tiddlers[0]);
			}
			$(btn).click(onClick).attr("value", title).attr("refresh", "link").attr("tiddlyLink", title);
			$(btn).addClass("templateContainer").data("tiddlers", tiddlers);
		}
	},
	refresh: function(container) {
		container = $(container).empty();
		var paramString = container.attr("paramString");
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { field: container.attr("fieldName"), dateFormat: container.attr("dateFormat"), exclude: args.exclude || [],
			template: args.template ? args.template[0] : false, groupTemplate: args.groupTemplate ? args.groupTemplate[0] : "" };
		var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers("title");
		macro._refresh(container, tiddlers, options);
	},
	template: "<<view title link>>"
};

}(jQuery));
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''Name''|TiddlySpaceViewTypes|
|''Version''|0.6.0|
|''Status''|@@beta@@|
|''Description''|Provides TiddlySpace specific view types|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceViewTypes.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin|
!Usage
Provides replyLink, spaceLink and SiteIcon view types.
!!SiteIcon view parameters
* labelPrefix / labelSuffix : prefix or suffix the label with additional text. eg. labelPrefix:'modified by '
* spaceLink: if set to "yes" will make any avatars link to the corresponding space. {{{<<originMacro spaceLink:yes>>}}}

!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;
var tweb = config.extensions.tiddlyweb;

config.macros.view.replyLink = {
	locale: {
		label: "Reply to this tiddler"
	}
};

var _replyButtons = [];
var _replyInitialised, _replyScriptLoaded;
config.macros.view.views.replyLink = function(value, place, params, wikifier,
		paramString, tiddler) {
	var valueField = params[0];
	var imported;
	if(valueField == "title") { // special casing for imported tiddlers
		var localTitle = tiddler.title;
		var serverTitle = tiddler.fields["server.title"];
		if(serverTitle && localTitle != serverTitle) {
			value = serverTitle ? serverTitle : localTitle;
			imported = true;
		}
	} else {
		title = tiddler[valueField] ? tiddler[valueField] : tiddler.fields[valueField];
	}
	var args = paramString.parseParams("anon")[0];
	var label = (args.label) ? args.label : config.macros.view.replyLink.locale.label;
	var space;
	if(tiddler) {
		var bag = tiddler.fields["server.bag"];
		space = tiddlyspace.resolveSpaceName(bag);
	}
	var container = $('<span class="replyLink" />').appendTo(place)[0];

	tweb.getUserInfo(function(user) {
		if ((!user.anon) && ((space && user.name != space &&
				user.name != tiddlyspace.currentSpace.name) || imported)) {
			var link = $("<a />")
				.text(config.macros.view.replyLink.locale.label)
				.appendTo(container)[0];

			if(typeof(createReplyButton) === "undefined") {
				_replyButtons.push(link);
			}
			if(_replyInitialised) {
				createReplyButton(link);
			} else if(!_replyScriptLoaded) {
				_replyScriptLoaded = true;
				$.getScript("/bags/common/tiddlers/_reply-button.js",
					function() {
						_replyInitialised = true;
						for(var i = 0; i < _replyButtons.length; i++) {
							createReplyButton(_replyButtons[i]);
						}
						_replyButtons = [];
					});
			}
		}
	});

};

config.macros.view.views.spaceLink = function(value, place, params, wikifier,
		paramString, tiddler) {
		var spaceName = tiddlyspace.resolveSpaceName(value);
		var isBag = params[0] == "server.bag" && value === spaceName ? true : false;
		var args = paramString.parseParams("anon")[0];
		var titleField = args.anon[2];
		var labelField = args.labelField ? args.labelField[0] : false;
		var label;
		if(labelField) {
			label = tiddler[labelField] ? tiddler[labelField] : tiddler.fields[labelField];
		} else {
			label = args.label ? args.label[0] : false;
		}
		var title = tiddler[titleField] ? tiddler[titleField] : tiddler.fields[titleField];

		var link = createSpaceLink(place, spaceName, title, label, isBag);
		if(args.external && args.external[0] == "no") {
			$(link).click(function(ev) {
				var el = $(ev.target);
				var title = el.attr("tiddler");
				var bag = el.attr("bag");
				var space = el.attr("tiddlyspace");
				bag = space ? space + "_public" : bag;
				if(title && bag) {
					ev.preventDefault();
					tiddlyspace.displayServerTiddler(el[0], title,
						"bags/" + bag);
				}
				return false;
			});
		}
};

config.macros.view.views.SiteIcon = function(value, place, params, wikifier,
		paramString, tiddler) {
	var options = originMacro.getOptions(paramString);
	if(!tiddler || value == "None") { // some core tiddlers lack modifier
		value = false;
	}
	var field = params[0];
	if(field == "server.bag") {
		options.notSpace = !originMacro._isSpace(value);
	}
	tiddlyspace.renderAvatar(place, value, options);
};

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

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

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

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

config.formatterHelpers.addStretchHandlers=function(e,stretchW,stretchH) {
	e.title=((stretchW||stretchH)?'DRAG=stretch/shrink, ':'')
		+'SHIFT-CLICK=show full size, CTRL-CLICK=restore initial size';
	e.statusMsg='width=%0, height=%1';
	e.style.cursor='move';
	e.originalW=e.style.width;
	e.originalH=e.style.height;
	e.minW=Math.max(e.offsetWidth/20,10);
	e.minH=Math.max(e.offsetHeight/20,10);
	e.stretchW=stretchW;
	e.stretchH=stretchH;
	e.onmousedown=function(ev) { var ev=ev||window.event;
		this.sizing=true;
		this.startX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
		this.startY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
		this.startW=this.offsetWidth;
		this.startH=this.offsetHeight;
		return false;
	};
	e.onmousemove=function(ev) { var ev=ev||window.event;
		if (this.sizing) {
			var s=this.style;
			var currX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var currY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var newW=(currX-this.offsetLeft)/(this.startX-this.offsetLeft)*this.startW;
			var newH=(currY-this.offsetTop )/(this.startY-this.offsetTop )*this.startH;
			if (this.stretchW) s.width =Math.floor(Math.max(newW,this.minW))+'px';
			if (this.stretchH) s.height=Math.floor(Math.max(newH,this.minH))+'px';
			clearMessage(); displayMessage(this.statusMsg.format([s.width,s.height]));
		}
		return false;
	};
	e.onmouseup=function(ev) { var ev=ev||window.event;
		if (ev.shiftKey) { this.style.width=this.style.height=''; }
		if (ev.ctrlKey)  { this.style.width=this.originalW; this.style.height=this.originalH; }
		this.sizing=false;
		clearMessage();
		return false;
	};
	e.onmouseout=function(ev) { var ev=ev||window.event;
		this.sizing=false;
		clearMessage();
		return false;
	};
}
//}}}
/***
|''Name''|DiffFormatter|
|''Description''|highlighting of text comparisons|
|''Author''|FND|
|''Version''|0.9.0|
|''Status''|beta|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/FND/formatters/DiffFormatter.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Keywords''|formatting|
!Description
Highlights changes in a unified [[diff|http://en.wikipedia.org/wiki/Diff#Unified_format]].
!Notes
Based on Martin Budden's [[DiffFormatterPlugin|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/DiffFormatterPlugin.js]].
!Usage
The formatter is applied to blocks wrapped in <html><code>{{{diff{..}}}</code></html> within tiddlers tagged with "diff".
!Revision History
!!v0.9 (2010-04-07)
* initial release; fork of DiffFormatterPlugin
!StyleSheet
.diff { white-space: pre; font-family: monospace; }
.diff ins, .diff del { display: block; text-decoration: none; }
.diff ins { background-color: #dfd; }
.diff del { background-color: #fdd; }
.diff .highlight { background-color: [[ColorPalette::SecondaryPale]]; }
!Code
***/
//{{{
(function() {

config.shadowTiddlers.StyleSheetDiffFormatter = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("StyleSheetDiffFormatter", refreshStyles);

var formatters = [{
		name: "diffWrapper",
		match: "^\\{\\{diff\\{\n", // XXX: suboptimal
		termRegExp: /(.*\}\}\})$/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "div", null, "diff");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRange",
		match: "^(?:@@|[+\\-]{3}) ",
		lookaheadRegExp: /^(?:@@|[+\-]{3}) .*\n/mg,
		handler: function(w) {
			createTiddlyElement(w.output, "div", null, "highlight").
				innerHTML = "&#8230;";
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	}, {
		name: "diffAdded",
		match: "^\\+",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "ins", null, "added");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRemoved",
		match: "^-",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "del", null, "removed");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}
];

config.parsers.diffFormatter = new Formatter(formatters);
config.parsers.diffFormatter.format = "diff";
config.parsers.diffFormatter.formatTag = "diff";

})();
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="364 157 64 51" width="30" height="30"><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path class="glyph" d="M 364.50006 184.50061 L 386.99985 207.00037 L 396 198.00002 L 373.50003 175.50066 Z M 403.02295 181.97704 C 400.38693 179.34099 396.11307 179.34099 393.47702 181.97704 C 390.841 184.61307 390.841 188.88695 393.47702 191.52298 C 396.11307 194.15903 400.38693 194.15903 403.02295 191.52298 C 405.65906 188.88695 405.65906 184.61307 403.02295 181.97704 M 414.27298 170.72704 C 411.63693 168.091 407.36307 168.091 404.72702 170.72704 C 402.091 173.36308 402.091 177.63693 404.72702 180.27296 C 407.36307 182.90901 411.63693 182.90901 414.27298 180.27296 C 416.90903 177.63693 416.90903 173.36308 414.27298 170.72704 M 425.523 159.47705 C 422.88696 156.841 418.6131 156.841 415.97705 159.47705 C 413.341 162.11308 413.341 166.38695 415.97705 169.02295 C 418.6131 171.65903 422.88696 171.65903 425.523 169.02295 C 428.15906 166.38695 428.15906 162.11308 425.523 159.47705" fill="#020202"/></g></g></svg>
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.8|
|''Description''|provides a toolbar command for cloning external tiddlers|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceCloneCommand.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Code
***/
//{{{
(function($) {

var cmd = config.commands;
var tiddlyspace = config.extensions.tiddlyspace;

var fieldsCache = {};

cmd.cloneTiddler = {
	text: cmd.editTiddler.text,
	tooltip: "Create a copy of this tiddler in the current space",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !config.filterHelpers.is.local(tiddler) && !readOnly;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			fieldsCache[title] = $.extend({}, tiddler.fields);
			tiddler.fields["server.workspace"] = tiddlyspace.getCurrentWorkspace(config.options.chkPrivateMode ?
		"private" : "public");
			tiddler.fields["server.permissions"] = "read, write, create"; // no delete
			delete tiddler.fields["server.page.revision"];
			delete tiddler.fields["server.title"];
			delete tiddler.fields["server.etag"];
			// special handling for pseudo-shadow tiddlers
			if(tiddlyspace.coreBags.contains(tiddler.fields["server.bag"])) {
				tiddler.tags.remove("excludeLists");
			}
		} else { // ensure workspace is the current space
			var el = story.findContainingTiddler(src);
			el = $(el);
			var fields = el.attr("tiddlyfields");
			if(fields) { // inherited via TiddlyLink
				fields = fields.decodeHashMap();
				fields["server.workspace"] = config.
					defaultCustomFields["server.workspace"];
			} else {
				fields = config.defaultCustomFields;
			}
			fields = String.encodeHashMap(fields);
			el.attr("tiddlyfields", fields);
		}
		cmd.editTiddler.handler.apply(this, arguments);
		if(tiddler) {
			tiddler.fields["server.permissions"] += ", delete";
		}
		return false;
	}
};

cmd.editTiddler.isEnabled = function(tiddler) {
	return !cmd.cloneTiddler.isEnabled.apply(this, arguments);
};

// hijack cancelTiddler to restore original fields
var _cancelHandler = cmd.cancelTiddler.handler;
cmd.cancelTiddler.handler = function(ev, src, title) {
	var tiddler = store.getTiddler(title);
	if(tiddler) {
		tiddler.fields = fieldsCache[title] || tiddler.fields;
		delete fieldsCache[title];
	}
	return _cancelHandler.apply(this, arguments);
};

// hijack saveTiddler to clear unused fields stash
var _saveHandler = cmd.saveTiddler.handler;
cmd.saveTiddler.handler =  function(ev, src, title) {
	delete fieldsCache[title];
	return _saveHandler.apply(this, arguments);
};

})(jQuery);
//}}}
/***
|''Name''|EditTemplateFieldsPlugin|
|''Version''|0.4.6|
|''Status''|beta|
|''Author''|Jon Robson|
|''Description''|Provides editing of custom fields|
|''Requires''||
|''Source''||
!Usage
put {{{<div macro="editFields"></div>}}} into your EditTemplate.
or {{{<div macro="viewFields"></div>}}} into your ViewTemplate.
!Todo
Support newlines in input boxes.
!Code
***/
//{{{
(function($) {
var viewFields = config.macros.viewFields = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var fields = editFields.getFields(tiddler).concat(params);
		var done = {};
		for(var i = 0; i < fields.length; i++) {
			var name = fields[i];
			var val = tiddler.fields[name];
			if(!done[name] && val) {
				done[name] = true;
				$("<div class='fieldValue' />").text("%0 : %1".format(name, val)).appendTo(place);
			}
		}
	}
};

var editFields = config.macros.editFields = {
	fieldType: {
		images: ["image", "geo.marker"]
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var options = {
			fields: params
		};
		this.createInterface(place, tiddler, options);
	},
	getFields: function(tiddler) {
		var whitelisted = ["changecount"];
		var fields = [];
		for(var i in tiddler.fields) {
			var val = tiddler.fields[i];
			if(i.indexOf("server.") !== 0 && i.indexOf("_") !== 0 && typeof(val) == "string" && !whitelisted.contains(i) && val) {
				fields.push(i);
			}
		}
		return fields;
	},
	createInterface: function(place, tiddler, options) {
		var fieldContainer = $("<div class='tiddlerCustomFields' />").appendTo(place);
		var included = [];
		if(tiddler) {
			var fields = editFields.getFields(tiddler);
			for(var i = 0; i < fields.length; i++) {
				var name = fields[i];
				var val = tiddler.fields[name];
				this.addNewField(fieldContainer, name, val);
				included.push(name);
			}
		}
		for(var j = 0; j < options.fields.length; j++) {
			var field = options.fields[j];
			if(!included.contains(field)) {
				this.addNewField(fieldContainer, field, "");
			}
		}
		$("<button />").text("add new field").click(function() {
			editFields.addNewField(fieldContainer, "", "");
		}).appendTo(place);
	},
	addNewField: function(place, name, value) {
		var container = $("<div />").appendTo(place);
		if(editFields.fieldType.images.contains(name)) {
			valueInput = $("<select />");
			$("<option />").val("").text("").appendTo(valueInput);
			$.each(store.filterTiddlers("[is[image]]"), function(i, tiddler) {
				var opt = $("<option />").val(tiddler.title).text(tiddler.title).appendTo(valueInput)[0];
				if(value === tiddler.title) {
					$(opt).attr("selected", true);
				}
			});
		} else {
			type = value.indexOf("\n") > -1 ? "textarea" : "text";
			var valueInput = type == "text" ? $("<input type='text' />") : $("<textarea />");
		}
		valueInput.attr("edit", name).val(value).appendTo(container);
		$("<button class='delete' />").text("delete").click(function(ev) {
			var answer = confirm("Are you sure you want to remove this field?");
			if(answer) {
				var attr = $(ev.target).attr("field");
				var p = $(ev.target).parent();
				$("[edit]", p).val("");
				$(p).hide();
			}
		}).appendTo(container);
		var nameInput = $("<input class='fieldName' type='text' />").val(name).
			change(function(ev) {
				var el = $(ev.target);
				valueInput.attr("edit", el.val());
			}).prependTo(container);
	}
}
})(jQuery);
//}}}
/***
|''Name''|DiscussPlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|outputs the (modified) html representation with disqus in an iframe for a tiddler on TiddlySpace|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/DiscussPlugin.min.js|
|''Documentation''|http://discuss.tiddlyspace.com|
|''Version''|0.9.3 (2013-09-06)|
|''~CoreVersion''|2.5.2|
|''Requires''|TiddlySpace / TiddlyWeb|
|''License''|Creative Commons 3.0|
***/
// /%
(function(e){config.macros.discuss={config:{always:false,tplSlider:'Show comments for \'\'"""%0"""\'\'  """//""" <<discuss count [[%0]]>>',tipSlider:"Click to show comments for %0...",url:"",header:"{{discuss_header{\nLeave a comment at tiddler [[%0]]...\n}}}",css:{width:"100%",height:"400px",border:"0",marginTop:"1em"}},handler:function(t,n,r,i,s,o){var u,a,f,l=this.config,c=o?o.title:"",h=s.parseParams("anon",null,true),p=getParam(h,"always",l.always),d=store.getTiddlerText(getParam(h,"template",""));if(r[0]=="count"){this.count(r[1],t);return}if(!c||!store.getTiddler(c))return;a=e('<div class="discuss_panel"/>').attr({url:getParam(h,"url",l.url)+"/"+encodeURIComponent(c),title:c}).css("marginTop","1em").appendTo(e(t));if(p){wikify(l.header.format([c]),a[0]);this.render(a[0])}else{u=e("<div/></div>").attr({"class":"button discuss_button",title:l.tipSlider.format([c])}).css({cursor:"pointer",padding:"0.5em 1%",width:"98%"}).appendTo(a).click(this.show);wikify((d?d:l.tplSlider).format([c]),u[0])}},render:function(t,n){var r=config.macros.discuss.config,i=e(t).closest(".discuss_panel");e("<iframe/>").hide().css(r.css).attr({src:i.attr("url")}).appendTo(i).slideDown()},show:function(t){console.log("click");var n=e(this),r=e(resolveTarget(t||window.event));if(!r.is(".discuss_button, .discuss_count")&&r.is("a"))return true;config.macros.discuss.render(n[0],true);n.remove();return false},count:function(t,n){config.extensions.tiddlyweb.getStatus(function(){var r,i=config.extensions.tiddlyspace.currentSpace.name,s=config.extensions.tiddlyspace.getHost(config.extensions.tiddlyweb.status.server_host,i);e("<a/>").attr({"class":"discuss_count","data-disqus-identifier":t,href:s+"/"+encodeURIComponent(t)+"#disqus_thread"}).appendTo(n);r=document.createElement("script");r.async=true;r.type="text/javascript";r.src="http://"+i+"-tiddlyspace.disqus.com/count.js";console.log(r);(document.getElementsByTagName("HEAD")[0]||document.getElementsByTagName("BODY")[0]).appendChild(r)})}}})(jQuery)
// %/
<<tabs
	txtMainTab
	Recent "Recently edited tiddlers" TabTimeline
	Tags "All tags" TabTags
	All "All tiddlers" TabAll
	More "Admin stuff" TabMore
>>