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

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

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

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

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

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

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

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

----
Also see AdvancedOptions
<<importTiddlers>>
[>img[Image of Andromeda galaxy|tn_m31.jpg][m31.jpg]]
The picture to the right is of the Andromeda galaxy, Messier catalog M31.  I cannot take credit for the photography itself, but it is a picture that instantly conjures up the wonder and excitement of observational astronomy.

I had my first taste of observational astronomy back in my high school days and then again while attending St. Petersburg Junior College where I took classes in both observational and stellar astronomy for fulfilling my physical science requirements for my degree.

Flash forward many years and now I am once again delving into this discipline as time and the local weather allows. Although I have not kept up with my skills and knowledge I had acquired in my earlier days, that does not mean I have forgotten it all or even lost an interest, in fact, I lament lost opportunities to being able to have done some sky watching during all that time.

I will post updates to this page as I equip myself with new tools, software , and even photographic images of objects in the sky as I am able to obtain them. 

__''Current Month Sky Maps''__
|!Morning|!Evening|h
|[img[tn_morningsky.jpg][morningsky.jpg]]|[img[tn_nightsky.jpg][nightsky.jpg]]|
[[Annual Astronomy Budget]]
[[Astronomy "Wish List"]]

[img[Image of telesscope rig 1|tn_rig3.jpg][rig3.jpg]] [img[Image of telescope rig 2|tn_rig4.jpg][rig4.jpg]] [img[Image of telescope rig 3|tn_rig6.jpg][rig6.jpg]]
__''My Equipment :''__ 
[[Telescope]]
[[Mount]]
[[Finder]]
[[Camera]]
[[Eyepieces]]
[[Sky Window]]

Additional astronomy-related links : 
[[Clear Sky Clock]]
[[Moon Phases]]
[[Jupiter Moon Locations]]
[[Astronomy Observation Log Software|http://www.mainbyte.com/astrobyte/]]
[[Stargaze Astronomy Planisphere Software|http://www.skymapper.co.uk]]
[[Ultimate Messier Object Log|http://www.davidpaulgreen.com/tumol.html]]

__''RSS Feeds''__
[[NASA Breaking News]] | [[NASA Picture Of The Day]]
<html>
<table align="center"
          border="-1">
<tr>
<th colspan="4">
  Fiscal Year 2008 Budget
</th>
</tr>
<tr>
 <td>
  <strong>
   Catagory
  </strong>
 </td>
 <td>
 <strong>
   Budget
 </strong>
</td>
 <td>
  <strong>
   Expeditures
 </strong>
</td>
<td>
 <strong>
 Over / Short
 </strong>
</td>
</tr>

<tr>
 <td>
   Equipment   
 </td>
<td align="right">
 400.00
</td>
  <td colspan="2">
 </td>
 </tr>

<!--
<tr>
  <td colspan="2"
        align="center">
  Ioptron Telescope Mount
</td>
<td align="right">
   432.91
 </td>
 <td align="right">
  <strong>
  <font color="red">
  32.91
 </font>
</strong>
</td>
</tr>
<tr>
  <td colspan="2"
        align="center">
  PVC materials
</td>
<td align="right">
   12.76
 </td>
 <td align="right">
  <strong>
  <font color="red">
  12.76
 </font>
</strong>
</td>
</tr>
<tr>
  <td colspan="2">
   </td>
 <td align="right">
  445.67
 </td>
<td align="right">
  <strong>
  <font color="red">
  45.67
 </font>
</strong>
</td>
 </tr>
-->

<tr>
 <td>
 Books 
</td>
 <td align="right">
  50.00
 </td>
 <td colspan="2">
 </td>
</tr>
<!---
<tr>
  <td colspan="2">
 </td>
<td align="right">
   18.00
 </td>
<td align="right">
   32.00
 </td>
</tr>
--->

<tr>
<td>
Videos
</td>
<td align="right">
 50.00
</td>
<td colspan="2">
</td>
</tr>

<!---
<tr>
  <td colspan="2"
        align="center">
  The Universe Season 1
</td>
<td align="right">
   24.63
 </td>
 <td align="right">
   25.37
 </td>
</tr>
<tr>
  <td colspan="2"
        align="center">
  The Universe Season 2
</td>
<td align="right">
   25.89
 </td>
 <td align="right">
  <strong>
  <font color="red">
  0.52
 </font>
</strong>
</td>
</tr>
<tr>
<td colspan="2">
</td>
<td align="right">
 50.52
</td>
<td align="right">
  <strong>
  <font color="red">
  0.52
 </font>
</strong>
</td>
</tr>
--->

<tr>
<td>
  Totals
</td>
<td align="right">
 500.00
</td>
<!---
<td align="right">
 514.19
</td>
</td>
 <td align="right">
  <strong>
  <font color="red">
  14.19
 </font>
</strong>
</td>
--->
</tr>
</table>
</html>
|>|>|>|>|>|>| !July 2009 |
|Su|Mo|Tu|We|Th|Fr|Sa|
| | | |1|2|bgcolor(#bbb):3|4|
|5|6|7|8|9|10|11|
|12|13|14|15|16|17|18|
|19|20|21|22|23|24|25|
|26|27|28|29|30|31|

{{FOO{
|>| !Appointments / Holidays / etc |
|>| July |
|3|Independence Day|
|.| |
|.| |
|.| |
|.| |
|.| |
|.| |
|.| |
}}}
* [[Solar Sunspotter Telescope|http://www.starlab.com/ltiprod.html]]
* Eyepieces
* Meade Deep Sky Imager
<<rssReader asHTML http://www.casinogamblingweb.com/atlantic-city-casino-news.rss>>
<script>
window.open('http://news.1918.com/images/babe_08-24-2008.jpg','report','width=640,height=480,menubar=yes,toolbar=yes,scrollbars=yes') 
</script>
|>|>|>|>|>|>| ''Gambling Log For Big Raise Hold'em'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 03/26/2009 | 1:30 PM | Fitzgerald's | BR01 | 200.00 | 180.00 | @@color(red):''20.00'' @@ |
| 02/17/2009 | 2:10 PM | Fitzgerald's | BR01 | 200.00 | 215.00 | 15.00 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| 5.00 |
[>img[Image of Bismarck game|bismarck.jpg]]
Hunt down and sink the Bismarck. Three levels of play. In the advanced game, you use miniatures rules for the combat. Hidden movement by the use of separate search boards.

The original Bismarck game from AH was remarkable for one reason: the ONLY playing piece that the German player had was the Bismarck!

A straight forward move-and-search naval game. If the British player finds the Bismarck, a battle ensues.

The game is played for points. The player with the most points at the end of the game wins. The game ends when: 1) the Bismarck is sunk, 2) the Bismarck enters Bergen, St. Nazaire, or Ferrol after patrolling, 3) the German gains so many points it is impossible for the British player to win, or 4) time runs out.
<<calendar thismonth>>
/***
''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", "T", "F", "S", "S"];

config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";

//}}}
// //''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:10pt; text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");
//}}}
[>img[Image of lpi01|tn_lpi01.jpg][lpi01.jpg]]
Meade's exciting new LPI (Lunar Planetary Imager) can be used on any telescope for making images! It's VGA resolution (640x480) color CMOS chip is capable of creating high-quality lunar and planetary images, as well as daytime terrestrial images. And with the capability to make long exposures, you can digitally capture bright deep sky objects with the LPI system that only costs a fraction of a typical astronomical CCD imager system.

With an effective magnification similar to a 6mm eyepiece, the Meade LPI produces images that are inherently high magnification with no additional adapters, making it the perfect tool for imaging the Moon, planets, and small, bright deep sky objects. Using a barlow lens with the LPI will increase the magnification even more, and installing the LPI is just as easy as sliding in an eyepiece. 
|>|>|>|>|>|>| ''Gambling Log For Caribbean Stud Poker'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/02/2009 | 7:00 PM | 4 Queens | CS01 | 200.00 | 165.00 | @@color(red):''35.00'' @@ |
| 03/31/2009 | 1:30 PM | 4 Queens | CS01 | 200.00 | 175.00 | @@color(red):''25.00'' @@ |
| 03/26/2009 | 10:30 AM | Golden Nugget | CS01 | 200.00 | 220.00 | 20.00 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| @@color(red):''40.00'' @@ |
[>img[Image of carrier game|carrier.jpg]]
Carrier is a solitaire simulation of both historical and hypothetical carrier battles in the Southwest Pacific Theater during the hotly-contested naval campaigns of 1942 and 1943. As the U.S. commander, you maneuver your task forces and conduct air searches in a tension-packed contest to find the Japanese carriers before they locate and attack yours. Simples game mechanics control Japanese movement and determine the timing and strengths of their attacks. You will not know that a Japanese air strike is headed your way until it actually appears in the skies above your task force. Once the enemy has been located, you face the very same, real-life, tactical dilemmas as you historical counterparts.
Following are the books I read, re-read, & read again to stay on top of my gaming. As you can tell I am a devout disciple of [[John Patrick's|http://www.johnpatrickcasino.com/]] philosophy and style of casino game playing strategy.  Look him up sometime or even better, pick up one of his instructional DVDs and hear it all from the man himself . . . 

|CssClass|k
|[img[jpmm.jpg]]|[img[jpbac.jpg]]|[img[jpbj1.jpg]]|
|[img[jpbj2.jpg]]|[img[jpcraps.jpg]]|[img[jpcraps2.jpg]]|
|[img[jproulette.jpg]]|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[img[jpslots.jpg]]|[img[jpvp.jpg]]|
|[img[cdlir.jpg]]|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[img[johnpatrick.gif]]|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[img[tn_jpcp.jpg]] |
[img[tn_front.jpg]]
[>img[Image of Bally's casino|tn_bally.jpg][bally.jpg]]
In an effort to strive to become a better casino gambler, I conduct simulated gaming sessions using realistic bankrolls and casino games to perfect my various casino game strategies and techniques to not win a lot, but to minimze losses as advocated by author and life-long gambler [[John Patrick|http://www.johnpatrickcasino.com/]]


__''"""Casino Simulation Logs"""''__
[[Slots Log]]   |   [[Table Game Logs]]   |   [[Video Poker Game Logs]]


 __''"""Current Month Casino Simulation Results"""''__ 
|>| '' May '' |h
| '' Game Type '' | '' Balance '' |
| Slot |  @@color(red):''68.15'' @@ |
| Table |  @@color(red):''89.25'' @@ |
| Video Poker |  ''23.75'' |
|>| '' Profit / Loss '' |h
|>| @@color(red):''133.65'' @@ |

[<img[Image of sexy dealer|tn_hot-casino-dealer.jpg][hot-casino-dealer.jpg]]
&nbsp;&nbsp;__''"""Casino-Related""" Stocks''__
&nbsp;&nbsp;[[Casino Operator Stock Ticker]] | [[Casino Supply Stock Ticker]]

&nbsp;&nbsp;__''Casino News RSS Feeds''__
&nbsp;&nbsp;[[Atlantic City Casino News]] | [[Las Vegas Casino News]]




[[Casino Game Reading List]] | [[House Advantage by Casino Game]] | [[Gaming Gallery]]

[img[oldcasinos.jpg]]
<<RefreshTiddler>>

<html>
	<APPLET NAME="Ticker1"
	CODE="Ticker.class"
	ARCHIVE="Ticker.jar"
	CODEBASE="http://java.barchart.com/ticker"
	HEIGHT="60"
	WIDTH="450"
>

	<PARAM NAME="panels"    VALUE="1">
	<PARAM NAME="1:symbols" VALUE="ASCA:AMERISTAR,BYD:BOYD GAMING,CNTY:CENTURY CASINOS,ISLE:ISLE OFCAPRI,LACO:LAKES ENTERTAINMENT,LVS:LV SANDS,MPEL:MELCO PBL,MGM:MGM MIRAGE,PENN:PENN,PNK:PINNACLE,RIV:RIVIERA,TRMP:TRUMP,WYNN:WYNN RESORTS">
	<PARAM NAME="1:scroll"    VALUE="-1, 25">
	<PARAM NAME="1:bgcolor"   VALUE="#000000">
	<PARAM NAME="1:fgcolor"   VALUE="#FFFFFF">
	<PARAM NAME="1:pscolor"   VALUE="#00CC00">
	<PARAM NAME="1:ngcolor"   VALUE="#FF3333">
	<PARAM NAME="1:hilight"   VALUE="#FFFF00">
	<PARAM NAME="1:font"      VALUE="Arial, Bold, 18">
	<PARAM NAME="1:multiline" VALUE="true">
</APPLET>
</html>
Data is static, to refresh data - click the ''refresh'' button above.
<<RefreshTiddler>>

<html>
<APPLET NAME="Ticker1"
	CODE="Ticker.class"
	ARCHIVE="Ticker.jar"
	CODEBASE="http://java.barchart.com/ticker"
	HEIGHT="60"
	WIDTH="450"
>

	<PARAM NAME="panels"    VALUE="1">
	<PARAM NAME="1:symbols" VALUE="BYI:BALLY,ITL:INTL GAME TECH,SHFL:SHUFFLE MASTER,WMS:WMS INDS INC.">
	<PARAM NAME="1:scroll"    VALUE="-1, 25">
	<PARAM NAME="1:bgcolor"   VALUE="#000000">
	<PARAM NAME="1:fgcolor"   VALUE="#FFFFFF">
	<PARAM NAME="1:pscolor"   VALUE="#00CC00">
	<PARAM NAME="1:ngcolor"   VALUE="#FF3333">
	<PARAM NAME="1:hilight"   VALUE="#FFFF00">
	<PARAM NAME="1:font"      VALUE="Arial, Bold, 18">
	<PARAM NAME="1:multiline" VALUE="true">
</APPLET>
</html>
Data is static, to refresh data - click the ''refresh'' button above.
/***
|Name|CheckboxPlugin|
|Source|http://www.TiddlyTools.com/#CheckboxPlugin|
|Documentation|http://www.TiddlyTools.com/#CheckboxPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Add checkboxes to your tiddler content|
This plugin extends the TiddlyWiki syntax to allow definition of checkboxes that can be embedded directly in tiddler content.  Checkbox states are preserved by:
* by setting/removing tags on specified tiddlers,
* or, by setting custom field values on specified tiddlers,
* or, by saving to a locally-stored cookie ID,
* or, automatically modifying the tiddler content (deprecated)
When an ID is assigned to the checkbox, it enables direct programmatic access to the checkbox DOM element, as well as creating an entry in TiddlyWiki's config.options[ID] internal data.  In addition to tracking the checkbox state, you can also specify custom javascript for programmatic initialization and onClick event handling for any checkbox, so you can provide specialized side-effects in response to state changes.
!!!!!Documentation
>see [[CheckboxPluginInfo]]
!!!!!Revisions
<<<
2008.01.08 [*.*.*] plugin size reduction: documentation moved to [[CheckboxPluginInfo]]
2008.01.05 [2.4.0] set global "window.place" to current checkbox element when processing checkbox clicks.  This allows init/beforeClick/afterClick handlers to reference RELATIVE elements, including using "story.findContainingTiddler(place)".  Also, wrap handlers in "function()" so "return" can be used within handler code.
|please see [[CheckboxPluginInfo]] for additional revision details|
2005.12.07 [0.9.0] initial BETA release
<<<
!!!!!Code
***/
//{{{
version.extensions.CheckboxPlugin = {major: 2, minor: 4, revision:0 , date: new Date(2008,1,5)};
//}}}
//{{{
config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: "checkbox",
	match: "\\[[xX_ ][\\]\\=\\(\\{]",
	lookahead: "\\[([xX_ ])(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?({[^}]*})?\\]",
	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) {
			// get params
			var checked=(lookaheadMatch[1].toUpperCase()=="X");
			var id=lookaheadMatch[2];
			var target=lookaheadMatch[3];
			if (target) target=target.substr(1,target.length-2).trim(); // trim off parentheses
			var fn_init=lookaheadMatch[4];
			var fn_clickBefore=lookaheadMatch[5];
			var fn_clickAfter=lookaheadMatch[6];
			var tid=story.findContainingTiddler(w.output);  if (tid) tid=tid.getAttribute("tiddler");
			var srctid=w.tiddler?w.tiddler.title:null;
			config.macros.checkbox.create(w.output,tid,srctid,w.matchStart+1,checked,id,target,config.checkbox.refresh,fn_init,fn_clickBefore,fn_clickAfter);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} );
config.macros.checkbox = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one
			var here=story.findContainingTiddler(place);
			if (here) tiddler=store.getTiddler(here.getAttribute("tiddler"))
		}
		var srcpos=0; // "inline X" not applicable to macro syntax
		var target=params.shift(); if (!target) target="";
		var defaultState=params[0]=="checked"; if (defaultState) params.shift();
		var id=params.shift(); if (id && !id.length) id=null;
		var fn_init=params.shift(); if (fn_init && !fn_init.length) fn_init=null;
		var fn_clickBefore=params.shift();
		if (fn_clickBefore && !fn_clickBefore.length) fn_clickBefore=null;
		var fn_clickAfter=params.shift();
		if (fn_clickAfter && !fn_clickAfter.length) fn_clickAfter=null;
		var refresh={ tagged:true, tagging:true, container:false };
		this.create(place,tiddler.title,tiddler.title,0,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter);
	},
	create: function(place,tid,srctid,srcpos,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter) {
		// create checkbox element
		var c = document.createElement("input");
		c.setAttribute("type","checkbox");
		c.onclick=this.onClickCheckbox;
		c.srctid=srctid; // remember source tiddler
		c.srcpos=srcpos; // remember location of "X"
		c.container=tid; // containing tiddler (may be null if not in a tiddler)
		c.tiddler=tid; // default target tiddler 
		c.refresh = {};
		c.refresh.container = refresh.container;
		c.refresh.tagged = refresh.tagged;
		c.refresh.tagging = refresh.tagging;
		place.appendChild(c);
		// set default state
		c.checked=defaultState;
		// track state in config.options.ID
		if (id) {
			c.id=id.substr(1); // trim off leading "="
			if (config.options[c.id]!=undefined)
				c.checked=config.options[c.id];
			else
				config.options[c.id]=c.checked;
		}
		// track state in (tiddlername|tagname) or (fieldname@tiddlername)
		if (target) {
			var pos=target.indexOf("@");
			if (pos!=-1) {
				c.field=pos?target.substr(0,pos):"checked"; // get fieldname (or use default "checked")
				c.tiddler=target.substr(pos+1); // get specified tiddler name (if any)
				if (!c.tiddler || !c.tiddler.length) c.tiddler=tid; // if tiddler not specified, default == container
				if (store.getValue(c.tiddler,c.field)!=undefined)
					c.checked=(store.getValue(c.tiddler,c.field)=="true"); // set checkbox from saved state
			} else {
				var pos=target.indexOf("|"); if (pos==-1) var pos=target.indexOf(":");
				c.tag=target;
				if (pos==0) c.tag=target.substr(1); // trim leading "|" or ":"
				if (pos>0) { c.tiddler=target.substr(0,pos); c.tag=target.substr(pos+1); }
				if (!c.tag.length) c.tag="checked";
				var t=store.getTiddler(c.tiddler);
				if (t && t.tags)
					c.checked=t.isTagged(c.tag); // set checkbox from saved state
			}
		}
		// trim off surrounding { and } delimiters from init/click handlers
		if (fn_init) c.fn_init="(function(){"+fn_init.trim().substr(1,fn_init.length-2)+"})()";
		if (fn_clickBefore) c.fn_clickBefore="(function(){"+fn_clickBefore.trim().substr(1,fn_clickBefore.length-2)+"})()";
		if (fn_clickAfter) c.fn_clickAfter="(function(){"+fn_clickAfter.trim().substr(1,fn_clickAfter.length-2)+"})()";
		c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
	},
	onClickCheckbox: function(event) {
		window.place=this;
		if (this.init && this.fn_init) // custom function hook to set initial state (run only once)
			{ try { eval(this.fn_init); } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
		if (!this.init && this.fn_clickBefore) // custom function hook to override changes in checkbox state
			{ try { eval(this.fn_clickBefore) } catch(e) { displayMessage("Checkbox onClickBefore error: "+e.toString()); } }
		if (this.id)
			// save state in config AND cookie (only when ID starts with 'chk')
			{ config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }
		if (this.srctid && this.srcpos>0 && (!this.id || this.id.substr(0,3)!="chk") && !this.tag && !this.field) {
			// save state in tiddler content only if not using cookie, tag or field tracking
			var t=store.getTiddler(this.srctid); // put X in original source tiddler (if any)
			if (t && this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
				t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);
				if (!story.isDirty(t.title)) story.refreshTiddler(t.title,null,true);
				store.setDirty(true);
			}
		}
		if (this.field) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			// set the field value in the target tiddler
			store.setValue(this.tiddler,this.field,this.checked?"true":"false");
			// DEBUG: displayMessage(this.field+"@"+this.tiddler+" is "+this.checked);
		}
		if (this.tag) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			var t=store.getTiddler(this.tiddler);
			if (t) {
				var tagged=(t.tags && t.tags.indexOf(this.tag)!=-1);
				if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
				if (!this.checked && tagged) { t.tags.splice(t.tags.indexOf(this.tag),1); store.setDirty(true); }
			}
			// if tag state has been changed, update display of corresponding tiddlers (unless they are in edit mode...)
			if (this.checked!=tagged) {
				if (this.refresh.tagged) {
					if (!story.isDirty(this.tiddler)) // the TAGGED tiddler in view mode
						story.refreshTiddler(this.tiddler,null,true); 
					else // the TAGGED tiddler in edit mode (with tags field)
						config.macros.checkbox.refreshEditorTagField(this.tiddler,this.tag,this.checked);
				}
				if (this.refresh.tagging)
					if (!story.isDirty(this.tag)) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
			}
		}
		if (!this.init && this.fn_clickAfter) // custom function hook to react to changes in checkbox state
			{ try { eval(this.fn_clickAfter) } catch(e) { displayMessage("Checkbox onClickAfter error: "+e.toString()); } }
		// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!) (and not when editing container)
		if (!this.init && this.refresh.container && this.container!=this.tiddler)
			if (!story.isDirty(this.container)) story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
		return true;
	},
	refreshEditorTagField: function(title,tag,set) {
		var tagfield=story.getTiddlerField(title,"tags");
		if (!tagfield||tagfield.getAttribute("edit")!="tags") return; // if no tags field in editor (i.e., custom template)
		var tags=tagfield.value.readBracketedList();
		if (tags.contains(tag)==set) return; // if no change needed
		if (set) tags.push(tag); // add tag
		else tags.splice(tags.indexOf(tag),1); // remove tag
		for (var t=0;t<tags.length;t++) tags[t]=String.encodeTiddlyLink(tags[t]);
		tagfield.value=tags.join(" "); // reassemble tag string (with brackets as needed)
		return;
	}
}
//}}}
<html>
<center>
<table>
<tr align="center">
 <td>
 <a href=http://cleardarksky.com//c/RaleighNCkey.html>
 <img height="250"
      width="650"
      src="http://cleardarksky.com/csk/getcsk.php?id=RaleighNC">
 </a>
 </td>
</tr>
</table>
</center>
</html>

  
[>img[Image of Dell PC|dell.jpg]]
Dell OptiPlex SX280 
80 GB Hd
2.8 GHz
1Gig Ram
Win XP Pro
Removeable Bay Drives: 24x DVD, CD RW
USB 3.5 floppy
Monitor: Dell Ultra Sharp 17" Flat Panel with stand
Mouse: Dell USB 2 Button OptiPlex with Scroll
If you wish, you can send an e-mail to [[[email protected]|mailto:[email protected]]]

Be sure to put ''Asylum'' in the subject line if you don't want your mail to go in the spam bin with all the Viagra ads ( thanks for the offer, but I don't have any erectile dysfunction issues around the ladies . . . just ask them ! )
----
|>|>|>|>|>|>| ''Gambling Log For Craps'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/21/2009 | 8:30 AM | Fitzgerald's | CR01 | 200.00 | 237.00 | 37.00 |
| 04/10/2009 | 7:30 PM | Plaza | CR01 | 200.00 | 149.00 | @@color(red):''51.00'' @@ |
| 04/09/2009 | 10:30 AM | Fremont | CR01 | 200.00 | 239.00 | 39.00 |
| 04/08/2009 | 7:30 PM | 4 Queens | CR01 | 200.00 | 152.00 | @@color(red):''48.00'' @@ |
| 04/06/2009 | 1:30 PM | Golden Nugget | CR01 | 200.00 | 166.00 | @@color(red):''34.00'' @@ |
| 04/05/2009 | 5:30 PM | Binion's | CR01 | 200.00 | 228.00 | 28.00 |
| 04/04/2009 | 9:30 PM | Vegas Club | CR01 | 200.00 | 221.00 | 21.00 |
| 04/03/2009 | 2:30 PM | 4 Queens | CR01 | 200.00 | 230.00 | 30.00 |
| 03/31/2009 | 3:30 PM | California | CR01 | 200.00 | 179.00 | @@color(red):''21.00'' @@ |
| 03/26/2009 | 10:30 AM | Fremont | CR01 | 200.00 | 179.00 | @@color(red):''21.00'' @@ |
| 03/24/2009 | 9:30 PM | Golden Nugget | CR01 | 200.00 | 235.00 | 35.00 |
| 03/23/2009 | 3:30 PM | Plaza | CR01 | 200.00 | 212.00 | 12.00 |
| 03/21/2009 | 3:30 PM | Binion's | CR03 | 200.00 | 214.00 | 14.00 |
| 03/19/2009 | 10:30 AM | Fitzgerald's | CR01 | 200.00 | 201.00 | 1.00 |
| 02/19/2009 | 8:30 AM | Golden Gate | CR01 | 200.00 | 155.00 | @@color(red):''45.00'' @@ |
| 02/18/2009 | 9:30 PM | El Cortez | CR01 | 200.00 | 159.00 | @@color(red):''41.00'' @@ |
| 02/18/2009 | 1:30 PM | Vegas Club | CR02 | 200.00 | 204.00 | 4.00 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| @@color(red):''40.00'' @@ |
<html>
 <table>
<tr>
 <th colspan="5">
  June
 </th>
</tr>

<tr>
  <td>
 <img src="http://news.1918.com/images/babe_08-01-2009.jpg" height="150" width="150" border="1"><br><center><strong>1</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-02-2009.jpg" height="150" width="150" border="1"><br><center><strong>2</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-03-2009.jpg" height="150" width="150" border="1"><br><center><strong>3</strong></center>
  </td>
<!--
<td>
 <img src="http://news.1918.com/images/babe_08-04-2009.jpg" height="150" width="150" border="1"><br><center><strong>4</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-05-2009.jpg" height="150" width="150" border="1"><br><center><strong>5</strong></center>
  </td>
 </tr>

<tr>
   <td>
 <img src="http://news.1918.com/images/babe_08-06-2009.jpg" height="150" width="150" border="1"><br><center><strong>6</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-07-2009.jpg" height="150" width="150" border="1"><br><center><strong>7</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-08-2009.jpg" height="150" width="150" border="1"><br><center><strong>8</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-09-2009.jpg" height="150" width="150" border="1"><br><center><strong>9</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-10-2009.jpg" height="150" width="150" border="1"><br><center><strong>10</strong></center>
  </td>
 </tr>

<tr>
   <td>
 <img src="http://news.1918.com/images/babe_08-11-2009.jpg" height="150" width="150" border="1"><br><center><strong>11</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-12-2009.jpg" height="150" width="150" border="1"><br><center><strong>12</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-13-2009.jpg" height="150" width="150" border="1"><br><center><strong>13</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-14-2009.jpg" height="150" width="150" border="1"><br><center><strong>14</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-15-2009.jpg" height="150" width="150" border="1"><br><center><strong>15</strong></center>
  </td>
 </tr>

<tr>
   <td>
 <img src="http://news.1918.com/images/babe_08-16-2009.jpg" height="150" width="150" border="1"><br><center><strong>16</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-17-2009.jpg" height="150" width="150" border="1"><br><center><strong>17</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-18-2009.jpg" height="150" width="150" border="1"><br><center><strong>18</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-19-2009.jpg" height="150" width="150" border="1"><br><center><strong>19</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-20-2009.jpg" height="150" width="150" border="1"><br><center><strong>20</strong></center>
  </td>
 </tr>

<tr>
   <td>
 <img src="http://news.1918.com/images/babe_08-21-2009.jpg" height="150" width="150" border="1"><br><center><strong>21</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-22-2009.jpg" height="150" width="150" border="1"><br><center><strong>22</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-23-2009.jpg" height="150" width="150" border="1"><br><center><strong>23</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-24-2009.jpg" height="150" width="150" border="1"><br><center><strong>24</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-25-2009.jpg" height="150" width="150" border="1"><br><center><strong>25</strong></center>
  </td>
 </tr>

<tr>
   <td>
 <img src="http://news.1918.com/images/babe_08-26-2009.jpg" height="150" width="150" border="1"><br><center><strong>26</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-27-2009.jpg" height="150" width="150" border="1"><br><center><strong>27</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-28-2009.jpg" height="150" width="150" border="1"><br><center><strong>28</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-29-2009.jpg" height="150" width="150" border="1"><br><center><strong>29</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_08-30-2009.jpg" height="150" width="150" border="1"><br><center><strong>30</strong></center>
  </td>
 </tr>
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_08-31-2009.jpg" height="150" width="150" border="1"><br><center><strong>31</strong></center>
  </td>
</tr>
-->
</table>

</html>
[[Current Month Daily Babe Recap]]
[[Previous Month Daily Babe Recap]]
[[Home]]
When I'm not currently using my PC's, I am having all of them do number crunching for various scientific applications, mostly astronomy-related.  You can find out all the projects that are being done at this website http://distributedcomputing.info/

The following are the research projects I am donating spare computing processing power to : 

