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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.sparkline {line-height:1em;}
.sparktick {outline:0;}

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

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

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

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

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

----
Also see [[AdvancedOptions]]
<<importTiddlers>>

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/calculus2.jpg]]

//This is an article I submitted to 100 Kwentong Peyups, a collection of UP stories published in Philippine Daily Inquirer and The Philippine Star. 100 Kwentong Peyups is part of UP's 100th year celebration.  The article was published in PDI on May 5, 2008, Section F4.//

It's been more than ten years since I took up differential and integral calculus (more familiarly known as Math 54)  during my college days in UP Diliman.   I've long forgotten most of the formulas and techniques I  learned  then, but the memory of the person who taught them to me remains vivid.

She was Ma’am K.  The first thing that struck me about  Ma'am K was her mastery of the subject  she was teaching.  She would explain things with conviction and authority, even reciting long theorems from memory.  She also remained focused on the exposition of the lesson. Once, while teaching, the chalk fell off her hand, but she continued with the discussion even as she was picking it up  from the floor.  Later on, it became obvious to me that she possessed an extraordinary intelligence.

But Ma’am K was not just an intelligent instructor, she was also a competent one.  I've met some very intelligent professors  in U.P., but many of them, sad to say, do not know how to teach.  They seem to have come from outer space  to teach, in their alien language, esoteric realities to mere human beings.  But Ma’am K wasn’t a bit like them. She came well-prepared for class; it was  obvious that she put time and effort into making her lectures as clear as possible.  She also had the patience to repeat parts of the lecture to those who did not understand them the first time around.

Dedication was another trait of Ma’am K.  Two  days after an exam  she came with our blue books -examination papers- already checked! After a year-and-a-half of studying in U.P., I   had already gotten used to seeing my exam results, at the earliest, after two weeks; that is, if I ever   got to see them at all.  Seeing the results of my exams only after two days was  something extraordinary. But that  wasn't all.   As I was checking my own exam paper, I noticed that she wrote some notes on the numbers in which I didn’t get a full mark. They were problem-solving questions. She  didn't just give the partial marks that were due to me, but she also showed how to solve the problem from the point where I committed a mistake all the way to the final solution.  What’s even more surprising is that she did this for the entire class!   Recalling this incident still amuses me up to now.

Self-giving was another quality of hers.  Once, she came to the class  looking like she was not feeling well. She confessed that she had missed her Masters class because she felt sick. But she thought that, since we were approaching our long exams, it would be better for her to come to our class in order to help us review.  She said, in a rather matter-of-fact way,  “If it were all up to me, I would not go to school today and still get the grades that I want.”  She was, I heard, getting  flat 1’s in her Masters subjects.   But she  wasn't just thinking of herself and of her flat 1’s.

Ma’am K also showed understanding and trust.  At the first half of the semester, I was doing well and  getting high scores in the exams.  But afterwards, my performance began to suffer.  It was due to a project in my programming class, which was a major subject.  I took time off  in order to work on  it and soon, I suffered the consequences.  At the end of the sem, she requested her students to get their class cards directly from her.  She wanted to talk briefly to each one of us before finally letting us go.  When I went to get my class card, she explained to me the criteria for computing the final grade and went over my performance .  Then she gave me my final grade- 1.75. She asked me, “Do you think you deserve this grade”?  I thought for a while, and, knowing that I would have gotten a much better grade had I spent more time on the subject, I replied “Yes.”  She smiled a little and explained that my average was actually closer to 2.0 than to 1.75, but she decided to give me a 1.75 anyway.  I initially felt humiliated, but later on I felt understood and trusted.  I got a grade that, based on my actual performance for the subject, I did not deserve.  She  gave it to me nevertheless  in the hope that I  would put greater effort next time around into getting and deserving the grades that I am actually capable of getting.

More than ten years  later, the lessons on virtues that I learned from Ma’am K  are still fresh in my mind.  I have made use of them often times in the talks on character and competence that I usually give to students . I have now put her lessons into writing as a way of expressing my gratitude for her.  

That was Ma’am K.  She taught me how to analyze transcendental functions, but she also taught me things that transcend those functions. She taught me limit theorems in Calculus but also taught me lessons that go beyond the limits of Calculus.  Her lessons on competence, dedication, self-giving, understanding and trust have left their mark on me more deeply than her lessons on Calculus.  And I’m just glad it turned out that way.

-NEWind

//Photo credit: '+) Integrated (+' by ~VinnyPrime in www.sxc.hu// 
__''test''__
^^posted by YourName on Saturday, January 23rd, 2010 at 6:48:08 pm^^
<<<
test
<<<
Type the text for '@errands'
A TRESE TRILOGY
More than Many Sparrows / Wisdom Shall Enter / Many are One

Answers to Critical Questions About Faith, Loving and Living
by Leo J. Trese

I especially liked Wisdom Shall Enter, the second portion of this trilogy. As a cradle Catholic, I was struck at how the author provided reasons (and excellent ones at that!) for the many beliefs that I held but was not diligent enough to find the reasons for believing them. Another excellent thing about this book is that it explains the Catholic faith and its teachings from ground up- it doesn't assume you're Catholic, Christian or even Theist (one who believes in God). It provides explanations on why we have to believe in God, what is man's purpose on earth, why Jesus Christ is not just an extraordinary man, why Jesus Christ really and historically resurrected, why the Catholic church contains the fullness of faith, etc.
An excellent book for non-Catholics interested in knowing more about the Catholic faith or for Catholics who want to know the basis for their belief. Afterall, faith is not illogical or unreasonable. There are sound reasons for believing the different elements of the Christian creed.

The other two portions provide excellent explanations, insights and suggestions on how to live the demands of the Christian life.

//From Sinagtala.com://
God picked each of us out from an unlimited number of other possible souls because of a special and particular love for us. He wanted you, and nobody else would do.
From three of the best-loved books of Leo J Trese, to Catholics and non-Catholics alike, helpful answers on questions about faith, loving and living.
//Lessons learned from Artificial Intelligence//

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/digital_dreams.jpg]]

//I began my graduate studies in computer science in 2003.   After 3 years of part time study, I started groping for a thesis topic in Artificial Intelligence (AI).  The experience was fun (and torturing- I had to change topics 3 times, but it was still fun… and torturing).  I learned a couple of things along the way. I outline these things in this article.//

!Error feedback leads to perfection
''Neural Networks'' (NN) is an AI technique that mimics how a brain learns through billions of neurons and their interactions with each other.  One of the most popular training (or learning) method for Neural Networks rely on informing other (digital) neurons about the error levels of the current output of the network. This is called the Back Propagation Neural Network.
!!!Lesson
Many times we dread facing our faults, whether we discover them ourselves or others inform us about them. But come to think of it, they are the best way to improve. Knowing our enemy is already half the battle. Improvement through feedback is practiced in many sectors of society:  companies, academe, arts, etc.

!Don’t be afraid to try out something new
''Genetic Algorithm'' is a technique that is derived from the theory of evolution- populations improve through natural selection, survival of the fittest and mutation over several generations.  Only the fittest of the individuals are allowed to breed to produce the next generation.

Mutation is important in this technique because through it the entire range of possible individuals could be generated.  Mutation in GA is a tool used in order to avoid settling in a relative (or local) optimum which is not yet the true (or global) optimum.
!!!Lesson
It may just lead to a better solution, method or scheme.  But again, remember to compare the performance of the new method with the existing one.
 
!Combine focus with exploration
''Particle Swarm Optimization'' (PSO) is a technique inspired by the flocking of birds in search for food.  There are two elements that drive the technique to find an optimal solution: first, the individual’s ability to find a good solution; and second, the influence of the other individual’s success in finding the best solution. Thus, there is an individual and social aspect in this technique.  The PSO is a simple yet very powerful technique that has enjoyed popularity in recent years.
!!!Lesson
Try to improve continuously on an existing method, but it would also be good to explore other methods which may offer better results. This is not just an endless itch for novelty because the success of the new methods always has to be compared with those of the existing method.

!Act now, improve, then iterate: small incremental improvements could mean a big difference. 
NN, GA and PSO all have a training (or learning) phase in which the algorithm (program) is run over hundreds of iterations.  Each succeeding generation improves the results of the previous generation.
!!!Lesson
One of my first lessons in doing thesis: don’t get stuck with reading literature and theorizing.  My adviser would always say: “Read, experiment, analyze.  You have to complete the cycle. Afterwards you iterate”.  Iterate. That word stuck to me. Don’t wait for the perfect opportunity before implementing something.  Start with whatever resources you have now; analyze, then iterate.  Iterate! You’ll love the word soon enough.


!A Hidden Intelligence works in nature.
AI has come up with effective techniques for solving real world problems by adapting things that can be found in nature: neurons in the human brain, evolution in organisms, and birds flocking to look for food.

Think about this: it took man thousands of years to mimic what birds have been doing since they were made.  If you think that’s bad already, here’s something worse: it took man (again) thousands of years to figure out how ants, look for food and why they are successful in doing it (this is adapted in AI via the Ant Colony Optimization technique).  Ants have been doing it since they were created.

These thoughts lead one to think that there is an Intelligence at work in nature.  I admit that there is a jump from science to philosophy here, but I cannot resist to make the jump.

I’d like to take evolution as a specific example. Evolution can’t take place without purpose, without design, without intelligence.  In the Genetic Algorithm that was mentioned, a fitness rule has to be given by the GA designer for the program to work. Without a GA designer, the program will not know to where the individuals should evolve to.  I’m inclined to think it’s the same in nature. The evolution of one species to another has not yet been clearly established; however, even if it’s proven it cannot discharge of a Designer which has placed the purpose, the objective towards which the organism has to evolve to.

!Conclusion
I don’t need Artificial Intelligence to learn all these lessons.  Therefore, I just wasted five years of my life in graduate studies. But then again, learning these lessons the hard way ingrained them in my memory more deeply.

-NEWind
!Contact
Please send feedback to ''newind27 (at) gmail (dot) com''.
Get updates from Twitter: ''@_asymptotes_''
!Credits
This web notebook was created using [[TiddlyWiki|http://tiddlywiki.com]], a free, Open Source program created by Jeremy Ruston.
Many thanks to Jeremy Ruston and all the authors of the different plugins used for this site.  The images were taken mostly from 
[[Stock.XCHNG|http://www.sxc.hu/]], a great site for getting royalty-free images.

/%
I am currently involved in a non-profit organization that promotes the holistic formation of  young people. My interests include computing, J.R.R. Tolkien, Christian apologetics, languages, sports and humor.

~PlugIns for this site:
*~CoreTweaksPlugIn, ~CopyTiddlerPlugin, ~ExportTiddlersPlugin, ~TagCloudPlugin and ~GotoPlugin by Eric Shulman at http://www.tiddlytools.com
*~RenameTagsPlugin and ~LessBackupsPlugin by Simon Baird (http://mptw.tiddlyspot.com)
*~ForEachTiddlerPlugin by Udo Borkowski  (http://tiddlywiki.abego-software.de)
*~TiddlersBarPlugin by Pascal Collin (http://visualtw.ouvaton.org/VisualTW.html)
*~NewHereCommand, code originally by Arphen Lin; small tweak by Simon Baird (http://simonbaird.com/mptw/#NewHereCommand)
%/
Above all shadows rides the Sun.

-[[J.R.R. Tolkien]], [[The Lord of the Rings]]
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/wyd08.jpg]]

//It’s been a year since World Youth Day 2008.  The chants, cheers, greetings and fanfare of those days have died down, but their memories still find echo in the minds and hearts of the participants.

Act1v8 refers to WYD 08's theme taken from "ACT"s "1 V"erse" 8":
“You will receive power when the Holy Spirit has come upon you; and you will be my witnesses." 
//
!Memorable experiences
*"Walking along the streets of Sydney, chanting with thousands of other pilgrims: “Aussie, Aussie, Aussie… Oi, oi, oi”. " The youth of the world seems to be waking up the slumbering church in Australia.
*"Seeing the flags of China and other Middle East countries in the pilgrim walks".It encouraged praying for the Church  in those countries where Christianity is a minority.
*"Singing the WYD theme song, in a dark night dotted by the lights of  the candles held by the pilgrims". It enkindled in the hearts of many a great hope for the church. 
*"Seeing many people praying in a large tent where the Blessed Sacrament is kept and seeing other people lining up for confession outside and inside the tent". It showed that the World Youth Day is not just the Christian version of the Woodstock; conversions happen in this massive gathering.
*"Praying the Way of the Cross". The whole thing was very moving.  The related passages from the Bible were read as the words were flashed to widescreens; important words and phrases animated as they were being read; the scene was re-enacted by actors; prayerful songs were played.
*"Being surrounded by great friends and the youth of the world and realizing it's cool to practice your faith"
*"Seeing how one man can unite so many people from all walks of life, race, color and nationality".  People see in this man Christ's representative on earth, //Il dolce Cristo In terra//, the sweet Christ on earth.

!Excerpts from the addresses and messages of the Pope
*Dear young people, let me now ask you a question. What will you leave to the next generation? Are you building your lives on firm foundations, building something that will endure? How are you using the gifts you have been given…? What legacy will you leave to young people yet to come? What difference will you make?
*God is with us in the reality of life, not the fantasy! It is embrace, not escape, that we seek!
*Inspired by the insights of Saint Augustine: let unifying love be your measure; abiding love your challenge; self-giving love your mission!
*In the end, life is not about accumulation. It is much more than success. 
*We have to let God’s love break through the hard crust of our indifference, our spiritual weariness, our blind conformity to the spirit of this age. 
*The Church also needs this renewal! She needs your faith, your idealism and your generosity, so that she can always be young in the Spirit
*Do not be afraid to say ‘yes’ to Jesus, to find your joy in doing his will, giving yourself completely to the pursuit of holiness, and using all your talents in the service of others.

-NEWind
Claim: All truths should be proven by the scientific method. Refutation: Prove it using the scientific method.

-NEWind
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>

//Click on any link below to display the contents of an article.//
! Most Recent Articles
<<forEachTiddler
 where
 'tiddler.tags.contains("article") && tiddler.tags.contains("NEWind") && tiddler.tags.contains("recent")' 
 sortBy 'tiddler.modified'
 write
'(index < 5) ? "[["+tiddler.title+"]]\n" : ""'
>>
! Complete List of Personal Articles
<<forEachTiddler
 where
 'tiddler.tags.contains("article") && tiddler.tags.contains("NEWind")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>
! Other Articles
<<forEachTiddler
 where
 'tiddler.tags.contains("article") && ! tiddler.tags.contains("NEWind")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>
/%<<tabs txtMyAutoTab 
'Personal Articles' 'view [Personal Articles]' [[Personal Articles]]
'Other Articles' 'view [Other Articles]' [[Other Articles]]
>>%/
Any agnostic or atheist whose childhood has known a real Christmas has ever afterwards, whether he likes it or not, an association in his mind between two ideas that most of mankind must regard as remote from each other; the idea of a baby and the idea of unknown strength that sustains the stars.

-[[G.K. Chesterton]], [[The Everlasting Man]]
//Click on an author below to display all the articles and notes related to that author.//
!Index of Authors
<<forEachTiddler
 where
 'tiddler.tags.contains("author")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>

//Click on an author below to get a listing of all tiddlers tagged with that author.//
!Tag Cloud of All Authors
<<cloud =author>>
<<tabs tabContents 
"Index" "List of Authors" [[Authors]]  
"Tree" "List of Sources" [[Authors_Tree]]
>> 
<<forEachTiddler
  where tiddler.tags.contains("author")
  sortBy 'tiddler.title'
  write 
  '"![["+tiddler.title+"]]\n<<list filter [tag["+tiddler.title
+"]]$))\n"' 
>>

! Topics Tree
<<forEachTiddler
  where tiddler.tags.contains("category")
  sortBy 'tiddler.title'
  write 
  '"![["+tiddler.title+"]]\n<<list filter [tag["+tiddler.title
+"]]$))\n"' 
>>

/%
<<forEachTiddler
  where tiddler.tags.contains("category")
  sortBy 'tiddler.title'
  write 
  '"![["+tiddler.title+"]]\n<<list filter [tag["+tiddler.title
+"]]$))\n"' 
>>


<<forEachTiddler
  where tiddler.tags.contains("category")
  sortBy 'tiddler.title'
  write 
  '"![["+tiddler.title+"]]++++!![  »  ]<<list filter [tag["+tiddler.title+"]]$))===\n\n"' 
>>%
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
Omnipotence and impotence, or divinity and infancy, do definitely make a sort of epigram which a million repetitions cannot turn into a platitude. It is not unreasonable to call it unique. Bethlehem is emphatically a place where extremes meet.

-[[G.K. Chesterton]], [[The Everlasting Man]]
"Milton was right," said my Teacher. "The choice of every lost sould can be expressed in the words, 'Better to reign in Hell than to serve in Heaven.' ..... There is always something they prefer to joy - that is, to reality." 

- [[C.S. Lewis]] in [[The Great Divorce]]

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/bigbang_singh.jpg]]

Simon Singh is a particle phycisist- turned TV producer / writer specializing in science and mathematics.  The book discusses the Big Bang, a theory which tackles questions related to the origins of the universe, in a very lively, engaging and interesting way. (See Section IV below for a listing of the interesting things that Singh incorporated in the book).

For me, the most interesting part of the book is the Epilogue. Here the author tackles the current issues that still have to be resolved regarding the Big Bang; and, more interestingly, he discusses about the limits of science and some philosophical-theological considerations that the theory poses.
(These are discussed mainly in Section II below)

What follows are my personal notes on the book. Most are direct quotations from the book. Those marked with ''NB'' are short notes (nota breve), personal comments which are not found in the book.

!I. Myth, Religion and Science
!!A. Myths of Creation
*Throughout the world, every culture has developed its own myths about the origin of the universe and how it was shaped. p5
*Just like many other areas of science, cosmology started by attempting to explain things that had previously been in the domain of myth or religion. p469
*Throughout 18th century, scientists would apply their skills …replacing supernatural myths, philosophical blunders and religious dogmas with accurate, logical, verifiable, natural explanations and answers.
**NB: yet science, even up to the 21st century, can’t explain how matter came to “be”, i.e. how it can exist from nothing. And this is because it is beyond its realm. 
*NB: Chesterton on myths:  ancients were closer in saying that gods were responsible in creating the world than scientists who deny God’s role in the creation of the universe  (cf. The Everlasting Man)
*NB: Pagan stories are God expressing Himself through the minds of poets using such images as He found there.” (C.S. Lewis in Carpenter’s The Inklings)
*NB: “We have come from God and inevitably the myths woven by us, though they contain error, will also reflect a splintered fragment of the true light, the eternal truth that is with God….Myths may be misguided …they steer however shakily towards the true harbor.” p.37 (Tolkien on Carpenter’s J.R.R. Tolkien: A Biography)

!!B. Claim: Science makes religion/God less important as it discovers more things
*The known is finite, the unknown is infinite; intellectually we stand on an islet in the midst of an illimitable ocean of inexplicability. Our business in every generation is to reclaim a little more land. - T.H. Huxley
*The chemist Charles Coulson coined the term ‘God of the gaps’ to point out that a deity who was supposedly responsible for everything beyond our comprehension would have his power diminished as each gap in knowledge was filled by science.  485
*NB: see next section. The Church has recognized science’s legitimate independence from religion.  Science and religion can’t contradict each other. The source of natural phenomena that science studies is the God that religion studies. God can’t contradict himself.  It is men who commit an errors.

!!C. Science’s Legitimate Independence from Religion
*I do not feel obliged to believe that the same God who has endowed us with sense, reason and intellect has intended us to forgo their use. – Galileo Galilei
*Galileo- although he was a devout Catholic, he was also a fervent rationalist, and had been able to reconcile these two belief systems. He had come to the conclusion that scientists were best qualified to NB o the material world, whereas theologians were best qualified to NB on the spiritual world and how one should live in the material world.
**NB: To the point.
*“Hundreds of professional and amateur scientists actually believe the Bible pretends to teach science.  This is a good deal like assuming that there must be authentic religious dogma in the binomial theorem.” – Lemaître
*”Christianity possesses the source of its justification within itself and does not expect science to constitute its primary apologetic” –John Paul II
*Conclusion: Christianity and science can exist side by side

!II. Beyond the Big Bang
!!A. Was our universe designed for man or are we just “darn lucky”?
*Anthropic principle states that since humans are known to exist, the laws of physics must be such that life can exist.
*Martin Rees in his book Just Six Numbers : 
*The book explains how the structure of our universe ultimately depends on just six parameters- e.g. strength of gravity
*He studied how the strength of the strong nuclear force(symbol: epsilon), which glues together protons and neutrons, is tuned for life to exist: change it a little and there would be no possibility for life to exist in our universe
*“some of these five numbers are even more sensitive to change than epsilon.  Had they been even very slightly different from the values we measure, the the universe could easily  have been sterile, or it could have destroyed itself as soon as it was born. ”
*Singh’s comments: Consequently, it seems that these six numbers have been tuned for life.  It is as though the six dials that dictated the evolution of the universe had been carefully set in order to create the conditions necessary or us to exist. 
*It seems to defy the odds that the six numbers that characterize the universe have very special values that allow life to flourish. So do we ignore this and just count ourselves extremely lucky, or do we look for special meaning in our extraordinarily good fortune? 487
*According to the extreme version of the anthropic principle, the fine-tuning of the universe which has allowed life to evolve is indicative of a tuner. In other words, the anthropic principle can be interpreted as evidence for the existence of a God. p488
*Canadian John Leslie –illustrated the anthropic principle using the firing squad scenario: If you survive from a firing squad of 20 soldiers, would you not begin to wonder why you are still alive or would you just leave the incident  to chance?
*NB: The probability of the world existing as it is by chance is close to zero –Einstein

!!B. What came before the Big Bang?
*Summary: The question is beyond science
*Scientists say that the question what came before the Big Bang is invalid. Critics may feel that if this is the best that cosmologists can offer, then ‘what came before the Big Bang’ is a puzzle that has to be relegate to the realm of myth or religion.
*Particle physics claims it can describe the universe when it had a temperature of 1032 degrees Celsius and was only 10-43 seconds old. 
**NB: But up to how far back can you push back the clock?  Can you reach zero time? cf. Can you reach zero Kelvin temperature?
**NB: Steady State and Big Bang models of the universe: Both beg the question of where matter comes from.
*“What was God doing before He created the Universe? Before He created Heaven and Earth, God create hell to be used for people such as you who ask this kind of question. ”  - St.Augustine, Confessions.
*The American Astronomer Robert Jastrow was pessimistic about the ambition of the Big Bang theorist (to know what came before the Big Bang): “He has scaled the mountains of ignorance; he is about to conquer the highest peak; as he pulls himself over the final rock, he is greeted by a band of theologians who have been sitting there for centuries.”

!!C. Alternatives to the Anthropic Principle / Creation Theory
*Eternal universe (1900) - Although there was dating evidence that pointed towards a truly ancient universe, at least billions of years old, the idea that the universe was eternal was largely based on a leap of faith. There was simple no scientific justification extrapolating from an Earthly age of at least billions of years to a universe that was eternal. p.80
*Our world is part of a multiverse. There could be billions of (or infinitely many) other universes which exists and our universe, luckily, is one of these billions which happen to be able to support life
**NB: This increases probability of the existence of the universe by, at least, another billion!
**NB: Again, this brings back anthropic principle argument: Are we just “darn lucky” or is there a meaning to all of these?
*At everyday level the world seems deterministic and the laws of conservation hold true, but at the microscopic level determinism and conservation can both be violated. Hence quantum cosmology offers various hypotheses that allow for the universe to have started from nothing for no reason. 492
**NB: To assume that “the universe to have started from nothing for no reason” is philosophically unsound.  I mean, who would buy that and how would one support it? This is “unscientific” in every bit of the word. Have the scientists given up on finding the reason as to how things behave in such ways in microscopic levels or are they really sure that there really is no reason for such behaviors at such microscopic levels?

!III. The Immensity of the Universe and Man’s Audacity
*Our universe is dotted with over 100 billion galaxies, and each one contains roughly 100 billion stars. It is unclear how many planets are orbiting these stars, but it is certain that at least one of them has evolved life.  In particular, there is a life form that has had the capacity and audacity to speculate about the origin of this vast universe. p.3
**NB: The audacity of man in prayer to talk with God is greater
**NB: evolution is assumed
*Our tiny Earth now seemed more insignificant than ever – just one of many planets, orbiting one of many stars, within one of many galaxies. Indeed, it would later become clear that our galaxy is just one of billions of galaxies, each containing billions of stars. – p.228
*Heaven wheels above you displaying to you her eternal glories and still your eyes are on the ground. –Dante
*NB: No matter how large is the universe is it’s only on earth that Christ became man – cf. C.S. Lewis,  Perelandra

-NEWind

!IV.  Amusing Notes
*Mnemonic for the value of pi: “How I need a drink, alcoholic, of course, after the heavy lectures involving quantum mechanics” – Get the number of characters in each word to get- 3.1415926535979
*Lemaitre, a Belgian Catholic priest & phycist, was the first scientist to give a reasonably confident and detailed description of the Big Bang
*New York Time on Lemaitre (2nd to propose a Big Bang model):  His view is interesting and important not because he is a Catholic priest, not because he is one of the leading mathematical phycisists of our time, but because he is both. 
*Fred Hoyle, Big Bang’s biggest critic was actually the one who coined the term ”Big Bang” 
*On Hubble being visited by stars (p.260) He had spend his life staring at the stars in wonder, and now the stars were staring at him in equal awe. 
*The most exciting phrase to hear in science, the one that heralds new discoveries, is not ‘Eureka’ (I found it) but ‘That’s funny….’ Isaac Asimov
*Marcus Chown- (author of The Magic Furnace) described the significance of stellar alchemy as follows: ‘In order that we might live, stars in their billions, tens of billions, hundreds of billions, even, have died. The iron in our blood, the calcium in our bones, the oxygen in the furnaces of the stars which expired long before the Earth was born.’  
**Singh’s NBs regarding the matter in the universe being formed as a result of dying stars: “Romantics might like to think of themselves as being composed of stardust. Cynics might prefer to think of themselves as nuclear waste.”
*The only thing that interferes with my learning is my education- Albert Einstein
*Michelson built his career on a whole series of successful experiments relating to optics, but his greatest triumph was the result of a failed experiment (his experiment with Morley to test the existence of ether)
*Gamov included his friend Bethel as a co-author in his paper with Alpher- just so that the paper could sound like the first 3 Greek letters: Alpher, Bethel Gamov 
*Einstein rejected the makings of the Big Bang model of the universe (which was largely based on his General Theory of Relativity) twice!. First as proposed by Friedman, then as proposed by Lemaitre. But he was humble enough to admit defeat when presented with Hubble’s findings
*The Curie family won 4 Nobel Prizes : 1 for Pierre, 2 for Marie and 1 for their daughter.
*Einstein re: Cosmological Constant: “I am unable to believe that such an ugly thing should be realized in nature.”
*Astronomers’leap of faith: Henrietta Leavit assuming that the stars in the Small Magellanic Cloud were roughly equidistant from the earth just because the Cepheids in it were relatively close together p.209
*Scientists themselves rejected Galileo. > Science had to undergo 'cleansing'

-NEWind
No other birth of a god or childhood of a sage seems to us to be Christmas or anything like Christmas. It is either too cold or too frivolous, or too formal and classical, or too simple and savage, or too occult and complicated.

-[[G.K. Chesterton]], [[The Everlasting Man]]
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>

<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
by JosephPearce, Ignatius Press, 2003

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/cslewis_pearce.jpg]]

The book tries to explain the development of the spiritual convictions of C.S. Lewis, the author of the well-loved fantasy series The Chronicles of Narnia.  It presents his journey from Puritanism, to atheism, to theism, to Christianity (Anglicanism), finally to ~High-Anglicanism and explores the question of why he never converted to Catholicism (to the frustration of many peoples’ hopes and expectations).

I have first encountered C.S. Lewis through the Chronicles of Narnia series. Later on, I read his other works like The Space Trilogy (Out of the Silent Planet, Perelandra, That Hideous Strength), Till We Have Faces and portions of The Four Loves and Screwtape Letters. His writings strike me very much as Christian, and at times, as very Catholic.  Even before I discovered J.R.R.Tolkien, I was already a fan of C.S. Lewis.  One thing I discovered from some friends is that C.S. Lewis never converted to Catholicism, but what I never found out, until I read this book, was why he never converted, despite having shared and defended many Catholic beliefs such as purgatory and the Holy Eucharist.

The author, Joseph Pearce, is an excellent writer.  He analyzes the facts and arguments objectively, pointing out where the errors lie but never attributing more errors than what have actually been committed.  His manner of writing is also entertaining and witty.  I’d recommend two of his other books: Tolkien: Man and Myth and Literary Converts. In my opinion, Pearce, together with Peter Kreeft, are among the best Catholic apologists of our time.

From the back cover of the book:
<<<
“There are many Protestants and Catholics who have been deeply affected and spiritually changed by the writings of C.S. Lewis.  There are many converts to Catholicism, some very well known, who credit C.S. Lewis for playing a significant role in their conversion. But the ironic and perplexing fact is that Lewis himself, while “Catholic” in many aspects of his faith and devotion, never became a Roman Catholic. The relationship of Lewis to the Roman Catholic Church is an important and intriguing topic of interest to both Catholics and Protestants. Pearce delves into all the issues, questions, and factors regarding this puzzling question. He gives a broad and detailed analysis of the historical, biographical, theological, and literary pieces of this puzzle.” -James Como
<<<

''Related notes'': [[C.S. Lewis]], [[Joseph Pearce]], [[C.S. Lewis and the Catholic Church]]

-NEWind

"A dead thing can go with the stream, but only a living thing can go against it."

-[[G.K. Chesterton]], [[The Everlasting Man]]
[img[http://i777.photobucket.com/albums/yy51/newind/nativityscene.jpg]]

Quotations from  [[The Everlasting Man]] of [[G.K. Chesterton]]

A mass of legend and literature, which increases and will never end, has repeated and rung the changes on that single paradox; that the hands that had made the sun and stars were too small to reach the huge heads of the cattle. Upon this paradox, we might almost say upon this jest, all the literature of our faith is founded.

Any agnostic or atheist whose childhood has known a real Christmas has ever afterwards, whether he likes it or not, an association in his mind between two ideas that most of mankind must regard as remote from each other; the idea of a baby and the idea of unknown strength that sustains the stars.

Omnipotence and impotence, or divinity and infancy, do definitely make a sort of epigram which a million repetitions cannot turn into a platitude. It is not unreasonable to call it unique. Bethlehem is emphatically a place where extremes meet.

You cannot chip away the statue of a mother from all round that of a newborn child. You cannot suspend the new-born child in mid-air; indeed you cannot really have a statue of a newborn child at all. Similarly, you cannot suspend the idea of a newborn child in the void or think of him without thinking of his mother. You cannot visit the child without visiting the mother, you cannot in common human life approach the child except through the mother.

No other birth of a god or childhood of a sage seems to us to be Christmas or anything like Christmas. It is either too cold or too frivolous, or too formal and classical, or too simple and savage, or too occult and complicated.

And though no man knew it, the hour was near which was to end and to fulfill all things; and though no man heard it, there was one far-off cry in an unknown tongue upon the heaving wilderness of the mountains. The shepherds had found their Shepherd.

That is perhaps the mightiest of the mysteries of the cave. It is already apparent that though men are said to have looked for hell under the earth, in this case it is rather heaven that is under the earth

//Photo credit: 'Nativity scene in polish church 2' by hisks in www.sxc.hu//
You cannot chip away the statue of a mother from all round that of a newborn child. You cannot suspend the new-born child in mid-air; indeed you cannot really have a statue of a newborn child at all. Similarly, you cannot suspend the idea of a newborn child in the void or think of him without thinking of his mother. You cannot visit the child without visiting the mother, you cannot in common human life approach the child except through the mother.

-[[G.K. Chesterton]], [[The Everlasting Man]]
|Background|@@bgcolor(#fff):color(#fff):.....................@@|
|Foreground|@@bgcolor(#000):color(#fff):.....................@@|
|PrimaryPale|@@bgcolor(#8cf):color(#fff):.....................@@|
|PrimaryLight|@@bgcolor(#18f):color(#fff):.....................@@|
|PrimaryMid|@@bgcolor(#04b):color(#fff):.....................@@|
|PrimaryDark|@@bgcolor(#014):color(#fff):.....................@@|
|SecondaryPale|@@bgcolor(#ffc):color(#fff):.....................@@|
|SecondaryLight|@@bgcolor(#fe8):color(#fff):.....................@@|
|SecondaryMid|@@bgcolor(#db4):color(#fff):.....................@@|
|SecondaryDark|@@bgcolor(#841):color(#fff):.....................@@|
|TertiaryPale|@@bgcolor(#eee):color(#fff):.....................@@|
|TertiaryLight|@@bgcolor(#ccc):color(#fff):.....................@@|
|TertiaryMid|@@bgcolor(#999):color(#fff):.....................@@|
|TertiaryDark|@@bgcolor(#666):color(#fff):.....................@@|
|Error|@@bgcolor(#f88):color(#fff):.....................@@|
/***
|Name|CommentPlugin|
|Source|http://www.TiddlyTools.com/#CommentPlugin|
|Documentation|http://www.TiddlyTools.com/#CommentPluginInfo|
|Version|2.9.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|automatically insert formatted comments into tiddler content|
!!!!!Documentation
>see [[CommentPluginInfo]]
!!!!!Configuration
>see [[CommentPluginInfo]]
!!!!!Revisions
<<<
2009.04.10 [2.9.3] invoke autoSaveChanges() after adding a comment
| please see [[CommentPluginInfo]] for previous revision details |
2006.04.20 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.CommentPlugin= {major: 2, minor: 9, revision: 3, date: new Date(2009,4,10)};

config.macros.comment= {
	marker: '/%'+'comment'+'%/',
	fmt: "__''%subject%''__\n^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n",
	datefmt: 'DDD, MMM DDth, YYYY at hh12:0mm:0ss am',
	tags: '',
	reverse: false,
	handler: function(place,macroName,params,wikifier,paramstring,tiddler) {
		var span=createTiddlyElement(place,'span');
		var here=story.findContainingTiddler(place);
		if (here) var tid=here.getAttribute('tiddler');  // containing tiddler title
		span.setAttribute('here',tid);
		var target=(params[0]&&params[0].length&&params[0]!='here')?params[0]:tid;  // target title
		span.setAttribute('target',target);
		var overwrite=(params[1]&&params[1].toLowerCase()=='overwrite'); if (overwrite) params.shift();
		span.setAttribute('overwrite',overwrite?'true':'false');
		var reverse=(params[1]&&params[1].toLowerCase()=='reverse'); if (reverse) params.shift();
		span.setAttribute('reverse',(reverse||this.reverse)?'true':'false');
		var marker=this.marker;
		if (params[1]&&params[1].substr(0,7)=='marker:') {
			var marker='/%'+params[1].substr(7)+'%/';
			params.shift();
		}
		span.setAttribute('marker',marker);
		var tags=(params[1]&&params[1].length)?params[1]:this.tags; // target tags
		span.setAttribute('tags',tags);
		var fmt=(params[2]&&params[2].length)?params[2]:this.fmt; // output format
		span.setAttribute('fmt',fmt.unescapeLineBreaks());
		var datefmt=(params[3]&&params[3].length)?params[3]:this.datefmt; // date format
		span.setAttribute('datefmt',datefmt.unescapeLineBreaks());
		var html=this.html;
		html=html.replace(/%nosubject%/g,(fmt.indexOf('%subject%')==-1)?'none':'block');
		html=html.replace(/%nomessage%/g,(fmt.indexOf('%message%')==-1)?'none':'block');
		var subjtxt=''; var msgtxt='';
		html=html.replace(/%subjtxt%/g,subjtxt);
		html=html.replace(/%msgtxt%/g,msgtxt);
		span.innerHTML=html;
	},
	html: "<form style='display:inline;margin:0;padding:0;'>\
		<div style='display:%nosubject%'>\
		Enter (code)name:<br>\
		<input type='text' name='subject' title='enter your (code)name' style='width:100%' value='%subjtxt%'>\
		</div>\
		<div style='display:%nomessage%'>\
		message:<br>\
		<textarea name='message' rows='7' title='enter message text' \
			style='width:100%'>%msgtxt%</textarea>\
		</div>\
		<center>\
		<i>Please enter your information and then press</i>\
		<input type='button' value='post' onclick='\
			var s=this.form.subject; var m=this.form.message;\
			if (\"%nosubject%\"!=\"none\" && !s.value.length)\
				{ alert(\"Please enter a subject\"); s.focus(); return false; }\
			if (\"%nomessage%\"!=\"none\" && !m.value.length)\
				{ alert(\"Please enter a message\"); m.focus(); return false; }\
			var here=this.form.parentNode.getAttribute(\"here\");\
			var reverse=this.form.parentNode.getAttribute(\"reverse\")==\"true\";\
			var target=this.form.parentNode.getAttribute(\"target\");\
			var marker=this.form.parentNode.getAttribute(\"marker\");\
			var tags=this.form.parentNode.getAttribute(\"tags\").readBracketedList();\
			var fmt=this.form.parentNode.getAttribute(\"fmt\");\
			var datefmt=this.form.parentNode.getAttribute(\"datefmt\");\
			var overwrite=this.form.parentNode.getAttribute(\"overwrite\")==\"true\";\
			config.macros.comment.addComment(here,reverse,target,tags,fmt,datefmt,\
				s.value,m.value,overwrite,marker);'>\
		</center>\
		</form>",
	addComment: function(here,reverse,target,newtags,fmt,datefmt,subject,message,overwrite,marker) {
		var UTC=new Date().convertToYYYYMMDDHHMMSSMMM();
		var rand=Math.random().toString();
		var who=config.options.txtUserName;
		var when=new Date().formatString(datefmt);
		target=target.replace(/%tiddler%/g,here);
		target=target.replace(/%UTC%/g,UTC);
		target=target.replace(/%random%/g,rand);
		target=target.replace(/%who%/g,who);
		target=target.replace(/%when%/g,when);
		target=target.replace(/%subject%/g,subject);
		var t=store.getTiddler(target);
		var text=t?t.text:'';
		var modifier=t?t.modifier:config.options.txtUserName;
		var modified=t?t.modified:new Date();
		var tags=t?t.tags:[];
		for(var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
		var fields=t?t.fields:{};
		var out=fmt;
		out=out.replace(/%tiddler%/g,here);
		out=out.replace(/%UTC%/g,UTC);
		out=out.replace(/%when%/g,when);
		out=out.replace(/%who%/g,who);
		out=out.replace(/%subject%/g,subject);
		out=out.replace(/%message%/g,message);
		var pos=text.indexOf(marker);
		if (pos==-1) pos=text.length; // no marker - insert at end
		else if (reverse) pos+=marker.length; // reverse order by inserting AFTER marker
		var newtxt=overwrite?out:(text.substr(0,pos)+out+text.substr(pos));
		store.saveTiddler(target,target,newtxt,modifier,modified,tags,fields);
		autoSaveChanges();
		if (document.getElementById(story.idPrefix+target))
			story.refreshTiddler(target,DEFAULT_VIEW_TEMPLATE,true);
		if (here!=target && document.getElementById(story.idPrefix+here))
			story.refreshTiddler(here,DEFAULT_VIEW_TEMPLATE,true);
	}
};
//}}}
/***
|Name|CommentPluginInfo|
|Source|http://www.TiddlyTools.com/#CommentPlugin|
|Documentation|http://www.TiddlyTools.com/#CommentPluginInfo|
|Version|2.9.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|Documentation|
|Description|Documentation for CommentPlugin|
!!!!!Usage
<<<
syntax:
{{{
<<comment TiddlerName overwrite reverse marker:... tags format dateformat>>
}}}
where:
*''~TiddlerName'' //(optional)//<br>specifies the 'target' tiddler into which comments will be written.  If you use the keyword, //{{{"here"}}}// (or omit all parameters), the current tiddler is used by default.  The ~TiddlerName can also include special //substitution markers// to construct a unique target title by dynamically inserting values, where:
**%tiddler%=containing tiddler title,
**%UTC%=UTC timestamp (YYYYMMMDD.HHMMSSMMM),
**%random%=random decimal number (.123456789),
**%who%=current TiddlyWiki username,
**%subject%=comment subject text.
*''overwrite'' //(optional)//<br>Normally, comments are //added// to a target tiddler if it already exists.  However, if you use the ''overwrite'' keyword, the new comment text //''completely replaces the previous contents of an existing tiddler''//.
*''reverse'' //(optional)//<br>By default, new comments are added to the target tiddler //following// any existing comments.  When ''reverse'' is used, new comments are inserted //before// existing comments, resulting in a reverse-chronological display (i.e, newest comments shown first).
*''marker:...'' //(optional)//<br>specifies an alternative //substitution marker// within the target tiddler (see below).
*''tags'' //(optional)//<br>adds specified space-separated tags to the target tiddler whenever a comment is written.  Note that the list of tags should be enclosed in "..." so that it is processed as a single parameter.
*''format'' //(optional)//<br>specifies a custom output format that overrides the default format defined in {{{config.macros.comment.fmt}}} (see Configuration, below), using the following //substitution markers//:
**%tiddler%=containing tiddler title,
**%UTC%=UTC timestamp (YYYYMMMDD.HHMMSSMMM),
**%when%=formatted date/time,
**%who%=username,
**%subject%=subject,
**%message%=comment body text.
*''dateformat'' //(optional)//<br>specifies a custom date/timestamp output to be inserted in place of {{{%when%}} in the comment output format above.  Overrides the default format defined in {{{config.macros.comment.datefmt}}} (see Configuration, below).

To indicate the location within the target tiddler where new comments are to be inserted, embed {{{/%comment%/}}} as a //substitution marker// //within that target tiddler's source//.  Each new comment is inserted immediately preceding the marker, resulting in a time-ordered sequence of comments.  If no marker is present, new comments are appended to the end of the tiddler.  To insert comments from different forms into separate locations in the //same target tiddler//, you can use the ''marker:...'' parameter to specify alternative marker text (e.g., use "marker:note" or "marker:memo" to specify {{{/%note%/}}} or {{{/%memo%/}}} instead of {{{/%comment%/}}})
<<<
!!!!!Configuration
<<<
To configure the behavior and formats used by [[CommentPlugin]], //''place one or more of the following javascript statements in a tiddler tagged with<<tag systemConfig>>''//: //(note: the default values for each setting are shown)//
{{{
config.macros.comment.reverse=false;
}}}
>when set to {{{true}}}, all new comments are inserted //following// the comment marker instead of preceding it, resulting in a reverse chronological display order.  If no comment marker is present in the target tiddler source, the 'reverse' option is ignored and new comments are always appended to the end of the tiddler.
{{{
config.macros.comment.fmt="__''%subject%''__\n^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n";
}}}
>defines the comment output format to be inserted into the tiddler, where: %when%=date/time, %who%=username, %subject%=subject, and %message% is the body of the comment.  //Note: if you omit %subject% from the output format, the subject input field on the comment form will be automatically suppressed.  Similarly, omitting %message% from the output format suppresses the message input field.  This can be useful when using the {{{<<comment>>}}} macro to create simple activity logs that only require a short, one-line subject rather than entering extended message content.//
{{{
config.macros.comment.datefmt="DDD, MMM DDth, YYYY at hh12:0mm:0ss am";
}}}
>defines the date/timestamp output used within the comment format above.
{{{
config.macros.comment.tags="";
}}}
>defines an optional space-separated, list of tags to be added to the target tiddler whenever a comment is written.  This is most useful when the target tiddler is different from the tiddler containing the {{{<<comment>>}}} macro, to make it easy to locate that tiddler later on.

Note: as of revision 2.0.0, direct dependency on [[NestedSlidersPlugin]], [[MoveablePanelPlugin]], [[InlineJavascriptPlugin]] and [[ToggleSliders]] has been eliminated.  As a result, the comment form and generated comment output are no longer automatically contained within sliders and the "view all/close all" command is not automatically included.  To recreate the previous output format and comment interface, use the following syntax in the tiddler in which you want to place your comments:
{{{
+++^40em^[add a note]...
<<moveablePanel>>add a note
----
<<comment here "" "+++!!!!![%when% (%who%): %subject%]>...\n%message%\n===\n">>===
 | <<tiddler ToggleSliders with: here "view all" "close all">>
}}}
<<<
!!!!!Revisions
<<<
2009.04.10 2.9.3 invoke autoSaveChanges() after adding a comment
2009.03.09 2.9.2 added marker:... macro parameter
2009.03.08 2.9.1 fix handling of nosubject/nomessage when macro param specifies output format
2008.05.17 2.9.0 optional 'overwrite' param replaces existing comment when stored as separate tiddler
2008.04.21 2.8.0 replaced use of %n markers with special 'named' markers: %tiddler%, %UTC%, %random%, %who%, %when%, %subject% and %message% to avoid conflict with TW core processing of tiddler content.  Also, added support for 'reverse' macro param.
2008.04.17 2.7.0 added support for constructing target by inserting UTC timestamp, random number, username and/or subject text into target tiddler title
2008.04.15 2.6.0 added support for custom format and dateformat parameters to override global default formats
2008.04.15 2.5.1 make sure tiddlers are displayed before attempting to refresh them
2008.04.15 2.5.0 refresh tiddler containing comment macro after adding new comment to target tiddler (if different)
2008.04.14 2.4.0 added optional tag list parameter for tagging the target tiddler when comments are written
2008.04.14 2.3.0 if %2 (subject) or %3 (message) are omitted from format string, suppress display and validation of corresponding form elements.
2008.04.13 2.2.0 added optional ~TiddlerName param to specify target tiddler for writing comments
2008.04.10 2.1.0 converted from inline script to plugin
2008.04.05 2.0.0 removed dependencies on NestedSlidersPlugin, MoveablePanelPlugin, ToggleSliders
2007.10.24 1.2.0 added config.options.txtCommentDateFormat
2007.07.05 1.1.0 added 'view all/close all' toolbar item plus code cleanup
2007.06.28 1.0.2 added tiddler.fields to saveTiddler() call (preserves custom fields)
2007.05.26 1.0.1 added support for optional 'reverse' keyword.
2006.04.20 1.0.0 initial release
<<<
An excellent reference on the teachings of the Catholic Church.  Gives a concise version of the central points of the Catechism of the Catholic Church without losing the essential aspects. It is more accessible to more people because of it's "three principal characteristics... : the close reliance on the Catechism of the Catholic Church; the dialogical format; the use of artistic images in the catechesis." (Benedict XVI, Introduction to the Compendium)

A great reference for every Christian. Each household should own one.

You can view the actual document [[here|"http://www.vatican.va/archive/compendium_ccc/documents/archive_2005_compendium-ccc_en.html"]] or download the pdf file [[here|"http://www.cts-online.org.uk/Compendium.htm"]].
<<forEachTiddler
 where
 'tiddler.tags.contains("note")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n$)<<tiddler [["+tiddler.title
+"]]$))\n\n"'
>>
<<forEachTiddler
 where
 'tiddler.tags.contains("note") && tiddler.tags.contains("$1")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n$)<<tiddler [["+tiddler.title
+"]]$))\n\n"'
>>
/***
|Name|CopyTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#CopyTiddlerPlugin|
|Version|3.2.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|plugin|
|Description|Quickly create a copy of any existing tiddler|
!!!Usage
<<<
The plugin automatically updates the default (shadow) ToolbarCommands definitions to insert the ''copyTiddler'' command, which will appear as ''copy'' when a tiddler is rendered.  If you are already using customized toolbar definitions, you will need to manually add the ''copyTiddler'' toolbar command to your existing ToolbarCommands tiddler, e.g.:
{{{
|EditToolbar|... copyTiddler ... |
}}}
When the ''copy'' command is selected, a new tiddler is created containing an exact copy of the current text/tags/fields, using a title of "{{{TiddlerName (n)}}}", where ''(n)'' is the next available number (starting with 1, of course).  If you copy while //editing// a tiddler, the current values displayed in the editor are used (including any changes you may have already made to those values), and the new tiddler is immediately opened for editing.

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

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

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

config.commands.copyTiddler = {
	text: 'copy',
	hideReadOnly: true,
	tooltip: 'Make a copy of this tiddler',
	notitle: 'this tiddler',
	prefix: '',
	suffixText: ' (%0)',
	suffixPattern: / \(([0-9]+)\)$/,
	zeroPad: 0,
	sparse: false,
	handler: function(event,src,title)
		{ return config.commands.copyTiddler.click(src,event); },
	click: function(here,ev) {
		var tiddlerElem=story.findContainingTiddler(here);
		var template=tiddlerElem?tiddlerElem.getAttribute('template'):null;
		var title=here.getAttribute('from');
		if (!title || !title.length) {
			if (!tiddlerElem) return false;
			else title=tiddlerElem.getAttribute('tiddler');
		}
		var root=title.replace(this.suffixPattern,''); // title without suffix
		// find last matching title
		var last=title;
		if (this.sparse) { // don't fill-in holes... really find LAST matching title
			var tids=store.getTiddlers('title','excludeLists');
			for (var t=0; t<tids.length; t++) if (tids[t].title.startsWith(root)) last=tids[t].title;
		}
		// get next number (increment from last matching title)
		var n=1; var match=this.suffixPattern.exec(last); if (match) n=parseInt(match[1])+1;
		var newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]);
		// if not sparse mode, find the next hole to fill in...
		while (store.tiddlerExists(newTitle)||document.getElementById(story.idPrefix+newTitle))
			{ n++; newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]); }
		if (!story.isDirty(title)) { // if tiddler is not being EDITED
			// duplicate stored tiddler (if any)
			var text=store.getTiddlerText(title,'');
			var who=config.options.txtUserName;
			var when=new Date();
			var newtags=[]; var newfields={};
			var tid=store.getTiddler(title); if (tid) {
				if (config.options.chkCopyTiddlerDate) var when=tid.modified;
				for (var t=0; t<tid.tags.length; t++) newtags.push(tid.tags[t]);
				store.forEachField(tid,function(t,f,v){newfields[f]=v;},true);
			}
	                store.saveTiddler(newTitle,newTitle,text,who,when,newtags,newfields,true);
			story.displayTiddler(tiddlerElem,newTitle,template);
		} else {
			story.displayTiddler(tiddlerElem,newTitle,template);
			var fields=config.commands.copyTiddler.gatherFields(tiddlerElem); // get current editor fields
			var newTiddlerElem=document.getElementById(story.idPrefix+newTitle);
			for (var f=0; f<fields.length; f++) {  // set fields in new editor
				if (fields[f].name=='title') fields[f].value=newTitle; // rename title in new tiddler
				var fieldElem=config.commands.copyTiddler.findField(newTiddlerElem,fields[f].name);
				if (fieldElem) {
					if (fieldElem.getAttribute('type')=='checkbox')
						fieldElem.checked=fields[f].value;
					else 
						fieldElem.value=fields[f].value;
				}
			}
		}
		story.focusTiddler(newTitle,'title');
		return false;
	},
	findField: function(tiddlerElem,field) {
		var inputs=tiddlerElem.getElementsByTagName('input');
		for (var i=0; i<inputs.length; i++) {
			if (inputs[i].getAttribute('type')=='checkbox' && inputs[i].field == field) return inputs[i];
			if (inputs[i].getAttribute('type')=='text' && inputs[i].getAttribute('edit') == field) return inputs[i];
		}
		var tas=tiddlerElem.getElementsByTagName('textarea');
		for (var i=0; i<tas.length; i++) if (tas[i].getAttribute('edit') == field) return tas[i];
		var sels=tiddlerElem.getElementsByTagName('select');
		for (var i=0; i<sels.length; i++) if (sels[i].getAttribute('edit') == field) return sels[i];
		return null;
	},
	gatherFields: function(tiddlerElem) { // get field names and values from current tiddler editor
		var fields=[];
		// get checkboxes and edit fields
		var inputs=tiddlerElem.getElementsByTagName('input');
		for (var i=0; i<inputs.length; i++) {
			if (inputs[i].getAttribute('type')=='checkbox')
				if (inputs[i].field) fields.push({name:inputs[i].field,value:inputs[i].checked});
			if (inputs[i].getAttribute('type')=='text')
				if (inputs[i].getAttribute('edit')) fields.push({name:inputs[i].getAttribute('edit'),value:inputs[i].value});
		}
		// get textareas (multi-line edit fields)
		var tas=tiddlerElem.getElementsByTagName('textarea');
		for (var i=0; i<tas.length; i++)
			if (tas[i].getAttribute('edit')) fields.push({name:tas[i].getAttribute('edit'),value:tas[i].value});
		// get selection lists (droplist or listbox)
		var sels=tiddlerElem.getElementsByTagName('select');
		for (var i=0; i<sels.length; i++)
			if (sels[i].getAttribute('edit')) fields.push({name:sels[i].getAttribute('edit'),value:sels[i].value});
		return fields;
	}
};
//}}}
// // MACRO DEFINITION
//{{{
config.macros.copyTiddler = {
	label: 'copy',
	prompt: 'Make a copy of %0',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var title=params.shift();
		params=paramString.parseParams('anon',null,true,false,false);
		var label	=getParam(params,'label',this.label+(title?' '+title:''));
		var prompt	=getParam(params,'prompt',this.prompt).format([title||this.notitle]);
		var b=createTiddlyButton(place,label,prompt,
			function(ev){return config.commands.copyTiddler.click(this,ev)});
		b.setAttribute('from',title||'');
	}
};
//}}}
/***
|Name|CoreTweaks|
|Source|http://www.TiddlyTools.com/#CoreTweaks|
|Version|n/a|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2.4|
|Type|plugin|
|Requires||
|Overrides|various|
|Description|a small collection of overrides to TW core functions|
This tiddler contains some quick tweaks and modifications to TW core functions to provide minor changes in standard features or behavior.  It is hoped that some of these tweaks may be incorporated into later versions of the TW core, so that these adjustments will be available without needing these add-on definitions. ''Note: the changes contained in this tiddler are generally applicable for the current version of TiddlyWiki (<<version>>)./% Please view [[CoreTweaksArchive]] for tweaks and modifications that may be used with earlier versions of TiddlyWiki.%/''

To install //all// of these tweaks, import (or copy/paste) this tiddler into your document.  To include only //some// of the tweaks, you can edit the imported tiddler to remove the tweaks that you don't want.  Alternatively, you could copy/paste a few selected tweaks from this tiddler into a tiddler that you create in your own document.  Be certain to tag that tiddler with<<tag systemConfig>> (i.e., a plugin tiddler) and then save-and-reload for the tweaks to take effect.
***/
/***
!!! Ticketed Tweaks
***/
// // {{groupbox small{
/***
!!FireFox3 Import bug: "browse" button replacement
http://trac.tiddlywiki.org/ticket/683 - OPEN
see also http://trac.tiddlywiki.org/ticket/604 - cross-platform askForFilename()
The web standard "type=file" input control that has been used as a local path/file picker for TiddlyWiki no longer works as expected in FireFox3, which has, for "security" reasons, limited javascript access to this control so that *no* local filesystem path information can be revealed, even when it is intentional and necessary, as it is with TiddlyWiki.  This tweak provides alternative HTML source that patches the backstage import panel.  It replaces the "type=file" input control with a text+button combination of controls that invokes a system-native secure 'file-chooser' dialog box to provide TiddlyWiki with access to a complete path+filename so that TW functions properly locate user-selected local files.
***/
//{{{
if (window.Components) {
	var fixhtml='<input name="txtBrowse" style="width:30em"><input type="button" value="..."'
		+' onClick="window.browseForFilename(this.previousSibling,true)">';
	var cmi=config.macros.importTiddlers;
	cmi.step1Html=cmi.step1Html.replace(/<input type='file' size=50 name='txtBrowse'>/,fixhtml);
}

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

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

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

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

window.javaAskForFilename=function(msg,path,file,mustExist) {
	if(!document.applets["TiddlySaver"]) return false;
	// TBD: implement java-based askFile(...) function
	try { return document.applets["TiddlySaver"].askFile(msg,path,file,mustExist); } 
	catch(ex) { displayMessage(ex.toString()); }
}
//}}}
// // }}}
// // {{groupbox small{
/***
!!#story:... paramifier
http://trac.tiddlywiki.org/ticket/676 - OPEN
scan the specified 'story' tiddler content for embedded links, rather than simply parsing the content as a space-separated bracketed list.  This allows links from ''any'' tiddler to be used as a story, regardless of other wiki-syntax contained in that tiddler.  If specified tiddler is a shadow, fallback to using parseParams() to extract the list of links.
***/
//{{{
config.paramifiers.story = {
	onstart: function(v) {
		var t=store.getTiddler(v); if (t) t.changed();
		var list=t?t.links:store.getTiddlerText(v,"").parseParams("open",null,false);
		story.displayTiddlers(null,list);
	}
};
//}}}
// // }}}
// // {{groupbox small{
/***
!!Loose links (case-folded/space-folded wiki words)
http://trac.tiddlywiki.org/ticket/664 - OPEN
This tweak matches non-WikiWord variations of mixed-case and/or added/omitted spaces within double-bracketed text with titles of //existing// tiddlers, using a "loose" (case-folded/space-folded) comparison.  This allows text that occurs in normal prose to be more easily linked to tiddler titles by using double-brackets without the full "pretty link" syntax.  For example:
{{{
[[CoreTweaks]], [[coreTweaks]], [[core tweaks]],
[[CORE TWEAKS]], [[CoRe TwEaKs]], [[coreTWEAKS]]
}}}
>[[CoreTweaks]], [[coreTweaks]], [[core tweaks]],
>[[CORE TWEAKS]], [[CoRe TwEaKs]], [[coreTWEAKS]]
Configuration:
><<option chkLooseLinks>> Allow case-folded and/or space-folded text to link to existing tiddler titles
>{{{usage: <<option chkLooseLinks>>}}}
***/
//{{{
if (!config.options.chkLooseLinks)
	config.options.chkLooseLinks=false; // default to standard behavior
window.caseFold_createTiddlyLink = window.createTiddlyLink;
window.createTiddlyLink = function(place,title,includeText,className) {
	var btn=window.caseFold_createTiddlyLink.apply(this,arguments); // create core link
	if (!config.options.chkLooseLinks) return btn;
	if (store.getTiddlerText(title)) return btn; // matching tiddler (or shadow) exists
	var target=title.toLowerCase().replace(/\s/g,"");
	var tids=store.getTiddlers("title");
	for (var t=0; t<tids.length; t++) {
		if (tids[t].title.toLowerCase().replace(/\s/g,"")==target) {
			var i=getTiddlyLinkInfo(tids[t].title,className);
			btn.setAttribute("tiddlyLink",tids[t].title);
			btn.title=i.subTitle;
			btn.className=i.classes;
			break;
		}
	}
	return btn;
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/657 - OPEN
// // This tweak inserts an extra space element following each tab, allowing them to wrap onto multiple lines if needed.
//{{{
config.macros.tabs.handler = function(place,macroName,params)
{
	var cookie = params[0];
	var numTabs = (params.length-1)/3;
	var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper " + cookie);
	var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
	tabset.setAttribute("cookie",cookie);
	var validTab = false;
	for(var t=0; t<numTabs; t++) {
		var label = params[t*3+1];
		var prompt = params[t*3+2];
		var content = params[t*3+3];
		var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,"tab tabUnselected");
		createTiddlyElement(tab,"span",null,null," ",{style:"font-size:0pt;line-height:0px"}); // ELS
		tab.setAttribute("tab",label);
		tab.setAttribute("content",content);
		tab.title = prompt;
		if(config.options[cookie] == label)
			validTab = true;
	}
	if(!validTab)
		config.options[cookie] = params[1];
	place.appendChild(wrapper);
	this.switchTab(tabset,config.options[cookie]);
};
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/637 - OPEN
// // This tweak modifies the tooltip format that appears when you mouseover a link to a tiddler.  It adds an option to control the date format, as well as displaying the size of the tiddler (in bytes)
// //
// // Tiddler link tooltip format:
// // {{stretch{<<option txtTiddlerLinkTootip>>}}}
// // ^^where: %0=title, %1=username, %2=modification date, %3=size in bytes^^
// // Tiddler link tooltip date format:
// // {{stretch{<<option txtTiddlerLinkTooltipDate>>}}}
//{{{
config.messages.tiddlerLinkTooltip="%0 - %1, %2 (%3 bytes)";
config.messages.tiddlerLinkTooltipDate="DDD, MMM DDth YYYY 0hh12:0mm AM";

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

Tiddler.prototype.getSubtitle = function() {
	var modifier = this.modifier;
	if(!modifier) modifier = config.messages.subtitleUnknown;
	var modified = this.modified;
	if(modified) modified = modified.formatString(config.options.txtTiddlerLinkTooltipDate);
	else modified = config.messages.subtitleUnknown;
	return config.options.txtTiddlerLinkTootip.format([this.title,modifier,modified,this.text.length]);
};
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/628 - OPEN
// // When invoking a macro that is not defined, this tweak prevents the display of the "error in macro... no such macro" message.  This is useful when rendering tiddler content or templates that reference macros that are defined by //optional// plugins that have not been installed in the current document.
// //
// // <<option chkHideMissingMacros>> hide "no such macro" error messages
//{{{
if (config.options.chkHideMissingMacros===undefined)
	config.options.chkHideMissingMacros=false;

window.coreTweaks_missingMacro_invokeMacro = window.invokeMacro;
window.invokeMacro = function(place,macro,params,wikifier,tiddler) {
	if (!config.macros[macro] || !config.macros[macro].handler)
		if (config.options.chkHideMissingMacros) return;
	window.coreTweaks_missingMacro_invokeMacro.apply(this,arguments);
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/609 - OPEN (separators)
// // http://trac.tiddlywiki.org/ticket/610 - OPEN (wikify tiddler/slice/section content)
// // These tweaks extend the {{{<<toolbar>>}}} macro to permit use of "|" as separators, as well as recognizing references to tiddlernames, slices, or sections and rendering their content inline within the toolbar
// // ''see [[ToolbarCommands]] for examples of how these features can be used''
//{{{
merge(config.macros.toolbar,{
	separator: "|"
	});
config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	for(var t=0; t<params.length; t++) {
		var c = params[t];
		switch(c) {
			case '|':  // ELS - SEPARATOR
			case '!':  // ELS - SEPARATOR (alternative for use in tiddler slices)
				createTiddlyText(place,this.separator); // ELS
				break; // ELS
			case '>':
				var btn = createTiddlyButton(place,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore);
				addClass(btn,"moreCommand");
				var e = createTiddlyElement(place,"span",null,"moreCommand");
				e.style.display = "none";
				place = e;
				break;
			default:
				var theClass = "";
				switch(c.substr(0,1)) {
					case "+":
						theClass = "defaultCommand";
						c = c.substr(1);
						break;
					case "-":
						theClass = "cancelCommand";
						c = c.substr(1);
						break;
				}
				if(c in config.commands)
					this.createCommand(place,c,tiddler,theClass);
				else { // ELS - WIKIFY TIDDLER/SLICE/SECTION
					if (c.substr(0,1)=="~") c=c.substr(1); // ignore leading ~
					var txt=store.getTiddlerText(c);
					if (txt) {
						txt=txt.replace(/^\n*/,"").replace(/\n*$/,""); // trim any leading/trailing newlines
						txt=txt.replace(/^\{\{\{\n/,"").replace(/\n\}\}\}$/,""); // trim PRE format wrapper if any
						wikify(txt,createTiddlyElement(place,"span"),null,tiddler);
					}
				} // ELS - end WIKIFY CONTENT
				break;
		}
	}
};
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/608 - OPEN
// // This tweak extends the {{{<<toolbar>>}}} macro to make the ">" (more) a //toggle// between more/less with the additional toolbar commands displayed on a separate line.
//{{{
merge(config.macros.toolbar,{
	moreLabel: 'more',
	morePrompt: "Show additional commands",
	lessLabel: 'less',
	lessPrompt: "Hide additional commands"
});
config.macros.toolbar.onClickMore = function(ev)
{
	var e = this.nextSibling;
	var showing=e.style.display=="block";
	e.style.display = showing?"none":"block";
	this.innerHTML=showing?config.macros.toolbar.moreLabel:config.macros.toolbar.lessLabel;
	this.title=showing?config.macros.toolbar.morePrompt:config.macros.toolbar.lessPrompt;
	return false;
};
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/607 - OPEN
// // This tweak automatically sets the HREF for the 'permaview' sidebar command link so you can use the 'right click' context menu for faster, easier bookmarking.  Note that this does ''not'' automatically set the permaview in the browser's current location URL... it just sets the HREF on the command link.  You still have to click the link to apply the permaview.
//{{{
config.macros.permaview.handler = function(place)
{
	var btn=createTiddlyButton(place,this.label,this.prompt,this.onClick);
	addEvent(btn,"mouseover",this.setHREF);
	addEvent(btn,"focus",this.setHREF);
};
config.macros.permaview.setHREF = function(event){
	var links = [];
	story.forEachTiddler(function(title,element) {
		links.push(String.encodeTiddlyLink(title));
	});
	var newURL=document.location.href;
	var hashPos=newURL.indexOf("#");
	if (hashPos!=-1) newURL=newURL.substr(0,hashPos);
	this.href=newURL+"#"+encodeURIComponent(links.join(" "));
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/529 - OPEN
// // This tweak hijacks the standard browser function, document.getElementById(), to work-around the case-INsensitivity error in Internet Explorer (all versions up to and including IE7) //''Note: This tweak is only applied when using IE, and only for lookups of rendered tiddler elements within the containing "tiddlerDisplay" element.''//
//{{{
if (config.browser.isIE) {
document.coreTweaks_coreGetElementById=document.getElementById;
document.getElementById=function(id) {
	var e=document.coreTweaks_coreGetElementById(id);
	if (!e || !e.parentNode || e.parentNode.id!="tiddlerDisplay") return e;
	for (var i=0; i<e.parentNode.childNodes.length; i++)
		if (id==e.parentNode.childNodes[i].id) return e.parentNode.childNodes[i];
	return null;
};
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/471 - OPEN
// // This tweak HIJACKS the core's saveTiddler() function to automatically add a "creator" field to a tiddler when it is FIRST created. You can use {{{<<view creator>>}}} (or {{{<<view creator wikified>>}}} if you prefer) to show this value embedded directly within the tiddler content, or {{{<span macro="view creator"></span>}}} in the ViewTemplate and/or EditTemplate to display the creator value in each tiddler.  
//{{{
// hijack saveTiddler()
TiddlyWiki.prototype.CoreTweaks_creatorSaveTiddler=TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler=function(title,newTitle,newBody,modifier,modified,tags,fields)
{
	var existing=store.tiddlerExists(title);
	var tiddler=this.CoreTweaks_creatorSaveTiddler.apply(this,arguments);
	if (!existing) store.setValue(title,"creator",config.options.txtUserName);
	return tiddler;
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/458 - CLOSED: WON'T FIX
// // This tweak assigns a "permalink"-like HREF to internal Tiddler links (which normally do not have any HREF defined).  This permits the link's context menu (right-click) to include 'open link in another window/tab' command.  Based on a request from Dustin Spicuzza.
//{{{
window.coreTweaks_createTiddlyLink=window.createTiddlyLink;
window.createTiddlyLink=function(place,title,includeText,theClass,isStatic,linkedFromTiddler,noToggle)
{
	// create the core button, then add the HREF (to internal links only)
	var link=window.coreTweaks_createTiddlyLink.apply(this,arguments);
	if (!isStatic)
		link.href=document.location.href.split("#")[0]+"#"+encodeURIComponent(String.encodeTiddlyLink(title));
	return link;
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/444 - OPEN
// // When invoking a macro, this tweak makes the current containing tiddler object and DOM rendering location available as global variables (window.tiddler and window.place, respectively).  These globals can then be used within "computed macro parameters" to retrieve tiddler-relative and/or DOM-relative values or perform tiddler-specific side-effect functionality.
//{{{
window.coreTweaks_invokeMacro = window.invokeMacro;
window.invokeMacro = function(place,macro,params,wikifier,tiddler) {
	var here=story.findContainingTiddler(place);
	window.tiddler=here?store.getTiddler(here.getAttribute("tiddler")):null;
	window.place=place;
	window.coreTweaks_invokeMacro.apply(this,arguments);
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/401 - CLOSED: WON'T FIX
// // This tweak allows definition of an optional [[PageTitle]] tiddler that, when present, provides alternative text for display in the browser window's titlebar, instead of using the combined text content from [[SiteTitle]] and [[SiteSubtitle]] (which will still be displayed as usual in the TiddlyWiki document header area)
//{{{
window.coreTweaks_getPageTitle=window.getPageTitle;
window.getPageTitle=function() { 
	var txt=wikifyPlain("PageTitle"); if (txt.length) return txt;
	return window.coreTweaks_getPageTitle.apply(this,arguments);
}
store.addNotification("PageTitle",refreshPageTitle); // so title stays in sync with tiddler changes
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/67 - OPEN
// // The "missing links" list includes items contained within "quoted" text (i.e., content that will not render as wiki-syntax, and so CANNOT create any tiddler links, even if the quoted text matches valid link syntax).  This tweak removes content contained between certain delimiters before scanning tiddler source for possible links.
/***
Delimiters include:
{{{
/%...%/
{{{...}}}
"""..."""
<nowiki>...</nowiki>
<html>...</html>
<script>...</script>
}}}
***/
//{{{
Tiddler.prototype.coreTweaks_changed = Tiddler.prototype.changed;
Tiddler.prototype.changed = function()
{
	var savedtext=this.text;
	// remove 'quoted' text before scanning tiddler source
	this.text=this.text.replace(/\/%((?:.|\n)*?)%\//g,""); // /%...%/
	this.text=this.text.replace(/\{{3}((?:.|\n)*?)\}{3}/g,""); // {{{...}}}
	this.text=this.text.replace(/"{3}((?:.|\n)*?)"{3}/g,""); // """..."""
	this.text=this.text.replace(/\<nowiki\>((?:.|\n)*?)\<\/nowiki\>/g,""); // <nowiki>...</nowiki>
	this.text=this.text.replace(/\<html\>((?:.|\n)*?)\<\/html\>/g,""); // <html>...</html>
	this.text=this.text.replace(/\<script((?:.|\n)*?)\<\/script\>/g,""); // <script>...</script>
	this.coreTweaks_changed.apply(this,arguments);
	// restore quoted text to tiddler source
	this.text=savedtext;
};
//}}}
// // }}}
/***
!!! Fixed in current release (TW<<version>>)
***/
// // {{groupbox small{
// // calculate version number for conditional inclusion of tweaks below...
//{{{
var ver=version.major+version.minor/10+version.revision/100;
//}}}
// // }}}
// // {{groupbox small{
/***
!!#filter:"..." paramifier
http://trac.tiddlywiki.org/ticket/678 - FIXED IN TW241
displays all tiddlers that match any filter criteria (including tag-matching), using the {{{store.filterTiddlers()}}} syntax.  Note use of double-quotes to enclose value to ensure that square-brackets within filter syntax are passed through for processing.
***/
//{{{
if (ver<2.41) {
config.paramifiers.filter = {
	onstart: function(v) {
		var tagged = store.filterTiddlers(v);
		story.displayTiddlers(null,tagged,null,false,null);
	}
};
}
//}}}
// // }}}
// // {{groupbox small{
/***
!!#tag:... paramifier
http://trac.tiddlywiki.org/ticket/677 - FIXED IN TW241
use {{{store.filterTiddlers()}}} instead of {{{store.getTaggedTiddlers()}}}.  This permits enhanced tag-matching logic (such as boolean expression processing provided by [[MatchTagsPlugin]]) to be used, e.g., {{{#tag:"tag1 OR (tag2 AND NOT tag3)"}}}, instead of simply matching a single tag value.
***/
//{{{
if (ver<2.41) {
config.paramifiers.tag = {
	onstart: function(v) {
		var tagged = store.filterTiddlers("[tag["+v+"]]");
		story.displayTiddlers(null,tagged,null,false,null);
	}
};
}
//}}}
// // }}}
// // {{groupbox small{
/***
!!#recent:... paramifier
http://trac.tiddlywiki.org/ticket/675 - FIXED IN TW241
automatically display the N most recently changed tiddlers.  N is, of course, an integer number.  If N=0 (or is not a numeric value), the regular [[DefaultTiddlers]] will be displayed.
***/
//{{{
if (ver<2.41) {
config.paramifiers.recent= {
	onstart: function(v) {
		var titles=[];
		var tids=store.getTiddlers("modified","excludeLists").reverse();
		for (var t=0; t<v && t<tids.length; t++) titles.push(tids[t].title);
		story.displayTiddlers(null,titles); 
	}
};
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/635 - FIXED IN TW241
// // When using backstage>import "browse" button, resulting URL is improperly formed with "file://" prefix instead of "file:///" prefix.  This causes errors when using Firefox 3 (beta) or when running under Windows Vista OS.
// // http://trac.tiddlywiki.org/ticket/638 - FIXED IN TW241
// // When entering text directly into path/file field, each keystroke is displayed and then discarded, preventing manual entry of path/file.
// // http://trac.tiddlywiki.org/ticket/639 - FIXED IN TW241
// // Pressing "enter" from URL or Browse input field immediately reloads the current document.  Instead, it should trigger the "open" button for the import wizard (if a URL has been entered)
//{{{
if (ver<2.41) {
// #635 and #638
config.macros.importTiddlers.onBrowseChange = function(e)
{
	var wizard = new Wizard(this);
	var fileInput = wizard.getElement("txtPath");
	fileInput.value = config.macros.importTiddlers.getURLFromLocalPath(this.value); // #635
	var serverType = wizard.getElement("selTypes");
	serverType.value = "file";
	return true; // #638
};
// #635 - fixup local path/file to form absolute URL reference
config.macros.importTiddlers.getURLFromLocalPath = function(v)
{
	if (!v||!v.length) return v;
	v=v.replace(/\\/g,"/"); // use "/" for cross-platform consistency
	var t=v.split(":"); p=t[1]||t[0]; // remove drive letter (if any)
	if (t[1] && (t[0]=="http"||t[0]=="https"||t[0]=="file")) { // input is already a URL
		var u=v;
	} else if (p.substr(0,1)=="/") { // path is absolute, add protocol+domain+extra slash (if drive letter)
		var u=document.location.protocol+"//"+document.location.hostname+(t[1]?"/":"")+v;
	} else { // path is relative, add current document protocol+domain+path
		var c=document.location.href.replace(/\\/g,"/");
		var pos=c.lastIndexOf("/"); if (pos!=-1) c=c.substr(0,pos); // remove filename
		var u=c+"/"+p;
	}
	return u;
}
// #639 - prevent form action and click "open" button if ENTER is pressed
config.macros.importTiddlers.coreTweaks_restart = config.macros.importTiddlers.restart;
config.macros.importTiddlers.restart = function(wizard)
{
	config.macros.importTiddlers.coreTweaks_restart.apply(this,arguments);
	wizard.formElem.action="javascript:;"
	wizard.formElem.onsubmit=function() {
		if (this.txtPath.value.length)
			this.lastChild.firstChild.onclick();  // press "open" button
	}
};
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/623 - FIXED IN TW241
/***
This tweak allows date format strings to contain backslash-quoted characters that bypass date format replacement.  This allows sequences such as "s\s", "m\m" or "a\m" to be used so that "ss", "mm" or "am" can appears as literal text within journal titles or other date-formatted values.

For example:
>{{{<<today "withhold less hummingbirds - YYYY.0MM.0DD 0hh:0mm:0ss">>}}}
>results in: <<today "withhold less hummingbirds - YYYY.0MM.0DD 0hh:0mm:0ss">>
while:
>{{{<<today "with\hold les\s hum\mingbirds - YYYY.0MM.0DD 0hh:0mm:0ss">>}}}
>results in: <<today "with\hold les\s hum\mingbirds - YYYY.0MM.0DD 0hh:0mm:0ss">>
***/
//{{{
if (ver<2.41) {
Date.prototype.coreTweaks_formatString = Date.prototype.formatString;
Date.prototype.formatString = function(template) {
	var t = Date.prototype.coreTweaks_formatString.apply(this,arguments);
	t = t.replace(/\\/g,""); // strip backslashes used to quote formats
	return t;
};
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/578 - FIXED IN TW240
// // This tweak trims any leading whitespace/newline and the trailing newline from tiddler sections
//{{{
if (ver<2.4) {
TiddlyWiki.prototype.coreTweaks_getTiddlerText = TiddlyWiki.prototype.getTiddlerText;
TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
{
	var r=TiddlyWiki.prototype.coreTweaks_getTiddlerText.apply(this,arguments);
	if (r&&title.indexOf(config.textPrimitives.sectionSeparator)!=-1)
		r=r.replace(/^[ \t]*\n/,"").replace(/\n$/,""); // trim any leading/trailing newlines
	return r;
};
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/541 - FIXED IN TW240
// // This tweak adds a conditional check to the core's 'open' paramifier, so that when the document is viewed in readOnly mode, non-existent tiddlers specified using a permalink/permaview (i.e. "#TiddlerName" in the document URL) will not be displayed as an empty tiddler (which shows the "double-click to create" default text).
//{{{
if (ver<2.4) {
config.paramifiers.open = { 
onstart: function(v) { 
		if(!readOnly || store.tiddlerExists(v) || store.isShadowTiddler(v)) 
			story.displayTiddler("bottom",v,null,false,null); 
	} 
}; 
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/470 - FIXED IN TW240
// // This tweak lets you set an alternative initial focus field when editing a tiddler (default field is "text")
// // Enter initial focus field name: <<option txtEditorFocus>> (//usage:// {{{<<option txtEditorFocus>>}}})
//{{{
if (ver<2.4) {
config.commands.editTiddler.coreTweaks_handler = config.commands.editTiddler.handler;
config.commands.editTiddler.handler = function(event,src,title)
{
	if (config.options.txtEditorFocus==undefined) config.options.txtEditorFocus="text";
	this.coreTweaks_handler.apply(this,arguments);
	story.focusTiddler(title,config.options.txtEditorFocus);
	return false;
};
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/468 - FIXED IN TW240
// // This tweak extends the core's {{{<<tag>>}}} macro to accept additional parameters for specifying alternative label and tooltip text for the tag popup "button" link (i.e., "`PrettyTags").  Based on a suggestion by ~PBee.
//{{{
// hijack tag handler()
if (ver<2.4) {
config.macros.tag.CoreTweaks_handler=config.macros.tag.handler;
config.macros.tag.handler = function(place,macroName,params)
{
	this.CoreTweaks_handler.apply(this,arguments);
	var btn=place.lastChild;
	if (params[1]) btn.innerHTML=params[1];
	if (params[2]) btn.title=params[2];
}
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/320 - FIXED IN TW240
// // This tweak updates the core's forceReflow() function to fix a Firefox rendering problem, whereby the contents of the a tiddler editor text area can be incorrectly displayed (overlapping other content) when more than one tiddler is in edit mode.
//{{{
if (ver<2.4) {
function forceReflow()
{
	if(config.browser.isGecko) {
		setStylesheet("body {top:-0px;margin-top:0px;}");
		setTimeout('setStylesheet("")',1); // invoke async to bypass browser optimization
	}
}
}
//}}}
// // }}}
// // {{groupbox small{
// // http://trac.tiddlywiki.org/ticket/42 - FIXED IN TW240
// // This tweak adjusts the left position of a TW popup so that it won't overlap with the browser window's vertical scrollbar, when present.
//{{{
if (ver<2.4) {
Popup.place = function(root,popup,offset)
{
	if(!offset) var offset = {x:0, y:0};
	var rootLeft = findPosX(root);
	var rootTop = findPosY(root);
	var rootHeight = root.offsetHeight;
	var popupLeft = rootLeft + offset.x;
	var popupTop = rootTop + rootHeight + offset.y;
	var winWidth = findWindowWidth();
	if(popup.offsetWidth > winWidth*0.75)
		popup.style.width = winWidth*0.75 + "px";
	var popupWidth = popup.offsetWidth;
	// ELS: leave space for vertical scrollbar
	var scrollWidth=winWidth-document.body.offsetWidth;
	if(popupLeft+popupWidth > winWidth-scrollWidth-1)
		popupLeft = winWidth-popupWidth-scrollWidth-1;
	popup.style.left = popupLeft + "px";
	popup.style.top = popupTop + "px";
	popup.style.display = "block";
};
}
//}}}
// // }}}
/***
!!!Unticketed Tweaks
***/
// // {{groupbox small{
/***
!!#animate:... paramifier
http://trac.tiddlywiki.org/ticket/TBD - TBD
This tweak provides a paramifier to turn on/off animation
***/
//{{{
config.paramifiers.animate= {
	onstart: function(v) {
		config.options.chkAnimate=eval(v);
	}
};
//}}}
// // }}}
// // {{groupbox small{
// // This tweak adds an optional 'sortby' parameter to the {{{<<tag tagname label tip sortby>>}}} macro, as well as the {{{<<allTags excludeTag sortby>>}}} macro used to generate the sidebar contents 'tags' list.  Specify the field on which the contents of each tag popup is to be sorted, with a "+" or "-" prefix to indicate ascending/descending order, respectively.

// // Example: {{{<<tag systemConfig "plugins" "list plugins by date, most recent first" "-modified">>}}}
// // Try it: <<tag systemConfig "plugins" "list plugins by date, most recent first" "-modified">>

// // Similarly, to change the sort order used by the popups from all tags shown in the sidebar contents, edit the [[TagTags]] shadow tiddler and enter: {{{<<allTags excludeLists -modified>>}}}

//{{{
// hijack tag handler() to add 'sortby' attribute to tag button
config.macros.tag.CoreTweaksSortTags_handler=config.macros.tag.handler;
config.macros.tag.handler = function(place,macroName,params)
{
	this.CoreTweaksSortTags_handler.apply(this,arguments);
	var btn=place.lastChild;
	if (params[3]) btn.setAttribute("sortby",params[3]);
}

// TWEAK <<allTags>> macro to add 'sortby' attribute to each tag button
var fn=config.macros.allTags.handler;
var lines=fn.toString().split("\n");
lines.splice(lines.length-2,0,['if(params[1]) btn.setAttribute("sortby",params[1]);']);
fn=lines.join("\n");
eval("config.macros.allTags.handler="+fn);

// TWEAK event handler for clicking on a tiddler tag to use 'sortby' attribute
var fn=onClickTag;
fn=fn.toString().replace(
	/store.getTaggedTiddlers\(tag\);/g,
	'store.getTaggedTiddlers(tag);'
	+'var sortby=this.getAttribute("sortby");'
	+'if(sortby&&sortby.length) store.sortTiddlers(tagged,sortby);'
);
eval(fn);

//}}}
// // }}}
// // {{groupbox small{
// // This HIJACK tweak pre-processes source content to convert "double-backslash-newline" into {{{<br>}}} before wikify(), so that literal newlines can be embedded in line-mode wiki syntax (e.g., tables, bullets, etc.).  Based on a suggestion from Sitaram Chamarty.
//{{{
window.coreWikify = wikify;
window.wikify = function(source,output,highlightRegExp,tiddler)
{
	if (source) arguments[0]=source.replace(/\\\\\n/mg,"<br>");
	coreWikify.apply(this,arguments);
}
//}}}
// // }}}
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/davincicode.jpg]]

//This is a letter I sent to several newspapapers at the height of the Da Vinci Code. Unfortunately, it did not get published, as far as I know. Thus, I'm publishing it here! =D //

All of those I know who have read the Da Vinci Code have told me that it's an exciting book.  I don't disagree with them.   Most probably it really is. And if the film lives up to the book, it may even be more exciting. However, I don't think that the level of excitement is the only or most important reason for reading a book or seeing a film.

My main problem with the Da Vinci Code is not that it is trying to present fiction as fact. For the discerning readers, it's not difficult to disprove the many erroneous claims of the book. My main problem with it is that it paints a grotesque caricature of Christ and of the Church.  Yes, you and I know that it's just fiction, it's just a book, it's just a film.  But it blemishes the name of established institutions, and that I couldn't take.

If someone were to write a really gripping novel that features your mother and starts saying she's a prostitute and that she's murdered people, and that she has this bizarre way of acting, then tells you, "Don't worry, it's just fiction, an exaggeration, it's not real," would you take it lightly?  If someone were to curse you, would you smile back at him and just console yourself with the thought that, "Well, the reality is, my mother is not a prostitute"?

I'm not a killjoy.  It's good for us to have fun and leisure, but not at the expense of our mother. And for us Christians, the Church is our Mother, the one who begot us in the faith and continues to take care of us.

-NEWind
There have been some who were so occupied in spreading Christianity that they never gave a thought to Christ. Man! Ye see it in smaller matters. Did ye never know a lover of books that with all his first editions and signed copies had lost the power to read them? Or an organiser of charities that had lost all love for the poor? It is the subtlest of all the snares.’

-[[C.S. Lewis]], [[The Great Divorce]]
“When Catholicism goes bad it becomes the world-old, world-wide religio of amulets and holy places and priestcraft; Protestantism, in its corresponding decay, becomes a vague mist of ethical platitudes.” 

-[[C.S. Lewis]], [[Allegory of Love]]. p. xxiv
[[Home]]
<<slider chkAuthors Authors 'Authors'>>
<<slider chkBooks Books 'Books'>>
[[All Notes]]
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
{{button{Go to Tiddler:}}}
<<gotoTiddler>><<search>><<closeAll>><<saveChanges>><<newTiddler title:"New Note" label:"new note" tag:"note">><<newTiddler title:"AuthorName" label:"new author" tag:"author" text: {{store.getTiddlerText("NewAuthorBoilerPlate")}}>><<newTiddler title:"BookTitle" label:"new book" tag:"book" text: {{store.getTiddlerText("NewBookBoilerPlate")}}>><<newTiddler>><<permaview>><<newJournal "DD MMM YYYY" "journal">><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
[[Home]]
Type the text for 'DiscoveryPackage'
Do not be afraid to say ‘yes’ to Jesus, to find your joy in doing his will, giving yourself completely to the pursuit of holiness, and using all your talents in the service of others.

-[[Benedict XVI]], [[World Youth Day 2008, Sydney]]
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
‘In approaching Lewis, Protestants who claim to hold to a merely “spiritual”version of Christianity, whether liberal and “vaguely ethical”or conservative and “spirit-filled” will be in perpetual danger of having their neat and tidy dualism between spirit and flesh challenged by Lewis’s sacramentalism, his liturgical sense and his potent grasp of sanctification. On the other hand, cradle Catholics who have drifted into hollow ritualism, whether overzealously superstitious or underzealously mechanical will be in continual danger of discovering the true meaning and spirit that animates both liturgy and sacraments, and will run the risk of plunging headlong into genuine Catholic spirituality.’

- R.A. Benthall in [[Joseph Pearce]]'s [[C.S. Lewis and the Catholic Church]], p.xxiv in the book’s introduction
<<<
!!!Euler's Irrational Imagining
!!!!//@@color(red):i@@// to the //@@color(red):i@@//
!!!!you equal, do you not
!!!!one over the square root
!!!!of //@@color(red):e@@// to the //@@color(red):pi@@//?
<<<

This is a tribute to Euler's magnificent observation that :

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/itothei.jpg]]

What is interesting about this equation is the fact that it involves 3 of the most important numbers in Math: the imaginary number ''//i//''  and the irrational numbers ''//e//'' (Euler's number) and ''//pi//''. Morover, it shows that an //imaginary number// raised to an //imaginary number// is equated to a //real number//!  "It's beautiful, isn't it?" (borrowing the words from a previous professor)
“It’s a pity Bilbo didn’t kill him when he had the chance.” Gandalf replies, “…Many that live deserve death. Some that die deserve life. Can you give it to them, Frodo? Do not be too eager to deal out death in judgment. Even the very wise cannot see all ends.”
/***
|Name|ExportTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExportTiddlersPluginInfo|
|Version|2.7.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|select and extract tiddlers from your ~TiddlyWiki documents and save them to a separate file|
ExportTiddlersPlugin lets you select and extract tiddlers from your ~TiddlyWiki documents using interactive control panel lets you specify a destination, and then select which tiddlers to export. Tiddler data can be output as complete, stand-alone TiddlyWiki documents, or just the selected tiddlers ("~PureStore" format -- smaller files!) that can be imported directly into another ~TiddlyWiki, or as an ~RSS-compatible XML file that can be published for RSS syndication.
!!!!!Documentation
>see [[ExportTiddlersPluginInfo]]
!!!!!Inline control panel (live):
><<exportTiddlers inline>>
!!!!!Revisions
<<<
2008.05.27 [2.7.0] added ability to 'merge' with existing export file. Also, revised 'matchTags' functionality to be more robust and more efficient
|please see [[ExportTiddlersPluginInfo]] for additional revision details|
2005.10.09 [0.0.0] development started
<<<
!!!!!Code
***/
//{{{
// version
version.extensions.exportTiddlers = {major: 2, minor: 7, revision: 0, date: new Date(2008,5,27)};

// default shadow definition
config.shadowTiddlers.ExportTiddlers="<<exportTiddlers inline>>";

// add 'export' backstage task (following built-in import task)
if (config.tasks) { // TW2.2 or above
	config.tasks.exportTask = {
		text:"export",
		tooltip:"Export selected tiddlers to another file",
		content:"<<exportTiddlers inline>>"
	}
	config.backstageTasks.splice(config.backstageTasks.indexOf("importTask")+1,0,"exportTask");
}

// macro handler
config.macros.exportTiddlers = {
	label: "export tiddlers",
	prompt: "Copy selected tiddlers to an export document",
	newdefault: "export.html",
	datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields
};

config.macros.exportTiddlers.handler = function(place,macroName,params) {
	if (params[0]!="inline")
		{ createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }
	var panel=createExportPanel(place);
	panel.style.position="static";
	panel.style.display="block";
}

function createExportPanel(place) {
	var panel=document.getElementById("exportPanel");
	if (panel) { panel.parentNode.removeChild(panel); }
	setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");
	panel=createTiddlyElement(place,"span","exportPanel",null,null)
	panel.innerHTML=config.macros.exportTiddlers.html;
	exportInitFilter();
	refreshExportList(0);
	var fn=document.getElementById("exportFilename");
	if (window.location.protocol=="file:" && !fn.value.length) {
		// get new target path/filename
		var newPath=getLocalPath(window.location.href);
		var slashpos=newPath.lastIndexOf("/"); if (slashpos==-1) slashpos=newPath.lastIndexOf("\\"); 
		if (slashpos!=-1) newPath=newPath.substr(0,slashpos+1); // trim filename
		fn.value=newPath+config.macros.exportTiddlers.newdefault;
	}
	return panel;
}

function onClickExportMenu(e)
{
	if (!e) var e = window.event;
	var parent=resolveTarget(e).parentNode;
	var panel = document.getElementById("exportPanel");
	if (panel==undefined || panel.parentNode!=parent)
		panel=createExportPanel(parent);
	var isOpen = panel.style.display=="block";
	if(config.options.chkAnimate)
		anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		panel.style.display = isOpen ? "none" : "block" ;
	if (panel.style.display!="none") { // update list and set focus when panel is made visible
		refreshExportList(0);
		var fn=document.getElementById("exportFilename"); fn.focus(); fn.select();
	}
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	return(false);
}
//}}}

// // IE needs explicit scoping for functions called by browser events
//{{{
window.onClickExportMenu=onClickExportMenu;
window.onClickExportButton=onClickExportButton;
window.exportShowFilterFields=exportShowFilterFields;
window.refreshExportList=refreshExportList;
//}}}

// // CSS for floating export control panel
//{{{
config.macros.exportTiddlers.css = '\
#exportPanel {\
	display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\
	background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
	border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
	padding: 0.5em; margin:0em; -moz-border-radius:1em;\
}\
#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\
#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\
#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\
#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\
#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\
#exportPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\
#exportPanel textarea  { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\
#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\
#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\
#exportPanel .rad { width:auto;border:0 }\
#exportPanel .chk { width:auto;border:0 }\
#exportPanel .btn { width:auto; }\
#exportPanel .btn1 { width:98%; }\
#exportPanel .btn2 { width:48%; }\
#exportPanel .btn3 { width:32%; }\
#exportPanel .btn4 { width:24%; }\
#exportPanel .btn5 { width:19%; }\
';
//}}}

// // HTML for export control panel interface
//{{{
config.macros.exportTiddlers.html = '\
<!-- target path/file  -->\
<div>\
export to path/filename:<br>\
<input type="text" id="exportFilename" size=40 style="width:93%"><input \
	type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%" \
	onclick="var fn=window.promptForExportFilename(this); if (fn.length) this.previousSibling.value=fn; ">\
</div>\
\
<!-- output format -->\
<div>\
output file format:\
<select id="exportFormat" size=1>\
<option value="TW">TiddlyWiki document (includes core code)</option>\
<option value="DIV">TiddlyWiki "PureStore" file (tiddler data only)</option>\
<option value="XML">XML (for RSS newsfeed)</option>\
</select>\
</div>\
\
<!-- notes -->\
<div>\
notes:<br>\
<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \
</div>\
\
<!-- list of tiddlers -->\
<table><tr align="left"><td>\
	select:\
	<a href="JavaScript:;" id="exportSelectAll"\
		onclick="onClickExportButton(this)" title="select all tiddlers">\
		&nbsp;all&nbsp;</a>\
	<a href="JavaScript:;" id="exportSelectChanges"\
		onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\
		&nbsp;changes&nbsp;</a> \
	<a href="JavaScript:;" id="exportSelectOpened"\
		onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\
		&nbsp;opened&nbsp;</a> \
	<a href="JavaScript:;" id="exportSelectRelated"\
		onclick="onClickExportButton(this)" title="select all tiddlers related (by link or transclusion) to the currently selected tiddlers">\
		&nbsp;related&nbsp;</a> \
	<a href="JavaScript:;" id="exportToggleFilter"\
		onclick="onClickExportButton(this)" title="show/hide selection filter">\
		&nbsp;filter&nbsp;</a>  \
</td><td align="right">\
	<a href="JavaScript:;" id="exportListSmaller"\
		onclick="onClickExportButton(this)" title="reduce list size">\
		&nbsp;&#150;&nbsp;</a>\
	<a href="JavaScript:;" id="exportListLarger"\
		onclick="onClickExportButton(this)" title="increase list size">\
		&nbsp;+&nbsp;</a>\
</td></tr></table>\
<select id="exportList" multiple size="10" style="margin-bottom:5px;"\
	onchange="refreshExportList(this.selectedIndex)">\
</select><br>\
</div><!--box-->\
\
<!-- selection filter -->\
<div id="exportFilterPanel" style="display:none">\
<table><tr align="left"><td>\
	selection filter\
</td><td align="right">\
	<a href="JavaScript:;" id="exportHideFilter"\
		onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\
</td></tr></table>\
<div class="box">\
<input type="checkbox" class="chk" id="exportFilterStart" value="1"\
	onclick="exportShowFilterFields(this)"> starting date/time<br>\
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\
	<select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\
		<option value="0">today</option>\
		<option value="1">yesterday</option>\
		<option value="7">a week ago</option>\
		<option value="30">a month ago</option>\
		<option value="site">SiteDate</option>\
		<option value="file">file date</option>\
		<option value="other">other (mm/dd/yyyy hh:mm)</option>\
	</select>\
</td><td width="50%">\
	<input type="text" id="exportStartDate" onfocus="this.select()"\
		onchange="document.getElementById(\'exportFilterStartBy\').value=\'other\';">\
</td></tr></table>\
<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\
	onclick="exportShowFilterFields(this)"> ending date/time<br>\
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\
	<select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\
		<option value="0">today</option>\
		<option value="1">yesterday</option>\
		<option value="7">a week ago</option>\
		<option value="30">a month ago</option>\
		<option value="site">SiteDate</option>\
		<option value="file">file date</option>\
		<option value="other">other (mm/dd/yyyy hh:mm)</option>\
	</select>\
</td><td width="50%">\
	<input type="text" id="exportEndDate" onfocus="this.select()"\
		onchange="document.getElementById(\'exportFilterEndBy\').value=\'other\';">\
</td></tr></table>\
<input type="checkbox" class="chk" id=exportFilterTags value="1"\
	onclick="exportShowFilterFields(this)"> match tags<br>\
<input type="text" id="exportTags" onfocus="this.select()">\
<input type="checkbox" class="chk" id=exportFilterText value="1"\
	onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\
<input type="text" id="exportText" onfocus="this.select()">\
</div> <!--box-->\
</div> <!--panel-->\
\
<!-- action buttons -->\
<div style="text-align:center">\
<input type=button class="btn4" onclick="onClickExportButton(this)"\
	id="exportFilter" value="apply filter">\
<input type=button class="btn4" onclick="onClickExportButton(this)"\
	id="exportStart" value="export tiddlers">\
<input type=button class="btn4" onclick="onClickExportButton(this)"\
	id="exportDelete" value="delete tiddlers">\
<input type=button class="btn4" onclick="onClickExportButton(this)"\
	id="exportClose" value="close">\
</div><!--center-->\
';
//}}}

// // initialize interface

// // exportInitFilter()
//{{{
function exportInitFilter() {
	// start date
	document.getElementById("exportFilterStart").checked=false;
	document.getElementById("exportStartDate").value="";
	// end date
	document.getElementById("exportFilterEnd").checked=false;
	document.getElementById("exportEndDate").value="";
	// tags
	document.getElementById("exportFilterTags").checked=false;
	document.getElementById("exportTags").value="";
	// text
	document.getElementById("exportFilterText").checked=false;
	document.getElementById("exportText").value="";
	// show/hide filter input fields
	exportShowFilterFields();
}
//}}}

// // exportShowFilterFields(which)
//{{{
function exportShowFilterFields(which) {
	var show;

	show=document.getElementById('exportFilterStart').checked;
	document.getElementById('exportFilterStartBy').style.display=show?"block":"none";
	document.getElementById('exportStartDate').style.display=show?"block":"none";
	var val=document.getElementById('exportFilterStartBy').value;
	document.getElementById('exportStartDate').value
		=getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);
	 if (which && (which.id=='exportFilterStartBy') && (val=='other'))
		document.getElementById('exportStartDate').focus();

	show=document.getElementById('exportFilterEnd').checked;
	document.getElementById('exportFilterEndBy').style.display=show?"block":"none";
	document.getElementById('exportEndDate').style.display=show?"block":"none";
	var val=document.getElementById('exportFilterEndBy').value;
	document.getElementById('exportEndDate').value
		=getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);
	 if (which && (which.id=='exportFilterEndBy') && (val=='other'))
		document.getElementById('exportEndDate').focus();

	show=document.getElementById('exportFilterTags').checked;
	document.getElementById('exportTags').style.display=show?"block":"none";

	show=document.getElementById('exportFilterText').checked;
	document.getElementById('exportText').style.display=show?"block":"none";
}
//}}}

// // onClickExportButton(which): control interactions
//{{{
function onClickExportButton(which)
{
	// DEBUG alert(which.id);
	var theList=document.getElementById('exportList'); if (!theList) return;
	var count = 0;
	var total = store.getTiddlers('title').length;
	switch (which.id)
		{
		case 'exportFilter':
			count=filterExportList();
			var panel=document.getElementById('exportFilterPanel');
			if (count==-1) { panel.style.display='block'; break; }
			document.getElementById("exportStart").disabled=(count==0);
			document.getElementById("exportDelete").disabled=(count==0);
			clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));
			if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }
			break;
		case 'exportStart':
			exportTiddlers();
			break;
		case 'exportDelete':
			exportDeleteTiddlers();
			break;
		case 'exportHideFilter':
		case 'exportToggleFilter':
			var panel=document.getElementById('exportFilterPanel')
			panel.style.display=(panel.style.display=='block')?'none':'block';
			break;
		case 'exportSelectChanges':
			var lastmod=new Date(document.lastModified);
			for (var t = 0; t < theList.options.length; t++) {
				if (theList.options[t].value=="") continue;
				var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;
				theList.options[t].selected=(tiddler.modified>lastmod);
				count += (tiddler.modified>lastmod)?1:0;
			}
			document.getElementById("exportStart").disabled=(count==0);
			document.getElementById("exportDelete").disabled=(count==0);
			clearMessage(); displayMessage(formatExportMessage(count,total));
			if (count==0) alert("There are no unsaved changes");
			break;
		case 'exportSelectAll':
			for (var t = 0; t < theList.options.length; t++) {
				if (theList.options[t].value=="") continue;
				theList.options[t].selected=true;
				count += 1;
			}
			document.getElementById("exportStart").disabled=(count==0);
			document.getElementById("exportDelete").disabled=(count==0);
			clearMessage(); displayMessage(formatExportMessage(count,count));
			break;
		case 'exportSelectOpened':
			for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;
			var tiddlerDisplay = document.getElementById("tiddlerDisplay"); // for TW2.1-
			if (!tiddlerDisplay) tiddlerDisplay = document.getElementById("storyDisplay"); // for TW2.2+
			for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {
				var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);
				for (var i = 0; i < theList.options.length; i++) {
					if (theList.options[i].value!=tiddler) continue;
					theList.options[i].selected=true; count++; break;
				}
			}
			document.getElementById("exportStart").disabled=(count==0);
			document.getElementById("exportDelete").disabled=(count==0);
			clearMessage(); displayMessage(formatExportMessage(count,total));
			if (count==0) alert("There are no tiddlers currently opened");
			break;
		case 'exportSelectRelated':
			// recursively build list of related tiddlers
			function getRelatedTiddlers(tid,tids) {
				var t=store.getTiddler(tid); if (!t || tids.contains(tid)) return tids;
				tids.push(t.title);
				if (!t.linksUpdated) t.changed();
				for (var i=0; i<t.links.length; i++)
					if (t.links[i]!=tid) tids=getRelatedTiddlers(t.links[i],tids);
				return tids;
			}
			// for all currently selected tiddlers, gather up the related tiddlers (including self) and select them as well
			var tids=[];
			for (var i=0; i<theList.options.length; i++)
				if (theList.options[i].selected) tids=getRelatedTiddlers(theList.options[i].value,tids);
			// select related tiddlers (includes original selected tiddlers)
			for (var i=0; i<theList.options.length; i++)
				theList.options[i].selected=tids.contains(theList.options[i].value);
			clearMessage(); displayMessage(formatExportMessage(tids.length,total));
			break;
		case 'exportListSmaller':	// decrease current listbox size
			var min=5;
			theList.size-=(theList.size>min)?1:0;
			break;
		case 'exportListLarger':	// increase current listbox size
			var max=(theList.options.length>25)?theList.options.length:25;
			theList.size+=(theList.size<max)?1:0;
			break;
		case 'exportClose':
			document.getElementById('exportPanel').style.display='none';
			break;
		}
}
//}}}

// // promptForFilename(msg,path,file) uses platform/browser specific functions to get local filespec
//{{{
window.promptForExportFilename=function(here)
{
	var msg=here.title; // use tooltip as dialog box message
	var path=getLocalPath(document.location.href);
	var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\\"); 
	if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash
	var file=config.macros.exportTiddlers.newdefault;
	var result="";
	if(window.Components) { // moz
		try {
			netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
			var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
			var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
			picker.init(window, msg, nsIFilePicker.modeSave);
			var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
			thispath.initWithPath(path);
			picker.displayDirectory=thispath;
			picker.defaultExtension='html';
			picker.defaultString=file;
			picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
			if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
		}
		catch(e) { alert('error during local file access: '+e.toString()) }
	}
	else { // IE
		try { // XPSP2 IE only
			var s = new ActiveXObject('UserAccounts.CommonDialog');
			s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
			s.FilterIndex=3; // default to HTML files;
			s.InitialDir=path;
			s.FileName=file;
			if (s.showOpen()) var result=s.FileName;
		}
		catch(e) {  // fallback
			var result=prompt(msg,path+file);
		}
	}
	return result;
}
//}}}

// // list display
//{{{
function formatExportMessage(count,total)
{
	var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";
	txt += (count==0)?"none":(count==total)?"all":count;
	txt += " selected for export";
	return txt;
}

function refreshExportList(selectedIndex)
{
	var theList  = document.getElementById("exportList");
	var sort;
	if (!theList) return;
	// get the sort order
	if (!selectedIndex)   selectedIndex=0;
	if (selectedIndex==0) sort='modified';
	if (selectedIndex==1) sort='title';
	if (selectedIndex==2) sort='modified';
	if (selectedIndex==3) sort='modifier';
	if (selectedIndex==4) sort='tags';

	// unselect headings and count number of tiddlers actually selected
	var count=0;
	for (var t=5; t < theList.options.length; t++) {
		if (!theList.options[t].selected) continue;
		if (theList.options[t].value!="")
			count++;
		else { // if heading is selected, deselect it, and then select and count all in section
			theList.options[t].selected=false;
			for ( t++; t<theList.options.length && theList.options[t].value!=""; t++) {
				theList.options[t].selected=true;
				count++;
			}
		}
	}

	// disable "export" and "delete" buttons if no tiddlers selected
	document.getElementById("exportStart").disabled=(count==0);
	document.getElementById("exportDelete").disabled=(count==0);
	// show selection count
	var tiddlers = store.getTiddlers('title');
	if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }

	// if a [command] item, reload list... otherwise, no further refresh needed
	if (selectedIndex>4)  return;

	// clear current list contents
	while (theList.length > 0) { theList.options[0] = null; }
	// add heading and control items to list
	var i=0;
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	theList.options[i++]=
		new Option(tiddlers.length+" tiddlers in document", "",false,false);
	theList.options[i++]=
		new Option(((sort=="title"        )?">":indent)+' [by title]', "",false,false);
	theList.options[i++]=
		new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);
	theList.options[i++]=
		new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);
	theList.options[i++]=
		new Option(((sort=="tags"	)?">":indent)+' [by tags]', "",false,false);
	// output the tiddler list
	switch(sort)
		{
		case "title":
			for(var t = 0; t < tiddlers.length; t++)
				theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);
			break;
		case "modifier":
		case "modified":
			var tiddlers = store.getTiddlers(sort);
			// sort descending for newest date first
			tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });
			var lastSection = "";
			for(var t = 0; t < tiddlers.length; t++)
				{
				var tiddler = tiddlers[t];
				var theSection = "";
				if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();
				if (sort=="modifier") theSection=tiddler.modifier;
				if (theSection != lastSection)
					{
					theList.options[i++] = new Option(theSection,"",false,false);
					lastSection = theSection;
					}
				theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);
				}
			 break;
		case "tags":
			var theTitles = {}; // all tiddler titles, hash indexed by tag value
			var theTags = new Array();
			for(var t=0; t<tiddlers.length; t++) {
				var title=tiddlers[t].title;
				var tags=tiddlers[t].tags;
				if (!tags || !tags.length) {
					if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }
					theTitles["untagged"].push(title);
				}
				else for(var s=0; s<tags.length; s++) {
					if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }
					theTitles[tags[s]].push(title);
				}
			}
			theTags.sort();
			for(var tagindex=0; tagindex<theTags.length; tagindex++) {
				var theTag=theTags[tagindex];
				theList.options[i++]=new Option(theTag,"",false,false);
				for(var t=0; t<theTitles[theTag].length; t++)
					theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);
			}
			break;
		}
	theList.selectedIndex=selectedIndex;		  // select current control item
	document.getElementById("exportStart").disabled=true;
	document.getElementById("exportDelete").disabled=true;
	clearMessage(); displayMessage(formatExportMessage(0,tiddlers.length));
}
//}}}

// // list filtering
//{{{
function getFilterDate(val,id)
{
	var result=0;
	switch (val) {
		case 'site':
			var timestamp=store.getTiddlerText("SiteDate");
			if (!timestamp) timestamp=document.lastModified;
			result=new Date(timestamp);
			break;
		case 'file':
			result=new Date(document.lastModified);
			break;
		case 'other':
			result=new Date(document.getElementById(id).value);
			break;
		default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31
			var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;
			var oneday=86400000;
			if (id=='exportStartDate')
				result=new Date((Math.floor(now/oneday)-val)*oneday+tz);
			else
				result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);
			break;
	}
	// DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\nnow="+now);
	return result;
}

function filterExportList()
{
	var theList  = document.getElementById("exportList"); if (!theList) return -1;

	var filterStart=document.getElementById("exportFilterStart").checked;
	var val=document.getElementById("exportFilterStartBy").value;
	var startDate=getFilterDate(val,'exportStartDate');

	var filterEnd=document.getElementById("exportFilterEnd").checked;
	var val=document.getElementById("exportFilterEndBy").value;
	var endDate=getFilterDate(val,'exportEndDate');

	var filterTags=document.getElementById("exportFilterTags").checked;
	var tags=document.getElementById("exportTags").value;

	var filterText=document.getElementById("exportFilterText").checked;
	var text=document.getElementById("exportText").value;

	if (!(filterStart||filterEnd||filterTags||filterText)) {
		alert("Please set the selection filter");
		document.getElementById('exportFilterPanel').style.display="block";
		return -1;
	}
	if (filterStart&&filterEnd&&(startDate>endDate)) {
		var msg="starting date/time:\n"
		msg+=startDate.toLocaleString()+"\n";
		msg+="is later than ending date/time:\n"
		msg+=endDate.toLocaleString()
		alert(msg);
		return -1;
	}

	// if filter by tags, set up conditional expression
	if (filterTags) {
		var all = store.getTags(); // get list of all tags
		for (var i=0; i<all.length; i++) all[i]=all[i][0]; // remove tag counts
		// convert "tag1 AND ( tag2 OR NOT tag3 )"
		// into javascript expression containing regexp tests:
		// "/\~tag1\~/.test(...) && ( /\~tag2\~/.test(...) || ! /\~tag2\~/.test(...) )"
		var c=tags;
		c = c.replace(/[\[\]]/g,""); // remove [[...]] quoting around tagvalues
		// change AND/OR/NOT/parens to javascript operators and delimit terms with "~"
		c = c.replace(/\sand\s/ig,"~&&~");
		c = c.replace(/\sor\s/ig,"~||~");
		c = c.replace(/(\s)?not([\s\(])/ig,"~!~$2");
		c = c.replace(/([\(\)])/ig,"~$1~");
		// change existing tags to regexp tests and non-existing tags to "false"
		var terms=c.split("~");
		for (var i=0; i<terms.length; i++) { var t=terms[i];
			if (/(&&)|(\|\|)|[!\(\)]/.test(t) || t=="") continue; // skip operators/parens/spaces
			terms[i]=!all.contains(t)?"false":("/\\~"+t+"\\~/.test(tiddlertags)");
		}
		c=terms.join(" ");
	}
	function matchTags(t,c) {
		if (!c||!c.trim().length) return false;
		// assemble tags from tiddler into string "~tag1~tag2~tag3~"
		var tiddlertags = "~"+t.tags.join("~")+"~";
		// eval string against boolean test expression
		try { if(eval(c)) return true; }
		catch(e) { displayMessage(e.toString()); }
		return false;
	}
	
	// scan list and select tiddlers that match all applicable criteria
	var total=0;
	var count=0;
	for (var i=0; i<theList.options.length; i++) {
		// get item, skip non-tiddler list items (section headings)
		var opt=theList.options[i]; if (opt.value=="") continue;
		// get tiddler, skip missing tiddlers (this should NOT happen)
		var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; 
		var sel=true;
		if ( (filterStart && tiddler.modified<startDate)
		|| (filterEnd && tiddler.modified>endDate)
		|| (filterTags && !matchTags(tiddler,c))
		|| (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))
			sel=false;
		opt.selected=sel;
		count+=sel?1:0;
		total++;
	}
	return count;
}
//}}}

// // OUTPUT FORMATTING AND FILE I/O
//{{{
function exportTWHeader()
{
	// get the TiddlyWiki core code source
	var sourcefile=getLocalPath(document.location.href);
	var source=loadFile(sourcefile);
	if(source==null) { alert(config.messages.cantSaveError); return null; }
	// reset existing HTML source markup
	source=updateMarkupBlock(source,"PRE-HEAD");
	source=updateMarkupBlock(source,"POST-HEAD");
	source=updateMarkupBlock(source,"PRE-BODY");
	source=updateMarkupBlock(source,"POST-BODY");
	// find store area
	var posOpeningDiv=source.indexOf(startSaveArea);
	var posClosingDiv=source.lastIndexOf(endSaveArea);
	if((posOpeningDiv==-1)||(posClosingDiv==-1))
		{ alert(config.messages.invalidFileError.format([sourcefile])); return; }
	// return everything up to store area
	return source.substr(0,posOpeningDiv+startSaveArea.length);
}

function exportTWFooter()
{
	// get the TiddlyWiki core code source
	var sourcefile=getLocalPath(document.location.href);
	var source=loadFile(sourcefile);
	if(source==null) { alert(config.messages.cantSaveError); return null; }
	// reset existing HTML source markup
	source=updateMarkupBlock(source,"PRE-HEAD");
	source=updateMarkupBlock(source,"POST-HEAD");
	source=updateMarkupBlock(source,"PRE-BODY");
	source=updateMarkupBlock(source,"POST-BODY");
	// find store area
	var posOpeningDiv=source.indexOf(startSaveArea);
	var posClosingDiv=source.lastIndexOf(endSaveArea);
	if((posOpeningDiv==-1)||(posClosingDiv==-1))
		{ alert(config.messages.invalidFileError.format([sourcefile])); return; }
	// return everything after store area
	return source.substr(posClosingDiv);
}

function exportDIVHeader()
{
	var out=[];
	var now = new Date();
	var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());
	var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());
	var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
	var twver = version.major+"."+version.minor+"."+version.revision;
	var pver = version.extensions.exportTiddlers.major+"."
		+version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;
	out.push("<html><body>");
	out.push("<style type=\"text/css\">");
	out.push("#storeArea {display:block;margin:1em;}");
	out.push("#storeArea div");
	out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");
	out.push("#javascriptWarning");
	out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");
	out.push("</style>");
	out.push("<div id=\"javascriptWarning\">");
	out.push("TiddlyWiki export file<br>");
	out.push("Source"+": <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");
	out.push("Title: <b>"+title+"</b><br>");
	out.push("Subtitle: <b>"+subtitle+"</b><br>");
	out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");
	out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");
	out.push("Notes:<hr><pre>"+document.getElementById("exportNotes").value.replace(/\n/g,"<br>")+"</pre>");
	out.push("</div>");
	out.push("<div id=\"storeArea\">");
	return out;
}

function exportDIVFooter()
{
	return ["</div><!--POST-BODY-START-->\n<!--POST-BODY-END--></body></html>"];
}

function exportXMLHeader()
{
	var out=[];
	var now = new Date();
	var u = store.getTiddlerText("SiteUrl",null);
	var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());
	var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());
	var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());
	var twver = version.major+"."+version.minor+"."+version.revision;
	var pver = version.extensions.exportTiddlers.major+"."
		+version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;
	out.push("<" + "?xml version=\"1.0\"?" + ">");
	out.push("<rss version=\"2.0\">");
	out.push("<channel>");
	out.push("<title>" + title + "</title>");
	if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");
	out.push("<description>" + subtitle + "</description>");
	out.push("<language>en-us</language>");
	out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");
	out.push("<pubDate>" + now.toGMTString() + "</pubDate>");
	out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");
	out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
	out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");
	return out;
}

function exportXMLFooter()
{
	return ["</channel></rss>"];
}

function exportData(target,list,fmt)
{
	function getData(s,f,t) { var r="";
		switch (f) {
			case "TW": r=s.getSaver().externalizeTiddler(s,t); break;
			case "DIV": r=t.title+"\n"+s.getSaver().externalizeTiddler(s,t); break;
			case "XML": r=t.saveToRss(store.getTiddlerText("SiteUrl","")); break;
		}
		return convertUnicodeToUTF8(r);
	}

	var out=[]; var tids=[];
	// get selected tiddlers
	for (var i=0; i<list.options.length; i++) {
		var opt=list.options[i]; if (!opt.selected||!opt.value.length) continue;
		var tid=store.getTiddler(opt.value); if (!tid) continue;
		tids.push(tid.title);
		out.push(getData(store,fmt,tid));
	}
	var count=out.length;
	// merge with existing tiddlers
	var text=loadFile(target);
	if (text && text.length) {
		var msg=target+"\nalready contains tiddler definitions.\n";
		msg+="\nPress OK to add new/revised tiddlers to current file contents.";
		msg+="\nPress Cancel to completely replace file contents";
		var remoteStore=new TiddlyWiki();
		if (remoteStore.importTiddlyWiki(text) && confirm(msg)) {
			var existing=remoteStore.getTiddlers("title");
			for (var i=0; i<existing.length; i++)
				if (!tids.contains(existing[i].title))
					out.push(getData(remoteStore,fmt,existing[i]));
			var msg="Merged %0 new/revised tiddlers and %1 existing tiddlers";
			displayMessage(msg.format([count,out.length-count]));
		}
	}
	return out;
}
//}}}

// // exportTiddlers(): output selected data to local file
//{{{
function exportTiddlers()
{
	clearMessage();
	var list  = document.getElementById("exportList"); if (!list) return;
	var fmt = document.getElementById("exportFormat").value;
	var target = document.getElementById("exportFilename").value.trim();
	if (!target.length) {
		displayMessage("A local target path/filename is required",target);
		return;
	}
	switch (fmt) {
		case "TW":	var head=exportTWHeader(); break;
		case "DIV":	var head=exportDIVHeader(); break;
		case "XML":	var head=exportXMLHeader(); break;
	}
	var theData=exportData(target,list,fmt);
	var c=theData.length;
	switch (fmt) {
		case "TW":	var foot=exportTWFooter(); break;
		case "DIV":	var foot=exportDIVFooter(); break;
		case "XML":	var foot=exportXMLFooter(); break;
	}
	var out=[]; var txt=out.concat(head,theData,foot).join("\n");
	var msg="An error occurred while saving to "+target;
	if (saveFile(target,txt)) msg=c+" tiddler"+((c!=1)?"s":"")+" written to "+target;
	displayMessage(msg,"file:///"+target);
}
//}}}

// // exportDeleteTiddlers(): delete selected tiddlers from file
//{{{
function exportDeleteTiddlers()
{
	var list=document.getElementById("exportList"); if (!list) return;
	var tids=[];
	for (i=0;i<list.length;i++)
		if (list.options[i].selected && list.options[i].value.length)
			tids.push(list.options[i].value);
	if (!confirm("Are you sure you want to delete these tiddlers:\n\n"+tids.join(', '))) return;
	store.suspendNotifications();
	for (t=0;t<tids.length;t++) {
		var tid=store.getTiddler(tids[t]); if (!tid) continue;
		if (tid.tags.contains("systemConfig"))
			if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\n\nRemoving this tiddler may cause unexpected results.  Are you sure?"))
				continue;
		store.removeTiddler(tid.title);
		story.closeTiddler(tid.title);
	}
	store.resumeNotifications();
	alert(tids.length+" tiddlers deleted");
	refreshExportList(0); // reload listbox
	store.notifyAll(); // update page display
}
//}}}
These staves he spoke, yet he laughed as he said them. For once more lust of battle was on him; and he was still unscathed, and he was young, and he was king: the lord of a fell people.

- [[J.R.R. Tolkien]] in [[The Lord of the Rings]]
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

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

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

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples|http://tiddlywiki.abego-software.de/#ForEachTiddlerExamples]].

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

!Code
***/
//{{{

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		p++;
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
			return;
		}
		
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		p++;
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			p++;
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
				return;
			}
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
			p++;
		}
	}
	
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
		return;
	}

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	}
	
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

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

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


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

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

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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


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



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


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

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

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

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


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


} // of "install only once"

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


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

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

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

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

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

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
A collection of homilies covering the different (and I would say essential) aspects of the Christian life. In this volume, St.Josemaria shares his insights on how man can strive to achieve his ultimate goal of sanctity in the chapter "Towards Holiness". He outlines how one can develop a life of intense prayer filled with filial love for God in the chapter "Life of Prayer". Among the other topics are human virtues, the theological virtues of faith, hope and charity, love for freedom, etc.

//From Bishop Alvaro del Portillo's Introduction to the Book//
"These eighteen homilies present a broad picture of the basic human and Christian virtues for all who wish to follow closely in the footsteps of our Lord…With Msgr. Escrivá de Balaguer words turn into a colloquy with God - prayer - but without ceasing to be a heartfelt conversation completely in tune with the concerns and hopes of his listeners. The homilies contain living doctrine and combine a theologian's depth with the evangelical clarity of a good shepherd of souls. They are, therefore, a lesson in doctrine and in Christian life in which God is not only spoken of but spoken to. Perhaps this is the secret of his great power of communication, because he is always speaking about the Love of God: looking at God without needing rest or feeling tired.

"Together with a great simplicity, there runs through all these writings the constant counterpoint of a passionate, expansive love. The path to sanctity that St. Josemaria invites us to take is paved with a deep respect for freedom. The Founder of Opus Dei relished those words of St Augustine where the great Bishop of Hippo stresses that God 'judged that his servants would be better if they served him freely.'"
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
/***
|''Name:''|GTDPlugins|
|''Description:''|Plugin to support Getting Things Done|
|''Version:''|<<gtdVersion>>|
|''Date:''|October 27, 2008|
|''Source:''|http://www.dcubed.ca/|
|''Author:''|Tom Otvos|
|''CoreVersion:''|2.4|
|''Browser:''|Firefox 1.5+; InternetExplorer 6.0+; Safari 3.1+|
***/

/***
''Macros:''
*{{{<<gtdAction "}}}//title//{{{" "}}}//context list//{{{">>}}}
*{{{<<gtdActionList {"}}}//context list//{{{" | "*" | "@" {"all" | "noproject" | "projectonly"} }>>}}}
** //if no parameters are specified, current context or project is used//
** //specify "*" for actions across all projects, "@" for incomplete actions across all contexts (or "all" for all actions)//
** //use "projectonly" or "noproject" to filter actions by project association//
*{{{<<list tagged "}}}//tag list//{{{" {any | all}>>}}}
** //if no parameters are specified, all tags are necessary//
*{{{<<gtdActionCompleted>>}}}
*{{{<<gtdToggleTag>>}}}
*{{{<<gtdToggleState>>}}}
*{{{<<importUpdates "}}}//url//{{{" {updates | all} "}}}//buttonTitle//{{{" "}}}//buttonHelp//{{{" "}}}//loadTiddlers params...//{{{">>}}}
*{{{<<gtdArchive { archive | unarchive | purge }>>}}}

''Commands:''
*{{{newAction}}}
*{{{newProjectAction}}}
*{{{changeContext}}}
*{{{deleteAction}}}
*{{{deleteContext}}}
*{{{deleteProject}}}
*{{{deleteProjectAll}}}
*{{{projectify}}}

''Wiki formatting:''
*{{{..new action title|context}}}

***/
//{{{

version.extensions.GTDPlugins = {major: 1, minor: 3, revision: 0, patch: 0 };

var _GTD = {

	lazyAutoSave: 0,
	contextCache: null,
	usingProjectTags: true,
	projectPriorities: [],

	initialize: function ()
	{
		var d = new Date();

		if (config.options.txtGTDReferenceContext == undefined) config.options.txtGTDReferenceContext = "reference";
		if (config.options.txtGTDSomedayContext == undefined) config.options.txtGTDSomedayContext = "someday";
		if (config.options.txtGTDUnfiledContext == undefined) config.options.txtGTDUnfiledContext = "unfiled";
		if (config.options.txtGTDActionAging == undefined) config.options.txtGTDActionAging = "";
		if (config.options.chkGTDFancyStyle == undefined) config.options.chkGTDFancyStyle = true;
		if (config.options.chkGTDLazyAutoSave == undefined) config.options.chkGTDLazyAutoSave = true;
		if (config.options.txtGTDLazyAutoSaveInterval == undefined) config.options.txtGTDLazyAutoSaveInterval = "60";
		if (config.options.txtGTDProjectPriorities == undefined) config.options.txtGTDProjectPriorities = "";
		
		// some tricks to work when our script is loaded from an external file...
		if (!store) config.notifyTiddlers.push( {name: "GTDStyleSheet", notify: refreshStyles} );
		if (!store && config.options.chkGTDFancyStyle) config.notifyTiddlers.push( {name: "GTDTWStyleSheet", notify: refreshStyles} );
		if (!store) config.notifyTiddlers.push( {name: null, notify: _GTD.refreshActionViews} );
		
		this.setReviewUpdate();
		this.setLazyAutoSave();
		
		if (config.options.txtGTDProjectPriorities.length == 0)
			this.projectPriorities = [ "important" ];
		else
			this.projectPriorities = config.options.txtGTDProjectPriorities.split(';');
		
		if (!store) return;
		
		if ((version.major == 2 && version.minor < 1) || !store.tiddlerExists("d3 settings")) {
			// we force a changed() call on all projects, contexts, and actions, to enable them to set up their cross-references
			var tiddlers = [];
			tiddlers = tiddlers.concat(store.getTaggedTiddlers("project"), store.getTaggedTiddlers("context"), store.getTaggedTiddlers("action"));
			for (var i = 0; i < tiddlers.length; i++)
				tiddlers[i].changed();
			
			// if we have tiddler meta data, rebuild it
			if (version.major > 2 || version.minor > 0)
				this.rebuildMetaData();
		}
		else {
			this.initializeFromMetaData();
			this.usingProjectTags = false;
		}
		
		//store.addNotification("GTDStyleSheet", refreshStyles);
		//if (config.options.chkGTDFancyStyle) store.addNotification("GTDTWStyleSheet", refreshStyles);
		store.addNotification(null, _GTD.refreshActionViews);
		
		// force a display of release notes, if required
		var v = version.extensions.GTDPlugins;
		var releaseNotesTiddler = "About version " + v.major + '.' + v.minor + '.' + v.revision;
		if ((config.options.chkGTDReleaseNotes || config.options.chkGTDReleaseNotes == undefined) && store.tiddlerExists(releaseNotesTiddler)) {
			params = "open:\"" + releaseNotesTiddler + "\"";
			params = params.parseParams("open",null,false);
			config.options.chkGTDReleaseNotes = false;
			saveOptionCookie("chkGTDReleaseNotes");
		}

		if (version.major > 2 || version.minor > 0)
			pluginInfo.log.push('Initialized in ' + ((new Date()).getTime() - d.getTime()) + ' milliseconds');
	},
	
	rebuildMetaData: function()
	{
		pluginInfo.log.push('Rebuilding action metadata...');

		store.suspendNotifications();
		var tiddlers = store.getTaggedTiddlers("action");
		for (var i = 0; i < tiddlers.length; i++) {
			var t = tiddlers[i];
			store.setValue(t, "gtd");
			store.setValue(t, "gtd.context", t.gtdContextName);
			if (t.gtdProject) store.setValue(t, "gtd.project", t.gtdProject.title);
			if (t.gtdProject) store.setValue(t, "gtd.projectindex", t.gtdProject.gtdActions.indexOf(t));
			// booo...scary...strip out project tag
			if (t.gtdProject) t.tags.remove(t.gtdProject.title);
		}
		store.resumeNotifications();
			
		var tiddler = store.createTiddler("d3 conversion");
		var s = "Completed document conversion. Do not delete this tiddler unless you want to rebuild the action metadata.\n\nThis tiddler also contains document-specific preferences which, if deleted, will revert to default settings.";
		tiddler.assign("d3 settings", s, config.options.txtUserName, new Date(), ["excludeLists"]);
	},
	
	initializeFromMetaData: function()
	{
		var tiddlers = store.getTaggedTiddlers("action");
		// ??? one possible optimization is to sort action list by project, to avoid repeatedly fetching project tiddler
		for (var i = 0; i < tiddlers.length; i++) {
			var t = tiddlers[i];
			t.gtdActionName = store.getValue(t, "title");
			t.gtdActionDone = this.tiddlerHasTag(t, "done");
			t.gtdProjectName = store.getValue(t, "gtd.project");
			t.gtdContextName = store.getValue(t, "gtd.context");
			if (t.gtdProjectName) {
				t.gtdProject = store.getTiddler(t.gtdProjectName);
				if (t.gtdProject) {
					if (t.gtdProject.gtdActions == undefined) t.gtdProject.gtdActions = [];
					t.gtdProject.gtdActions.push(t);
				}
			}
		}
		
		tiddlers = store.getTaggedTiddlers("project");
		for (i = 0; i < tiddlers.length; i++) {
			t = tiddlers[i];
			if (t.gtdActions) {
				t.gtdActions.sort( 
					function(a,b) { var ai = parseInt(store.getValue(a, "gtd.projectindex")), bi = parseInt(store.getValue(b, "gtd.projectindex")); return (ai < bi) ? -1 : +1; }
				);
			}
			else
				t.gtdActions = [];
			this.setNextAction(t);
		}
		
		tiddlers = this.getCachedContexts();
		for (i = 0; i < tiddlers.length; i++)
			tiddlers[i].gtdContextName = tiddlers[i].title;
	},
	
	tiddlerHasTag: function (tiddler, tag)
	{
		if (typeof(tiddler) == "string") tiddler = store.getTiddler(tiddler);
		return tiddler.isTagged(tag);
	},
	
	tiddlerSwapTag: function (tiddler, oldTag, newTag)
	{
		for (var i = 0; i < tiddler.tags.length; i++)
			if (tiddler.tags[i] == oldTag) {
				tiddler.tags[i] = newTag;
				return true;
			}
		return false;
	},
	
	setExtendedValue: function (tiddler, name, value)
	{
		// this bottleneck safely sets an extended data value, quietly ignoring the request
		// if the setValue function is not available AND it disables notifications during
		// the setValue if it is defined
		
		if (version.major > 2 || version.minor > 0) {
			store.suspendNotifications();
			store.setValue(tiddler, name, value);
			store.resumeNotifications();
		}
	},
	
	tiddlerHasChanged: function (tiddler, doSave)
	{
		tiddler.changed();
		//story.setDirty(tiddler.title, true);
		store.setDirty(true);
		if (this.tiddlerHasTag(tiddler, 'context'))
			this.clearContextCache();
		if (doSave == undefined) doSave = true;
		if (doSave) tiddler.modified = new Date();
		if (config.options.chkAutoSave && doSave)
			saveChanges();
		else if (doSave)
			this.lazyAutoSave++;
	},
	
	tiddlerAgeInDays: function(tiddler)
	{
		var now = new Date();
		return (now.getTime() - tiddler.modified.getTime()) / 1000 / 86400;
	},
	
	filteredTags: function (tags, specialTags, filterTags)
	{
		var resultTags = [];
		specialTags = specialTags.concat(filterTags);
		for (var i = 0; i < tags.length; i++)
			if (!specialTags.contains(tags[i])) resultTags.push(tags[i]);
		return resultTags;
	},
	
	filteredActionTags: function (tags, filterTags)
	{
		return this.filteredTags(tags, [ "action", "done", "floating", "action-archive" ], filterTags);
	},
	
	filteredProjectTags: function (tags, filterTags)
	{
		return this.filteredTags(tags, [ "project", "done", "important", "project-archive" ], filterTags);
	},
	
	qualifiedProjectName: function(p)
	{
		var tags = this.filteredProjectTags(p.tags, []);
		var q = '';
		for (var i = 0; i < tags.length; i++)
			q += tags[i] + '.';
		return q + p.title;
	},
	
	toggleTag: function (tiddler, tag, toggle)
	{
		var tagIndex = -1;
		for (var i = 0; i < tiddler.tags.length; i++)
			if (tiddler.tags[i] == tag) {
				tagIndex = i;
				break;
			}
		
		if (toggle && tagIndex == -1) {
			tiddler.tags.push(tag);
		}
		else if (!toggle && tagIndex != -1) {
			tiddler.tags.splice(tagIndex, 1);
		}
	},
	
	getTiddlerElement: function (tiddler)
	{
		return document.getElementById(story.idPrefix + tiddler.title);
	},
	
	refreshActionViews: function (tiddler)
	{
		if (tiddler) {
			if (typeof(tiddler) == "string") tiddler = store.getTiddler(tiddler);
			if (tiddler) {
				// first refresh the action tiddler
				story.refreshTiddler(tiddler.title, null, true);
				// do not do anything else if we are not an action!
				// no, we still want to do review updates below, so only do the next bit for actions
				// if (!_GTD.tiddlerHasTag(tiddler, "action")) return;
				if (_GTD.tiddlerHasTag(tiddler, "action")) {
					// now refresh all tiddlers that are tags of the action, which should be the context and project
					// no...now use explicit reference to project/context
					//for (var i = 0; i < tiddler.tags.length; i++)
						// ...of course, we don't refresh action-specific state tags
					//	if (tiddler.tags[i] != "action" && tiddler.tags[i] != "done" && tiddler.tags[i] != "floating") {
					//		story.refreshTiddler(tiddler.tags[i], null, true);
					//	}
					if (tiddler.gtdProjectName && tiddler.gtdProjectName.length > 0) story.refreshTiddler(tiddler.gtdProjectName, null, true);
					// because an action change can affect multiple contexts (via next actions), the only way we can ensure that everything
					// gets updated is to refresh all the displayed contexts...hopefully, there won't be many open and DOM lookups fairly snappy
					// if (tiddler.gtdContextName && tiddler.gtdContextName.length > 0) story.refreshTiddler(tiddler.gtdContextName, null, true);
					_GTD.refreshAllContexts();
				}
				else if (_GTD.tiddlerHasTag(tiddler, "context"))
					_GTD.clearContextCache();
			}
		}
	
		var specialTiddlers = store.getTaggedTiddlers("review");
		for (var i = 0; i < specialTiddlers.length; i++)
			if (_GTD.tiddlerHasTag(specialTiddlers[i], "gtd")) {		// only update GTD review tiddlers, as an optimization
				// as a further optimization, we don't refresh tiddlers that aren't actually displayed, and make sure that
				// if they are displayed, they are in view mode, not edit mode
				var el = _GTD.getTiddlerElement(specialTiddlers[i]);
				if (el && el.getAttribute("template") == "reviewViewTemplate")
					story.refreshTiddler(specialTiddlers[i].title, null, true);
			}

	},
	
	appendProjectActionMarkup: function(projectTiddler, actionTitle, actionContext)
	{
		var actionInsertionPoint = -1, actionLeadin = "";
		
		var reActionWikitext = "^\\.{2}([^|\\n]+)(?:\\|?)(.*).*$";
		var reActionMacro = "(.*)<<gtdAction ((?:[^>]|(?:>(?!>)))*)>>.*$";
		var actionRe = new RegExp("(" + reActionWikitext + ")|(" + reActionMacro + ")", "mg");
		do {
			var formatMatch = actionRe.exec(projectTiddler.text);
			if (formatMatch) {
				actionLeadin = (formatMatch[1] ? "" : formatMatch[5]);
				actionInsertionPoint = actionRe.lastIndex;
			}
		} while(formatMatch);
		
		var actionProto = "\n" + actionLeadin + "<<gtdAction \"" + actionTitle + "\" \"" + actionContext + "\">>";
		if (actionInsertionPoint == -1)
			projectTiddler.text += actionProto;
		else
			projectTiddler.text = projectTiddler.text.substring(0, actionInsertionPoint) + actionProto + projectTiddler.text.substr(actionInsertionPoint);
		
		this.tiddlerHasChanged(projectTiddler);
		this.refreshActionViews(projectTiddler);
	},
	
	removeProjectAction: function(projectTiddler, actionTitle)
	{
		var reActionWikitext = "^(\\.{2})[ \\t]*(" + actionTitle + ")[ \\t]*((\\|.*\\n?)|(.*\\n?))";
		var reActionMacro = "(.*<<gtdAction [\"\']?)(" + actionTitle + ")([\"\']?\\s+(?:[^>]|(?:>(?!>)))*>>.*\\n?)";
		projectTiddler.text = projectTiddler.text.replace(new RegExp(reActionWikitext, "mg"), "");
		projectTiddler.text = projectTiddler.text.replace(new RegExp(reActionMacro, "mg"), "");
		projectTiddler.changed();
		story.refreshTiddler(projectTiddler.title, null, true);
	},
	
	setNextAction: function(project)
	{
		if (project.gtdActions == undefined) project.gtdActions = [];
		project.gtdNextAction = null;
		for (var i = 0; i < project.gtdActions.length; i++)
			if (!project.gtdActions[i].gtdActionDone) {
				project.gtdNextAction = project.gtdActions[i];
				project.gtdProjectDone = false;
				this.toggleTag(project, "done", project.gtdProjectDone);
				return;
			}
		// if we get here, project is currently complete
		if (project.gtdActions.length > 0) project.gtdProjectDone = true;
		this.toggleTag(project, "done", project.gtdProjectDone);
	},
	
	clearContextCache: function()
	{
		this.contextCache = null;
	},
	
	getCachedContexts: function()
	{
		if (!this.contextCache) this.contextCache = store.getTaggedTiddlers("context");
		return this.contextCache;
	},
	
	renameCachedContext: function(oldName, newName)
	{
		if (this.contextCache) {
			var index = this.contextCache.indexOf(oldName);
			if (index > -1) this.contextCache[index] = newName;
		}
	},
	
	findActionContext: function(action)
	{
		var context = null;
		
		var contexts = this.getCachedContexts();
		for (var i = 0; i < contexts.length; i++)
			if (_GTD.tiddlerHasTag(action, contexts[i].title)) {
				context = contexts[i].title;
				break;
			}
		
		return context;
	},
	
	refreshAllContexts: function()
	{
		var contexts = this.getCachedContexts();
		for (var i = 0; i < contexts.length; i++)
			story.refreshTiddler(contexts[i].title, null, true);
	},
	
	saveWithForcedBackup: function()
	{
		var saveBackups = config.options.chkSaveBackups;
		config.options.chkSaveBackups = true;
		saveChanges();
		config.options.chkSaveBackups = saveBackups;
	},
	
	isNextAction: function(actionTiddler)
	{
		if (actionTiddler.gtdProject && actionTiddler == actionTiddler.gtdProject.gtdNextAction)
			return true;
		return !actionTiddler.gtdActionDone && this.tiddlerHasTag(actionTiddler, "floating");
	},
	
	setReviewUpdate: function()
	{
		window._GTD = this;
		// having a subminute review update is overkill, but it would be nice to have semi-accurate
		// clock, so we can't have it be longer than a minute between updates
		//window.setTimeout('window._GTD.doReviewUpdate()', 60 * 1000);
		var d = new Date();
		window.setTimeout('window._GTD.doReviewUpdate()', (3600 - 60*d.getMinutes() - d.getSeconds()) * 1000);
	},
	
	doReviewUpdate: function()
	{
		this.refreshActionViews(null);
		this.setReviewUpdate();
	},
	
	setLazyAutoSave: function()
	{
		window._GTD = this;
		var interval = parseInt(config.options.txtGTDLazyAutoSaveInterval, 10);
		interval = isNaN(interval) ? 60 : interval.clamp(0, Number.MAX_VALUE);
		window.setTimeout('window._GTD.doLazyAutoSave()', interval * 1000);
	},
	
	doLazyAutoSave: function()
	{
		if (config.options.chkGTDLazyAutoSave && !config.options.chkAutoSave && (this.lazyAutoSave > 0 || store.isDirty())) {
			this.lazyAutoSave = 0;
			displayMessage('Autosaving changes...');
			saveChanges();
			if (typeof(gtdAutoSaveHook) == "function")
				gtdAutoSaveHook();
			window.setTimeout('clearMessage()', 5 * 1000);
		}
		this.setLazyAutoSave();
	},
	
	projectPriority: function(p)
	{
		var maxPriority = _GTD.projectPriorities.length;
		for (var i = 0; i < maxPriority; i++)
			if (_GTD.tiddlerHasTag(p, _GTD.projectPriorities[i])) return (maxPriority - i);
		return 0;
	},
	
	actionSorter: function(a,b)
	{
		// we now have an extended sort function to try and provide a more useful list of actions, esp. in a context view
		// ... the rule now is that project actions appear before non-project actions
		// ... if two actions have projects, and either project is tagged "important", it will appear first, otherwise actions are alphabetical by project
		// ... if two actions are from the same project, they appear in project action sequence, not alphabetically
		// ... all non-project actions continue to be sorted alphabetically
		
		if (a.gtdProject && b.gtdProject) {
			var aImportance = _GTD.projectPriority(a.gtdProject), bImportance = _GTD.projectPriority(b.gtdProject);
			if (a.gtdProject == b.gtdProject)
				return (a.gtdProject.gtdActions.indexOf(a) < b.gtdProject.gtdActions.indexOf(b)) ? -1 : +1;
			else if (aImportance != bImportance)
				return (aImportance > bImportance) ? -1 : +1;
			else
				return (a.gtdProject.title < b.gtdProject.title) ? -1 : +1;
		}
		else if (a.gtdProject)
			return -1;	// "a" has a project, "b" doesn't, so "a" comes first
		else if (b.gtdProject)
			return +1;	// "b" has a project, "a" doesn't, so "b" comes first
		else {
			var aImportance = _GTD.tiddlerHasTag(a, "important"), bImportance = _GTD.tiddlerHasTag(b, "important");
			if (aImportance && !bImportance)
				return -1;	// "a" is important, "b" is not, so "a" comes first
			else if (bImportance && !aImportance)
				return +1;	// "b" is important, "a" is not, so "a" comes first
			else
				return (a.title < b.title) ? -1 : +1;
		}
	},
	
	projectSorter: function(a,b) 
	{
		
		var aImportance = _GTD.projectPriority(a), bImportance = _GTD.projectPriority(b);
		if (aImportance != bImportance)
			return (aImportance > bImportance) ? -1 : +1;
		else
			return (a.title < b.title) ? -1 : +1;
	}
};

config.macros.gtdVersion = {}
config.macros.gtdVersion.handler = function(place)
{
	var v = version.extensions.GTDPlugins;
	createTiddlyElement(place, "span", null, null, v.major + "." + v.minor + "." + v.revision + (v.patch ? "." + v.patch : "") + (v.beta ? " (beta " + v.beta + ")" : ""));
}

config.macros.list.tagged = {}
config.macros.list.tagged.innerHandler = function(tagList, allTags)
{
	var tiddlers = store.getTaggedTiddlers(tagList[0]);

	if (allTags) {
		var results = [];
		for (var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i], hasAllTags = true;
			for (var j = 1; hasAllTags && j < tagList.length; j++) {
				// hasAllTags &= _GTD.tiddlerHasTag(tiddler, tagList[j]);
				hasAllTags &= (tagList[j].charAt(0) == '-') ? !_GTD.tiddlerHasTag(tiddler, tagList[j].substr(1)) : _GTD.tiddlerHasTag(tiddler, tagList[j])
			}
			if (hasAllTags) results.push(tiddlers[i]);
		}
		return results;
	}
	else {
		for (var i = 1; i < tagList.length; i++) {
			var more = store.getTaggedTiddlers(tagList[i]);
			for (var j = 0; j < more.length; j++)
				tiddlers.pushUnique(more[j]);
		}
		return tiddlers;
	}
}
config.macros.list.tagged.handler = function(params) 
{
	var tags = params[1].readBracketedList();
	if (tags.length == 1) {
		if (config.options[tags[0]] == undefined)
			return store.getTaggedTiddlers(tags[0]);
		else
			return store.getTaggedTiddlers(config.options[tags[0]]);
	}
	else if (tags.length > 1) {
		var allTags = (params[2] == undefined || params[2] == 'all');
		var tiddlers = this.innerHandler(tags, allTags);
		tiddlers.sort(function (a,b) {if(a.title == b.title) return(0); else return (a.title < b.title) ? -1 : +1; });
		return tiddlers;
	}
}

config.macros.gtdActionList = {}
config.macros.gtdActionList.handler = function(place,macroName,params)
{
	var theList = createTiddlyElement(place, "ul", null, "gtdActionList");
	var parentTiddlerName = story.findContainingTiddler(place).getAttribute("tiddler");
	
	var allActions = (params[1] == "all");
	var noProjectActions = (params[1] == "noproject");
	var justProjectActions = (params[1] == "projectonly");
	var aging = parseInt(config.options.txtGTDActionAging, 10);
	aging = isNaN(aging) ? 0 : aging.clamp(0, Number.MAX_VALUE);
	
	if (params[0] == "*") {		// review actions for all projects
		var projects = store.getTaggedTiddlers("project");
		// do an importance sort on project list first, so they bubble to the top
		projects.sort(_GTD.projectSorter);
		for (var i = 0; i < projects.length; i++) {
			var project = projects[i];
			// filter projects that have been deferred
			if (_GTD.tiddlerHasTag(project, config.options.txtGTDSomedayContext)) continue;
			if (!allActions) {
				//var skipEmptyProject = true;
				//if (project.gtdActions != undefined && project.gtdActions.length > 0)
				//	for (var k = 0; skipEmptyProject && k < project.gtdActions.length; k++)
				//		skipEmptyProject = project.gtdActions[k].gtdActionDone;
				//if (skipEmptyProject) continue;
				if (project.gtdActions == undefined || project.gtdActions.length == 0 || project.gtdProjectDone) continue;
			}
			// this will present the actions in the same order as they appear in the project
			var theListItem = createTiddlyElement(theList, "li", null, "gtdActionListProject");
			createTiddlyLink(theListItem, project.title, true);
			if (project.gtdActions != undefined && project.gtdActions.length > 0) {
				var subList = createTiddlyElement(theList, "ul", null, "gtdActionList");
				for (var j = 0; j < project.gtdActions.length; j++) {
					var action = project.gtdActions[j];
					// if we are not displaying all actions, filter old completed actions (if specified)
					// if (!allActions && action.gtdActionDone && aging > 0 && _GTD.tiddlerAgeInDays(action) > aging) continue;
					// NEW! we are now filtering all completed actions unless we are displaying all actions
					if (!allActions && action.gtdActionDone) continue;
					var subListItem = createTiddlyElement(subList, "li");
					var el = config.macros.gtdAction.createActionElement(subListItem, action, project.title, action.tags);
				}
			}
		}
	}
	
	else if (params[0] == "@") {	// review actions for all contexts
		var contexts = _GTD.getCachedContexts();
		for (var i = 0; i < contexts.length; i++) {
			var context = contexts[i];
			var actions = config.macros.list.tagged.innerHandler([context.title, "action"], true);
			if (actions.length > 0) {
				var firstAction = true, theListItem, subList;
				actions.sort(_GTD.actionSorter);
				for (var j = 0; j < actions.length; j++) {
					var currentAction = actions[j];
					// special filtering by request...
					if (noProjectActions && currentAction.gtdProject) continue;
					if (justProjectActions && typeof(currentAction.gtdProject) == 'undefined') continue;
					// if we are not displaying all actions, filter completed actions and non-next project actions
					if (!allActions && (currentAction.gtdActionDone || (currentAction.gtdProject && !_GTD.isNextAction(currentAction)))) continue;
					// filter actions for projects that have been deferred
					if (currentAction.gtdProject && _GTD.tiddlerHasTag(currentAction.gtdProject, config.options.txtGTDSomedayContext)) continue;
					if (firstAction) {
						theListItem = createTiddlyElement(theList, "li", null, "gtdActionListContext");
						createTiddlyLink(theListItem, context.title, true);
						subList = createTiddlyElement(theList, "ul", null, "gtdActionList");
						firstAction = false;
					}
					var subListItem = createTiddlyElement(subList, "li");
					var el = config.macros.gtdAction.createActionElement(subListItem, currentAction, context.title, currentAction.tags);
				}
			}
		}
	}
	
	else {		// actions tagged by current tiddler name, or specified tag list as parameter
		var reviewMode = config.options['chkGTDActionListReviewMode' + escape(parentTiddlerName)];
		if (typeof(reviewMode) == 'undefined') reviewMode = false;
		
		// chain to our "tagged" list macro to get the tiddlers first
		var tags = (params.length == 0 || params[0] == "." ? [ parentTiddlerName ] : params[0].readBracketedList());
		tags.push("action");
		var results = config.macros.list.tagged.innerHandler(tags, true);
		results.sort(_GTD.actionSorter);
		for (var t = 0; t < results.length; t++) {
			var action = results[t];
			// special filtering by request...
			if (noProjectActions && action.gtdProject) continue;
			if (justProjectActions && typeof(action.gtdProject) == 'undefined') continue;
			if (action.gtdProject && _GTD.tiddlerHasTag(action.gtdProject, config.options.txtGTDSomedayContext)) continue;
			// if we are not displaying all actions, filter completed actions and non-next project actions
			if (reviewMode && !allActions && (action.gtdActionDone || (action.gtdProject && !_GTD.isNextAction(action)))) continue;
			// if we are not displaying all actions, filter old completed actions (if specified)
			if (!allActions && action.gtdActionDone && aging > 0 && _GTD.tiddlerAgeInDays(action) > aging) continue;
			var theListItem = createTiddlyElement(theList, "li");
			var el = config.macros.gtdAction.createActionElement(theListItem, action, parentTiddlerName, action.tags);
		}
	}
}

config.macros.gtdAction = {}
config.macros.gtdAction.createActionElement = function(place, actionTiddler, filterName, tags)
{
	if (typeof(actionTiddler) == "string") actionTiddler = store.getTiddler(actionTiddler);
	
	var actionElement = createTiddlyElement(place, "span", null, "gtdActionItem");
	
	// oddly, we barf when setting the checkbox type on an input if we use createTiddlyElement...
	var cb = document.createElement("input");
	cb.setAttribute("type", "checkbox");
	cb.setAttribute("actionTiddler", actionTiddler.title);
	cb.onclick = this.onClickDone;
	actionElement.appendChild(cb);
	cb.checked = actionTiddler.gtdActionDone;
	createTiddlyLink(actionElement, actionTiddler.title, true);
	actionElement.className = (actionTiddler.text ? "gtdActionWithContent" : "gtdActionWithoutContent");
	if (actionTiddler.gtdActionDone) actionElement.className += " gtdCompletedActionItem";
	if (_GTD.isNextAction(actionTiddler)) actionElement.className += " gtdNextActionItem";
	
	var filterTags = [], actionTags = [];
	if (actionTiddler.gtdProjectName && actionTiddler.gtdProjectName.length > 0)
		actionTags.push(actionTiddler.gtdProjectName);
	if (actionTiddler.gtdContextName && actionTiddler.gtdContextName.length > 0)
		actionTags.push(actionTiddler.gtdContextName);
	for (var i = 0; i < tags.length; i++) actionTags.pushUnique(tags[i]);
	if (filterName && filterName.length > 0) filterTags.pushUnique(filterName);
	
	actionTags = _GTD.filteredActionTags(actionTags, filterTags);
	if (actionTags.length > 0) {
		createTiddlyText(actionElement, " [ ");
		for (var i = 0; i < actionTags.length; i++) {
			if (i > 0) createTiddlyText(actionElement, ", ");
			createTiddlyLink(actionElement, actionTags[i], true, "actionCrossReference");
		}
		createTiddlyText(actionElement, " ]");
	}
	
	return actionElement;
}

config.macros.gtdAction.onClickDone = function(e)
{
	var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));
	if (tiddler) {
		_GTD.toggleTag(tiddler, "done", this.checked);
		tiddler.gtdActionDone = this.checked;
		_GTD.tiddlerHasChanged(tiddler);
		_GTD.refreshActionViews(tiddler);
		if (this.checked && typeof(gtdActionDoneHook) == "function")
			gtdActionDoneHook(tiddler);
		if (tiddler.gtdActionDone && tiddler.gtdProject == undefined && confirm("This action is not a part of a project. Would you just like to delete it?")) {
			story.closeTiddler(tiddler.title, false, false);
			store.removeTiddler(tiddler.title);
		}
	}
	return true;
}

config.macros.gtdAction.handler = function(place,macroName,params)
{
	var title = params[0], tags;
	var parentTiddlerName = story.findContainingTiddler(place).getAttribute("tiddler");
	var tiddler = store.getTiddler(title);
	if (!tiddler) {
		// we should *never* get here now for project actions, but keep code in case project code
		// trips up, or we use this macro somewhere else
		this.createAction(title, parentTiddlerName, params[1]);
	}
	else
		// use actual tiddler tags, not macro param, in case context changed!
		tags = tiddler.tags;
	var action = this.createActionElement(place, title, parentTiddlerName, tags);
}

config.macros.gtdAction.createAction = function(title, projectTiddlerName, tagParams, extraTags)
{
	// var tags = ["action", parentTiddler];
	var action, tags = ["action"], fields = {};
	if (_GTD.usingProjectTags)
		tags.push(projectTiddlerName);
	if (typeof(tagParams) == "string") tags = tags.concat(tagParams.readBracketedList());
	if (typeof(extraTags) == "string") tags = tags.concat(extraTags.readBracketedList());
	var templateText = store.getTiddlerText("NewActionTemplate", config.views.wikified.defaultText.format([title]));
	if (_GTD.usingProjectTags)
		action = store.saveTiddler(title, title, templateText, config.options.txtUserName, new Date(), tags);
	else {
		fields["gtd.project"] = projectTiddlerName;
		action = store.saveTiddler(title, title, templateText, config.options.txtUserName, new Date(), tags, fields);
	}
	return action;
}

config.macros.gtdActionCompleted = {}
config.macros.gtdActionCompleted.handler = function(place,macroName,params)
{
	if (!readOnly) {
		var title = story.findContainingTiddler(place).getAttribute("tiddler");
		var tiddler = store.getTiddler(title);
		// oddly, we barf when setting the checkbox type on an input if we use createTiddlyElement...
		var cb = document.createElement("input");
		cb.setAttribute("type", "checkbox");
		cb.setAttribute("actionTiddler", title);
		cb.onclick = this.onClickDone;
		place.appendChild(cb);
		cb.checked = tiddler.gtdActionDone;
	}
}

config.macros.gtdActionCompleted.onClickDone = function(e)
{
	var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));
	if (tiddler) {
		_GTD.toggleTag(tiddler, "done", this.checked);
		tiddler.gtdActionDone = this.checked;
		_GTD.tiddlerHasChanged(tiddler);
		_GTD.refreshActionViews(tiddler);
		if (this.checked && typeof(gtdActionDoneHook) == "function")
			gtdActionDoneHook(tiddler);
		if (tiddler.gtdActionDone && tiddler.gtdProject == undefined && confirm("This action is not a part of a project. Would you just like to delete it?")) {
			story.closeTiddler(tiddler.title, false, false);
			store.removeTiddler(tiddler.title);
		}
	}
	return true;
}

config.macros.gtdToggleTag = {}
config.macros.gtdToggleTag.handler = function(place,macroName,params)
{
	if (!readOnly) {
		var title = story.findContainingTiddler(place).getAttribute("tiddler");
		var tiddler = store.getTiddler(title);
		// oddly, we barf when setting the checkbox type on an input if we use createTiddlyElement...
		var cb = document.createElement("input");
		cb.setAttribute("type", "checkbox");
		cb.setAttribute("tiddler", title);
		cb.setAttribute("toggledTag", params[0]);
		cb.onclick = this.onClickDone;
		place.appendChild(cb);
		cb.checked = _GTD.tiddlerHasTag(tiddler, params[0]);
	}
}

config.macros.gtdToggleTag.onClickDone = function(e)
{
	var tiddler = store.getTiddler(this.getAttribute("tiddler"));
	if (tiddler) {
		_GTD.toggleTag(tiddler, this.getAttribute("toggledTag"), this.checked);
		_GTD.tiddlerHasChanged(tiddler);
		if (_GTD.tiddlerHasTag(tiddler, "action"))
			_GTD.refreshActionViews(tiddler);
		else
			// we need a broad notification here, not just refreshActionViews
			store.notify(tiddler.title, true);
	}
	return true;
}

config.macros.gtdToggleState = {}
config.macros.gtdToggleState.handler = function(place,macroName,params)
{
	var title = story.findContainingTiddler(place).getAttribute("tiddler");
	var tiddler = store.getTiddler(title);
	// oddly, we barf when setting the checkbox type on an input if we use createTiddlyElement...
	var cb = document.createElement("input");
	cb.setAttribute("type", "checkbox");
	cb.setAttribute("tiddler", title);
	var state = params[0] + escape(title);
	cb.setAttribute("stateName", state);
	cb.onclick = this.onClickDone;
	place.appendChild(cb);
	cb.checked = config.options[state];
}

config.macros.gtdToggleState.onClickDone = function(e)
{
	var tiddler = store.getTiddler(this.getAttribute("tiddler"));
	if (tiddler) {
		var state = this.getAttribute("stateName");
		config.options[state] = this.checked;
		saveOptionCookie(state);
		story.refreshTiddler(tiddler.title, null, true);
	}
	return true;
}

config.macros.importUpdates = { 
	importMode: "updates",
	buttonTitle: "Update", 
	buttonHelp: "Click here to update the application",
	missingHelperMessage: "This functionality depends on the LoadTiddlersPlugin, which is missing. Please import the plugin from TiddlyTools.",
	preUpdateMessage: "Once the download is finished, you will need to reload your document to complete the update. In order to allow you to review the update tiddlers, this will not be done automatically. \n\nClick \"OK\" start the update.",
	postUpdateMessage: "Please remember, you will need to save and reload your document to complete the update. In order to allow you to review the update tiddlers, this will not be done automatically."
}
config.macros.importUpdates.handler = function(place, macroName, params)
{
	var mode = params[1] ? params[1] : this.importMode;
	var title = params[2] ? params[2] : this.buttonTitle;
	var prompt = params[3] ? params[3] : this.buttonHelp;
	var button = createTiddlyButton(place, title, prompt, this.onClickUpdate);
	button.setAttribute("updateSource", params[0]);
	button.setAttribute("importMode", mode);
	if (params.length > 4) button.setAttribute("importExtras", params.slice(4).join(" "));
}

config.macros.importUpdates.onClickUpdate = function(e)
{
	if (config.macros.loadTiddlers == undefined || version.extensions.LoadTiddlersPlugin == undefined) {
		alert(config.macros.importUpdates.missingHelperMessage);
		return;
	}
	if (!confirm(config.macros.importUpdates.preUpdateMessage))
		return;
	var importParams = [ this.getAttribute("importMode"), this.getAttribute("updateSource") ];
	var importExtras = this.getAttribute("importExtras");
	if (importExtras) importParams = importParams.concat(importExtras.split(" "));
	// force a saveChanges with backup before the update
	_GTD.saveWithForcedBackup();
	// chain to the loadTiddlers macro
	config.macros.loadTiddlers.handler(this, "loadTiddlers", importParams);
	// ensure that relevant release notes are displayed on first launch
	config.options.chkGTDReleaseNotes = true;
	saveOptionCookie("chkGTDReleaseNotes");
	// do *not* cause a browser navigation
	return false;
}

config.macros.gtdArchive = {}
config.macros.gtdArchive.handler = function(place, macroName, params)
{
	var archiveAction = params.length > 0 ? params[0] : "archive"
	var btn = createTiddlyButton(place, archiveAction, "", this.onClick);
	btn.setAttribute("archiveAction", archiveAction);
}

config.macros.gtdArchive.onClick = function(e)
{
	var warning = "Are you sure you want to %0 all %1 projects and actions?";
	var status = "There were %0 project(s) and %1 action(s) %2d.";
	var archiveAction = this.getAttribute("archiveAction");
	
	var projectCount = 0, actionCount = 0;
	
	if (archiveAction == "archive") {
		if (confirm(warning.format([archiveAction, "completed"]))) {
			clearMessage();
			var projects = store.getTaggedTiddlers("project");
			for (var i = 0; i < projects.length; i++) {
				var project = projects[i];
				if (project.gtdActions == undefined || project.gtdActions.length == 0) continue;
				var projectComplete = true;
				for (var j = 0; projectComplete && j < project.gtdActions.length; j++)
					projectComplete = project.gtdActions[j].gtdActionDone;
				if (!projectComplete) continue;
				// if we get here, all project actions are done, so archive project
				story.closeTiddler(project.title, false, false);
				_GTD.tiddlerSwapTag(project, "project", "project-archive");
				_GTD.tiddlerHasChanged(project, false);
				projectCount++;
				for (j = 0; j < project.gtdActions.length; j++) {
					story.closeTiddler(project.gtdActions[j].title, false, false);
					_GTD.tiddlerSwapTag(project.gtdActions[j], "action", "action-archive");
					_GTD.tiddlerHasChanged(project.gtdActions[j], false);
					actionCount++;
				}
			}
			var actions = store.getTaggedTiddlers("action");
			for (i = 0; i < actions.length; i++) {
				var action = actions[i];
				if (action.gtdActionDone && !action.gtdProject) {
					story.closeTiddler(action.title, false, false);
					_GTD.tiddlerSwapTag(action, "action", "action-archive");
					_GTD.tiddlerHasChanged(action, false);
					actionCount++;
				}
			}
			displayMessage(status.format([projectCount, actionCount, archiveAction]));
			var saveClearMessage = clearMessage;
			clearMessage = function() {};
			if (config.options.chkAutoSave) saveChanges();
			clearMessage = saveClearMessage;
			store.notify(null, true);
		}
	}
	
	else if (archiveAction == "unarchive") {
		if (confirm(warning.format([archiveAction, "archived"]))) {
			clearMessage();
			var projects = store.getTaggedTiddlers("project-archive");
			for (var i = 0; i < projects.length; i++) {
				var project = projects[i];
				story.closeTiddler(project.title, false, false);
				_GTD.tiddlerSwapTag(project, "project-archive", "project");
				_GTD.tiddlerHasChanged(project, false);
				projectCount++;
			}
			var actions = store.getTaggedTiddlers("action-archive");
			for (i = 0; i < actions.length; i++) {
				var action = actions[i];
				story.closeTiddler(action.title, false, false);
				_GTD.tiddlerSwapTag(action, "action-archive", "action");
				_GTD.tiddlerHasChanged(action, false);
				actionCount++;
			}
			displayMessage(status.format([projectCount, actionCount, archiveAction]));
			var saveClearMessage = clearMessage;
			clearMessage = function() {};
			if (config.options.chkAutoSave) saveChanges();
			clearMessage = saveClearMessage;
			store.notify(null, true);
		}
	}
	
	else if (archiveAction == "purge") {
		if (confirm(warning.format([archiveAction, "archived"]))) {
			clearMessage();
			_GTD.saveWithForcedBackup();
			var projects = store.getTaggedTiddlers("project-archive");
			for (var i = 0; i < projects.length; i++) {
				var project = projects[i];
				story.closeTiddler(project.title, false, false);
				store.removeTiddler(project.title);
				projectCount++;
			}
			var actions = store.getTaggedTiddlers("action-archive");
			for (i = 0; i < actions.length; i++) {
				var action = actions[i];
				story.closeTiddler(action.title, false, false);
				store.removeTiddler(action.title);
				actionCount++;
			}
			displayMessage(status.format([projectCount, actionCount, archiveAction]));
			var saveClearMessage = clearMessage;
			clearMessage = function() {};
			if (config.options.chkAutoSave) saveChanges();
			clearMessage = saveClearMessage;
			store.notify(null, true);
		}
	}
	else
		alert("That archiving action is not supported");
}

config.formatters.push(
	{
	name: "gtdAction",
	match: "^\\.{2}.*",
	lookahead: "^\\.{2}([^|]*)(?:\\|?)(.*)",
	handler: function(w)
		{
			var lookaheadRegExp = new RegExp(this.lookahead,"g");
			var lookaheadMatch = lookaheadRegExp.exec(w.matchText)
			if (lookaheadMatch) {
				var params = [ lookaheadMatch[1].trim() ];
				if (lookaheadMatch[2].trim().length > 0) params.push(lookaheadMatch[2].trim());
				config.macros.gtdAction.handler(w.output, "gtdAction", params);
			}
		}
	}
);

config.commands.newAction = { text: "action", tooltip: "Create a new action for this context", hideReadOnly: true };
config.commands.newAction.handler = function(event, src, context)
{
	var d = new Date();
	var newActionTitle = d.formatString("New Action hh:0mm:0ss");
	if (!store.tiddlerExists(newActionTitle)) {
		var tiddler = store.createTiddler(newActionTitle);
		var templateText = store.getTiddlerText("NewActionTemplate", config.views.wikified.defaultText.format([newActionTitle]));
		tiddler.assign(newActionTitle, templateText, config.options.txtUserName, new Date(), [ "action", context ]);
		
		story.displayTiddler(null, newActionTitle, DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(newActionTitle, "title");
	}
	return false;
}

config.commands.newProjectAction = { text: "action", tooltip: "Create a new action for this project", hideReadOnly: true };
config.commands.newProjectAction.handler = function(event, src, project)
{
	var d = new Date();
	var newActionTitle = d.formatString("New Action hh:0mm:0ss");
	if (!store.tiddlerExists(newActionTitle)) {
		var defaultContext = config.options.txtGTDUnfiledContext;
		_GTD.appendProjectActionMarkup(store.getTiddler(project), newActionTitle, defaultContext);
		
		var tiddler = store.createTiddler(newActionTitle);
		var templateText = store.getTiddlerText("NewActionTemplate", config.views.wikified.defaultText.format([newActionTitle]));
		var tags = ["action"], fields = {};
		if (_GTD.usingProjectTags)
			tags.push(project);
		tags.push(defaultContext);
		if (_GTD.usingProjectTags)
			tiddler.assign(newActionTitle, templateText, config.options.txtUserName, new Date(), tags);
		else {
			fields["gtd.project"] = project;
			tiddler.assign(newActionTitle, templateText, config.options.txtUserName, new Date(), tags, new Date(), fields);
		}
		
		story.displayTiddler(null, newActionTitle, DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(newActionTitle, "title");
	}
	return false;
}

config.commands.changeContext = { text: "context", tooltip: "Change context of this action", hideReadOnly: true, popupNone: "There are no contexts" };
config.commands.changeContext.handler = function(event,src,title)
{
	var popup = Popup.create(src);
	if (popup) {
		var contexts = _GTD.getCachedContexts();
		var tiddler = store.getTiddler(title);
		var currentContext = _GTD.findActionContext(tiddler);
		if (!currentContext) currentContext = '';
		
		var c = false;
		for (var i = 0; i < contexts.length; i++)
			if (contexts[i].title != currentContext) {
				var button = createTiddlyButton(createTiddlyElement(popup, "li"), contexts[i].title, '', this.onClickContext);
				button.setAttribute("actionTiddler", title);
				button.setAttribute("oldContext", currentContext);
				button.setAttribute("newContext", contexts[i].title);
				c = true;
			}
			
		if (!c)
			createTiddlyText(createTiddlyElement(popup, "li", null, "disabled"), this.popupNone);
	}
	
	Popup.show(popup, false);
	event.cancelBubble = true;
	if (event.stopPropagation) event.stopPropagation();
	// do *not* cause a browser navigation
	return false;
}

config.commands.changeContext.onClickContext = function(e)
{
	var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));
	if (tiddler) {
		var contextChanged = false;
		var oldContext = this.getAttribute("oldContext");
		var newContext = this.getAttribute("newContext");
		if (oldContext.length == 0)
			contextChanged = (tiddler.tags.push(newContext) > 0);
		else
			contextChanged = _GTD.tiddlerSwapTag(tiddler, oldContext, newContext);
		
		if (contextChanged) {
			tiddler.gtdContextName = newContext;
			_GTD.setExtendedValue(tiddler, "gtd.context", newContext);
			_GTD.tiddlerHasChanged(tiddler);
			_GTD.refreshActionViews(tiddler);
			// be sure to refresh old context as well...
			story.refreshTiddler(oldContext, null, true);
		}
	}
	// do *not* cause a browser navigation
	return false;
}

config.commands.changeProject = { text: "project", tooltip: "Change project of this action", hideReadOnly: true, popupNone: "There are no projects" };
config.commands.changeProject.handler = function(event,src,title)
{
	var popup = Popup.create(src);
	if (popup) {
		var projects = store.getTaggedTiddlers("project");
		var tiddler = store.getTiddler(title);
		var currentProject = (tiddler.gtdProject ? tiddler.gtdProject.title : '');
		
		var c = false;
		for (var i = 0; i < projects.length; i++)
			if (projects[i].title != currentProject) {
				var button = createTiddlyButton(createTiddlyElement(popup, "li"), projects[i].title, '', this.onClickProject);
				button.setAttribute("actionTiddler", title);
				button.setAttribute("oldProject", currentProject);
				button.setAttribute("newProject", projects[i].title);
				c = true;
			}
			
		if (!c)
			createTiddlyText(createTiddlyElement(popup, "li", null, "disabled"), this.popupNone);
	}
	
	Popup.show(popup, false);
	event.cancelBubble = true;
	if (event.stopPropagation) event.stopPropagation();
	// do *not* cause a browser navigation
	return false;
}

config.commands.changeProject.onClickProject = function(e)
{
	var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));
	if (tiddler) {
		var oldProject = this.getAttribute("oldProject");
		var newProject = this.getAttribute("newProject");
		
		if (oldProject.length > 0)
			_GTD.removeProjectAction(tiddler.gtdProject, tiddler.title)
		if (_GTD.usingProjectTags)
			_GTD.tiddlerSwapTag(tiddler, oldProject, newProject);
		else
			_GTD.setExtendedValue(tiddler, "gtd.project", newProject);
		_GTD.appendProjectActionMarkup(store.getTiddler(newProject), tiddler.title, tiddler.gtdContextName);
		
		_GTD.tiddlerHasChanged(tiddler);
		_GTD.refreshActionViews(tiddler);
	}
	// do *not* cause a browser navigation
	return false;
}

config.commands.deleteAction = { text: "delete", tooltip: "Delete this action", hideReadOnly: true, warning: "Are you sure you want to delete '%0'?", altwarning: "Are you sure you want to delete '%0'? The action will also be removed from project '%1'." };
config.commands.deleteAction.handler = function(event, src, title)
{
	var tiddler = store.getTiddler(title);
	var ok = (tiddler.gtdProject ? confirm(this.altwarning.format([title, tiddler.gtdProject.title])) : confirm(this.warning.format([title])));
	if (ok) {
		if (tiddler.gtdProject) _GTD.removeProjectAction(tiddler.gtdProject, title);
		store.removeTiddler(title);
		story.closeTiddler(title,true,event.shiftKey || event.altKey);
		if (config.options.chkAutoSave)
			saveChanges();
	}
	
	return false;
}

config.commands.deleteContext = { text: "delete", tooltip: "Delete this context", hideReadOnly: true, warning: "Are you sure you want to delete '%0'? All associated actions will be tagged as 'unfiled'." };
config.commands.deleteContext.handler = function(event, src, title)
{
	if (confirm(this.warning.format([title]))) {
		store.suspendNotifications();
		this.unlinkActions(title);
		// force a rebuild of our context cache
		_GTD.clearContextCache();
		store.resumeNotifications();
		store.removeTiddler(title);
		story.closeTiddler(title,true,event.shiftKey || event.altKey);
		if (config.options.chkAutoSave)
			saveChanges();
	}
	
	return false;
}

config.commands.deleteContext.unlinkActions = function(contextTitle)
{
	var tiddlers = config.macros.list.tagged.innerHandler([contextTitle, "action"], true);
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		_GTD.tiddlerSwapTag(tiddler, contextTitle, config.options.txtGTDUnfiledContext);
		_GTD.tiddlerHasChanged(tiddler, false);
		// context removal will do view notification...
	}
}

config.commands.archiveProject = { text: "archive", tooltip: "Archive this project", hideReadOnly: true, warning: "Are you sure you want to archive '%0'?", noarchive: "This project is %0 and will not be archived." };
config.commands.archiveProject.handler = function(event, src, title)
{
	if (confirm(this.warning.format([title]))) {
		var project = store.getTiddler(title);
		if (project.gtdActions == undefined || project.gtdActions.length == 0) {
			alert(this.noarchive.format(["empty"]));
			return;
		}
		var projectComplete = true;
		for (var j = 0; projectComplete && j < project.gtdActions.length; j++)
			projectComplete = project.gtdActions[j].gtdActionDone;
		if (!projectComplete) {
			alert(this.noarchive.format(["incomplete"]));
			return;
		}
		// if we get here, all project actions are done, so archive project
		story.closeTiddler(project.title, false, false);
		_GTD.tiddlerSwapTag(project, "project", "project-archive");
		_GTD.tiddlerHasChanged(project, false);
		for (j = 0; j < project.gtdActions.length; j++) {
			story.closeTiddler(project.gtdActions[j].title, false, false);
			_GTD.tiddlerSwapTag(project.gtdActions[j], "action", "action-archive");
			_GTD.tiddlerHasChanged(project.gtdActions[j], false);
		}
		store.notify(null, true);
		if (config.options.chkAutoSave)
			saveChanges();
	}

	return false;
}

config.commands.deleteProject = { text: "delete", tooltip: "Delete this project", hideReadOnly: true, warning: "Are you sure you want to delete '%0'? All associated actions will no longer be bound to this (or any) project." };
config.commands.deleteProject.handler = function(event, src, title)
{
	if (confirm(this.warning.format([title]))) {
		store.suspendNotifications();
		this.unlinkActions(title);
		store.resumeNotifications();
		store.removeTiddler(title);
		story.closeTiddler(title,true,event.shiftKey || event.altKey);
		if (config.options.chkAutoSave)
			saveChanges();
	}
	
	return false;
}

config.commands.deleteProject.unlinkActions = function(projectTitle)
{
	// var tiddlers = config.macros.list.tagged.innerHandler([projectTitle, "action"], true);
	var project = store.getTiddler(projectTitle);
	for (var i = 0; i < project.gtdActions.length; i++) {
		var tiddler = project.gtdActions[i];
		tiddler.gtdProject = null;
		tiddler.gtdProjectName = null;
		if (_GTD.usingProjectTags)
			tiddler.tags.splice(tiddler.tags.indexOf(projectTitle), 1);
		else {
			_GTD.setExtendedValue(tiddler, "gtd.project", null);
			_GTD.setExtendedValue(tiddler, "gtd.projectindex", null);
		}
		_GTD.tiddlerHasChanged(tiddler, false);
		// project removal will do view notification...
	}
}

config.commands.deleteProjectAll = { text: "delete all", tooltip: "Delete this project and its actions", hideReadOnly: true, warning: "Are you sure you want to delete '%0' and all its associated actions?" };
config.commands.deleteProjectAll.handler = function(event, src, title)
{
	if (confirm(this.warning.format([title]))) {
		store.suspendNotifications();
		this.deleteActions(title);
		store.resumeNotifications();
		store.removeTiddler(title);
		story.closeTiddler(title,true,event.shiftKey || event.altKey);
		if (config.options.chkAutoSave)
			saveChanges();
	}
	
	return false;
}

config.commands.deleteProjectAll.deleteActions = function(projectTitle)
{
	// var tiddlers = config.macros.list.tagged.innerHandler([projectTitle, "action"], true);
	var project = store.getTiddler(projectTitle);
	for (var i = 0; i < project.gtdActions.length; i++) {
		var tiddler = project.gtdActions[i].title;
		store.removeTiddler(tiddler);
		story.closeTiddler(tiddler, true, false);
		// project removal will do view notification...
	}
}

config.commands.projectify = { text: "projectify", tooltip: "Convert this action to a project", hideReadOnly: true, warning: "Are you sure you want to convert '%0' to a project?" };
config.commands.projectify.handler = function(event, src, title)
{
	if (confirm(this.warning.format([title]))) {
		var tiddler = store.getTiddler(title);
		if (tiddler.gtdProject) _GTD.removeProjectAction(tiddler.gtdProject, title);
		tiddler.tags = [ "project" ];
		_GTD.tiddlerHasChanged(tiddler, true);
		// we need a broad notification here, not just refreshActionViews
		store.notify(title, true);
	}
	
	return false;
}

// *** ***/
// *** These are overrides to core TiddlyWiki functionality ***
// *** ***/

Tiddler.prototype._GTDInheritedChanged = Tiddler.prototype.changed;
Tiddler.prototype.changed = function()
{
	this._GTDInheritedChanged();
	
	// Note that this is called both as part of normal tiddler changes AND as a part
	// of the initial TW loading process from DIVs...
	
	if (_GTD.tiddlerHasTag(this, "project")) {
		// (re)build the in-memory ordered action list
		this.gtdActions = [];
		this.gtdNextAction = null;
		if (this.text) {
			var reActionWikitext = "^\\.{2}([^|\\n]+)(?:\\|?)(.*)";
			var reActionMacro = "<<gtdAction ((?:[^>]|(?:>(?!>)))*)>>";
			var actionRe = new RegExp("(" + reActionWikitext + ")|(" + reActionMacro + ")", "mg");
			do {
				var formatMatch = actionRe.exec(this.text);
				if (formatMatch) {
					var macroParams = (formatMatch[1] ? null : formatMatch[5].readMacroParams());
					// note that for the ".." notation, we are trimming up action titles and contexts
					var actionTiddlerName = (formatMatch[1] ? formatMatch[2].trim() : macroParams[0]);
					var actionTiddler = store.getTiddler(actionTiddlerName);
					if (!actionTiddler) {
						var actionTags = (formatMatch[1] ? formatMatch[3].trim() : macroParams[1]);
						var extraTags = (formatMatch[1] ? '' : macroParams[2]);
						actionTiddler = config.macros.gtdAction.createAction(actionTiddlerName, this.title, actionTags, extraTags);
					}
					if (actionTiddler) {
						actionTiddler.gtdProject = this;
						if (this.gtdNextAction == null && !_GTD.tiddlerHasTag(actionTiddler, "done"))
							this.gtdNextAction = actionTiddler;
						this.gtdActions.push(actionTiddler);
						_GTD.setExtendedValue(actionTiddler, "gtd.projectindex", this.gtdActions.length - 1);
						// handle project renaming in action
						if (actionTiddler.gtdProjectName && actionTiddler.gtdProjectName != this.title) {
							if (_GTD.usingProjectTags)
								_GTD.tiddlerSwapTag(actionTiddler, actionTiddler.gtdProjectName, this.title);
							else
								_GTD.setExtendedValue(actionTiddler, "gtd.project", this.title);
							// action view won't get updated through any other refresh mechanism, so
							story.refreshTiddler(actionTiddler.title, null, true);
						}
						actionTiddler.gtdProjectName = this.title;
					}
				}
			} while(formatMatch);
		}
	}
	
	else if (_GTD.tiddlerHasTag(this, "context")) {
		if (this.gtdContextName == undefined)
			this.gtdContextName = this.title;
		else if (this.gtdContextName != this.title) {
			// propagate renamed context to affected actions
			store.suspendNotifications();
			var results = config.macros.list.tagged.innerHandler([ this.gtdContextName, "action"], true);
			for (var t = 0; t < results.length; t++) {
				_GTD.tiddlerSwapTag(results[t], this.gtdContextName, this.title);
				results[t].gtdContextName = this.title;
				_GTD.setExtendedValue(results[t], "gtd.context", this.title);
				// action view won't get updated through any other refresh mechanism, so
				//story.refreshTiddler(results[t].title, null, true);
			}
			// because the store is not yet updated, we need to manipulate the context cache directly
			_GTD.renameCachedContext(this.gtdContextName, this.title);
			this.gtdContextName = this.title;
			// we need a broad notification here, not just refreshActionViews
			store.resumeNotifications();
			store.notify(null, true);
		}
	}
	
	else if (_GTD.tiddlerHasTag(this, "action")) {
		if (this.gtdActionName == undefined)
			this.gtdActionName = this.title;
		else if (this.gtdActionName != this.title && this.gtdProject) {
			// ugh...dig into related project and update the wiki code to use new action name
			var reActionWikitext = "^(\\.{2}[ \\t]*)(" + this.gtdActionName + ")(([ \\t]*\\|.*\\n?)|(\\n?))";
			var reActionMacro = "(<<gtdAction [\"\']?)(" + this.gtdActionName + ")([\"\']?\\s+(?:[^>]|(?:>(?!>)))*>>)";
			this.gtdProject.text = this.gtdProject.text.replace(new RegExp(reActionWikitext, "mg"), "$1" + this.title + "$3");
			this.gtdProject.text = this.gtdProject.text.replace(new RegExp(reActionMacro, "mg"), "$1" + this.title + "$3");
			this.gtdActionName = this.title;
		}
		this.gtdActionDone = _GTD.tiddlerHasTag(this, "done");
		this.gtdContextName = _GTD.findActionContext(this);
		_GTD.setExtendedValue(this, "gtd.context", this.gtdContextName);
		// reset the next action on the associated project
		if (this.gtdProject) _GTD.setNextAction(this.gtdProject);
	}
}

Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// This override to core TW functionality is used to provide tag-based view and edit templates. The
	// basic idea is that the tiddler is scanned for its tags and, depending on whether we are opening a
	// tiddler in "view" or "edit" mode, a corresponding 'tag + "ViewTemplate"' or 'tag + "EditTemplate"'
	// tiddler is searched for. If it exists, it is used instead of the default templates.
	
	if (!template)
		template = DEFAULT_VIEW_TEMPLATE;

	// before reverting to default behaviour, check to see if a tag-based template exists
	if (template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE) {
		if (this.tagBasedTemplateCache == undefined) this.tagBasedTemplateCache = new Array();
		var templateRoot = (template == DEFAULT_VIEW_TEMPLATE ? "ViewTemplate" : "EditTemplate");
		var tiddler = store.getTiddler(title);
		if (tiddler) {
			for (var i = 0; i < tiddler.tags.length; i++) {
				var tag = tiddler.tags[i];
				var tagTemplate = tag + templateRoot;
				var tagCacheId = tag + template;
				// first check our cache to see if we have seen this template before
				if (this.tagBasedTemplateCache[tagCacheId] != undefined) {
					// make sure template still exists
					if (store.tiddlerExists(this.tagBasedTemplateCache[tagCacheId])) {
						template = this.tagBasedTemplateCache[tagCacheId];
						break;
					}
					else
						delete this.tagBasedTemplateCache[tagCacheId];
				}
				// go to the store to see if template exists
				if (store.tiddlerExists(tagTemplate)) {
					template = tagTemplate;
					this.tagBasedTemplateCache[tagCacheId] = tagTemplate;
					break;
				}
			}
		}
	}
	
	if (template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE)
		template = config.tiddlerTemplates[template];
	return template;
}

// Clint Checketts' IE first-child patch, version 1.1, http://www.checkettsweb.com/tw/gtd_tiddlywiki.htm#GiveFirstTiddlerClassPatch

Story.prototype.closeTiddlerIEFirstChild = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function(title,animate,slowly) {
	var tiddler = document.getElementById(this.idPrefix + title);
	// we need to test to ensure tiddler is actually open
	if (tiddler) {
		var storyArea = tiddler.parentNode;
		if ((this.idPrefix + title) == storyArea.firstChild.id){
			removeClass(storyArea.firstChild,"IEFirstChild");
			// this next line is redundant, since it is looked after at the end of this function
			// if (storyArea.firstChild.nextSibling) addClass(storyArea.firstChild.nextSibling,"IEFirstChild");
		}
		story.closeTiddlerIEFirstChild(title,animate,slowly);
		if (storyArea.firstChild) addClass(storyArea.firstChild,"IEFirstChild");
	}
}

Story.prototype.displayTiddlerIEFirstChild = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc) {
	var storyArea = document.getElementById(this.container);
	if (storyArea.firstChild) removeClass(storyArea.firstChild,"IEFirstChild");
	story.displayTiddlerIEFirstChild(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc);
	addClass(storyArea.firstChild,"IEFirstChild");
}

_GTD.initialize();

//}}}
This web notebook was created using //''~TiddlyWiki''//, a free, Open Source program created by Jeremy Ruston (http://tiddlywiki.com).  Getting around a ~TiddlyWiki site is quite different from other web sites.  Instead of scrolling through web pages, you open small notes written in boxes called {{{tiddlers}}}. You read what you need from a tiddler then close it and proceed to a next tiddler.

!!!Opening Tiddlers
Tiddlers can be opened in any of the following ways:
* By clicking on the {{{Main Menu}}} items found on the upper banner of the webpage {''Home'' | ''Articles'' |''Notes'' etc.}
* By clicking on the {{{Quick links}}} found at the right side of the webpage
* By searching for a keyword. The {{{search}}} box is found at the upper right corner of the webpage. All tiddlers that contain the word that you search for will be opened. 
When a tiddler is opened, a {{{tab page}}} will appear bearing the content of the tiddler. 

!!!Closing Tiddlers
After opening several tiddlers, you might feel that the screen is too cluttered by all the open tiddlers. You can organize by closing tiddlers in any of the following ways:
* By clicking the {{{close}}} button which appears at the top right portion of the tiddler
* By clicking the {{{close others}}} button which appears at the top right portion of the tiddler.  This will close all open tiddlers except the one you are viewing.
* By clicking the {{{x}}} symbol found in the {{{tab}}} of the tiddler
* By clicking the {{{close all}}} button which appears below the {{{search}}} box, found at the top right portion of the webpage.
God whispers to us in our pleasures, speaks in our conscience, but shouts in our pains: it is His megaphone to rouse a deaf world.

- [[C.S. Lewis]], [[The Problem of Pain]]
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!Documentation
>see [[GotoPluginInfo]]
!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!Revisions
<<<
2009.05.22 [1.9.2] use reverseLookup() for IncludePlugin
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!Code
***/
//{{{
version.extensions.GotoPlugin= {major: 1, minor: 9, revision: 2, date: new Date(2009,5,22)};

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

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

config.macros.gotoTiddler= { 
	listMaxSize: 10,
	listHeading: 'Found %0 matching title%1...',
	searchItem: "Search for '%0'...",
	handler:
	function(place,macroName,params,wikifier,paramString,tiddler) {
		var quiet	=params.contains("quiet");
		var showlist	=params.contains("showlist");
		var search	=params.contains("search");
		params = paramString.parseParams("anon",null,true,false,false);
		var instyle	=getParam(params,"inputstyle","");
		var liststyle	=getParam(params,"liststyle","");
		var filter	=getParam(params,"filter","");
		var html=this.html;
		var keyevent=window.event?"onkeydown":"onkeypress"; // IE event fixup for ESC handling
		html=html.replace(/%keyevent%/g,keyevent);
		html=html.replace(/%search%/g,search);
		html=html.replace(/%quiet%/g,quiet);
		html=html.replace(/%showlist%/g,showlist);
		html=html.replace(/%display%/g,showlist?'block':'none');
		html=html.replace(/%position%/g,showlist?'static':'absolute');
		html=html.replace(/%instyle%/g,instyle);
		html=html.replace(/%liststyle%/g,liststyle);
		html=html.replace(/%filter%/g,filter);
		if (config.browser.isIE) html=this.IEtableFixup.format([html]);
		var span=createTiddlyElement(place,'span');
		span.innerHTML=html; var form=span.getElementsByTagName("form")[0];
		if (showlist) this.fillList(form.list,'',filter,search,0);
	},
	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
			title="Enter title text... ENTER=goto, SHIFT-ENTER=search for text, DOWN=select from list"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list,%search%,%showlist%);"\
			onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,%quiet%,%search%,%showlist%);">\
		<select name=list style="display:%display%;position:%position%;%liststyle%"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=%showlist%?\'block\':\'none\';"\
			%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%showlist%);"\
			onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%showlist%);">\
		</select><input name="filter" type="hidden" value="%filter%">\
	</form>',
	IEtableFixup:
	"<table style='width:100%;display:inline;padding:0;margin:0;border:0;'>\
		<tr style='padding:0;margin:0;border:0;'><td style='padding:0;margin:0;border:0;'>\
		%0</td></tr></table>",
	getItems:
	function(list,val,filter) {
		if (!list.cache || !list.cache.length || val.length<=config.options.txtIncrementalSearchMin) {
			// starting new search, fetch and cache list of tiddlers/shadows/tags
			list.cache=new Array();
			if (filter.length) {
				var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
				var tiddlers=store.sortTiddlers(fn.apply(store,[filter]),'title');
			} else 
				var tiddlers=store.reverseLookup('tags','excludeLists');
			for(var t=0; t<tiddlers.length; t++) list.cache.push(tiddlers[t].title);
			if (!filter.length) {
				for (var t in config.shadowTiddlers) list.cache.pushUnique(t);
				var tags=store.getTags();
				for(var t=0; t<tags.length; t++) list.cache.pushUnique(tags[t][0]);
			}
		}
		var found = [];
		var match=val.toLowerCase();
		for(var i=0; i<list.cache.length; i++)
			if (list.cache[i].toLowerCase().indexOf(match)!=-1) found.push(list.cache[i]);
		return found;
	},
	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag 
	},
	fillList:
	function(list,val,filter,search,key) {
		if (list.style.display=="none") return; // not visible... do nothing!
		var indent='\xa0\xa0\xa0';
		var found = this.getItems(list,val,filter); // find matching items...
		found.sort(); // alpha by title
		while (list.length > 0) list.options[0]=null; // clear list
		var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
		list.options[0]=new Option(hdr,"",false,false);
		for (var t=0; t<found.length; t++) list.options[list.length]=
			new Option(indent+found[t]+this.getItemSuffix(found[t]),found[t],false,false);
		if (search)
			list.options[list.length]=new Option(this.searchItem.format([val]),"*",false,false);
		list.size=(list.length<this.listMaxSize?list.length:this.listMaxSize); // resize list...
		list.selectedIndex=key==38?list.length-1:key==40?1:0;
	},
	keyProcessed:
	function(ev) { // utility function
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},
	inputEscKeyHandler:
	function(event,here,list,search,showlist) {
		if (event.keyCode==27) {
			if (showlist) { // clear input, reset list
				here.value=here.defaultValue;
				this.fillList(list,'',here.form.filter.value,search,0);
			}
			else if (list.style.display=="none") // clear input
				here.value=here.defaultValue;
			else list.style.display="none"; // hide list
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},
	inputKeyHandler:
	function(event,here,quiet,search,showlist) {
		var key=event.keyCode;
		var list=here.form.list;
		var filter=here.form.filter;
		// non-printing chars bubble up, except for a few:
		if (key<48) switch(key) {
			// backspace=8, enter=13, space=32, up=38, down=40, delete=46
			case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
		}
		// blank input... if down/enter... fall through (list all)... else, and hide or reset list
		if (!here.value.length && !(key==40 || key==13)) {
			if (showlist) this.fillList(here.form.list,'',here.form.filter.value,search,0);
			else list.style.display="none";
			return this.keyProcessed(event);
		}
		// hide list if quiet, or below input minimum (and not showlist)
		list.style.display=(!showlist&&(quiet||here.value.length<config.options.txtIncrementalSearchMin))?'none':'block';
		// non-blank input... enter=show/create tiddler, SHIFT-enter=search for text
		if (key==13 && here.value.length) return this.processItem(event.shiftKey?'*':here.value,here,list,showlist);
		// up or down key, or enter with blank input... shows and moves to list...
		if (key==38 || key==40 || key==13) { list.style.display="block"; list.focus(); }
		this.fillList(list,here.value,filter.value,search,key);
		return true; // key bubbles up
	},
	selectKeyHandler:
	function(event,list,editfield,showlist) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display=showlist?'block':'none'; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,showlist); return this.keyProcessed(event); }
		return true; // key bubbles up
	},
	processItem:
	function(title,here,list,showlist) {
		if (!title.length) return;
		list.style.display=showlist?'block':'none';
		if (title=="*")	{ story.search(here.value); return false; } // do full-text search
		if (!showlist) here.value=title;
		story.displayTiddler(null,title); // show selected tiddler
		return false;
	}
}
//}}}
/***
|Name|GotoPluginInfo|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for GotoPlugin|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!!!Usage/Examples
<<<
syntax: {{{<<gotoTiddler quiet search inputstyle:... liststyle:... filter:...>>}}}
All parameters are optional.
* ''quiet'' (//keyword//)<br>list will not be automatically display as each character is typed.  Use //down// or //enter// to view the list.
* ''showlist'' (//keyword//)<br>list will always be displayed, inline, directly below the input field.
* ''search'' (//keyword//)<br>adds an extra 'command item' to the list that can be used to invoke a full-text search using the entered value.  This can be especially useful when no matching tiddler titles have been found.
* ''inputstyle:'' and ''liststyle:''<br>are CSS declarations that modify the default input and listbox styles, respectively.  Note: the CSS styles must be surrounded by ({{{"..."}}} or {{{'...'}}}) or ({{{[[...]]}}}) (e.g., {{{liststyle:"border:1px dotted blue;color:green;..."}}}.
* ''filter:''<br>is a single tag value (or a boolean tag expression if MatchTagsPlugin is installed), and is used to limit the search to only those tiddlers matching the indicated tag or tag expression (e.g., {{{<<gotoTiddler filter:"faq or help">>}}})
{{{<<gotoTiddler>>}}}
<<gotoTiddler>>
{{{<<gotoTiddler search>>}}}
<<gotoTiddler search>>
{{{<<gotoTiddler showlist filter:"pluginInfo" liststyle:"height:10em;width:auto;">>}}}
<<gotoTiddler showlist filter:"pluginInfo" liststyle:"height:10em;width:auto;">>
<<<
!!!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!!!Revisions
<<<
2009.05.22 1.9.2 use reverseLookup() for IncludePlugin
2009.04.12 1.9.1 support multiple instances with different filters by using per-element tiddler cache instead of shared static cache
2009.04.05 1.9.0 added 'showlist' parameter for inline display with listbox always visible.
2009.03.23 1.8.0 added txtIncrementalSearchMin (default=3).  Avoids fetching long lists.  Use down arrow to force search with short input.
2008.12.15 1.7.1 up arrow from input field now moves to end of droplist (search for input).  Also, shift+enter cam now be used to quickly invoke search for text.
2008.10.16 1.7.0 in macro handler(), changed to use //named// params instead of positional params, and added optional "filter:" param for tag filtering.  Removed 'insert' handling (now provided by [[QuickEditPlugin]]).
2008.10.02 1.6.1 for IE, wrap controls in a table.  Corrects placement of listbox so it is below input field.
2008.10.02 1.6.0 added 'search' param for optional "Search for:" item that invokes full text search (especially useful when no title matches are found)
2008.02.17 1.5.0 ENTER key always displays tiddler based on current input regardless of whether input matches any existing tiddler
2007.10.31 1.4.3 removed extra trailing comma on last property of config.macros.gotoTiddler object.  This fixes an error under InternetExplorer that was introduced 6 days ago... sure, I should have found it sooner, but... WHY DON'T PEOPLE TELL ME WHEN THINGS ARE BROKEN!!!!
2007.10.25 1.4.2 added onclick handler for input field, so that clicking in field hides the listbox.
2007.10.25 1.4.1 re-wrote getItems() to cache list of tiddlers/shadows/tags and use case-folded simple text match instead of regular expression to find matching tiddlers.  This *vastly* reduces processing overhead between keystrokes, especially for documents with many (>1000) tiddlers.  Also, removed local definition of replaceSelection(), now supported directly by the TW2.2+ core, as well as via backward-compatible plugin
2007.04.25 1.4.0 renamed macro from "goto" to "gotoTiddler".  This was necessary to avoid a fatal syntax error in Opera (and other browsers) that require strict adherence to ECMAScript 1.5 standards which defines the identifier "goto" as "reserved for FUTURE USE"... *sigh*
2007.04.21 1.3.2 in html definition, removed DIV around droplist (see 1.2.6 below).  It created more layout problems then it solved. :-(
2007.04.01 1.3.1 in processItem(), ensure that correct textarea field is found by checking for edit=="text" attribute
2007.03.30 1.3.0 tweak SideBarOptions shadow to automatically add {{{<<goto>>}}} when using default sidebar content
2007.03.30 1.2.6 in html definition, added DIV around droplist to fix IE problem where list appears next to input field instead of below it.  
2007.03.28 1.2.5 in processItem(), set focus to text area before setting selection (needed for IE to get correct selection 'range')
2007.03.28 1.2.4 added prompt for 'pretty text' when inserting a link into tiddler content
2007.03.28 1.2.3 added local copy of core replaceSelection() and modified for different replace logic
2007.03.27 1.2.2 in processItem(), use story.getTiddlerField() to retrieve textarea control
2007.03.26 1.2.1 in html, use either 'onkeydown' (IE) or 'onkeypress' (Moz) event to process <esc> key sooner, to prevent <esc> from 'bubbling up' to the tiddler (which will close the current editor).
2007.03.26 1.2.0 added support for optional "insert" keyword param.
2006.05.10 1.1.2 when filling listbox, set selection to 'heading' item... auto-select first tiddler title when down/enter moves focus into listbox
2006.05.08 1.1.1 added accesskey ("G") to input field html (also set when field gets focus).  Also, inputKeyHandler() skips non-printing/non-editing keys. 
2006.05.08 1.1.0 added heading to listbox for better feedback (also avoids problems with 1-line droplist)
2006.05.07 1.0.0 list matches against tiddlers/shadows/tags.  input field auto-completion... 1st enter=complete matching input (or show list)... 2nd enter=view tiddler.  "quiet" param controls when listbox appears.  handling for enter (13), escape(27), and down(40) keys.   Change 'ondblclick' to 'onclick' to avoid unintended triggering of tiddler editor).  Shadow titles inserted into list instead of appended to the end.
2006.05.05 0.0.0 started
<<<
''Leave your comments here!''

<<comment %UTC% "cmnt excludeLIst">>

<<forEachTiddler
 where
 'tiddler.tags.contains("cmnt")' 
 sortBy 'tiddler.title'
 descending
 write
'"<<tiddler [["+tiddler.title+"]]$))\n"'
>>
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/serenity.jpg]]

//In an age of proliferation of social networking sites, of accumulation of "friends", do you have The One Friend that matters?  This short guide aims to help people develop friendship with God through prayer. God is online and is sending you a friend request. Accept, Deny, Ignore?//

Man’s longing for fulfillment is a reflection of his thirst for God.  In the depths of his heart, man seeks God. But even before man sought God, God sought him first.  God’s search for man meets man’s longing for God in prayer. 

Prayer is 'the raising of one’s mind and heart to God,'[i]  'being alone very often with someone whom we know loves us.'[ii]  Prayer, put simply, is talking with God, dealing with him in a manner similar to a child talking with his father. 

It is in prayer that we grow in love with God.  Human relationships grow in proportion to the knowledge and dealings between two persons: the more one knows and deals with the other, the more his love for the other grows. The same can be said of our relationship with God: the more we know and deal with God, the more we will love him.  It is in prayer where we talk and deal with God.

<<<
You seek the friendship of those who, with their conversation and affection, with their company, help you to bear more easily the exile of this world- although those friends sometimes fail you…But how is it that you do not seek everyday, more eagerly, the company, the conversation of that great friend who will never fail you?
 - ''St. Josemaría Escrivá'', //The Way//, No.88
<<<

Prayer is a foretaste of heaven. We can rightly say this because the goal of prayer is union with God; and what is heaven but the everlasting possession and union with God?[iii]  We can thus understand why prayer brings so much peace and joy to those who regularly practice it.

This short guide aims to help people acquire the good habit of talking to God daily in silent prayer (also known as mental prayer).

! I.Talking to God
<<<
You write, "To pray is to talk with God. But about what?" About what? About Him, about yourself—joys, sorrows, successes and failures, noble ambitions, daily worries, weaknesses! And acts of thanksgiving and petitions—and Love and reparation. In a word, to get to know him and to get to know yourself—"to get acquainted!" 
(The Way, No.91)
<<<

It is not necessary to know much in order to pray. What is more important is to love much, to speak with God and deal with him as you would to your friend, parent or loved one.

!!What are the things we can talk to God about?
* Your wishes: for yourself, your loved ones, your friends, society
** Talk to God about your loved ones and your wishes for them. Ask for favors, both material (e.g. concerns in school and at home) and spiritual (e.g. help to avoid a bad habit, conversion of a relative).
* Your sorrows, worries, fears, failures, and yes, even your sins
** Ask for light to understand things you find difficult to accept; guidance for difficult decisions you have to make; pardon for the sins you’ve committed; help to overcome your shortcomings.
* Your joys, successes and blessings
** Let God take part in your joys; give Him thanks for the good things you’ve received.
* Your activities, duties, projects and ambitions
** There is nothing that we do that is of no concern to God.
* Your determination to be a better son of God expressed in few but concrete resolutions
** Sincerely face our Lord and ask Him, 'Lord what do you want from me?' and deep in your heart, you will hear the gentle demands of God.

In other words, you can talk to God about everything, because He is interested in everything.  God is not far away- where the stars shine, uninterested in the things that we do. .  St. Augustine affirmed this closeness of God when he said "God is more intimate to me than I am to myself."
 
! II.Listening to God
Prayer is a conversation. It is not just a matter of talking to God continuously, but of listening to Him as well. 

We can listen to God’s voice when we pause and reflect, when we hear God speak to us through the Bible (especially the Gospels), when a spiritual master guides us in the interior life (or spiritual life) through a book that he has written.  We discuss below how to make use of a book and the Gospels in our prayer.

!!Using a book as a tool in prayer
Books about the spiritual life are especially helpful because they guide us on how we can consider spiritual topics.  Reading them is like learning from great spiritual teachers who wish to share their discoveries and experiences in relating with God.  We outline below how one can make use of a book as an aid in prayer:

!!!How to use a book as an aid in prayer
# Read.
** Go over some paragraphs of the book until you get enough material to engage in a conversation with God.
# Reflect. 
** Understand the ideas you just read; talk to God about how these can apply to your life and how you are trying to live them.
# Pause and Listen. 
**God may lead you to a discovery, urge you to perform a good work, or make a gentle reprimand for not doing His will.  At this point, you may wish to give Him thanks for His light, ask His help to carry out a suggestion or ask his pardon for your shortcomings.
# Repeat the previous steps until the allotted time for your prayer is finished.
# Resolutions.  
**Towards the end of your prayer, you may also make some few but concrete resolutions, applying what you have discovered in prayer in your daily life.
Below are some books that could be useful for taking up the habit of mental prayer.

!!!Book suggestions for starting the mental prayer[iv]
# ''Human but Holy'', Leo Trese
** With its short but perceptive sections on getting to know God, yourself and your neighbor, this book serves an excellent introductory book for prayer.
# ''Jesus as Friend'', Salvador Canals
** A very practical prayer material dwelling on the central themes of Christian living.
# ''The Way'', St. Josemaría Escrivá
**A book containing short paragraphs written straight fromthe heart of the author and straight to the heart of the reader.

!!!The Gospels
The Gospels are very important because they tell us about the life, works and words of Christ.  Every Christian must acquire a certain familiarity with the Gospels through its regular reading and reflection.  Fortunately, St. Josemaria has left us some advice on how to meditate on them. He writes:

<<<
"My advice is that, in your prayer, you take part in the different scenes of the Gospel, as one more among the people present. First of all, imagine the scene or mystery you have chosen to help you recollect your thoughts and meditate. Next, apply your mind, concentrating on the particular aspect of the Master’s life you are considering, his humility, his purity, the way he fulfills his Father’s will. Then tell him what happens to you in these matters, how things are with you, what is going on in your soul. Be attentive, because he may want to point out to you, and you will experience suggestions deep in your soul, realizing certain things and feeling his gentle reprimands.”
- ''St. Josemaría Escrivá'', //Friends of God//, No.253
<<<

!!!We summarize these steps below:
St.Josemaría’s suggestions for reflecting on the Gospels

# Imagine
** Create a picture of the scene in your mind using your senses and imagination
# Focus
** Consider an aspect of our Lord’s life as reflected in the scene – e.g. his love, generosity, mercy, etc.
# Reflect
** As regards the item you are considering, what happens in your own life, in your own soul?
#Pause and listen. 
** God may be making some suggestions and gentle reprimands.

! III.Practical Suggestions
!!Decide on the duration of daily prayer
Commit to a fixed duration of daily prayer.  Ten minutes daily may be enough for one beginning this practice. Regularity, more than duration is what is important.  It is better to commit and actually do five minutes of prayer daily than to commit to do 30 minutes and do it only occasionally.  Having a fixed duration of prayer is also important because it guards against praying only as long as one “feels like praying”, thus guaranteeing right intention.

!!Choose a definite place & time
Since God deserves the best, prayer should ideally be done at the best place and the best time. Thus, it is better not to do it late at night while lying in bed, when we are vulnerable to fall asleep. Choose a place and time in which you can easily be recollected. It could be after school or office hours at a nearby chapel where the Blessed Sacrament is kept, or early morning or afternoon in the quiet of your own room.

!!Recite an introductory and closing prayer
Below are the prayers taught by St. Josemaria for beginning and ending a mental prayer.

!!!Introductory Prayer
<<<
My Lord and my God, I firmly believe that you are here, that you see me, that you hear me. I adore you with profound reverence; I beg your pardon for my sins, and your grace to spend this time of prayer fruitfully.  My Immaculate Mother, St. Joseph, my father and lord, my guardian angel, intercede for me.
<<<

!!!Closing Prayer
<<<
I thank you, my God, for all the good resolutions, affections and inspirations that you have communicated to me in this meditation. I beg your help in performing them.  My Immaculate Mother, St. Joseph, my father and lord, my guardian angel, intercede for me.
<<<

!!Use a journal
Use a small notebook to jot down the things that you discover in prayer- lights, affections, inspirations and resolutions. It would help to review them on your succeeding prayers in order to provide continuity to your conversation with God and your spiritual struggle.

! IV.Persevering in Prayer
<<<
 Give me a person who has fifteen minutes of mental prayer daily, and I will give you a saint.
 If you do not practice mental prayer, you don't need the devil to throw you into hell, you throw yourself in there of your own accord.
- St. Teresa of Avila
<<<

It is well worthwhile to persevere in prayer despite the many difficulties you may encounter. We answer below some common excuses for giving up the prayer life.

!!I don’t have time
Really? Is it rather because you don’t make time for God? God is only asking for a few minutes daily.  You find it easy to spend much time on the things that you like, but when it comes to God, you simply don’t have time. When you decide to sacrifice your time for God, you will soon discover that God will multiply your time.

!!I keep saying the same things
Perhaps you only speak about your life and your concerns; try asking God about His concerns, get to know Him more. The more you know about God, the easier it will be to talk to Him.  You may be able to get ideas and inspirations from using the Gospels and some book on the spiritual life.  Another way to feed your prayer is to practice daily spiritual reading.   See Fr.C.J. ~McCloskey’s article on the subject[v].
 
!!I can’t think of anything, I don’t feel anything
Then tell God that you can’t think of anything, in that way, you would have begun to pray.  Remember that the essential thing in prayer is to touch base with God, not to say, feel or think much.  If we spent a period of prayer in utter dryness, we have not wasted our time; we have expressed our loyalty and love in persevering in our prayer despite the absence of consolation.

!!How do I know it is God talking to me?
God can communicate to us through the thoughts and inspirations that come to us in prayer.  Yes, we are the ones who thought of them, but God enlightened us to think of them.  If you are sure that those inspirations are not against any commandment or any lawful authority, then most probably they are coming from God. Regular spiritual direction can greatly help in discerning what God is demanding of us in prayer.  Again, Fr. C.J. ~McCloskey has written an excellent article on this practice.[vi]

//
Antonio C. Briza
www.newind.multiply.com

Readers are encouraged to share this article.//

''Notes''
[i] St. John Damascene
[ii] St. Teresa of Avila
[iii] cf. Fr. C.J. ~McCloskey’s guide How to Pray: www.catholicity.com/mccloskey/howtopray.html

-NEWind

[[Download a pamphlet version (in PDF format) of this article|http://images.newind.multiply.com/attachment/0/SZUxRgoKCIUAAHUcZUY1/GuideToPrayerFormated%202008.02.13.pdf?nmid=195878667]]
“Never fear. There are only two kinds of people in the end: those who say to God, ‘Thy will be done,’ and those to whom God says, I the end, ‘Thy will be done.’ All that are in Hell, choose it. Without that self-choice there can be no Hell.” 

-[[C.S. Lewis]] in [[The Great Divorce]], quoted in [[C.S. Lewis and the Catholic Church]], p.107 

Heaven wheels above you displaying to you her eternal glories and still your eyes are on the ground. 

–Dante
I think earth, if chosen instead of Heaven, will turn out to have been, all along, only a region in Hell: and earth, if put second to Heaven, to have been from the beginning a part of Heaven itself. “‘That is what mortals misunderstand. They say of some temporal suffering, ‘No future bliss can make up for it,’ not knowing that Heaven, once attained, will work backwards and turn even that agony into a glory. And of some sinful pleasure they say ‘Let me have but this and I’ll take the consequences’: little dreaming how damnation will spread back and back into their past and contaminate the pleasure of sin. Both processes begin even before death. The good man’s past begins to change so that his forgiven sins and remembered sorrows take on the quality of Heaven: the bad man’s past already conforms to his badness and is filled only with dreariness. And that is why, at the end of all things, when the sun rises here and the twilight turns to blackness down there, the Blessed will say ‘We have never lived anywhere except Heaven,’ and the Lost, ‘We were always in Hell.’ And both will speak truly.’

-[[C.S. Lewis]] in [[The Great Divorce]]

!Welcome!
/%[>img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/assymptote2copy.jpg]] %/@@color(navy):''Asymptotes''@@ is my personal web notebook on materials related to Faith, Science and Reason.  

In Mathematics, an ''asymptote'' is a line or curve towards which another curve approaches without ever meeting it (or, put in another way, it meets the line/curve at infinity). This collection of notes and articles can be viewed as attempts to approach man's ultimate desire for what is true, good and beautiful- a reflection of his life-long journey to approach God, each day trying to get nearer, until he finally meets Him one day at the infinity his Timeline.
-NEWind

//'In this phial,' she said, 'is caught the light of Earendil's star, set amid the waters of my fountain. It will shine still brighter when night is about you. May it be a light to you in dark places, when all other lights go out.'//

- Galadriel to Frodo, [[J.R.R. Tolkien]]'s [[The Lord of the Rings]]

!Getting Around the Site
<<tiddler [[Getting Around the Site]]>>

! Feature Article
<<forEachTiddler
 where
 'tiddler.tags.contains("feature")' 
 write
'"<html><B><font size =5>"+ tiddler.title+ "</b></font></html>" + "----\n^^[[View article entry|"+tiddler.title+"]]^^\n\n<<tiddler [["+tiddler.title+"]]$))\n"'
>>

<html>
<link rel="shortcut icon" href="http://newind.i8.com/name16.ico" type="image/x-icon" />
</html>
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
I'll be dreaming my dreams with you
-The Cranberries, "Dreaming my Dreams"
To live is to suffer. If life were to have meaning, suffering must have a meaning.

-[[Peter Kreeft]]
If there was a Big Bang, there must be a Big Banger.

-[[Peter Kreeft]]
If we insist on keeping Hell (or even earth) we shall not see Heaven: if we accept Heaven we shall not be able to retain even the smallest and most intimate souvenirs of Hell. 

- [[C.S. Lewis]], [[The Great Divorce]]
Type the text for 'ImportExportPackage'
/***
|''Name:''|IntelliTaggerPlugin|
|''Version:''|1.0.2 (2007-07-25)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|
|''~SourceCode:''|[[IntelliTaggerPlugin SourceCode]]|
|''Licence:''|[[BSD open source license (abego Software)]]|
|''~CoreVersion:''|2.0.8|
|''Browser:''|Firefox 1.5.0.2 or better|
***/
/***
!Version History
* 1.0.2 (2007-07-25): 
** Feature: "Return" key may be used to accept first tag suggestion (beside "Alt-1")
** Bugfix: Keyboard shortcuts (Alt+3 etc.) shifted
* 1.0.1 (2007-05-18): Improvement: Speedup when using TiddlyWikis with many tags
* 1.0.0 (2006-04-26): Initial release

***/
// /%
if(!version.extensions.IntelliTaggerPlugin){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:2,date:new Date(2007,6,25),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.createEllipsis=function(_2){var e=createTiddlyElement(_2,"span");e.innerHTML="&hellip;";};abego.isPopupOpen=function(_4){return _4&&_4.parentNode==document.body;};abego.openAsPopup=function(_5){if(_5.parentNode!=document.body){document.body.appendChild(_5);}};abego.closePopup=function(_6){if(abego.isPopupOpen(_6)){document.body.removeChild(_6);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_7,_8,_9){_7.style.left=_8+"px";_7.style.top=_9+"px";};abego.centerOnWindow=function(_a){if(_a.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _b=abego.getWindowRect();abego.moveElement(_a,_b.left+(_b.width-_a.offsetWidth)/2,_b.top+(_b.height-_a.offsetHeight)/2);};abego.isDescendantOrSelf=function(_c,e){while(e){if(_c==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_e){var _f={};for(var i=0;i<_e.length;i++){_f[_e[i]]=true;}return _f;};abego.filterStrings=function(_11,_12,_13){var _14=[];for(var i=0;i<_11.length&&(_13===undefined||_14.length<_13);i++){var s=_11[i];if(s.match(_12)){_14.push(s);}}return _14;};abego.arraysAreEqual=function(a,b){if(!a){return !b;}if(!b){return false;}var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_1b,_1c){if(!_1c){return;}var _1d=findPosX(_1c);var _1e=findPosY(_1c);var _1f=_1c.offsetHeight;var _20=_1d;var _21=_1e+_1f;var _22=findWindowWidth();if(_22<_1b.offsetWidth){_1b.style.width=(_22-100)+"px";}var _23=_1b.offsetWidth;if(_20+_23>_22){_20=_22-_23-30;}if(_20<0){_20=0;}_1b.style.left=_20+"px";_1b.style.top=_21+"px";_1b.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _27=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_27.push([s.toString().toLowerCase(),s]);}_27.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_27[i][1];}};abego.getTiddlerField=function(_2d,_2e,_2f){var _30=document.getElementById(_2d.idPrefix+_2e);var e=null;if(_30!=null){var _32=_30.getElementsByTagName("*");for(var t=0;t<_32.length;t++){var c=_32[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2f){e=c;}}}}return e;};abego.setRange=function(_35,_36,end){if(_35.setSelectionRange){_35.setSelectionRange(_36,end);var max=0+_35.scrollHeight;var len=_35.textLength;var top=max*_36/len,bot=max*end/len;_35.scrollTop=Math.min(top,(bot+top-_35.clientHeight)/2);}else{if(_35.createTextRange!=undefined){var _3b=_35.createTextRange();_3b.collapse();_3b.moveEnd("character",end);_3b.moveStart("character",_36);_3b.select();}else{_35.select();}}};abego.internal.TagManager=function(){var _3c=null;var _3d=function(){if(_3c){return;}_3c={};store.forEachTiddler(function(_3e,_3f){for(var i=0;i<_3f.tags.length;i++){var tag=_3f.tags[i];var _42=_3c[tag];if(!_42){_42=_3c[tag]={count:0,tiddlers:{}};}_42.tiddlers[_3f.title]=true;_42.count+=1;}});};var _43=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_44,_45,_46,_47,_48,_49){var _4a=this.fetchTiddler(_44);var _4b=_4a?_4a.tags:[];var _4c=(typeof _49=="string")?_49.readBracketedList():_49;_43.apply(this,arguments);if(!abego.arraysAreEqual(_4b,_4c)){abego.internal.getTagManager().reset();}};var _4d=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4e){var _4f=this.fetchTiddler(_4e);var _50=_4f&&_4f.tags.length>0;_4d.apply(this,arguments);if(_50){abego.internal.getTagManager().reset();}};this.reset=function(){_3c=null;};this.getTiddlersWithTag=function(tag){_3d();var _52=_3c[tag];return _52?_52.tiddlers:null;};this.getAllTags=function(_53){_3d();var _54=[];for(var i in _3c){_54.push(i);}for(i=0;_53&&i<_53.length;i++){_54.pushUnique(_53[i],true);}abego.sortIgnoreCase(_54);return _54;};this.getTagInfos=function(){_3d();var _56=[];for(var _57 in _3c){_56.push([_57,_3c[_57]]);}return _56;};var _58=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3d();var _5e=this.getTagInfos();_5e.sort(_58);return _5e;};this.getPartnerRankedTags=function(_5f){var _60={};for(var i=0;i<_5f.length;i++){var _62=this.getTiddlersWithTag(_5f[i]);for(var _63 in _62){var _64=store.getTiddler(_63);if(!(_64 instanceof Tiddler)){continue;}for(var j=0;j<_64.tags.length;j++){var tag=_64.tags[j];var c=_60[tag];_60[tag]=c?c+1:1;}}}var _68=abego.toSet(_5f);var _69=[];for(var n in _60){if(!_68[n]){_69.push(n);}}_69.sort(function(a,b){var d=_60[b]-_60[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _69;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6e=2;var _6f=1;var _70=30;var _71;var _72;var _73;var _74;var _75;var _76;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _77=function(){return _72;};var _78=function(tag){return _75[tag];};var _7a=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7d=function(_7e){var s=_7e.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _81=function(_82){var s=_82.value;var len=s.length;if(len>0&&s[len-1]!=" "){_82.value+=" ";}};var _85=function(tag,_87,_88){if(_7d(_87)){_87.value=_7a(_87.value);}story.setTiddlerTag(_88.title,tag,0);_81(_87);abego.IntelliTagger.assistTagging(_87,_88);};var _89=function(n){if(_76&&_76.length>n){return _76[n];}return (_74&&_74.length>n)?_74[n]:null;};var _8b=function(n,_8d,_8e){var _8f=_89(n);if(_8f){_85(_8f,_8d,_8e);}};var _90=function(_91){var pos=_91.value.lastIndexOf(" ");var _93=(pos>=0)?_91.value.substr(++pos,_91.value.length):_91.value;return new RegExp(_93.escapeRegExp(),"i");};var _94=function(_95,_96){var _97=0;for(var i=0;i<_95.length;i++){if(_96[_95[i]]){_97++;}}return _97;};var _99=function(_9a,_9b,_9c){var _9d=1;var c=_9a[_9b];for(var i=_9b+1;i<_9a.length;i++){if(_9a[i][1].count==c){if(_9a[i][0].match(_9c)){_9d++;}}else{break;}}return _9d;};var _a0=function(_a1,_a2){var _a3=abego.internal.getTagManager().getSortedTagInfos();var _a4=[];var _a5=0;for(var i=0;i<_a3.length;i++){var c=_a3[i][1].count;if(c!=_a5){if(_a2&&(_a4.length+_99(_a3,i,_a1)>_a2)){break;}_a5=c;}if(c==1){break;}var s=_a3[i][0];if(s.match(_a1)){_a4.push(s);}}return _a4;};var _a9=function(_aa,_ab){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_ab),_aa);};var _ac=function(){if(!_71){return;}var _ad=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ad){_ad="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_71.innerHTML=_ad;applyHtmlMacros(_71,null);refreshElements(_71,null);};var _ae=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_73){_73.call(this,tag,e);}return false;};var _b2=function(_b3){createTiddlyElement(_b3,"span",null,"tagSeparator"," | ");};var _b4=function(_b5,_b6,_b7,_b8,_b9){if(!_b6){return;}var _ba=_b8?abego.toSet(_b8):{};var n=_b6.length;var c=0;for(var i=0;i<n;i++){var tag=_b6[i];if(_ba[tag]){continue;}if(c>0){_b2(_b5);}if(_b9&&c>=_b9){abego.createEllipsis(_b5);break;}c++;var _bf="";var _c0=_b5;if(_b7<10){_c0=createTiddlyElement(_b5,"span",null,"numberedSuggestion");_b7++;var key=_b7<10?""+(_b7):"0";createTiddlyElement(_c0,"span",null,"suggestionNumber",key+") ");var _c2=_b7==1?"Return or ":"";_bf=" (Shortcut: %1Alt-%0)".format([key,_c2]);}var _c3=config.views.wikified.tag.tooltip.format([tag]);var _c4=(_78(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_bf]);var _c5="%0; Shift-Click: %1".format([_c4,_c3]);var btn=createTiddlyButton(_c0,tag,_c5,_ae,_78(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c7=function(){if(_71){window.scrollTo(0,ensureVisible(_71));}if(_77()){window.scrollTo(0,ensureVisible(_77()));}};var _c8=function(e){if(!e){var e=window.event;}if(!_71){return;}var _cb=resolveTarget(e);if(_cb==_77()){return;}if(abego.isDescendantOrSelf(_71,_cb)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c8);var _cc=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_ce){_cc.apply(this,arguments);var _cf=_ce.tags;if(_cf){_ce.tags=_cf.trim();}};var _d0=function(_d1){story.focusTiddler(_d1,"tags");var _d2=abego.getTiddlerField(story,_d1,"tags");if(_d2){var len=_d2.value.length;abego.setRange(_d2,len,len);window.scrollTo(0,ensureVisible(_d2));}};var _d4=config.macros.edit.handler;config.macros.edit.handler=function(_d5,_d6,_d7,_d8,_d9,_da){_d4.apply(this,arguments);var _db=_d7[0];if((_da instanceof Tiddler)&&_db=="tags"){var _dc=_d5.lastChild;_dc.onfocus=function(e){abego.IntelliTagger.assistTagging(_dc,_da);setTimeout(function(){_d0(_da.title);},100);};_dc.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_8b(e.keyCode==48?9:e.keyCode-49,_dc,_da);}else{if(e.ctrlKey&&e.keyCode==32){_8b(0,_dc,_da);}}if(!e.ctrlKey&&(e.keyCode==13||e.keyCode==10)){_8b(0,_dc,_da);}setTimeout(function(){abego.IntelliTagger.assistTagging(_dc,_da);},100);return false;};_81(_dc);}};var _e0=function(e){if(!e){var e=window.event;}var _e3=resolveTarget(e);var _e4=_e3.getAttribute("tiddler");if(_e4){story.displayTiddler(_e3,_e4,"IntelliTaggerEditTagsTemplate",false);_d0(_e4);}return false;};var _e5=config.macros.tags.handler;config.macros.tags.handler=function(_e6,_e7,_e8,_e9,_ea,_eb){_e5.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_eb,createTiddlyElement(_e6.lastChild,"li"));};var _ec=function(){if(_71&&_72&&!abego.isDescendantOrSelf(document,_72)){abego.IntelliTagger.close();}};setInterval(_ec,100);abego.IntelliTagger.displayTagSuggestions=function(_ed,_ee,_ef,_f0,_f1){_74=_ed;_75=abego.toSet(_ee);_76=_ef;_72=_f0;_73=_f1;if(!_71){_71=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_71.style.position="absolute";}_ac();abego.openAsPopup(_71);if(_77()){var w=_77().offsetWidth;if(_71.offsetWidth<w){_71.style.width=(w-2*(_6e+_6f))+"px";}abego.moveBelowAndClip(_71,_77());}else{abego.centerOnWindow(_71);}_c7();};abego.IntelliTagger.assistTagging=function(_f3,_f4){var _f5=_90(_f3);var s=_f3.value;if(_7d(_f3)){s=_7a(s);}var _f7=s.readBracketedList();var _f8=_f7.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_f7),_f5,_70):_a0(_f5,_70);abego.IntelliTagger.displayTagSuggestions(_a9(_f5,_f7),_f7,_f8,_f3,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_85(tag,_f3,_f4);}});};abego.IntelliTagger.close=function(){abego.closePopup(_71);_71=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_fb,_fc,_fd,_fe,_ff,id,_101){if(!_fd){_fd="[edit]";}if(!_fe){_fe="Edit the tags";}if(!_ff){_ff="editTags";}var _102=createTiddlyButton(_fc,_fd,_fe,_e0,_ff,id,_101);_102.setAttribute("tiddler",(_fb instanceof Tiddler)?_fb.title:String(_fb));return _102;};abego.IntelliTagger.getSuggestionTagsMaxCount=function(){return 100;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_103,_104,_105,_106,_107,_108){var _109=_107.parseParams("list",null,true);var _10a=_109[0]["action"];for(var i=0;_10a&&i<_10a.length;i++){var _10c=_10a[i];var _10d=config.macros.intelliTagger.subhandlers[_10c];if(!_10d){abego.alertAndThrow("Unsupported action '%0'".format([_10c]));}_10d(_103,_104,_105,_106,_107,_108);}},subhandlers:{showTags:function(_10e,_10f,_110,_111,_112,_113){_b4(_10e,_74,_76?_76.length:0,_76,abego.IntelliTagger.getSuggestionTagsMaxCount());},showFavorites:function(_114,_115,_116,_117,_118,_119){_b4(_114,_76,0);},closeButton:function(_11a,_11b,_11c,_11d,_11e,_11f){var _120=createTiddlyButton(_11a,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_121){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);var e=createTiddlyElement(_121,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_124){var e=createTiddlyElement(_124,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">&copy; 2006-2007 <b><font color=\"red\">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\n"+"!~IntelliTagger Stylesheet\n"+"***/\n"+"/*{{{*/\n"+".intelliTaggerSuggestions {\n"+"\tposition: absolute;\n"+"\twidth: 600px;\n"+"\n"+"\tpadding: 2px;\n"+"\tlist-style: none;\n"+"\tmargin: 0;\n"+"\n"+"\tbackground: #eeeeee;\n"+"\tborder: 1px solid DarkGray;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .currentTag   {\n"+"\tfont-weight: bold;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .suggestionNumber {\n"+"\tcolor: #808080;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .numberedSuggestion{\n"+"\twhite-space: nowrap;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .intelliTaggerFooter {\n"+"\tmargin-top: 4px;\n"+"\tborder-top-width: thin;\n"+"\tborder-top-style: solid;\n"+"\tborder-top-color: #999999;\n"+"}\n"+".intelliTaggerSuggestions .favorites {\n"+"\tborder-bottom-width: thin;\n"+"\tborder-bottom-style: solid;\n"+"\tborder-bottom-color: #999999;\n"+"\tpadding-bottom: 2px;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .normalTags {\n"+"\tpadding-top: 2px;\n"+"}\n"+"\n"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\n"+"\tfont-size: 10px;\n"+"\n"+"\tpadding-left: 0.3em;\n"+"\tpadding-right: 0.3em;\n"+"}\n"+"\n"+"/*}}}*/\n";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\n"+"{{{\n"+"-->\n"+"<div class=\"favorites\" macro=\"intelliTagger action: showFavorites\"></div>\n"+"<div class=\"normalTags\" macro=\"intelliTagger action: showTags\"></div>\n"+"<!-- The Footer (with the Navigation) ============================================ -->\n"+"<table class=\"intelliTaggerFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n"+"  <tr>\n"+"\t<td align=\"left\">\n"+"\t\t<span macro=\"intelliTagger action: closeButton\"></span>\n"+"\t</td>\n"+"\t<td align=\"right\">\n"+"\t\t<span macro=\"intelliTagger action: version\"></span>, <span macro=\"intelliTagger action: copyright \"></span>\n"+"\t</td>\n"+"  </tr>\n"+"</tbody></table>\n"+"<!--\n"+"}}}\n"+"-->\n";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\n"+"{{{\n"+"-->\n"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\n"+"<div class='title' macro='view title'></div>\n"+"<div class='tagged' macro='tags'></div>\n"+"<div class='viewer' macro='view text wikified'></div>\n"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\n"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n"+"<!--\n"+"}}}\n"+"-->\n";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#%5B%5BBSD%20open%20source%20license%5D%5D]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/archive/IntelliTaggerPlugin/Plugin-IntelliTagger-src.1.0.2.js]]\n";(function(){var _126=restart;restart=function(){setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"IntelliTaggerStyleSheet");_126.apply(this,arguments);};})();}
// %/
/***
|''Name:''|IntelliTagsEditCommandPlugin|
|''Version:''|1.0.0 (2007-10-03)|
|''Type:''|plugin|
|''Description:''|A command for your tiddler's toolbar to directly edit the tiddler's tags using the IntelliTaggerPlugin, without switching to "edit mode".|
|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTagsEditCommandPlugin|
|''Requires:''|IntelliTaggerPlugin http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)]]|
|''~CoreVersion:''|2.0.8|
|''Browser:''|Firefox 1.5.0.2 or better|
***/
/***
!Using the "IntelliTagsEditCommandPlugin"
Add the command {{{intelliTagsEdit}}} into the 'macro' attribute of the 'toolbar' {{{<div...>}}} in your ViewTemplate.

''Example:''
{{{
<div class='toolbar' 
        macro='toolbar -closeTiddler closeOthers +editTiddler intelliTagsEdit permalink references jump'>
</div>
}}}

This adds a "tags" button to the toolbar of the tiddlers (next to the ''edit'' button). Pressing the "tags" button will open the input field for the tiddler's tags and let you edit the tags with all the [[IntelliTaggerPlugin|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin]] features.
***/
/***
!Source Code
***/
//{{{
(function(){

if (!version.extensions.IntelliTaggerPlugin)
    throw Error("IntelliTagsEditCommandPlugin requires the IntelliTaggerPlugin (http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin)");

if (config.commands.intelliTagsEdit) 
    return;

config.commands.intelliTagsEdit = {
	text: "tags",
	tooltip: "edit the tags"
};

config.commands.intelliTagsEdit.handler = function(event,src,title) {
	var button = abego.IntelliTagger.createEditTagsButton(title, null, "tags", "edit the tags");
	button.onclick(event);
	return false;
};

})();
//}}}
God is with us in the reality of life, not the fantasy! It is embrace, not escape, that we seek!

-[[Benedict XVI]], [[World Youth Day 2008, Sydney]]
"It would have been better to come back at the same hour," said the fox. 

"If for example, you came at four o'clock in the afternoon, then at three o'clock I shall begin to be happy. I shall feel happier and happier as  the hour advances. At four o'clock, I shall be worrying and jumping about. I shall show you how happy I am!

But if you come at just any time, I shall never know at what hour my heart is ready to greet you

- [[Antoine De Saint Exupery]], [[The Little Prince]]
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
[img[http://i777.photobucket.com/albums/yy51/newind/sadlifesm.jpg]]

A usual workday.  Twenty-three emails in my inbox.  Twelve of them forwarded.  Four containing jokes.

I, being a bit of a comic character, appreciate receiving jokes through email.  How can I not welcome them after spending several hours in front of a computer trying to figure out how to get a computer program to work?  They lighten up my workday.  They help preserve my sanity.

However, there are some jokes that instead of making my workday lighter dampen it altogether.  I’m referring to “green” jokes.  I have received them a couple of times, and I think I still will in the future.  It’s not unusual for a person to receive a green joke, laugh at it for a while, and then start sending it to all the persons in his address book without thinking that some of them could be offended.  Of course it’s not always out of malice that people send this type of jokes.  When a person sends me a green joke, I would like to think that he is only trying to share something that he thinks is amusing- something with which I could enjoy myself.  I would reply to his email and express my gratitude for this thoughtfulness, but I will also try to explain to him, with as much kindness and clarity as I could gather, the sanctity of sex.  You heard me right the first time.  The Sanctity of Sex.  After sending him a warm greeting, I would write some explanation like:

“Sex is something holy, something divine. God, in his marvelous design, has chosen to make man participate in the wonderful task of creation, in the task of perpetuating mankind, through this sacred act. God is present whenever this act is done - in order to infuse the spiritual soul once a new human being is formed.
 
Sex, therefore, is a gift from God. In His plan, this act should only be performed in the intimacy of marriage.  We have no right to use it or portray it in a way other than the purpose of the One who has given it.  Any attempt to take it away from that context or to show it in any other form desecrates it, brings it down to the level of the brute.”
 
This may sounds like a homily, but hey, I’m not preaching!  The defense of the sanctity of sex is not reserved to the clergy and the religious.  It is for all those who would like to wage a war against a world that tries to make us believe that man is a beast.
 
I also used to think that joking about sex is quite normal; something natural for a person who is mature enough, until I was told and I realized that it is not. It is not natural to joke about sex. It is not normal to publicly joke about something so intimate and so divine.
 
It is good to be funny, to share jokes and have fun.  But, perhaps, not over such a sacred gift as sex. 

-NEWind
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>

<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
Funny how we find it heroic and admirable when one disciplines his body in order to be a good athlete or warrior and yet we find it absurd when we’re told that we have to discipline our body in order to be a good Christian. 

Funny how we find it right and just that a person pays for his offenses and yet we find it crazy when we’re told we have to atone for our offenses against God.

Funny how we find it romantic and poetic when a human lover suffers with and for the sake of the Beloved and yet we find it stupid when we’re told that we have to suffer with Christ. [1]

Suffering is present in all three cases above, but suffering is not the one that is sought, but dominion, atonement, and union.  

Dominion over our passions, atonement for our sins and union with Christ: these are some reasons why the Church prescribes self-denial most especially during the period of Lent. Being aware of these reasons will help us live the days of fasting and abstinence that the Church demands of us during this season.  

"May this penitential season be for every Christian a time of authentic conversion and intense knowledge of the mystery of Christ.” 
(Pope Benedict XVI, 2010  Lenten Message)

-NEWind

Notes
====
[1] The tragic but “romantic” deaths of Romeo and Juliet illustrate this, as well as Nienor and Turin’s in J.R.R.Tolkien’s //The Children of Hurin.// So does a Japanese film entitled //Love and Honor//. In the film, a samurai was left without honor after becoming blind. He sank into despair and wanted to kill himself. He demanded from his wife: “Bring me my sword!” to which the wife replied: “Die if you must, but by the same sword I shall take my life.” 
[2] While attending Mass on Ash Wednesday is not required (it’s not a Holy Day of obligation), it is highly recommended.
[3] Click to read [[the full text of  Pope Benedict XVI’s 2010  Lenten message|http://www.catholicculture.org/culture/library/view.cfm?recnum=9245]]
[4] Click to read [[an explanation of the Lenten days of fasting and abstinence|http://lantaka.multiply.com/journal/item/34/Lenten_Fast_and_Abstinence]]
[5] Click to get  [[help for going to confession|Peace and Joy in a Box]].
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{

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

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

window.getSpecialBackupPath = function(backupPath) {

	var now = new Date();

	var modes = config.lessBackups.modes;

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

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

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

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

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

//}}}

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/newssm.jpg]]
//A letter to the editor I sent, complaining about the obscene pictures that come out in their newspaper.//

Dear Sir,

I would like to congratulate you on the recent anniversary of your newspaper.  Your effort in giving <newspaper_name> a new look to respond more to what the readers want is to be lauded.

However, I am alarmed at the new format of the Good Life section of your newspaper.  For the past several days, I have noticed in the centerfold of that section , big indecent pictures.  I would even say that they are pornographic.  One day, out of disgust, I got the entire section and just threw it to the thrash bin.

I hope that the newspaper I have been reading do not fall into the sex bandwagon.  I believe that the editors and staff of your newspaper know of more creative ways of attracting the readers other than having to flaunt obscene pictures at them 

-NEWind

//Photo credit: 'news' by iriann in www.sxc.hu//
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/compass_sm.jpg]]

We don't have to go through life without a map.  Many people have already gone to where we ought to go; we just have to follow their lead. These people have left us maps for understanding the terrain, showing us where the true path lies and where to expect dangers.  I am, of course, referring to books on how to live life to the full. In this article, I have provided a shortlist of books I recommend for understanding and living better Life in general and the Christian Life in particular.

!!Basic Catholic Doctrine
    ''//Books for systematically studying the Catholic faith;  good reference materials for consulting articles of faith//''
    [[The Faith Explained]] by Leo Trese
    [[Compendium of the Catechism of the Catholic Church]]
    [[The Catechism of the Catholic Church]]

!!Prayer
    ''//Books that can help in developing a prayer life.//''
    //Human but Holy// by Leo Trese
    //Jesus as Friend// by Francisco ~Fernandez-Carvajal
    [[The Way]] by St.Josemaria Escriva
    [[The Furrow]] by St.Josemaria Escriva
    //Christ is Passing By// by St.Josemaria Escriva

!!Living the Faith
    ''//Books that give insights and suggestions on how to live the demands of the faith according to one's circumstance. Also useful for spiritual reading.//''
    [[Saints in the World (Man the Saint)]]  by Jesus Urteaga
    [[Friends of God]] by St.Josemaria Escriva
    [[A Trese Trilogy]] by Leo Trese
    //The Story of a Soul// by St. Therese of Lisieux
  
  
!!The Real Catholic Faith
    ''//The Catholic faith for non-Catholics or for doubting Catholics//''
    //Wisdom Shall Enter// in [[A Trese Trilogy]] by Leo Trese
    [[The Everlasting Man|The Everlasting Man Review]] by G.K.Chesterton
    [[Scriptural Roots of Catholic Teaching (Upon This Rock)]] by Chantal Epie
    //Rome Sweet Home// by Scott and Kimberly Hahn
    //Surprised by Truth// ed. Patrick Madrid

!!Marriage
    ''//Living the Christian vocation of marriage//''
    //For Better or for Best// by Gary Smalley (for women)
    //If Only He Knew// by Gary Smalley (for men)
  
!!Sexuality
    ''//Understanding the value and purpose of one's sexuality//''
    //Is Purity Possible?// by Jose Luis Soria
    //The Battle for Normality: A Guide for (Self-)Therapy for Homosexuality//
       by Gerard J. M. Van Den Aardweg

!!Other Books
    ''//Books on virtues; novels that reflect Christian ideals//''
    //The Heart of Virtue// by Donald de Marco
    //The Many Faces of Virtue// by Donald de Marco
    //The Lord of the Rings// by JRR Tolkien
    //The Silmarillion// by JRR Tolkien
    //The Chronicles of Narnia// by CS Lewis

!!Where to find these books
    ''//Books of St.Josemaria can be accessed online through  [[http://www.escrivaworks.org]].//''
    [[Sinagtala Publishers|http://www.sinagtala.com/]]
    [[Totus Bookstore|http://www.totusbookstore.com/]]
    St.Paul's Bookstore
    National Bookstore
    Powerbooks
    Fully Booked

//Photo credit: 'compass' by iprole in www.sxc.hu// 

-NEWind
Men need not live for food merely because they cannot live without food. There is something [more important] to him than livelihood, and that is life.

-[[G.K. Chesterton]], [[The Everlasting Man]]

In the end, life is not about accumulation. It is much more than success.

-[[Benedict XVI]], [[World Youth Day 2008, Sydney]]
|!Site |!Description |
|[[newind.multiply.com|http://newind.multiply.com]]|My multiply page (also contains personal works).|
|[[Peter Kreeft's official site|http://www.peterkreeft.com]]|Contains interesting, enthusing and entertaining articles and podcasts on rational explanations of Christian beliefs. Peter Kreeft also talks about C.S.Lewis and J.R.R.Tolkien rather extensively.|
|[[Mercatornet|http://www.mercatornet.com]]|In its own words: Reframing ethical and policy debates in terms of human dignity, not dollars and cents or political calculation.|
|[[TiddlyWiki|http://tiddlywiki.com/]]|~TiddlyWiki's official site.  Get your own non-linear, offline/online web notebook with tagging and searching features!|
|[[TiddlyWiki for the rest of us|http://www.giffmex.org/twfortherestofus.html]]|An beginner's guide to ~TiddlyWiki|

/%Follow me at Twitter : @northeasternwind
Subscribe to RSS feed: <later =D>%/
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
"You mean," said the Tragedian, "you mean- you did not love me truly in the old days?"

"Only in a poor sort of way," she answered. "I have asked you to forgive me. There was a little real love in it. But what we called love down there was mostly the craving to be loved. In the main I loved you for my own sake: because I needed you."

- [[C.S. Lewis]] in [[The Great Divorce]]

[[Home]]
[[Articles]]
[[Notes]]
[[Authors]]
[[Sources]]
[[Topics]]
[[Links]]
[[About]]
Man is not merely an evolution but rather a revolution... It is customary to insist that man resembles the other creatures. Yes; and that very resemblance he alone can see. 

-[[G.K. Chesterton]], [[The Everlasting Man]]
Never fear. There are only two kinds of people in the end: those who say to God, ‘Thy will be done,’ and those to whom God says, in the end, ‘Thy will be done.’ All that are in Hell, choose it. Without that self-choice there can be no Hell.

-[[C.S. Lewis]], [[The Great Divorce]]
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/blacksheep.jpg]]

An astronomer, a physicist and a mathematician were holidaying in Scotland.
Glancing from a train window, they observed a black sheep in the middle of a field.

"How interesting," observed the astronomer, "all Scottish sheep are black!"

To which the physicist responded, "No, no! Some Scottish sheep are black!"

The mathematician gazed heavenward in supplication, and then intoned, 
"In Scotland there exists at least one field, containing at least one sheep,  at least one side of which is black."

- from Stephen Oman, quoted by [[Simon Singh]] in his book [[Fermat's Enigma]]

//Photo credit: 'black sheep' by BeverlyLR in www.sxc.hu//
Memory is not what the heart desires. That is only a mirror.
//- Gimli on the leaving Lothlorien//

-[[J.R.R. Tolkien]], [[The Lord of the Rings]]
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
Tiddlyspot password:
<<option pasUploadPassword>>
<<upload http://asymptotes.tiddlyspot.com/store.cgi index.html . .  asymptotes>>
[[control panel|http://asymptotes.tiddlyspot.com/controlpanel]]
[[download (go offline)|http://asymptotes.tiddlyspot.com/download]]
<<saveChanges>> (while offline)
/%
| password:|<<option pasUploadPassword>>|
| site management|<<upload http://asymptotes.tiddlyspot.com/store.cgi index.html . .  asymptotes>>|
||[[control panel|http://asymptotes.tiddlyspot.com/controlpanel]]|
||[[download (go offline)|http://asymptotes.tiddlyspot.com/download]]|
%/
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
Nature has some perfections to show that she is the image of God, and some defects to show that she is only His image. 

- [[Blaise Pascal]] in [[Pensees]]
Type the text for 'NavigationPackage'
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.5|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.06.07 - 2.4.5 in 'onmouseover' handler for 'open on hover' slider buttons,<br>use call() method when invoking document.onclick function (avoids error in IE)
|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.nestedSliders = {major: 2, minor: 4, revision: 5, date: new Date(2008,6,7)};

// 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");

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";

	// 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")
				{ ctrls[c].focus(); break; }
		}
	}
	var cookie=theTarget.sliderCookie;
	if (cookie && cookie.length) {
		config.options[cookie]=!isOpen;
		if (config.options[cookie]!=theTarget.defOpen)
			saveOptionCookie(cookie);
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
		}
	}

	// 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}) 
	}
	return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel) {
	if (hasClass(panel,"floatingPanel")) {
		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);
		}
	};
}
//}}}
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>

! Source Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("source")' 
 write
'"[["+tiddler.title+"]]\n"'
  none '"@@color(darkblue):No sources found.@@"'
>>
! Article Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("article")' 
 write
'"[["+tiddler.title+"]]\n"'
  none '"@@color(darkblue):No articles found.@@"'
>>
! Note Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"[["+tiddler.title+"]]\n"'
  none '"@@color(darkblue):No notes found.@@"'
>>
! All Notes about $1
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"!!![["+tiddler.title+"]]\n$)<<tiddler [["+tiddler.title+"]]$))\n"'
 none '"No notes found."'
>>

/%
<<forEachTiddler
  where 'tiddler.tags.contains("$1") && tiddler.tags.contains("source")' 
  sortBy 'tiddler.title'
  write '"![["+tiddler.title+"]]\n<<tiddler filter [tag["+tiddler.title
+"]]$))\n"' 
>>




/%
<<forEachTiddler
  where 'tiddler.tags.contains("$1") && tiddler.tags.contains("source")' 
  sortBy 'tiddler.title'
  write '"![["+tiddler.title+"]]\n<<list filter [tag["+tiddler.title
+"]]$))\n"' 
>>

!Books Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("source")' 
 write
'"[["+tiddler.title+"]]\n"'
>>
! All Notes about $1
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"!!![["+tiddler.title+"]]\n<<tiddler [["+tiddler.title+"]]$))\n"'
>>
%/
/***
|Name|NewHereCommand|
|Source|http://simonbaird.com/mptw/#NewHereCommand|
|Version|1.0|

Code originally by ArphenLin. Small tweak by SimonBaird
http://aiddlywiki.sourceforge.net/NewHere_demo.html#NewHereCommand
To use this you must edit your ViewTemplate and add newHere to the toolbar div, eg
{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}
***/
//{{{

config.commands.newHere = {
	text: 'new here',
	tooltip: 'Create a new tiddler tagged as this tiddler',
	hideReadOnly: true,
	handler: function(e,src,title) {
		if (!readOnly) {
			clearMessage();
			var t=document.getElementById('tiddler'+title);
			story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);
			story.setTiddlerTag(config.macros.newTiddler.title, title, 0);
			story.focusTiddler(config.macros.newTiddler.title,"title");
			return false;
		}
	}
};

config.commands.newJournalHere = {
	//text: 'new journal here',  // too long
	text: 'new journal',
	hideReadOnly: true,
	dataFormat: 'YYYY-0MM-0DD 0hh:0mm', // adjust to your preference
	tooltip: 'Create a new journal tiddler tagged as this tiddler',
	handler: function(e,src,title) {
		if (!readOnly) {
			clearMessage();
			var now = new Date();
			var t=document.getElementById('tiddler'+title);
			var newtitle = now.formatString(this.dataFormat)
			story.displayTiddler(t,newtitle,DEFAULT_EDIT_TEMPLATE);
			story.setTiddlerTag(newtitle, title, 0);
			story.focusTiddler(newtitle,"title");
			return false;
		}
	}
};


//}}}
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("author")' 
 write
'"!! Author\n@@color(darkblue):"+ tiddler.title+"@@\n"'
>>
!! Note Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"[["+ tiddler.title+ "]]\n"'
>>
!! All Notes from $1
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"!!![["+ tiddler.title+ "]]" + "----\n$)<<tiddler [["+tiddler.title+"]]$))\n"'
>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
!! Article Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("article")' 
 write
'"[["+ tiddler.title+ "]]\n"'
 none '"@@color(darkblue):No related article found.@@"'
>>
!! Note Index
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"[["+ tiddler.title+ "]]\n"'
 none '"@@color(darkblue):No related note  found.@@"'
>>
!! All Notes on [[$1]]
<<forEachTiddler
 where
 'tiddler.tags.contains("$1") && tiddler.tags.contains("note")' 
 write
'"[["+ tiddler.title+ "]]" + "----\n$)<<tiddler [["+tiddler.title+"]]$))\n"'
 none '"@@color(darkblue):No related note found.@@"'
>>
//Click on any link below to display the contents of a note or [[View All Notes|Contents of All Notes]].//
! Note Index
<<forEachTiddler
 where
 'tiddler.tags.contains("note")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/wedringssm.jpg]]

I attended the wedding of a cousin today. I was swept away by the ceremony and the liturgy. Not that I felt overly sentimental; I just appreciated more the beauty and the necessity of having signs and symbols to express meanings that otherwise would be impossible , difficult, or at least less effective to express. These signs and symbols are moreover matched by prayers that evoke their meaning. Then came to my mind this quotation from C.S. Lewis:

<<<
"God never meant man to be a purely spiritual nature. That is why he uses, material things like bread and wine to put the new life into us. We may think this is rather crude ad unspiritual. God does not: He invented eating. He likes matter. He invented it.’”

-[[C.S. Lewis]], [[Mere Christianity]], quoted by [[Joseph Pearce]] in [[C.S. Lewis and the Catholic Church]]
<<<

-NEWind

//Photo credit: 'Gold rings' by ollycb in www.sxc.hu//
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/valinor_ship.jpg]]

//Nada te turbe; nada te espante;
todo se pasa; Dios no se muda,
la pacïencia todo lo alcanza.
Quien a Dios tiene, nada le falta.
Solo Dios basta.//  
''- Sta. Teresa de Jesus''

I reminisce the good times I had with him in high school: studying together, cracking jokes, singing old-fashioned songs, making fun of our teachers.  Those were  great times I will always recall with fondness.  I  lost contact with him in college. I wished I could still see him, talk to him, laugh with him. But I never had the chance to talk to him or laugh with him again.  I was, however,  able to see him one night-  lying in a coffin. 

I was dumbfounded.  He could not be dead!  This could not be true!  He's so young!  He's so intelligent! He has so much potential!

But it is true.  My friend has passed away at a very young age.  When will it be my turn? 

I then picture my own death.  I lay in coma in a hospital.  Around me were people who loved me and people I loved.  I drew my last breath and passed into the twilight.  A vigil was held for me. My family, friends and acquaintances came to pay me the last respect.  They prayed before my dead body.  They talked about my last days,  the good times I had with them, the little lessons I shared with them.  A funeral Mass was celebrated for the repose of my soul.  Finally, I was laid to rest in a cemetery.  And there, my body was left to decay.

I pondered in awe on the transitoriness of the things of this world.  I wish I could preserve good times forever, but I cannot.  I wish I could preserve the ones I love from dying, but I can't.   Parents, siblings, spouse, children and friends: all of them will one day die.  I myself will die one day.  Why should this be?  Why can't some happy moments last forever?  Why should people I have learned to love die?  Why can't they remain?  Why can't I remain? 

Deep inside, I longed for permanence, I longed for eternity.  But eternity is not to be found on earth.  “Here on earth we do not have a lasting city,” says the Bible;  “The world's a ship, not a home,” says one saint. It is vain for me to live only for things in this world, no matter how noble they may be.  All things will come to pass.  God, God alone will endure.  Only in God will my longing for the infinite, for the eternal, for the enduring, be satisfied.  And as long as I am here on earth, my enjoyment of the never-ending bliss will not be attained.  As long as I live this life temporal, I will not be able to live the Life Eternal.  And for this, it is necessary that I die. 

Death is my doorway to eternity.  But I know that not all who die enter into eternal life- some  enter into eternal damnation.  I know that God is infinitely merciful and loving.  I know that God wants all men to be saved.  He wants me to be saved, to be eternally happy with Him in heaven.  But I also know that He leaves it up to me to decide if I want to live an eternity with Him or not.  He will not force me to be with Him forever if I do not want to.

But I do want to be with God for eternity!  I can show this by my desire to be with Him now while I am still here on earth. I express this desire whenever I try to meet him in the depths of my soul in prayer, whenever I try to see Him in the persons he has placed by my side, whenever I see his most loving hand behind the difficulties he allows me to bear.  It is only in loving God in my short time here on earth will I be able to love Him forever in Heaven. 

I shall not tarry loving God.  I cannot reserve loving Him during my last days in this world.  It would be too risky.  Except for a great grace from God, it will be difficult for me to love Him at the last moments of my life when I have spent most of  it not loving Him.

If I have behaved as a son to God here on earth, I am sure He will welcome me as a Father in heaven.  Then there will be no reason for me to fear death. Death will be, for me, a sister-  a sister leading me to the house of my Father God.

//I wrote this around a year ago, after learning that a friend of mine in high school had passed away.The picture shows an elven ship traveling to Valinor, the promised land of the Elves.  This is where Frodo sailed at the end of The Lord of the Rings.  In Tolkien's world Valinor is a symbol of heaven. It lies in Aman, the Undying Land.//

-NEWind
{{button{Go to Tiddler:}}} <<gotoTiddler>>
These [[InterfaceOptions]] are saved in your browser.
Enter username for signing edits: <<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]
----
Also see [[AdvancedOptions]]
<<forEachTiddler
 where
 'tiddler.tags.contains("article") && !tiddler.tags.contains("NEWind")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>
<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
	<div class='headerShadow'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div> 
	<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
A mass of legend and literature, which increases and will never end, has repeated and rung the changes on that single paradox; that the hands that had made the sun and stars were too small to reach the huge heads of the cattle. Upon this paradox, we might almost say upon this jest, all the literature of our faith is founded.

-[[G.K. Chesterton]], [[The Everlasting Man]]
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/confessional2.jpg]]
! I.Introduction
All men desire peace and happiness, but many of them do not realize that true peace and happiness could come in a box- in a confessional box that is. Many Catholics neglect, delay or fear going to confession for various reasons.

In this article, I will try to answer common objections on why one needs to go to confession and why one needs to go soon. I neither presume that I have covered all possible questions and objections about going to confession, nor that I have answered completely the questions I have posed. I am convinced that, more than rational arguments, what is needed for conversion is the grace of God and the person’s humility, faith and trust. Nevertheless, I still dare to tackle these questions in the slightest hope that even just one reader decide to avail of this great sacrament and enjoy the presence of God at the center of his soul.

! II.Objections to Confession
Going to confession for the first time, or after a very long time can be very difficult. This is because one has to take three crucial steps, each of which perhaps requiring a considerable effort. First, one has to be humble and courageous enough to face his sins. Second, he has to be even more humble to mention these sins to another person (a priest). Finally, he has to resolve to mend his ways. We discuss below some issues related to these three steps.

!!1. Confronting one’s sins
!!!I can’t face my sins, or, It’s pessimistic to think about my sins 
If we have to be ready and brave enough to face and fix problems in our professional and family life, we have to be even more ready and courageous in facing problems regarding our spiritual life, because what is at stake is much much more- our eternal happiness.

!!!I don’t need confession, I’m a basically a good person
If, as Christ said, a righteous man can fall seven times seven in a day, how much more would a sinner, like you and I, commit sin over a day, a week, a month, a year, or ten years? Unless pride distorts our view of reality, we should be aware of our sinfulness and say with the Psalmist “For in sin I have been conceived.”

St. John also reminds us, “If we say we have no sin, we deceive ourselves.” If we truly know ourselves and do a deep examination of conscience, we will discover some actions, words and omissions that are not pleasing to God.

!!!I don’t have mortal sins- I haven’t killed anyone or did anything similar
Even if you don’t really have mortal sins, you may have, at least, committed some deliberate venial sins (unless you have received a special privilege from God, as Our Lady had). Venial sins are also matters for confession and the Church encourages its faithful to confess them. Venial sins can be compared to wounds that are not fatal, but they have a real negative effect on the soul. A soldier may not instantly die from a wound, but if it is not attended to immediately and properly, it could lead to loss of blood and weakening, and, perhaps later on, to death. Going back on the topic of mortal sins: it’s good to be reminded that killing people is not the only way by which mortal sins could be committed. One could very well commit mortal sins while being in front of a TV or browsing the internet, or by thinking severely evil thoughts.

!!!God is good and merciful; He will understand, he cannot be offended
Yes, God is infinitely good and merciful, but he is also infinitely just. God’s infinite goodness and mercy is shown by his willingness to forgive us, through confession, ANY and ALL sins we commit while we are still on earth. But once we have finished our life on earth, God’s infinite justice will demand a strict accounting for each of our actions, words and omissions.

Sin is something real. If it were not, Christ’s Passion and Death would have no meaning. If sin were not a reality, there would be no reason for Hell to exist. But Hell does, in fact, exist. Our Lord told us so; the children of Fatima, through a privilege from Our Lady, have seen it with their own eyes.

!!2. Confessing one’s sins to a priest
!!!The priest is just another man; I confess directly to God
Yes, the priest is just another man, but he is the chosen instrument of God for granting us his forgiveness. Jesus told his apostles after his resurrection: “Whose sins you forgive are forgiven them, and whose sins you retain are retained.” Christ did not tell the apostles “Whose sins are confessed to God the Almighty, they are forgiven them.” If your teacher told you, “Encircle the letter of your final answer”, will you risk not getting full marks by doing it another way, say, writing the letter of the final answer before the number?

Christ’s decision to make use of instruments- the apostles, the priests at that time- in order to forgive sins is an example of his divine pedagogy. By confessing our sins to a minister, our contrition is heightened by reminding us of how shameful and serious sin is. Moreover, we are given the absolute assurance that we are indeed forgiven when we hear the words of the priest “And I absolve you from your sins.”

!!!The priest is also a sinner
The priest is a sinner but he is Christ when he is in the confessional- he lends his voice and gestures to Christ, but it is Christ who forgives sins. That is why the priest uses the first person pronoun when he gives the absolution. He says “And I absolve you”, not ““And Christ absolves you” because he is acting in the person and in the name of Christ.

!!!I’m ashamed to confess my sins to a priest
This is a natural reaction since what we confess touches on our intimacy. The Church recognizes this and so has sealed in secrecy whatever is mentioned in confession. The priest cannot, under any circumstance, divulge what has been mentioned in confession. Breaking the seal of confession is punishable by excommunication.

!!!I'm afraid to go to confession
There is nothing to fear in confession because God comes to us with open arms to forgive us and grant us mercy. St. Josemaría encourages us with these words: “What depths of mercy there are in God's justice! For, in the judgments of men, he who confesses his fault is punished: and in the Judgment of God, he is pardoned." (The Way, 309)

!!!I haven’t gone to confession for years. I’m afraid the priest might be scandalized or scold me
The priest will never be scandalized in confession. He is also a sinner and is made of the same stuff as we are. Moreover, the priest shares the sentiments of Christ and the Church- he does not wish the sinner to die, but turn from his sins and live.

!!3. Mending one’s ways
!!!I’m not yet ready to change; I still want to enjoy life
Perhaps this is one of the most difficult obstacles to overcome- the fear of losing one’s old, “enjoyable” life, but one that is not completely in keeping with God’s will. It’s good to remember that it is not possible to completely enjoy life with the risk of losing one’s eternity. The type of joy that comes from this type of life is shallow and empty. On the other hand, a life lived according to God’s plans is more fulfilling and peaceful for we have the security of his love in this life and in the next. If we are not ready to give up the “joys” that comes from base, sinful things, it will not be possible to enjoy the real joy that comes from the higher gifts. If we are not ready to spill the vinegar from our glass, we will never enjoy the exquisite taste of a fine champagne. If we are already satisfied with the appetizers, we may never get to the main dish and the dessert that follows.

Conversion is not easy; it requires God’s grace, our humility, faith and trust. If you don’t have the desire to change, then at least ask God to grant you the desire to have the desire to change.

!!!Why confess? I will fall again anyway
This question is similar to this other question: Why take a shower when you could get dirty again anyway? You take a shower daily because you feel cleaner, fresher and you become more presentable to other people. The same thing is achieved in confession. Confession will not immunize you from sin, but it will make you feel good and at peace. It also makes you more presentable and pleasing to God and neighbor. Moreover, confession will also make your future battles against sin easier. Mothers would demand that stains in clothes be washed immediately because they know that the longer the stain remains in the clothes, the more difficult it is to remove it. So it is in our souls. The danger of not going to confession on a regular basis is that we could form bad habits that may be difficult to uproot later on.

! III.Arguments of love are stronger than arguments of reason
We repeat that the arguments above do not cover all possible issues about going to confession. More than arguments of reason, what is needed for conversion are arguments of love. We need to go to confession because our sins have offended so good and loving a Father; because we wish to be reunited with Him who is the greatest object of our love; because we want to be as pleasing as possible in His sight.

In the end, confession (and conversion) is a product of God’s love and mercy to us and our correspondence to that love. We will need God’s grace and so we have to be humbly ask for it.

! IV.Availing of the Sacrament of confession
!!I don’t know how to go to confession
Keep in mind that the most important thing in confession is to be truly sorry for your sins. With this in mind, the rest would be easy. There are guides available on how to do confession (e.g. in the Handbook of Prayers, Sinagtala publishers, or http://www.kofc.org/rc/en/publications/cis/devotional/GuideToConfession2075.pdf).

If you get lost while doing your confession, don’t worry. Just tell the priest that you don’t know how to continue and he will help you. You don’t have to worry either of whether you will be able to remember all the sins you have to confess. Just confess what you can recall, and mention the ones you forgot to mention in your next confession.

!!When is the best time for me to go to confession?
As soon as you are prepared- and it shouldn’t take long for you to be prepared. Set a date for doing it and stick to it. There will be a thousand reasons for delaying confession. Don’t entertain any of them, they could just be suggestions of the devil. If you are in the unfortunate state of being in a mortal sin, all the more should you rush to go to confession.


!!Where can I do my confession?
Take note of the schedule of confessions in your parish, or just approach a priest after a Mass. Take advantage of special occasions in the parishes when confession is especially promoted (e.g. Holy week and Christmas). A place where confession is specially promoted is the Stella Orientis chapel in the University of Asia and the Pacific in Ortigas. In this chapel, at least one priest hears confessions from 7am-7pm of every working day.


//Photo credit: 'I confess' by Viajero1 in www.sxc.hu//

-NEWind
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<forEachTiddler
 where
 'tiddler.tags.contains("article") && tiddler.tags.contains("NEWind")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>
Pessimism is not in being tired of evil but in being tired of good. Despair does not lie in being weary of suffering, but in being weary of joy.

-[[G.K. Chesterton]], [[The Everlasting Man]]

<<tiddler [[NewAuthorTemplate]] with:{{tiddler.title}}>>
“Now the story of Christ is simply a true myth: a myth working on us in the same way as the others, but with this important difference that it really happened… Pagan stories are God expressing Himself through the minds of poets using such images as He found there.” 

-[[C.S. Lewis]] in [[Humphrey Carpenter]]’s [[The Inklings]], quoted in [[Joseph Pearce]]'s [[C.S. Lewis and the Catholic Church]], p.39 
Type the text for 'Plugins'
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

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

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

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

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

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

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

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

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

	},

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

config.renameTags.init();

//}}}

The sacramental view of Christianity is reiterated by Lewis elsewhere in Mere Christianity.  Having declared that ‘the whole mass of Christians are the physical organism through which Christ acts’, Lewis concludes that this ‘explains why this new life is spread not only by purely mental acts like belief, but by bodily acts like baptism and Holy Communion. God never meant man to be a purely spiritual nature. That is why he uses, material things like bread and wine to put the new life into us.  We may think this is rather crude ad unspiritual. God does not: He invented eating. He likes matter. He invented it.

- [[Joseph Pearce]], [[C.S. Lewis and the Catholic Church]],p.127 
(The [[C.S. Lewis]] quotation is from [[Mere Christianity]])

This one is a personal favorite. Originally published in Spanish under the title "El valor divino de lo humano" (Literal translation: The divine value of what is human), this powerful book highlights the importance of human virtues in living our supernatural vocation as Christians. Fr.Urteaga writes with fire and passion. This book is not for the lukewarm, mediocre or faint-hearted.
By Donald De Marco

[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/bigbang2.jpg]]

//
The existence of order presupposes a designer, just as the existence of a law presupposes a legislator.
//

“Science is agnosticism,” proclaimed Thomas Huxley. It is a richly ambiguous remark. The word “agnosticism,” we must remember, has no inherent reference to the Deity. It fundamentally refers to a person’s state of “not knowing” or even “knowing nothing.” In this sense, Huxley’s statement is false. Science does, indeed, provide us with real knowledge. In another sense of the term, agnosticism is traditionally linked with an absence of knowledge concerning the existence of God. But even in this sense, the statement is equally untenable because the knowledge gained through science, far from drawing a blank with regard to the reality of God, actually furnishes us with an intellectual bridge to his existence.

Dr. Werner von Braun, the “Father of the Saturn 5 Rocket” that made it possible for 12 men to walk on the surface of the moon, is one of innumerable scientists who do not think that science precludes knowledge of God. As a scientist, and surely an eminent one, he states that “Anything as well ordered and perfectly created as is our earth and universe must have a Maker, a Master Designer. Anything so orderly, so perfect, so precisely balanced, so majestic as this creation can only be the product of a Divine Idea.” The existence of order presupposes a designer, just as the existence of a law presupposes a legislator.
Reason, including scientific reason, moves easily and naturally from effect to cause, discovering in the natural order implications for the existence of a higher order. Christians, surely, should have no fear that reason and science lead to an agnosticism of God. As St. Paul has written, “Test all things; hold fast to that which is good” (1 Thess. 5:21). For Paul, God and man, faith and reason, life and love, are marvelously unified in Christ: Christ dwells in the intellect by faith, in the heart and affections by 
charity, and in the soul by grace.

If science does not lead to agnosticism, even less can it lead to atheism. Pope John Paul II states in his international best-seller, Crossing the Threshold of Hope, that the visible world, in and of itself, cannot offer a scientific basis for an atheistic interpretation of reality. Consequently, an atheistic interpretation would be “one-sided and tendentious.” He then goes on to recall participating in many meetings with scientists, in particular, with physicists, who, after Einstein, were quite open to a theistic interpretation of the world.

The dictum “Science is agnosticism,” then, is not particularly rational; rather, it is the proclamation of a credo. It does not oppose, but actually presupposes faith, the gratuitous belief that science and faith will prove to be incompatible with each other. Let us read more from the thought of von Braun: “There are those who say that science and religion are incompatible. Nothing could be further from the truth. Science seeks to answer the questions about creation, and religion seeks to learn about the Creator.” Science and faith are convergent, not divergent. Just as the creative act of the Creator and his creation are in continuity with each other, so, too, though in reverse order, are the scientific inquiry that illuminates creation and the reasonable faith in the Divine Being that the findings of such scientific inquiry imply.

“Science is agnosticism,” therefore, is not a paradox. Nor is it an oxymoron. It is simply a contradiction. Nonetheless, the myth persists that science and faith, reason and religion, are mutually exclusive.
Allow me to offer a personal example that may help bring into focus the contradiction involved in making the activity of reason (or science that is based on reason) incompatible with faith in God.

I recently had an article published in the secular press in which I made the point in passing that the ultimate source of all authority is God. What I thought to be a non-inflammatory remark nonetheless inflamed a local atheist who dispatched an angry letter to me. Before opening the envelope, that bore an address I did not recognize, I noticed the words: “Nothing Fails Like Prayer!” My thoughts immediately turned to a recent conference on cancer held in Kingston, Ontario at which one of the participating scientists stated to the media that the only factor we can be sure about that benefits cancer patients in the recovery of their health is prayer. And she had the statistical data to back her claim. I thought it rather curious that someone would use envelopes to beseech the world not to pray. It is like urging others to become solipsists. What is presupposed by the philosophy is negated by its very expression.

I read the letter and was informed that I was guilty of “making irrelevant and spurious character assaults” against all atheists. My atheist advisor informed me that if I contend that God is the source of authority, I logically implied that those who do not believe in God have no basis for their authority, and consequently are immoral.

While this is an interesting point, it is entirely bereft of logic. Imagine, for example, a young desert-dweller who has never seen rain. He knows about water, which he uses on a daily basis. But he believes, due to his limited experience, that the ultimate source of water is the local oasis. He knows about water, but is understandably mistaken about its ultimate source. To see it rain for the first time would be a wonder and revelation to him. Similarly, it is possible to know about morality and even be highly moral, without knowing that God is the ultimate source of morality. An atheist can manifest attributes of God —love, kindness, generosity—without knowing that God is the ultimate source of these virtues, just as easily as a person can wear a particular hat while remaining ignorant of the identity of its milliner. Moral behavior is one thing, its foundation is quite another.
The letter was actually quite strong in its denunciation of me, accusing me of making the kind of “nonsensical” and “unsubstantiated claims” that “continue to do much damage in our society today.” His underlying point, however, was really the contrary of what he expressed. He was implying (though perhaps without realizing it) that it is precisely the people who believe in God who are immoral because they establish their morality on a basis that does not exist and therefore cannot be truly moral. Of course, this makes no sense either, but it is curious that my atheist instructor can enjoy the liberty of advising the world not to pray, while denying anyone the liberty to assert that God is the source of all authority.

If God exists, of course, the issue is settled. But our atheist does not want to deal with the question of God’s existence. He simply assumes he does not. But he also assumes that the activity of human reason and the existence of God are disjunctive. Therefore, the only truly reasonable people in the world are atheists.

I have always found it odd that a person who neither believes in God, the supernatural, the immortality of the soul, the consolation of religion, and so on, could be apostolic about such barrenness. It would be like discovering that your grandfather was a completely unscrupulous fellow and devoid of a single redeeming quality, and then sending letters out to complete strangers, informing them of this embarrassing and disconcerting fact. Is it that misery loves company? Or that certain people, like gossip columnists, love to spread bad news?

The debate that an apostolic atheist wages against faithful Christians is also a bit odd. He wants everyone to believe that his ancestry goes back to mud and slime, and holds that it is damaging to one’s self-esteem to believe that a human being is made in the image of God.

But my atheist correspondent does not operate alone. He is a member of the Freedom From Religion Foundation. In keeping with his apostolic zeal, he sent me information about how and at what price I could become a supporter of “freethought” and a subscriber to Freethought Today (“the only freethought newspaper in the United States”).

My single and seemingly innocuous reference to the Deity precipitated a virtual attack by the one agency in the world that, presumably, would be the most likely one to leave me alone—the freethought brigade! Apparently, believing in God impairs my freedom, even if I freely came to the belief that God exists, and freely hold to it.

I opened one of the pamphlets that came with the letter (“Nontract No. 3” as it is called). I read the following passage: “We are all born atheists.” A startling suggestion! But is it not premature to ascribe a theologico-philosophical position to the mind of a neonate? Was this a self-defeating admission that had eluded the writers of this statement, for in the newborn, ignorance is at its high point. Are we most free when we are most ignorant? Is it not the truth that will make us free, not ignorance of it? No one is born knowledgeable or virtuous; no one is born with the conviction that God does not exist. Atheism is not a natural endowment. A blank sheet of paper is unprinted, but it is not unimprintable.

More startling, two sentences later, however, was the assertion that among the great artists exemplifying the spirit of the skeptic or the freethinker who refused to bend to religion, is Alfred Lord Tennyson. This seemed to be a particularly bad example of a role model for irreligion. The most often quoted line from the pen of this great Victorian poet is a glowing testimony to the efficacy of prayer: “More things are wrought by prayer than this world dreams of.”
I put the pamphlet aside and opened a critical edition of Tennyson’s great poem, In Memoriam, and read the first stanza:
<<<
Strong Son of God, immortal Love,
Whom we, that have not seen thy face,
By faith, and faith alone, embrace,
Believing where we cannot prove.
<<<
Tennyson himself advised that the opening line “might be taken in a St. John sense”: “In him was life, and the life was the light of men. The light shines in the darkness, and the darkness has not overcome it” (John 1:4-5).
This did not sound like the style of a freethinking atheist. Tennyson, in fact, had from boyhood a deep religious sense and a genuine capacity for mystical experience. Scholars have hailed In Memoriam as the most dramatic as well as the most religious of English elegies. Queen Victoria, upon losing her husband, stated that In Memoriam was her comfort, second only to the Bible.
In Memoriam, inspired by the sudden death (at age twenty-two) of Tennyson’s dear and closest friend, Arthur Henry Hallam, charts the triumphal journey from doubt to faith. In Tennyson’s mind, reason and faith were not antagonistic to each other in the least. This is amply evident in the following two stanzas from In Memoriam’s “Prologue”:
<<<
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.

Let knowledge grow from more to more,
But more of reverence in us dwell;
That mind and soul, according well,
May make one music as before.
<<<
Tennyson laments the modern world’s loss of faith. “As before” refers to the age of faith that characterized the Middle Ages, before modern science had created the gulf between intellectual “knowledge,” on the one hand, and instinctive “reverence” on the other. Reason and faith, knowledge and reverence, should harmonize to make one music.
Tennyson is hardly an apologist for the “freethinker.” He is, by all accounts, a deeply religious Christian who knows the limitations of knowledge and the need of faith. He knows, all too well, that he is not free to reject either.
I proceeded to “Nontract No. 11,” which purports to explain “What is a Freethinker?” Here I read that freethinkers are not entirely free but are bound by the natural order. They are “naturalistic.” “Truth,” the pamphlet goes on to state, “is the degree to which a statement corresponds with reality.” This sounded remarkably similar to St. Thomas Aquinas’s notion of truth: “The human intellect is measured by things so that man’s thought is not true on its own account but is called true in virtue of its conformity with things” (Summa Theol. II-II, 26, 1 ad 2.). Could Aquinas (as well as Tennyson) be an apologist for atheistic freethinkers? Then why has the Church canonized him?

A freethinker, then, does have restraints. He is neither an ignorant child nor a reckless and licentious adult. His thinking, if it is to be true, must conform to reality. A freethinker, then, since his thought is limited only by reality, can be religious, since faith also has reality as its object. Therefore, reason and faith are perfectly compatible, though distinguishable, because they are united by the same object, namely, reality. Shoes and socks are distinguishable, but not incompatible. A person may wear shoes and socks, just shoes, or just socks. So, too, a person may have reason and faith, or emphasize one more than the other. Tennyson, Aquinas, and my atheist correspondent can all be freethinkers, by the very tenets established by the Freedom from Religion Foundation. So what is all the huff?

The tract goes on to claim a basis for morality that is independent of religion. It cites a certain Barbara Walker who states: “What is moral is simply what does not hurt others. Kindness . . . sums up everything.” Yet, as St. Thomas Aquinas notes: “The greatest kindness one can render to any man consists in leading him from error to truth” (In div. nom. 4, 4.). Kindness cannot sum up everything, because if it did, it would exclude a proper concern for truth. It is not kind to allow a person to wallow in error.

I then turned to “Nontract No. 4” for further illumination. There I read a statement attributed to Gloria Steinem that was supposed to embarrass anyone who believes in religion: “It’s an incredible con job when you think of it, to believe something now in exchange for life after death. Even corporations with all their reward systems don’t try to make it posthumous.”
Ms. Steinem is being glib. But her rhetoric is without rectitude. First, she mistakes a “covenant” for an “exchange.” Religion is not a deal (pay now, reap the rewards later), but a loving relationship with God who is the essence of love. Nor is there an essential discontinuity between this world and the next. Our happiness in the next life is a consequence (more properly than a “reward”) of our love in this life. Moreover, it is inaccurate to suggest that we are dead in the next world. We are not “posthumous” in paradise, but very much alive (more so than ever before). In addition, corporations do make their reward systems posthumous. This is the normal way in which a widow or widower receives life insurance benefits once the spouse has died.

Not wanting to abandon reality, or the laws of logic, I came to the conclusion that the material sent to me directly from my atheist letter-writer, and indirectly from the Freedom From Religion Foundation is highly confused. There would be a lot less quarreling and invective in the world if there were less confusion. We human beings, diverse as we are, are more alike than we often realize. But we have a strange proclivity to isolate elements that belong to a greater whole and then launch an artificial war between absolutized fragments. Even doubt and belief co-exist in the same person. The religious person is not one who is free of all doubts (because of his presumed “blind faith”). Nor is the atheist free of all belief. I was heartened by the atheist’s complimentary close: “Best regards” (it was in stark contrast with the cynical maxim on the envelope).

Cardinal Ratzinger states in his Introduction to Christianity that “both the believer and the unbeliever share, each in his own way, doubt and belief, if they do not hide away from themselves and from the truth of their being. Neither can quite escape doubt or belief: for the one, faith is present against doubt, for the other through doubt and in the form of doubt.” Thérèse of Lisieux horrified some of her sisters when they read these words in the saint’s diary: “I am assailed by the worst temptations of atheism.”

Science depends on faith far more than is generally assumed. The scientist must make an initial act of faith that the world to which he applies reason is one whose laws are both intelligible and consistent. He must believe, or else he would lose heart and fear that the laws of the universe are like the croquet game in Alice in Wonderland, where the rules of the game change from moment to moment by the arbitrary decree of the Queen. For this reason, Norbert Wiener—“Father of Cybernetics,” who received a Harvard Ph. D. in mathematics at 18, and later wrote a book, God and Golem, Inc., which won the National Book Award in 1964—asserts that “Science is impossible without faith.”

When Albert Einstein confessed that what was most incomprehensible for him was the fact that the universe is comprehensible, he was alluding to the same need for faith. The laws of the universe are a fit object for human reason, but the reality of this affinity between mind and world, itself a mystery, demands the scientist’s faithful allegiance. “Der Herr Gott ist raffiniert, aber boshaft ist Er nicht,” he wrote (“God is subtle, but not malicious”). We need reason for the mind to discover the laws of the universe, but we need a preliminary faith that these laws will not betray us. Reason without faith lacks the confidence necessary to exercise its own act.

In addition, many of the truths of science, from quarks to quasars, involve aspects of reality that, while affirmable, are nonetheless inconceivable. In this way, the human mind is disposed to affirm realities that are real but nonetheless beyond comprehension. Let us return one final time to the thought of Dr. von Braun:
The electron is materially inconceivable, and yet it is so perfectly known through its effects that we use it to illuminate our cities, guide our airlines through the night skies, and take the most accurate measurements.
What strange rationale makes some physicists accept the inconceivable electron as real, while refusing to accept the reality of God on the ground that they cannot conceive Him?


//From : [[http://www.catholic.net/rcc/Periodicals/Homiletic/March98/Science,Fth&Ath.html]]

''Dr. [[Donald De Marco]]'' is an associate professor of philosophy at St. Jerome’s College of the University of Waterloo. He studied theology at the Gregorian University in Rome and earned his Ph.D. at St. John’s University in New York. His most recent books are: How to Survive as a Catholic in a Parochial World (St. Martin de Porres, New Hope, Ky.) and The Incarnation in a Divided World (Christemdom). Dr. DeMarco resides in Kitchener, Ontario, with his family and is a frequent contributor to HPR.//

''My Comments''
I found this article while preparing for a get-together on faith and reason ([[see my blog entry|Youngblood: Faith and reason]]). This article covers more ground that the humble article I wrote. By the way, [[Donald De Marco]] is also the author of two great, easy-to-read books on virtues: "The Heart of Virtue" and "The Many Faces of Virtue." -newind
I read this when I was in college. Completely enlightening for a Catholic to read.
Perhaps the book is not available in the popular bookstores, but most probably, they could be ordered from Totus, National or Fully Booked.

//From www.familypublications.co.uk ://
The scriptural background to all distinctively Catholic teachings, including Petrine primacy, apostolic succession, Immaculate Conception and institution of Church and Sacraments. Illustrates not only that Catholic teaching is Scripture-based, but that the Church is the Bible’s only fully correct interpreter. Indispensable for true dialogue and testimony to non-Catholic friends.
The tiddler 'Second subaction' doesn't yet exist. Double-click to create it
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/moviefilm_sm.jpg]]

Below are some sites which could help us assess if a movie is worth watching :

''Mercatornet'' - http://www.mercatornet.com/quick_picks/
Gives ratings of recent and past movies; also gives suggestions on which movies are really good for viewing

''The Internet Movie Database'' - http://www.imdb.com/
You can search a film and its ratings. It contains a portion "Parents Guide" which lists the occurence of Nudity, Violence, Profanity

''Screenit''- http://www.screenit.com
Similar to IMDB.

Watching movies is a passtime for many people. Movies can be a source of formation or mal-formation depending on its content and message. Before watching a film, it's good to find out if it is worth watching in the first place, or if there are some portions of it which are objectionable. We actually do something similar when we buy a merchandise like a cellphone or a computer- we immediately check if it's working as it should (if it will actually help us or would just be a source of trouble) and if there are some parts which are not working properly. We have to have the same mindset when we watch movies- first we have to find out if it will build our cultural and intellectual formation, then try to see if there are portions which are objectionable. We cannot and should not just swallow an entire fudge cake which happens to have a fly on it.

Don't hesitate to reject movies which contribute nothing to your formation (or, perhaps, may even contribute to its mal-formation).

//Photo credit: 'movie' by greekgod in www.sxc.hu// 

-NEWind
<<search>><<closeAll>><<newTiddler title:"New Note" label:"new note" tag:"note">><<newTiddler title:"New Article" label:"new article" tag:"article">><<newTiddler title:"AuthorName" label:"new author" tag:"author" text: {{store.getTiddlerText("NewAuthorBoilerPlate")}}>><<newTiddler title:"NewSource, e.g.Title of a Book" label:"new source" tag:"source" text: {{store.getTiddlerText("NewSourceBoilerPlate")}}>><<newTiddler title:"newTopic" label:"new topic" tag:"topic" text: {{store.getTiddlerText("NewTopicBoilerPlate")}}>>+++[options »]<<tiddler [[OptionsPanel]]>>===+++[Manage site »]<<tiddler [[MyTspotOptions]]>>===
/%
<<newTiddler>><<permaview>><<newJournal "DD MMM YYYY" "journal">>
%/
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/pumpkinpism2.jpg]]

Here are 5 techniques for everyday living:

#How to know whether it is the 1st, 2nd, 3rd, etc. day of the month
#How to know the time elapsed between StartTime and EndTime
#How to know what time it would it be x hours from now
#How to know how many pages there are from StartPage to EndPage
#Bonus: How to get spoon and fork in food courts efficiently


''Disclaimer:''
This article is not meant to be a scholarly paper. 

! 1.How to know whether it is the 1st, 2nd, 3rd, etc. day of the month
''Problem''
There are events meetings that sometimes happen on the 1st, 2nd,3rd or 4th day of the month. For example, some activities could be held every 2nd Sunday of the month or 4th Monday of the month. So how do you know that a date is the 2nd Monday or 4th Sunday of the month?

''Solution''
Divide the date by 7. If the quotient is a whole number, that's your answer. If it's not, round the quotient to the next whole number and there you have the answer.

''Examples''
//Example 1//
December 14 is a Monday;  
14/7=2; 2  is a whole number. 
So December 14 is the ''2''nd Monday of the month.

//Example 2//
Today is Sunday, October 25.  
25/7= 3.<small>something</small>
3.<small>something</small>  is not a whole number so round it up to the next whole number, which is 4.
So October 25 is the ''4''th Sunday of the month.

''Notes''
In technical terms the formula is defined as follows:
<blockquote>Formula: Ceiling(Date/7)</blockquote>
where Ceiling is a function that rounds up non-whole numbers to the next whole number.

! 2.How to know the time elapsed between StartTime and EndTime
''Problem''
How many hours are there from 9:30PM to 5:00AM, without running the hours in your fingers?
What about from 10:30AM to 4:00PM?

''Solution''
''//Case 1//''
If both StartTime and EndTime are in the AM or PM, simply subtract StartTime from EndTime

//Example//
Start Time: 8:00AM ; End Time 11:30AM 
Time Difference-> 11:30-8:00= 3 hours 30 mins

''//Case 2//''
If one is in the AM, the other in the PM
Formula:  (12:00- Start Time) + End Time

//Example 1//
Start Time: 9:30PM ; End Time 5:00AM 
Time Difference: (12:00-9:30)+5:00 = 7hours 30mins

//Example 2//
Start Time: 10:30AM ; End Time 4:00PM 
Time Difference: (12:00-10:30)+4:00 = 5hours 30mins

! 3.How to know what time it would it be x hours from now
Examples:
What time would it be 7.5 hours after 9:30AM?
What time would it be 8 hours after 10:30AM?

''Solution''
1. Compute CurrentTime+TimeToElapse
2. If the Sum is less than or equal to 12:00, the Sum is your answer.
3. If the Sum is more than or equal to 12:00:
   a. Subtract 12:00 from the Sum
   b. Switch from AM to PM or PM to AM depending on the which side CurrentTime is

''Examples''
//Example1//
7.5 hours after 2:00PM
2:00+7:30=9:30PM (we don't switch from PM to AM since the Sum is less than 12:00)

//Example2//
7.5 hours after 9:30AM
9:30+7:30=17:00
17:00 is greater than 12:00 
So we subtract 12:00 from the Sum ->  17:00-12:00=5:00
Then we switch from AM to PM
Therefore the answer is 5:00PM

//Example3//
8 hours after 10:30AM
10:30+8:00=18:30
18:30-12:00=6:30
Switch from AM to PM: Answer is 6:30PM

! 4.How to know how many pages there are from StartPage to EndPage

''Problem''
You want to print pages 23-45 of a file. How many pages will you make?

''Solution''
Formula: EndPage-StartPage+1

''Example''
Printing pages 23-45 will produce (45-23)+1 =23 pages

! 5. Bonus: How to get spoon and fork in food courts efficiently

''Problem''
In many food courts, the spoon and fork are usually kept in a container which has 2 rows and 2 columns (2x2).  What would be the best way to get spoon and fork such that the probability of getting 2 spoons or 2 forks (instead of 1 spoon and 1 fork) is kept to a minimum?

''Solution''
Get the utensils which are oriented diagonally to each other.  There is a great chance that the spoons and forks will be alligned in a row or in a column, so getting the utensils which are oriented diagonally to each other will most likely yield utensils not of the same type.

''Comment''
I have been using this principle for a long time already and I have only failed once.

-NEWind

//Photo credit: 'Pumpkin pi' by bigfoot13 in www.sxc.hu//
Clippings and musings on Faith, Science and Reason
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/assyico2-1.jpg]]  Asymptotes          
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
//Click on a source (book, event, etc.) below to display all the notes taken from that source.//
!Index of Sources
<<forEachTiddler
 where
 'tiddler.tags.contains("source")' 
 sortBy 'tiddler.title'
 write
'"[["+tiddler.title+"]]\n"'
>>

//Click on a source below to get a listing of all tiddlers tagged with that source.//
!Tag Cloud of All Sources
<<cloud =source>>
Normally two people marry because they have "fallen in love" with one another. But a successful and happy marriage does not depend just on falling in love, but above all on "standing" in love. To fall in love is easy; to stand in love is not. 

-CormacBurke
/*{{{*/
/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];
}

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];
}
.headerForeground, .headerShadow {
	padding: 1em 1em 0;
	font-family: 'Trebuchet MS' sans-serif;
	font-weight:bold;
}
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];
}

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;
}

/* prefer monospace for editing */
.editor textarea {
	font-family: 'Consolas' monospace;
}

/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS' sans-serif;
}

/* more subtle tiddler subtitle */
.subtitle {
	padding:0px;
	margin:0px;
	padding-left:0.5em;
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];
}

/* a little bit of extra whitespace */
.viewer {
	padding-bottom:3px;
}

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background: [[ColorPalette::Background]];
	color: [[ColorPalette::Foreground]];
}

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding-bottom: 2em;
}

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];
}


/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;
}

/* displays the list of a tiddler's tags horizontally. used in ViewTemplate */
.tagglyTagged li.listTitle {
	display:none
}
.tagglyTagged li {
	display: inline; font-size:90%;
}
.tagglyTagged ul {
	margin:0px; padding:0px;
}

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
	display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
	display:inline;
}

/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
	display: none;
}
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
	color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
	padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];
}

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	}
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	}
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	}
	.headerShadow {
		visibility: hidden ! important;
	}
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	}
	.quickopentag a.button, .miniTag {
		display: none ! important;
	}
}
/*}}}*/
<<cloud systemConfig excludeMissing script DiscoveryPackage Plugins Plugin plugin plugins PluginInfo plugininfo gtd ImportExportPackage NavigationPackage TagglyTagging action excludeLists hide pluginInfo note author source category MiscSource MiscAuthor MiscCategory @errands template topic article NEWind>>
<<cloud>>
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.7.0|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|present a 'cloud' of tags (or links) using proportional font display|
!Usage
<<<
{{{
<<cloud type action:... limit:... tag tag tag ...>>
<<cloud type action:... limit:... +TiddlerName>>
<<cloud type action:... limit:... -TiddlerName>>
<<cloud type action:... limit:... =tagvalue>>
}}}
where:
* //type// is a keyword, one of:
** ''tags'' (default) - displays a cloud of tags, based on frequency of use
** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler
** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler
* ''action:popup'' (default) - clicking a cloud item shows a popup with links to related tiddlers<br>//or//<br> ''action:goto'' - clicking a cloud item immediately opens the tiddler corresponding to that item
* ''limit:N'' (optional) - restricts the cloud display to only show the N most popular tags/links
* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters
* ''+TiddlerName''<br>show only tags/links read from a space-separated, bracketed list stored in a separate tiddler.
* ''-TiddlerName''<br>show all tags/links //except// those read from a space-separated, bracketed list stored in a separate tiddler.
* ''=tagvalue'' (//only if type=''tags''//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//
<<<
!Examples
<<<
//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud systemConfig excludeMissing script>>}}}
//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}
//tags listed in// [[FavoriteTags]]
{{{<<cloud +FavoriteTags>>}}}
{{groupbox{<<cloud +FavoriteTags>>}}}
//tags NOT listed in// [[FavoriteTags]]
{{{<<cloud -FavoriteTags>>}}}
{{groupbox{<<cloud -FavoriteTags>>}}}
//links to tiddlers tagged with 'package'//
{{{<<cloud action:goto =package>>}}}
{{groupbox{<<cloud action:goto =package>>}}}
//top 20 most referenced tiddlers//
{{{<<cloud references limit:20>>}}}
{{groupbox{<<cloud references limit:20>>}}}
//top 20 tiddlers that contain the most links//
{{{<<cloud links limit:20>>}}}
{{groupbox{<<cloud links limit:20>>}}}
<<<
!Revisions
<<<
2009.07.17 [1.7.0] added {{{-TiddlerName}}} parameter to exclude tags that are listed in the indicated tiddler
2009.02.26 [1.6.0] added {{{action:...}}} parameter to apply popup vs. goto action when clicking cloud items
2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.
2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error
2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations
2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular
2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler
2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] added 'segments' property to macro object.  Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.TagCloudPlugin= {major: 1, minor: 7 , revision: 0, date: new Date(2009,7,17)};
//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman
//Currently maintained and enhanced by Eric Shulman
//}}}
//{{{
config.macros.cloud = {
	tagstip: "%1 tiddlers tagged with '%0'",
	refslabel: " (%0 references)",
	refstip: "%1 tiddlers have links to '%0'",
	linkslabel: " (%0 links)",
	linkstip: "'%0' has links to %1 other tiddlers",
	groups: 9,
	init: function() {
		config.macros.tagCloud=config.macros.cloud; // for backward-compatibility
		config.shadowTiddlers.TagCloud='<<cloud>>';
		config.shadowTiddlers.StyleSheetTagCloud=
			'/*{{{*/\n'
			+'.tagCloud span {line-height: 3.5em; margin:3px;}\n'
			+'.tagCloud1{font-size: 80%;}\n'
			+'.tagCloud2{font-size: 100%;}\n'
			+'.tagCloud3{font-size: 120%;}\n'
			+'.tagCloud4{font-size: 140%;}\n'
			+'.tagCloud5{font-size: 160%;}\n'
			+'.tagCloud6{font-size: 180%;}\n'
			+'.tagCloud7{font-size: 200%;}\n'
			+'.tagCloud8{font-size: 220%;}\n'
			+'.tagCloud9{font-size: 240%;}\n'
			+'/*}}}*/\n';
		setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');
	},
	getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows
		if (!tiddler.linksUpdated) tiddler.changed();
		var list=[]; for (var i=0; i<tiddler.links.length; i++) {
			var title=tiddler.links[i];
			if (store.isShadowTiddler(title)||store.tiddlerExists(title))
				list.push(title);
		}
		return list;
	},
	handler: function(place,macroName,params) {
		// unpack params
		var inc=[]; var ex=[]; var limit=0; var action='popup';
		var links=(params[0]&&params[0].toLowerCase()=='links'); if (links) params.shift();
		var refs=(params[0]&&params[0].toLowerCase()=='references'); if (refs) params.shift();
		if (params[0]&&params[0].substr(0,7).toLowerCase()=='action:')
			action=params.shift().substr(7).toLowerCase();
		if (params[0]&&params[0].substr(0,6).toLowerCase()=='limit:')
			limit=parseInt(params.shift().substr(6));
		while (params.length) {
			if (params[0].substr(0,1)=='+') { // read taglist from tiddler
				inc=inc.concat(store.getTiddlerText(params[0].substr(1),'').readBracketedList());
			} else if (params[0].substr(0,1)=='-') { // exclude taglist from tiddler
				ex=ex.concat(store.getTiddlerText(params[0].substr(1),'').readBracketedList());
			} else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags
				var tagged=store.getTaggedTiddlers(params[0].substr(1));
				for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);
			} else ex.push(params[0]); // exclude params
			params.shift();
		}
		// get all items, include/exclude specific items
		var items=[];
		var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();
		for (var t=0; t<list.length; t++) {
			var title=(links||refs)?list[t].title:list[t][0];
			if (links)	var count=this.getLinks(list[t]).length;
			else if (refs)	var count=store.getReferringTiddlers(title).length;
			else 		var count=list[t][1];
			if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))
				items.push({ title:title, count:count });
		}
		if(!items.length) return;
		// sort by decending count, limit results (optional)
		items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});
		while (limit && items.length>limit) items.pop();
		// find min/max and group size
		var most=items[0].count;
		var least=items[items.length-1].count;
		var groupSize=(most-least+1)/this.groups;
		// sort by title and draw the cloud of items
		items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});
		var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);
		for (var t=0; t<items.length; t++) {
			cloudWrapper.appendChild(document.createTextNode(' '));
			var group=Math.ceil((items[t].count-least)/groupSize)||1;
			var className='tagCloudtag tagCloud'+group;
			var tip=refs?this.refstip:links?this.linkstip:this.tagstip;
			tip=tip.format([items[t].title,items[t].count]);
			if (action=='goto') { // TAG/LINK/REFERENCES GOTO
				var btn=createTiddlyLink(cloudWrapper,items[t].title,true,className);
				btn.title=tip;
				btn.style.fontWeight='normal';
			} else if (!links&&!refs) { // TAG POPUP
				var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);
				btn.setAttribute('tag',items[t].title);
			} else { // LINK/REFERENCES POPUP
				var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,
					function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;
						var popup = Popup.create(this);
						var title = this.getAttribute('tiddler');
						var count = this.getAttribute('count');
						var refs  = this.getAttribute('refs')=='T';
						var links = this.getAttribute('links')=='T';
						var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);
						createTiddlyLink(popup,title,true);
						createTiddlyText(popup,label);
						createTiddlyElement(popup,'hr');
						if (refs) {
							popup.setAttribute('tiddler',title);
							config.commands.references.handlePopup(popup,title);
						}
						if (links) {
							var tiddler = store.fetchTiddler(title);
							var links=config.macros.cloud.getLinks(tiddler);
							for(var i=0;i<links.length;i++)
								createTiddlyLink(createTiddlyElement(popup,'li'),
									links[i],true);
						}
						Popup.show();
						e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();
						return false;
					}, className);
				btn.setAttribute('tiddler',items[t].title);
				btn.setAttribute('count',items[t].count);
				btn.setAttribute('refs',refs?'T':'F');
				btn.setAttribute('links',links?'T':'F');
				btn.title=tip;
			}
		}
	}
};
//}}}
Type the text for 'TagglyTagging'
Frodo bent his head. “And what do you wish?” he said at last. “That what should be shall be,” she answered.

-[[J.R.R. Tolkien]], [[The Lord of the Rings]]
The authoritative document on the teachings of the Catholic Church. An excellent reference.  The book is more than 800 pages. You may find some portions of it a bit deep in its philosophical and/or theological content, but I suggest that you still courageously plunge into its pages in order to get a deeper understanding of the faith. Just ask a priest or a learned Christian friend to help you sort out the more complex ideas in the book.

You can view the html document [[here|"http://www.vatican.va/archive/catechism/ccc_toc.htm"]].
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
Tells the history of mankind from an anthrocentric and Christocentric point of view- it explains why man is not just another kind of animal and why the Catholic Church is not just another kind of church.  Chesterton is a master of wit, juggling ideas and words with extreme mastery.  The book is a bit difficult to read at first, but read it the second and third time and you'll begin to appreciate (and love!) the author's fine humor and witty arguments.

[[Read an online copy of the book| http://www.worldinvisible.com/library/chesterton/everlasting/content.htm]]
[[View articles and quotations on The Everlasting Man|The Everlasting Man]]
Leo Trese is a chaplain of a university in the U.S. The Faith Explained is a good beginner's book on learning about the faith. It provides explanations of the central aspects of the Christian belief in a way that is easy to understand, thanks to the excellent illustrations and examples the author provides.

From Sinagtala.com:
The author illuminates the central elements of the Catholic faith in a lively, clear and direct style. Updated to include changes since the Second Vatican Council, this is an increasingly popular book for giving classes on basic Christian doctrine, as well as for personal study of the faith by interested non-Catholics.
A book for prayer which focuses on the human virtues and its necessity in the Christian life.

//From Escrivaworks.org://

What appears in these pages is Christian life itself, in which-at Christ's pace-the divine and the human are interwoven, not confused, and yet kept in perfect union.

Like The Way, Furrow is the fruit of St. Josemaria's interior life and experience with souls. It presents an attractive Christian vision of the human virtues. "Furrow is directed to the whole Christian person-body and soul, nature and grace," wrote Bishop Alvaro del Portillo in the foreword to the book.
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
The Way is a product of St.Josemaria's pastoral work of helping many young students and professionals find God in the middle of the world. An excellent book to get started in the life of prayer.

//From Escrivaworks.org//
The strength, the attraction of The Way is largely due to the fact that it is based on real, living experience, being the fruit of the author's work as a priest which began in 1925. The book appeared first in 1934 under the title Consideraciones espirituales and later (in 1939) received its definitive title, after being greatly expanded. Over the years, more than four and a half million copies have been sold, in 43 different languages.

This is one of the main attractions of the book-its direct, conversational style, its personal and deeply human character. As a reviewer in Osservatore Romano (March 24, 1950) put it: "Msgr. Escriva de Balaguer has written something more than a masterpiece; he has written straight from the heart, and straight to the heart go the short paragraphs which make up The Way."
That is perhaps the mightiest of the mysteries of the cave. It is already apparent that though men are said to have looked for hell under the earth, in this case it is rather heaven that is under the earth.

-[[G.K. Chesterton]], [[The Everlasting Man]]
And though no man knew it, the hour was near which was to end and to fulfill all things; and though no man heard it, there was one far-off cry in an unknown tongue upon the heaving wilderness of the mountains. The shepherds had found their Shepherd.

-[[G.K. Chesterton]], [[The Everlasting Man]]
Oh, what a melancholy choice this is, wanting home, wanting him... Closing my heart to every hope but his, leaving the home I love. There where my heart has settled long ago, I must go, I must go. Who could imagine I'd be wandering so far from the home I love. Yet... there with my love, I'm home.

- Fiddler on the Roof
/***
|''Name:''|TiddlersBarPlugin|
|''Description:''|A bar to switch between tiddlers through tabs (like browser tabs bar).|
|''Version:''|1.2.5|
|''Date:''|Jan 18,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demos
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], open several tiddlers to use the tabs bar.
!Installation
#import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
#save and reload
#''if you're using a custom [[PageTemplate]]'', add {{{<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>}}} before {{{<div id='tiddlerDisplay'></div>}}}
#optionally, adjust StyleSheetTiddlersBar
!Tips
*Doubleclick on the tiddlers bar (where there is no tab) create a new tiddler.
*Tabs include a button to close {{{x}}} or save {{{!}}} their tiddler.
*By default, click on the current tab close all others tiddlers.
!Configuration options 
<<option chkDisableTabsBar>> Disable the tabs bar (to print, by example).
<<option chkHideTabsBarWhenSingleTab >> Automatically hide the tabs bar when only one tiddler is displayed. 
<<option txtSelectedTiddlerTabButton>> ''selected'' tab command button.
<<option txtPreviousTabKey>> previous tab access key.
<<option txtNextTabKey>> next tab access key.
!Code
***/
//{{{
config.options.chkDisableTabsBar = config.options.chkDisableTabsBar ? config.options.chkDisableTabsBar : false;
config.options.chkHideTabsBarWhenSingleTab  = config.options.chkHideTabsBarWhenSingleTab  ? config.options.chkHideTabsBarWhenSingleTab  : false;
config.options.txtSelectedTiddlerTabButton = config.options.txtSelectedTiddlerTabButton ? config.options.txtSelectedTiddlerTabButton : "closeOthers";
config.options.txtPreviousTabKey = config.options.txtPreviousTabKey ? config.options.txtPreviousTabKey : "";
config.options.txtNextTabKey = config.options.txtNextTabKey ? config.options.txtNextTabKey : "";
config.macros.tiddlersBar = {
	tooltip : "see ",
	tooltipClose : "click here to close this tab",
	tooltipSave : "click here to save this tab",
	promptRename : "Enter tiddler new name",
	currentTiddler : "",
	previousState : false,
	previousKey : config.options.txtPreviousTabKey,
	nextKey : config.options.txtNextTabKey,	
	tabsAnimationSource : null, //use document.getElementById("tiddlerDisplay") if you need animation on tab switching.
	handler: function(place,macroName,params) {
		var previous = null;
		if (config.macros.tiddlersBar.isShown())
			story.forEachTiddler(function(title,e){
				if (title==config.macros.tiddlersBar.currentTiddler){
					var d = createTiddlyElement(null,"span",null,"tab tabSelected");
					config.macros.tiddlersBar.createActiveTabButton(d,title);
					if (previous && config.macros.tiddlersBar.previousKey) previous.setAttribute("accessKey",config.macros.tiddlersBar.nextKey);
					previous = "active";
				}
				else {
					var d = createTiddlyElement(place,"span",null,"tab tabUnselected");
					var btn = createTiddlyButton(d,title,config.macros.tiddlersBar.tooltip + title,config.macros.tiddlersBar.onSelectTab);
					btn.setAttribute("tiddler", title);
					if (previous=="active" && config.macros.tiddlersBar.nextKey) btn.setAttribute("accessKey",config.macros.tiddlersBar.previousKey);
					previous=btn;
				}
				var isDirty =story.isDirty(title);
				var c = createTiddlyButton(d,isDirty ?"!":"x",isDirty?config.macros.tiddlersBar.tooltipSave:config.macros.tiddlersBar.tooltipClose, isDirty ? config.macros.tiddlersBar.onTabSave : config.macros.tiddlersBar.onTabClose,"tabButton");
				c.setAttribute("tiddler", title);
				if (place.childNodes) {
					place.insertBefore(document.createTextNode(" "),place.firstChild); // to allow break line here when many tiddlers are open
					place.insertBefore(d,place.firstChild); 
				}
				else place.appendChild(d);
			})
	}, 
	refresh: function(place,params){
		removeChildren(place);
		config.macros.tiddlersBar.handler(place,"tiddlersBar",params);
		if (config.macros.tiddlersBar.previousState!=config.macros.tiddlersBar.isShown()) {
			story.refreshAllTiddlers();
			if (config.macros.tiddlersBar.previousState) story.forEachTiddler(function(t,e){e.style.display="";});
			config.macros.tiddlersBar.previousState = !config.macros.tiddlersBar.previousState;
		}
	},
	isShown : function(){
		if (config.options.chkDisableTabsBar) return false;
		if (!config.options.chkHideTabsBarWhenSingleTab) return true;
		var cpt=0;
		story.forEachTiddler(function(){cpt++});
		return (cpt>1);
	},
	selectNextTab : function(){  //used when the current tab is closed (to select another tab)
		var previous="";
		story.forEachTiddler(function(title){
			if (!config.macros.tiddlersBar.currentTiddler) {
				story.displayTiddler(null,title);
				return;
			}
			if (title==config.macros.tiddlersBar.currentTiddler) {
				if (previous) {
					story.displayTiddler(null,previous);
					return;
				}
				else config.macros.tiddlersBar.currentTiddler=""; 	// so next tab will be selected
			}
			else previous=title;
			});		
	},
	onSelectTab : function(e){
		var t = this.getAttribute("tiddler");
		if (t) story.displayTiddler(null,t);
		return false;
	},
	onTabClose : function(e){
		var t = this.getAttribute("tiddler");
		if (t) {
			if(story.hasChanges(t) && !readOnly) {
				if(!confirm(config.commands.cancelTiddler.warning.format([t])))
				return false;
			}
			story.closeTiddler(t);
		}
		return false;
	},
	onTabSave : function(e) {
		var t = this.getAttribute("tiddler");
		if (!e) e=window.event;
		if (t) config.commands.saveTiddler.handler(e,null,t);
		return false;
	},
	onSelectedTabButtonClick : function(event,src,title) {
		var t = this.getAttribute("tiddler");
		if (!event) event=window.event;
		if (t && config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton])
			config.commands[config.options.txtSelectedTiddlerTabButton].handler(event, src, t);
		return false;
	},
	onTiddlersBarAction: function(event) {
		var source = event.target ? event.target.id : event.srcElement.id; // FF uses target and IE uses srcElement;
		if (source=="tiddlersBar") story.displayTiddler(null,'New Tiddler',DEFAULT_EDIT_TEMPLATE,false,null,null);
	},
	createActiveTabButton : function(place,title) {
		if (config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton]) {
			var btn = createTiddlyButton(place, title, config.commands[config.options.txtSelectedTiddlerTabButton].tooltip ,config.macros.tiddlersBar.onSelectedTabButtonClick);
			btn.setAttribute("tiddler", title);
		}
		else
			createTiddlyText(place,title);
	}
}

story.coreCloseTiddler = story.coreCloseTiddler? story.coreCloseTiddler : story.closeTiddler;
story.coreDisplayTiddler = story.coreDisplayTiddler ? story.coreDisplayTiddler : story.displayTiddler;

story.closeTiddler = function(title,animate,unused) {
	if (title==config.macros.tiddlersBar.currentTiddler)
		config.macros.tiddlersBar.selectNextTab();
	story.coreCloseTiddler(title,false,unused); //disable animation to get it closed before calling tiddlersBar.refresh
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

story.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle){
	story.coreDisplayTiddler(config.macros.tiddlersBar.tabsAnimationSource,tiddler,template,animate,unused,customFields,toggle);
	var title = (tiddler instanceof Tiddler)? tiddler.title : tiddler;  
	if (config.macros.tiddlersBar.isShown()) {
		story.forEachTiddler(function(t,e){
			if (t!=title) e.style.display="none";
			else e.style.display="";
		})
		config.macros.tiddlersBar.currentTiddler=title;
	}
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

var coreRefreshPageTemplate = coreRefreshPageTemplate ? coreRefreshPageTemplate : refreshPageTemplate;
refreshPageTemplate = function(title) {
	coreRefreshPageTemplate(title);
	if (config.macros.tiddlersBar) config.macros.tiddlersBar.refresh(document.getElementById("tiddlersBar"));
}

ensureVisible=function (e) {return 0} //disable bottom scrolling (not useful now)

config.shadowTiddlers.StyleSheetTiddlersBar = "/*{{{*/\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .button {border:0}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar .tab {white-space:nowrap}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += "#tiddlersBar {padding : 1em 0.5em 2px 0.5em}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tabUnselected .tabButton, .tabSelected .tabButton {padding : 0 2px 0 2px; margin: 0 0 0 4px;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar += ".tiddler, .tabContents {border:1px [[ColorPalette::TertiaryPale]] solid;}\n";
config.shadowTiddlers.StyleSheetTiddlersBar +="/*}}}*/";
store.addNotification("StyleSheetTiddlersBar", refreshStyles);

config.refreshers.none = function(){return true;}
config.shadowTiddlers.PageTemplate=config.shadowTiddlers.PageTemplate.replace(/<div id='tiddlerDisplay'><\/div>/m,"<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>\n<div id='tiddlerDisplay'></div>");

//}}}
Add adsense
Add images
-Sort items by date of creation-
refresh button
We have come from God and inevitably the myths woven by us, though they contain error, will also reflect a splintered fragment of the true light, the eternal truth that is with God….Myths may be misguided …they steer however shakily towards the true harbor.” 

-[[J.R.R. Tolkien]] on [[Humphrey Carpenter]]’s [[J.R.R. Tolkien: A Biography]]
|~ViewToolbar|closeOthers closeTiddler +editTiddler > newHere fields syncing permalink references jump|
|~EditToolbar|saveTiddler -cancelTiddler copyTiddler deleteTiddler newHere|
|~ViewToolbar|closeTiddler +editTiddler copyTiddler newHere > closeOthers fields syncing permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler copyTiddler deleteTiddler newHere|
|~ViewToolbar|closeOthers closeTiddler +editTiddler > copyTiddler newHere fields syncing permalink references jump|
|~EditToolbar|saveTiddler -cancelTiddler copyTiddler deleteTiddler newHere|
//Click on a topic below to display all the articles and notes related to that topic.//
!Index of Topics
<<forEachTiddler
  where tiddler.tags.contains("topic")
  sortBy 'tiddler.title'
  write 
  '"[["+tiddler.title+"]]\n"' 
>>

//Click on a topic below to get a listing of all tiddlers tagged with that topic.//
!Tag Cloud of All Topics
<<cloud =topic>>
<<forEachTiddler
  where tiddler.tags.contains("category")
  sortBy 'tiddler.title'
  write 
  '"![["+tiddler.title+"]]+++[  »  ]<<list filter [tag["+tiddler.title+"]]$))===\n\n"' 
>>

/%
<<forEachTiddler
  where tiddler.tags.contains("category")
  sortBy 'tiddler.title'
  write 
  '"![["+tiddler.title+"]]\n<<list filter [tag["+tiddler.title
+"]]$))\n"' 
>>%/
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'asymptotes';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n")

});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 19/02/2010 10:52:20 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . |
| 17/07/2010 11:58:43 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . | failed |
| 17/07/2010 12:00:02 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . | ok |
| 17/07/2010 12:01:36 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . | ok |
| 17/07/2010 12:27:50 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . |
| 17/07/2010 14:13:13 | YourName | [[/|http://asymptotes.tiddlyspot.com/#%5B%5BEuler%27s%20Irrational%20Imagining%5D%5D]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . | ok |
| 17/07/2010 14:14:58 | YourName | [[/|http://asymptotes.tiddlyspot.com/#%5B%5BEuler%27s%20Irrational%20Imagining%5D%5D]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . |
| 17/07/2010 15:33:27 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . |
| 11/08/2010 18:20:13 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . | failed |
| 11/08/2010 18:21:20 | YourName | [[/|http://asymptotes.tiddlyspot.com/]] | [[store.cgi|http://asymptotes.tiddlyspot.com/store.cgi]] | . | [[index.html | http://asymptotes.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 3,
	date: new Date("Feb 24, 2008"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		if (!params) params = {};
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
};

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == 404)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");


//}}}

<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='tagged' macro='tags'></div>
<div class='subtitle'><span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--
<span macro='view modifier link'></span>,
-->
<!--}}}-->


We do not live in our own time alone, we carry our history with us.

- [[Jostein Gaarder]], [[Sophie`s World]]
We have to let God’s love break through the hard crust of our indifference, our spiritual weariness, our blind conformity to the spirit of this age.

-[[Benedict XVI]], [[World Youth Day 2008, Sydney]]
Dear young people, let me now ask you a question. What will you leave to the next generation? Are you building your lives on firm foundations, building something that will endure? How are you using the gifts you have been given…? What legacy will you leave to young people yet to come? What difference will you make?

-[[Benedict XVI]], [[World Youth Day 2008, Sydney]]
What we do in life echoes in eternity.

- Maximus in //Gladiator//
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/assymptote2copy.jpg]]

//Transcendental Asymptote was the name I first gave to my blog. This is the introductory note to that blog.//

No, this section is not for math geeks who want to discuss the asymptotic lines of transcendental functions like tangent and secant. Rather, this site highlights two fundamental aspects of man's existence. First, his attraction to the Transcendent- the One, the True, the Good and the Beautiful; and second, his life-long journey to try and possess It.  In mathematics, an asymptote is a line or curve towards which another curve approaches without ever meeting it (or, we can say, it meets the line/curve at infinity). For me, this summarizes our journey on earth- a life-long journey to approach The Transcendent, each day trying to get nearer, until we finally meet It at the infinity of our Timeline.

-NEWind
<<tabs tabContents 
"Authors" "List of Authors" [[Authors]]  
"Sources" "List of Sources" [[Sources]]
>> 
<<tiddler [[NewSourceTemplate]] with:{{tiddler.title}}>>
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/fermat_singh.jpg]]

//Published on page A15 of the July 09, 2005 issue of the Philippine Daily Inquirer.//

FAITH is reasonable, while science, to some extent, is founded on faith. These are two conclusions I made after pondering the relationship between faith and science.  It was a "mathematical novel" I read recently that influenced me to undertake the exercise. The book, titled "Fermat's Enigma," was written by Simon Singh, a Ph.D. in particle physics at the University of Cambridge. It tells of the epic quest to solve Fermat's Last Theorem, regarded as the greatest mathematical problem of all times. I could say that the exercise led me to some rather startling discoveries.

First, not everything in science has a proof. In fact, the whole of math, an abstract branch of science, is founded on statements that are so fundamental that they do not have proofs! These statements, called axioms, are either self-evidently true or else are assumed to be true.

Persons who espouse the philosophy of scientism accept only assertions that are supported by scientific proof. For this reason, they reject dogmas of faith. "Prove it to me!" they demand. "I could prove to you this mathematical theorem, can you prove to me that dogma in a similar way?"

But their challenge is empty of meaning, for not everything in science has a proof.

Second, scientific proof always contains at least a tiny element of doubt. Singh explains: "Scientific theory is merely considered highly likely based on observation and perception, both of which are fallible and provide only approximations to the truth. Science is operated according to the judicial system. A theory is assumed to be true if there is enough evidence to prove it 'beyond all reasonable doubt.'"

As example, he related scientists' continual search for the basic building blocks of the universe -- from the atoms of the 19th century up to present research on quarks. He shows how one theorem could be refined by another or, at times, completely replaced. Singh then explains that mathematical proofs, on the other hand, are built on axioms and logic, such that, "if the axioms are correct and the logic is flawless, then the conclusion will be undeniable."

Knowledge from math then is more stable than that from science. This is because math, unlike science, is not subject to the level of inaccuracy that comes from the observation of matter. Instead, knowledge is abstracted from matter.  But knowledge from faith is even more stable than knowledge from math. It comes neither from observation nor abstraction of matter. It comes directly from God, who can neither deceive nor be deceived.

Third, math admits it cannot prove everything. The mathematician Kurt Godel has proven that there are statements (apart from axioms) that math can neither prove nor disprove.

Now, this is very interesting. If math, the strictest of all branches of science, admits it cannot prove everything, then it follows that science, to a greater extent, cannot prove everything. Thus, the foundation of scientism crumbles!

But even without Godel's discovery, we should have arrived at the same conclusion. Man does not have a perfect knowledge of himself, even from a biological point of view. Mapping out the human genome is just the beginning of an enormous biological puzzle. So could he dare claim that he could explain everything in the universe?

Finally, a great part of science is founded on faith. In order to prove Fermat's Last Theorem, Andrew Wiles had to rely on the contributions of many great mathematicians before him. He did not try to prove again all of their theorems. Instead, he believed that their theorems were correct. He placed his faith, his human faith, in them.

Faith is an assent of the will to accept truths from another by virtue of his authority. Much of science is founded on faith. Many of us, scientists included, accept Einstein's theory of relativity because of his authority as a physicist and not because we understand his proof. But if we can put our faith in Einstein who was mortal and fallible, why can we not place it in God, who is immortal, infallible and the source of all authority?

It is not my intention to discredit science and math. The world has made significant progress because of them. But we cannot be deceived into thinking that they provide the answer to all questions. There are many questions that can only be answered by God. In fact, He has already answered some of them through the truths He has revealed.

We have to accept these truths even though we may not completely understand them. They are not unreasonable; rather, they are beyond reason. They are true not because we understand them but because they were revealed by God, the fullness of truth Himself.

- NEWind
[img[http://i777.photobucket.com/albums/yy51/newind/Asymptotes/theonering.jpg]]

//Being a commentary on The Lord of the Rings. A portion of this article appeared in the Youngblood section of The Philippine Daily Inquirer on January 1, 2004 under the title: ''Lord of the Rings: Not Just Fantasy''.//

<<<
"//Above all shadows rides the Sun.//”  
-[[J.R.R. Tolkien]], [[The Lord of the Rings]]
<<<


THE EPIC TRILOGY The Lord of the Rings will draw to a close with the showing of its last segment, The Return of the King.  The past two installments have left the viewers fascinated and terrified with the discovery of realms beautiful and dreadful, characters admirable and detestable, tales delightful and mournful, set in a land called Middle Earth.  

!!Fantasy and Reality
Fantasy, escape from reality, many would say.  But this is not how J.R.R. Tolkien, the author of this epic trilogy, envisioned it to be.  Tolkien saw fantasy as a plunge into reality rather than an escape from it.  Fantasy provides the writer a greater degree of freedom to emphasize certain aspects of truth.

There are some who suggest that The Lord of the Rings is an allegory, either biblical or historical. Tolkien rejected this idea.  He wrote in his foreword to The Lord of the Rings:  “I much prefer history, true or feigned, with its varied applicability to the thought and experience of readers.  I think that may confuse ‘applicability’ with ‘allegory’; but the one resides in the freedom of the reader and the other in the purposed domination of the author.”  Allegory for Tolkien is a crude form of literature.  He is more concerned about history and its applicability; in other words, about the truth and its application in life.
This is what we discover in The Lord of the Rings.  The book contains truths about man, his end, and his quest to reach that end.  It conveys realities that you and I encounter in real life.  The author would not be happy with a superficial treatment of his work.  The readers have to uncover the realities present in the book and to apply them in their lives.  This is what I now dare to undertake.
   
!!Existence of Evil
The Lord of the Rings tells about the quest of the free peoples of Middle Earth to overthrow the Dark Lord Sauron by destroying the One Ring that will allow him to take control of all the lands and inhabitants of Middle Earth.  Sauron, his One Ring, and his dwelling place Mordor, are forms of evil. So are the Balrog, the Ringwraiths, the Orcs, the Uruk-hai and Saruman.  These are the evil elements that Frodo and the rest of the protagonists in the story have to contend with. 

In the world we live in, we also find evil in its many forms.  War, poverty, and suffering are physical evils that are difficult to understand.  But even more difficult to understand are moral evils.  Why is there too little respect for human life, the dignity of the person, and the sacredness of sex?  Where now are the models of love, justice and purity?  Moral evil, sin, is the foundation of all evils.  Poverty, war, and suffering exist because Man has sinned, and continues to sin.

Frodo encountered different forms of evil in the story, including Gollum, a ring bearer once, who had succumbed to the evil spell of the One Ring. He asks Gandalf why his uncle Bilbo once spared the life of Gollum: “It’s a pity Bilbo didn’t kill him when he had the chance.”  Gandalf replies, “…Many that live deserve death.  Some that die deserve life.  Can you give it to them, Frodo?  Do not be too eager to deal out death in judgment.  Even the very wise cannot see all ends.” 
“If God exists, why is there evil in the world?” many would ask.  Gandalf sheds a light to the answer: “Even the very wise cannot see all ends.”  We, creatures that we are, however intelligent we may be, cannot see all ends.  We cannot see all the reasons behind the things that happen around us.  We only see one aspect of reality; we only see one piece of the puzzle of life that the Almighty has marvelously designed for our best.  Gandalf, moreover, tells Frodo, “My heart tells me that Gollum still has some part to play yet, for good or ill before this is over.” We see that God allows evil to draw out a greater good from it.  If Bilbo had killed Gollum, could Frodo and Sam have found their way to Mordor?  C.S. Lewis, a friend of Tolkien, believes that God allows suffering so that we can love and so that those who suffer can be loved. 

!!The Struggle Against Evil
    At the Prancing Pony, Aragorn describes the Ringwraiths to Frodo:  “They were once men.  Great kings of men. Then Sauron the Deceiver gave to them nine rings of power.  Blinded by their greed, they took them without questioning, one by one falling to darkness.  Now they are slaves to his will.  They are the Nazgul. Ringwraiths.“  The nine rings of men, and indeed the One Ring itself, could be viewed as symbols of pride, of sin.  In the Ringwraiths, we see the effects of sin.  In sin, you enjoy a greater “power” to do what you please, to do things without restriction. But little by little, it corrupts your innermost self, transforming you to a mere phantom, possessing so much and yet losing your very self.  Instead of enjoying the dignity of man, capable of doing good and knowing the truth, you end up behaving like an animal, submitting to your passions and instincts without the rule of reason.

Although God could make something good from evil, we cannot allow ourselves to fall under its clutches.  We have to wage war against it.  In The Lord of the Rings, this struggle between good and evil is not just presented in a grandiose way, e.g., in the grand battles that take place between the armies of elves, men, and dwarves against the armies of Sauron and Saruman.  It is also seen in some of the individual characters. Smeagol and his alter ego Gollum is one good example of this.  Smeagol-Gollum deliberates with himself whether he should help Frodo or betray him so that he could take possession of the One Ring.
This happens to each one of us also.  Each one of us has to wage that war between good and evil in the intimacy of our soul.  It is only through conquering that battle that we will begin to contribute to the good of society.

!!Discovering Our Mission
Galadriel looks at Frodo and says, “This task has been appointed to you, and if you don’t find a way, no one will.”  Frodo has received a mission of colossal importance, affecting not him alone, but the entire Middle Earth.  To accomplish it, he must go against his inclinations to peace and quiet and launch himself out into a dangerous adventure.

We also have our own mission in life that we need to discover.  How many of us know this?  How many of us live with a sense of direction?  How many of us live only for the day, living each day without knowing how or asking why?  Each one of us has to ask himself, “What is my mission in life?  What does God want me to accomplish in this life?  How can I have a positive influence to those around me, and to society in general?”  Great evils, physical and moral, exist in world. What am I doing about them? Like Frodo, each one of us has received a mission, in a specific way, to combat the evils that exist in the world. We cannot shrink from this responsibility. 

!!Divine Providence
Even if the odds are against us, we should not lose heart, but instead courageously face our war, for Divine Providence will be at our side. In The Lord of the Rings we see the protagonists struggling to attain a great good – the freedom from the tyranny of Sauron- through seemingly insurmountable difficulties and obstacles, against antagonists possessing overwhelming power and strength. With much effort and sacrifice, they conquer in the end.  If we dare go against the evils in this world, we should expect difficulties and sacrifice.  With the little efforts we exert to overcome these difficulties, Divine Providence will make us victorious in the end.  Joseph Pearce, author of the book “Tolkien: Man and Myth”, in an interview with Zenit News Agency, remarks, “Throughout the whole of The Lord of the Rings the forces of evil are seen as powerful but not all-powerful.  There is always the sense that divine providence is on the side of the Fellowship and that, ultimately, it will prevail against all the odds.  As Tolkien put it succinctly, ‘Above all shadows rides the Sun.’”

!!Conclusion
I do not wish to establish a new religion with The Lord of the Rings as the Holy Book.  My only wish is that we appreciate Tolkien’s work according to his vision, that is, as a history that can be applied to our own life. Like the protagonists in the film, may we not be afraid to wage a war against the evils in our own world -  sensuality, selfishness and consumerism.  Like Frodo, may we be courageous to seek and pursue our mission in life. And like like Tolkien, may we never lose faith in God, the Sun who, above all shadows, will shine through.

[[Download a PDF version of this article|http://images.newind.multiply.multiplycontent.com/attachment/0/RyRaPAoKCoEAABIPc4I1/Reflections%20on%20The%20Lord%20of%20the%20Rings.pdf?nmid=63905325]]
"Even now there is hope left... But this I will say to you: your Quest stands upon the edge of a knife. Stray but a little and it will fail, to the ruin of all. Yet hope remains while all the Company is true." 

-[[J.R.R. Tolkien]], [[The Lord of the Rings]]
Type the text for 'action'
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<html>
<a href="http://csshtmltutorial.com">
<img src="http://csshtmltutorial.com/counter.php?display=hits&style=510" alt="Free Web Hit Counter By CSS HTML Tutorial" border="0" />
</a>
</html>
/%
19-2010.01.10
15-2010.01.09
%/
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
Completed document conversion. Do not delete this tiddler unless you want to rebuild the action metadata.

This tiddler also contains document-specific preferences which, if deleted, will revert to default settings.
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
Type the text for 'gtd'
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
Type the text for 'hide'
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
Type the text for 'pluginInfo'
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
Type the text for 'systemConfig'
Type the text for 'template'
Type the text for 'category'
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>
<<tiddler [[NewTopicTemplate]] with:{{tiddler.title}}>>