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]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and 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;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton {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 closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></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 +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
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
----
!!!Beer Information
*Name:
*Style:
*ABV:
*IBU:
*SRM:
*Calories:
!!!Awards
*Not Submitted
!!!Description
Description goes here
!!!Brewer's Notes
N/A
!!!Photographs

----
----
!!!Beer Information
*Name: American Light
*ABV: 2.3%
*IBU: 11
!!!Description
Brew based on: Munton's American Light
Modifications: none

Straw Colour with golden hues and a lacy white head. Light floral aromas follow through on a light to medium bodied palate with subtle malt and hop flavours and a clean finish.
!!!Brewer's Notes
The brew was bottled too quickly, resulting in an over carbonated beer with halted fermentation. Documentation of the disposal added for posterity.
!!!Photographs
[img[beer001|http://zanegreen.com/images/beer001.jpg]]

----
----
!!!Beer Information
*Name: Amber Ale
*Style: American Amber Ale
*ABV: 4.2%
*IBU: 13.5
*SRM: 7.7
*Calories: 135
!!!Description
Brew based on: True Brew Amber Ale
Modifications: none

Well hopped and smooth. Made with Amber malt, balanced with 1 oz hops.
!!!Brewer's Notes
Low boil volumes reduced bitterness. A yeast flavor was quite strong through the first five weeks after bottling.
!!!Photographs
[img[beer002|http://zanegreen.com/images/beer002.jpg]]

----
----
!!!Beer Information
*Name: Belgian Ale
*Style: Belgian Specialty Ale
*ABV: 6.8%
*IBU: 12.0 
*SRM: 6.7
*Calories: 192
!!!Description
Brew based on: True Brew Belgian Ale
Modifications: none

This kit produces a strong and spicy golden ale. Made with authentic Belgian Candy Sugar, balanced with Czech and Slovenian hops and fermented with a Belgian Yeast.
!!!Brewer's Notes
Abbey notes quite prominent. I was very pleased with the progress of my brewing with this beer. I will brew a variation of this in the future again.
!!!Photographs
[img[beer003|http://zanegreen.com/images/beer003.jpg]]

----
----
!!!Beer Information
*Name: Honey Wood
*Style: Specialty Beer (based on Blonde Ale)
*ABV: 4.2%
*IBU: 14.0
*SRM: 6.6
*Calories: 155
!!!Awards
*2011-2012 Rocky Mtn Homebrew Challenge Score: 30
!!!Description
This is a light crisp and refreshing ale consisting of over 50% honey aged over hickory.
!!!Brewer's Notes
Hickory was not noticeable at all. Honey fermented out the beer was mostly flavorless.
!!!Photographs
[img[beer004|http://zanegreen.com/images/beer004.jpg]]

----
----
!!!Beer Information
*Name: Ferocious IPA
*Style: American IPA
*ABV: 5.9%
*IBU: 56.2
*SRM: 11.9
*Calories: 202
!!!Description
This IPA uses 6 ounces of hops to create a bold brew that is rich in malt sweetness infused with bright hop flavor and aroma.
!!!Brewer's Notes
This was my first attempt at dry hopping. Hop flavor was favorable, however, yeast flavor and bitterness were overpowering.
!!!Photographs
[img[beer005|http://zanegreen.com/images/beer005.jpg]]

----
----
!!!Beer Information
*Name: Speckled Heifer
*Style: Cream Ale
*ABV: 3.9%
*IBU: 19.6
*SRM: 3.6
*Calories: 140
!!!Awards
*2011-2012 Rocky Mtn Homebrew Challenge Score: 30
!!!Description
Those among us who are or were farmboys and -girls will correctly identify them as Holsteins; to the rest of the citified, sissified world they're "spotted cows." This multigrained Midwestern take on the American cream ale is an uncomplicated, unfussy, lovable guzzler. Pouring straw gold with a snowy pillow of froth, the nose is gentle and sweet, full of its constituent blend of malted and flaked barley and corn, and the flavor is more of the same. Hops give a little whisper of flowers and spice from the background. 
!!!Brewer's Notes
Very low flavor. Criticized for corn flavor in a beer historically brewed with corn.
!!!Photographs
[img[beer006|http://zanegreen.com/images/beer006.jpg]]

----
----
!!!Beer Information
*Name: Cynic Ale
*Style: Siason
*ABV: 4.5%
*IBU: 23.6
*SRM: 9.2
*Calories: 187
!!!Awards
*2011-2012 Rocky Mtn Homebrew Challenge Score: 35
!!!Description
Australian malted barley, English oats and Belgian yeast create honey & black pepper flavors. Lively Slovenian hops provide the floral, apricot and peach notes. Toss your doubts away, toss one back and enjoy!
!!!Brewer's Notes
An excellent saison. Cracked pepper and vanilla notes present. Aged even better bottle conditioned.
!!!Photographs
[img[beer007|http://zanegreen.com/images/beer007.jpg]]

----
----
!!!Beer Information
*Name: Sacajawea Falls
*Style: American Wheat Ale
*ABV: 3.7%
*IBU: 27.8
*SRM: 5.8
*Calories:
!!!Awards
*2011-2012 Rocky Mtn Homebrew Challenge Score: 24
!!!Description
A little sexy from the sweet malts of American 2-row barley, American summer wheat, and German munich; like a tan on a sweet woman. A little attitude from Tomahawk hops and wet Cascade hops. This is the kind of beer that will break your skull, but you'll enjoy every sweet, slow, and spicy second.
!!!Brewer's Notes
This was my first all-original recipe. Way too many cara-pils resulted in a super foamy beer. The wet hops smelled somewhat pungent. It was a very flavorless beer.
!!!Photographs
[img[beer008|http://zanegreen.com/images/beer008.jpg]]

----
----
!!!Beer Information
*Name: Absint Ale
*Style: Belgian Tripel
*ABV: 8.2%
*IBU: 24.6
*SRM: 6.1
*Calories: 257
!!!Description
And the third angel sounded, and there fell from heaven a great star, burning as a torch, and it fell upon the third part of the rivers, and upon the fountains of the waters; and the name of the star is called Wormwood: and the third part of the waters became wormwood; and many men died of the waters, because they were made bitter. - Revelations 8:10-11, American Standard Edition

A beer so profound it is spoke of in prophecy. Enigmatic in creation, this beer is a accumulation of the history of fermentation, from the beginning of man's discovery to the rapture itself.

Brewed with Wormwood, the second most bitter herb on the planet and the herb most used to preserve fermented and distilled alcohols prior to the discovery of hop addition. It is widely most famous for its presence in Absinth Liquor, aka the Green Fairy, illegal in the US until 2008. When boiled, the chemical thujone is formed, a believed phsycoaddictive hallucinogenic drug.

The yeast used is official Trappist, created and cultivated by one of only six brewing monestaries dating back to the 5th century under the guidance of monks. For the angels and third seat trumpet players to favor this beer, it must be blessed properly.

The ale, inspired by Absinth liquor is higher in alcohol content than a traditional ale using over 15 lbs of grains, reflecting the 150 proof typical Absinth. Absinth is typically found as emerald green in color from the Star Anise herb (a black liquorish flavored herb not present in this ale). Methods to tint the beer green without the use of dye are being research via Spirulina, an algae grown in Hawaii. Maltodextrine was added as an unfermentable sugar substitute to balance the bitterness; Absinth is typically drank by pouring over a sugar cube into a glass of water to cut the bitterness.

Foretold by Revelations. Lesser men will perish. Are you worthy? 
!!!Brewer's Notes
A very delicious tripel. The base recipe is a keeper. The wormwood is delicious, but even 0.25 oz for the last 5 mins of boil produced so much bitterness, once you swallowed, your pallet was destroyed. While I grew to enjoy this beer for something so different, it was not well received by anyone else.
!!!Photographs
[img[beer009|http://zanegreen.com/images/beer009.jpg]]

----
----
!!!Beer Information
*Name: St. Ciara
*Style: Irish Red
*ABV: 6.2%
*IBU: 26.6
*SRM: 19.1
*Calories: 194
!!!Description
A full-body ale, rich in malt complexity. Brewed with a combination of American, English and specialty malts, this beer hints of roasted chocolate, caramel and raisins with very little hop presence. 
!!!Brewer's Notes
N/A
!!!Photographs

----
----
!!!Beer Information
*Name: Smoke Hog
*Style: Wood Aged Beer
*ABV: 6.3%
*IBU: 31.1
*SRM: 10.9
*Calories: 265
!!!Description
Brewed with smoked malt, fermented to perfection, & dry hogged with applewood smoked bacon. Is this the coolest brew ever made? It might possibly be.
!!!Brewer's Notes
I created an infused bacon vodka using the grease of 1 lb of applewood smoked bacon. After filtering the vodka, it was added to the beer. What resulted was a very subtle bacon flavor inside a smoked beer. It was either loved or hated.
!!!Photographs
[img[beer011|http://zanegreen.com/images/beer011.jpg]]

----
----
!!!Beer Information
*Name: Baby Brew
*Style: Fruit Beer
*ABV: 7.4%
*IBU: 19.9
*SRM: 5.4
*Calories: 258
!!!Description
Extreme fruit brewing! What better way than to welcome my third child into the world than a beer with 8 lbs of fruit used to tint the beer blue.
!!!Brewer's Notes
Fruit was added in the secondary and left for 10 days. At this point, the fruit flavor was very strong and had a wine flavor. Less fruit and less time in secondary should be used in the future.
!!!Photographs

----
----
!!!Beer Information
*Name: Hell Ship IPA
*Style: American IPA
*ABV: 5.2%
*IBU: 73.0
*SRM: 8.7
*Calories: 165
!!!Description
When the 56 men signed the Declaration of Independence, they committed treason against the Crown. For this, they knowingly sacrificed their lives, their fortunes and their families. No sacrifice is perhaps greater than New Jersey signer, Abraham Clark. His two sons were captured and enslaved in the infamous British prison afloat in the New York Harbor known as the hell ship Jersey where 11,000 American captives died. The sons were treated with special brutality because of their father. With the war almost over, Clark was requested to recant and come out for the King and Parliament in exchange for the lives of his sons. His response, felt even now 200 years later, was "No".

With over 7.5 oz of hops, this IPA tantalizes you with undertones of citrus and herbal aromas and flavors. Combined with a yeast specially picked to emphasize the hop profile, Hell Ship is a wonderful beer to toast the sacrifices of our founding fathers.
!!!Brewer's Notes
Not enough balance between the hops and bitterness; resulted in a very bitter IPA. The use of roasted malt to add complexity was not well received stating the beer was too dark for the style.
!!!Photographs
[img[beer013|http://zanegreen.com/images/beer013.jpg]]

----
----
!!!Beer Information
*Name: Hedonism
*Style: American Stout
*ABV: 4.6%
*IBU: 35.9
*SRM: 29.9
*Calories: 172
!!!Description
A complex malt of American, British, and German grains combine to give this beer a deep chocolate and roasted body. Thrice hopped with heaping amounts of German and American hops for aroma and flavor. This succulent ale is something to cheer over for those that are aroused by both malt and hops. Toss one back and experience the pleasure.
!!!Brewer's Notes
Slightly dry, but good baseline stout.
!!!Photographs
[img[beer014|http://zanegreen.com/images/beer014.jpg]]

----
----
!!!Beer Information
*Name: Vanity Pilsner
*Style: Bohemian Pilsner
*ABV: 4.1%
*IBU: 38.9
*SRM: 4.5
*Calories: 134.8
!!!Description
Anne Bonney and Mary Read are the most famous -- and ferocious -- women pirates in history. They sailed under Captain Jack Rackham (Calico Jack) on the pirate ship 'Vanity'. Both Anne and Mary were known for their violent tempers and ferocious fighting, and they shared a reputation as "fierce hell cats." Their fellow crewmembers knew that -- in times of action -- no one else was as ruthless and bloodthirsty as these two women were. 

Their pirate life ended November 16, 1720, when Captain Jack and his crew were sentenced to hang. Anne was allowed to visit her lover in his cell before his execution, and instead of the consoling, loving words he was undoubtedly expecting, her scathing comments live on throughout history: "Had you fought like a man, you need not have been hang'd like a dog."

This Bohemian Pilsner, with floral and herbal hops, reminds us to never underestimate the loving actions of women. Cheers to you pirate wenches!
!!!Brewer's Notes
This beer was my first attempt at a lager. I waited until temps decreased to sub-zero outside and fermented in the garage in a water bath. Temps were nearly perfect for desired. The beer tasted spot on when I racked to a secondary. However, when the beer warmed up (with some yeast still present in the secondary), the flavor of the beer changed drastically and produced a product that was good but not near style like as prior.
!!!Photographs
[img[beer015|http://zanegreen.com/images/beer015.jpg]]

----
----
!!!Beer Information
*Name: Wee Scottish Lass
*Style: Scottish Light 60/-
*ABV: 2.6%
*IBU: 13.4
*SRM: 15.1
*Calories: 76.0
!!!Description
You don't always need a big ABV. Consider this 76 calorie session a Wee Scottish Lass company for the night.

This ale instills a clean malty with a drying finish, perhaps a few esters, and on occasion a faint bit of peaty earthiness (smoke). It finish fairly dry considering their relatively sweet palate, and as such have a different balance than strong Scotch ales. It was fermented long and cool, as traditionally used in Scottish brewing, and the malt-hop balance is slightly to moderately tilted towards the malt side.
!!!Brewer's Notes
I began adding different elements into my brew day to either speed up the brew day or to help with off flavors in the finished product. In doing so, I added an off flavor that was not desirable at all.
!!!Photographs

----
----
!!!Beer Information
*Name: Vajazzle
*Style: Vanilla Porter
*ABV: 6.4%
*IBU: 23.3
*SRM: 26.2
*Calories: 204.2
!!!Description
Vajazzle: A combination of the words vagina and bedazzle. Vajazzling is the act of a woman affixing Swarovski crystals or other sparkly items to their vagina and surrounding area. Vajazzling is accredited to Jennifer Love Hewitt who first mentioned vajazzling during an interview on the Lopez Show on 1/12/2010.

A Baltic Porter often has the malt flavors reminiscent of an English brown porter and the restrained roast of a schwarzbier, but with a higher OG and alcohol content than either. Very complex, with multi-layered flavors. Traditional beer from countries bordering the Baltic Sea. Derived from English porters but influenced by Russian Imperial Stouts. Authentic 10 yr aged mexican vanilla has been added for a truly unique flavor.
!!!Brewer's Notes
The vanilla was overpowering and I was struggling with a sulfur flavor, later to be determined as my Camden tablet addition to reduce chlorine. This was not a successful batch.
!!!Photographs

----
----
!!!Beer Information
*Name: The Devil's Panties
*Style: Brown Porter
*ABV: 4.2%
*IBU: 25.1
*SRM: 20.6
*Calories: 141.5
!!!Description
We don't really know what kind of panties the Devil has in his collection. But we imagine they'd taste like this...

This is a fairly substantial English dark ale with restrained roasty characteristics. Originating in England, porter evolved from a blend of beers or gyles known as "Entire." A precursor to stout, it is said to have been favored by porters and other physical laborers. It differs from a robust porter in that it usually softer, sweeter and more caramelly flavors, lower gravities, and usually less alcohol. It has more substance and roast than a brown ale, and a higher in gravity than a dark mild. The balance tends toward malt more than hops. Sweet clover honey was added late in the brewing process for touch of aromatic sweetness.
!!!Brewer's Notes
The Devil's Panties taste horrid. Camden tablets produce a very strong sulfur flavor. Sulfur, while perhaps accurate to the environment of say a lake of fire, does not add a favorable response.
!!!Photographs

----
----
!!!Beer Information
*Name: 13 Gauge
*Style: American IPA
*ABV: 5.9%
*IBU: 65.8
*SRM: 12.2
*Calories: 197.5
!!!Description
Conceived on Friday the 13th, there is only one way to survive a cannibal, lesbian, serial killer, alien, zombie. And that's with your trusty sawed-off.

An English IPA was brewed to survive the voyage from England to India. The temperature extremes and rolling of the seas resulted in a highly attenuated beer upon arrival. English pale ales were derived from India Pale Ales: a pale ale brewed to an increased gravity and hop rate. This is an American IPA version, brewed using American ingredients and attitude.

Fresher versions will obviously have a more significant finishing hop character.
!!!Brewer's Notes
This was the next evolutionary step in my quest for the perfect IPA. Too bitter, not balanced right, hops not citrus enough.
!!!Photographs

----
----
!!!Beer Information
*Name: Ginger Thursday
*Style: Belgian Dubbel
*ABV: 6.3%
*IBU: 16.9
*SRM: 17.0
*Calories: 192.7
!!!Description
Because we all need a little ginger... on a thursday... every thursday.

A Belgian Dubbel (often referred to as an Abbey) is a deep reddish, moderately strong, malty, complex Belgian ale. Originated at monasteries in the Middle Ages, and was revived in the mid-1800s after the Napoleonic era. A Dubbel may have hints of chocolate, caramel and/or toast. Moderate fruity esters (usually including raisins and plums, sometimes also dried cherries). Esters sometimes include banana or apple. Spicy phenols and higher alcohols are common (may include light clove and spice, peppery, rose-like and/or perfumy notes). Spicy qualities can be moderate to very low. Alcohol, if present, is soft and never hot or solventy. A small number of examples may include a low noble hop aroma, but hops are usually absent. Dark amber to copper in color, with an attractive reddish depth of color. Generally clear. Large, dense, and long lasting creamy off-white head.
!!!Brewer's Notes
This beer became the turning point from okay beer to good beer, with brief grasps into excellent beer. This beer was extremely cloudy and no amount of brightening seemed to drop the yeast out. It, thus had a good beer flavor ruined by the flavor of yeast. This was the first beer I filtered, having no other idea what to do to clean up the very fine particles. It made a whole new beer. One so good, I drank all 5 gallons in 2 days. Thus why Ginger Thursday will always have a special place in my heart.
!!!Photographs

----
----
!!!Beer Information
*Name: Barely Legal Milk Stout
*Style: Sweet Stout
*ABV: 6.0%
*IBU: 27.2
*SRM: 31.7
*Calories: 182.2
!!!Description
Pushing the limits of ABV for the style, you'd swear this sweet was jailbait. But it's not... just barely.

A very dark, sweet, full-bodied, slightly roasty ale. Often tastes like sweetened espresso. An English style of stout. Historically known as "Milk" or "Cream" stouts, legally this designation is no longer permitted in England (but is acceptable elsewhere). The "milk" name is derived from the use of lactose, or milk sugar, as a sweetener.
!!!Brewer's Notes
A touch sweet, but otherwise an excellent milk stout. I was very pleased with this beer.
!!!Photographs

----
----
!!!Beer Information
*Name: Skittlebrau
*Style: Belgian Witbier
*ABV: 5.3%
*IBU: 9.9
*SRM: 4.5
*Calories: 170.4
!!!Description
Homer Simpson: I'm feeling kind of low, Apu. Got any of that beer that has candy floating in it? You know, Skittlebrau.
Apu: Such a product does not exist, sir. I think you must have dreamed it.
Homer Simpson: Oh ... well, then just give me a six-pack and a couple of bags of Skittles.

It exists now. Brewed with nearly a pound of Skittles. Yes, that's right.

A refreshing, elegant, tasty, moderatestrength wheat-based ale. A 400-year-old beer style that died out in the 1950s; it was later revived by Pierre Celis at Hoegaarden, and has grown steadily in popularity over time. The presence, character and degree of spicing and lactic sourness varies. Coriander and orange peels are often added.
!!!Brewer's Notes
There is only one way to describe this beer, and that's with song: http://www.youtube.com/watch?v=xcLkexy6jZI
A touch cidary and too light of body (that much sugar adjunct almost makes the beer taste watered down). But good. Esp. bottle conditioned.
!!!Photographs

----
----
!!!Beer Information
*Name: Slag RIPA Track A & Track B
*Style: American Rye IPA
*ABV: 6.2%
*IBU: 61.9
*SRM: 14.5
*Calories: 223.6
!!!Description
In pursuit of the perfect IPA, this was an attempt to further perfect the minor balance issues of previous IPA beers that I've brewed. A 10 gallon batch was brewed, split between two fermenters and pitched with two different yeasts:
Track A: American Yeast
Track B: British Yeast
!!!Brewer's Notes
It's a drinkable IPA. Not the best IPA I've ever had, but the best I've ever brewed. No real difference between yeasts with the hop flavors. I'm getting a grassy flavor in the dry hop.
!!!Photographs

----
----
!!!Beer Information
*Name: Graham Cracker Ale - Track A & Track B
*Style: Specialty Ale
*ABV: 5.9%
*IBU: 22.1
*SRM: 16.3
*Calories: 182.3
!!!Description
Trying something a little different - graham crackers, bakers chocolate and brown sugar were added to choice malts for an experimental brew.
A 10 gallon batch was brewed, split between two fermenters and pitched with two different yeasts:
Track A: American Yeast
Track B: British Yeast
!!!Brewer's Notes
Excellent winter beer; a touch sweet. Otherwise balanced and excellent flavor. A red like ale with sweet notes. Best reviews among tasting peers to date.
!!!Photographs

----
----
!!!Beer Information
*Name: Smoking Bust Porte - Track A & Track B
*Style: Robust Porter
*ABV: 4.7%
*IBU: 24.6
*SRM: 26.4
*Calories: 154.0
!!!Description
A light porter with hints of chocolate, black, and smoked malts.
A 10 gallon batch was brewed, split between two fermenters and pitched with two different yeasts:
Track A: American Yeast
Track B: British Yeast
!!!Brewer's Notes
I had purchased too much smoked malt and wanted to add a subtle flavor. Instead I over "smoked" this beer. I find the malt non-consistent and overpowering at times. As it appeals to such a small niche following, I am giving up on the malt other than if I ever brew the bacon beer again.
!!!Photographs

----
----
!!!Beer Information
*Name: Donkey Punch Cowgirl v1.0
*Style: Robust Porter
*ABV: 6.2%
*IBU: 36.1
*SRM: 21.5
*Calories:
!!!Description
A beautiful red ale with roasted character.
!!!Brewer's Notes
Brewed with a light body, this beer could be passed off as a red ale or a dark amber. Excellent beer. Excellent. Well received and often requested.
!!!Photographs

----
----
!!!Beer Information
*Name: 16 Jones
*Style: American IPA
*ABV: 4.7%
*IBU: 52.7
*SRM: 6.6
*Calories:
!!!Description
16 Jones is the daughter of South African Zef Band "Die Antwoord". Unique, Original, Simply Complex.
!!!Brewer's Notes
I scrapped my house recipe for IPA and went back to basics. Simplified IPA. Base recipe good; hop mix still needs work for dry hopping.
!!!Photographs

----
----
!!!Beer Information
*Name: Two Princes
*Style: Fruit Beer
*ABV: 4.7%
*IBU: 11.6
*SRM: 7.4
*Calories:
!!!Description
Primarily a wheat beer. Batch was split and half artificially flavored with Peach and half artificially flavored with Apricot.
!!!Brewer's Notes
As part of the big brew day (2012), I brewed up an extract beer (wheat). I always wondered ingredients had a large flavor impact on my beers in those early batches before going to all-grain. I used liquid extract. The flavor had a home-brew funk to it from the first batches that was not good. Extract (at least liquid), does indeed impart an undesirable flavor.
!!!Photographs

----
----
!!!Beer Information
*Name: Donkey Punch Cowgirl v1.1
*Style: Robust Porter
*ABV: 6.2%
*IBU: 36.9
*SRM: 21.4
*Calories:
!!!Description
Rebrew of the most requested ale I've brew. Recipe was modified slightly based on available ingredients and 2° F higher, producing a thicker more porterlike ale.
!!!Brewer's Notes
There was some talk about Camden Tablets being used again town. 1 tablet used in this batch: sulfur flavor. Evidently, I needed to learn this lesson again.
!!!Photographs

----
----
!!!Beer Information
*Name: SMASH
*Style: American Pale Ale
*ABV: 4.7%
*IBU: 32.2
*SRM: 3.6
!!!Description
Brewclub Experiment:
Brew up the following recipe for a 5 gallon batch and compare how brewing styles differ among each other:

10 lb 2-Row 
3 oz Cascade Hops
Safale US05 yeast

Hop Addition Times (inc. dry hopping if desired) are up to the brewer.
Water Conditioning are up to the brewer.
Fermentation temps and duration are up to the brewer.
Brightening and Finishing are up to the brewer.

10 gallons brewed, 1/2 pitched with a California Yeast and dry hopped with non-cascade hops.
!!!Awards
*The Cal Yeast & non-cascade hop version was submitted.
*2014 National Homebrew Competition: 26
*Overall Comment: "Add Crystal to Balance"
!!!Brewer's Notes
Extremely light body and flavor prior to dry hopping. 

----
----
!!!Beer Information
*Name: Ginger Thursday v1.1
*Style: Belgian Dubbel
*ABV: 6.3%
*IBU: 18.0
*SRM: 16.4
*Calories: 
!!!Description
Rebrew of the Ginger Thursday brew while simplifying the malt recipe.
Batch was split into 2. Half was pitched with traditional Belgian yeast, the second was pitched with English yeast.
!!!Brewer's Notes
Both batches are cloudy. An extended means to flocculate the yeast is currently being done.
Currently, both suffer from yeast flavors overriding the beer flavors. Regardless, the dubbel is not as strong, brandy, or plum like as desired. Body is too light. It's along the lines of a dark or amber Belgian wit flavor. I am disappointed in the recipe change results.
The English Red version may be a decent amber style ale if the yeast drops.
!!!Photographs

----
----
!!!Beer Information
*Name: Habanero Porter
*Style: Robust Porter
*ABV: 4.9%
*IBU: 52.0
*SRM: 34.7
*Calories:
!!!Awards
*Not Submitted
!!!Description
Robust Porter dry hopped with a Habanero Pepper.
!!!Brewer's Notes
N/A
!!!Photographs

----
----
!!!Beer Information
*Name: Still Water
*Style: Maibock
*ABV: 6.5%
*IBU: 29.4
*SRM: 15.1
!!!Description
Description goes here
A pale version of a traditional bock. While quite malty, this beer typically has less dark and rich malt flavors than a traditional bock. May also be drier, hoppier, and more bitter than a traditional bock. The hops compensate for the lower level of melanoidins.

Half the batch was piched with a Mexican lager yeast.
N/A
!!!Photographs

----
----
!!!Beer Information
*Name: 314
*Style: Old Ale
*ABV: 6.0%
*IBU: 39.4
*SRM: 17.9
!!!Description
An ale of significant alcoholic strength, bigger than strong bitters and brown porters, though usually not as strong or rich as barleywine. Usually tilted toward a sweeter, maltier balance. “It should be a warming beer of the type that is best drunk in half pints by a warm fire on a cold winter’s night” – Michael Jackson.
!!!Brewer's Notes
N/A
!!!Photographs

----
/***
''Name:'' Calendar plugin
''Version:'' <<getversion calendar>> (<<getversiondate calendar "DD MMM YYYY">>)
''Author:'' SteveRumsby

''Configuration:''

|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|

''Syntax:'' 
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|

***/
// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.

// // ''Changes by ELS 2005.10.30:''
// // config.macros.calendar.handler()
// // ^^use "tbody" element for IE compatibility^^
// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^
// // createCalendarDays()
// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^
// // calendar stylesheet definition
// // ^^use .calendar class-specific selectors, add text centering and margin settings^^

//{{{
config.macros.calendar = {};

config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "R", "F", "S", "S"];

config.macros.calendar.weekendbg = "#f3f3f3";
config.macros.calendar.monthbg = "#eeece1";
config.macros.calendar.holidaybg = "#eeece1";

//}}}
// //''Code section:''
// (you should not need to alter anything below here)//
//{{{
if(config.options.txtCalFirstDay == undefined)
 config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
 config.options.txtCalStartOfWeekend = 5;

config.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>> 

version.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}

// //Is the given date a holiday?
//{{{
function calendarIsHoliday(date)
{
 var longHoliday = date.formatString("0DD/0MM/YYYY");
 var shortHoliday = date.formatString("0DD/0MM");

 for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
 if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {
 return true;
 }
 }
 return false;
}
//}}}

// //The main entry point - the macro handler.
// //Decide what sort of calendar we are creating (month or year, and which month or year)
// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.
// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//
// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//
//{{{
config.macros.calendar.handler = function(place,macroName,params)
{
 var calendar = createTiddlyElement(place, "table", null, "calendar", null);
 var tbody = createTiddlyElement(calendar, "tbody", null, null, null);
 var today = new Date();
 var year = today.getYear();
 if (year<1900) year+=1900;
 if (params[0] == "thismonth")
 {
 cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, today.getMonth());
 } 
 else if (params[0] == "lastmonth") {
 var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
 cacheReminders(new Date(year, month, 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, month);
 }
 else if (params[0] == "nextmonth") {
 var month = today.getMonth()+1; if (month>11) { month=0; year++; }
 cacheReminders(new Date(year, month, 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, month);
 }
 else {
 if (params[0]) year = params[0];
 if(params[1])
 {
 cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
 createCalendarOneMonth(tbody, year, params[1]-1);
 }
 else
 {
 cacheReminders(new Date(year, 0, 1, 0, 0), 366);
 createCalendarYear(tbody, year);
 }
 }
 window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
 if (window.findTiddlersWithReminders == null)
 return;
 window.reminderCacheForCalendar = {};
 var leadtimeHash = [];
 leadtimeHash [0] = 0;
 leadtimeHash [1] = leadtime;
 var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
 for(var i = 0; i < t.length; i++) {
 //just tag it in the cache, so that when we're drawing days, we can bold this one.
 window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"]; 
 }
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
 var row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
 row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarDayHeader(row, 1);
 createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}

//{{{
function createCalendarMonth(calendar, year, mon)
{
 var row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
 row = createTiddlyElement(calendar, "tr", null, null, null);
 createCalendarDayHeader(row, 1);
 createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}

//{{{
function createCalendarYear(calendar, year)
{
 var row;
 row = createTiddlyElement(calendar, "tr", null, null, null);
 var back = createTiddlyElement(row, "td", null, null, null);
 var backHandler = function() {
 removeChildren(calendar);
 createCalendarYear(calendar, year-1);
 };
 createTiddlyButton(back, "<", "Previous year", backHandler);
 back.align = "center";

 var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);
 yearHeader.align = "center";
 yearHeader.setAttribute("colSpan", 19);

 var fwd = createTiddlyElement(row, "td", null, null, null);
 var fwdHandler = function() {
 removeChildren(calendar);
 createCalendarYear(calendar, year+1);
 };
 createTiddlyButton(fwd, ">", "Next year", fwdHandler);
 fwd.align = "center";

 createCalendarMonthRow(calendar, year, 0);
 createCalendarMonthRow(calendar, year, 3);
 createCalendarMonthRow(calendar, year, 6);
 createCalendarMonthRow(calendar, year, 9);
}
//}}}

//{{{
function createCalendarMonthRow(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
 createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
 createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDayHeader(row, 3);
 createCalendarDayRows(cal, year, mon);
}
//}}}

//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
 var month;
 if(nav) {
 var back = createTiddlyElement(row, "td", null, null, null);
 back.align = "center";
 back.style.background = config.macros.calendar.monthbg;

/*
 back.setAttribute("colSpan", 2);

 var backYearHandler = function() {
 var newyear = year-1;
 removeChildren(cal);
 cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, mon);
 };
 createTiddlyButton(back, "<<", "Previous year", backYearHandler);
*/
 var backMonHandler = function() {
 var newyear = year;
 var newmon = mon-1;
 if(newmon == -1) { newmon = 11; newyear = newyear-1;}
 removeChildren(cal);
 cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, newmon);
 };
 createTiddlyButton(back, "<", "Previous month", backMonHandler);


 month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
// month.setAttribute("colSpan", 3);
 month.setAttribute("colSpan", 5);

 var fwd = createTiddlyElement(row, "td", null, null, null);
 fwd.align = "center";
 fwd.style.background = config.macros.calendar.monthbg; 

// fwd.setAttribute("colSpan", 2);
 var fwdMonHandler = function() {
 var newyear = year;
 var newmon = mon+1;
 if(newmon == 12) { newmon = 0; newyear = newyear+1;}
 removeChildren(cal);
 cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, newmon);
 };
 createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);
/*
 var fwdYear = createTiddlyElement(row, "td", null, null, null);
 var fwdYearHandler = function() {
 var newyear = year+1;
 removeChildren(cal);
 cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
 createCalendarOneMonth(cal, newyear, mon);
 };
 createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);
*/
 } else {
 month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
 month.setAttribute("colSpan", 7);
 }
 month.align = "center";
 month.style.background = config.macros.calendar.monthbg;
}
//}}}

//{{{
function createCalendarDayHeader(row, num)
{
 var cell;
 for(var i = 0; i < num; i++) {
 for(var j = 0; j < 7; j++) {
 var d = j + (config.options.txtCalFirstDay - 0);
 if(d > 6) d = d - 7;
 cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);

 if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
 cell.style.background = config.macros.calendar.weekendbg;
 }
 }
}
//}}}

//{{{
function createCalendarDays(row, col, first, max, year, mon)
{
 var i;
 for(i = 0; i < col; i++) {
 createTiddlyElement(row, "td", null, null, null);
 }
 var day = first;
 for(i = col; i < 7; i++) {
 var d = i + (config.options.txtCalFirstDay - 0);
 if(d > 6) d = d - 7;
 var daycell = createTiddlyElement(row, "td", null, null, null);
 var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);

 if(day > 0 && day <= max) {
 var celldate = new Date(year, mon, day);
 // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup
 if (window.showDate) {
 showDate(daycell,celldate,"popup","DD","DD-MMM-YYYY",true, isaWeekend); 
 } else {
 if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
 var title = celldate.formatString(config.macros.calendar.tiddlerformat);
 if(calendarIsHoliday(celldate)) {
 daycell.style.background = config.macros.calendar.holidaybg;
 }
 if(window.findTiddlersWithReminders == null) {
 var link = createTiddlyLink(daycell, title, false);
 link.appendChild(document.createTextNode(day));
 } else {
 var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
 }
 }
 }
 day++;
 }
}
//}}}

// //We've clicked on a day in a calendar - create a suitable pop-up of options.
// //The pop-up should contain:
// // * a link to create a new entry for that date
// // * a link to create a new reminder for that date
// // * an <hr>
// // * the list of reminders for that date
//{{{
function onClickCalendarDate(e)
{
 var button = this;
 var date = button.getAttribute("title");
 var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));

 date = dat.formatString(config.macros.calendar.tiddlerformat);
 var popup = createTiddlerPopup(this);
 popup.appendChild(document.createTextNode(date));
 var newReminder = function() {
 var t = store.getTiddlers(date);
 displayTiddler(null, date, 2, null, null, false, false);
 if(t) {
 document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
 " month:" + (dat.getMonth()+1) +
 " year:" + (dat.getYear()+1900) + " title: >>";
 } else {
 document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
 " month:" + (dat.getMonth()+1) +
 " year:" + (dat.getYear()+1900) + " title: >>";
 }
 };
 var link = createTiddlyButton(popup, "New reminder", null, newReminder); 
 popup.appendChild(document.createElement("hr"));

 var t = findTiddlersWithReminders(dat, [0,14], null, 1);
 for(var i = 0; i < t.length; i++) {
 link = createTiddlyLink(popup, t[i].tiddler, false);
 link.appendChild(document.createTextNode(t[i].tiddler));
 }
}
//}}}

//{{{
function calendarMaxDays(year, mon)
{
 var max = config.macros.calendar.monthdays[mon];
 if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {
 max++;
 }
 return max;
}
//}}}

//{{{
function createCalendarDayRows(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);

 var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first1 < 0) first1 = first1 + 7;
 var day1 = -first1 + 1;
 var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first2 < 0) first2 = first2 + 7;
 var day2 = -first2 + 1;
 var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first3 < 0) first3 = first3 + 7;
 var day3 = -first3 + 1;

 var max1 = calendarMaxDays(year, mon);
 var max2 = calendarMaxDays(year, mon+1);
 var max3 = calendarMaxDays(year, mon+2);

 while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
 createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
 createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
 }
}
//}}}

//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
 var row = createTiddlyElement(cal, "tr", null, null, null);

 var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
 if(first1 < 0) first1 = first1+ 7;
 var day1 = -first1 + 1;
 var max1 = calendarMaxDays(year, mon);

 while(day1 <= max1) {
 row = createTiddlyElement(cal, "tr", null, null, null);
 createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
 }
}
//}}}

// //ELS 2005.10.30: added styles
//{{{

setStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td {font-size:8pt; text-align:right; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");

//}}}
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};

//--
//-- Crypto functions and associated conversion routines
//--

// Crypto "namespace"
function Crypto() {}

// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
	var be = Array();
	var len = Math.floor(str.length/4);
	var i, j;
	for(i=0, j=0; i<len; i++, j+=4) {
		be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
	}
	while (j<str.length) {
		be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
		j++;
	}
	return be;
};

// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
	var str = "";
	for(var i=0;i<be.length*32;i+=8)
		str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
	return str;
};

// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
	var hex = "0123456789ABCDEF";
	var str = "";
	for(var i=0;i<be.length*4;i++)
		str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
	return str;
};

// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
	return Crypto.be32sToHex(Crypto.sha1Str(str));
};

// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
	return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};

// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
	// Add 32-bit integers, wrapping at 32 bits
	add32 = function(a,b)
	{
		var lsw = (a&0xFFFF)+(b&0xFFFF);
		var msw = (a>>16)+(b>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	};
	// Add five 32-bit integers, wrapping at 32 bits
	add32x5 = function(a,b,c,d,e)
	{
		var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
		var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	};
	// Bitwise rotate left a 32-bit integer by 1 bit
	rol32 = function(n)
	{
		return (n>>>31)|(n<<1);
	};

	var len = blen*8;
	// Append padding so length in bits is 448 mod 512
	x[len>>5] |= 0x80 << (24-len%32);
	// Append length
	x[((len+64>>9)<<4)+15] = len;
	var w = Array(80);

	var k1 = 0x5A827999;
	var k2 = 0x6ED9EBA1;
	var k3 = 0x8F1BBCDC;
	var k4 = 0xCA62C1D6;

	var h0 = 0x67452301;
	var h1 = 0xEFCDAB89;
	var h2 = 0x98BADCFE;
	var h3 = 0x10325476;
	var h4 = 0xC3D2E1F0;

	for(var i=0;i<x.length;i+=16) {
		var j,t;
		var a = h0;
		var b = h1;
		var c = h2;
		var d = h3;
		var e = h4;
		for(j = 0;j<16;j++) {
			w[j] = x[i+j];
			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=16;j<20;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=20;j<40;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=40;j<60;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=60;j<80;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}

		h0 = add32(h0,a);
		h1 = add32(h1,b);
		h2 = add32(h2,c);
		h3 = add32(h3,d);
		h4 = add32(h4,e);
	}
	return Array(h0,h1,h2,h3,h4);
};


}
//}}}
----
|>|>|>|>|>|>|>|>|bgcolor(#cccccc): ''Brewing History'' |
|!LINK|!DATE|!NAME|!STYLE|!ABV|!IBU|!SRM|!SPECIAL INGREDIENTS|
| BrwdBeer034 |2014/03|314|Old Ale|6.0%| 39.4| 17.9| |
| BrwdBeer033 |2014/03|Still Water|Maibock|6.5%| 29.4| 15.1| |
| BrwdBeer032 |2014/02|Habanero Porter|Robust Porter| 4.9%| 52.0| 34.7|Habanero Peppers |
| BrwdBeer031 |2014/01|Ginger Thursday v1.1|Belgian Dubbel| 6.3%| 18.0| 16.4| |
| BrwdBeer030 |2013/09|SMASH|American Pale Ale| 4.7%| 32.2| 3.6|Single Malt & Single Hop |
| BrwdBeer029 |2013/09|Donkey Punch Cowgirl v1.1|Robust Porter | 6.2%| 36.9| 21.4| |
| BrwdBeer028 |2013/05|Two Princes|Fruit Beer| 4.7%| 11.6| 7.4|Extract |
| BrwdBeer027 |2013/03|16 Jones|American IPA| 4.7%| 52.7| 6.6| |
| BrwdBeer026 |2012/12|Donkey Punch Cowgirl v1.0|Robust Porter | 6.2%| 36.1| 21.5| |
| BrwdBeer025 |2012/09|Potato Stout|American Stout| 4.7%| 46.7| 35.8|Potato |
| BrwdBeer024 |2012/08|Graham Cracker|Specialty Ale | 5.9%| 22.1| 16.3|Graham Crackers |
| BrwdBeer023 |2012/06|Slag RIPA Track A&B|American Rye IPA | 6.2%| 61.9| 14.5| |
| BrwdBeer022 |2012/05|Skittlebrau|Belgian Witbier | 5.3%| 9.9| 4.5|Skittles |
| BrwdBeer021 |2012/05|Barely Legal Milk|Sweet Stout | 6.0%| 27.2| 31.7| |
| BrwdBeer020 |2012/04|Ginger Thursday v1.0|Belgian Dubbel | 6.3%| 16.9| 17.0| |
| BrwdBeer019 |2012/04|13 Gauge|American IPA | 5.9%| 65.8| 12.2| |
| BrwdBeer018 |2012/03|The Devil's Panties|Brown Porter | 4.2%| 25.1| 20.6| |
| BrwdBeer017 |2012/02|Vajazzle|Vanilla Porter | 6.4%| 23.3| 26.2| |
| BrwdBeer016 |2012/02|Wee Scottsish Lass|Scottish Light 60/- | 2.6%| 13.4| 15.1| |
| BrwdBeer015 |2011/12|Vanity Pilsner|Bohemian Pilsner | 4.1%| 38.9| 4.5|Garage Lager |
| BrwdBeer014 |2011/11|Hedonism|American Stout | 4.6%| 35.9| 29.9| |
| BrwdBeer013 |2011/11|Hell Ship IPA|American IPA | 5.2%| 73.0| 8.7| |
| BrwdBeer012 |2011/10|Baby Brew|Fruit Beer | 7.4%| 19.9| 5.4|Blueberries |
| BrwdBeer011 |2011/09|Smoke Hog|Wood Aged Beer | 6.3%| 31.1| 10.9|Bacon |
| BrwdBeer010 |2011/09|St. Ciara|Irish Red | 6.2%| 26.6| 19.1| |
| BrwdBeer009 |2011/08|Absint Ale|Belgian Tripel | 8.2%| 24.6| 6.1|Wormwood|
| BrwdBeer008 |2011/07|Sacajawea Falls|American Wheat Ale | 3.7%| 27.8| 5.8|Wet Hopped |
| BrwdBeer007 |2011/07|Cynic Ale|Saison | 4.5%| 23.6| 9.2| |
| BrwdBeer006 |2011/07|Speckled Heifer|Cream Ale | 3.9%| 19.6| 3.6| |
| BrwdBeer005 |2011/07|Ferocious IPA|American IPA | 5.9%| 56.2| 11.9| |
| BrwdBeer004 |2011/06|Honey Wood|Blonde | 4.2%| 14.0| 6.6|Hickory Chips|
| BrwdBeer003 |2011/05|Belgian Ale|Belgian | 6.8%| 12.0| 6.7| |
| BrwdBeer002 |2011/05|Amber Ale|Amber | 4.2%| 13.5| 7.7| |
| BrwdBeer001 |2011/04|American Light|  | 2.3%| 11.0| | |
| YeastStarter | N/A | | | | | | |

----
DashBoard
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};

//--
//-- Deprecated code
//--

// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
	w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};

// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
	var lookaheadRegExp = new RegExp(this.lookahead,"mg");
	lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = lookaheadRegExp.exec(w.source);
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var text = lookaheadMatch[1];
		if(config.browser.isIE)
			text = text.replace(/\n/g,"\r");
		createTiddlyElement(w.output,"pre",null,null,text);
		w.nextMatch = lookaheadRegExp.lastIndex;
	}
};

// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
	createTiddlyElement(place,"br");
};

// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
	var i = this.indexOf(item);
	return i == -1 ? null : i;
};

// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
	return store.getLoader().internalizeTiddler(store,this,title,divRef);
};

// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
	return store.getSaver().externalizeTiddler(store,this);
};

// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
	return store.allTiddlersAsHtml();
}

// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
	refreshPageTemplate(title);
}

// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
	story.displayTiddlers(srcElement,titles,template,animate);
}

// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
	story.displayTiddler(srcElement,title,template,animate);
}

// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;

// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");

}
//}}}
/***
''InlineJavascriptPlugin for ~TiddlyWiki version 1.2.x and 2.0''
^^author: Eric Shulman - ELS Design Studios
source: http://www.TiddlyTools.com/#InlineJavascriptPlugin
license: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^

Insert Javascript executable code directly into your tiddler content. Lets you ''call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.

''Deferred execution from an 'onClick' link''
By including a label="..." parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.

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

''Defining javascript functions and libraries:''
Although the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).

To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.

Since the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.

''Creating dynamic tiddler content''
An important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:
* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.
* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.
* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.

If your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.

//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//

''Accessing the ~TiddlyWiki DOM''
The plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.

Access to this DOM element allows you to create scripts that can:
* vary their actions based upon the specific location in which they are embedded
* access 'tiddler-relative' information (use findContainingTiddler(place))
* perform direct DOM manipulations (when returning wikified text is not enough)
<<<
!!!!!Examples
<<<
an "alert" message box:
{{{
<script>alert('InlineJavascriptPlugin: this is a demonstration message');</script>
}}}
<script>alert('InlineJavascriptPlugin: this is a demonstration message');</script>

dynamic output:
{{{
<script>return (new Date()).toString();</script>
}}}
<script>return (new Date()).toString();</script>

wikified dynamic output:
{{{
<script>return "link to current user: [["+config.options.txtUserName+"]]";</script>
}}}
<script>return "link to current user: [["+config.options.txtUserName+"]]";</script>

dynamic output using 'place' to get size information for current tiddler
{{{
<script>
 if (!window.story) window.story=window;
 var title=story.findContainingTiddler(place).id.substr(7);
 return title+" is using "+store.getTiddlerText(title).length+" bytes";
</script>
}}}
<script>
 if (!window.story) window.story=window;
 var title=story.findContainingTiddler(place).id.substr(7);
 return title+" is using "+store.getTiddlerText(title).length+" bytes";
</script>

creating an 'onclick' button/link that runs a script
{{{
<script label="click here">
 if (!window.story) window.story=window;
 alert("Hello World!\nlinktext='"+place.firstChild.data+"'\ntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");
</script>
}}}
<script label="click here">
 if (!window.story) window.story=window;
 alert("Hello World!\nlinktext='"+place.firstChild.data+"'\ntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");
</script>

loading a script from a source url
{{{
<script src="demo.js">return "loading demo.js..."</script>
<script label="click to execute demo() function">demo()</script>
}}}
where http://www.TiddlyTools.com/demo.js contains:
>function demo() { alert('this output is from demo(), defined in demo.js') }
>alert('InlineJavascriptPlugin: demo.js has been loaded');
<script src="demo.js">return "loading demo.js..."</script>
<script label="click to execute demo() function">demo()</script>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.01.05 [1.4.0]''
added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.
''2005.12.13 [1.3.1]''
when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski
''2005.11.09 [1.3.0]''
for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content
Based on a suggestion by BradleyMeck
''2005.11.08 [1.2.0]''
handle loading of javascript from an external URL via src="..." syntax
''2005.11.08 [1.1.0]''
pass 'place' param into scripts to provide direct DOM access 
''2005.11.08 [1.0.0]''
initial release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 4, revision: 0, date: new Date(2006,1,5)};

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

 handler: function(w) {
 var lookaheadRegExp = new RegExp(this.lookahead,"mg");
 lookaheadRegExp.lastIndex = w.matchStart;
 var lookaheadMatch = lookaheadRegExp.exec(w.source)
 if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
 if (lookaheadMatch[1]) { // load a script library
 // make script tag, set src, add to body to execute, then remove for cleanup
 var script = document.createElement("script"); script.src = lookaheadMatch[1];
 document.body.appendChild(script); document.body.removeChild(script);
 }
 if (lookaheadMatch[2] && lookaheadMatch[3]) { // create a link to an 'onclick' script
 // add a link, define click handler, save code in link (pass 'place'), set link attributes
 var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);
 link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}
 link.code="function _out(place){"+lookaheadMatch[3]+"};_out(this);"
 link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";
 }
 else if (lookaheadMatch[3]) { // run inline script code
 var code="function _out(place){"+lookaheadMatch[3]+"};_out(w.output);"
 code=code.replace(/document.write\(/gi,'place.innerHTML+=(');
 try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }
 if (out && out.length) wikify(out,w.output);
 }
 w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
 }
 }
} )
//}}}
DashBoard
SearchResults
ZaneGreen
BeerTemplate
<!--{{{-->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarCalendar' macro='calendar thismonth'></div>
<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>
<!--}}}-->
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Version|2.6.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Description|extend core search function with additional user-configurable options|

The TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text').  However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases.  In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.

!!!!!Usage
<<<
This plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags.  It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers.  You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.
<<<
!!!!!Configuration
<<<
In additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:
<<option chkSearchTitles>> Search in titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tags
<<option chkSearchFields>> Search in data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<option chkSearchList>> Show list of matches in [[SearchResults]]
<<option chkSearchIncremental>> Incremental searching
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for SearchOptionsPlugin handling^^

When installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior.  However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}},  {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}}  (with suitable prompt text) to your customized tiddler.
<<<
!!!!!Revision History
<<<
''2007.02.17 [2.6.1]'' added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0
''2007.02.13 [2.6.0]'' remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.
''2007.02.08 [2.5.1]'' include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)
''2007.01.29 [2.5.0]'' added support for "sort results by date".  Default is to sort alphabetically (standard).  When sorted by dates, most recent changes are shown first
''2006.10.10 [2.4.0]'' added support for "search in tiddler data" (tiddler.fields)  Default is to search extended data.
''2006.04.06 [2.3.0]'' added support for "search in shadow tiddlers".  Default is *not* to search in the shadows (i.e. standard TW behavior).  Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.
''2006.02.03 [2.2.1]'' rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes.  note that core no longer permits "blank=all" searches, so neither does this plugin.  To search for all, use "." with text patterns enabled.
''2006.02.02 [2.2.0]'' in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars.  Prevents searching on shorter text when shortened by rapid backspaces (<500msec)
''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching
also, blank search text now presents "No search text.  Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.
''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank
''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.
''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)
define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title
''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.
''2006.01.17 [2.1.4]'' Use regExp.search() instead of regExp.test() to scan for matches.  Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.
''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output
''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers.  This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.
''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()
''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.
''2005.12.30 [2.0.0]'' Upgraded to TW2.0
when rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.
''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags
''2005.12.21 [1.3.7]'' use \\ to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link.  Also, added access key: "O", to trigger "open all" link.
Based on a suggestion by UdoBorkowski.
''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon
''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.
''2005.12.17 [1.3.4]'' use {/%%/{/%%/{  and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered 
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.
Based on a suggestion by UdoBorkowski.
''2005.12.10 [1.3.1]'' added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.
''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).
added handling for Enter key so it can be used to start a search.
Based on a suggestion by LyallPearce
''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin
''2005.11.25 [1.2.0]'' added chkSearchList option
Based on a suggestion by RodneyGomes
''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.
Based on a suggestion by ChristianHauck
''2005.10.18 [1.0.0]'' Initial Release
Based on a suggestion by LyallPearce.
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};
//}}}

//{{{
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=false;
if (config.options.chkSearchByDate==undefined) config.options.chkSearchByDate=false;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;

if (config.optionsDesc) {
	config.optionsDesc.chkSearchTitles="Search in tiddler titles";
	config.optionsDesc.chkSearchText="Search in tiddler text";
	config.optionsDesc.chkSearchTags="Search in tiddler tags";
	config.optionsDesc.chkSearchFields="Search in tiddler data fields";
	config.optionsDesc.chkSearchShadows="Search in shadow tiddlers";
	config.optionsDesc.chkSearchTitlesFirst="Search results show title matches first";
	config.optionsDesc.chkSearchList="Search results show list of matching tiddlers";
	config.optionsDesc.chkSearchByDate="Search results sorted by modification date ";
	config.optionsDesc.chkSearchIncremental="Incremental searching";
} else {
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchText>> Search in tiddler text";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTags>> Search in tiddler tags";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchFields>> Search in tiddler data fields";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchShadows>> Search in shadow tiddlers";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitlesFirst>> Search results show title matches first";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchList>> Search results show list of matching tiddlers";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchByDate>> Search results sorted by modification date ";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchIncremental>> Incremental searching";
}

if (config.macros.search.reportTitle==undefined) config.macros.search.reportTitle="SearchResults";
//}}}

//{{{
config.macros.search.onKeyPress = function(e)
{
	if(!e) var e = window.event;
	switch(e.keyCode)
		{
		case 13: // Ctrl-Enter
		case 10: // Ctrl-Enter on IE PC
			config.macros.search.doSearch(this);
			break;
		case 27: // Escape
			this.value = "";
			clearMessage();
			break;
		}
	if (config.options.chkSearchIncremental) {
		if(this.value.length > 2)
			{
			if(this.value != this.getAttribute("lastSearchText"))
				{
				if(config.macros.search.timeout)
					clearTimeout(config.macros.search.timeout);
				var txt = this;
				config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
				}
			}
		else
			{
			if(config.macros.search.timeout)
				clearTimeout(config.macros.search.timeout);
			}
	}
}
//}}}

//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
	if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (config.options.chkSearchList) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (config.options.chkSearchList) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}

//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
	var candidates = this.reverseLookup("tags",excludeTag,false,sortField);

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

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

	return results;
}
//}}}

// // ''REPORT GENERATOR''
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	var body="\n";

	// summary: nn tiddlers found matching '...', options used
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	body+="^^//searched in:// ";
	body+=(config.options.chkSearchTitles?"''titles'' ":"");
	body+=(config.options.chkSearchText?"''text'' ":"");
	body+=(config.options.chkSearchTags?"''tags'' ":"");
	body+=(config.options.chkSearchFields?"''fields'' ":"");
	body+=(config.options.chkSearchShadows?"''shadows'' ":"");
	if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
		body+=" //with options:// ";
		body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
		body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
	}
	body+="^^";

	// numbered list of links to matching tiddlers
	body+="\n<<<";
	for(var t=0;t<matches.length;t++) {
		var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
		body+="\n# "+date+"[["+matches[t].title+"]]";
	}
	body+="\n<<<\n";

	// open all matches button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.displayTiddlers(null,["
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" ";
	body+="accesskey=\"O\" ";
	body+="value=\"open all matching tiddlers\"></html> ";

	// discard search results button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
	body+="value=\"discard "+title+"\"></html>";

	// search again
	body+="\n\n----\n";
	body+="<<search \""+text+"\">>\n";
	body+="<<option chkSearchTitles>>titles ";
	body+="<<option chkSearchText>>text ";
	body+="<<option chkSearchTags>>tags";
	body+="<<option chkSearchFields>>fields";
	body+="<<option chkSearchShadows>>shadows";
	body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
	body+="<<option chkRegExpSearch>>text patterns";
	body+="<<option chkSearchByDate>>sort by date";

	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");
	store.addTiddler(tiddler); story.closeTiddler(title);

	// use alternate "search again" label in <<search>> macro
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again";

	// render/refresh tiddler
	story.displayTiddler(null,title,1);
	store.notify(title,true);

	// restore standard search label
	config.macros.search.label=oldprompt;

}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Version|2.6.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Description|extend core search function with additional user-configurable options|

The TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text').  However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases.  In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.

!!!!!Usage
<<<
This plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags.  It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers.  You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.
<<<
!!!!!Configuration
<<<
In additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:
<<option chkSearchTitles>> Search in titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tags
<<option chkSearchFields>> Search in data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<option chkSearchList>> Show list of matches in [[SearchResults]]
<<option chkSearchIncremental>> Incremental searching
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for SearchOptionsPlugin handling^^

When installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior.  However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}},  {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}}  (with suitable prompt text) to your customized tiddler.
<<<
!!!!!Revision History
<<<
''2007.02.17 [2.6.1]'' added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0
''2007.02.13 [2.6.0]'' remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.
''2007.02.08 [2.5.1]'' include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)
''2007.01.29 [2.5.0]'' added support for "sort results by date".  Default is to sort alphabetically (standard).  When sorted by dates, most recent changes are shown first
''2006.10.10 [2.4.0]'' added support for "search in tiddler data" (tiddler.fields)  Default is to search extended data.
''2006.04.06 [2.3.0]'' added support for "search in shadow tiddlers".  Default is *not* to search in the shadows (i.e. standard TW behavior).  Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.
''2006.02.03 [2.2.1]'' rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes.  note that core no longer permits "blank=all" searches, so neither does this plugin.  To search for all, use "." with text patterns enabled.
''2006.02.02 [2.2.0]'' in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars.  Prevents searching on shorter text when shortened by rapid backspaces (<500msec)
''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching
also, blank search text now presents "No search text.  Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.
''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank
''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.
''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)
define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title
''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.
''2006.01.17 [2.1.4]'' Use regExp.search() instead of regExp.test() to scan for matches.  Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.
''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output
''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers.  This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.
''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()
''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.
''2005.12.30 [2.0.0]'' Upgraded to TW2.0
when rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.
''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags
''2005.12.21 [1.3.7]'' use \\ to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link.  Also, added access key: "O", to trigger "open all" link.
Based on a suggestion by UdoBorkowski.
''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon
''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.
''2005.12.17 [1.3.4]'' use {/%%/{/%%/{  and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered 
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.
Based on a suggestion by UdoBorkowski.
''2005.12.10 [1.3.1]'' added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.
''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).
added handling for Enter key so it can be used to start a search.
Based on a suggestion by LyallPearce
''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin
''2005.11.25 [1.2.0]'' added chkSearchList option
Based on a suggestion by RodneyGomes
''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.
Based on a suggestion by ChristianHauck
''2005.10.18 [1.0.0]'' Initial Release
Based on a suggestion by LyallPearce.
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};
//}}}

//{{{
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=false;
if (config.options.chkSearchByDate==undefined) config.options.chkSearchByDate=false;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;

if (config.optionsDesc) {
	config.optionsDesc.chkSearchTitles="Search in tiddler titles";
	config.optionsDesc.chkSearchText="Search in tiddler text";
	config.optionsDesc.chkSearchTags="Search in tiddler tags";
	config.optionsDesc.chkSearchFields="Search in tiddler data fields";
	config.optionsDesc.chkSearchShadows="Search in shadow tiddlers";
	config.optionsDesc.chkSearchTitlesFirst="Search results show title matches first";
	config.optionsDesc.chkSearchList="Search results show list of matching tiddlers";
	config.optionsDesc.chkSearchByDate="Search results sorted by modification date ";
	config.optionsDesc.chkSearchIncremental="Incremental searching";
} else {
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchText>> Search in tiddler text";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTags>> Search in tiddler tags";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchFields>> Search in tiddler data fields";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchShadows>> Search in shadow tiddlers";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitlesFirst>> Search results show title matches first";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchList>> Search results show list of matching tiddlers";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchByDate>> Search results sorted by modification date ";
	config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchIncremental>> Incremental searching";
}

if (config.macros.search.reportTitle==undefined) config.macros.search.reportTitle="SearchResults";
//}}}

//{{{
config.macros.search.onKeyPress = function(e)
{
	if(!e) var e = window.event;
	switch(e.keyCode)
		{
		case 13: // Ctrl-Enter
		case 10: // Ctrl-Enter on IE PC
			config.macros.search.doSearch(this);
			break;
		case 27: // Escape
			this.value = "";
			clearMessage();
			break;
		}
	if (config.options.chkSearchIncremental) {
		if(this.value.length > 2)
			{
			if(this.value != this.getAttribute("lastSearchText"))
				{
				if(config.macros.search.timeout)
					clearTimeout(config.macros.search.timeout);
				var txt = this;
				config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
				}
			}
		else
			{
			if(config.macros.search.timeout)
				clearTimeout(config.macros.search.timeout);
			}
	}
}
//}}}

//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
	if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (config.options.chkSearchList) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (config.options.chkSearchList) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}

//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
	var candidates = this.reverseLookup("tags",excludeTag,false,sortField);

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

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

	return results;
}
//}}}

// // ''REPORT GENERATOR''
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	var body="\n";

	// summary: nn tiddlers found matching '...', options used
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	body+="^^//searched in:// ";
	body+=(config.options.chkSearchTitles?"''titles'' ":"");
	body+=(config.options.chkSearchText?"''text'' ":"");
	body+=(config.options.chkSearchTags?"''tags'' ":"");
	body+=(config.options.chkSearchFields?"''fields'' ":"");
	body+=(config.options.chkSearchShadows?"''shadows'' ":"");
	if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
		body+=" //with options:// ";
		body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
		body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
	}
	body+="^^";

	// numbered list of links to matching tiddlers
	body+="\n<<<";
	for(var t=0;t<matches.length;t++) {
		var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
		body+="\n# "+date+"[["+matches[t].title+"]]";
	}
	body+="\n<<<\n";

	// open all matches button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.displayTiddlers(null,["
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" ";
	body+="accesskey=\"O\" ";
	body+="value=\"open all matching tiddlers\"></html> ";

	// discard search results button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
	body+="value=\"discard "+title+"\"></html>";

	// search again
	body+="\n\n----\n";
	body+="<<search \""+text+"\">>\n";
	body+="<<option chkSearchTitles>>titles ";
	body+="<<option chkSearchText>>text ";
	body+="<<option chkSearchTags>>tags";
	body+="<<option chkSearchFields>>fields";
	body+="<<option chkSearchShadows>>shadows";
	body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
	body+="<<option chkRegExpSearch>>text patterns";
	body+="<<option chkSearchByDate>>sort by date";

	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");
	store.addTiddler(tiddler); story.closeTiddler(title);

	// use alternate "search again" label in <<search>> macro
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again";

	// render/refresh tiddler
	story.displayTiddler(null,title,1);
	store.notify(title,true);

	// restore standard search label
	config.macros.search.label=oldprompt;

}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
''2 tiddlers found matching '{{{test}}}'''
^^//searched in:// ''titles'' ''text'' ''tags'' ''fields'' ^^
<<<
# 2007.12.21 15:10 [[PluginSearchOptions]]
# 2007.02.17 08:26 [[SearchOptionsPlugin]]
<<<
<html><input type="button" href="javascript:;" onclick="story.displayTiddlers(null,['PluginSearchOptions', 'SearchOptionsPlugin'],1);" accesskey="O" value="open all matching tiddlers"></html> <html><input type="button" href="javascript:;" onclick="story.closeTiddler('SearchResults'); store.deleteTiddler('SearchResults'); store.notify('SearchResults',true);" value="discard SearchResults"></html>

----
<<search "test">>
<<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags<<option chkSearchFields>>fields<<option chkSearchShadows>>shadows<<option chkCaseSensitiveSearch>>case-sensitive <<option chkRegExpSearch>>text patterns<<option chkSearchByDate>>sort by date
<<closeAll>><<permaview>><<newTiddler>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<tabs txtMainTab "Time" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
Organizational Tool
Zane Brew
http://www.zanegreen.com/
/*{{{*/
body{font-family: Verdana; background-color: #fff; font-size:10px; color: #333;}
/*}}}*/
/*{{{*/
#topMenu {position:relative; background:#282826; padding:10px; color:#fff;font-family:'Lucida Grande', Verdana, Sans-Serif;}
#topMenu br {display:none;}
#topMenu a{color: #999;	padding: 0px 8px 0px 8px; border-right: 1px solid #444;}
#topMenu a:hover {color:#fff; background:transparent;}
/*}}}*/
/*{{{*/
#displayArea {margin-left:1em; margin-bottom:2em; margin-top:0.5em;}

a, a:hover{color:#333;text-decoration: none;   background:transparent; }

.viewer a, .viewer a:hover {border-bottom:1px none #333; font-weight:bold;}
.viewer .button, .editorFooter .button{color: #333;border: 1px solid #333;}
.viewer .button:hover,
.editorFooter .button:hover, .viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter 
.highlight{color: #fff;background: #333;border-color: #333;}

.tiddler .viewer {line-height:1.45em;}
.title {color:#222; border-bottom:1px solid#222; font-family:'Lucida Grande', Verdana, Sans-Serif; font-size:1.5em;}
.subtitle, .subtitle a { color: #999999; font-size: 0.95em;}
.shadow .title{color:#999;}

.toolbar {font-size:90%;}
.selected .toolbar a {color:#999999;}
.selected .toolbar a:hover {color:#333; background:transparent;border:1px solid #fff;}
.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#333; background:transparent;border:1px solid #fff;}
/*}}}*/
/***
!Sidebar
***/
/*{{{*/
#sidebar { margin-bottom:2em !important; margin-bottom:1em; right:0;}
/*}}}*/
/***
!Calendar
***/
/*{{{*/
#sidebarCalendar {display:block; padding:0.5em; background:white; border:1px solid #f3f3f3}
#sidebarCalendar table td { font-size:95%; }
/*}}}*/
/***
!SidebarOptions
***/
/*{{{*/
#sidebarOptions { padding-top:0.5em;background:#f3f3f3;padding-left:0.5em;}
#sidebarOptions a {color:#333; background:#f3f3f3; border:1px solid #f3f3f3;text-decoration: none;}
#sidebarOptions	a:hover, #sidebarOptions a:active {color:#222;background-color:#fff;border:1px solid #fff;}
#sidebarOptions input {border:1px solid #ccc;}
#sidebarOptions .sliderPanel {background: #f3f3f3;font-size: .9em;}
#sidebarOptions .sliderPanel input {border:1px solid #999;}
#sidebarOptions .sliderPanel .txtOptionInput {border:1px solid #999;width:9em;}
#sidebarOptions .sliderPanel a {font-weight:normal; color:#555;background-color: #f3f3f3; border-bottom:1px none #333;}
#sidebarOptions .sliderPanel a:hover {color:#111;background-color: #f3f3f3;border:none;border-bottom:1px none #111;}
/*}}}*/
/***
!SidebarTabs
***/
/*{{{*/
.listTitle {color:#222;}
#sidebarTabs {background:#f3f3f3;}
#sidebarTabs .tabContents {background:#cfcfcf;}
#sidebarTabs .tabUnselected:hover {color:#999;}
#sidebarTabs .tabSelected{background:#cfcfcf;}
#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#666;}
#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#222;background:transparent; text-decoration:none;border:none;}
#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#222;background:transparent;}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents{ color: #111; background: #f3f3f3; border:1px solid #f3f3f3;}
#sidebarTabs .txtMoreTab .tabUnselected { color: #555; background: #AFAFAF;}
/*}}}*/
/***
!Tabs
***/
/*{{{*/
.tabSelected{color:#fefefe; background:#999; padding-bottom:1px;}
.tabSelected, .tabSelected:hover { color: #111; background: #fefefe; border: solid 1px #cfcfcf;}
.tabUnselected { color: #999; background: #eee; border: solid 1px #cfcfcf; padding-bottom:1px;}
.tabUnselected:hover {text-decoration:none; border:1px solid #cfcfcf;}
.tabContents {background:#fefefe;}
.tagging, .tagged {border: 1px solid #eee;background-color: #F7F7F7;}
.selected .tagging, .selected .tagged {background-color: #f3f3f3;border: 1px solid #ccc;}
.tagging .listTitle, .tagged .listTitle {color: #bbb;}
.selected .tagging .listTitle, .selected .tagged .listTitle {color: #333;}
.tagging .button, .tagged .button {color:#ccc;}
.selected .tagging .button, .selected .tagged .button {color:#aaa;}
.highlight, .marked {background:transparent; color:#111; border:none; text-decoration:underline;}
.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {border: none; background:transparent; text-decoration:underline; color:#333;}
/*}}}*/
/*{{{*/
.popup {background: #cfcfcf;border: 1px solid #333;}
.popup li.disabled {color: #000;}
.popup li a, .popup li a:visited {color: #555;border: none;}
.popup li a:hover {background: #f3f3f3;color: #555;border: none;}
/*}}}*/
/*{{{*/
#messageArea {border: 1px solid #282826;background: #F3F3F3;color: #333;font-size:80%;}
#messageArea a:hover { background:#f5f5f5; border:none;}
#messageArea .button{color: #333;border: 1px solid #282826;}
#messageArea .button:hover {color: #fff;background: #282826;border-color: #282826;}
/*}}}*/
/*{{{*/
.tiddler {padding-bottom:10px;}

.viewer blockquote {border-left: 5px solid #282826;}
.viewer table, .viewer td {border: 1px solid #282826;}
.viewer th, thead td {background: #282826;border: 1px solid #282826;color: #fff;}
.viewer pre {border: 1px solid #ccc;background: #f5f5f5;}
.viewer code {color: #111; background:#f5f5f5;}
.viewer hr {border-top: solid 1px #222; margin:0 1em;}
/*}}}*/
/*{{{*/
.editor input {border: 1px solid #ccc; margin-top:5px;}
.editor textarea {border: 1px solid #ccc;}
/*}}}*/
/*{{{*/
h1,h2,h3,h4,h5 { color: #282826; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }
h1 {font-size:12px;}
h2 {font-size:11px;}
h3 {font-size:10px;}
/*}}}*/
<<tabs txtMoreTab "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></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>
<!--}}}-->
----
!!Description
//Creating a yeast starter//

!!!Ingredients
*1/2 qrt water
*1/2 cup DME
*yeast nutrient

!!!Directions
*Boil 10 mins
*Cool & aerate
----
[img[beer001|http://zanegreen.com/images/logo4.jpg]]