|>|>|!Projects|h
| [img[setilogo.gif][|http://setiathome.berkeley.edu/]] |  [img[ufluidslogo.gif][http://ufluids.net/]] | [img[cosmologylogo.jpg][http://cosmologyathome.org//]]  |
| [img[tn_mw.png][http://milkyway.cs.rpi.edu/milkyway/]] | [img[tn_einsteinlogo.jpg][http://einstein.phys.uwm.edu/]] |

Following is a list of computers I have networked at home.  And yes, I consider the PS3 a computer - with the horsepower it has and the Linux operating system, it can be considered nothing less. . . read up about it on the web, you'll be suprised all the shit the PS3 can do!

|>|>|>|>|!Computer Type|h
| ''IBM Clone'' | ''IBM Netvista All-In-One'' | ''Dell Optiplex SX280'' | ''Compaq Presario 2100 Laptop'' | ''Playstation 3'' |
| Ubuntu Linux 9.04 | Windows XP | Windows XP | Windows XP | Yellow Dog Linux 6.1 |
| 512 Meg RAM | 512 Meg RAM | 1Gig RAM | 512 Meg RAM | 512 Meg RAM ( 256 available ) |
| 1.6 MHz AMD CPU | 1.2 MHz Intel CPU | 2.7 MHz Intel CPU | 1.2 MHz Intel CPU | 3.2 GHz Cell Processor |
| 40 Gig HD | 20 Gig HD | 40 Gig HD | 80 Gig HD | 80 Gig HD |
|>|>|>|>|>|>| ''Gambling Log For Double Diamond'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/10/2009 | 7:30 PM | Fitzgerald's | 54272895163 | 20.00 | 26.75 | 6.75 |
| 04/09/2009 | 11:00 AM | Fitzgerald's | 54272895163 | 20.00 | 26.75 | 6.75 |
| 04/08/2009 | 9:30 PM | El Cortez | 24542727 | 20.00 | 16.25 | @@color(red):''3.75'' @@ |
| 04/06/2009 | 10:00 AM | Fremont | 24624247 | 20.00 | 23.00 | 3.00 |
| 04/05/2009 | 11:00 AM | Fremont | 24624247 | 20.00 | 26.75 | 6.75 |
| 04/04/2009 | 9:00 AM | Plaza | 1273652 | 20.00 | 46.25 | 26.25 |
| 04/03/2009 | 2:00 PM | El Cortez | 2548523 | 20.00 | 12.50 | @@color(red):''7.50'' @@ |
| 04/02/2009 | 9:00 AM | El Cortez | 3215487 | 20.00 | 23.00 | 3.00 |
| 03/31/2009 | 2:00 PM | Vegas Club | 927542542 | 20.00 | 12.50 | @@color(red):''7.50'' @@ |
| 03/30/2009 | 9:00 AM | El Cortez | 612536742 | 20.00 | 14.25 | @@color(red):''5.75'' @@ |
| 03/26/2009 | 10:30 AM | Vegas Club | 32542145 | 20.00 | 0 | @@color(red):''20.00'' @@ |
| 03/24/2009 | 8:30 AM | Binion's | 2356745 | 20.00 | 9.75 | @@color(red):''10.25'' @@ |
| 03/23/2009 | 9:30 PM | 4 Queens | 24542727 | 20.00 | 6.50 | @@color(red):''13.50'' @@ |
| 03/21/2009 | 2:10 PM | Golden Nugget | 874756474 | 20.00 | 26.75 | 6.75 |
|>|>|>|>|>|>| ''Net Balance'' |h
|>|>|>|>|>|>| @@color(red):''9.00'' @@ |
I used to play ''Dungeons and Dragons'' but became very unhappy over the publisher's ( Wizard of the Coast ) inability to market a properly proofread product which required numerours revisions to the game rules.  This has become so chronic, that they now publish revision numbers for their games ( i.e. 3.0, 3.5, 4.0 ).  This problem, either deliberate or accidental has the very consumer-unfriendly effect of incurring additional purchase costs to have things that should have already been in-place with the original purchase.

In total disgust, I now only play using the SAGA game system based on the Dragonlance setting but is very easily converted to more "traditional" D&D settings which allows for more role playing of the characters than the current game mechanic of "find the monster, kill the monster, grab the loot, and level up" which is just nothing more than doing video game style playing and just rolling dice.

Below are the components to play the game.  It has fallen out of favor due to the heavy-handed push to go to the D20 game format but if you can find the game on eBay, grab it with both hands as it is a far superior game mechanic for fantasy roleplaying !
 
''__Core Rules__''

[img[dl5thbox.jpg]]

''__Supplemental Materials__''

[img[heroessteel.jpg]] [img[heroesdefiance.jpg]] [img[heroessorcery.jpg]] [img[heroeshope.jpg]] [img[wingsfury.jpg]]

[img[lasttowerraistlin.jpg]] [img[citadellight.jpg]]


[img[dl5bestiary.jpg]] [img[fatedeck.jpg]] [img[sagacompanion.jpg]] [img[palanthas.jpg]]

''__Adventure Modules__''

[img[seedschaos.jpg]] [img[chaosspawn.jpg]] [img[sylvanveil.jpg]] [img[titans.jpg]]

[img[dragonlanceclassics.jpg]]
<html>
<p>
<table align="center"
       border="-1">
 <caption>
 <b>
 Eyepiece Inventory
 </b>
 </caption>

 <tr>
  <th>
   Eyepiece
  </th>
 
   <th>
   Manufacturer
  </th>

  
  <th>
  Calculated Magnification
  </th>
  
  <th>
  Magnification With Barlow (2X)
  </th>
  
  <th>
  Magnification With Barlow (3X)
  </th>
  </tr>

  
  <tr>
  <td>
   6.5mm
  </td>
  
  <td>
  Plossl
  </td>
  
  <td align="center">
  119X
  </td>

  
  <td align="center">
  238X
  </td>
  
  <td align="center">
  348X
  </td>
 </tr>
 
 <tr>
  <td>
   10mm
  </td>

  
  <td>
  Plossl
  </td>
  
  <td align="center">
  76X
  </td>
  
  <td align="center">
  152X
  </td>
  
  <td align="center">

  228X
  </td>
 </tr>
 
 <tr>
 <td>
 25mm
 </td>
 
 <td>
 Plossl
 </td>

 
 <td align="center">
 30X
 </td>
 
 <td align="center">
 60X
 </td>
 
 <td align="center">
 90X
 </td>
 </tr>

</table>

<br /><br />

<table align="center"
       border="-1">
 <caption>
 <b>
 Eyepiece Accessories
 </b>
 </caption>

 <tr>

  <th>
   Name
  </th>
 
   <th>
   Magnification
  </th>
 </tr>
  
 <tr>
  <td>
   Barlow
  </td>

  <td align="center">
  2X
  </td>
</tr>
 
 <tr>
  <td>
   Barlow
  </td>
  <td align="center">
  3X
  </td>

</tr>
 
 <tr>
  <td>
  Erecting Prism
  </td>
 
  <td align="center">
  1.5X
 </td>
</tr>
</table>
<br /><br />

<p />

<table align="center"
       border="-1">
 <caption>
 <b>
 Filters
 </b>
 </caption>

  <tr>
  <th>

   Name
  </th>
 
  <th>
   Usage
  </th>
 </tr>
  
  <tr>
   <td>
    Lunar
   </td>

  
   <td>
   Green color lens to reduce glare when viewing moon
  </td>
 </tr>
</table>
</html>
 
 
[>img[Image of finder|qfinder.gif][qfinder.gif]]
The ''Rigel Quickfinder'' at 4.5" tall and 1.5" square this upright reflex finder is a small fraction of the size and weight of Telrad units. Projects red circles at 1 degree and 2 degrees for easier star hopping. Continuous or pulsed reticle with variable brightness control. Built in dew shield. Click on - Click off base. Includes 2 bases so you can share it between multiple scopes.
[>img[Image of finder activated|pulsed.gif]]
/***
|Name|FontSizePlugin|
|Created by|SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#FontSizePlugin|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Resize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.
You can customize the maximum and minimum allowed sizes.
(only affects tiddler content text, not any other text)

Also, you can load a TW file with a font-size specified in the url.
Eg: http://lewcid.googlepages.com/lewcid.html#font:110

!Demo:
Try using the font-size buttons in the sidebar, or in the MainMenu above.

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Then put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.

!Usage
{{{<<fontSize>>}}} results in <<fontSize>>
{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>

!Customizing:
The buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.
To change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.

!Notes:
This plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.

!History:
*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.
*25-07-06,  version 0.9

!Code
***/

//{{{
config.fontSize={};

//configuration settings
config.fontSize.settings =
{
            defaultSize : 100,  // all sizes in %
            maxSize : 200,
            minSize : 70,
            stepSize : 10
};

//startup code
var fontSettings = config.fontSize.settings;

if (!config.options.txtFontSize)
            {config.options.txtFontSize = fontSettings.defaultSize;
            saveOptionCookie("txtFontSize");}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
setStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\n .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");

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

               var sp = createTiddlyElement(place,"span",null,"fontResizer");
               sp.ondblclick=this.onDblClick;
               if (params[0])
                           createTiddlyText(sp,params[0]);
               createTiddlyButton(sp,"+","increase font-size",this.incFont);
               createTiddlyButton(sp,"=","reset font-size",this.resetFont);
               createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}

config.macros.fontSize.onDblClick = function (e)
{
             if (!e) var e = window.event;
             e.cancelBubble = true;
             if (e.stopPropagation) e.stopPropagation();
             return false;
}

config.macros.fontSize.setFont = function ()
{
               saveOptionCookie("txtFontSize");
               setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}

config.macros.fontSize.incFont=function()
{
               if (config.options.txtFontSize < fontSettings.maxSize)
                  config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
               config.macros.fontSize.setFont();
}

config.macros.fontSize.decFont=function()
{

               if (config.options.txtFontSize > fontSettings.minSize)
                  config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
               config.macros.fontSize.setFont();
}

config.macros.fontSize.resetFont=function()
{

               config.options.txtFontSize=fontSettings.defaultSize;
               config.macros.fontSize.setFont();
}

config.paramifiers.font =
{
               onstart: function(v)
                  {
                   config.options.txtFontSize = v;
                   config.macros.fontSize.setFont();
                  }
};
//}}}
/***
|Name|FramedLinksPlugin|
|Source|http://www.TiddlyTools.com/#FramedLinksPlugin|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|createExternalLink|
|Options|##Configuration|
|Description|clicking an external link opens an IFRAME following the link instead of opening a new tab/window|
This plugin causes clicks on external links to be rendered into inline frames (~IFRAMEs) instead of opening them in new browser tabs/windows.
!!!!!Usage
<<<
Just place an external link into your tiddler content using standard TiddlyWiki syntax.  When the {{{chkFramedLinks}}} checkbox is enabled or a tiddler is tagged with 'framedLinks' (see Configuration section, below), an IFRAME will be created dynamically whenever you click the external link.  Clicking on the link again removes the IFRAME.  You can hold down a modifier key (shift, control, or alt) while clicking a specific link to ''temporarily'' bypass the plugin-enhanced IFRAME handling and use the standard link handling behavior for that link.
<<<
!!!!!Configuration
<<<
<<option chkFramedLinks>> display inline frames for all external links
&nbsp; &nbsp; {{{usage: <<option chkFramedLinks>>}}}
<<option chkFramedLinksTag>> display inline frames for external links in tiddlers tagged with: <<option txtFramedLinksTag>> 
&nbsp; &nbsp; {{{usage: <<option chkFramedLinksTag>> and <<option txtFramedLinksTag>>}}}
IFRAME size (CSS units: %, em, px, cm, in) - width: <<option txtFrameWidth>> height: <<option txtFrameHeight>>
&nbsp; &nbsp; {{{usage: <<option txtFrameWidth>> <<option txtFrameHeight>>}}}
<<<
!!!!!Examples
<<<
Try these links:
*http://www.TiddlyWiki.com
*http://www.TiddlyTools.com
*http://groups.google.com/group/TiddlyWiki/topics
<<<
!!!!!Revisions
<<<
2008.09.13 [1.1.0] added support to selectively enable embedded IFRAMEs if the containing tiddler is tagged with 'framedLinks'
2007.11.29 [1.0.5] added slider animation and improved CSS handling for IFRAME height/width to maximize display area
2007.11.29 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.FramedLinksPlugin= {major: 1, minor: 1, revision: 0, date: new Date(2008,9,13)};

var co=config.options; // abbreviation
if (co.chkFramedLinks==undefined) co.chkFramedLinks=false;
if (co.chkFramedLinksTag==undefined) co.chkFramedLinksTag=true;
if (co.txtFramedLinksTag==undefined) co.txtFramedLinksTag="framedLinks";
if (co.txtFrameWidth==undefined) co.txtFrameWidth="100%";
if (co.txtFrameHeight==undefined) co.txtFrameHeight="80%";

window.framedLinks_createExternalLink=createExternalLink;
window.createExternalLink=function(place,url)
{
	var link=this.framedLinks_createExternalLink.apply(this,arguments);
	link.onclick=function(ev) { var e=ev?ev:window.event;
		var co=config.options; // abbreviation
		var here=story.findContainingTiddler(this);
		var enabled=co.chkFramedLinks || co.chkFramedLinksTag && here
			&& store.getTiddler(here.getAttribute("tiddler")).isTagged(co.txtFramedLinksTag);
		if (!enabled || e.ctrlKey || e.shiftKey || e.altKey) return; // BYPASS
		var p=this.parentNode; 
		var f=this.nextSibling?this.nextSibling.firstChild:null; // get the IFRAME... maybe...
		var w=co.txtFrameWidth; if (!w || !w.length) w="100%";
		var h=co.txtFrameHeight; if (!h || !h.length) h="80%";
		if (h.indexOf("%")) h=(findWindowHeight()*h.replace(/%/,"")/100)+"px"; // calc height as % of window
		var showing=f && f.nodeName.toUpperCase()=="IFRAME"; // does IFRAME really exist?
		var stretchCell=p.nodeName.toUpperCase()=="TD" && w.indexOf("%")!=-1 && w.replace(/%/,"")>=100;
		if (!showing) { // create an iframe
			link.style.display="block"; // force IFRAME onto line following link
			if (stretchCell) { p.setAttribute("savedWidth",p.style.width); p.style.width="100%"; } // adjust TD so IFRAME stretches
			var wrapper=createTiddlyElement(null,"span"); // wrapper for slider animation
			wrapper.setAttribute("url",this.href); // for async loading of frame after animation completes
			var f=createTiddlyElement(wrapper,"iframe"); // create IFRAME
			f.style.backgroundColor="#fff"; f.style.width=w; f.style.height=h;
			p.insertBefore(wrapper,this.nextSibling);
			function loadURL(wrapper) { var f=wrapper.firstChild; var url=wrapper.getAttribute("url");
				var d=f.contentDocument?f.contentDocument:(f.contentWindow?f.contentWindow.document:f.document);
				d.open(); d.writeln("<html>connecting to "+url+"</html>"); d.close();
				try { f.src=url; } // if the iframe can't handle the href
				catch(e) { alert(e.description?e.description:e.toString()); } // ... then report the error
				window.scrollTo(0,ensureVisible(wrapper));
			}
			if (!co.chkAnimate) loadURL(wrapper);
			else {
				var morph=new Slider(wrapper,true);
				morph.callback=loadURL;
				morph.properties.push({style: 'width', start: 0, end: 100, template: '%0%'});
				anim.startAnimating(morph);
			}
		} else { // remove iframe
			link.style.display="inline"; // restore link style
			if (stretchCell) p.style.width=p.getAttribute("savedWidth"); // restore previous width of TD
			if (!co.chkAnimate) p.removeChild(f.parentNode);
			else {
				var morph=new Slider(f.parentNode,false,false,"all");
				morph.properties.push({style: 'width', start: 100, end: 0, template: '%0%'});
				anim.startAnimating(morph);
			}
		}
		e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); return false;
	}
	return link;
}
//}}}
<html>
<center>
<table>
<tr align="center">
 <td>
 <a href=greggametype.html>
Click here to see game results
 </a>
 </td>
</tr>
</table>
</center>
</html>

  
Where I live gambling is illegal, even thought the state runs it's own form of gambling with a lottery which is in some respects a monopoly!  So, as an alternative to that weak form of money-making entertainment, on occasion I will host a "casino night" at my home and I pretty much try to give the "casino experience" here.  People coming over will get $500 in bank teller training money, which looks damn close to the real thing as a starting bankroll to use and enjoy playing the different games with when they are here. The games I offer here include :
*Royal Match Blackjack / 21
*Caribbean Stud Poker 
*Casino War
*"""Chuck-A-Luck"""
*Craps
*Let It Ride
*"""Pai-Gow Poker"""
*Red Dog
*Roulette
*Slot Machines
*Texas Hold 'Em Bonus
*Texas Hold 'Em Poker
 
The following are images of some casino gaming I have here at home : 

|>|>|>|>|>|!Slot Machines|
||[img[tn_565_SUNP0007_3.jpg][565_SUNP0007_3.jpg]]||[img[tn_565_SUNP0009_2.jpg][565_SUNP0009_2.jpg]]|[img[tn_100_0898.jpg][100_0898.jpg]]|[img[tn_100_0905.jpg][100_0905.jpg]]|

|>|!Let It Ride|>|!"""Chuck-A-Luck"""|
|[img[tn_100_0904.jpg][100_0904.jpg]]|[img[tn_lir1.jpg][lir1.jpg]]|[img[tn_chuck1.jpg][chuck1.jpg]]|[img[tn_chuck2.jpg][chuck2.jpg]]|

|>|!Red Dog|
|>[img[tn_reddog1.jpg][reddog1.jpg]]|[img[tn_reddog3.jpg][reddog3.jpg]]|

|>|!Roulette|
|[img[tn_rou1.jpg][rou1.jpg]]|[img[tn_rou3.jpg][rou3.jpg]]|

|>|>|!Poker|
|[img[tn_poker1.jpg][poker1.jpg]]|[img[tn_poker2.jpg][poker2.jpg]]|[img[tn_poker3.jpg][poker3.jpg]]|
[>img[Image of Harpoon 4 game|harpoon4.jpg]]
Harpoon 4 is the fourth edition of the Harpoon game-series originally published by Game Designers Workshop.

The era of modern naval combat began on October 21, 1967 when Egyptian missile boats launched four Soviet made Styx surface-to-surface missiles and sank the Israeli destroyer Elath at a range of 13.5 nautical miles. The face of naval warfare changed forever!

Harpoon 4 handles all aspects of modern maritime combat: surface, sub-surface, and air. Harpoon 4 is a system of detailed but comprehensible rules covering the many facets of modern naval actions. Consistent rating systems and evaluations of the capabilities of modern naval vessels, aircraft, submarines, and helicopters make it possible to achieve realistic results when simulating known situations, by extension Harpoon 4 also achieves realistic results with hypothetical scenarios. Harpoon 4 can answer questions like:

Are carriers powerhouses or sitting ducks?
Can transatlantic convoys survive in a modern wartime environment?
In the cat-and-mouse games between US and Russian submarines, which is better?

Extensive examples in the rules book actually take you through mini engagements that span less than a page of text. The set of die-cut counters included in the game, along with the Quickstart rules, make it possible to take this game home and play a scenario in an evening.
[>img[Image of Xena|tn_friend.jpg][friend.jpg]]
Welcome to my home page on the net. Here I plan to post things that have an interest to share for others to view. You will find predominantly hobbies I currently do or other items of interest to me.

You can adjust the font size of the text according to your viewing preferences here  <<fontSize>> or by using the control called ''Font Viewer Control'' at the top of the right hand column.

I will probably be posting more mundane tech type things, opinions, observations, etc. as the mood strikes me.

For ease of navigation, the menu to the left will take you to the specific areas of interest within this site for your enjoyment.  Also, when done with a particular section you will be able to close it by clicking the ''close'' menu option to the right of that particular section of information without having to leave the website - pretty spiffy !
  
And yes, that is ''Xena, Warrior Babe'' to the right.  Figured she was easier on the eyes to look at than me, but if you snoop around, you'll come across my pic as well if you are that curious . . .@@

<script>

/*
Count down until any date script-
By JavaScript Kit (www.javascriptkit.com)
Over 200+ free scripts here!
*/

//change the text below to reflect your own,
var before="I go to Las Vegas !"
var current="Today is Las Vegas trip day. Don\'t forget the bankroll!"
var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")

function countdown(yr,m,d){
var today=new Date()
var todayy=today.getYear()
if (todayy < 1000)
todayy+=1900
var todaym=today.getMonth()
var todayd=today.getDate()
var todaystring=montharray[todaym]+" "+todayd+", "+todayy
var futurestring=montharray[m-1]+" "+d+", "+yr
var difference=(Math.round((Date.parse(futurestring)-Date.parse(todaystring))/(24*60*60*1000))*1)
if (difference==0)
document.write(current)
else if (difference>0)
document.write("Only "+difference+" days until "+before)
}
//enter the count down date using the format year/month/day
countdown(2009,9,27)
</script>
@@
Read about it in the [[Vacation / Travel]] section !
Typical casino games and the house advantage to play : 

<html>
<div align="center">
                  <center>
                 <table border="1" cellpadding="0" cellspacing="0" width="95%" bgcolor="#E9E8EC">
                    <tr>
                <td width="207"><b>
                <font face="Verdana" color="#000080" size="2">Game</font></b></td>
                <td width="205"><b>
                <font face="Verdana" color="#000080" size="2">Bet</font></b></td>
                <td width="218"><b>
                <font face="Verdana" color="#000080" size="2">House Advantage</font></b></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Blackjack*</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Single Deck</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.20%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Blackjack*</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Double Deck</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.35%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Blackjack*</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Four Decks</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.51%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Blackjack*</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Six Decks</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.60%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Blackjack*</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Eight Decks</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.63%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Baccarat</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Banker</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">1.17%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Baccarat</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Player</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">1.36%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">Baccarat</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Tie (pays 8:1)</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">14.12%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Big Six</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$1</font><font size="2">

                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">11.11%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Big Six</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$2</font><font size="2">
                </font> </td>

                <td width="218"><font face="Verdana" color="#000080" size="2">16.67%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Big Six</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$5</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">22.22%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Big Six</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$10</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">18.52%</font></td>
                    </tr>

                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Big Six</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$20</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">22.22%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">Big Six</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Joker/Logo</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">24.07%</font></td>
                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Caribbean Stud Poker</font></td>

                <td width="205" bgcolor="#CCCCCC">&nbsp;</td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">5.22%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Pass/Come</font></td>

                <td width="218"><font face="Verdana" color="#000080" size="2">1.41%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Don't Pass/Don't Come</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">1.40%</font></td>
                    </tr>

                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Pass + 1X Odds</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.85%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Pass + 2X Odds</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.61%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Pass + 5X Odds</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.32%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Pass + 10X Odds</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.18%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Pass + 100X Odds</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.02%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Field (2:1 on 12)</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">5.56%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Field (3:1 on 12)</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">2.78%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Any Craps</font></td>

                <td width="218"><font face="Verdana" color="#000080" size="2">11.11%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Big 6,8</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">9.09%</font></td>
                    </tr>

                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Hard 4,10</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">11.11%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>

                <td width="205"><font face="Verdana" color="#000080" size="2">Hard 6,8</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">9.09%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Place (to Win) 6,8</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">1.52%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Place (to Win) 5,9</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">4.00%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Place (to Win) 4,10</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">6.67%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Place (to Lose) 6,8</font></td>

                <td width="218"><font face="Verdana" color="#000080" size="2">1.82%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Place (to Lose) 5,9</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">2.50%</font></td>
                    </tr>

                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Place (to Lose) 4,10</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">3.03%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>

                <td width="205"><font face="Verdana" color="#000080" size="2">Proposition 2,12</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">13.89%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Proposition 3,11</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">11.11%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Craps</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Proposition 7</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">16.67%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">Keno</font></td>
                <td width="205">&nbsp;</td>
                <td width="218"><font face="Verdana" color="#000080" size="2">25% to 29%</font></td>
                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Let it Ride</font></td>

                <td width="205" bgcolor="#CCCCCC">&nbsp;</td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">3.51%</font></td>
                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Pai-Gow Poker</font></td>
                <td width="205" bgcolor="#CCCCCC">&nbsp;</td>

                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">2.50%</font></td>
                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Red Dog</font></td>
                <td width="205" bgcolor="#CCCCCC">&nbsp;</td>
                <td width="218" bgcolor="#CCCCCC">

                <font face="Verdana" color="#000080" size="2">2.69%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Roulette</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Single Zero Table</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">2.70%</font></td>
                    </tr>

                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Roulette</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Double Zero Table</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">5.26%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Sic-Bo</font></td>

                <td width="205">&nbsp;</td>
                <td width="218"><font face="Verdana" color="#000080" size="2">2.78% to 47.22%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$0.05</font><font size="2">
                </font> </td>

                <td width="218"><font face="Verdana" color="#000080" size="2">15.20%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$0.25</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">10.20%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$0.50</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">9.10%</font></td>
                    </tr>

                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$1.00</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">8.10%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$5.00</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">5.50%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>

                <td width="205"><font size="2" face="Verdana" color="#000080">$25.00</font><font size="2">
                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">5.30%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Slot Machines</font></td>
                <td width="205"><font size="2" face="Verdana" color="#000080">$100.00</font><font size="2">

                </font> </td>
                <td width="218"><font face="Verdana" color="#000080" size="2">3.90%</font></td>
                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Spanish 21</font></td>
                <td width="205" bgcolor="#CCCCCC">&nbsp;</td>

                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.82%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Three Card Poker</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Pair Plus</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">2.32%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">Three Card Poker</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Ante + Play</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">1.46%</font></td>
                    </tr>
                    <tr>

                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Video Poker**</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">5/6/800</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">5.00%</font></td>
                    </tr>

                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Video Poker**</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">6/9/800</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">0.46%</font></td>

                    </tr>
                    <tr>
                <td width="207" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">Video Poker**</font></td>
                <td width="205" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">6/9/1000</font></td>
                <td width="218" bgcolor="#CCCCCC">
                <font face="Verdana" color="#000080" size="2">-0.07%</font></td>

                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">War</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Go to War on Ties</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">2.88%</font></td>
                    </tr>
                    <tr>

                <td width="207"><font face="Verdana" color="#000080" size="2">War</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Surrender on Ties</font></td>
                <td width="218"><font face="Verdana" color="#000080" size="2">3.70%</font></td>
                    </tr>
                    <tr>
                <td width="207"><font face="Verdana" color="#000080" size="2">War</font></td>
                <td width="205"><font face="Verdana" color="#000080" size="2">Bet on Ties</font></td>

                <td width="218"><font face="Verdana" color="#000080" size="2">18.65%</font></td>
                    </tr>
                    <tr>
                <td width="207">&nbsp;</td>
                <td width="205">&nbsp;</td>
                <td width="218">&nbsp;</td>
                    </tr>
                    <tr>

                <td colspan="3" align="left"><b>
                <font face="Verdana" color="#000080" size="2">Footnotes:</font></b></td>
                    </tr>
                    <tr>
                <td colspan="3" align="left"> 
                  <p><b><font face="Verdana" color="#000080" size="2">* Based on typical rules. Actual rules and returns may vary.</font></b></p>
                </td>
                    </tr>

                  </table>
                  </center>
                </div>
              </td>
                    </tr>
                  </table>
                  </center>
                </div>

</html>
/***
|''Name:''|RefreshIFramePlugin|
|''Description:''|Refresh an entire tiddler with optional periodic re-refresh|
|''Date:''|Oct 6, 2006|
|''Source:''|http://solo.dc3.com/tw/index.html#RefreshIFramePlugin|
|''Author:''|Bob Denny ~DC-3 Dreams, SP|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''Version:''|1.0.4|
|''~CoreVersion:''|2.0.11, 2.1.0|
|''Browser:''|Firefox 1.5; Internet Explorer 6.0; Safari|
|''Require:''|CheckboxPlugin (http://www.TiddlyTools.com/#CheckboxPlugin)|
!Description
This macro provides a tiddler with an <iframe> refresh control. This permits refreshing just the iframe, avoiding flashing due to refreshing the entire tiddler. Normally, a refresh button appears at the location of the macro invocation. Clicking this button causes the contents of the tiddler to be refreshed. Optionally, a checkbox may also be displayed with which the user can enable and disable automatic periodic refresh of the tiddler at an interval specified by the third parameter. Finally, for special applications, a fourth parameter may be given, and if "true" both the button and the checkbox will be hidden, and the tiddler will simply refresh periodically at the interval given by the third parameter.

@@There is a //lot// you can do with iframes in a tiddler@@. For more information see my ~TiddkyWiki [[Magic With <iframe>|http://solo.dc3.com/tw/HandlingIframes.html]]. 
!Usage
This plugin supports tiddlers with a single <iframe>, thus it assiciates itself with the first/only <iframe> in a tiddler. To add refreshing, simply invoke the macro (with optional parameters as desired, see below) wherever you want the button and optional checkbox to appear.

There are four optional parameters:
|!Parameter|!Description|
|''1''|(optional) Button label, default "Refresh"|
|''2''|(optional) Button tooltip, default "Refresh the remote frame"|
|''3''|(optional) Periodic refresh interval, sec., default 0 (no periodic refresh checkbox)|
|''4''|(optional) If present and "true" and parameter 3 > 0 all controls will be hidden and the tiddler will refresh periodically whenever it is visible.|
!!Revision History
<<<
''2006.09.22 [1.0.1]'' Initial creation, from RefreshTiddler
''2006.09.29 [1.0.2]'' Refresh checkbox cookie names different from RefreshTiddler.
''2006.10.03 [1.0.3]'' Add parameter to hide button and checkbox while doing periodic refresh. Expand documentation, lint check, validate with ~TiddlyWiki 2.1.0
''2006.10.03 [1.0.4]'' Handle race condition on IE - initial refresh lost. Force refresh at end of handler(). Disable container refreshing for checkbox, see CheckboxPlugin.
<<<
!!Code
***/
//{{{
version.extensions.RefreshIFrame = {
 major: 1, minor: 0, revision: 4,
 date: new Date(2006, 10, 6), 
 type: 'macro',
 source: "#RefreshIFramePlugin"
};

config.macros.RefreshIFrame = 
{
	states: { },													// Associative array of refresh states indexed by tiddler name
    
	handler: function(place, macroName, params, wikifier, paramString, tiddler)
	{
		var tidTitle = tiddler.title;								// Shortcut
		if(!this.states[tidTitle]) this.states[tidTitle] = {		// Array of state objects for refreshed tiddlers
				iframe: null,
				butLabel: "",
				butTooltip: "",
				refInterval: 0,
				doRefresh: false,
				initPerRef: false,
				timerId: 0,
				chkBox: null
				};
		var state = this.states[tidTitle];							// Shortcut
		var iframes = place.getElementsByTagName("iframe");
		if(iframes.length === 0) {
			displayMessage("PostForm: No iframe in tiddler!");
 			return;
 		}
		state.iframe = iframes[0];									// Only 1st iframe
		state.butLabel = params[0] ? params[0] : "Refresh"; 		// Make these react to edits
		state.butTooltip = params[1] ? params[1] : "Refresh the remote frame";
		state.refInterval = params[2] ? params[2] : 0;				// 0 = no periodic refresh checkbox
		var hidden = params[3] && params[3].toLowerCase() == "true" && state.refInterval > 0;
		if(!hidden)	{												// Unless want hidden
			var btn = createTiddlyButton(place, state.butLabel, state.butTooltip, this.onButClick);
			btn.name = tidTitle;									// Set button name to tiddler name (see onButClick())
			if(state.refInterval > 0) 								// If periodic refresh wanted
			{
				wikify(" [ =chkPerRefIfr" + tiddler.created.convertToYYYYMMDDHHMM() + // Uniquify chkbox ID
					"{config.macros.RefreshIFrame.states[\"" + tidTitle + "\"].chkBox = this; " + 
					"this.refresh.container=false;}" +
					"{config.macros.RefreshIFrame.onChkClick(\"" +  tidTitle + "\");}] " + 
					state.butLabel + " every " + state.refInterval + " seconds", place);
				state.timerId = 0;
				if(!state.initPerRef) this.onChkClick(tidTitle);	// Simulate checkbox click (state already from cookie)
			}
		} else if(state.refInterval > 0 && !state.initPerRef) {		// Hidden, if per ref and not started, start it
			if(state.timerId) clearTimeout(state.timerId);
			this.startRefresh(tidTitle); 
			state.initPerRef = true;
		}
		state.iframe.src = state.iframe.src;						// Refresh!
	},
    
	onButClick: function(e) 
	{
		if(!e) e = window.event;
		var tidTitle = resolveTarget(e).name;						// Name is the tiddler name!
		//displayMessage("but " + tidTitle);
		var iframe = config.macros.RefreshIFrame.states[tidTitle].iframe;
		iframe.src = iframe.src;									// Refresh!
		return false;
	},
    
	onChkClick: function(tidTitle) 
	{
		var state = this.states[tidTitle];
		if(state.chkBox.checked) {
			if(state.timerId) clearTimeout(state.timerId);
			this.startRefresh(tidTitle); 
		} else { 
			state.doRefresh = false;
		}
		state.initPerRef = true;
	},
    
	startRefresh: function(tidTitle) 
	{
		var state = this.states[tidTitle];
		state.doRefresh = true;
		//displayMessage("st " + tidTitle + " " + state.refInterval);
		state.timerId = setTimeout("config.macros.RefreshIFrame.reRefresh(\"" + 
						tidTitle + "\")", state.refInterval * 1000);
	},
    
	reRefresh: function(tidTitle)
	{
		var state = this.states[tidTitle];
		state.timerId = 0;
		if(!state.doRefresh) return;
		// Kill re-refresh cycle if tiddler closed or edited
		var tidElem = document.getElementById(story.idPrefix + tidTitle);  // DON'T GET CUTE! THIS IS CORRECT!
		//**BUGBUG** Hardwired to EditTemplate!
		if(!tidElem || tidElem.attributes['template'].value == "EditTemplate") // Prevent hidden or editing
		{
			state.initPerRef = false;
			return;
		}
		//displayMessage("re " + tidTitle + " " + state.refInterval);
		state.iframe.src = state.iframe.src;						// Refresh!
		state.timerId = setTimeout("config.macros.RefreshIFrame.reRefresh(\"" + 
						tidTitle + "\")", state.refInterval * 1000);
	}
};
//}}}
<html>
<iframe src="plmonthly.pdf" height="600" width="800">
</iframe>
</html>
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2008.06.11 [1.9.3] added $(...) function as 'shorthand' convenience syntax for document.getElementById()
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link.  Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed).  Thanks to Xavier Verges for suggestion and preliminary code.
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 9, revision: 3, date: new Date(2008,6,11)};

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

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

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

// // $(...) function: 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=="undefined") { // avoid redefinition
function $() {
	var elements=new Array();
	for (var i=0; i<arguments.length; i++) {
		var element=arguments[i];
		if (typeof element=='string') element=document.getElementById(element);
		if (arguments.length==1) return element;
		elements.push(element);
	}
	return elements;
}
}
//}}}
/***
|Name|InlineJavascriptPluginInfo|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for InlineJavascriptPlugin|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code.
<script show>
	/* javascript code goes here... */
</script>Every time the tiddler content is rendered, the javascript code is automatically evaluated, allowing you to invoke 'side-effect' processing and/or produce dynamically-generated content that is then inserted into the tiddler content, immediately following the script (see below).  By including the optional ''show'' keyword as the final parameter in a {{{<script>}}} marker, the plugin will also include the script source code in the output that it displays in the tiddler.  This is helpful when creating examples for documentation purposes (such as used in this tiddler!)

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

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

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

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

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

Notes:
*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script.  As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,''  and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.  
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
<<<
!!!!!Special reserved function name
<<<
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
<<<
!!!!!$(...) 'shorthand' function
<<<
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
{{{
$(id)
}}}
in place of the normal standard javascript syntax:
{{{
document.getElementById(id)
}}}
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
<<<
!!!!!Examples
<<<
simple dynamic output:
><script show>
	document.write("The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
	if (!window.story) window.story=window;
	var title=story.findContainingTiddler(place).getAttribute("tiddler");
	var size=store.getTiddlerText(title).length;
	return title+" is using "+size+" bytes";
</script>
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
	document.write("<br>The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
	if (!window.story) window.story=window;
	var txt=place.firstChild.data;
	var tid=story.findContainingTiddler(place).getAttribute('tiddler');
	alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
</script>
dynamically setting onclick link text based on stateful information:
>{{block{
{{{
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.innerHTML=on?"enable":"disable";
	config.txtSomething=on?"OFF":"ON";
	return "\nThe current value is: "+config.txtSomething;
</script><script>
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.lastChild.previousSibling.innerHTML=on?"disable":"enable";
</script>
}}}
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.innerHTML=on?"enable":"disable";
	config.txtSomething=on?"OFF":"ON";
	return "\nThe current value is: "+config.txtSomething;
</script><script>
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.lastChild.innerHTML=on?"enable":"disable";
</script>
}}}
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
>
><script src="demo.js" show>
	return "inlineJavascriptDemo() function has been defined"
</script>
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
	inlineJavascriptDemo();
</script>
<<<
!!!!!Revisions
<<<
2008.06.11 [1.9.3] added $(...) function as 'shorthand' convenience syntax for document.getElementById()
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link.  Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed).  Thanks to Xavier Verges for suggestion and preliminary code.
2008.02.14 [1.8.1] added backward-compatibility for use of wikifyPlainText() in TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 [1.8.0] added support for key="X" syntax to specify custom access key definitions
2007.12.15 [1.7.0] autogenerate URI encoded HREF on links for onclick scripts.  Drag links to browser toolbar to create bookmarklets.  IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets.  In addition, double-quotes will cause syntax errors.  Thanks to PaulReiber for debugging and brainstorming.
2007.11.26 [1.6.2] when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 [1.6.1] when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 [1.6.0] added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 [1.5.2] add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
2006.06.01 [1.5.1] when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 [1.5.0] added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 [1.4.0] added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
2005.12.13 [1.3.1] when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
2005.11.09 [1.3.0] for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
2005.11.08 [1.2.0] handle loading of javascript from an external URL via src="..." syntax
2005.11.08 [1.1.0] pass 'place' param into scripts to provide direct DOM access 
2005.11.08 [1.0.0] initial release
<<<
|>|>|>|>|>|>| ''Gambling Log For Jacks or Better'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/10/2009 | 2:30 PM | Fremont | 7396236 | 20.00 | 47.50 | 27.50 |
| 04/09/2009 | 10:00 AM | El Cortez |  12893735 | 20.00 | 30.00 | 10.00 |
| 04/06/2009 | 3:30 PM | El Cortez | 234624724 | 20.00 | 0 | @@color(red):''20.00'' @@ |
| 04/05/2009 | 1:30 PM | Vegas Club | 3421236 | 20.00 | 22.50 | 2.50 |
| 04/04/2009 | 4:30 PM | Vegas Club | 3421236 | 20.00 | 27.50 | 7.50 |
| 04/03/2009 | 8:30 PM | Fremont | 7396236 | 20.00 | 26.25 | 6.25 |
| 04/02/2009 | 10:00 AM | El Cortez |  12893735 | 20.00 | 30.00 | 10.00 |
| 03/31/2009 | 9:30 AM | California | 637582 | 20.00 | 26.25 | 6.25 |
| 03/26/2009 | 1:30 PM | 4 Queens | 674722743 | 20.00 | 0 | @@color(red):''20.00'' @@ |
| 03/24/2009 | 7:30 PM | Golden Nugget | 772342 | 20.00 | 0 | @@color(red):''20.00'' @@ |
| 03/23/2009 | 8:00 AM | Plaza |  92454857 | 20.00 | 23.75 | 3.75 |
| 03/22/2009 | 8:00 AM | El Cortez |  12893735 | 20.00 | 23.75 | 3.75 |
| 02/17/2009 | 8:00 AM | El Cortez |  12893735 | 20.00 | 26.25 | 6.25 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| ''23.75'' |
The image below is how Jupiter's most easily seen moons would appear right now if viewed thru a telescope in order from left-to-right..  If a moon's name is in yellow, it is presently transiting on the far-side of the planet and hidden.

<html>
<center>
<table>
<tr align="center">
 <td>
  <applet code="JupSat.class"
          width=600
	      height=80>
  <PARAM NAME="TZ"
         VALUE="GMT">
  </applet>
 </td>
</tr>
</table>
</center>
</html>
<<rssReader asHTML http://www.casinogamblingweb.com/las-vegas-casino-news.rss>>
|>|>|>|>|>|>| ''Gambling Log For Let It Ride'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/02/2009 | 10:30 AM | 4 Queens | LR01 | 200.00 | 220.00 | 20.00 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| ''20.00'' |
|>|>|>|>|>|>| ''Gambling Log For Little Green Men'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/10/2009 | 4:30 PM | Fitzgerald's | 11083750 | 20.00 | 14.75 | @@color(red):''5.25'' @@ |
| 04/09/2009 | 7:30 PM | El Cortez | 8474363 | 20.00 | 24.00 | 4.00 |
| 04/08/2009 | 9:30 PM | Fremont | 2451227 | 20.00 | 17.75 | @@color(red):''2.25'' @@ |
| 04/06/2009 | 8:30 AM | Fitzgerald's | 235674784 | 20.00 | 2.75 | 2.75 |
| 04/05/2009 | 8:30 PM | Vegas Club | 8375262 | 20.00 | 14.50 | @@color(red):''5.50'' @@ |
| 04/04/2009 | 11:30 PM | Plaza | 44264252 | 20.00 | 14.00 | @@color(red):''6.00'' @@ |
| 04/03/2009 | 8:30 AM | Fremont | 22452363 | 20.00 | 23.50 | 3.50 |
| 04/02/2009 | 1:30 PM | El Cortez | 8474363 | 20.00 | 12.50 | @@color(red):''7.50'' @@ |
| 03/31/2009 | 10:30 AM | Vegas Club | 92827455 | 20.00 | 15.25 | @@color(red):''4.75'' @@ |
| 03/26/2009 | 2:00 PM | 4 Queens | 24647 | 20.00 | 7.50 | @@color(red):''12.50'' @@ |
| 03/24/2009 | 10:30 AM | Binion's | 873653 | 20.00 | 9.60 | @@color(red):''10.40'' @@ |
| 03/23/2009 | 9:30 PM | 4 Queens | 24542727 | 20.00 | 4.75 | @@color(red):''15.25'' @@ |
|>|>|>|>|>|>| ''Net Balance'' |h
|>|>|>|>|>|>| @@color(red):''59.15'' @@ |
[[Amateur Astronomy]]
[[Casino Gaming]]
[[Daily Babe Recap]]
[[Distributed Computing]]
[[Naval Wargaming]]
[[Role Playing Games]]
[[Roller Derby]]
[[Taijiquan]]
[[Video Gaming]]

[img[Image of Superman|tn_tja.jpg][tja.jpg]]

<html>
<table align="center"
       border="1">
<caption>
<b>
<u>
 Currently Reading
</u>
</b>
</caption>
<tr>
<td>
 <img src="tn_curread1.jpg">
</td>
</tr>
</table>
</html>
<html>
<table align="center"
          border="1">
<caption>
<b>
<u>
 Latest DVD Bought
</u>
</b>
</caption>
<tr>
<td>
 <img src="tn_latestdvd.jpg" height="150" width="150">
 </td>
</tr>

</table>
</html>
<html>
<table align="center"
          border="1">
<caption>
<b>
<u>
 Currently Playing
</u>
</b>
</caption>
<tr>
<td>
 <img src="playing.jpg" height="150" width="150">
 </td>
</tr>
<tr>
<td>
 <img src="playing2.jpg" height="150" width="150">
 </td>
</tr>
</table>
</html>
<html>
<br><br>
<center>
<strong>
Copyright © 2009, Gregory D. Smith 
</strong>
<p>
<a href="gratitude.jpg"
 <img src="tn_gratitude.jpg">
 <alt="Image of marine giving flag to next-of-kin"
</a><br>
<img src="troops.gif"
  alt="image of troops support">
</center>
</html>


Below are the components to play the game.  It has fallen out of favor due to initial flare-up of interest in superhero RPG's and then the subsequent attrition. If you can find the game on eBay, grab it with both hands as it is a far superior game mechanic for superhero roleplaying !  Also, if you can get your hands on the Heroclix miniatures, they make great props on a table for your superhero characters! 
 
''__Core Rules__''

[img[tn_SmallGameBox.jpg]]

''__Supplemental Materials__''

[img[tn_XMenRosterBook.jpg]] [img[tn_Avengers_Roster.gif]] [img[tn_MarvelEarthCover.jpg]] [img[tn_FantasticFourRosterBook.jpg]] [img[tn_SmallRRGTE.jpg]]

''__Adventure Modules__''

[img[tn_X-MenWhoGoesThere.jpg]] [img[tn_AvengersMastersOfEvil.jpg]] [img[tn_FantasticFourFantasticVoyages.jpg]]
[>img[Image of Midway game|midway.jpg]]
The basic idea is each player has his or her own map of the area (in this case the Midway Island) behind a screen. Each player "searches" for the enemy fleet by flying search planes to the hex and calling the hex number. Once found, bombers can be sent in to sink the enemy fleet. The actual attack is fought on a separate battle board where the ships are first placed on hexes and the attacking planes are placed in hexes to indicate which ship it is attacking.

The basic game is very simple. But there are many additional rules, which add realism (and complexity): CAP fighters, surface actions, bases, inaccurate search reports, etc.

The game is superior with a neutral referee for true double blind play.
|>|>|>|>|>|>| ''Gambling Log For Mini-Baccarat'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/10/2009 | 3:30 PM | Golden Nugget | BA01 | 200.00 | 250.75 | 50.75 |
| 04/09/2009 | 11:30 AM | 4 Queens | BA01 | 200.00 | 235.00 | 35.00 |
| 04/08/2009 | 6:30 PM | Fitzgerald's | BA01 | 200.00 | 149.00 | @@color(red):''51.00'' @@ |
| 04/06/2009 | 6:00 PM | El Cortez | BA01 | 200.00 | 221.75 | 21.75 |
| 04/05/2009 | 9:40 AM | 4 Queens | BA01 | 200.00 | 231.00 | 31.00 |
| 04/04/2009 | 6:30 PM | Fremont | BA01 | 200.00 | 148.00 | @@color(red):''52.00'' @@ |
| 04/03/2009 | 9:30 PM | Golden Nugget | BA01 | 200.00 | 217.00 | 17.00 |
| 03/21/2009 | 2:10 PM | 4 Queens | BA01 | 200.00 | 225.00 | 25.00 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| ''77.50'' |
<html>

<H1>Current Lunar Phase</H3>

<div style="width:142px"><div style="padding:2px;background-color:#000000;border: 1px solid #000000"><div style="padding:15px;padding-bottom:5px;padding-top:11.3px;border: 1px solid #AFB2D8" align="center"><div style="padding-bottom:5.6px;color:#FFFFFF;font-family:arial,helvetica,sans-serif;font-size:11.4px;">CURRENT MOON</div><embed allowScriptAccess="never" src="http://www.moonmodule.com/cs/ccm_v1.swf" FlashVars="lg=en&hs=1&tf=12hr&scs=1&tc=FFFFFF&df=std&dfd=0&bgc=000000&mc=000000&js=0&msp=1&u=cc" quality="high" width="104" height="153.3" bgcolor="#000000" name="ccm_mph_mod" align="middle" wmode="opaque" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /><div style="padding-top:5px" align="center"><a href="http://www.calculatorcat.com/moon_phases/moon_phases.phtml" target="cc_moon_ph" style="font-size:10px;font-family:arial,verdana,sans-serif;color:#7F7F7F;text-decoration:underline;background:#000000;border:none;"><span style="color:#7F7F7F">about the moon</span></a></div></div></div></div>
</html>
[>img[Image of telescope mount|tn_telescopemount.jpg][telescopemount.jpg]]
Dual Mount: Alt-Azimuth & German Equatorial – The Cube™

The SmartStar™-A comes with patented Dual Mount: Alt-Azimuth & German Equatorial, a.k.a. The Cube™. This compact mount design is probably the most functional and flexible unit on the market. Both axis motors are built into a small single unit which is universally compatible with all telescopes using a dove-tail connection. The mount can be level for Alt-Azimuth or locked into position for German Equatorial. In addition, there are no “dead spots” – so you can point your telescope to ANYWHERE above the horizon, whereas, other mounts block the telescope tube at certain points of rotation. This mount comes standard with AC connection. An optional DC adaptor is available so you can plug your telescope motor into your car if you’re camping or at any remote location.
<<rssReader asHTML http://www.nasa.gov/rss/breaking_news.rss>>
<<rssReader asHtml http://www.nasa.gov/rss/image_of_the_day.rss>>
[<img[Image of carrier personnel|tn_banner.jpg][banner.jpg]]&nbsp;&nbsp; I enjoy playing various modern and historical naval wargames.  Basically, they can be broken down into two genres,&nbsp;&nbsp;boardgame and miniatures.




[>img[Image of carrier strike group|tn_warship.jpg][warship.jpg]]
Following are the versions of each I have / currently play : 
__''Miniatures''__
[[Harpoon]]
[[Victory At Sea]]


__''Boardgame''__
[>img[Image of carrier strike group|tn_vls.jpg][vls.jpg]][[Bismarck]]
[[Carrier]]
[[Midway]]
[[Second World War At Sea]]
[[Submarine]]
[[Tokyo Express]]
[[Victory In The Pacific]]
[[War At Sea]]
[<img[tn_psp.jpg]]
|sortable|k
| Title |h
| Dungeons And Dragons : Tactics |
| Warriors of the Lost Empire |
| Star Wars Battlefront : Renegade Squadron |
| Killzone : Liberation |
| Armored Core : Formula Front |
| Ace Combat X : Skies of Deception |
| Steel Horizon |
| Star Trek : Tactical Assault |
| Dead Head Fred |
| Marvel Trading Card Game |
| World Series Of Poker |
| Hard Rock Casino |
| Air Conflict : Aces of WW II |
| Star Wars Battlefront II |


/%
|>|>|>|>|>|! Playstation |h
| [img[videogames\ps1\tn_destructionderby.png]] | [img[videogames\ps1\tn_xena.jpg]] | [img[videogames\ps1\tn_wutangshaolinstyle.png]] | [img[videogames\ps1\tn_ready2rumbleboxing.jpg]] | [img[videogames\ps1\tn_xmenmutantacademy.png]] |
| [img[videogames\ps1\tn_wdltt.jpg]] | [img[videogames\ps1\tn_blasto.png]] | [img[videogames\ps1\tn_nhl99.png]] | [img[videogames\ps1\tn_tenchu.jpg]] | Spec Ops : Stealth Partrol | Uprising X |
| Battle Stations | [img[videogames\ps1\tn_jedipower.jpg]] | [img[videogames\ps1\tn_battletanxglobal_assault.jpg]] | [img[videogames\ps1\tn_tekken2.jpg]] | [img[videogames\ps1\tn_rollcagebox.jpg]] | Ball Breakers |
| Action Bass | |||
%/
<!--{{{-->
<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>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>

</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='SecondMenu'></div>
<!--original MainMenu menu-->
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<!-- disabled side bar tiddler list, ran too loong  replaced with tableof contents plugin
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
-->
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
|>|>|>|>|>|>| ''Gambling Log For Pai-Gow Poker'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/10/2009 | 8:30 AM | Plaza | PG01 | 200.00 | 171.00 | @@color(red):''29.00'' @@ |
| 04/09/2009 | 9:30 PM | 4 Queens | PG01 | 200.00 | 140.00 | @@color(red):''60.00'' @@ |
| 04/08/2009 | 11:30 AM | Plaza | PG01 | 200.00 | 153.50 | @@color(red):''46.50'' @@ |
| 04/06/2009 | 9:30 AM | Plaza | PG01 | 200.00 | 160.00 | @@color(red):''40.00'' @@ |
| 04/05/2009 | 8:30 AM | 4 Queens | PG01 | 200.00 | 169.00 | @@color(red):''31.00'' @@ |
| 04/04/2009 | 11:30 AM | Fremont | PG01 | 200.00 | 173.00 | @@color(red):''27.00'' @@ |
| 04/03/2009 | 7:30 PM | Golden Nugget | PG01 | 200.00 | 153.50 | @@color(red):''46.50'' @@ |
| 03/31/2009 | 8:00 PM | 4 Queens | PG01 | 200.00 | 226.50 | 26.50 |
| 03/26/2009 | 5:30 PM | Binion's | PG02 | 200.00 | 184.25 | @@color(red):''15.75'' @@ |
| 03/23/2009 | 1:30 PM | Fremont | PG01 | 200.00 | 174.25 | @@color(red):''25.75'' @@ |
| 03/19/2009 | 10:30 AM | Fitzgerald's | PG01 | 200.00 | 213.75 | 13.75 |
| 03/01/2009 | 9:00 AM | Fitzgerald's | PG01 | 200.00 | 214.00 | 14.00 |
| 02/10/2009 | 9:30 AM | Binion's | PG02 | 200.00 | 214.25 | 14.25 |
| 02/08/2009 | 11:00 PM | Vegas Club | PG01 | 200.00 | 214.25 | 14.25 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| @@color(red):''238.75'' @@ |
[<img[tn_ps1.jpg]]
|sortable|k
| Title |h
| Destruction Derby |
| Xena : Warrior Princess |
| Wu Tang : Shaolin Style |
| Ready 2 Rumble Boxing |
| X-Men : Mutant Academy 2 |
| WDL Thunder Tanks |
| Blasto |
| NHL 99 |
| Tenchu : Stealth Assassins |
| Spec Ops : Stealth Patrol |
| Uprising X |
| Battle Stations |
| Star Wars : Jedi Power Battles |
| Battle Tanx : Global Assault |
| Tekken 2 |
| Rollcage |
| Ballbreakers |
| Action Bass |
| Golden Nugget |
| Panzer Front |
| Railroad Tycoon II |
| Missile Command |
| Rock'em Sock'em Robots Arena |
| Allied General |
| Deathtrap Dungeon |
| Dracula : The Resurrection |
| Colony Wars |
| Panzer General |
| Gunship |
| Alien Trilogy |
| Bushido Blade 2 |
| Colony Wars : Vengeance |
| Echo Night |
| Monopoly |
| Resident Evil 2 |
| Front Mission 3 |
| Diablo |
| Caesars Palace : Millennium Gold Edition |
| Colony Wars : Red Sun |
| Dracula : The Last Sanctuary |
| Legend Of The Dragoon |
| Mortal Kombat Mythologies Sub-Zero |
| Medievil 2 |
| Star Wars Rebel Assault II : The Hidden Empire |
| Army Men 3D |
| NASCAR Thunder 2002 |
| Silent Hill |
| Twisted Metal 4 |
| Final Fantasy VIII |
| Populous |
| NHL Championship 2000 |

/%
|>|>|>|>|>|! Playstation |h
| [img[videogames\ps1\tn_destructionderby.png]] | [img[videogames\ps1\tn_xena.jpg]] | [img[videogames\ps1\tn_wutangshaolinstyle.png]] | [img[videogames\ps1\tn_ready2rumbleboxing.jpg]] | [img[videogames\ps1\tn_xmenmutantacademy.png]] |
| [img[videogames\ps1\tn_wdltt.jpg]] | [img[videogames\ps1\tn_blasto.png]] | [img[videogames\ps1\tn_nhl99.png]] | [img[videogames\ps1\tn_tenchu.jpg]] | Spec Ops : Stealth Partrol | Uprising X |
| Battle Stations | [img[videogames\ps1\tn_jedipower.jpg]] | [img[videogames\ps1\tn_battletanxglobal_assault.jpg]] | [img[videogames\ps1\tn_tekken2.jpg]] | [img[videogames\ps1\tn_rollcagebox.jpg]] | Ball Breakers |
| Action Bass | |||
%/
[<img[tn_ps2.jpg]]
|sortable|k
| Title |h
| High Rollers Casino |
| Ace Combat 4 |
| Ace Combat 5 |
| Ace Combat 0 |
| Maximo |
| Kessen |
| Robotech Battlecry |
| Superman : Shadow of Apokolips |
| Reign of Fire |
| Hulk |
| NHL 2001 |
| Madden 2002 |
| Dynasty Warriors 2 |
| Tekken TAG Tournament |
| War of the Monsters |
| City Crisis |
| Twisted Metal : Black |
| Onimusha : Warlords |
| Seek And Destroy |
| P.T.O. IV |
| RTX : Red Rock |
| Hypersonic : Extreme |
| Baldur's Gate : Dark Alliance |
| Naval Ops : Warship Gunner |
| Warship Gunner 2 |
| Naval Ops : Commander |
| Fire Blade |
| Grand Theft Auto : Vice City |
| Risk : Global Domination |
| Crouching Tiger Hidden Dragon |
| Enter The Matrix |
| Romance of the Three Kingdoms VIII |
| Lethal Skies 2 |
| Battlestar Galactica |
| Evil Dead : A Fistful of Boomstick |
| Jet Li : Rise To Honor |
| Arctic Thunder |
| Sub Rebellion |
| Star Wars : Racer Revenge |
| Star Wars : Starfighter |
| Star Wars : Bounty Hunter |
| Astro Boy |
| Transformers |
| Aero Elite : Combat Academy |
| Star Trek Voyager : Elite Force |
| Thunderstrike : Operation Phoenix |
| Top Gun : Combat Zones |
| Star Trek : Encounters |
| Guitar Hero |
| Guitar Hero 2 |
| God of War |
| Okami |
| The Sopranos : Road to Respect |
| World Championship Poker : Howard Lederer All In |
| Star Trek : Conquest |
| Godzilla Unleashed |
| Harvey Birdman : Attorney at Law |
| Wolverine's Revenge |
| Hard Rock Casino |
| X-Men 2 Legends : Rise of Apocalypse |
| Boogie |
| Dance Dance Revolution Extreme |
| Dance Dance Revolution Supernova 2 |
| Dance Dance Revolution X |
| Loony Tunes : Acme Arsenel |
| Army Men : Air Attack 2 |
| Devil Kings |
| Area - 51 |
| Pirates : The Legend of Black Kat |
| Genji : Dawn of the Samurai |
| Atari Anthology |
| The Incredibles : Rise of the Underminer |
| Heatseeker |
| Pinball Hall of Fame : Williams Collection |
| 24 The Game |
| Way Of The Samurai |
| NASCAR 2003 Thunder |
| NASCAR 2006 Total Team Control |
| Medal Of Honor : Frontline |
| Dance Factory |
| Brothers In Arms : Earned In Blood |
| Constantine |
| Activision Anthology |
| Fantavision |
| Medal Of Honor : European Assault |
| Shadow Of The Colossus |
| Bujingai |
| Rise of the Kasai |
| Silent Hill : Origins |
| Kuon |
| Devil May Cry 3 |
| Medal Of Honor : Rising Sun |
| Silent Hill 3 |
| Devil May Cry |
| Devil May Cry 2 |
| Kingdom Hearts |
| Front Mission 4 |
| Timesplitters 2 |
| Echo Night Beyond |
| Timesplitters : Future Perfect |
| Champions of Norrath |
| Red Dead Revolver |
| Tribes Aerial Assault |
| Xenosaga Episode I |
| Samurai Western |
| Summoner |
| Max Payne |
| Xenosaga Episode 2 |
| Soul Caliber 3 |
| Kessen 3 |
| Kessen 2 |
| Silent Hill 2 |
| Hit Man 2 : Silent Assassin |
| Hit Man : Blood Money |
| Legacy Of Kain : Defiance |
| Medal Of Honor : Vanguard |
| Wrath Unleashed |
| Timesplitters |
| Armored Core 2 |
| Conflict : Desert Storm |
| Army Men : Sarge's Heroes 2 |
| Dropship : United Peace Force |
| Final Fantasy VII : Dirge of Cerebrus |
| Final Fantasy X-2 |
| Final Fantasy XII |
| Grim Grimoire |
| Zone Of The Enders |
| Dynasty Warriors 4 |
| Rule Of Rose |
| Magne Carta : Tears Of Blood |
| God Of War II |
| Star Ocean : Till The End Of Time |
| Onimusha 2 : Samurai's Destiny |
| Onimusha 3 : Demon Siege |
| Dancing with The Stars |
| Hit Man : Contracts |
| Armored Core : Silent Line |
| Gungrave : Overdose |
| Avatar : The Last Airbender |
| The Bards Tale |
| Demon Stone |
| Karaoke Revolution Presents : American Idol |
| Midway Arcade Treasures |
| Red Faction |
| Shadowman : 2nd Coming |
| The Bouncer |
| Kingdom Hearts II |
| Okage : Shadow King |
| Chaos Legion |
| Valkyrie Profile 2 |
| Obscure : The Aftermath |
| Lord of the Rings : The Two Towers |
| Gun |
| Primal |
| True Crime : Streets of L A |
| Lord of the Rings : The Third Age |
| Lord of the Rings : Return of the King |
| Final Fantasy X |
| Suikoden V |







[<img[tn_ps3.jpg]] First off, I use my PS3 as a mix of game console, Blu-Ray DVD player, and as a PC.  That's right, a root'in toot'in PC.  Using the ''Yellow Dog Linux'' distibution, the PS3 can be a PC.  It is a breeze to install and switch back & forth between the Game OS and YDL ( Yellow Dog Linux ) enviroments.  So my PS3 can use Firefox to surf the web, handle e-mail, using Open Office to do anything Microsoft's Office can do, do software development with Java or Python programming languages, and even handle being a web server and database server!  As anyone knows, Windows sucks with all its hardware requirements , buggy software, and worst-of-all virus vulnerabilities!  With the PS3 and Linux....to quote Donald Trump, "Windows...you're fired ! "

|sortable|k
| Title |h
| Heavenly Sword |
| SmackDown vs. RAW 2008 |
| The Eye of Judgment |
| Overlord : Raising Hell |
| Soul Caliber IV |
| Turok |
| Genji : Days Of The Blade |
| Mortal Kombat vs DC Universe |
| Dark Sector |
| Afro Samurai |
| Tom Clancy's Endwar |
| Sid Meier's Civilization |
| Assassin's Creed |
| Resistance : Fall Of Man |
| Infamous |


<<plugins>>
<<RefreshTiddler>>

This display reflects the current holdings I have in my portfolio.
<html>
	<APPLET NAME="Ticker1"
	CODE="Ticker.class"
	ARCHIVE="Ticker.jar"
	CODEBASE="http://java.barchart.com/ticker"
	HEIGHT="60"
	WIDTH="450"
>

	<PARAM NAME="panels"    VALUE="1">
	<PARAM NAME="1:symbols" VALUE="ACGIX:VAN KAMPEN Grth & Inc FND,AFL:AFLAC,CAG:CONAGRA,DUK:DUKE ENERGY,GE:GENERAL ELECTRIC,IBM:IBM,KO:COCA-COLA,NOOF:NEW FRONTIER MEDIA,ORB:ORBITAL SCIENCES,PENN:PENN,RGAEX:AMERICAN FUNDS Grth Fnd,RPM:RPM,SE:SPECTRA ENERGY,SPAB:SPACEHAB,TRMP:TRUMP,TWX:TIME WARNER,VZ:VERIZON,YUM:YUM">
	<PARAM NAME="1:scroll"    VALUE="-1, 25">
	<PARAM NAME="1:bgcolor"   VALUE="#000000">
	<PARAM NAME="1:fgcolor"   VALUE="#FFFFFF">
	<PARAM NAME="1:pscolor"   VALUE="#00CC00">
	<PARAM NAME="1:ngcolor"   VALUE="#FF3333">
	<PARAM NAME="1:hilight"   VALUE="#FFFF00">
	<PARAM NAME="1:font"      VALUE="Arial, Bold, 18">
	<PARAM NAME="1:multiline" VALUE="true">
</APPLET>
</html>
Data is static, to refresh the price data display - click the ''refresh'' button above. 
<html>
 <table>
<tr>
 <th colspan="5">
  May
 </th>
</tr>
  <tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-01-2009.jpg" height="150" width="150" border="1"><br><center><strong>1</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-02-2009.jpg" height="150" width="150" border="1"><br><center><strong>2</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-03-2009.jpg" height="150" width="150" border="1"><br><center><strong>3</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-04-2009.jpg" height="150" width="150" border="1"><br><center><strong>4</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-05-2009.jpg" height="150" width="150" border="1"><br><center><strong>5</strong></center>
  </td>
 </tr>
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-06-2009.jpg" height="150" width="150" border="1"><br><center><strong>6</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-07-2009.jpg" height="150" width="150" border="1"><br><center><strong>7</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-08-2009.jpg" height="150" width="150" border="1"><br><center><strong>8</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-09-2009.jpg" height="150" width="150" border="1"><br><center><strong>9</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-10-2009.jpg" height="150" width="150" border="1"><br><center><strong>10</strong></center>
  </td>
 </tr>
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-11-2009.jpg" height="150" width="150" border="1"><br><center><strong>11</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-12-2009.jpg" height="150" width="150" border="1"><br><center><strong>12</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-13-2009.jpg" height="150" width="150" border="1"><br><center><strong>13</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-14-2009.jpg" height="150" width="150" border="1"><br><center><strong>14</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-15-2009.jpg" height="150" width="150" border="1"><br><center><strong>15</strong></center>
  </td>
 </tr>
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-16-2009.jpg" height="150" width="150" border="1"><br><center><strong>16</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-17-2009.jpg" height="150" width="150" border="1"><br><center><strong>17</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-18-2009.jpg" height="150" width="150" border="1"><br><center><strong>18</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-19-2009.jpg" height="150" width="150" border="1"><br><center><strong>19</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-20-2009.jpg" height="150" width="150" border="1"><br><center><strong>20</strong></center>
  </td>
 </tr>
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-21-2009.jpg" height="150" width="150" border="1"><br><center><strong>21</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-22-2009.jpg" height="150" width="150" border="1"><br><center><strong>22</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-23-2009.jpg" height="150" width="150" border="1"><br><center><strong>23</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-24-2009.jpg" height="150" width="150" border="1"><br><center><strong>24</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-25-2009.jpg" height="150" width="150" border="1"><br><center><strong>25</strong></center>
  </td>
 </tr>
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-26-2009.jpg" height="150" width="150" border="1"><br><center><strong>26</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-27-2009.jpg" height="150" width="150" border="1"><br><center><strong>27</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-28-2009.jpg" height="150" width="150" border="1"><br><center><strong>28</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-29-2009.jpg" height="150" width="150" border="1"><br><center><strong>29</strong></center>
  </td>
<td>
 <img src="http://news.1918.com/images/babe_07-30-2009.jpg" height="150" width="150" border="1"><br><center><strong>30</strong></center>
  </td>
 </tr>
<!--
<tr>
   <td>
 <img src="http://news.1918.com/images/babe_07-31-2009.jpg" height="150" width="150" border="1"><br><center><strong>31</strong></center>
  </td>
<td>
</td>
<td>
</td>
<td>
</td>
<td>
</td>
 </tr>
-->
</table>
</html>
<html>
<iframe src="gregrevenue.pdf" height="600" width="800">
</iframe>
</html>
<html>
<iframe src="gregbygametype.pdf" height="640" width="800">
</iframe>
</html>
<html>
<iframe src="plmonthly.pdf" height="600" width="800">
</iframe>
</html>
<script>
window.open('plmonthly.html','report','width=640,height=480,menubar=yes,toolbar=yes,scrollbars=yes') 
</script>

@@See separate browser window for requested report.@@
version.extensions.RSSReaderPlugin = {
	major: 1, minor: 1, revision: 2,
	date: new Date("2008-09-02"),
	source: "http://TiddlyWiki.bidix.info/#RSSReaderPlugin",
	author: "BidiX",
	coreVersion: '2.2.0'
};

config.macros.rssReader = {
	dateFormat: "DDD, DD MMM YYYY",
	itemStyle: "display: block;border: 1px solid black;padding: 5px;margin: 5px;", //useed  '@@'+itemStyle+itemText+'@@'
	msg:{
		permissionDenied: "Permission to read preferences was denied.",
		noRSSFeed: "No RSS Feed at this address %0",
		urlNotAccessible: " Access to %0 is not allowed"
	},
	cache: [], 	// url => XMLHttpRequest.responseXML
	desc: "noDesc",
	
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var desc = params[0];
		var feedURL = params[1];
		var toFilter = (params[2] ? true : false);
		var filterString = (toFilter?(params[2].substr(0,1) == ' '? tiddler.title:params[2]):'');
		var place = createTiddlyElement(place, "div", "RSSReader");
		wikify("^^<<rssFeedUpdate "+feedURL+" [[" + tiddler.title + "]]>>^^\n",place);
		if (this.cache[feedURL]) {
			this.displayRssFeed(this.cache[feedURL], feedURL, place, desc, toFilter, filterString);
		}
		else {
			var r = loadRemoteFile(feedURL,config.macros.rssReader.processResponse, [place, desc, toFilter, filterString]);
			if (typeof r == "string")
				displayMessage(r);
		}
		
	},

	// callback for loadRemoteFile 
	// params : [place, desc, toFilter, filterString]
	processResponse: function(status, params, responseText, url, xhr) { // feedURL, place, desc, toFilter, filterString) {	
		if (window.netscape){
			try {
				if (document.location.protocol.indexOf("http") == -1) {
					netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				}
			}
			catch (e) { displayMessage(e.description?e.description:e.toString()); }
		}
		if (xhr.status == 404)
		 {
			displayMessage(config.macros.rssReader.noRSSFeed.format([url]));
			return;
		}
		if (!status)
		 {
			displayMessage(config.macros.rssReader.noRSSFeed.format([url]));
			return;
		}
		if (xhr.responseXML) {
			// response is interpreted as XML
			config.macros.rssReader.cache[url] = xhr.responseXML;
			config.macros.rssReader.displayRssFeed(xhr.responseXML, params[0], url, params[1], params[2], params[3]);
		}
		else {
			if (responseText.substr(0,5) == "<?xml") {
				// response exists but not return as XML -> try to parse it 
				var dom = (new DOMParser()).parseFromString(responseText, "text/xml"); 
				if (dom) {
					// parsing successful so use it
					config.macros.rssReader.cache[url] = dom;
					config.macros.rssReader.displayRssFeed(dom, params[0], url, params[1], params[2], params[3]);
					return;
				}
			}
			// no XML display as html 
			wikify("<html>" + responseText + "</html>", params[0]);
			displayMessage(config.macros.rssReader.msg.noRSSFeed.format([url]));
		}
	},

	// explore down the DOM tree
	displayRssFeed: function(xml, place, feedURL, desc, toFilter, filterString){
		// Channel
		var chanelNode = xml.getElementsByTagName('channel').item(0);
		var chanelTitleElement = (chanelNode ? chanelNode.getElementsByTagName('title').item(0) : null);
		var chanelTitle = "";
		if ((chanelTitleElement) && (chanelTitleElement.firstChild)) 
			chanelTitle = chanelTitleElement.firstChild.nodeValue;
		var chanelLinkElement = (chanelNode ? chanelNode.getElementsByTagName('link').item(0) : null);
		var chanelLink = "";
		if (chanelLinkElement) 
			chanelLink = chanelLinkElement.firstChild.nodeValue;
		var titleTxt = "!![["+chanelTitle+"|"+chanelLink+"]]\n";
		var title = createTiddlyElement(place,"div",null,"ChanelTitle",null);
		wikify(titleTxt,title);
		// ItemList
		var itemList = xml.getElementsByTagName('item');
		var article = createTiddlyElement(place,"ul",null,null,null);
		var lastDate;
		var re;
		if (toFilter) 
			re = new RegExp(filterString.escapeRegExp());
		for (var i=0; i<itemList.length; i++){
			var titleElm = itemList[i].getElementsByTagName('title').item(0);
			var titleText = (titleElm ? titleElm.firstChild.nodeValue : '');
			if (toFilter && ! titleText.match(re)) {
				continue;
			}
			var descText = '';
			descElem = itemList[i].getElementsByTagName('description').item(0);
			if (descElem){
				try{
					for (var ii=0; ii<descElem.childNodes.length; ii++) {
						descText += descElem.childNodes[ii].nodeValue;
					}
				}
				catch(e){}
				descText = descText.replace(/<br \/>/g,'\n');
				if (desc == "asHtml")
					descText = "<html>"+descText+"</html>";
			}
			var linkElm = itemList[i].getElementsByTagName("link").item(0);
			var linkURL = linkElm.firstChild.nodeValue;
			var pubElm = itemList[i].getElementsByTagName('pubDate').item(0);
			var pubDate;
			if (!pubElm) {
				pubElm = itemList[i].getElementsByTagName('date').item(0); // for del.icio.us
				if (pubElm) {
					pubDate = pubElm.firstChild.nodeValue;
					pubDate = this.formatDateString(this.dateFormat, pubDate);
					}
					else {
						pubDate = '0';
					}
				}
			else {
				pubDate = (pubElm ? pubElm.firstChild.nodeValue : 0);
				pubDate = this.formatDate(this.dateFormat, pubDate);
			}
			titleText = titleText.replace(/\[|\]/g,'');
			var rssText = '*'+'[[' + titleText + '|' + linkURL + ']]' + '' ;
			if ((desc != "noDesc") && descText){
				rssText = rssText.replace(/\n/g,' ');
				descText = '@@'+this.itemStyle+descText + '@@\n';				
				if (version.extensions.nestedSliders){
					descText = '+++[...]' + descText + '===';
				}
				rssText = rssText + descText;
			}
			var story;
			if ((lastDate != pubDate) && ( pubDate != '0')) {
				story = createTiddlyElement(article,"li",null,"RSSItem",pubDate);
				lastDate = pubDate;
			}
			else {
				lastDate = pubDate;
			}
			story = createTiddlyElement(article,"div",null,"RSSItem",null);
			wikify(rssText,story);
		}
	},
	
	formatDate: function(template, date){
		var dateString = new Date(date);
		// template = template.replace(/hh|mm|ss/g,'');
		return dateString.formatString(template);
	},
	
	formatDateString: function(template, date){
		var dateString = new Date(date.substr(0,4), date.substr(5,2) - 1, date.substr(8,2)
			);
		return dateString.formatString(template);
	}
	
};

config.macros.rssFeedUpdate = {
	label: "Update",
	prompt: "Clear the cache and redisplay this RssFeed",
	handler: function(place,macroName,params) {
		var feedURL = params[0];
		var tiddlerTitle = params[1];
		createTiddlyButton(place, this.label, this.prompt, 
			function () {
				if (config.macros.rssReader.cache[feedURL]) {
					config.macros.rssReader.cache[feedURL] = null; 
			}
			story.refreshTiddler(tiddlerTitle,null, true);
		return false;});
	}
};
/***
|''Name:''|RefreshTiddlerPlugin|
|''Description:''|Refresh an entire tiddler with optional periodic re-refresh|
|''Date:''|Oct 3, 2006|
|''Source:''|http://solo.dc3.com/tw/index.html#RefreshTiddlerPlugin|
|''Author:''|Bob Denny ~DC-3 Dreams, SP|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''Version:''|1.0.4|
|''~CoreVersion:''|2.0.11, 2.1.0|
|''Browser:''|Firefox 1.5; Internet Explorer 6.0; Safari|
|''Require:''|CheckboxPlugin (http://www.TiddlyTools.com/#CheckboxPlugin)|
This macro provides a tiddler with refresh control. At a minimum, a refresh button appears at the location of the macro invocation. Clicking this button causes the contents of the tiddler to be refreshed. Optionally, a checkbox may also be displayed with which the user can enable and disable automatic periodic refresh of  the tiddler at a specified interval.
There are three optional parameters
|!Parameter|!Description|
|''1''|Button label, default "Refresh"|
|''2''|Button tooltip, default "Refresh this tiddler"|
|''3''|Periodic refresh interval, sec., default 0 (no periodic refresh checkbox)|
!!Revision History
<<<
''2006.09.13 [1.0.1]'' Initial creation, several days
''2006.09.22 [1.0.2]'' Make periodic refresh checkbox optional
''2006.09.29 [1.0.3]'' Refresh checkbox cookie names different from RefreshIframe.
''2006.10.03 [1.0.4]'' Lint check, validate on TW 2.1.0.
<<<
!!Code
***/
//{{{
version.extensions.RefreshTiddler = {
 major: 1, minor: 0, revision: 4,
 date: new Date(2006, 10, 3), 
 type: 'macro',
 source: "#RefreshTiddlerPlugin"
};

config.macros.RefreshTiddler = 
{
	states: { },													// Associative array of refresh states indexed by tiddler name
    
	handler: function(place, macroName, params, wikifier, paramString, tiddler)
	{
		var tidTitle = tiddler.title;								// Shortcut
		if(!this.states[tidTitle]) this.states[tidTitle] = {		// Array of state objects for refreshed tiddlers
				butLabel: "",
				butTooltip: "",
				refInterval: 0,
				doRefresh: false,
				initPerRef: false,
				timerId: 0,
				chkBox: null
				};
		var state = this.states[tidTitle];							// Shortcut
		state.butLabel = params[0] ? params[0] : "Refresh"; 		// Make these react to edits
		state.butTooltip = params[1] ? params[1] : "Refresh this tiddler";
		state.refInterval = params[2] ? params[2] : 0;				// 0 = no periodic refresh checkbox
		var btn = createTiddlyButton(place, state.butLabel, state.butTooltip, this.onButClick);
		btn.name = tidTitle;										// Set button name to tiddler name (see onButClick())
		if(state.refInterval > 0) 									// If periodic refresh wanted
		{
			wikify(" [ =chkPerRefTid" + tiddler.created.convertToYYYYMMDDHHMM() + // Uniquify chkbox ID
				"{config.macros.RefreshTiddler.states[\"" + tidTitle + "\"].chkBox = this;}" +
				"{config.macros.RefreshTiddler.onChkClick(\"" +  tidTitle + "\");}] " + 
				state.butLabel + " every " + state.refInterval + " seconds", place);
			state.timerId = 0;
			if(!state.initPerRef) this.onChkClick(tidTitle);		// Simulate checkbox click (state already from cookie)
		}
	},
    
	onButClick: function(e) 
	{
		if(!e) e = window.event;
		var tidTitle = resolveTarget(e).name;						// Name is the tiddler name!
		//displayMessage("but " + tidTitle);
		story.refreshTiddler(tidTitle, null, true);
		return false;
	},
    
	onChkClick: function(tidTitle) 
	{
		var state = this.states[tidTitle];
		if(state.chkBox.checked) {
			if(state.timerId) clearTimeout(state.timerId);
			this.startRefresh(tidTitle); 
		} else { 
			state.doRefresh = false;
		}
		state.initPerRef = true;
	},
    
	startRefresh: function(tidTitle) 
	{
		var state = this.states[tidTitle];
		state.doRefresh = true;
		//displayMessage("st " + tidTitle + " " + state.refInterval);
		state.timerId = setTimeout("config.macros.RefreshTiddler.reRefresh(\"" + 
						tidTitle + "\")", state.refInterval * 1000);
	},
    
	reRefresh: function(tidTitle)
	{
		var state = this.states[tidTitle];
		state.timerId = 0;
		if(!state.doRefresh) return;
		// Kill re-refresh cycle if tiddler closed or edited
		var tidElem = document.getElementById(story.idPrefix + tidTitle);  // DON'T GET CUTE! THIS IS CORRECT!
		//**BUGBUG** Hardwired to EditTemplate!
		if(!tidElem || tidElem.attributes['template'].value == "EditTemplate") // Prevent hidden or editing
		{
			state.initPerRef = false;
			return;
		}
		//displayMessage("re " + tidTitle + " " + state.refInterval);
		story.refreshTiddler(tidTitle, null, true);
		state.timerId = setTimeout("config.macros.RefreshTiddler.reRefresh(\"" + 
						tidTitle + "\")", state.refInterval * 1000);
	}
};
//}}}
<html>

<body>
 <div id="container">
   <h1>
    Gregory D. Smith
   </h1>
		
 <h2>
  Skills Summary
 </h2>

 <dl id="skillsSummary">
  <dt>
   <strong>
    Software Development Tools Experience
   </strong>
  </dt>

  <dd>
	ColdFusion, 
			<acronym title="Structured Query Language">SQL</acronym> &amp; relational database design 
			<em>(DB/2 UDB, <acronym title="Microsoft">MS</acronym> ACCESS, MySQL, SQL SERVER)</em>, 	
			<acronym title="HyperText Markup Language">HTML</acronym>/<acronym title="Extensible HTML">XHTML</acronym>/<acronym title="Cascading Style Sheets">CSS</acronym>, 
			JavaScript/<acronym title="Dynamic HTML">DHTML</acronym>,
			Crystal Reports,
			<acronym title="PHP: Hypertext Preprocessor">PHP</acronym>,
			<acronym title="Active Server Pages">ASP.NET</acronym>,
			XML,
			<br>Visual Basic.NET 2005, DotNetNuke CMS, e107 CMS, Java, COBOL, JCL, VSAM.
			</dd>

			
			<dt>
			 <strong>
			  System Administration Experience
			 </strong>
			</dt>
			
			<dd>
			Windows NT/2000 Server, <acronym title="(MS Windows) Internet Information Services">IIS</acronym>, 
			 Abyss HTTP Server, ColdFusion Server For Windows,<br>DB/2 UDB Database Server, MySQL Database Server, CVS.
			</dd>

			<dt>
			 <strong>
			  Other Relevant Skills and Experience
			 </strong>
			</dt>
			
			<dd>
			I am an experienced custom application developer familiar with a wide variety of applications for web programming/development, 
			including ColdFusion Studio, Visual Studio, and Eclipse <acronym title="Integrated Development Environment">IDE</acronym>s.
			I have also acquired and applied strong verbal and written communication skills 
			and technical writing, training, team leadership, project management and software quality control experience. 
			</dd>

		</dl>
		
		<h2>
		 Career Snapshot
		</h2>
		
		<table id="careerSnapshot"
		       summary="Career Snapshot">
		
			<tr>
			 <td>
			  Since 1999
			 </td>
			 
			 <td class="jobTitle">

			  Lead Web Applications Developer
			 </td>
			
			 <td>
			  NC State Highway Patrol
			 </td>
			</tr>
			
			<tr>
			 <td>
			  1997 - 1999
			 </td>

			
			 <td class="jobTitle">
			  Application Analyst/Programmer
			 </td>
			
			 <td>
			  NC Department of Revenue
			 </td>
			</tr>		
			
			<tr>
			 <td>
			  1996 - 1997
			 </td>

			
			 <td class="jobTitle">
			  Computer Programmer III
			 </td>
			
			 <td>
			  NC Department of Transportation
			 </td>
			</tr>	
			
			<tr>
			 <td>
			  1994 - 1995
			 </td>

			
			 <td class="jobTitle">
			     Programmer / Analyst
			  </td>
			
			 <td>
			  Central Pacific Bank
			 </td>

			</tr>	
			
			<tr>
			 <td>
			  1993 - 1994
			 </td>
			
			 <td class="jobTitle">
			  Programmer / Analyst
			 </td>
			
			 <td>
			  Hawaiian Insurance & Guaranty
			 </td>

			</tr>												
		    
			<tr>
			 <td>
			  1989 - 1993
			 </td>
			
			 <td class="jobTitle">
			  Senior Programmer
			 </td>
			
			 <td>
			  HMSA - Blue Cross Blue Shield Hawaii
			 </td>

			</tr>
		</table>
		
                <h2>
		 Tertiary Education
		</h2>

		<dl id="education">
                 <dt>
		  <strong>
		   ASP.NET 2.0 Bootcamp
		  </strong>

		 
		   <small>
		   (Wake Technical Community College, 2007)
		  </small>
		 </dt>
                 <dd>
		   Undergraduate level intensive focusing on the creation of dynmic database populated webpages using Visual Basic 2005. Content included ASP.NET language, development tools, SQl Server and MySQL database connectivity and other concepts. 
		 </dd>	  
                 <dt>
		  <strong>
		   Beginning Java
		  </strong>

		 
		   <small>
		   (Wake Technical Community College, 2007)
		  </small>
		 </dt>
                 <dd>
		   Undergraduate level course focusing on the language and syntax of the Java programming language. Previous programming experienced assumed so that the couse would not be devoted to teaching programming as much as the Java language, development tools, and other concepts. 
		 </dd>	                 

 
		 <dt>
		  <strong>
		   Creating Web Portals And Custom Modules With DotNetNuke
		  </strong>

		 
		   <small>
		   (TakeNote Technologies, 2005)
		  </small>
		 </dt>
		
		 <dd>
		   Undergraduate level course covering the installation, administration of the DotNetNuke web portal software along with the creation 
		   of custom-written modules.  Topics include, installation, security, configuration,
		   skins, templates, using Visual Studio for creating custom modules.
		 </dd>	
			
		 <dt>
		  <strong>
		   Developing ASP.NET Web Applications Using Visual Basic.NET
		  </strong>

		  
		  <small>
		   (TakeNote Technologies, 2005)
		  </small>
		 </dt>
		
		  <dd>
		   Undergraduate level course for development of ASP.NET dynamic web applications using the DotNet architecture.
		  </dd>				
		
		  <dt>
		   <strong>
		    Developing Windows Applications With Visual Basic.NET
		   </strong>

		   
		   <small>
		    (TakeNote Technologies, 2005)
		   </small>
		  </dt>
			
		    <dd>
			 Undergraduate level course for development of Windows applications using the DotNet architecture.
			</dd>
		</dl>	
		
                <br>

		<h2>

		 Career History ( by job function / responsibility )
		</h2>
		
		<dl id="careerHistory">
		 <dt>
		  <strong>
		   Lead Web Applications Developer - NC State Highway Patrol, Raleigh, NC
		  </strong>
		
		  <small>
		   October 1999 - Present
		  </small>

		 </dt>
		
		 <dd>
		  At the Highway Patrol, I work as lead developer and system 
		  administrator in a team of three. While working at the Patrol, I have become the lead web developer in addition
		  the database administrator of the organization's intranet which hosts static and dynamic content including
		  document management and the creation and tech review of custom- written web applications as required
		  by management and various units within the Patrol.  In addition, conducted conversion of all DB/2 hosted
                  database tables to run on SQLSERVER. 
		</dd>
		
		<dt>
                 <strong>
		  Application Analyst / Programmer - NC Department of Revenue, Raleigh, NC
		 </strong>
		
		 <small>
		  February 1997 - October 1999
		 </small>

		</dt>
		
		<dd>
		 During my time at the Department of Revenue, I was employed as a general-purpose maintenance mainframe
		 programmer as a member of various teams.  The scope of my responsibilities varied by team to encompass
		 aspects of application maintenance from documentaion write-ups, to design, coding, testing, and QA of
		 applications used by the organization.  
		</dd>
			
		<dt>
		 <strong>
		  Computer Programmer III - NC Department of Transportation, Raleigh, NC
		 </strong>
		
		 <small>
		  January 1996 - February 1997
		 </small>

		</dt>
		
		<dd>
		 Performed maintenance programming within driver license certification.  In addition,
		 I participated as a memember of new hardware and software rollout and testing for a
		 new vehicle registration system.
		</dd>
			
		<dt>
		 <strong>
		  Programmer / Analyst - Central Pacific Bank, Honolulu, Hawaii
		 </strong>
		
		 <small>
		  November 1994 - June 1995
		 </small>

		</dt>
		
		<dd>
		 I was a member of an eight person programming staff responsible for
		 performing analysis and maintenance programming for financial applications.
		</dd>
			
		<dt>
		 <strong>
		  Programmer / Analyst - Hawaiian Insurance & Guaranty, Honolulu, Hawaii
		 </strong>
		
		 <small>

		  November 1993 - November 1994
		 </small>
		</dt>
	
		<dd>
		 Designed, wrote, tested, and implemented various homeowner insurance applications.
		</dd>
			
		 <dt>
		  <strong>
		   Senior Programmer - HMSA / Blue Cross Blue Shield, Honolulu, Hawaii
		  </strong>

		
		  <small>
		   December 1989 - October 1993
		  </small>
		</dt>
	
		<dd>
		 Responsible for analysis, installation, and on-going maintenance and end-user support for four different
		 medical claims processing applications on both mainframe and PC-based platforms.
		</dd>		
		</dl>		
	</div>
	
</body>

</html>
I used to be fairly active in playing various roleplaying games, but over time have had interest focus to the following : 

[[Dungeons and Dragons]]

[[Marvel Super Heroes Adventure Game]]

[[Star Wars]]
[<img[tn_rollerderby.jpg]] God, how I miss roller derby!  

There was nothing like sitting in front of the tv Sundays at noon after mowing the yard to watch a hour match between teams having a baloney sandwich and a coke for lunch.  What made this so entertaining was that the teams were co-ed, you had women & men skating and competing against each other.  The current "roller babes" is nothing like the original !  Only teams out are either glamour gals trying to be "discovered" or some punk / goth - looking mess.  And despite what some may think, the hitting is real, injuries happened, and it was before all the pansy violence-on-tv wackos changed things.

The videos are hard as hell to track down and get, but if you ever are able to find any...they are pure gold and a treasure to enjoy !  I never get tired of watching a match since I  can see something new every time I watch one. . . 

|>|>|>|>|>|>| ''Roller Derby DVD Collection'' |h
| ''Broadcast Date'' | ''Opponents'' |
| 02/20/73 | Bombers / Pioneers |
| 02/22/73 | Pioneers / Bombers |
| 03/00/73 | Bombers / Pioneers |
| 03/22/73 | Bombers / Pioneers |
| 04/00/73 | Bombers / Jolters |
| 05/00/73 | Pioneers / Chiefs |
| 05/09/73 | Chiefs / Pioneers |
| 05/11/73 | Bombers / Jolters |
| 05/11/73 | Bombers / Jolters |
| 05/16/73 | Pioneers / Chiefs |
| 05/23/73 | Bombers / Red Devils |
| 05/23/73 | Pioneers / Chiefs |
| 06/03/73 | Bombers / Red Devils |
| 06/10/73 | Bombers / Chiefs |
| 06/10/73 | Bombers / Chiefs |
| 07/01/73 | Bombers  / Pioneers |
| 07/08/73 | Bombers / Pioneers |
| 07/15/73 | Chiefs / Red Devils |
| 07/15/73 | Chiefs / Red Devils |
| 07/22/73 | Bombers / Red Devils |
| 08/05/73 | Bombers / Jolters |
| 08/11/73 | Chiefs / Red Devils |
| 08/19/73 | Bombers / Pioneers |
| 08/19/73 | Jolters / Chiefs |
| 08/26/73 | Pioneers / Jolters |
| 08/26/73 | Bombers / Chiefs |
| 09/00/73 | Bombers / Chiefs |
| 09/07/73 | Pioneers / Jolters |
| 09/08/73 | Chiefs / Jolters |
| 10/30/73 | Pioneers / Jolters |
| 11/00/73 | Pioneers / Jolters |
| 11/00/73 | Pioneers / Jolters |
| 11/02/73 | Pioneers / Jolters |
| 11/04/73 | Bombers / Chiefs |
| 11/19/73 | Bombers / Chiefs |
|>|>|>|>|>|>| ''Gambling Log For Roulette'' |h
| ''Date'' | ''Time'' | ''Casino'' | ''Table/Machine'' | ''Bankroll'' | ''Cash Out'' | ''Net'' |
| 04/10/2009 | 9:30 AM | Plaza | RL01 | 200.00 | 180.00 | @@color(red):''20.00'' @@ |
| 04/09/2009 | 3:30 PM | Fremont | RL01 | 200.00 | 215.00 | 15.00 |
| 04/08/2009 | 9:30 PM | Golden Nugget | RL02 | 200.00 | 165.00 | @@color(red):''35.00'' @@ |
| 04/06/2009 | 7:30 PM | Vegas Club | RL01 | 200.00 | 225.00 | 25.00 |
| 04/05/2009 | 9:30 AM | Binion's | RL01 | 200.00 | 180.00 | @@color(red):''20.00'' @@ |
| 04/04/2009 | 3:30 PM | Fremont | RL01 | 200.00 | 215.00 | 15.00 |
| 04/03/2009 | 10:30 AM | 4 Queens | RL01 | 200.00 | 170.00 | @@color(red):''30.00'' @@ |
| 04/02/2009 | 8:30 AM | Fremont | RL01 | 200.00 | 182.00 | @@color(red):''18.00'' @@ |
| 03/31/2009 | 6:30 PM | Fremont | RL02 | 200.00 | 172.00 | @@color(red):''28.00'' @@ |
| 03/26/2009 | 9:30 AM | El Cortez | RL01 | 200.00 | 222.00 | 22.00 |
| 03/24/2009 | 3:30 PM | Vegas Club | RL01 | 200.00 | 221.00 | 21.00 |
| 03/23/2009 | 6:30 PM | El Cortez | RL02 | 200.00 | 148.00 | @@color(red):''52.00'' @@ |
| 03/22/2009 | 9:30 PM | Plaza | RL01 | 200.00 | 245.00 | 45.00 |
| 03/19/2009 | 10:30 AM | Golden Nugget | RL01 | 200.00 | 229.00 | 29.00 |
| 03/04/2009 | 11:00 AM | 4 Queens | RL01 | 200.00 | 217.00 | 17.00 |
| 03/08/2009 | 10:30 AM | Golden Nugget | RL01 | 200.00 | 225.00 | 25.00 |
| 02/05/2009 | 9:30 PM | Vegas Club | RL01 | 200.00 | 241.00 | 41.00 |
|>|>|>|>|>|>|  ''Net Balance'' |h
|>|>|>|>|>|>| ''52.00'' |
Second World War at Sea game has a variety of scenarios, from a dozen in Eastern Fleet up to 50 in Bomb Alley. Almost all are for two players. Each scenario lists the ships and aircraft available, the goals each player needs to achieve in order to win, and the amount of time available.

Scenarios are based on historical missions, some of which resulted in battle, all of which could have. Missions include amphibious invasions, convoy escort, commerce raiding, shore bombardment and more. Players find enemy fleets and stop them from accomplishing their missions, while achieving their own ends. 
|CssClass|k
|[img[tn_ap1.jpg]]|[img[tn_ap2.jpg]]|[img[tn_ap3.jpg]]|[img[tn_ap4.jpg]]|[img[tn_ap5.jpg]]|
|[img[tn_ap6.jpg]]|[img[tn_ap7.jpg]]|[img[tn_ap8.jpg]]|[img[tn_ap9.jpg]] |
[[Home]]|[[Appointment Book]]|[[Portfolio Ticker]]|[[Vacation / Travel]]|[[Contact]]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<<search>>
<html>
<table bgcolor="#CCCCCC">
<th>
 &nbsp;&nbsp;Font Viewer Control&nbsp;&nbsp;
</th>
</table>
</html>
<<fontSize "font-size:">>
[img[tn_illlegal3.jpg][http://illegalimmigrants.org]]
[img[guildlogo.jpg][http://programmersguild.org/]]
<html>
<table align="center"
       border="1">
<caption>
<b>
<u>
 Babe of the Day
</u>
</b>
</caption>
<tr>
<td>
 <a href="http://news.1918.com/images/babe_08-03-2009.jpg">
  <img src="http://news.1918.com/images/babe_08-03-2009.jpg" height="150" width="150" border="1">
 </a>
</td>
</tr>
</table>
</html>
<<calendar thismonth>>
[img[Image of national origin|madeinamerica.jpg]]

<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
__Table of Contents__
<<tableOfContents -author -creator width=40%>>

[<img[bounce.gif]]&nbsp;&nbsp;Greg's Asylum   [img[Image of US Navy|tn_navyposter.jpg][navyposter.jpg]]
[>img[Image of the Sky Window|tn_skywindow.jpg][skywindow.jpg]]

Sky Window is my choice for using binoculars to observe the night sky.  Binocular astronomy has always been a pain in the neck to keep looking up, with this product you look "down" and see objects reflected in the mirror !  You can sit for hours in comfort using this means of binocular astronomy!

The binoculars I use with the mount are ''Oberwerk 9x60'', and they work great !  At the present I just set this on a patio table when I want to use it since it's so easily to transport and set up.  One day, I'll build a permanent mount for it.
Select from the following list of casino games to see the log entries.I have made :

[[Double Diamond Log]] | [[Little Green Men Log]]
I had dropped out of playing Star Wars for a bit as each movie seemed to have fits & starts for getting players and making adjustments as each movie changed some aspect of the one before it, however, now that all the movies are finished, this is the version that is the most concise with Lucas concept for the canon story - plus, the only one officially approved by the guy !

Below, are the components currently available for playing the game.

''__Core Rules__''

[img[tn_swrpg1.jpg]]|

''__Supplemental Materials__''

[img[tn_swrpg2.jpg]] [img[tn_swrpg3.jpg]] [img[tn_swrpg6.jpg]]

''__Campaign Guide Materials__''

[img[tn_swrpg4.jpg]][img[tn_swrpg5.jpg]]
/* horizontal main menu */

#topMenu { background: [[ColorPalette::PrimaryMid]]; color: [[ColorPalette::PrimaryPale]]; padding: 0.2em 0.2em 0.2em 0.5em; border-bottom: 2px solid #000000; }

#topMenu br { display: none; }

#topMenu .button, #topMenu .tiddlyLink, #topMenu a { margin-left: 0.25em; margin-right: 0.25em; padding-left: 0.5em; padding-right: 0.5em; color: [[ColorPalette::PrimaryPale]]; font-size: 1.15em; }

#topMenu .button:hover, #topMenu .tiddlyLink:hover { background: [[ColorPalette::PrimaryDark]]; }

.viewer .FOO table tr.oddRow { background-color: #bbbbbb; }
.viewer .FOO table tr.evenRow { background-color: #fff; } 
[>img[Image of Submarine game|submarine.jpg]]
Submarine is a tactical game of World War II submarine warfare. One player assumes the role of a submarine captain while others are escort and/or convoy captains. The submarine location is kept secret and the submarine player uses plotted movement and firing (torpedoes). The escort/convoy players move their ships on the board. The game includes rules for different nationalities, various anti-submarine warfare systems, historical scenarios, night-fighting, and Design Your Own scenarios.
[[Big Raise Hold'em Log]] | [[Caribbean Stud Poker Log]] | [[Craps Log]] | [[Let It Ride Log]] | [[Mini-Baccarat Log]]

[[Pai-Gow Poker Log]] | [[Roulette Log]]
|CssClass|k
|!heading column 1|!heading column 2|h
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |
|caption|c


|!column heading 1|!column heading 2|!column heading 3|h
|row 1, column 1|row 1, column 2|row 1, column 3|
|row 2, column 1|row 2, column 2|row 2, column 3|
|row 3, column 1|row 3, column 2|row 3, column 3|
|!column footer 1|!column footer 2|!column footer 3|f
|caption|c


|* List item 1<br>* List item 2<br>* list item 3<br><br>* List item with double-spacing|
|Name|TableOfContentsPluginInfo|
|Source|http://www.TiddlyTools.com/#TableOfContentsPlugin|
|Documentation|http://www.TiddlyTools.com/#TableOfContentsPluginInfo|
|Version|2.4.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for TableOfContentsPlugin|
When there are many tiddlers in a document, the standard 'tabbed list of tiddlers' in the right-hand sidebar can become very long, occupying a lot of page space and requiring a lot scrolling in order to locate and select a tiddler.  The [[TableOfContentsPlugin]] addresses this problem by replacing the standard tabbed list display with a single listbox/droplist control that uses a very small amount of page space, regardless of the number of tiddlers in the document.
!!!!!Usage
<<<
To view a tiddler, simply select (or double-click) its title from the listbox and it will automatically be displayed on the page.  The listbox also includes special 'command' items that determine the order and type of tiddlers that are shown in the list:

''[by title]'' displays all tiddlers in the document.
''[by date/author/creator/tags]'' displays indented sections, sorted accordingly, with headings (indicated by a '+') that can be expanded, one at a time, to view the list of tiddlers in that section.
''[missing]'' displays tiddlers that have been referenced within the document but do not yet exist.
''[orphans]'' displays tiddlers that do exist in the document but have not been referenced by a link from anywhere else within the document.
''[shadows]'' displays special default/fallback tiddlers that are used by TiddlyWiki to configure built-in features and add-on macros/extensions.

The current list ''display setting is indicated by an arrow (">")'' symbol to the left of command item.  Selecting a command item causes the listbox to be reloaded with the appropriate contents and sort order.

When you are viewing a list of tiddlers by date/author/creator/tags, ''shift-clicking'' on a section heading or command item causes the listbox display to ''toggle between "show-one-section-at-a-time" and "expand-all-sections"'' display options, allowing you to quickly see all tiddler titles at once without having to view individual indented sections one at a time.

The ''size of the listbox can be adjusted'' so you can view more (or less) tiddler titles at one time.  Select ''[-]'' to reduce the size by one line, ''[+]'' to increase the size by one line, or ''[=]'' to autosize the list to fit the current contents (toggles on/off). //Note: If the listbox is reduced to a single line, it displayed as a droplist instead of a fixed-sized listbox.//  You can ''show/hide the entire listbox'' by selecting the "contents" label that appears above the listbox.
<<<
!!!!!Configuration
<<option chkTOCShow>> display table of contents listbox
<<option chkTOCIncludeHidden>> include tiddlers tagged with <<tag excludeLists>> in listbox
listbox shows <<option txtTOCListSize>> lines, sorted by <<option txtTOCSortBy>>
!!!!!Parameters
<<<
The macro accepts optional parameters to control various features and functions:
* ''{{{label:text}}}''
Replace the default text ("contents") that appears above the listbox.  //Note: to include spaces in the label text, you must enclose the entire parameter in quotes// (e.g., {{{"label:my list of tiddlers"}}})
* ''{{{sort:fieldtype}}}''
Sets the initial display order for items in the listbox.  'fieldtype' is one of the following pre-defined keywords: ''title'', ''modified'' //(date)//, ''modifier'' //(author)//, ''creator'', ''tags'', ''missing'', ''orphans'', or  ''shadows''
* ''{{{date:format}}}''
Controls the formatting of dates in listbox display.  'format' is a text-substitution template containing one or more of the following special notations.
** DDD - day of week in full (eg, "Monday")
** DD - day of month, 0DD - adds leading zero, DDth adds suffix
** MMM - month in full (eg, "July")
** MM - month number, 0MM - adds leading zero
** YYYY - full year, YY - two digit year
//Note: to include spaces in the formatting template, you must enclose the entire parameter in quotes// (e.g., {{{"date:DDD, DD/MM/YY"}}})
* ''{{{size:nnn}}}''
Sets the initial number of lines to display in the listbox.  If this parameter is omitted or "size:1" is specified, a single-line droplist is created.  When a size > 1 is provided, a standard, fixed-size scrollable listbox is created.  You can use "size:0" or "size:auto" to display a varible-height listbox that automatically adjusts to fit the current list contents without scrolling.
* ''{{{width:nnn[cm|px|em|%]}}}''
Sets the width of the listbox control.  Overrides the built-in CSS width declaration (=100%).  Use standard CSS width units (cm=centimeters, px=pixels, em=M-space, %=proportional to containing area).  You can also use a ".TOCList" custom CSS class definition to override the built-in CSS declarations for the listbox.
* ''{{{padding:nnn[cm|px|em|%]}}}''
Overrides default listbox control padding.  Sets the CSS padding style.
* ''{{{margin:nnn[cm|px|em|%]}}}''
Overrides default listbox control spacing.  Sets the CSS margin style.
* ''{{{prompt}}}''
Sets the non-selectable prompt text that is displayed as the first line of the listbox //(note: this feature is not supported by the listbox control on all browsers)//.  Let's you include a short text message (such as "select a tiddler"), even when displaying a compact single-line droplist.
* ''{{{inline}}}''
Normally, the listbox is contained inside a {{{<div>}}} element.  This setting causes the plugin to use a {{{<span>}}} instead, allowing for more flexible 'inline' placement when embedded within other content.
* ''{{{hidelist}}}''
Hides the listbox when it is first displayed.  Initially, only the listbox label and size controls will appear.  Clicking on the listbox label text will alternately show/hide the listbox display.  //Note: this setting does not affect the content of the listbox, only whether or not it is initially visible.//
* ''{{{-title}}}''
Omit "by title" command item and corresponding listbox content.  
* ''{{{-date}}}''
Omit "by date" command item and corresponding listbox content.  
* ''{{{-author}}}''
Omit "by author" command item and corresponding listbox content.  
* ''{{{-creator}}}''
Omit "by creator" command item and corresponding listbox content.  
* ''{{{-tags}}}''
Omit "by tags" command item and corresponding listbox content.  
* ''{{{-missing}}}''
Omit "missing" command item and corresponding listbox content.  
* ''{{{-orphans}}}''
Omit "orphans" command item and corresponding listbox content.  
* ''{{{-shadows}}}''
Omit "shadows" command item and corresponding listbox content.  
<<<
!!!!!Examples
<<<
<<tableOfContents "label:all tiddlers" sort:title width:40% size:1>>
<<tableOfContents "label:by date" sort:modified size:1 width:40%>>
<<tableOfContents "label:tagged tiddlers" sort:tags size:1 width:40%>>
<<tableOfContents "label:shadow tiddlers" sort:shadows size:1 width:40%>>
<<<
!!!!!Revisions
<<<
2008.04.09 [2.4.3] restored config.options.chkTOCShow and onClickTOCMenu() handler
2008.04.07 [2.4.2] added "Configuration" section and removed config.options.chkTOCShow and onClickTOCMenu() handler
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.25 [2.4.1] code cleanup and performance improvements
2007.12.25 [2.4.0] renamed 'system' section to 'shadows' (and no longer list plugins, etc. in that section).  Also, added 'by creator' sort order (with fallback to 'modifier' if 'creator' custom field is undefined). Thanks to RA for suggestion and code tweaks.
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.03.22 [2.3.2] in refreshTOCLists(), when sorting by date, use convertToLocalYYYYMMDDHHMM() instead of formatString() to compare dates for 'section headings' and only use formatString() when actually generating the section heading date display.  Improves performance significantly for date sorted listbox, especially in documents with hundreds of tiddlers.  Suggestion by AndreasHoefler.
2007.03.21 [2.3.1] in refreshTOCLists(), only get list of 'select' elements, instead of scanning through all elements (saves significant time during refresh events.  Suggestion by AndreasHoefler.
2006.11.27 [2.3.0] added ability to omit sections from listbox via macro params (e.g., "-date -tags", etc.).  Based on request from DavidWinfield.
2006.05.21 [2.2.7] added onkeyup handling for enter key (=view selected tiddler, equivalent to double-click)
2006.02.14 [2.2.6] FF1501 fix: add 'var r' and 'var k' to unintended global variable declarations in refreshTOCList() and getTOCListFromButton().  Thanks for report from AndreasHoefler.
2006.02.04 [2.2.5] add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals
2005.12.21 [2.2.2] in onClickTOCList() and onDblClickTOCList(), prevent mouse events from 'bubbling' up to other handlers
2005.10.30 [2.2.1] in refreshTOCList(), fixed calculation of "showHidden" to check for 'readOnly' (i.e., "via HTTP") flag.  Based on a report from LyallPearce
2005.10.30 [2.2.0] hide tiddlers tagged with 'excludeLists' (with option to override, i.e., "include hidden tiddlers")
2005.10.09 [2.1.0] combined documentation and code in a single tiddler
added click toggle for expand-all vs. show-one-branch
2005.08.07 [2.0.0] major re-write to not use static ID values for listbox controls, so that multiple macro instances can exist without corrupting each other or the DOM.  Moved HTML and CSS definitions into plugin code instead of using separate tiddlers.  Added macro parameters for label, sort, date, size, width, hidelist and showtabs
2005.08.03 [1.0.3] added "showtabs" optional parameter
2005.07.27 [1.0.2] core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet().  Added show/hide toggle (click on 'contents' link)
2005.07.23 [1.0.1] added parameter checks and corrected addNotification() usage
2005.07.20 [1.0.0] Initial Release
<<<
/***
|''Name:''|TableSortingPlugin|
|''Description:''|Dynamically sort tables by clicking on column headers|
|''Author:''|Saq Imtiaz ( [email protected] )|
|''Source:''|http://tw.lewcid.org/#TableSortingPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.02|
|''Date:''|25-01-2008|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Usage:
* Make sure your table has a header row
** {{{|Name|Phone Number|Address|h}}}<br> Note the /h/ that denote a header row 
* Give the table a class of 'sortable'
** {{{
|sortable|k
|Name|Phone Number|Address|h
}}}<br>Note the /k/ that denotes a class name being assigned to the table.
* To disallow sorting by a column, place {{{<<nosort>>}}} in it's header
* To automatically sort a table by a column, place {{{<<autosort>>}}} in the header for that column
** Or to sort automatically but in reverse order, use {{{<<autosort reverse>>}}}

!!Example:
|sortable|k
|Name |Salary |Extension |Performance |File Size |Start date |h
|ZBloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |
|ABloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |
|CBloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |
|DBloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |
|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |
|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |
|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |
|Shakespeare, Bill |£122000.00|3211 |6 |33.22Gb |12/11/1961 |
|Shakespeare, Hamlet |£9000 |9005 |-8 |3Gb |01/01/2002 |
|Fitz, Marvin |€3300.30 |5554 |+5 |4Kb |05/22/1995 |

***/
// /%
//!BEGIN-PLUGIN-CODE
config.tableSorting = {
	
	darrow: "\u2193",
	
	uarrow: "\u2191",
	
	getText : function (o) {
		var p = o.cells[SORT_INDEX];
		return p.innerText || p.textContent || '';
	},
	
	sortTable : function (o,rev) {
		SORT_INDEX = o.getAttribute("index");
		var c = config.tableSorting;
		var T = findRelated(o.parentNode,"TABLE");
		if(T.tBodies[0].rows.length<=1) 
			return;
		var itm = "";
		var i = 0;
		while (itm == "" && i < T.tBodies[0].rows.length) {
			itm = c.getText(T.tBodies[0].rows[i]).trim();
			i++;
		}
		if (itm == "") 
			return; 	
		var r = [];
		var S = o.getElementsByTagName("span")[0];		
		c.fn = c.sortAlpha; 
		if(!isNaN(Date.parse(itm)))
			c.fn = c.sortDate; 
		else if(itm.match(/^[$|£|€|\+|\-]{0,1}\d*\.{0,1}\d+$/)) 
			c.fn = c.sortNumber; 
		else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/)) 
			c.fn = c.sortFile; 
		for(i=0; i<T.tBodies[0].rows.length; i++) {
			 r[i]=T.tBodies[0].rows[i]; 
		} 
		r.sort(c.reSort);
		if(S.firstChild.nodeValue==c.darrow || rev) {
			r.reverse();
			S.firstChild.nodeValue=c.uarrow;
		} 
		else 
			S.firstChild.nodeValue=c.darrow;
		var thead = T.getElementsByTagName('thead')[0]; 
		var headers = thead.rows[thead.rows.length-1].cells;
		for(var k=0; k<headers.length; k++) {
			if(!hasClass(headers[k],"nosort"))
				addClass(headers[k].getElementsByTagName("span")[0],"hidden");
		}
		removeClass(S,"hidden");
		for(i=0; i<r.length; i++) { 
			T.tBodies[0].appendChild(r[i]);
			c.stripe(r[i],i);
			for(var j=0; j<r[i].cells.length;j++){
				removeClass(r[i].cells[j],"sortedCol");
			}
			addClass(r[i].cells[SORT_INDEX],"sortedCol");
		}
	},
	
	stripe : function (e,i){
		var cl = ["oddRow","evenRow"];
		i&1? cl.reverse() : cl;
		removeClass(e,cl[1]);
		addClass(e,cl[0]);
	},
	
	sortNumber : function(v) {
		var x = parseFloat(this.getText(v).replace(/[^0-9.-]/g,''));
		return isNaN(x)? 0: x;
	},
	
	sortDate : function(v) {
		return Date.parse(this.getText(v));
	},

	sortAlpha : function(v) {
		return this.getText(v).toLowerCase();
	},
	
	sortFile : function(v) { 		
		var j, q = config.messages.sizeTemplates, s = this.getText(v);
		for (var i=0; i<q.length; i++) {
			if ((j = s.toLowerCase().indexOf(q[i].template.replace("%0\u00a0","").toLowerCase())) != -1)
				return q[i].unit * s.substr(0,j);
		}
		return parseFloat(s);
	},
	
	reSort : function(a,b){
		var c = config.tableSorting;
		var aa = c.fn(a);
		var bb = c.fn(b);
		return ((aa==bb)? 0 : ((aa<bb)? -1:1));
	}
};

Story.prototype.tSort_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText){
	var elem = this.tSort_refreshTiddler.apply(this,arguments);
	if(elem){
		var tables = elem.getElementsByTagName("TABLE");
		var c = config.tableSorting;
		for(var i=0; i<tables.length; i++){
			if(hasClass(tables[i],"sortable")){
				var x = null, rev, table = tables[i], thead = table.getElementsByTagName('thead')[0], headers = thead.rows[thead.rows.length-1].cells;
				for (var j=0; j<headers.length; j++){
					var h = headers[j];
					if (hasClass(h,"nosort"))
						continue;
					h.setAttribute("index",j);
					h.onclick = function(){c.sortTable(this); return false;};
					h.ondblclick = stopEvent;
					if(h.getElementsByTagName("span").length == 0)
						createTiddlyElement(h,"span",null,"hidden",c.uarrow); 
					if(!x && hasClass(h,"autosort")) {
						x = j;
						rev = hasClass(h,"reverse");
					}
				}
				if(x)
					c.sortTable(headers[x],rev);		
			}
		}
	}
	return elem; 
};

setStylesheet("table.sortable span.hidden {visibility:hidden;}\n"+
	"table.sortable thead {cursor:pointer;}\n"+
	"table.sortable .nosort {cursor:default;}\n"+
	"table.sortable td.sortedCol {background:#ffc;}","TableSortingPluginStyles");

function stopEvent(e){
	var ev = e? e : window.event;
	ev.cancelBubble = true;
	if (ev.stopPropagation) ev.stopPropagation();
	return false;	
}	

config.macros.nosort={
	handler : function(place){
		addClass(place,"nosort");
	}	
};

config.macros.autosort={
	handler : function(place,m,p,w,pS){
		addClass(place,"autosort"+" "+pS);		
	}	
};
//!END-PLUGIN-CODE
// %/
/***
|Name|TableOfContentsPlugin|
|Source|http://www.TiddlyTools.com/#TableOfContentsPlugin|
|Documentation|http://www.TiddlyTools.com/#TableOfContentsPluginInfo|
|Version|2.4.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|replace the standard tabbed contents list with a scrolling listbox|
When there are many tiddlers in a document, the standard 'tabbed list of tiddlers' in the right-hand sidebar can become very long, occupying a lot of page space and requiring a lot scrolling in order to locate and select a tiddler.  The TableOfContentsPlugin addresses this problem by replacing the standard tabbed list display with a single listbox/droplist control that uses a very small amount of page space, regardless of the number of tiddlers in the document.
!!!!!Documentation
>see [[TableOfContentsPluginInfo]]
!!!!!Configuration
<<option chkTOCShow>> display table of contents listbox
<<option chkTOCIncludeHidden>> include tiddlers tagged with <<tag excludeLists>> in listbox
listbox shows <<option txtTOCListSize>> lines, sorted by <<option txtTOCSortBy>>
!!!!!Revisions
<<<
2008.04.09 [2.4.3] restored config.options.chkTOCShow and onClickTOCMenu() handler
|please see [[TableOfContentsPluginInfo]] for additional revision details|
2005.06.13 [1.0.0] Initial Release (as adaptation - predates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.TableOfContentsPlugin= {major: 2, minor: 4, revision: 3, date: new Date(2008,4,9)};
//}}}

// // 1.2.x compatibility
//{{{
if (!window.story) window.story=window;
if (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}
if (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}
if (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}
//}}}

//{{{
// define defaults for cookie-based option values
if (config.options.txtTOCSortBy==undefined)	config.options.txtTOCSortBy="modified";
if (config.options.txtTOCListSize==undefined)	config.options.txtTOCListSize=19;
if (config.options.chkTOCShow==undefined)	config.options.chkTOCShow=true;
if (config.options.chkTOCIncludeHidden==undefined)	config.options.chkTOCIncludeHidden=false;

// define macro "tableOfContents" to render controls
config.macros.tableOfContents = { label: "contents" };
config.macros.tableOfContents.cmdMax=8; // index of maximum command item

config.macros.tableOfContents.css = '\
.TOC { padding:0.5em 1em 0.5em 1em; }\
.TOC a { padding:0em 0.25em 0em 0.25em; color:inherit; }\
.TOCList { width: 100%; font-size:8pt; margin:0em; }\
';

config.macros.tableOfContents.html = '\
<div style="text-align:right">\
	<span style="float:left">\
	<a href="JavaScript:;" id="TOCMenu" style="padding: 0em;"\
		onclick="onClickTOCMenu(this)" title="show/hide table of contents">%label%</a>\
	</span>\
	<a href="JavaScript:;" id="TOCSmaller" style="display:inline"\
		onclick="resizeTOC(this)" title="reduce list size">&#150;</a>\
	<a href="JavaScript:;" id="TOCLarger"style="display:inline"\
		onclick="resizeTOC(this)" title="increase list size">+</a>\
	<a href="JavaScript:;" id="TOCMaximize"style="display:inline"\
		onclick="resizeTOC(this)" title="maximize/restore list size">=</a>\
</div>\
';

config.macros.tableOfContents.handler = function(place,macroName,params) { 
	var parsedParams = new Array();
	parsedParams['label']=this.label;
	parsedParams['inline']=false;
	while (params.length>0) {
		if (params[0]=="label:none") parsedParams['label']="";
		else if (params[0].substr(0,6)=="label:") parsedParams['label']=params[0].substr(6);
		if (params[0].substr(0,7)=="prompt:") parsedParams['prompt']=params[0].substr(7);
		if (params[0].substr(0,8)=="padding:")parsedParams['padding']=params[0].substr(8);
		if (params[0].substr(0,7)=="margin:") parsedParams['margin']=params[0].substr(7);
		if (params[0].substr(0,5)=="sort:")   parsedParams['sortby']=params[0].substr(5);
		if (params[0].substr(0,5)=="date:")   parsedParams['date']=params[0].substr(5);
		if ((params[0]=="size:auto")||(params[0]=="size:0")) parsedParams['autosize']=true;
		else if (params[0] && (params[0].substr(0,5)=="size:")) parsedParams['requestedSize']=params[0].substr(5);
		if (params[0].substr(0,6)=="width:") parsedParams['width']=params[0].substr(6);
		if (params[0]=="hidelist") parsedParams['hidelist']=true;
		if (params[0]=="inline")   parsedParams['inline']=true;
		if (params[0]=="-title")   parsedParams['hide_title']=true;
		if (params[0]=="-date")    parsedParams['hide_date']=true;
		if (params[0]=="-author")  parsedParams['hide_author']=true;
		if (params[0]=="-creator") parsedParams['hide_creator']=true;
		if (params[0]=="-tags")    parsedParams['hide_tags']=true;
		if (params[0]=="-missing") parsedParams['hide_missing']=true;
		if (params[0]=="-orphans") parsedParams['hide_orphans']=true;
		if (params[0]=="-shadows") parsedParams['hide_shadows']=true;
		params.shift(); 
	}
	setStylesheet(config.macros.tableOfContents.css,"tableOfContents");
	var newTOC=createTiddlyElement(place,parsedParams['inline']?"span":"div",null,"TOC",null)
	if (parsedParams['margin'])	{ newTOC.style.margin=parsedParams['margin']; }
	if (parsedParams['padding'])	{ newTOC.style.padding=parsedParams['padding']; }
	if (parsedParams['label']!="") newTOC.innerHTML=config.macros.tableOfContents.html.replace(/%label%/,parsedParams['label']);
	var newTOCList=createTOCList(newTOC,parsedParams)
	refreshTOCList(newTOCList);
	store.addNotification(null,reloadTOCLists);	// reload listbox after every tiddler change
}

// IE needs explicit global scoping for functions/vars called from browser events
window.onChangeTOCList=onChangeTOCList;
window.onClickTOCList=onClickTOCList;
window.onDblClickTOCList=onDblClickTOCList;
window.reloadTOCLists=reloadTOCLists;
window.refreshTOCList=refreshTOCList;
window.onClickTOCMenu=onClickTOCMenu;
window.resizeTOC=resizeTOC;
	
function createTOCList(place,params) {
	var list = createTiddlyElement(place,"select",null,"TOCList",params['prompt'])
	list.params=params;
	list.onchange=onChangeTOCList;
	list.onclick=onClickTOCList;
	list.ondblclick=onDblClickTOCList;
	list.onkeyup=onKeyUpTOCList;
	list.style.display=config.options.chkTOCShow ? "block" : "none" ;
	list.sortBy=config.options.txtTOCSortBy;
	list.dateFormat="DD MMM YYYY";
	list.requestedSize=config.options.txtTOCListSize;
	list.expandall=false;
	list.cmdMax=config.macros.tableOfContents.cmdMax;
	if (params['hide_title'])   list.cmdMax--;
	if (params['hide_date'])    list.cmdMax--;
	if (params['hide_author'])  list.cmdMax--;
	if (params['hide_creator']) list.cmdMax--;
	if (params['hide_tags'])    list.cmdMax--;
	if (params['hide_missing']) list.cmdMax--;
	if (params['hide_orphans']) list.cmdMax--;
	if (params['hide_shadows']) list.cmdMax--;
	if (params['sortby'])       { list.sortBy=params['sortby']; list.noSortCookie=true; }
	if (params['date'])         { list.dateFormat=params['date']; }
	if (params['autosize'])     { list.autosize=true; list.noSizeCookie=true; }
	if (params['requestedSize']){ list.requestedSize=params['requestedSize']; list.noSizeCookie=true; }
	if (params['width'])        { list.style.width=params['width']; }
	if (params['hidelist'])     { list.style.display ="none" ; list.noShowCookie=true; }
	if (params['expandall'])    { list.expandall=true; }
	return list;
}

function onChangeTOCList() {
	var thisTiddler=this.options[this.selectedIndex].value;
	if ((this.size==1)&&(thisTiddler!='')&&(this.selectedIndex>this.cmdMax))
		story.displayTiddler(null,thisTiddler,1);
	refreshTOCList(this);
	return false;
}
function onClickTOCList(e) {
	if (!e) var e = window.event;
	if (this.size==1) return; // don't toggle display for droplist
	if (e.shiftKey) { this.expandall=!this.expandall; refreshTOCList(this);}
	e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();
	return true;
}
function onDblClickTOCList(e) {
	if (!e) var e = window.event;
	var thisTiddler=this.options[this.selectedIndex].value;
	if ((thisTiddler!='')&&(this.selectedIndex>this.cmdMax))
		story.displayTiddler(null,thisTiddler,1);
	e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();
	return false;
}
function onKeyUpTOCList(e) {
	if (!e) var e = window.event;
	if (e.keyCode!=13) return true;
	var thisTiddler=this.options[this.selectedIndex].value;
	if ((thisTiddler!='')&&(this.selectedIndex>this.cmdMax))
		story.displayTiddler(null,thisTiddler,1);
	e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();
	return false;
}
function reloadTOCLists() {
	var all=document.all? document.all.tags("select") : document.getElementsByTagName("select");
	for (var i=0; i<all.length; i++)
		if (all[i].className=="TOCList")
			{ all[i].selectedIndex=-1; refreshTOCList(all[i]); }
}
 
function refreshTOCList(list) {
	var selectedIndex = list.selectedIndex;
	if (selectedIndex==-1) selectedIndex=0;
	var sortBy = list.sortBy;
	var showHidden = config.options.chkTOCIncludeHidden && !(config.options.chkHttpReadOnly && readOnly);

	if (selectedIndex==0) sortBy=list.sortBy;	// "nnn tiddlers" heading - use previous sort order
	else if (selectedIndex<=list.cmdMax)sortBy=list.value;
	else { if (list.options[list.selectedIndex].value=='') expandTOC(list); return; }

	list.sortBy = sortBy; // save current sort order
	if (!list.noSortCookie) { config.options.txtTOCSortBy=sortBy; saveOptionCookie("txtTOCSortBy"); }

	// get the list of tiddlers
	var tiddlers = [];
	switch (sortBy) {
		case "missing":	tiddlers=store.getMissingLinks(); break;
		case "tags": tiddlers=store.getTags(); break;
		case "orphans":	tiddlers=store.getOrphans(); break;
		case "shadows": for (var t in config.shadowTiddlers) tiddlers.push(t); tiddlers.sort();	break;
		default: tiddlers=store.getTiddlers(sortBy=='creator'?'modifier':sortBy,showHidden?'':'excludeLists'); break;
	}

	// clear current listbox contents
	while (list.length > 0) { list.options[0] = null; }
	list.saved=null;

	// add heading and control items to list
	var i=0;
	var theHeading=tiddlers.length+' tiddlers:';
	if (sortBy=='missing') theHeading=tiddlers.length+' missing tiddlers:';
	if (sortBy=='orphans') theHeading=tiddlers.length+' orphaned tiddlers:';
	if (sortBy=='tags')    theHeading=tiddlers.length+' tags:';
	if (sortBy=='shadows') theHeading=tiddlers.length+' shadow tiddlers:';
	var indent=String.fromCharCode(160)+String.fromCharCode(160);
	var sel=">";
	list.options[i++]=new Option(theHeading,'');
	function headerOpt(txt,val) { return new Option(((sortBy==val)?sel:indent)+' ['+txt+']',val); }
	if (!list.params['hide_title'])   list.options[i++]=headerOpt('by title','title');
	if (!list.params['hide_date'])    list.options[i++]=headerOpt('by date','modified');
	if (!list.params['hide_author'])  list.options[i++]=headerOpt('by author','modifier');
	if (!list.params['hide_creator']) list.options[i++]=headerOpt('by creator','creator');
	if (!list.params['hide_tags'])    list.options[i++]=headerOpt('by tags','tags');
	if (!list.params['hide_missing']) list.options[i++]=headerOpt('missing','missing');
	if (!list.params['hide_orphans']) list.options[i++]=headerOpt('orphans','orphans');
	if (!list.params['hide_shadows']) list.options[i++]=headerOpt('shadows','shadows');
	// output the tiddler list
	switch(sortBy) {
		case "title":
			for (var t = 0; t < tiddlers.length; t++)
				list.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title);
			break;
		case "modified":
		case "modifier":
		case "creator":
			if (sortBy=="modified") tiddlers.reverse(); // show newest first
			if (sortBy=="creator") { // sort by custom field with fallback value
				tiddlers.sort(function (a,b) {
					var v1=a.fields.creator||a.modifier;
					var v2=b.fields.creator||b.modifier;
					return (v1==v2)?0:(v1>v2?1:-1);
				});
			}
			var lastSection = "";
			for (var t = 0; t < tiddlers.length; t++){
				var tiddler = tiddlers[t];
				var theSection = "";
				var m=tiddler.modified;
				if (sortBy=="modified") theSection=m.getFullYear()+'.'+(m.getMonth()+1)+'.'+m.getDate();
				if (sortBy=="modifier") theSection = tiddler.modifier;
				if (sortBy=="creator") theSection=tiddler.fields['creator']||tiddler.modifier;
				if (theSection != lastSection) {
					lastSection = theSection;
					if (sortBy=="modified") theSection = m.formatString(list.dateFormat);
					list.options[i++] = new Option('+ '+theSection,"");
				}
				list.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title);
			}
			expandTOC(list);
			break;
		case "tags":
			// tagged tiddlers, by tag
			var tagcount=0;
			var lastTag = null;
			for (var t = 0; t < tiddlers.length; t++) {  // actually a list of tags, not tiddlers... 
				var theTag = tiddlers[t][0]; var tid=store.getTiddler(theTag);
				if (tid && tid.isTagged('excludeLists')) continue; // skip excluded tags
				var temp = store.getTaggedTiddlers(theTag);
				var tagged=[]; for (var q=0; q<temp.length; q++) // hide excluded tiddlers
					if (!temp[q].isTagged('excludeLists')) tagged.push(temp[q]); 
				if (tagged.length) { tagcount++;
					list.options[i++]=new Option('+ '+theTag+" ("+tagged.length+")","");
					for(var r=0; r<tagged.length; r++)
						list.options[i++]=
							new Option(indent+indent+tagged[r].title,tagged[r].title);
				}
			}
			// count untagged tiddlers
			var temp = store.getTiddlers("title");
			var c=0; for (var r=0; r<temp.length;r++) if (!temp[r].tags.length) c++;
			// create 'pseudo-tag' listing untagged tiddlers (if any)
			if (c>0) {
				list.options[i++] = new Option("+ untagged ("+c+")","");
				for (var r=0; r<temp.length;r++) if (!temp[r].tags.length)
					list.options[i++] = new
						Option(indent+indent+temp[r].title,temp[r].title);
			}
			list.options[0].text=tagcount+' tags:';
			expandTOC(list);
			break;
		case "missing": case "orphans": case "shadows":
			for (var t = 0; t < tiddlers.length; t++)
				list.options[i++] = new Option(tiddlers[t],tiddlers[t]);
			break;
	}
	list.selectedIndex=selectedIndex; // select current control item
	list.size = (list.autosize)?list.options.length:list.requestedSize;
}

// show/hide branch of TOCList based on current selection
function expandTOC(list) {
	var selectedIndex = list.selectedIndex;
	if (selectedIndex==-1) selectedIndex=0;
	var sortBy = list.sortBy;

	// don't collapse/expand list for alpha-sorted "flatlist" TOC contents
	// or list control items
	if ((sortBy=="title")||(sortBy=="missing")||(sortBy=="orphans")||(sortBy=="shadows")) return;
	if ((selectedIndex>0)&&(selectedIndex<=list.cmdMax)) return;

	// get current selected text/value and cache the 
	// complete list.  Then clear the current list contents
	var theText = list.options[selectedIndex].text;
	var theValue = list.options[selectedIndex].value;
	if (!list.saved) {
		list.saved=new Array();
		for (var i=0;i<list.length;i++) list.saved[i]=list.options[i];
	}
	while (list.length > 0) { list.options[0] = null; }

	// put back heading items until item text matches current selected heading
	var i=0;
	for (var t=0; t<list.saved.length; t++) {
		var opt=list.saved[t];
		if (list.expandall||(opt.value=='')||(i<=list.cmdMax)) list.options[i++] = opt;
		if (opt.text==theText) break;
	}
	selectedIndex=i-1;	// this is the NEW index of the current selected heading
	// put back items with value!='' until value==''
	for ( t++; t<list.saved.length; t++) {
		var opt=list.saved[t];
		if (list.expandall||opt.value!='') list.options[i++] = opt;
		if (opt.value=='') break;
	}
	// put back remaining items with value==''
	for ( ; t<list.saved.length; t++) {
		var opt=list.saved[t];
		if (list.expandall||opt.value=='') list.options[i++] = opt;
	}
	list.selectedIndex = selectedIndex;
	list.size = (list.autosize)?list.options.length:list.requestedSize;
}

// these functions process clicks on the 'control links' that are displayed above the listbox
function getTOCListFromButton(which) {
	var list = null;
	switch (which.id) {
		case 'TOCMenu':
			var theSiblings = which.parentNode.parentNode.parentNode.childNodes;
			var thePlace=which.parentNode.parentNode.parentNode.parentNode.parentNode.id;
			break;
		case 'TOCSmaller': case 'TOCLarger': case 'TOCMaximize':
			var theSiblings = which.parentNode.parentNode.childNodes;
			var thePlace=which.parentNode.parentNode.parentNode.parentNode.id;
			break;
	}
	for (var k=0; k<theSiblings.length; k++)
		if (theSiblings[k].className=="TOCList") { list=theSiblings[k]; break; }
	return list;
}
function onClickTOCMenu(which) {
	var list=getTOCListFromButton(which); if (!list) return;
	var opening = list.style.display=="none";
	if(config.options.chkAnimate) anim.startAnimating(new Slider(list,opening,false,"none"));
	else list.style.display = opening ? "block" : "none" ;
	if (!list.noShowCookie) { config.options.chkTOCShow = opening; saveOptionCookie("chkTOCShow"); }
	return(false);
}
function resizeTOC(which) {
	var list=getTOCListFromButton(which); if (!list) return;
	var size = list.size;
	if (list.style.display=="none")	// make sure list is visible
		if(config.options.chkAnimate) anim.startAnimating(new Slider(list,true,false,"none"));
		else list.style.display = "block" ;
	switch (which.id) {
		case 'TOCSmaller':	// decrease current listbox size
			if (list.autosize) { list.autosize=false; size=config.options.txtTOCListSize; }
			if (size==1)	break;
			size -= 1;	// shrink by one line
			list.requestedSize = list.size = size;
			break;
		case 'TOCLarger':	// increase current listbox size
			if (list.autosize) { list.autosize=false; size=config.options.txtTOCListSize; }
			if (size>=list.options.length)	break;
			size += 1;	// grow by one line
			list.requestedSize = list.size = size;
			break;
		case 'TOCMaximize':	// toggle autosize
			list.autosize  = (list.size!=list.options.length);
			list.size = (list.autosize)?list.options.length:list.requestedSize;
			break;
	}
	if (!list.noSizeCookie && !list.autosize)
		{ config.options.txtTOCListSize=size; saveOptionCookie("txtTOCListSize"); }
}
//}}}
<html>
<table>
 <tr>
 <th colspan="2">
  <font size="+2">
  <u>

  Taiji Study Resume
  </u> 
  </font>
 </th>
 </tr>
  
 <tr>
 <td colspan="2">
 <b>&nbsp;June 2004 To August 2005&nbsp;&nbsp;- Senior wudang taijiquan student</b><br><br>
   Promoted to senior student under laoshifu ( senior teacher ) <a href=http://www.magictortoise.com/teachers.htm>Almanzo "LaoMa" Lamoureux</a>
   of the <a href=http://www.magictortoise.com/>Magic Tortoise Taijiquan School</a>.
   <br /><br />

   </td>
 </tr>
 
<tr>
 <td colspan="2">
 <b>&nbsp;February 2000 To June 2004&nbsp;&nbsp;- Wudang taijiquan student</b><br><br>
   Accepted as student under laoshifu ( senior teacher ) <a href=http://www.magictortoise.com/teachers.htm>Almanzo "LaoMa" Lamoureux</a>
   of the <a href=http://www.magictortoise.com/>Magic Tortoise Taijiquan School</a>. 
   <br />

   </td>
   
 <tr>
 <th colspan="2">
  <strong>

   <font size="4">
    <u>
     Curriculum
    </u>
   </font>
  </strong>
 </th>
</tr>


 <tr>
 <td><b><u>Taijiquan</u></b>
 <ul>
  <li>Taiji Walking</li>

  <li>Sihua-Wuxing Gong ( Four Flower-Five Element Exercise )
  <li>Wudang Shan Yibailingba Taijiquan ( Wudang Mountain 108 Taijiquan )</li> 
  <li>Taiji Gun ( Stick )</li>
  <li>Taiji Shan ( Fan )</li>
  <li>Taiji Dao ( Knife )</li>
  <li>San Cai Jian ( Three Energy Sword )</li>
  <li>Tui Shou ( Push Hands )</li>

  <li>Evaluation Of Taiji</li>
  </ul>
  </td>
  
  <td>
   <b>
    <u>
      Tangquan
    </u>
   </b>

   <ul>
    <li>Empty Hand Form</li>
    <li>Tai Shi Bian ( Imperial Teacher's Whip )&nbsp;</li>   
    <li>Ba Gua Jian ( 8 Gates Sword )</li>   
   </ul>
   <br /><br /><br /><br /><br /><br />
   </td>
  </tr>

 
 <tr>
 <td><b><u>Qigong</u></b>
  <ul>
   <li>Ba Duan Jin ( 8 Pieces of Brocade )</li>
  </ul>
  <br />
 </td>
  
  <td><b><u>Culture</u></b>

  <ul>
   <li>Shufa ( Brush Writting / Calligraphy )</li>
   <li>Taiji "Classics" Exploration</li>
    <li>I Ching Exploration</li>
  </ul>
 </td>
 </tr>

 <tr>
 <td colspan="2">
   <b>
     <u>

       Supplemental Workshop / Seminar Experience
     </u>
   </b>
  <ul>
   <li>
     Yang Taiji Staff - conducted by 
      <a href=http://www.magictortoise.com/teachers.htm>
         Kathleen Cusick
      </a>
      & Dan Pasik of the
      <a href=http://www.magictortoise.com/>

        Magic Tortoise Taijiquan School
      </a>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      
   </li>
  </ul>
 </td>
 </tr>
</table>

</html>
[>img[Image of telescope|tn_newscope.jpg][newscope.jpg]]

<html>
<table align="center"
       border="-1">
<caption>

<b>
 Specifications
</b>
</caption>

<tr>
 <th>
  Lens<br>Aperture
 </th>
 
 <th>
  Focal<br>Length
 </th>

 
 <th>
  Resolving<br>Power
 </th>
 
 <th>
  Tube<br>Length
 </th>
 
 <th>
 Magnification<br>Range
 </th>

 
 <th>
 Faintest<br>Decernable Star
 </th>
</tr>

<tr>
 <td align="center">
 150mm / 6 inch 
 </td>

  <td align="center">

 750mm - f/5
 </td>
 
 <td align="center">
 0.93 
 </td>
 
 <td align="center">
 645mm / 19 inch 
 </td>
 
 <td align="center">
 21X to 300X 
 </td>

 
 <td align="center">
 Magnitude +12 
 </td>
</tr>
</table>
</html>
[>img[Image of Tokyo Express game|tokyo.jpg]]
Tokyo Express is a solitaire and two-player simulation of the night naval battles off Guadalcanal. In the solitaire version, you command the US fleet, awaiting the emergence of the Tokyo Express from the darkness. You group your ships into formations, assigning them orders, and select the targets to attack with torpedoes and guns. Simple mechanisms control Japanese maneuvers and target assignments in a realistic manner. You never know when combat will occur until the explosion of torpedo salvos signals the presence of Japanese forces who detected you first and made their surprise attacks. The two-player version modifies the solitaire game and pits players against each other in an exciting recreation of World War II naval combat. Tokyo Express is graduated in complexity to help you learn the rules as you play.
[>img[Image of Fitzgeralds hotel and casino|tn_fitz.jpg][fitz.jpg]]
Well, for the second half of 2009 year's vacationing / travel I will be headed to Vegas the last week of September !
* Sunday - arrive in Vegas and staying at ''Fitzgeralds Casino and Hotel'' on Fremont Street downtown
* Monday - spending the day making money at the various casinos
* Tuesday - spending the day making money at the various casinos
* Wednesday - spending the day making money at the various casinos
* Thursday - depart to return home
As you can tell, this is going to be a "working" trip for me to make money.  I've already done the tourist things in previous trips, can't stand the hooker bar "porn slapping" illegals on every corner on the Strip ruining the place after 4PM and @@until the police deport their asses back across the border@@ I'll be staying off the Strip as much as possible!

You can read more about the gaming I do in the [[Casino Gaming]] section.
[<img[tn_vaslogo.jpg]] Victory at Sea is the game of naval combat during the Second World War. Throughout 1939-45, the nations of the world duelled across the oceans of the world, only to discover the fundamental nature of naval warfare changing in the face of developing technologies. Now you can play out these confrontations on the tabletop with entire fleets drawn from the Royal Navy, US Navy, Kriegsmarine or any one of the many other nations featured in Victory at Sea.

From skirmishes involving single destroyers hunting down merchantmen to the clashing of allied fleets against implacable enemies, Victory at Sea is your ticket to exciting battles that take place in the oceans of World War II.


__''Core Rules''__
[img[tn_vascover.jpg]]

__''Supplementary Materials''__
[img[tn_vasoob.jpg]]
Victory in the Pacific is a simple strategic wargame covering the Pacific Theater of WW2. It is a successor to the system developed in War at Sea which covers the Battle of the Atlantic.

[>img[Image of VITP game|vitp.jpg]]
The game divides the Pacific into 13 sea areas. Each turn the players move their ships, land based air and marines from the ports and bases (which are located on the borders of sea areas) to one of the areas.

Ships can either be patrollers (the only ships that will take control of area after battle, but they must commit their move first) or raiders.

After all ships have been moved, the players dice off determine whether a day battle (where air power is decisive) or night battle (when ship board gunnery rules) is fought. After a number of rounds, until one side or the other retreats or loses all of his ships, the player with patrolling ships left takes control of the area and a scores a number of "Points of Control".

The Japanese will almost always take a large lead that will be inevitably turned back by the Americans as they get large numbers of carriers as the game goes on.
Each game console has a list of games I currently have for it.  You can sort the list either ascending or decending by clicking the "title" heading.

Select from the following list by console of video games I have :

[[Playstation]] | [[Playstation 2]] | [[Playstation 3]] | [[PSP]]

[[Xbox]] | [[Xbox 360]]
Select from the following list of casino games to see the log entries.I have made :

[[Jacks or Better Log]]
[>img[Image of War At Sea game|was.jpg]]
War at Sea is a simple strategic wargame covering the Battle of the Atlantic and naval warfare of the Mediterranean in WW2.

The game divides the Atlantic into 6 sea areas. Each turn the players move their ships from port countries to one of the areas.

After all ships have been moved, a battle occurs. After a number of rounds, until one side or the other retreats or loses all of his ships, the player with ships left takes control of the area and a scores a number of "Points of Control". (Exception: German U-boats only have to survive one round anti-submarine combat and may stay in the area, even if the area has Allied ships. The Allies cannot score if a U-Boat occupies the area.)

Additional points are also earned for convoys successfully crossing the Atlantic to England or Russia (for a BIG three POC).
[<img[tn_xbox.jpg]]
|sortable|k
| Title |h
| Star Wars : Obi-Wan |
| Star Wars : The Clone Wars |
| Star Wars : Jedi Knight - Jedi Academy |
| Star Wars : Jedi Outcast |
| Star Wars : Knights of the Old Republic |
| Star Wars : Knights of the Old Republic 2 |
| Star Wars : Starfighter Special Edition |
| Star Wars : Jedi Starfighter |
| Star Wars : Lego Video Game |
| Star Wars : Lego The Original Trilogy |
| Star Wars : Battlefront |
| Star Wars : Battlefront 2 |
| Star Wars : Republic Commando |
| Star Wars : Episode 3 Revenge of the Sith |
| Superman : The Man of Steel  |
| Blood Wake |
| Quantum Redshift |
| Totaled |
| Batman : Dark Tomorrow |
| Tao Feng : Fist of the Lotus |
| Bruce Lee : Quest of the Dragon |
| Nightcaster : Defeat The Darkness |
| Gauntlet : Dark Legacy |
| Mechassault |
| Mechassault 2 : Lone Wolf |
| Magic the Gathering : Battlegrounds |
| Aquaman |
| Slot Car Thunder |
| Space Ace |
| Madden 2003 |
| ESPN NHL Hockey |
| Batman : Rise of Sin Tzu |
| X-Men Legends |
| X-Men Legends 2 : Rise of Apocalypse |
| Marvel Nemesis : Rise of the Imperfects |
| Godzilla : Save the Earth |
| Godzilla : Destroy All Monsters |
| Freaky Flyers |
| Dai Senryaku : Modern Military Tactics |
| Jade Empire |
| Heroes of the Pacific |
| Destroy All Humans |
| Destroy All Humans 2 |
| Fantastic Four |
| Kung Fu Chaos |
| The Incredibles |
| Secret Weapons Over Normandy |
| Star Trek : Shattered Universe |
| Nascar Heat 2002 |
| Nascar Thunder 2004 |
| Crimson Skies : High Road to Revenge |
| Gladiator : Sword of Vengeance |
| Gladius |
| Circus Maximus : Chariot Wars |
| New Legends |
| Spiderman |
| Spiderman 2 |
| Burnout 2 : Point of Impact |
| Burnout 3 : Takedown |
| Unreal Championship |
| The House of the Dead |
| Enclave |
| Metal Arms : Glitch in the System |
| Arx Fatalis |
| Mortal Kombat : Shaolin Monks |
| Mortal Kombat : Deception |
| Mortal Kombat : Deadly Alliance |
| Evil Dead : Regeneration |
| Mafia |
| Stubbs the Zombie : Rebel Without a Pulse |
| Gauntlet : Seven Sorrows |
| XGRA : Extreme G Racing Association |
| Blazing Angels : Squadrons of WW II |
| Jaws Unleashed |
| Call of Duty : Finest Hour |
| Call of Duty 2 : Big Red One |
| Marvel Ultimate Alliance |
| Justice League Heroes |
| Superman Returns |
| AMF Bowling 2004 |
| Halo : Combat Evolved |
| Dungeons And Dragons : Heroes |
| Baldur's Gate : Dark Alliance II |
| Morrowind : The Elder Scrolls III |
| High Rollers Casino |
| Pinball Hall of Fame : The Gottlieb Collection |
| Bicycle Casino |
| World Championship Poker |
| Terminator 3 : Rise of the Machines |
| NFL Head Coach |
| King Kong : The Official Game of the Movie|
| Sid Meier's Pirates ! |
| Robocop |
| Midway Arcade Treasures |
| Midway Arcade Treasures 2 |
| Shattered Union |
| Iron Phoenix |
| Spartan : Total Warrior |
| Evil Dead : A Fistful of Boomstick |
| Fable |
| Red Faction II |
| Dead or Alive Extreme Volleyball |
| Max Payne 2 |
| Army Men : Sarge's War |
| Halo 2 |
| Dead Or Alive 3 |
| Red Ninja : End Of Honor |
| Nightcaster II : Equinox |
| Otogi : Myth Of Demons |
| Otogi 2 : Immortal Warriors |
| Steel Battalion |
| Tetris Worlds |
| Lord of the Rings : Fellowship Of The Ring |

[<img[tn_xbox360.jpg]]
|sortable|k
| Title |h
| Superman Returns |
| Battlestations : Midway |
| Battlefield 2 |
| Ace Combat 6 |
| Pirates of the Caribbean |
| Big Bumpin |
| The Godfather |
| Fantastic Four : Rise of the Silver Surfer |
| X-Men : The Official Game |
| Full Auto |
| Chrome Hounds |
| Call of Duty 2 |
| Star Trek : Legacy |
| Spiderman : Friend or Foe |
| Armored Core 4 |
| Iron Man |
| Blazing Angels 2 : Secret Mission of WW 2 |
| Star Wars: The Force Unleashed |
| Karaoke Revolution American Idol Encore |
| SoulCalibur IV |
| Battlefield : Bad Company |
| Bully : Scholarship Edition |
| Lego Star Wars : The Complete Saga |
| Call To Duty 3 |
| Fable II |
| Bullet Witch |
| Destroy All Humans : Path Of The Furon |
| Universe At War : Earth Assault |
| Battlestations : Pacific |
| Command & Conquer 3 : Tiberium Wars |
| Earth Defense Force 2017 |
| Mirror's Edge |
| The Vikings : Battle For Asgard |



<<rssReader asHtml http://rss.news.yahoo.com/rss/sports>>
section of the TiddlyWiki HTML file", MarkupPostBody: "This tiddler is inserted at the end of the
section of the TiddlyWiki HTML file immediately after the script block", OptionsPanel: "This shadow tiddler is used as the contents of the options panel slider in the right-hand sidebar", PageTemplate: "The HTML template in this shadow tiddler determines the overall ~TiddlyWiki layout", PluginManager: "This shadow tiddler provides access to the plugin manager", SideBarOptions: "This shadow tiddler is used as the contents of the option panel in the right-hand sidebar", SideBarTabs: "This shadow tiddler is used as the contents of the tabs panel in the right-hand sidebar", SiteSubtitle: "This shadow tiddler is used as the second part of the page title", SiteTitle: "This shadow tiddler is used as the first part of the page title", SiteUrl: "This shadow tiddler should be set to the full target URL for publication", StyleSheetColors: "This shadow tiddler contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler", StyleSheet: "This tiddler can contain custom CSS definitions", StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler", StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale", StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing", TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar", TabMore: "This shadow tiddler contains the contents of the 'More' tab in the right-hand sidebar", TabMoreMissing: "This shadow tiddler contains the contents of the 'Missing' tab in the right-hand sidebar", TabMoreOrphans: "This shadow tiddler contains the contents of the 'Orphans' tab in the right-hand sidebar", TabMoreShadowed: "This shadow tiddler contains the contents of the 'Shadowed' tab in the right-hand sidebar", TabTags: "This shadow tiddler contains the contents of the 'Tags' tab in the right-hand sidebar", TabTimeline: "This shadow tiddler contains the contents of the 'Timeline' tab in the right-hand sidebar", ToolbarCommands: "This shadow tiddler determines which commands are shown in tiddler toolbars", ViewTemplate: "The HTML template in this shadow tiddler determines how tiddlers look" }); //-- //-- Main //-- var params = null; // Command line parameters var store = null; // TiddlyWiki storage var story = null; // Main story var formatter = null; // Default formatters for the wikifier var anim = typeof Animator == "function" ? new Animator() : null; // Animation engine var readOnly = false; // Whether we're in readonly mode var highlightHack = null; // Embarrassing hack department... var hadConfirmExit = false; // Don't warn more than once var safeMode = false; // Disable all plugins and cookies var showBackstage; // Whether to include the backstage area var installedPlugins = []; // Information filled in when plugins are executed var startingUp = false; // Whether we're in the process of starting up var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins() // Whether to use the JavaSaver applet var useJavaSaver = (config.browser.isSafari || config.browser.isOpera) && (document.location.toString().substr(0,4) != "http"); // Starting up function main() { var t10,t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date(); startingUp = true; window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();}; params = getParameters(); if(params) params = params.parseParams("open",null,false); store = new TiddlyWiki(); invokeParamifier(params,"oninit"); story = new Story("tiddlerDisplay","tiddler"); addEvent(document,"click",Popup.onDocumentClick); saveTest(); loadOptionsCookie(); for(var s=0; s 0) { plugin.log.push(config.messages.pluginVersionError); return false; } } return true; } function isPluginEnabled(plugin) { if(plugin.tiddler.isTagged("systemConfigDisable")) { plugin.log.push(config.messages.pluginDisabled); return false; } return true; } function invokeMacro(place,macro,params,wikifier,tiddler) { try { var m = config.macros[macro]; if(m && m.handler) m.handler(place,macro,params.readMacroParams(),wikifier,params,tiddler); else createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro])); } catch(ex) { createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()])); } } //-- //-- Paramifiers //-- function getParameters() { var p = null; if(window.location.hash) { p = decodeURIComponent(window.location.hash.substr(1)); if(config.browser.firefoxDate != null && config.browser.firefoxDate[1] < "20051111") p = convertUTF8ToUnicode(p); } return p; } function invokeParamifier(params,handler) { if(!params || params.length == undefined || params.length <= 1) return; for(var t=1; t") { // Colspan colSpanCount++; w.nextMatch = this.cellRegExp.lastIndex-1; } else if(cellMatch[2]) { // End of row if(prevCell && colSpanCount > 1) { prevCell.setAttribute("colspan",colSpanCount); prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE } w.nextMatch = this.cellRegExp.lastIndex; break; } else { // Cell w.nextMatch++; var styles = config.formatterHelpers.inlineCssHelper(w); var spaceLeft = false; var chr = w.source.substr(w.nextMatch,1); while(chr == " ") { spaceLeft = true; w.nextMatch++; chr = w.source.substr(w.nextMatch,1); } var cell; if(chr == "!") { cell = createTiddlyElement(e,"th"); w.nextMatch++; } else { cell = createTiddlyElement(e,"td"); } prevCell = cell; prevColumns[col] = {rowSpanCount:1,element:cell}; if(colSpanCount > 1) { cell.setAttribute("colspan",colSpanCount); cell.setAttribute("colSpan",colSpanCount); // Needed for IE colSpanCount = 1; } config.formatterHelpers.applyCssHelper(cell,styles); w.subWikifyTerm(cell,this.cellTermRegExp); if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight cell.align = spaceLeft ? "center" : "left"; else if(spaceLeft) cell.align = "right"; w.nextMatch--; } col++; this.cellRegExp.lastIndex = w.nextMatch; cellMatch = this.cellRegExp.exec(w.source); } } }, { name: "heading", match: "^!{1,6}", termRegExp: /(\n)/mg, handler: function(w) { w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp); } }, { name: "list", match: "^(?:[\\*#;:]+)", lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg, termRegExp: /(\n)/mg, handler: function(w) { var stack = [w.output]; var currLevel = 0, currType = null; var listLevel, listType, itemType, baseType; w.nextMatch = w.matchStart; this.lookaheadRegExp.lastIndex = w.nextMatch; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) { if(lookaheadMatch[1]) { listType = "ul"; itemType = "li"; } else if(lookaheadMatch[2]) { listType = "ol"; itemType = "li"; } else if(lookaheadMatch[3]) { listType = "dl"; itemType = "dt"; } else if(lookaheadMatch[4]) { listType = "dl"; itemType = "dd"; } if(!baseType) baseType = listType; listLevel = lookaheadMatch[0].length; w.nextMatch += lookaheadMatch[0].length; var t; if(listLevel > currLevel) { for(t=currLevel; tlistLevel; t--) stack.pop(); } else if(listLevel == currLevel && listType != currType) { stack.pop(); stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType)); } currLevel = listLevel; currType = listType; var e = createTiddlyElement(stack[stack.length-1],itemType); w.subWikifyTerm(e,this.termRegExp); this.lookaheadRegExp.lastIndex = w.nextMatch; lookaheadMatch = this.lookaheadRegExp.exec(w.source); } } }, { name: "quoteByBlock", match: "^<<<\\n", termRegExp: /(^<<<(\n|$))/mg, element: "blockquote", handler: config.formatterHelpers.createElementAndWikify }, { name: "quoteByLine", match: "^>+", lookaheadRegExp: /^>+/mg, termRegExp: /(\n)/mg, element: "blockquote", handler: function(w) { var stack = [w.output]; var currLevel = 0; var newLevel = w.matchLength; var t; do { if(newLevel > currLevel) { for(t=currLevel; tnewLevel; t--) stack.pop(); } currLevel = newLevel; w.subWikifyTerm(stack[stack.length-1],this.termRegExp); createTiddlyElement(stack[stack.length-1],"br"); this.lookaheadRegExp.lastIndex = w.nextMatch; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch; if(matched) { newLevel = lookaheadMatch[0].length; w.nextMatch += lookaheadMatch[0].length; } } while(matched); } }, { name: "rule", match: "^----+$\\n?", handler: function(w) { createTiddlyElement(w.output,"hr"); } }, { name: "monospacedByLine", match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|)\\n", element: "pre", handler: function(w) { switch(w.matchText) { case "/*{{{*/\n": // CSS this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\/\*\}\}\}\*\/$\n?)/mg; break; case "{{{\n": // monospaced block this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\}\}\}$\n?)/mg; break; case "//{{{\n": // plugin this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\/\/\}\}\}$\n?)/mg; break; case "\n": //template this.lookaheadRegExp = /\n*((?:^[^\n]*\n)+?)(\n*^$\n?)/mg; break; default: break; } config.formatterHelpers.enclosedTextHelper.call(this,w); } }, { name: "wikifyComment", match: "^(?:/\\*\\*\\*|\n)/mg); w.subWikifyTerm(w.output,termRegExp); } }, { name: "macro", match: "<<", lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) { w.nextMatch = this.lookaheadRegExp.lastIndex; invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler); } } }, { name: "prettyLink", match: "\\[\\[", lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { var e; var text = lookaheadMatch[1]; if(lookaheadMatch[3]) { // Pretty bracketted link var link = lookaheadMatch[3]; e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,decodeURIComponent(link),false,null,w.isStatic,w.tiddler); } else { // Simple bracketted link e = createTiddlyLink(w.output,decodeURIComponent(text),false,null,w.isStatic,w.tiddler); } createTiddlyText(e,text); w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "wikiLink", match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink, handler: function(w) { if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) { w.outputText(w.output,w.matchStart+1,w.nextMatch); return; } if(w.matchStart > 0) { var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg"); preRegExp.lastIndex = w.matchStart-1; var preMatch = preRegExp.exec(w.source); if(preMatch.index == w.matchStart-1) { w.outputText(w.output,w.matchStart,w.nextMatch); return; } } if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) { var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler); w.outputText(link,w.matchStart,w.nextMatch); } else { w.outputText(w.output,w.matchStart,w.nextMatch); } } }, { name: "urlLink", match: config.textPrimitives.urlPattern, handler: function(w) { w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch); } }, { name: "image", match: "\\[[<>]?[Ii][Mm][Gg]\\[", lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { var e = w.output; if(lookaheadMatch[5]) { var link = lookaheadMatch[5]; e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler); addClass(e,"imageLink"); } var img = createTiddlyElement(e,"img"); if(lookaheadMatch[1]) img.align = "left"; else if(lookaheadMatch[2]) img.align = "right"; if(lookaheadMatch[3]) { img.title = lookaheadMatch[3]; img.setAttribute("alt",lookaheadMatch[3]); } img.src = lookaheadMatch[4]; w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "html", match: "<[Hh][Tt][Mm][Ll]>", lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1]; w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "commentByBlock", match: "/%", lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) w.nextMatch = this.lookaheadRegExp.lastIndex; } }, { name: "characterFormat", match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{", handler: function(w) { switch(w.matchText) { case "''": w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg); break; case "//": w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg); break; case "__": w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg); break; case "^^": w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg); break; case "~~": w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg); break; case "--": w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg); break; case "{{{": var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg; lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]); w.nextMatch = lookaheadRegExp.lastIndex; } break; } } }, { name: "customFormat", match: "@@|\\{\\{", handler: function(w) { switch(w.matchText) { case "@@": var e = createTiddlyElement(w.output,"span"); var styles = config.formatterHelpers.inlineCssHelper(w); if(styles.length == 0) e.className = "marked"; else config.formatterHelpers.applyCssHelper(e,styles); w.subWikifyTerm(e,/(@@)/mg); break; case "{{": var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg; lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = lookaheadRegExp.exec(w.source); if(lookaheadMatch) { w.nextMatch = lookaheadRegExp.lastIndex; e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]); w.subWikifyTerm(e,/(\}\}\})/mg); } break; } } }, { name: "mdash", match: "--", handler: function(w) { createTiddlyElement(w.output,"span").innerHTML = "—"; } }, { name: "lineBreak", match: "\\n|
", handler: function(w) { createTiddlyElement(w.output,"br"); } }, { name: "rawText", match: "\\\"{3}|", lookaheadRegExp: /(?:\"{3}|)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]); w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "htmlEntitiesEncoding", match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)", handler: function(w) { createTiddlyElement(w.output,"span").innerHTML = w.matchText; } } ]; //-- //-- Wikifier //-- function getParser(tiddler,format) { if(tiddler) { if(!format) format = tiddler.fields["wikiformat"]; var i; if(format) { for(i in config.parsers) { if(format == config.parsers[i].format) return config.parsers[i]; } } else { for(i in config.parsers) { if(tiddler.isTagged(config.parsers[i].formatTag)) return config.parsers[i]; } } } return formatter; } function wikify(source,output,highlightRegExp,tiddler) { if(source) { var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler); var t0 = new Date(); wikifier.subWikify(output); if(tiddler && config.options.chkDisplayInstrumentation) displayMessage("wikify:" +tiddler.title+ " in " + (new Date()-t0) + " ms"); } } function wikifyStatic(source,highlightRegExp,tiddler,format) { var e = createTiddlyElement(document.body,"pre"); e.style.display = "none"; var html = ""; if(source && source != "") { if(!tiddler) tiddler = new Tiddler("temp"); var wikifier = new Wikifier(source,getParser(tiddler,format),highlightRegExp,tiddler); wikifier.isStatic = true; wikifier.subWikify(e); html = e.innerHTML; removeNode(e); } return html; } function wikifyPlain(title,theStore,limit) { if(!theStore) theStore = store; if(theStore.tiddlerExists(title) || theStore.isShadowTiddler(title)) { return wikifyPlainText(theStore.getTiddlerText(title),limit,tiddler); } else { return ""; } } function wikifyPlainText(text,limit,tiddler) { if(limit > 0) text = text.substr(0,limit); var wikifier = new Wikifier(text,formatter,null,tiddler); return wikifier.wikifyPlain(); } function highlightify(source,output,highlightRegExp,tiddler) { if(source) { var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler); wikifier.outputText(output,0,source.length); } } function Wikifier(source,formatter,highlightRegExp,tiddler) { this.source = source; this.output = null; this.formatter = formatter; this.nextMatch = 0; this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true; this.highlightRegExp = highlightRegExp; this.highlightMatch = null; this.isStatic = false; if(highlightRegExp) { highlightRegExp.lastIndex = 0; this.highlightMatch = highlightRegExp.exec(source); } this.tiddler = tiddler; } Wikifier.prototype.wikifyPlain = function() { var e = createTiddlyElement(document.body,"div"); e.style.display = "none"; this.subWikify(e); var text = getPlainText(e); removeNode(e); return text; }; Wikifier.prototype.subWikify = function(output,terminator) { try { if(terminator) this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg")); else this.subWikifyUnterm(output); } catch(ex) { showException(ex); } }; Wikifier.prototype.subWikifyUnterm = function(output) { var oldOutput = this.output; this.output = output; this.formatter.formatterRegExp.lastIndex = this.nextMatch; var formatterMatch = this.formatter.formatterRegExp.exec(this.source); while(formatterMatch) { // Output any text before the match if(formatterMatch.index > this.nextMatch) this.outputText(this.output,this.nextMatch,formatterMatch.index); // Set the match parameters for the handler this.matchStart = formatterMatch.index; this.matchLength = formatterMatch[0].length; this.matchText = formatterMatch[0]; this.nextMatch = this.formatter.formatterRegExp.lastIndex; for(var t=1; t this.nextMatch) this.outputText(this.output,this.nextMatch,terminatorMatch.index); this.matchText = terminatorMatch[1]; this.matchLength = terminatorMatch[1].length; this.matchStart = terminatorMatch.index; this.nextMatch = this.matchStart + this.matchLength; this.output = oldOutput; return; } if(formatterMatch.index > this.nextMatch) this.outputText(this.output,this.nextMatch,formatterMatch.index); this.matchStart = formatterMatch.index; this.matchLength = formatterMatch[0].length; this.matchText = formatterMatch[0]; this.nextMatch = this.formatter.formatterRegExp.lastIndex; for(var t=1; t startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos)) { if(this.highlightMatch.index > startPos) { createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index)); startPos = this.highlightMatch.index; } var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos); var theHighlight = createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd)); startPos = highlightEnd; if(startPos >= this.highlightRegExp.lastIndex) this.highlightMatch = this.highlightRegExp.exec(this.source); } if(startPos < endPos) { createTiddlyText(place,this.source.substring(startPos,endPos)); } }; //-- //-- Macro definitions //-- config.macros.today.handler = function(place,macroName,params) { var now = new Date(); var text = params[0] ? now.formatString(params[0].trim()) : now.toLocaleString(); createTiddlyElement(place,"span",null,null,text); }; config.macros.version.handler = function(place) { createTiddlyElement(place,"span",null,null,formatVersion()); }; config.macros.list.handler = function(place,macroName,params) { var type = params[0] || "all"; var list = document.createElement("ul"); place.appendChild(list); if(this[type].prompt) createTiddlyElement(list,"li",null,"listTitle",this[type].prompt); var results; if(this[type].handler) results = this[type].handler(params); for(var t = 0; t < results.length; t++) { var li = document.createElement("li"); list.appendChild(li); createTiddlyLink(li,typeof results[t] == "string" ? results[t] : results[t].title,true); } }; config.macros.list.all.handler = function(params) { return store.reverseLookup("tags","excludeLists",false,"title"); }; config.macros.list.missing.handler = function(params) { return store.getMissingLinks(); }; config.macros.list.orphans.handler = function(params) { return store.getOrphans(); }; config.macros.list.shadowed.handler = function(params) { return store.getShadowed(); }; config.macros.list.touched.handler = function(params) { return store.getTouched(); }; config.macros.list.filter.handler = function(params) { var filter = params[1]; var results = []; if(filter) { var tiddlers = store.filterTiddlers(filter); for(var t=0; t=last; t--) { var tiddler = tiddlers[t]; var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8); if(theDay != lastDay) { var ul = document.createElement("ul"); place.appendChild(ul); createTiddlyElement(ul,"li",null,"listTitle",tiddler[field].formatString(dateFormat)); lastDay = theDay; } createTiddlyElement(ul,"li",null,"listLink").appendChild(createTiddlyLink(place,tiddler.title,true)); } }; config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) { params = paramString.parseParams("name",null,true,false,true); var names = params[0]["name"]; var tiddlerName = names[0]; var className = names[1] || null; var args = params[0]["with"]; var wrapper = createTiddlyElement(place,"span",null,className); if(!args) { wrapper.setAttribute("refresh","content"); wrapper.setAttribute("tiddler",tiddlerName); } var text = store.getTiddlerText(tiddlerName); if(text) { var stack = config.macros.tiddler.tiddlerStack; if(stack.indexOf(tiddlerName) !== -1) return; stack.push(tiddlerName); try { var n = args ? Math.min(args.length,9) : 0; for(var i=0; i> config.macros.gradient.handler = function(place,macroName,params,wikifier,paramString,tiddler) { var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place; panel.style.position = "relative"; panel.style.overflow = "hidden"; panel.style.zIndex = "0"; if(wikifier) { var styles = config.formatterHelpers.inlineCssHelper(wikifier); config.formatterHelpers.applyCssHelper(panel,styles); } params = paramString.parseParams("color"); var locolors = [], hicolors = []; for(var t=2; t>"); if(document.all) { panel.style.height = "100%"; panel.style.width = "100%"; } }; config.macros.message.handler = function(place,macroName,params) { if(params[0]) { var names = params[0].split("."); var lookupMessage = function(root,nameIndex) { if(names[nameIndex] in root) { if(nameIndex < names.length-1) return (lookupMessage(root[names[nameIndex]],nameIndex+1)); else return root[names[nameIndex]]; } else return null; }; var m = lookupMessage(config,0); if(m == null) m = lookupMessage(window,0); createTiddlyText(place,m.toString().format(params.splice(1))); } }; config.macros.view.views = { text: function(value,place,params,wikifier,paramString,tiddler) { highlightify(value,place,highlightHack,tiddler); }, link: function(value,place,params,wikifier,paramString,tiddler) { createTiddlyLink(place,value,true); }, wikified: function(value,place,params,wikifier,paramString,tiddler) { if(params[2]) value=params[2].unescapeLineBreaks().format([value]); wikify(value,place,highlightHack,tiddler); }, date: function(value,place,params,wikifier,paramString,tiddler) { value = Date.convertFromYYYYMMDDHHMM(value); createTiddlyText(place,value.formatString(params[2] ? params[2] : config.views.wikified.dateFormat)); } }; config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler) { if((tiddler instanceof Tiddler) && params[0]) { var value = store.getValue(tiddler,params[0]); if(value) { var type = params[1] || config.macros.view.defaultView; var handler = config.macros.view.views[type]; if(handler) handler(value,place,params,wikifier,paramString,tiddler); } } }; config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) { var field = params[0]; var rows = params[1] || 0; var defVal = params[2] || ''; if((tiddler instanceof Tiddler) && field) { story.setDirty(tiddler.title,true); var e,v; if(field != "text" && !rows) { e = createTiddlyElement(null,"input"); if(tiddler.isReadOnly()) e.setAttribute("readOnly","readOnly"); e.setAttribute("edit",field); e.setAttribute("type","text"); e.value = store.getValue(tiddler,field) || defVal; e.setAttribute("size","40"); e.setAttribute("autocomplete","off"); place.appendChild(e); } else { var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix"); var wrapper2 = createTiddlyElement(wrapper1,"div"); e = createTiddlyElement(wrapper2,"textarea"); if(tiddler.isReadOnly()) e.setAttribute("readOnly","readOnly"); e.value = v = store.getValue(tiddler,field) || defVal; rows = rows || 10; var lines = v.match(/\n/mg); var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5); if(lines != null && lines.length > rows) rows = lines.length + 5; rows = Math.min(rows,maxLines); e.setAttribute("rows",rows); e.setAttribute("edit",field); place.appendChild(wrapper1); } return e; } }; config.macros.tagChooser.onClick = function(ev) { var e = ev || window.event; var lingo = config.views.editor.tagChooser; var popup = Popup.create(this); var tags = store.getTags("excludeLists"); if(tags.length == 0) createTiddlyText(createTiddlyElement(popup,"li"),lingo.popupNone); for(var t=0; t 0) btn.setAttribute("params",tags.join("|")); btn.setAttribute("newFocus",newFocus); btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE)); if(customFields !== "") btn.setAttribute("customFields",customFields); var text = getParam(params,"text"); if(text !== undefined) btn.setAttribute("newText",text); return btn; }; config.macros.newTiddler.onClickNewTiddler = function() { var title = this.getAttribute("newTitle"); if(this.getAttribute("isJournal") == "true") { title = new Date().formatString(title.trim()); } var params = this.getAttribute("params"); var tags = params ? params.split("|") : []; var focus = this.getAttribute("newFocus"); var template = this.getAttribute("newTemplate"); var customFields = this.getAttribute("customFields"); if(!customFields && !store.isShadowTiddler(title)) customFields = String.encodeHashMap(config.defaultCustomFields); story.displayTiddler(null,title,template,false,null,null); var tiddlerElem = story.getTiddler(title); if(customFields) story.addCustomFields(tiddlerElem,customFields); var text = this.getAttribute("newText"); if(typeof text == "string") story.getTiddlerField(title,"text").value = text.format([title]); for(var t=0;t 0) { story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch); txt.setAttribute("lastSearchText",txt.value); } }; config.macros.search.onClick = function(e) { config.macros.search.doSearch(this.nextSibling); return false; }; config.macros.search.onKeyPress = function(ev) { var e = ev || 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.chkIncrementalSearch) { 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); } } }; config.macros.search.onFocus = function(e) { this.select(); }; //-- //-- Tabs macro //-- config.macros.tabs.handler = function(place,macroName,params) { var cookie = params[0]; var numTabs = (params.length-1)/3; var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper " + cookie); var tabset = createTiddlyElement(wrapper,"div",null,"tabset"); tabset.setAttribute("cookie",cookie); var validTab = false; for(var t=0; t': var btn = createTiddlyButton(place,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore); addClass(btn,"moreCommand"); var e = createTiddlyElement(place,"span",null,"moreCommand"); e.style.display = "none"; place = e; break; default: var className = ""; switch(c.substr(0,1)) { case "+": className = "defaultCommand"; c = c.substr(1); break; case "-": className = "cancelCommand"; c = c.substr(1); break; } if(c in config.commands) this.createCommand(place,c,tiddler,className); break; } } }; //-- //-- Menu and toolbar commands //-- config.commands.closeTiddler.handler = function(event,src,title) { if(story.isDirty(title) && !readOnly) { if(!confirm(config.commands.cancelTiddler.warning.format([title]))) return false; } story.setDirty(title,false); story.closeTiddler(title,true); return false; }; config.commands.closeOthers.handler = function(event,src,title) { story.closeAllTiddlers(title); return false; }; config.commands.editTiddler.handler = function(event,src,title) { clearMessage(); var tiddlerElem = story.getTiddler(title); var fields = tiddlerElem.getAttribute("tiddlyFields"); story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,fields); story.focusTiddler(title,config.options.txtEditorFocus||"text"); return false; }; config.commands.saveTiddler.handler = function(event,src,title) { var newTitle = story.saveTiddler(title,event.shiftKey); if(newTitle) story.displayTiddler(null,newTitle); return false; }; config.commands.cancelTiddler.handler = function(event,src,title) { if(story.hasChanges(title) && !readOnly) { if(!confirm(this.warning.format([title]))) return false; } story.setDirty(title,false); story.displayTiddler(null,title); return false; }; config.commands.deleteTiddler.handler = function(event,src,title) { var deleteIt = true; if(config.options.chkConfirmDelete) deleteIt = confirm(this.warning.format([title])); if(deleteIt) { store.removeTiddler(title); story.closeTiddler(title,true); autoSaveChanges(); } return false; }; config.commands.permalink.handler = function(event,src,title) { var t = encodeURIComponent(String.encodeTiddlyLink(title)); if(window.location.hash != t) window.location.hash = t; return false; }; config.commands.references.handlePopup = function(popup,title) { var references = store.getReferringTiddlers(title); var c = false; for(var r=0; r 0) ListView.create(popup,items,this.listViewTemplate); else createTiddlyElement(popup,"div",null,null,this.emptyText); }; //-- //-- Tiddler() object //-- function Tiddler(title) { this.title = title; this.text = ""; this.modifier = null; this.created = new Date(); this.modified = this.created; this.links = []; this.linksUpdated = false; this.tags = []; this.fields = {}; return this; } Tiddler.prototype.getLinks = function() { if(this.linksUpdated==false) this.changed(); return this.links; }; // Returns the fields that are inherited in string field:"value" field2:"value2" format Tiddler.prototype.getInheritedFields = function() { var f = {}; for(var i in this.fields) { if(i=="server.host" || i=="server.workspace" || i=="wikiformat"|| i=="server.type") { f[i] = this.fields[i]; } } return String.encodeHashMap(f); }; // Increment the changeCount of a tiddler Tiddler.prototype.incChangeCount = function() { var c = this.fields['changecount']; c = c ? parseInt(c,10) : 0; this.fields['changecount'] = String(c+1); }; // Clear the changeCount of a tiddler Tiddler.prototype.clearChangeCount = function() { if(this.fields['changecount']) { delete this.fields['changecount']; } }; Tiddler.prototype.doNotSave = function() { return this.fields['doNotSave']; }; // Returns true if the tiddler has been updated since the tiddler was created or downloaded Tiddler.prototype.isTouched = function() { var changeCount = this.fields['changecount']; if(changeCount === undefined) changeCount = 0; return changeCount > 0; }; // Return the tiddler as an RSS item Tiddler.prototype.toRssItem = function(uri) { var s = []; s.push("" + this.title.htmlEncode() + ""); s.push("" + wikifyStatic(this.text,null,this).htmlEncode() + ""); for(var t=0; t" + this.tags[t] + ""); s.push("" + uri + "#" + encodeURIComponent(String.encodeTiddlyLink(this.title)) + ""); s.push("" + this.modified.toGMTString() + ""); return s.join("\n"); }; // Format the text for storage in an RSS item Tiddler.prototype.saveToRss = function(uri) { return "\n" + this.toRssItem(uri) + "\n"; }; // Change the text and other attributes of a tiddler Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields) { this.assign(title,text,modifier,modified,tags,created,fields); this.changed(); return this; }; // Change the text and other attributes of a tiddler without triggered a tiddler.changed() call Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields) { if(title != undefined) this.title = title; if(text != undefined) this.text = text; if(modifier != undefined) this.modifier = modifier; if(modified != undefined) this.modified = modified; if(created != undefined) this.created = created; if(fields != undefined) this.fields = fields; if(tags != undefined) this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags; else if(this.tags == undefined) this.tags = []; return this; }; // Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces) Tiddler.prototype.getTags = function() { return String.encodeTiddlyLinkList(this.tags); }; // Test if a tiddler carries a tag Tiddler.prototype.isTagged = function(tag) { return this.tags.indexOf(tag) != -1; }; // Static method to convert "\n" to newlines, "\s" to "\" Tiddler.unescapeLineBreaks = function(text) { return text ? text.unescapeLineBreaks() : ""; }; // Convert newlines to "\n", "\" to "\s" Tiddler.prototype.escapeLineBreaks = function() { return this.text.escapeLineBreaks(); }; // Updates the secondary information (like links[] array) after a change to a tiddler Tiddler.prototype.changed = function() { this.links = []; var t = this.autoLinkWikiWords() ? 0 : 1; var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp; tiddlerLinkRegExp.lastIndex = 0; var formatMatch = tiddlerLinkRegExp.exec(this.text); while(formatMatch) { var lastIndex = tiddlerLinkRegExp.lastIndex; if(t==0 && formatMatch[1] && formatMatch[1] != this.title) { // wikiWordLink if(formatMatch.index > 0) { var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg"); preRegExp.lastIndex = formatMatch.index-1; var preMatch = preRegExp.exec(this.text); if(preMatch.index != formatMatch.index-1) this.links.pushUnique(formatMatch[1]); } else { this.links.pushUnique(formatMatch[1]); } } else if(formatMatch[2-t] && !config.formatterHelpers.isExternalLink(formatMatch[3-t])) // titledBrackettedLink this.links.pushUnique(formatMatch[3-t]); else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink this.links.pushUnique(formatMatch[4-t]); tiddlerLinkRegExp.lastIndex = lastIndex; formatMatch = tiddlerLinkRegExp.exec(this.text); } this.linksUpdated = true; }; Tiddler.prototype.getSubtitle = function() { var modifier = this.modifier; if(!modifier) modifier = config.messages.subtitleUnknown; var modified = this.modified; if(modified) modified = modified.toLocaleString(); else modified = config.messages.subtitleUnknown; return config.messages.tiddlerLinkTooltip.format([this.title,modifier,modified]); }; Tiddler.prototype.isReadOnly = function() { return readOnly; }; Tiddler.prototype.autoLinkWikiWords = function() { return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing")); }; Tiddler.prototype.generateFingerprint = function() { return "0x" + Crypto.hexSha1Str(this.text); }; Tiddler.prototype.getServerType = function() { var serverType = null; if(this.fields['server.type']) serverType = this.fields['server.type']; if(!serverType) serverType = this.fields['wikiformat']; if(serverType && !config.adaptors[serverType]) serverType = null; return serverType; }; Tiddler.prototype.getAdaptor = function() { var serverType = this.getServerType(); return serverType ? new config.adaptors[serverType]() : null; }; //-- //-- TiddlyWiki() object contains Tiddler()s //-- function TiddlyWiki() { var tiddlers = {}; // Hashmap by name of tiddlers this.tiddlersUpdated = false; this.namedNotifications = []; // Array of {name:,notify:} of notification functions this.notificationLevel = 0; this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy. this.clear = function() { tiddlers = {}; this.setDirty(false); }; this.fetchTiddler = function(title) { var t = tiddlers[title]; return t instanceof Tiddler ? t : null; }; this.deleteTiddler = function(title) { delete this.slices[title]; delete tiddlers[title]; }; this.addTiddler = function(tiddler) { delete this.slices[tiddler.title]; tiddlers[tiddler.title] = tiddler; }; this.forEachTiddler = function(callback) { for(var t in tiddlers) { var tiddler = tiddlers[t]; if(tiddler instanceof Tiddler) callback.call(this,t,tiddler); } }; } TiddlyWiki.prototype.setDirty = function(dirty) { this.dirty = dirty; }; TiddlyWiki.prototype.isDirty = function() { return this.dirty; }; TiddlyWiki.prototype.tiddlerExists = function(title) { var t = this.fetchTiddler(title); return t != undefined; }; TiddlyWiki.prototype.isShadowTiddler = function(title) { return typeof config.shadowTiddlers[title] == "string"; }; TiddlyWiki.prototype.createTiddler = function(title) { var tiddler = this.fetchTiddler(title); if(!tiddler) { tiddler = new Tiddler(title); this.addTiddler(tiddler); this.setDirty(true); } return tiddler; }; TiddlyWiki.prototype.getTiddler = function(title) { var t = this.fetchTiddler(title); if(t != undefined) return t; else return null; }; TiddlyWiki.prototype.getTiddlerText = function(title,defaultText) { if(!title) return defaultText; var pos = title.indexOf(config.textPrimitives.sectionSeparator); var section = null; if(pos != -1) { section = title.substr(pos + config.textPrimitives.sectionSeparator.length); title = title.substr(0,pos); } pos = title.indexOf(config.textPrimitives.sliceSeparator); if(pos != -1) { var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length)); if(slice) return slice; } var tiddler = this.fetchTiddler(title); if(tiddler) { if(!section) return tiddler.text; var re = new RegExp("(^!{1,6}" + section.escapeRegExp() + "[ \t]*\n)","mg"); re.lastIndex = 0; var match = re.exec(tiddler.text); if(match) { var t = tiddler.text.substr(match.index+match[1].length); var re2 = /^!/mg; re2.lastIndex = 0; match = re2.exec(t); //# search for the next heading if(match) t = t.substr(0,match.index-1);//# don't include final \n return t; } return defaultText; } if(this.isShadowTiddler(title)) return config.shadowTiddlers[title]; if(defaultText != undefined) return defaultText; return null; }; TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) { var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg"); var text = this.getTiddlerText(title,null); if(text == null) return defaultText; var textOut = []; var lastPos = 0; do { var match = bracketRegExp.exec(text); if(match) { textOut.push(text.substr(lastPos,match.index-lastPos)); if(match[1]) { if(depth <= 0) textOut.push(match[1]); else textOut.push(this.getRecursiveTiddlerText(match[1],"[[" + match[1] + "]]",depth-1)); } lastPos = match.index + match[0].length; } else { textOut.push(text.substr(lastPos)); } } while(match); return textOut.join(""); }; TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1\s*([^\n]+)\s*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|\s*([^\|\n]+)\s*\|$)/gm; // @internal TiddlyWiki.prototype.calcAllSlices = function(title) { var slices = {}; var text = this.getTiddlerText(title,""); this.slicesRE.lastIndex = 0; var m = this.slicesRE.exec(text); while(m) { if(m[2]) slices[m[2]] = m[3]; else slices[m[5]] = m[6]; m = this.slicesRE.exec(text); } return slices; }; // Returns the slice of text of the given name TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName) { var slices = this.slices[title]; if(!slices) { slices = this.calcAllSlices(title); this.slices[title] = slices; } return slices[sliceName]; }; // Build an hashmap of the specified named slices of a tiddler TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames) { var r = {}; for(var t=0; t<" + "body>" + text.substring(posDiv[0],posDiv[1] + endSaveArea.length) + "<" + "/body><" + "/html>"; // Create the iframe var iframe = document.createElement("iframe"); iframe.style.display = "none"; document.body.appendChild(iframe); var doc = iframe.document; if(iframe.contentDocument) doc = iframe.contentDocument; // For NS6 else if(iframe.contentWindow) doc = iframe.contentWindow.document; // For IE5.5 and IE6 // Put the content in the iframe doc.open(); doc.writeln(content); doc.close(); // Load the content into a TiddlyWiki() object var storeArea = doc.getElementById("storeArea"); this.loadFromDiv(storeArea,"store"); // Get rid of the iframe iframe.parentNode.removeChild(iframe); return this; }; TiddlyWiki.prototype.updateTiddlers = function() { this.tiddlersUpdated = true; this.forEachTiddler(function(title,tiddler) { tiddler.changed(); }); }; // Return an array of tiddlers matching a search regular expression TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match) { var candidates = this.reverseLookup("tags",excludeTag,!!match); var results = []; for(var t=0; tString value = value instanceof Date ? value.convertToYYYYMMDDHHMMSSMMM() : String(value); if(oldValue == value) return; t.fields[fieldName] = value; } } // When we are here the tiddler/store really was changed. this.notify(t.title,true); if(!fieldName.match(/^temp\./)) this.setDirty(true); }; // Returns the value of the given field of the tiddler. // The fieldName is case-insensitive. // Will only return String values (or undefined). TiddlyWiki.prototype.getValue = function(tiddler,fieldName) { var t = this.resolveTiddler(tiddler); if(!t) return undefined; fieldName = fieldName.toLowerCase(); var accessor = TiddlyWiki.standardFieldAccess[fieldName]; if(accessor) { return accessor.get(t); } return t.fields[fieldName]; }; // Calls the callback function for every field in the tiddler. // When callback function returns a non-false value the iteration stops // and that value is returned. // The order of the fields is not defined. // @param callback a function(tiddler,fieldName,value). TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields) { var t = this.resolveTiddler(tiddler); if(!t) return undefined; var n,result; for(n in t.fields) { result = callback(t,n,t.fields[n]); if(result) return result; } if(onlyExtendedFields) return undefined; for(n in TiddlyWiki.standardFieldAccess) { if(n == "tiddler") // even though the "title" field can also be referenced through the name "tiddler" // we only visit this field once. continue; result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t)); if(result) return result; } return undefined; }; //-- //-- Story functions //-- function Story(containerId,idPrefix) { this.container = containerId; this.idPrefix = idPrefix; this.highlightRegExp = null; this.tiddlerId = function(title) { var id = this.idPrefix + title; return id==this.container ? this.idPrefix + "_" + title : id; }; this.containerId = function() { return this.container; }; } Story.prototype.getTiddler = function(title) { return document.getElementById(this.tiddlerId(title)); }; Story.prototype.getContainer = function() { return document.getElementById(this.containerId()); }; Story.prototype.forEachTiddler = function(fn) { var place = this.getContainer(); if(!place) return; var e = place.firstChild; while(e) { var n = e.nextSibling; var title = e.getAttribute("tiddler"); fn.call(this,title,e); e = n; } }; Story.prototype.displayDefaultTiddlers = function() { this.displayTiddlers(null,store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"))); }; Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,unused,customFields,toggle) { for(var t = titles.length-1;t>=0;t--) this.displayTiddler(srcElement,titles[t],template,animate,unused,customFields); }; Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc) { var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler; var tiddlerElem = this.getTiddler(title); if(tiddlerElem) { if(toggle) this.closeTiddler(title,true); else this.refreshTiddler(title,template,false,customFields); } else { var place = this.getContainer(); var before = this.positionTiddler(srcElement); tiddlerElem = this.createTiddler(place,before,title,template,customFields); } if(animationSrc && typeof animationSrc !== "string") { srcElement = animationSrc; } if(srcElement && typeof srcElement !== "string") { if(config.options.chkAnimate && (animate == undefined || animate == true) && anim && typeof Zoomer == "function" && typeof Scroller == "function") anim.startAnimating(new Zoomer(title,srcElement,tiddlerElem),new Scroller(tiddlerElem)); else window.scrollTo(0,ensureVisible(tiddlerElem)); } }; Story.prototype.positionTiddler = function(srcElement) { var place = this.getContainer(); var before = null; if(typeof srcElement == "string") { switch(srcElement) { case "top": before = place.firstChild; break; case "bottom": before = null; break; } } else { var after = this.findContainingTiddler(srcElement); if(after == null) { before = place.firstChild; } else if(after.nextSibling) { before = after.nextSibling; if(before.nodeType != 1) before = null; } } return before; }; Story.prototype.createTiddler = function(place,before,title,template,customFields) { var tiddlerElem = createTiddlyElement(null,"div",this.tiddlerId(title),"tiddler"); tiddlerElem.setAttribute("refresh","tiddler"); if(customFields) tiddlerElem.setAttribute("tiddlyFields",customFields); place.insertBefore(tiddlerElem,before); var defaultText = null; if(!store.tiddlerExists(title) && !store.isShadowTiddler(title)) defaultText = this.loadMissingTiddler(title,customFields,tiddlerElem); this.refreshTiddler(title,template,false,customFields,defaultText); return tiddlerElem; }; Story.prototype.loadMissingTiddler = function(title,fields,tiddlerElem) { var tiddler = new Tiddler(title); tiddler.fields = typeof fields == "string" ? fields.decodeHashMap() : (fields || {}); var serverType = tiddler.getServerType(); var host = tiddler.fields['server.host']; var workspace = tiddler.fields['server.workspace']; if(!serverType || !host) return null; var sm = new SyncMachine(serverType,{ start: function() { return this.openHost(host,"openWorkspace"); }, openWorkspace: function() { return this.openWorkspace(workspace,"getTiddler"); }, getTiddler: function() { return this.getTiddler(title,"onGetTiddler"); }, onGetTiddler: function(context) { var tiddler = context.tiddler; if(tiddler && tiddler.text) { var downloaded = new Date(); if(!tiddler.created) tiddler.created = downloaded; if(!tiddler.modified) tiddler.modified = tiddler.created; store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created); autoSaveChanges(); } delete this; return true; }, error: function(message) { displayMessage("Error loading missing tiddler from %0: %1".format([host,message])); } }); sm.go(); return config.messages.loadingMissingTiddler.format([title,serverType,host,workspace]); }; Story.prototype.chooseTemplateForTiddler = function(title,template) { if(!template) template = DEFAULT_VIEW_TEMPLATE; if(template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE) template = config.tiddlerTemplates[template]; return template; }; Story.prototype.getTemplateForTiddler = function(title,template,tiddler) { return store.getRecursiveTiddlerText(template,null,10); }; Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText) { var tiddlerElem = this.getTiddler(title); if(tiddlerElem) { if(tiddlerElem.getAttribute("dirty") == "true" && !force) return tiddlerElem; template = this.chooseTemplateForTiddler(title,template); var currTemplate = tiddlerElem.getAttribute("template"); if((template != currTemplate) || force) { var tiddler = store.getTiddler(title); if(!tiddler) { tiddler = new Tiddler(); if(store.isShadowTiddler(title)) { tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,[],version.date); } else { var text = template=="EditTemplate" ? config.views.editor.defaultText.format([title]) : config.views.wikified.defaultText.format([title]); text = defaultText || text; var fields = customFields ? customFields.decodeHashMap() : null; tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date,fields); } } tiddlerElem.setAttribute("tags",tiddler.tags.join(" ")); tiddlerElem.setAttribute("tiddler",title); tiddlerElem.setAttribute("template",template); tiddlerElem.onmouseover = this.onTiddlerMouseOver; tiddlerElem.onmouseout = this.onTiddlerMouseOut; tiddlerElem.ondblclick = this.onTiddlerDblClick; tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress; tiddlerElem.innerHTML = this.getTemplateForTiddler(title,template,tiddler); applyHtmlMacros(tiddlerElem,tiddler); if(store.getTaggedTiddlers(title).length > 0) addClass(tiddlerElem,"isTag"); else removeClass(tiddlerElem,"isTag"); if(store.tiddlerExists(title)) { removeClass(tiddlerElem,"shadow"); removeClass(tiddlerElem,"missing"); } else { addClass(tiddlerElem,store.isShadowTiddler(title) ? "shadow" : "missing"); } if(customFields) this.addCustomFields(tiddlerElem,customFields); forceReflow(); } } return tiddlerElem; }; Story.prototype.addCustomFields = function(place,customFields) { var fields = customFields.decodeHashMap(); var w = document.createElement("div"); w.style.display = "none"; place.appendChild(w); for(var t in fields) { var e = document.createElement("input"); e.setAttribute("type","text"); e.setAttribute("value",fields[t]); w.appendChild(e); e.setAttribute("edit",t); } }; Story.prototype.refreshAllTiddlers = function(force) { var e = this.getContainer().firstChild; while(e) { var template = e.getAttribute("template"); if(template && e.getAttribute("dirty") != "true") { this.refreshTiddler(e.getAttribute("tiddler"),force ? null : template,true); } e = e.nextSibling; } }; Story.prototype.onTiddlerMouseOver = function(e) { if(window.addClass instanceof Function) addClass(this,"selected"); }; Story.prototype.onTiddlerMouseOut = function(e) { if(window.removeClass instanceof Function) removeClass(this,"selected"); }; Story.prototype.onTiddlerDblClick = function(ev) { var e = ev || window.event; var target = resolveTarget(e); if(target && target.nodeName.toLowerCase() != "input" && target.nodeName.toLowerCase() != "textarea") { if(document.selection && document.selection.empty) document.selection.empty(); config.macros.toolbar.invokeCommand(this,"defaultCommand",e); e.cancelBubble = true; if(e.stopPropagation) e.stopPropagation(); return true; } return false; }; Story.prototype.onTiddlerKeyPress = function(ev) { var e = ev || window.event; clearMessage(); var consume = false; var title = this.getAttribute("tiddler"); var target = resolveTarget(e); switch(e.keyCode) { case 9: // Tab if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea") { replaceSelection(target,String.fromCharCode(9)); consume = true; } if(config.isOpera) { target.onblur = function() { this.focus(); this.onblur = null; }; } break; case 13: // Ctrl-Enter case 10: // Ctrl-Enter on IE PC case 77: // Ctrl-Enter is "M" on some platforms if(e.ctrlKey) { blurElement(this); config.macros.toolbar.invokeCommand(this,"defaultCommand",e); consume = true; } break; case 27: // Escape blurElement(this); config.macros.toolbar.invokeCommand(this,"cancelCommand",e); consume = true; break; } e.cancelBubble = consume; if(consume) { if(e.stopPropagation) e.stopPropagation(); // Stop Propagation e.returnValue = true; // Cancel The Event in IE if(e.preventDefault ) e.preventDefault(); // Cancel The Event in Moz } return !consume; }; Story.prototype.getTiddlerField = function(title,field) { var tiddlerElem = this.getTiddler(title); var e = null; if(tiddlerElem ) { var children = tiddlerElem.getElementsByTagName("*"); for(var t=0; t 0) displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q + text + q])); else displayMessage(config.macros.search.failureMsg.format([q + text + q])); }; Story.prototype.findContainingTiddler = function(e) { while(e && !hasClass(e,"tiddler")) e = e.parentNode; return e; }; Story.prototype.gatherSaveFields = function(e,fields) { if(e && e.getAttribute) { var f = e.getAttribute("edit"); if(f) fields[f] = e.value.replace(/\r/mg,""); if(e.hasChildNodes()) { var c = e.childNodes; for(var t=0; t 0) { if(!confirm(config.macros.importTiddlers.confirmOverwriteText.format([overwrite.join(", ")]))) return false; } wizard.addStep(config.macros.importTiddlers.step4Title.format([rowNames.length]),config.macros.importTiddlers.step4Html); for(t=0; t si.tiddler.fields['server.page.revision']) { si.syncStatus = config.macros.sync.syncStatusList[si.isTouched ? 'changedBoth' : 'changedServer']; } } else { si.syncStatus = config.macros.sync.syncStatusList.notFound; } config.macros.sync.updateSyncStatus(si); } }, getTiddler: function(title) { return this.getTiddler(title,"onGetTiddler"); }, onGetTiddler: function(context) { var tiddler = context.tiddler; var syncItem = st.syncItems.findByField("title",tiddler.title); if(syncItem !== null) { syncItem = st.syncItems[syncItem]; store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, true, tiddler.created); syncItem.syncStatus = config.macros.sync.syncStatusList.gotFromServer; config.macros.sync.updateSyncStatus(syncItem); } }, putTiddler: function(tiddler) { return this.putTiddler(tiddler,"onPutTiddler"); }, onPutTiddler: function(context) { var title = context.title; var syncItem = st.syncItems.findByField("title",title); if(syncItem !== null) { syncItem = st.syncItems[syncItem]; store.resetTiddler(title); if(context.status) { syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer; config.macros.sync.updateSyncStatus(syncItem); } } } }); st.syncMachine.go(); return st; }; config.macros.sync.updateSyncStatus = function(syncItem) { var e = syncItem.colElements["status"]; removeChildren(e); createTiddlyText(e,syncItem.syncStatus.text); syncItem.rowElement.style.display = syncItem.syncStatus.display; if(syncItem.syncStatus.className) syncItem.rowElement.className = syncItem.syncStatus.className; }; config.macros.sync.doSync = function(e) { var rowNames = ListView.getSelectedRows(currSync.listView); var sl = config.macros.sync.syncStatusList; for(var i=0; i=0; t--) stash.appendChild(nodes[t]); } var wrapper = document.getElementById("contentWrapper"); var isAvailable = function(title) { var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1; if(s!=-1) title = title.substr(0,s); return store.tiddlerExists(title) || store.isShadowTiddler(title); }; if(!title || !isAvailable(title)) title = config.refresherData.pageTemplate; if(!isAvailable(title)) title = config.refresherData.defaultPageTemplate; //# this one is always avaialable wrapper.innerHTML = store.getRecursiveTiddlerText(title,null,10); applyHtmlMacros(wrapper); refreshElements(wrapper); display = story.getContainer(); removeChildren(display); if(!display) display = createTiddlyElement(wrapper,"div",story.containerId()); nodes = stash.childNodes; for(t=nodes.length-1; t>=0; t--) display.appendChild(nodes[t]); removeNode(stash); } function refreshDisplay(hint) { if(typeof hint == "string") hint = [hint]; var e = document.getElementById("contentWrapper"); refreshElements(e,hint); if(backstage.isPanelVisible()) { e = document.getElementById("backstage"); refreshElements(e,hint); } } function refreshPageTitle() { document.title = getPageTitle(); } function getPageTitle() { var st = wikifyPlain("SiteTitle"); var ss = wikifyPlain("SiteSubtitle"); return st + ((st == "" || ss == "") ? "" : " - ") + ss; } function refreshStyles(title,doc) { setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc || document); } function refreshColorPalette(title) { if(!startingUp) refreshAll(); } function refreshAll() { refreshPageTemplate(); refreshDisplay(); refreshStyles("StyleSheetLayout"); refreshStyles("StyleSheetColors"); refreshStyles(config.refresherData.styleSheet); refreshStyles("StyleSheetPrint"); } //-- //-- Options stuff //-- config.optionHandlers = { 'txt': { get: function(name) {return encodeCookie(config.options[name].toString());}, set: function(name,value) {config.options[name] = decodeCookie(value);} }, 'chk': { get: function(name) {return config.options[name] ? "true" : "false";}, set: function(name,value) {config.options[name] = value == "true";} } }; function loadOptionsCookie() { if(safeMode) return; var cookies = document.cookie.split(";"); for(var c=0; c'; // Split up into two so that indexOf() of this source doesn't find it var endSaveArea = ''; // If there are unsaved changes, force the user to confirm before exitting function confirmExit() { hadConfirmExit = true; if((store && store.isDirty && store.isDirty()) || (story && story.areAnyDirty && story.areAnyDirty())) return config.messages.confirmExit; } // Give the user a chance to save changes before exitting function checkUnsavedChanges() { if(store && store.isDirty && store.isDirty() && window.hadConfirmExit === false) { if(confirm(config.messages.unsavedChangesWarning)) saveChanges(); } } function updateLanguageAttribute(s) { if(config.locale) { var mRE = /(/; var m = mRE.exec(s); if(m) { var t = m[1]; if(m[2]) t += ' xml:lang="' + config.locale + '"'; if(m[3]) t += ' lang="' + config.locale + '"'; t += ">"; s = s.substr(0,m.index) + t + s.substr(m.index+m[0].length); } } return s; } function updateMarkupBlock(s,blockName,tiddlerName) { return s.replaceChunk( "".format([blockName]), "".format([blockName]), "\n" + convertUnicodeToFileFormat(store.getRecursiveTiddlerText(tiddlerName,"")) + "\n"); } function updateOriginal(original,posDiv,localPath) { if(!posDiv) posDiv = locateStoreArea(original); if(!posDiv) { alert(config.messages.invalidFileError.format([localPath])); return null; } var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" + convertUnicodeToFileFormat(store.allTiddlersAsHtml()) + "\n" + original.substr(posDiv[1]); var newSiteTitle = convertUnicodeToFileFormat(getPageTitle()).htmlEncode(); revised = revised.replaceChunk("",""," " + newSiteTitle + " "); revised = updateLanguageAttribute(revised); revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead"); revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead"); revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody"); revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody"); return revised; } function locateStoreArea(original) { // Locate the storeArea div's var posOpeningDiv = original.indexOf(startSaveArea); var limitClosingDiv = original.indexOf("<"+"!--POST-STOREAREA--"+">"); if(limitClosingDiv == -1) limitClosingDiv = original.indexOf("<"+"!--POST-BODY-START--"+">"); var posClosingDiv = original.lastIndexOf(endSaveArea,limitClosingDiv == -1 ? original.length : limitClosingDiv); return (posOpeningDiv != -1 && posClosingDiv != -1) ? [posOpeningDiv,posClosingDiv] : null; } function autoSaveChanges(onlyIfDirty,tiddlers) { if(config.options.chkAutoSave) saveChanges(onlyIfDirty,tiddlers); } function loadOriginal(localPath) { return loadFile(localPath); } // Save this tiddlywiki with the pending changes function saveChanges(onlyIfDirty,tiddlers) { if(onlyIfDirty && !store.isDirty()) return; clearMessage(); var t0 = new Date(); var originalPath = document.location.toString(); if(originalPath.substr(0,5) != "file:") { alert(config.messages.notFileUrlError); if(store.tiddlerExists(config.messages.saveInstructions)) story.displayTiddler(null,config.messages.saveInstructions); return; } var localPath = getLocalPath(originalPath); var original = loadOriginal(localPath); if(original == null) { alert(config.messages.cantSaveError); if(store.tiddlerExists(config.messages.saveInstructions)) story.displayTiddler(null,config.messages.saveInstructions); return; } var posDiv = locateStoreArea(original); if(!posDiv) { alert(config.messages.invalidFileError.format([localPath])); return; } saveMain(localPath,original,posDiv); if(config.options.chkSaveBackups) saveBackup(localPath,original); if(config.options.chkSaveEmptyTemplate) saveEmpty(localPath,original,posDiv); if(config.options.chkGenerateAnRssFeed && saveRss instanceof Function) saveRss(localPath); if(config.options.chkDisplayInstrumentation) displayMessage("saveChanges " + (new Date()-t0) + " ms"); } function saveMain(localPath,original,posDiv) { var save; try { var revised = updateOriginal(original,posDiv,localPath); save = saveFile(localPath,revised); } catch (ex) { showException(ex); } if(save) { displayMessage(config.messages.mainSaved,"file://" + localPath); store.setDirty(false); } else { alert(config.messages.mainFailed); } } function saveBackup(localPath,original) { var backupPath = getBackupPath(localPath); var backup = copyFile(backupPath,localPath); if(!backup) backup = saveFile(backupPath,original); if(backup) displayMessage(config.messages.backupSaved,"file://" + backupPath); else alert(config.messages.backupFailed); } function saveEmpty(localPath,original,posDiv) { var emptyPath,p; if((p = localPath.lastIndexOf("http://www.geocities.com/")) != -1) emptyPath = localPath.substr(0,p) + "/"; else if((p = localPath.lastIndexOf("\\")) != -1) emptyPath = localPath.substr(0,p) + "\\"; else emptyPath = localPath + "."; emptyPath += "http://www.geocities.com/chainpunch/empty.html"; var empty = original.substr(0,posDiv[0] + startSaveArea.length) + original.substr(posDiv[1]); var emptySave = saveFile(emptyPath,empty); if(emptySave) displayMessage(config.messages.emptySaved,"file://" + emptyPath); else alert(config.messages.emptyFailed); } function getLocalPath(origPath) { var originalPath = convertUriToUTF8(origPath,config.options.txtFileSystemCharSet); // Remove any location or query part of the URL var argPos = originalPath.indexOf("?"); if(argPos != -1) originalPath = originalPath.substr(0,argPos); var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos); // Convert file://localhost/ to file:/// if(originalPath.indexOf("file:////localhost/") == 0) originalPath = "file://" + originalPath.substr(16); // Convert to a native file format var localPath; if(originalPath.charAt(9) == ":") // pc local file localPath = unescape(originalPath.substr(8)).replace(new RegExp("http://www.geocities.com/","g"),"\\"); else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("http://www.geocities.com/","g"),"\\"); else if(originalPath.indexOf("file:///") == 0) // mac/unix local file localPath = unescape(originalPath.substr(7)); else if(originalPath.indexOf("file:/") == 0) // mac/unix local file localPath = unescape(originalPath.substr(5)); else // pc network file localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("http://www.geocities.com/","g"),"\\"); return localPath; } function getBackupPath(localPath,title,extension) { var slash = "\\"; var dirPathPos = localPath.lastIndexOf("\\"); if(dirPathPos == -1) { dirPathPos = localPath.lastIndexOf("http://www.geocities.com/"); slash = "http://www.geocities.com/"; } var backupFolder = config.options.txtBackupFolder; if(!backupFolder || backupFolder == "") backupFolder = "."; var backupPath = localPath.substr(0,dirPathPos) + slash + backupFolder + localPath.substr(dirPathPos); backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + "."; if(title) backupPath += title.replace(/[\\\/\*\?\":<> ]/g,"_") + "."; backupPath += (new Date()).convertToYYYYMMDDHHMMSSMMM() + "." + (extension || "html"); return backupPath; } //-- //-- RSS Saving //-- function saveRss(localPath) { var rssPath = localPath.substr(0,localPath.lastIndexOf(".")) + ".xml"; if(saveFile(rssPath,convertUnicodeToFileFormat(generateRss()))) displayMessage(config.messages.rssSaved,"file://" + rssPath); else alert(config.messages.rssFailed); } function generateRss() { var s = []; var d = new Date(); var u = store.getTiddlerText("SiteUrl"); // Assemble the header s.push("<" + "?xml version=\"1.0\"?" + ">"); s.push(""); s.push(""); s.push("" + wikifyPlain("SiteTitle").htmlEncode() + ""); if(u) s.push("" + u.htmlEncode() + ""); s.push("" + wikifyPlain("SiteSubtitle").htmlEncode() + ""); s.push("" + config.locale + ""); s.push("Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + ""); s.push("" + d.toGMTString() + ""); s.push("" + d.toGMTString() + ""); s.push("http://blogs.law.harvard.edu/tech/rss"); s.push("TiddlyWiki " + formatVersion() + ""); // The body var tiddlers = store.getTiddlers("modified","excludeLists"); var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems; for(var t=tiddlers.length-1; t>=n; t--) { s.push("\n" + tiddlers[t].toRssItem(u) + "\n"); } // And footer s.push(""); s.push(""); // Save it all return s.join("\n"); } //-- //-- Filesystem code //-- function convertUTF8ToUnicode(u) { return config.browser.isOpera || !window.netscape ? manualConvertUTF8ToUnicode(u) : mozConvertUTF8ToUnicode(u); } function manualConvertUTF8ToUnicode(utf) { var uni = utf; var src = 0; var dst = 0; var b1, b2, b3; var c; while(src < utf.length) { b1 = utf.charCodeAt(src++); if(b1 < 0x80) { dst++; } else if(b1 < 0xE0) { b2 = utf.charCodeAt(src++); c = String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F)); uni = uni.substring(0,dst++).concat(c,utf.substr(src)); } else { b2 = utf.charCodeAt(src++); b3 = utf.charCodeAt(src++); c = String.fromCharCode(((b1 & 0xF) << 12) | ((b2 & 0x3F) << 6) | (b3 & 0x3F)); uni = uni.substring(0,dst++).concat(c,utf.substr(src)); } } return uni; } function mozConvertUTF8ToUnicode(u) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; } catch(ex) { return manualConvertUTF8ToUnicode(u); } // fallback var s = converter.ConvertToUnicode(u); var fin = converter.Finish(); return fin.length > 0 ? s+fin : s; } function convertUnicodeToFileFormat(s) { return config.browser.isOpera || !window.netscape ? convertUnicodeToHtmlEntities(s) : mozConvertUnicodeToUTF8(s); } function convertUnicodeToHtmlEntities(s) { var re = /[^\u0000-\u007F]/g; return s.replace(re,function($0) {return "&#" + $0.charCodeAt(0).toString() + ";";}); } function convertUnicodeToUTF8(s) { // return convertUnicodeToFileFormat to allow plugin migration return convertUnicodeToFileFormat(s); } function manualConvertUnicodeToUTF8(s) { return unescape(encodeURIComponent(s)); } function mozConvertUnicodeToUTF8(s) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; } catch(ex) { return manualConvertUnicodeToUTF8(s); } // fallback var u = converter.ConvertFromUnicode(s); var fin = converter.Finish(); return fin.length > 0 ? u + fin : u; } function convertUriToUTF8(uri,charSet) { if(window.netscape == undefined || charSet == undefined || charSet == "") return uri; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var converter = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService); } catch(ex) { return uri; } return converter.convertURISpecToUTF8(uri,charSet); } function copyFile(dest,source) { return config.browser.isIE ? ieCopyFile(dest,source) : false; } function saveFile(fileUrl,content) { var r = mozillaSaveFile(fileUrl,content); if(!r) r = ieSaveFile(fileUrl,content); if(!r) r = javaSaveFile(fileUrl,content); return r; } function loadFile(fileUrl) { var r = mozillaLoadFile(fileUrl); if((r == null) || (r == false)) r = ieLoadFile(fileUrl); if((r == null) || (r == false)) r = javaLoadFile(fileUrl); return r; } function ieCreatePath(path) { try { var fso = new ActiveXObject("Scripting.FileSystemObject"); } catch(ex) { return null; } var pos = path.lastIndexOf("\\"); if(pos!=-1) path = path.substring(0,pos+1); var scan = [path]; var parent = fso.GetParentFolderName(path); while(parent && !fso.FolderExists(parent)) { scan.push(parent); parent = fso.GetParentFolderName(parent); } for(i=scan.length-1;i>=0;i--) { if(!fso.FolderExists(scan[i])) { fso.CreateFolder(scan[i]); } } return true; } // Returns null if it can't do it, false if there's an error, true if it saved OK function ieSaveFile(filePath,content) { ieCreatePath(filePath); try { var fso = new ActiveXObject("Scripting.FileSystemObject"); } catch(ex) { return null; } var file = fso.OpenTextFile(filePath,2,-1,0); file.Write(content); file.Close(); return true; } // Returns null if it can't do it, false if there's an error, or a string of the content if successful function ieLoadFile(filePath) { try { var fso = new ActiveXObject("Scripting.FileSystemObject"); var file = fso.OpenTextFile(filePath,1); var content = file.ReadAll(); file.Close(); } catch(ex) { return null; } return content; } function ieCopyFile(dest,source) { ieCreatePath(dest); try { var fso = new ActiveXObject("Scripting.FileSystemObject"); fso.GetFile(source).Copy(dest); } catch(ex) { return false; } return true; } // Returns null if it can't do it, false if there's an error, true if it saved OK function mozillaSaveFile(filePath,content) { if(window.Components) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(filePath); if(!file.exists()) file.create(0,0664); var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); out.init(file,0x20|0x02,00004,null); out.write(content,content.length); out.flush(); out.close(); return true; } catch(ex) { return false; } } return null; } // Returns null if it can't do it, false if there's an error, or a string of the content if successful function mozillaLoadFile(filePath) { if(window.Components) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(filePath); if(!file.exists()) return null; var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); inputStream.init(file,0x01,00004,null); var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); sInputStream.init(inputStream); var contents = sInputStream.read(sInputStream.available()); sInputStream.close(); inputStream.close(); return contents; } catch(ex) { return false; } } return null; } function javaUrlToFilename(url) { var f = "//localhost"; if(url.indexOf(f) == 0) return url.substring(f.length); var i = url.indexOf(":"); return i > 0 ? url.substring(i-1) : url; } function javaSaveFile(filePath,content) { try { if(document.applets["TiddlySaver"]) return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content); } catch(ex) { } try { var s = new java.io.PrintStream(new java.io.FileOutputStream(javaUrlToFilename(filePath))); s.print(content); s.close(); } catch(ex) { return null; } return true; } function javaLoadFile(filePath) { try { if(document.applets["TiddlySaver"]) return String(document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8")); } catch(ex) { } var content = []; try { var r = new java.io.BufferedReader(new java.io.FileReader(javaUrlToFilename(filePath))); var line; while((line = r.readLine()) != null) content.push(new String(line)); r.close(); } catch(ex) { return null; } return content.join("\n"); } //-- //-- Server adaptor base class //-- function AdaptorBase() { this.host = null; this.store = null; return this; } AdaptorBase.prototype.close = function() { return true; }; AdaptorBase.prototype.fullHostName = function(host) { if(!host) return ''; host = host.trim(); if(!host.match(/:\/\//)) host = 'http://' + host; if(host.substr(host.length-1) == 'http://www.geocities.com/') host = host.substr(0,host.length-1) return host; }; AdaptorBase.minHostName = function(host) { return host ? host.replace(/^http:\/\//,'').replace(/\/$/,'') : ''; }; AdaptorBase.prototype.setContext = function(context,userParams,callback) { if(!context) context = {}; context.userParams = userParams; if(callback) context.callback = callback; context.adaptor = this; if(!context.host) context.host = this.host; context.host = this.fullHostName(context.host); if(!context.workspace) context.workspace = this.workspace; return context; }; // Open the specified host AdaptorBase.prototype.openHost = function(host,context,userParams,callback) { this.host = host; context = this.setContext(context,userParams,callback); context.status = true; if(callback) window.setTimeout(function() {context.callback(context,userParams);},10); return true; }; // Open the specified workspace AdaptorBase.prototype.openWorkspace = function(workspace,context,userParams,callback) { this.workspace = workspace; context = this.setContext(context,userParams,callback); context.status = true; if(callback) window.setTimeout(function() {callback(context,userParams);},10); return true; }; //-- //-- Server adaptor for talking to static TiddlyWiki files //-- function FileAdaptor() { } FileAdaptor.prototype = new AdaptorBase(); FileAdaptor.serverType = 'file'; FileAdaptor.serverLabel = 'TiddlyWiki'; FileAdaptor.loadTiddlyWikiCallback = function(status,context,responseText,url,xhr) { context.status = status; if(!status) { context.statusText = "Error reading file"; } else { context.adaptor.store = new TiddlyWiki(); if(!context.adaptor.store.importTiddlyWiki(responseText)) { context.statusText = config.messages.invalidFileError.format([url]); context.status = false; } } context.complete(context,context.userParams); }; // Get the list of workspaces on a given server FileAdaptor.prototype.getWorkspaceList = function(context,userParams,callback) { context = this.setContext(context,userParams,callback); context.workspaces = [{title:"(default)"}]; context.status = true; if(callback) window.setTimeout(function() {callback(context,userParams);},10); return true; }; // Gets the list of tiddlers within a given workspace FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter) { context = this.setContext(context,userParams,callback); if(!context.filter) context.filter = filter; context.complete = FileAdaptor.getTiddlerListComplete; if(this.store) { var ret = context.complete(context,context.userParams); } else { ret = loadRemoteFile(context.host,FileAdaptor.loadTiddlyWikiCallback,context); if(typeof ret != "string") ret = true; } return ret; }; FileAdaptor.getTiddlerListComplete = function(context,userParams) { if(context.status) { if(context.filter) { context.tiddlers = context.adaptor.store.filterTiddlers(context.filter); } else { context.tiddlers = []; context.adaptor.store.forEachTiddler(function(title,tiddler) {context.tiddlers.push(tiddler);}); } for(var i=0; ix2) return -1; } x1 = v1.beta || 9999; x2 = v2.beta || 9999; if(x1 x2 ? -1 : 0; } function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs) { var btn = document.createElement("a"); if(action) { btn.onclick = action; btn.setAttribute("href","javascript:;"); } if(tooltip) btn.setAttribute("title",tooltip); if(text) btn.appendChild(document.createTextNode(text)); btn.className = className || "button"; if(id) btn.id = id; if(attribs) { for(var i in attribs) { btn.setAttribute(i,attribs[i]); } } if(parent) parent.appendChild(btn); if(accessKey) btn.setAttribute("accessKey",accessKey); return btn; } function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle) { var text = includeText ? title : null; var i = getTiddlyLinkInfo(title,className); var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes); if(isStatic) btn.className += ' ' + className; btn.setAttribute("refresh","link"); btn.setAttribute("tiddlyLink",title); if(noToggle) btn.setAttribute("noToggle","true"); if(linkedFromTiddler) { var fields = linkedFromTiddler.getInheritedFields(); if(fields) btn.setAttribute("tiddlyFields",fields); } return btn; } function refreshTiddlyLink(e,title) { var i = getTiddlyLinkInfo(title,e.className); e.className = i.classes; e.title = i.subTitle; } function getTiddlyLinkInfo(title,currClasses) { var classes = currClasses ? currClasses.split(" ") : []; classes.pushUnique("tiddlyLink"); var tiddler = store.fetchTiddler(title); var subTitle; if(tiddler) { subTitle = tiddler.getSubtitle(); classes.pushUnique("tiddlyLinkExisting"); classes.remove("tiddlyLinkNonExisting"); classes.remove("shadow"); } else { classes.remove("tiddlyLinkExisting"); classes.pushUnique("tiddlyLinkNonExisting"); if(store.isShadowTiddler(title)) { subTitle = config.messages.shadowedTiddlerToolTip.format([title]); classes.pushUnique("shadow"); } else { subTitle = config.messages.undefinedTiddlerToolTip.format([title]); classes.remove("shadow"); } } if(typeof config.annotations[title]=="string") subTitle = config.annotations[title]; return {classes: classes.join(" "),subTitle: subTitle}; } function createExternalLink(place,url) { var link = document.createElement("a"); link.className = "externalLink"; link.href = url; link.title = config.messages.externalLinkTooltip.format([url]); if(config.options.chkOpenInNewWindow) link.target = "_blank"; place.appendChild(link); return link; } // Event handler for clicking on a tiddly link function onClickTiddlerLink(ev) { var e = ev || window.event; var target = resolveTarget(e); var link = target; var title = null; var fields = null; var noToggle = null; do { title = link.getAttribute("tiddlyLink"); fields = link.getAttribute("tiddlyFields"); noToggle = link.getAttribute("noToggle"); link = link.parentNode; } while(title == null && link != null); if(!store.isShadowTiddler(title)) { var f = fields ? fields.decodeHashMap() : {}; fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true)); } if(title) { var toggling = e.metaKey || e.ctrlKey; if(config.options.chkToggleLinks) toggling = !toggling; if(noToggle) toggling = false; if(store.getTiddler(title)) fields = null; story.displayTiddler(target,title,null,true,null,fields,toggling); } clearMessage(); return false; } // Create a button for a tag with a popup listing all the tiddlers that it tags function createTagButton(place,tag,excludeTiddler,title,tooltip) { var btn = createTiddlyButton(place,title||tag,(tooltip||config.views.wikified.tag.tooltip).format([tag]),onClickTag); btn.setAttribute("tag",tag); if(excludeTiddler) btn.setAttribute("tiddler",excludeTiddler); return btn; } // Event handler for clicking on a tiddler tag function onClickTag(ev) { var e = ev || window.event; var popup = Popup.create(this); var tag = this.getAttribute("tag"); var title = this.getAttribute("tiddler"); if(popup && tag) { var tagged = store.getTaggedTiddlers(tag); var titles = []; var li,r; for(r=0;r 0) { var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll); openAll.setAttribute("tag",tag); createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div"); for(r=0; r= this.endTime) { this.stop(); return false; } return true; }; //-- //-- Zoomer animation //-- function Zoomer(text,startElement,targetElement,unused) { var e = createTiddlyElement(document.body,"div",null,"zoomer"); createTiddlyElement(e,"div",null,null,text); var winWidth = findWindowWidth(); var winHeight = findWindowHeight(); var p = [ {style: 'left', start: findPosX(startElement), end: findPosX(targetElement), template: '%0px'}, {style: 'top', start: findPosY(startElement), end: findPosY(targetElement), template: '%0px'}, {style: 'width', start: Math.min(startElement.scrollWidth,winWidth), end: Math.min(targetElement.scrollWidth,winWidth), template: '%0px', atEnd: 'auto'}, {style: 'height', start: Math.min(startElement.scrollHeight,winHeight), end: Math.min(targetElement.scrollHeight,winHeight), template: '%0px', atEnd: 'auto'}, {style: 'fontSize', start: 8, end: 24, template: '%0pt'} ]; var c = function(element,properties) {removeNode(element);}; return new Morpher(e,config.animDuration,p,c); } //-- //-- Scroller animation //-- function Scroller(targetElement) { var p = [{style: '-tw-vertScroll', start: findScrollY(), end: ensureVisible(targetElement)}]; return new Morpher(targetElement,config.animDuration,p); } //-- //-- Slider animation //-- // deleteMode - "none", "all" [delete target element and it's children], [only] "children" [but not the target element] function Slider(element,opening,unused,deleteMode) { element.style.overflow = 'hidden'; if(opening) element.style.height = '0px'; // Resolves a Firefox flashing bug element.style.display = 'block'; var left = findPosX(element); var width = element.scrollWidth; var height = element.scrollHeight; var winWidth = findWindowWidth(); var p = []; var c = null; if(opening) { p.push({style: 'height', start: 0, end: height, template: '%0px', atEnd: 'auto'}); p.push({style: 'opacity', start: 0, end: 1, template: '%0'}); p.push({style: 'filter', start: 0, end: 100, template: 'alpha(opacity:%0)'}); } else { p.push({style: 'height', start: height, end: 0, template: '%0px'}); p.push({style: 'display', atEnd: 'none'}); p.push({style: 'opacity', start: 1, end: 0, template: '%0'}); p.push({style: 'filter', start: 100, end: 0, template: 'alpha(opacity:%0)'}); switch(deleteMode) { case "all": c = function(element,properties) {removeNode(element);}; break; case "children": c = function(element,properties) {removeChildren(element);}; break; } } return new Morpher(element,config.animDuration,p,c); } //-- //-- Popup menu //-- var Popup = { stack: [] // Array of objects with members root: and popup: }; Popup.create = function(root,elem,className) { var stackPosition = this.find(root,"popup"); Popup.remove(stackPosition+1); var popup = createTiddlyElement(document.body,elem || "ol","popup",className || "popup"); popup.stackPosition = stackPosition; Popup.stack.push({root: root, popup: popup}); return popup; }; Popup.onDocumentClick = function(ev) { var e = ev || window.event; if(e.eventPhase == undefined) Popup.remove(); else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET) Popup.remove(); return true; }; Popup.show = function(valign,halign,offset) { var curr = Popup.stack[Popup.stack.length-1]; this.place(curr.root,curr.popup,valign,halign,offset); addClass(curr.root,"highlight"); if(config.options.chkAnimate && anim && typeof Scroller == "function") anim.startAnimating(new Scroller(curr.popup)); else window.scrollTo(0,ensureVisible(curr.popup)); }; Popup.place = function(root,popup,valign,halign,offset) { if(!offset) var offset = {x:0,y:0}; if(popup.stackPosition >= 0 && !valign && !halign) { offset.x = offset.x + root.offsetWidth; } else { offset.x = (halign == 'right') ? offset.x + root.offsetWidth : offset.x; offset.y = (valign == 'top') ? offset.y : offset.y + root.offsetHeight; } var rootLeft = findPosX(root); var rootTop = findPosY(root); var popupLeft = rootLeft + offset.x; var popupTop = rootTop + offset.y; var winWidth = findWindowWidth(); if(popup.offsetWidth > winWidth*0.75) popup.style.width = winWidth*0.75 + "px"; var popupWidth = popup.offsetWidth; var scrollWidth = winWidth - document.body.offsetWidth; if(popupLeft + popupWidth > winWidth - scrollWidth - 1) { if(halign == 'right') popupLeft = popupLeft - root.offsetWidth - popupWidth; else popupLeft = winWidth - popupWidth - scrollWidth - 1; } popup.style.left = popupLeft + "px"; popup.style.top = popupTop + "px"; popup.style.display = "block"; }; Popup.find = function(e) { var pos = -1; for (var t=this.stack.length-1; t>=0; t--) { if(isDescendant(e,this.stack[t].popup)) pos = t; } return pos; }; Popup.remove = function(pos) { if(!pos) var pos = 0; if(Popup.stack.length > pos) { Popup.removeFrom(pos); } }; Popup.removeFrom = function(from) { for(var t=Popup.stack.length-1; t>=from; t--) { var p = Popup.stack[t]; removeClass(p.root,"highlight"); removeNode(p.popup); } Popup.stack = Popup.stack.slice(0,from); }; //-- //-- Wizard support //-- function Wizard(elem) { if(elem) { this.formElem = findRelated(elem,"wizard","className"); this.bodyElem = findRelated(this.formElem.firstChild,"wizardBody","className","nextSibling"); this.footElem = findRelated(this.formElem.firstChild,"wizardFooter","className","nextSibling"); } else { this.formElem = null; this.bodyElem = null; this.footElem = null; } } Wizard.prototype.setValue = function(name,value) { if(this.formElem) this.formElem[name] = value; }; Wizard.prototype.getValue = function(name) { return this.formElem ? this.formElem[name] : null; }; Wizard.prototype.createWizard = function(place,title) { this.formElem = createTiddlyElement(place,"form",null,"wizard"); createTiddlyElement(this.formElem,"h1",null,null,title); this.bodyElem = createTiddlyElement(this.formElem,"div",null,"wizardBody"); this.footElem = createTiddlyElement(this.formElem,"div",null,"wizardFooter"); }; Wizard.prototype.clear = function() { removeChildren(this.bodyElem); }; Wizard.prototype.setButtons = function(buttonInfo,status) { removeChildren(this.footElem); for(var t=0; t max) c = max; return c; }; // Add indexOf function if browser does not support it if(!Array.indexOf) { Array.prototype.indexOf = function(item,from) { if(!from) from = 0; for(var i=from; i "backgroundColor") String.prototype.unDash = function() { var s = this.split("-"); if(s.length > 1) { for(var t=1; t currPos) r.push(this.substring(currPos,match.index)); r.push(substrings[parseInt(match[1])]); currPos = subRegExp.lastIndex; } } while(match); if(currPos < this.length) r.push(this.substring(currPos,this.length)); return r.join(""); }; // Escape any special RegExp characters with that character preceded by a backslash String.prototype.escapeRegExp = function() { var s = "\\^$*+?()=!|,{}[]."; var c = this; for(var t=0; t to ">" and " to """ String.prototype.htmlEncode = function() { return this.replace(/&/mg,"&").replace(//mg,">").replace(/\"/mg,"""); }; // Convert "&" to &, "<" to <, ">" to > and """ to " String.prototype.htmlDecode = function() { return this.replace(/</mg,"<").replace(/>/mg,">").replace(/"/mg,"\"").replace(/&/mg,"&"); }; // Convert a string to it's JSON representation by encoding control characters, double quotes and backslash. See json.org String.prototype.toJSONString = function() { var m = { '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '"' : '\\"', '\\': '\\\\' }; var replaceFn = function(a,b) { var c = m[b]; if(c) return c; c = b.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }; if(/["\\\x00-\x1f]/.test(this)) return '"' + this.replace(/([\x00-\x1f\\"])/g,replaceFn) + '"'; return '"' + this + '"'; }; // Parse a space-separated string of name:value parameters // The result is an array of objects: // result[0] = object with a member for each parameter name, value of that member being an array of values // result[1..n] = one object for each parameter, with 'name' and 'value' members String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults) { var parseToken = function(match,p) { var n; if(match[p]) // Double quoted n = match[p]; else if(match[p+1]) // Single quoted n = match[p+1]; else if(match[p+2]) // Double-square-bracket quoted n = match[p+2]; else if(match[p+3]) // Double-brace quoted try { n = match[p+3]; if(allowEval) n = window.eval(n); } catch(ex) { throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex); } else if(match[p+4]) // Unquoted n = match[p+4]; else if(match[p+5]) // empty quote n = ""; return n; }; var r = [{}]; var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")"; var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')"; var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])"; var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})"; var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)"; var emptyQuote = "((?:\"\")|(?:''))"; var skipSpace = "(?:\\s*)"; var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")"; var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg"); var params = []; do { var match = re.exec(this); if(match) { var n = parseToken(match,1); if(noNames) { r.push({name:"",value:n}); } else { var v = parseToken(match,8); if(v == null && defaultName) { v = n; n = defaultName; } else if(v == null && defaultValue) { v = defaultValue; } r.push({name:n,value:v}); if(cascadeDefaults) { defaultName = n; defaultValue = v; } } } } while(match); // Summarise parameters into first element for(var t=1; t 12 ? h-12 : ( h > 0 ? h : 12 ); }; Date.prototype.getAmPm = function() { return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am; }; Date.prototype.daySuffix = function() { return config.messages.dates.daySuffixes[this.getDate()-1]; }; // Convert a date to local YYYYMMDDHHMM string format Date.prototype.convertToLocalYYYYMMDDHHMM = function() { return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2); }; // Convert a date to UTC YYYYMMDDHHMM string format Date.prototype.convertToYYYYMMDDHHMM = function() { return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2); }; // Convert a date to UTC YYYYMMDD.HHMMSSMMM string format Date.prototype.convertToYYYYMMDDHHMMSSMMM = function() { return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),4); }; // Static method to create a date from a UTC YYYYMMDDHHMM format string Date.convertFromYYYYMMDDHHMM = function(d) { var hh = d.substr(8,2) || "00"; var mm = d.substr(10,2) || "00"; return new Date(Date.UTC(parseInt(d.substr(0,4),10), parseInt(d.substr(4,2),10)-1, parseInt(d.substr(6,2),10), parseInt(hh,10), parseInt(mm,10),0,0)); }; //-- //-- 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=[]; var len=Math.floor(str.length/4); var i, j; for(i=0, j=0; i>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>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>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 function add32(a,b) { var lsw=(a&0xFFFF)+(b&0xFFFF); var msw=(a>>16)+(b>>16)+(lsw>>16); return (msw<<16)|(lsw&0xFFFF); } function AA(a,b,c,d,e) { b=(b>>>27)|(b<<5); 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); } function RR(w,j) { var n=w[j-3]^w[j-8]^w[j-14]^w[j-16]; return (n>>>31)|(n<<1); } var len=blen*8; x[len>>5] |= 0x80 << (24-len%32); x[((len+64>>9)<<4)+15]=len; var w=new 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>>2)|(b<<30); b=a; a=t; j++; } while(j<20) { w[j]=RR(w,j); t=AA(e,a,d^(b&(c^d)),w[j],k1); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++; } while(j<40) { w[j]=RR(w,j); t=AA(e,a,b^c^d,w[j],k2); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++; } while(j<60) { w[j]=RR(w,j); t=AA(e,a,(b&c)|(d&(b|c)),w[j],k3); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++; } while(j<80) { w[j]=RR(w,j); t=AA(e,a,b^c^d,w[j],k4); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++; } h0=add32(h0,a); h1=add32(h1,b); h2=add32(h2,c); h3=add32(h3,d); h4=add32(h4,e); } return [h0,h1,h2,h3,h4]; }; //-- //-- RGB colour object //-- // Construct an RGB colour object from a '#rrggbb', '#rgb' or 'rgb(n,n,n)' string or from separate r,g,b values function RGB(r,g,b) { this.r = 0; this.g = 0; this.b = 0; if(typeof r == "string") { if(r.substr(0,1) == "#") { if(r.length == 7) { this.r = parseInt(r.substr(1,2),16)/255; this.g = parseInt(r.substr(3,2),16)/255; this.b = parseInt(r.substr(5,2),16)/255; } else { this.r = parseInt(r.substr(1,1),16)/15; this.g = parseInt(r.substr(2,1),16)/15; this.b = parseInt(r.substr(3,1),16)/15; } } else { var rgbPattern = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/; var c = r.match(rgbPattern); if(c) { this.r = parseInt(c[1],10)/255; this.g = parseInt(c[2],10)/255; this.b = parseInt(c[3],10)/255; } } } else { this.r = r; this.g = g; this.b = b; } return this; } // Mixes this colour with another in a specified proportion // c = other colour to mix // f = 0..1 where 0 is this colour and 1 is the new colour // Returns an RGB object RGB.prototype.mix = function(c,f) { return new RGB(this.r + (c.r-this.r) * f,this.g + (c.g-this.g) * f,this.b + (c.b-this.b) * f); }; // Return an rgb colour as a #rrggbb format hex string RGB.prototype.toString = function() { return "#" + ("0" + Math.floor(this.r.clamp(0,1) * 255).toString(16)).right(2) + ("0" + Math.floor(this.g.clamp(0,1) * 255).toString(16)).right(2) + ("0" + Math.floor(this.b.clamp(0,1) * 255).toString(16)).right(2); }; //-- //-- DOM utilities - many derived from www.quirksmode.org //-- function drawGradient(place,horiz,locolors,hicolors) { if(!hicolors) hicolors = locolors; for(var t=0; t<= 100; t+=2) { var bar = document.createElement("div"); place.appendChild(bar); bar.style.position = "absolute"; bar.style.left = horiz ? t + "%" : 0; bar.style.top = horiz ? 0 : t + "%"; bar.style.width = horiz ? (101-t) + "%" : "100%"; bar.style.height = horiz ? "100%" : (101-t) + "%"; bar.style.zIndex = -1; var p = t/100*(locolors.length-1); bar.style.backgroundColor = hicolors[Math.floor(p)].mix(locolors[Math.ceil(p)],p-Math.floor(p)).toString(); } } function createTiddlyText(parent,text) { return parent.appendChild(document.createTextNode(text)); } function createTiddlyCheckbox(parent,caption,checked,onChange) { var cb = document.createElement("input"); cb.setAttribute("type","checkbox"); cb.onclick = onChange; parent.appendChild(cb); cb.checked = checked; cb.className = "chkOptionInput"; if(caption) wikify(caption,parent); return cb; } function createTiddlyElement(parent,element,id,className,text,attribs) { var e = document.createElement(element); if(className != null) e.className = className; if(id != null) e.setAttribute("id",id); if(text != null) e.appendChild(document.createTextNode(text)); if(attribs) { for(var n in attribs) { e.setAttribute(n,attribs[n]); } } if(parent != null) parent.appendChild(e); return e; } function addEvent(obj,type,fn) { if(obj.attachEvent) { obj['e'+type+fn] = fn; obj[type+fn] = function(){obj['e'+type+fn](window.event);}; obj.attachEvent('on'+type,obj[type+fn]); } else { obj.addEventListener(type,fn,false); } } function removeEvent(obj,type,fn) { if(obj.detachEvent) { obj.detachEvent('on'+type,obj[type+fn]); obj[type+fn] = null; } else { obj.removeEventListener(type,fn,false); } } function addClass(e,className) { var currClass = e.className.split(" "); if(currClass.indexOf(className) == -1) e.className += " " + className; } function removeClass(e,className) { var currClass = e.className.split(" "); var i = currClass.indexOf(className); while(i != -1) { currClass.splice(i,1); i = currClass.indexOf(className); } e.className = currClass.join(" "); } function hasClass(e,className) { if(e.className && e.className.split(" ").indexOf(className) != -1) { return true; } return false; } // Find the closest relative with a given property value (property defaults to tagName, relative defaults to parentNode) function findRelated(e,value,name,relative) { name = name || "tagName"; relative = relative || "parentNode"; if(name == "className") { while(e && !hasClass(e,value)) { e = e[relative]; } } else { while(e && e[name] != value) { e = e[relative]; } } return e; } // Resolve the target object of an event function resolveTarget(e) { var obj; if(e.target) obj = e.target; else if(e.srcElement) obj = e.srcElement; if(obj.nodeType == 3) // defeat Safari bug obj = obj.parentNode; return obj; } // Prevent an event from bubbling function stopEvent(e) { var ev = e || window.event; ev.cancelBubble = true; if(ev.stopPropagation) ev.stopPropagation(); return false; } // Return the content of an element as plain text with no formatting function getPlainText(e) { var text = ""; if(e.innerText) text = e.innerText; else if(e.textContent) text = e.textContent; return text; } // Get the scroll position for window.scrollTo necessary to scroll a given element into view function ensureVisible(e) { var posTop = findPosY(e); var posBot = posTop + e.offsetHeight; var winTop = findScrollY(); var winHeight = findWindowHeight(); var winBot = winTop + winHeight; if(posTop < winTop) { return posTop; } else if(posBot > winBot) { if(e.offsetHeight < winHeight) return posTop - (winHeight - e.offsetHeight); else return posTop; } else { return winTop; } } // Get the current width of the display window function findWindowWidth() { return window.innerWidth || document.documentElement.clientWidth; } // Get the current height of the display window function findWindowHeight() { return window.innerHeight || document.documentElement.clientHeight; } // Get the current horizontal page scroll position function findScrollX() { return window.scrollX || document.documentElement.scrollLeft; } // Get the current vertical page scroll position function findScrollY() { return window.scrollY || document.documentElement.scrollTop; } function findPosX(obj) { var curleft = 0; while(obj.offsetParent) { curleft += obj.offsetLeft; obj = obj.offsetParent; } return curleft; } function findPosY(obj) { var curtop = 0; while(obj.offsetParent) { curtop += obj.offsetTop; obj = obj.offsetParent; } return curtop; } // Blur a particular element function blurElement(e) { if(e && e.focus && e.blur) { e.focus(); e.blur(); } } // Create a non-breaking space function insertSpacer(place) { var e = document.createTextNode(String.fromCharCode(160)); if(place) place.appendChild(e); return e; } // Remove all children of a node function removeChildren(e) { while(e && e.hasChildNodes()) removeNode(e.firstChild); } // Remove a node and all it's children function removeNode(e) { scrubNode(e); e.parentNode.removeChild(e); } // Remove any event handlers or non-primitve custom attributes function scrubNode(e) { if(!config.browser.isIE) return; var att = e.attributes; if(att) { for(var t=0; t" + s + ""); } else { if(n) { n.replaceChild(doc.createTextNode(s),n.firstChild); } else { n = doc.createElement("style"); n.type = "text/css"; n.id = id; n.appendChild(doc.createTextNode(s)); doc.getElementsByTagName("head")[0].appendChild(n); } } } function removeStyleSheet(id) { var e = document.getElementById(id); if(e) e.parentNode.removeChild(e); } // Force the browser to do a document reflow when needed to workaround browser bugs function forceReflow() { if(config.browser.isGecko) { setStylesheet("body {top:0px;margin-top:0px;}","forceReflow"); setTimeout(function() {setStylesheet("","forceReflow");},1); } } // Replace the current selection of a textarea or text input and scroll it into view function replaceSelection(e,text) { if(e.setSelectionRange) { var oldpos = e.selectionStart; var isRange = e.selectionEnd > e.selectionStart; e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd); e.setSelectionRange(isRange ? oldpos : oldpos + text.length,oldpos + text.length); var linecount = e.value.split('\n').length; var thisline = e.value.substr(0,e.selectionStart).split('\n').length-1; e.scrollTop = Math.floor((thisline - e.rows / 2) * e.scrollHeight / linecount); } else if(document.selection) { var range = document.selection.createRange(); if(range.parentElement() == e) { var isCollapsed = range.text == ""; range.text = text; if(!isCollapsed) { range.moveStart('character', -text.length); range.select(); } } } } // Returns the text of the given (text) node, possibly merging subsequent text nodes function getNodeText(e) { var t = ""; while(e && e.nodeName == "#text") { t += e.nodeValue; e = e.nextSibling; } return t; } // Returns true if the element e has a given ancestor element function isDescendant(e,ancestor) { while(e) { if(e === ancestor) return true; e = e.parentNode; } return false; } //-- //-- LoaderBase and SaverBase //-- function LoaderBase() {} LoaderBase.prototype.loadTiddler = function(store,node,tiddlers) { var title = this.getTitle(store,node); if(safeMode && store.isShadowTiddler(title)) return; if(title) { var tiddler = store.createTiddler(title); this.internalizeTiddler(store,tiddler,title,node); tiddlers.push(tiddler); } }; LoaderBase.prototype.loadTiddlers = function(store,nodes) { var tiddlers = []; for(var t = 0; t < nodes.length; t++) { try { this.loadTiddler(store,nodes[t],tiddlers); } catch(ex) { showException(ex,config.messages.tiddlerLoadError.format([this.getTitle(store,nodes[t])])); } } return tiddlers; }; function SaverBase() {} SaverBase.prototype.externalize = function(store) { var results = []; var tiddlers = store.getTiddlers("title"); for(var t = 0; t < tiddlers.length; t++) { if(!tiddlers[t].doNotSave()) results.push(this.externalizeTiddler(store, tiddlers[t])); } return results.join("\n"); }; //-- //-- TW21Loader (inherits from LoaderBase) //-- function TW21Loader() {} TW21Loader.prototype = new LoaderBase(); TW21Loader.prototype.getTitle = function(store,node) { var title = null; if(node.getAttribute) { title = node.getAttribute("title"); if(!title) title = node.getAttribute("tiddler"); } if(!title && node.id) { var lenPrefix = store.idPrefix.length; if(node.id.substr(0,lenPrefix) == store.idPrefix) title = node.id.substr(lenPrefix); } return title; }; TW21Loader.prototype.internalizeTiddler = function(store,tiddler,title,node) { var e = node.firstChild; var text = null; if(node.getAttribute("tiddler")) { text = getNodeText(e).unescapeLineBreaks(); } else { while(e.nodeName!="PRE" && e.nodeName!="pre") { e = e.nextSibling; } text = e.innerHTML.replace(/\r/mg,"").htmlDecode(); } var modifier = node.getAttribute("modifier"); var c = node.getAttribute("created"); var m = node.getAttribute("modified"); var created = c ? Date.convertFromYYYYMMDDHHMM(c) : version.date; var modified = m ? Date.convertFromYYYYMMDDHHMM(m) : created; var tags = node.getAttribute("tags"); var fields = {}; var attrs = node.attributes; for(var i = attrs.length-1; i >= 0; i--) { var name = attrs[i].name; if(attrs[i].specified && !TiddlyWiki.isStandardField(name)) { fields[name] = attrs[i].value.unescapeLineBreaks(); } } tiddler.assign(title,text,modifier,modified,tags,created,fields); return tiddler; }; //-- //-- TW21Saver (inherits from SaverBase) //-- function TW21Saver() {} TW21Saver.prototype = new SaverBase(); TW21Saver.prototype.externalizeTiddler = function(store,tiddler) { try { var extendedAttributes = ""; var usePre = config.options.chkUsePreForStorage; store.forEachField(tiddler, function(tiddler,fieldName,value) { // don't store stuff from the temp namespace if(typeof value != "string") value = ""; if(!fieldName.match(/^temp\./)) extendedAttributes += ' %0="%1"'.format([fieldName,value.escapeLineBreaks().htmlEncode()]); },true); var created = tiddler.created; var modified = tiddler.modified; var attributes = tiddler.modifier ? ' modifier="' + tiddler.modifier.htmlEncode() + '"' : ""; attributes += (usePre && created == version.date) ? "" :' created="' + created.convertToYYYYMMDDHHMM() + '"'; attributes += (usePre && modified == created) ? "" : ' modified="' + modified.convertToYYYYMMDDHHMM() +'"'; var tags = tiddler.getTags(); if(!usePre || tags) attributes += ' tags="' + tags.htmlEncode() + '"'; return ('
%4').format([ usePre ? "title" : "tiddler", tiddler.title.htmlEncode(), attributes, extendedAttributes, usePre ? "\n
" + tiddler.text.htmlEncode() + "
\n" : tiddler.text.escapeLineBreaks().htmlEncode() ]); } catch (ex) { throw exceptionText(ex,config.messages.tiddlerSaveError.format([tiddler.title])); } }; //]]>

Copyright © 2009, Gregory D. Smith


image of troops support

Hosted by www.Geocities.ws

Hosted by www.Geocities.ws

1