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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
I am an assistant professor at the [[Faculty of Informatics and Information Technologies|http://www.fiit.stuba.sk]], [[Slovak University of Technology|http://www.stuba.sk]] in Bratislava.
!!!Contacts
In preferred order:
*''Mail:'' peter [dot] kapec [at] stuba [dot] sk
*''Office:'' 4.30
*''Phone - office:'' +421 (2) 21 022 430 (~VoIP SIP)
*''ICQ / XMPP:'' is available in [[AIS|https://is.stuba.sk/?lang=sk]] (only for supervised students, OTR plugin required!!!)
!!!Address
Slovak University of Technology
Faculty of Informatics and Information Technologies
Institute of Applied Informatics
Ilkovicova 2
842 16 Bratislava 4
Slovak Republic
!!!Consultations
Wednesday, 13:00-14:00 in 4.30 (supervised students have individual consultation hours)
<<tiddler HideTiddlerSubtitle>>
/***
|Name|AdvancedOptionsPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#AdvancedOptionsPlugin" title="Linkification: http://www.TiddlyTools.com/#AdvancedOptionsPlugin">http://www.TiddlyTools.com/#AdvancedOptionsPlugin</a>|
|Version|1.2.0|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler|
!!!!!Usage
<<<
At document startup, this plugin examines each tiddler tagged with <<tag systemConfig>> and looks for a tiddler slice named "Options" whose value refers to a tiddler section (or separate tiddler) that contains an 'advanced options control panel' for configuring that plugin's features and behavior.  For each plugin that contains an "Options" slice, a tabbed entry is automatically created in the [[AdvancedOptions]] shadow tiddler to display that plugin's control panel.

As an optional fallback for backward-compatibility with plugin tiddlers that do not define the "Options" slice, this plugin will also look for a section heading named "Configuration" within those tiddlers, so that older plugins that define this section can automatically have their settings added to the [[AdvancedOptions]] tiddler without requiring the "Options" slice to be added.

This plugin also extends the standard {{{<<option>>}}} macro syntax so you can directly set the internal value of a boolean or text option, without displaying a corresponding checkbox or input field control simply by appending {{{=value}}} syntax to the end of the option ID parameter:
{{{
<<option "txtSomeOption=some text">>
<<option chkSomeOtherOption=true>> OR <<option chkSomeOtherOption=false>>
}}}
Example: {{{<<option chkAnimate=false>>}}}
<<<
!!!!!Configuration
<<<
<<option chkAdvancedOptions>> automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler
<<option chkAdvancedOptionsBackstage>> automatically add plugin-defined options to Backstage menu
<<option chkAdvancedOptionsFallback>> use <<option txtAdvancedOptionsFallback>> section as a fallback for plugins that don't define an ~AdvancedOptions slice
//note: these settings only take effect after reloading the document//
<<<
!!!!!Revisions
<<<
2009.07.23 [1.2.0] added support for enhanced {{{<<option id=value>>}}} 'direct assignment' syntax
2008.05.09 [1.1.0] add "options" panel to backstage
2008.04.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.AdvancedOptionsPlugin= {major: 1, minor: 2, revision: 0, date: new Date(2009,7,23)};

if (config.options.chkAdvancedOptions===undefined)
	config.options.chkAdvancedOptions=true;
if (config.options.chkAdvancedOptionsBackstage===undefined)
	config.options.chkAdvancedOptionsBackstage=true;
if (config.options.chkAdvancedOptionsFallback===undefined)
	config.options.chkAdvancedOptionsFallback=true;
if (config.options.txtAdvancedOptionsFallback===undefined)
	config.options.txtAdvancedOptionsFallback="Configuration";
if (config.optionsDesc) config.optionsDesc.chkAdvancedOptions=
	"automatically add plugin-defined options to [[AdvancedOptions]]";
//}}}
//{{{
var items=[];
var fmt="[[%0 ]] [[view options for %0]] [[%1]]\n";
var section=config.options.txtAdvancedOptionsFallback;
var plugins=store.getTaggedTiddlers("systemConfig");
for (var p=0; p<plugins.length; p++) {
	var tid=plugins[p].title;
	var settings=store.getTiddlerSlice(tid,"Options");
	if (!settings && config.options.chkAdvancedOptionsFallback && store.getTiddlerText(tid+"##"+section))
		settings="##"+section; // fallback handling for older plugins
	if (settings&&settings.length) {
		if (settings.substr(0,2)=="##") settings=tid+settings;
		items.push(fmt.format([tid,settings]));
	}
}
if (items.length) config.shadowTiddlers.PluginOptions=
	"!![[Plugin-defined options|PluginManager]]\n>@@text-align:left;<<tabs '' \n"+items.join(' ')+">>@@";
if (config.options.chkAdvancedOptions)
	config.shadowTiddlers.AdvancedOptions+="{{smallform{{{wrap{<<tiddler PluginOptions>>}}}}}}";
//}}}
//{{{
// // add "options" backstage task
if (config.tasks && config.options.chkAdvancedOptionsBackstage) { // for TW2.2b3 or above
	config.tasks.options = {
		text: "options",
		tooltip: "manage plugin-defined option settings",
		content: "{{smallform{{{groupbox{{{wrap{<<tiddler PluginOptions>>}}}}}}\n{{groupbox small {<<options>>}}}}}}"
	}
	config.backstageTasks.splice(config.backstageTasks.indexOf("plugins")+1,0,"options");
}
//}}}
//{{{
config.macros.option.AOPsave_handler=config.macros.option.handler;
config.macros.option.handler=function(place,macroName,params,wikifier,paramString,tiddler) {
	var parts=params[0].split('=');
	if (parts.length==1) return this.AOPsave_handler.apply(this,arguments);
	var id=parts[0]; var val=(id.substr(0,3)=='txt')?parts[1]:(parts[1]=='true');
	config.options[id]=val;
}
//}}}
!!! What to do in the 1st semester
* search for related materials
* store and organize found materials
* prepare documentation template
* discuss possible approaches and solutions
* write down:
** analysis of current state-of-the-art
** specification
** design
* get familiar with technologies that will be used
!!! What to do in the 2nd semester
* implement proposed solution
* experiment with the product
* write down:
** details about proposed method/approach
** design details
** evaluation
[[Back to Resources & Hints|Resources & Hints]]
Bachelor projects I supervised. Each contains abstract and results.
!!!2016
*[[Viktor Košťan - Data visualisation in Augmented Reality]]
!!!2015
*[[Juraj Marák - Interactive manipulation with graphs in augmented reality]]
*[[Jakub Hagara - Support tools for software visualization]]
*[[Róbert Karásek - Generating documentation from source code]]
!!!2014
*[[Marek Duranský - Interactive graph visualization in 3D space]]
*[[Peter Mendel - Generating documentation from source code]]
*[[Veronika Prochotská - A system to support software visualization]]
*[[Marek Šulek - A system to support software visualization]]
*[[Martin Volovár - Interactive graph visualization in 3D space]]
!!!2013
*[[Gabriela Brndiarová - Combination of deterministic and force-based graph layout algorithms]]
*[[Michal Juranyi - Generating documentation from source code]]
*[[Péter Kósa - Generating documentation from source code]]
*[[Patrik Oriskó - Generating documentation from source code]]
!!!2012
*[[Peter Sivák - Interactive graph visualization in 3D]]
*[[Daniel Šiško - Implementation of graph layout algorithms on GPU]]
!!!2011
*[[Ivan Šimko - Generating documentation from source code]]
*[[Viliam Kubis - Generating documentation from source code]]
!!!2010
*[[Peter Borga - Automatic documentation and metrics generation from source code]]
*[[Matúš Čerman - Graphic user interface in a 3D environment]]
*[[Gabriel Duchoň - Generating documentation from source code]]
*[[Peter Kajan - Library for graph visualization in 3D space]]
*[[Miroslav Mikuláš - Graphical user interfaces in 3D environment]]
!!!2009
*[[Eduard Kuric - Interactive browsing of multimedia content in 3D space]]
*[[Peter Mindek - Interactive browsing of multimedia content in 3D space]]
*[[Jakub Ukrop - Constraints in Force-directed Graph Visualization]]
!!!2008
*[[Martin Jakubéci - Interactive manipulation with 3D graphs]]
*[[Ján Katona - Visualizing hypergraph representation of software]]
*[[Michal Kottman - The use of Qt framework in simple scripting languages]]
*[[Martin Ľudvík - Interaktivna manipulacia s 3D grafmi]]
*[[Martin Sirota - Automatic documentation and metrics generation from source codes]]
*[[Stano Turza - Automatic documentation and metrics generation from source codes]]
*[[Ľuboš Ukrop - New approaches in graph visualization]]
!!!2007
*[[Milan Ilavský - Visualisation of graphs based on spring model]]
*[[Martin Macko - Finding the Best Viewpoint in Three-Dimensional Scene]]
@@color:#F00;[active]@@
Course supervisor:	Ing. Peter Kapec, ~PhD.
Supervising department:	Institute of Applied Informatics (UAI FIIT)
Time allowance (lecture/seminar):	3/2
Run in the period of : WS 2015/2016
!!! Main information
Prerequisites for registration:	none
Taught for the form of: full-time, attendance method
Type of study: usual
Form of teaching: lecture, laboratory/construction practice
Mode of completion and credits: Exam (6 credits)
!!!Course objective
The goal of this course is to gain practical skills and knowledge about the methods for creating multimedia content and to practically demonstrate this knowledge in the realization of a simpler semester project in the form of a multimedia presentation, which will contain the processing of 2D image and graphics, sound/video processing and 3D graphics.
!!!Regular assessment
*Test: 10b
*Project: 40b
*Requirements for the project will be specified in AIS document server
!!!Final assessment
"pass" mark for labs:
#elaboration of the project and submitted at least in the last week of the semester
#Obtaining ''at least 25b'' from test and project
!!!Conditions for completing the course
#fulfill conditions for passing labs
#obtaining ''at least 56b'' of the total score
!!!Course completion
*final exam
!!!Concise plan
#History of multimedia and hypermedia and their applications
#Representation of multimedia and their authoring
#Structured text, markup language, meta-information in documents, text encoding (ASCII, Unicode), hypertext, ~HTML5, SMIL, XML, SGML, scientific documents (~TeX)
#Vector image vs. raster image, basic work with layers, color and filters, enhancing image quality
#Video - basics of image acquisition, data formats for image and video, compression, basics of video and image encoding, ~MPEG-1 and ~MPEG-2, ~MPEG-4 and ~MPEG-7
#Sound and music -- The physical nature of sound, encoding and compression of sampled sound, audio formats and codecs
#Interactive 3D models and 2D panorama. Virtual reality and multimedia
#3D polygonal modeling, texture, ~Web3D, VRML, ~X3D, ~WebGL
#The composition of multimedia programs
!!!Key words
multimedia, hypermedia, hypertext
!!!Basic reading list:	
*LI, Z. -- DREW, M S. Fundamentals of Multimedia. Upper Saddle River: Pearson Prentice Hall, 2004. 560 s. ISBN 0-13-061872-1.
!!!Recommended reading list
*VAUGHAN, T. Multimedia: Making it Work. New York: ~McGraw-Hill Osborne Media, 2010. 478 s. ISBN 978-0-07-174850-6.
*DAVID, M. ~HTML5: Designing Rich Internet Applications. Burlington, USA: Focal Press, 2010. 299 s. ISBN 978-0-240-81328-8. 
!!!Teaching language
Slovak
<<tiddler HideTiddlerSubtitle>>
!!!Abstract
{{justify{Analysis of visualized data is a difficult task and it requires great concentration. It often happens that the user is interrupted at work by random noise and he/she forgets where he/she stopped working. A possible solution to this problem is in the creation of an application, that would provide the user with the possibility to record his work in form of a recording and then to replay this recording. Particularly interesting would be to provide the possibility to branch the recording created in this manner. The goal of this work is to analyze and design such functionality. Besides it presents the realization of this functionality through the implementation of the module into an existing application. An interesting aspect of this work is also playing more branches of record simultaneously in several screens. It also analyzes different visualization techniques of data changing in time and their distribution. In brief, it also analyzes existing methods of animation, which are also connected to this problematic.}}}
!!!Results
{{center{[img[./img/master/2011/pazitnaj/time-forks.png]]
{{center{Graph visualization system - bottom shows 4 time forks}}}}}}
{{center{[img[./img/master/2011/pazitnaj/3windows.png]]
{{center{Showing the view from 3 cameras from the 3 time forks}}}}}}
{{center{[img[./img/master/2011/pazitnaj/4windows.png]]
{{center{Showing the view from 4 cameras from the 4 time forks at various times}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Day after day we are interacting with various forms of data. Data are often in a relation to each other and the best way to visualize this relation is to use graphs. Data represented by graphs are easier to comprehend and it is much easier to find certain connections between two pieces of data. Although in graph visualization there is a known problem called visual clutter. A graph visualization containing more than a few hundred nodes and edges, results in incomprehensible representation. It is nearly impossible to find relevant data in such crowded graph. In diploma thesis we are trying to solve mentioned problems. At first we explore various methods of graph layouting and clustering which contribute to overall graph legibility. The result of thesis is a clustering method that wraps clusters of nodes in simple spatial figures. This method reduces visual clutter while maintaining ability to access all clustered nodes. We also focus on improving a graph interaction, so user can find relevant data in extensive graph more easily.
}}}
!!!Results
{{center{[img(25cm, )[./img/master/2014/britvik/1.png]]
{{center{Graph visualization without and with cluster visualization.}}}}}}
{{center{[img(25cm, )[./img/master/2014/britvik/2.png]]
{{center{Sequence showing the process of cluster creation.}}}}}}
{{center{[img(25cm, )[./img/master/2014/britvik/3.png]]
{{center{Moving the box cluster - cluster behaves as a restrictor.}}}}}}
{{center{[img(25cm, )[./img/master/2014/britvik/4.png]]
{{center{Box cluster/restrictor collapsed in to plane.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Within this diploma thesis we present design of animated visualization of dynamics of object – oriented program in 3D space. The proposed visualization shows not only the current state of the program, but also the temporal context of current state. Among other things, visualizes the sequence of creating objects and parallel processing of program. We present architecture of visualization system, which includes a component to monitor monitored program. Architecture allows visualizing the collected data in real time (the user can step - by - step of monitored program). We design an algorithm of layout of objects in the scene. The highlight of this thesis is to implementation of designed system - program system ~SoftDynamik.
}}}
!!!Results
{{center{[img(15cm, )[./img/master/2013/grznar/1.png]]
{{center{Program runtime visualization - main program with five objects.}}}}}}
{{center{[img(15cm, )[./img/master/2013/grznar/2.png]]
{{center{Visualization of main program spawning several threads.}}}}}}
{{center{[img(15cm, )[./img/master/2013/grznar/3.png]]
{{center{Visualization of the recursive execution of a method.}}}}}}
{{center{[img(15cm, )[./img/master/2013/grznar/4.png]]
{{center{Visualizing the observer pattern - registration.}}}}}}
{{center{[img(15cm, )[./img/master/2013/grznar/5.png]]
{{center{Visualizing the observer pattern - notification.}}}}}}
{{center{[img(20cm, )[./img/master/2013/grznar/6.png]]
{{center{The visualization system visualizing itself during execution.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{The main task of visual data mining in software is to speed up the process of obtaining information from software projects. The more complex the software project is, the more time is needed for new engineers to fully understand its structure, so they can start to implement additional features. That is why there is a demand for tools which could help programmers and software engineers understand these new projects in shortest possible time, so they could start to work on it effectively.

In this work we analyzed existing approaches for software visualization and visual data mining. A new way of software visualization is proposed, which enables interactive data mining from software projects. Visualization works with software systems developed in C# programming language. Proposed tool creates a model which is then used for interactive visual data mining. This model is represented by graph structures visualized in 3D space. Visualization is interactively driven by user requirements. The result of this thesis is a tool developed for software engineers, designated for visual and interactive data mining in software projects.}}}
!!!Results
{{center{[img(22cm, )[./img/master/2009/komorovsky/csm3d-07r.png]]}}}
{{center{A visualization of an existing software system implemented in C#}}}
{{center{[img[./img/master/2009/komorovsky/csm3d-08.png]]}}}
{{center{Showing only classes sorted by number of methods}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Software visualization is a tool helping developers to better understand and analyze the software. Especially when used in large software systems, analysis of the system with use of visualization helps to understand the structure and functionality of the system faster, compared to understanding the system with only examining documentation and source code. The use of third dimension in visualization gives us possibilities of displaying more information, but brings also various problems. Another tool that helps the developers in analyzing software are software metrics. These help to examine various attributes of the software and identify eg. important parts of the system or parts suitable for improvement. By use of metrics, we can examine software from different viewpoints, either as a developer or as a customer. In this paper, we analyzed possibilities, how to join software visualization with software metrics. This way, we tried to visualize attributes of system that are not clearly visible.
}}}
!!!Results
{{center{[img(20cm, )[./img/master/2014/nagy/luadist.png]]
{{center{Full call graph visualization of an existing software system.}}}}}}
{{center{[img(20cm, )[./img/master/2014/nagy/luadist_func_all.png]]
{{center{In the middle are 2 highly interconnected nodes - system functions.}}}}}}
{{center{[img(20cm, )[./img/master/2014/nagy/luadist_func_local.png]]
{{center{Filtered call graph visualization - showing 2 red large/complex nodes.}}}}}}
{{center{[img(20cm, )[./img/master/2014/nagy/luadist_func_filter.png]]
{{center{Detailed view of interconnections from one of the large nodes.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Visual clutter is common problem for visualization of big data sets. Presented thesis deals with node graph readability. It describes existing and presents new solutions for elimination the visual clutter. There are published works with solutions like modification of graph view or proper selection of data to visualize. In our work, we deal primarily with modification of graph view using force-directed edge bundling algorithm. The algorithm is able to improve readibility in graphs with big amount of edges. We applied the edge bundling to graphs in 3D space, instead of common published solution for graphs in 2D space.}}}
{{center{[img(20cm, )[./img/master/2015/Brndiarova/results_EB_30_80.png]]
{{center{Graph visualization using force-based edge bundling algorithm - before and after edge bundling.}}}}}}
{{center{[img(20cm, )[./img/master/2015/Brndiarova/results_EB_50_300.png]]
{{center{Graph visualization using force-based edge bundling algorithm - views from various angles.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{
Data visualization is nowadays actual topic due to large amount of data that surrounds us. It offers the opportunity to better understand data and relations between them. For large software solutions are these benefits crucial for more effective work. By using augmented reality, it is possible to put virtual objects which extend human perception to the surrounding environment. This paper is devoted to introduction of photorealistic data visualization in augmented reality. It discussed human perception, creation of visualization through visualization process and describes the most common methods of data interaction. It also focuses on the software visualization which is potential application area. The paper also describes augmented reality. It offers review of technologies and methods that are used in this field. The paper analyzes the projects dealing with photorealistic illumination and shadows in scenes of augmented reality. At the end of the analytic part the paper describes projects similar to our cause. Main goal of practical part of the paper is to create prototype of photorealistic visualization in augmented reality with the possibility of intuitive interaction.
	}}}
{{center{[img(20cm, )[./img/master/2016/Jurik/graphs.jpg]]
{{center{Different graphs placed above the marker.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Jurik/minimaxi.jpg]]
{{center{Scaling the visualized graph.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Jurik/shadowed.jpg]]
{{center{(left) no light source, no shadows (right) with light source and shadows.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Jurik/setup.jpg]]
{{center{The setup and used hardware.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Jurik/result3.jpg]]
{{center{Visualizing software structure - call graph relations.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Jurik/result4.png]]
{{center{Visualizing software structure - call graph relations.}}}}}}

{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Development of information technology comes along with huge amount of data generated by various software or other tools. These data may have different nature - results of questionnaire surveys, results of measurements of various sensors or even complex geographic or meteorological data. Thus exploring and analyzing such data is very difficult because of their quantity. Therefore there is a need of adequate visualization. Displaying data in text form is unsuitable, because only small part of the data is shown and relationships between data are ignored. Planar or spatial information visualization and visual data mining can help to solve this problem, especially when the process of discovery of information involves a group of collaborating people. This paper describes virtual environment for data visualization which supports such collaboration.
}}}
!!!Results
{{center{[img(20cm, )[./img/master/2012/plesko/screenshot3.png]]
{{center{Two clients displaying a graph from different viewpoints.}}}}}}
{{center{[img(20cm, )[./img/master/2012/plesko/screenshot1.png]]
{{center{A server and the user John observing a graph.}}}}}}
{{center{[img(20cm, )[./img/master/2012/plesko/screenshot2.png]]
{{center{A server and the user John observing a graph - another situation.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Program execution consists of many abstract processes. In order to understand the whole program, one has to understand these processes first. A good imagination is required. Here visualization takes its part. This work discusses visualization of program execution in 3D environment, which should help to understand algorithms contained in programs.The work describes monitoring of program execution as a sequence of events – method execution, setting a field, a class instance construction etc. Extraction of relevant information for visualization is described. Then the work deals with visualization of these events. It looks for a way, how to visualize program elements (class, instance, method, field) and relations between them (class and its instances, fields and methods) effectively. The work deals with visualization of program execution as a control flow and data flow animation.}}}
!!!Results
{{center{[img(20cm, )[img/master/2010/ruttkay-nedecky/2010_ruttkay-nedecky_dp.jpg]]}}}
{{center{Animation in created system.}}}
{{center{[img(20cm, )[img/master/2010/ruttkay-nedecky/2010_ruttkay-nedecky_dp_2.jpg]]}}}
{{center{Entities closer to the camera have their full description. Others have only their name.}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{This document deals with software metrics and interactive presentation of their various outputs. The work describes the area of software metrics and their usage, categorization, calculation and current state in software industry. The next part of this work describes different available techniques for various data visualization and dynamic interaction with software metrics in mind. Examined is the current state of support tools for software metrics visualization. The analysis also includes description of some currently existing tools for software metrics visualization. This work also describes a created application prototype that tries to address some analyzed problems in this area by improving interactive presentation of software metrics and integrating them with innovative IDE for writing and exploring source code.	
}}}
!!!Results
{{center{[img(20cm, )[./img/master/2013/simko/1.jpg]]
{{center{A window with source code (left), variable metrics for this source code (right).}}}}}}
{{center{[img(20cm, )[./img/master/2013/simko/2.jpg]]
{{center{We can highlight the variables that are used in a software metric.}}}}}}
{{center{[img(20cm, )[./img/master/2013/simko/3.jpg]]
{{center{We can highlight variables in other windows.}}}}}}
{{center{[img(20cm, )[./img/master/2013/simko/4.jpg]]
{{center{We can open various source code parts and show various software metrics.}}}}}}
{{center{[img(20cm, )[./img/master/2013/simko/5.jpg]]
{{center{Simple software metrics.}}}}}}
{{center{[img(20cm, )[./img/master/2013/simko/6.jpg]]
{{center{Graphical software metrics visualizations and call graph.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Graphs are widely used for exploration of complex data structures and a number of graph drawing techniques have been created. However, most of them are designed to display graph topologies only, not dealing with the presentation of nodes’ own information. This thesis examines the possibilities of displaying various visual information such as images, texts or even 3D models within graph nodes. The aim is to create an interactive 3D visualization system providing integrated structure and content viewing capabilities. Main problems concerning drawing and navigation of this kind of graphs are addressed, using particularly focus+context methods and modifications of force-directed model.}}}
!!!Results
{{center{[img(20cm, )[./img/master/2011/jukrop/overlap.png]]
{{center{Left) overlapping nodes Right) repulsive forces solve the overlapping problem}}}}}}
{{center{[img(20cm, )[./img/master/2011/jukrop/k3.png]]
{{center{Several visual nodes (containing letters) visually clustered}}}}}}
{{center{[img(20cm, )[./img/master/2011/jukrop/veolia.png]]
{{center{A large graph of web-page interconnections with visual nodes showing actual web-pages }}}}}}

{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{This work deals with show data in non-linear space and describes basic fundamentals for creating non-linear space based on distortion. This distortion is caused by specific mathematical functions. There are presented basic properties and types of non-linear transformations. The fundamental property of non-linear space is ability to show selected subset of data in high details but remaining data are still shown. This work orients especially on three-dimensional non-linear space, hence there are introduced methods for improving visibility of data in selected areas of space. Because when we show a large number of data, then can occur problem with occlusions. Implemented application displays graphs in non-linear space, deformed by user selected mathematical functions.}}}
!!!Results
Not available...
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Everywhere around us there are many information. We can organize this data with visualization and discover the relations between them. For all types of data exists a suitable visualization. The diploma thesis is an overview of visualization techniques. The main topic of the thesis is software visualization, especially visualization of software evolution. The main benefit is developed the application of visualization software evolution in 3D space. Development and application results are described in the second half of the paper.
}}}
!!!Results
{{center{[img(20cm, )[./img/master/2012/bakova/1.png]]
{{center{Program structure visualization before the commit.}}}}}}
{{center{[img(20cm, )[./img/master/2012/bakova/2.png]]
{{center{Visualization of the commit.}}}}}}
{{center{[img(20cm, )[./img/master/2012/bakova/3.png]]
{{center{The layout algorithm moving graph parts.}}}}}}
{{center{[img(20cm, )[./img/master/2012/bakova/4.png]]
{{center{Program structure visualization after the commit.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{The basis of every visualization is data, which can have different forms. Interesting are more complicated structures like common graphs, their generalization in form of hypergraphs and multidimensional data. Hypergraphs have big possibilities, but are not used very often. They could be used for representation of complicated relations, for example ontologies using topic maps. Important aspects of visualization are interaction and clustering of large data. Data visualization can use different metaphors. This approach should make the data more familiar to user by visualization using known images. This diploma thesis brings a new approach to 3D visualization of hypergraphs and multidimensional data using sky metaphor.}}}
!!!Results
{{center{[img[./img/master/2010/jakubeci/hypergraph-nebulae.png]]
{{center{A visualization of an existing software system using nebulae visualization of hypergraph representation}}}}}}

{{center{[img[./img/master/2010/jakubeci/multi-dimensional.png]]}}}
{{center{Visualization of multi-dimenstional data}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Software development and maintenance is very expensive, and the issues related to the intellectual understanding associated with the development of new programs are growing at a fast pace. Previous research has shown, that using 3D software visualizations in this field can lead to several advantages. This project’s goal is to analyse current situation in domain of software visualization and visual programming. It deals with various graphics representations of software and corresponding interaction techniques as well. It is finding alternative approaches to software development using visualization and interaction in 3D space.}}}
!!!Results
{{center{[img[img/master/2010/ludvik/2010_ludvik_dp_1.jpg]]}}}
{{center{Program structure.}}}
{{center{[img[img/master/2010/ludvik/2010_ludvik_dp_2.jpg]]}}}
{{center{Modules}}}
{{center{[img[img/master/2010/ludvik/2010_ludvik_dp_3.jpg]]}}}
{{center{Rectangle class.}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Software project’s source code is extensive often and searching for required part in specific revision is time expensive and unnecessarily burden the developer. More suitable way could offer option to view revisions of chosen parts only – the blocks of code. These blocks could follow structure of language. Viewing the revisions changes from viewing of revisions of files to viewing of revisions of classes, methods, functions, conditional blocks etc. The aim of this work is to explore the options of source code revision management at language constructions layer, propose and implement such solution. Solution should be represented by pilot application for chosen programming language.}}}
!!!Results
{{center{[img[./img/master/2011/caucik/editor.png]]
{{center{Source code editor with interface for changing revisions of the highlighted function}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{A software contains many artefacts. Between these artefacts exist relationships, which may change and can be removed by saving to various formats. We can represent the artefacts by graph structures. To better understand the software and its development, solution may be to visualize the evolution of the software in 3D. By the visualization of the software changes, we can better understand the system processes, which was in progress and show the new view on the software evolution. In diploma thesis we offer functional prototype of the application, which visualize the artefacts stored in Git repository. Our work is focused on the visualization of Git repository evolution in 3D, which can visualize the file system structure. For the Git repository containing Lua source code, we extend this functionality to show the evolution of function calls. The prototype results and design are described in this document.}}}
{{center{[img(20cm, )[./img/master/2016/Garaj/busted1-4.png]]
{{center{Visualization of the revisions 1,2,3,4 of the Busted framework.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Garaj/lua-code.png]]
{{center{Visualization of the revisions 22,23,24,25 of the Lua from 3DSoftViz.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Garaj/Lua_LOC.png]]
{{center{Showing LOC metrics.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Garaj/LuaStats_Modules.png]]
{{center{Visualization of software metrics for a specific revision.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Garaj/Difference_Modules_DEL.png]]
{{center{Visualization of changes from previous revision.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{In software engineering we use automatized analysis of source code for software metrics extraction, which helps us better understand structure of software. Software metrics gives us important informations, usable to increase quality of software. There are many known metrics, but their interpretation is not trivial. This paper deals with visualizations of software metrics in order to make their understanding easier. We know many two-dimensional visualizations methods. For instance: planar graphs, pictures, tables etc. Their redeemable value of three-dimensional visualization is much better, but also brings many problems and challenges such as dealing with abstraction and focusing on user needs. We propose expanding the three-dimensional visualizations with the com- bination of two-dimensional visualizations. These visualizations are made of embedded web browsers available on demand, enabling us to better focus on the details and visualize more relevant data in available space.}}}
{{center{[img(20cm, )[./img/master/2015/Gloger/webview-parallel.png]]
{{center{Call-graph visualization with a window showing metrics.}}}}}}
{{center{[img(20cm, )[./img/master/2015/Gloger/webview-parallel-zoom.png]]
{{center{Detailed view showing the embedded software metrics visualization using parallel coordinates.}}}}}}
{{center{[img(20cm, )[./img/master/2015/Gloger/webview2-folia.jpg]]
{{center{Visualization in augmented reality - showing 2 windows with metrics for 2 nodes (functions).}}}}}}
{{center{[img(20cm, )[./img/master/2015/Gloger/webview3-folia.jpg]]
{{center{Visualization in augmented reality - showing a window with cumulative software metric visualization for multiple nodes (functions).}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Innovative development environments are becoming more and more popular. These environments offer new ways in which the programmer can create, edit and browse through the source code. This essentially means, that the programmer has less work to do and thus saves time and energy. Important part of these environments is also source code parser, which can provide important feedback regarding overall source code quality. The goal of this thesis is to explore possibilities of source code parsing and its usage in order to enrich development environment. The final product of this thesis should be a prototype of a development environment which can analyse source code and use the results of this analysis to provide updated information about the source code.}}}
{{center{[img(20cm, )[./img/master/2015/Scholtz/pridavanie_uzlov.png]]
{{center{A) before, B) after writing a new function - the graph changes appropriately.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{This work concentrates on the problematics of visual programming and visual programming languages as a means for the creation, editing and execution of visual programs. It lists several advantages and disadvantages of this approach. It provides necessary definitions and states the classification of visual programming languages and their paradigms. It also explains several means of formal visual language specification. Existing visual environments and languages are analyzed and their distinguishing traits are explained. It then addresses the representation of programs with the means of graphs and the creation of such graphs. A new notation for representing software based on hypergraphs is presented. A new visual language is specified based on presented notation, together with it's syntax and execution model. Finally, a visual programming environment for the specified language is presented. It enables the user to create, modify and run programs based on the specified language.}}}
!!!Results
{{center{[img[img/master/2010/kottman/2010_kottman_dp_1.jpg]]}}}
{{center{Import of existing code to Vilie.}}}
{{center{[img(20cm, )[img/master/2010/kottman/2010_kottman_dp_2.jpg]]}}}
{{center{Detail of log function.}}}
{{center{[img(20cm, )[img/master/2010/kottman/2010_kottman_dp_3.jpg]]}}}
{{center{Selected functions from ~LuaDist project.}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{The first part of this work deals with the problem of camera motion with regard to context preservation. It analyzes and evaluates existing approaches to context preservation and best view search. It also evaluates existing approaches to camera trajectory generation during movement between objects of interest, and their practical usage. It analyzes different methods of dealing with information importance and its evaluation based on graph structure. In the second part of this project, a new approach for defining camera trajectory and orientation with respect to user requirements based on multiple graph metrics is proposed. This work also evaluates results achieved through this approach in terms of visual properties of proposed method and through quantification metrics.}}}
!!!Results
{{center{[img[./img/master/2011/paprcka/trajectory1.png]]
{{center{The calculated camera path for a graph}}}}}}
{{center{[img[./img/master/2011/paprcka/trajectory2.png]]}}}
{{center{The calculated camera path for another graph}}}

{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{The thesis focuses on information visualization using various biological metaphors, which simplify the process of browsing and understanding large data sets and their internal relations. Several approaches to visualization of organic objects, or potential biological metaphors, are described; using methods of computer graphics, or scientific visualization. Along with graph visualization methods, various algorithms for scientific visualization are analyzed. These algorithms were an inspiration for a method of graph visualization using metaphor of biological neural nets. Analyzed topics and algorithms lead to creation of an application capable of generation of visualizations of hierarchical data with graph-like structure, using biological metaphors. Proposed algorithm has been implemented and tested on various graphs representing synthetic, as well as real data.}}}
!!!Results
{{center{[img(20cm, )[./img/master/2011/mindek/gondola.png]]
{{center{Graph containing 242 nodes, 510 edges.}}}}}}
{{center{[img(20cm, )[./img/master/2011/mindek/veolia.png]]}}}
{{center{Graph containing 639 nodes and 917 edges}}}
{{center{[img(20cm, )[./img/master/2011/mindek/w2.png]]
{{center{A cluster from the previous graph}}}}}}
{{center{[img(20cm, )[./img/master/2011/mindek/smallworld.png]]}}}
{{center{Small world graph containing 100 nodes, 1000 edges}}}
{{center{[img(20cm, )[./img/master/2011/mindek/flow.png]]
{{center{Animated flow in a synthetic grid-like graph}}}}}}
{{center{[img(20cm, )[./img/master/2011/mindek/veins.png]]}}}
{{center{A tree visualization using veins metaphore}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
Not available...
!!!Results

{{center{[img[img/master/2009/cimo/2009_cimo_dp_1.png]]}}}
{{center{Definition of main function.}}}

{{center{[img[img/master/2009/cimo/2009_cimo_dp_2.png]]}}}
{{center{Definition of class and aspect.}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Software is not represented only by source code, but there are other possibilities like models, diagrams, documents or media, which describe it. By correct extraction and manipulation with software artifacts, we can determine a lot of important informations about the product. These informations could be used in process of development, testing or product maintenance. With increasing size of software is more di cult to navigate through all software artifacts in project repository and it is necessary to manipulate with them effectively and in a proper way. Based on the analysis was chosen proper way to represent and handle software artifacts. These informations are extracted by proposed system and visualized to provide high level of readability and information character about a chosen resource. The content of this work is to analyze, design and implementation of the system, which provides an powerful tool to realize the above aims.
}}}
!!!Results
{{center{[img(17cm, )[./img/master/2014/filcak/graph4-3845.png]]
{{center{Graph visualization showing clusters of functions and their call graph.}}}}}}
{{center{[img(17cm, )[./img/master/2014/filcak/graph7-3846.png]]
{{center{Graph visualization of function call graph for another source code.}}}}}}
{{center{[img(17cm, )[./img/master/2014/filcak/graph10-3844.png]]
{{center{Filtered visualization.}}}}}}
{{center{[img(20cm, )[./img/master/2014/filcak/Screen Shot 2014-05-13 at 16.23.03-3855.png]]
{{center{Using another visualization tool - shows function call graph.}}}}}}
{{center{[img(20cm, )[./img/master/2014/filcak/Screen Shot 2014-05-13 at 16.30.10-3856.png]]
{{center{Using another visualization tool - filtered view.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Software development is becoming an important part of many industrial and business sectors of our society. With more complex and larger scaled software systems, software developers feel the need to produce their software more effectively, with less visual complexity and most importantly faster. Sparing time of a programmer is important in many aspects, including lower cost of the final software product and faster delivery of the product to the customer. Current integrated development environments offer many tools to aid programmers in their everyday work tasks, such as managing and navigating software source code. In the visual presentation field alone, current ~IDEs all follow the classic physical source code presentation based on physical files and folders the source code belongs to. Innovative approaches include visual presentation of source code based on abstracting from the physical layout of source code and showing the code in it’s logical form. This work deals with methods and possibilities of innovative visual source code presentation to the user as well as navigation styles and techniques in the source code itself. This document thoroughly analyses current state of integrated development environments and gives a summary of new innovative ways and principles that an innovative IDE for the Lua language should observe. It presents a designed software prototype of innovative concept IDE for Lua, which is internally based on exact syntax analysis based on PEG grammars and gives the user many new innovative options in source code navigation as well as a completely changed visual presentation of the source code.
}}}
!!!Results
{{center{[img(15cm, )[./img/master/2013/kubis/2.png]]
{{center{Program structure visualized as a graph.}}}}}}
{{center{[img(20cm, )[./img/master/2013/kubis/1.png]]
{{center{Some nodes show source code.}}}}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Diploma project deals with the problem of drawing large graphs. The theoretical part focuses on the field of graphs and methods of drawing graphs, while most attention is devoted to force-directed and multi-level methods. Another part of analysis is devoted to possibilities of using parallel programming and graphics accelerators (also known as GPGPU programming) on this subject of drawing graphs. The goal of the project is to design and implement an algorithm for drawing graphs in 3D space, which will make use of the computing power of GPU and would be able to effectively respond to unexpected changes in the graph structure caused by the user. Designed solution successfully implements parallel graph layout algorithm and due to GPU computing horsepower achieves significantly better results than original implementation of the layout algorithm.
}}}
!!!Results
{{center{Comparison of graph layouts: (left) original, (right) our solution.}}}
{{center{[img(20cm, )[./img/master/2013/polak/1.png]]
{{center{[img(20cm, )[./img/master/2013/polak/2.png]]
{{center{[img(20cm, )[./img/master/2013/polak/3.png]]
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Lot of relationship between real-world entities can be represented by graph-oriented structure. For effective visualization of abstract data is necessary to define mechanisms to encourage visual data mining. This work discuss mainly possibilities of improving interaction of user with visualization. Basic graph data models, query languages to work with these models were analyzed and basics of visualization and interaction were presented. Based on research of existing methods, we will propose mechanisms to improve manipulation possibilities with graph visualization, including new types of interaction. In particular, we will focus on designing query language for modifying visualization with combination of magic lens.}}}
!!!Results
{{center{[img[./img/master/2011/cikova/withoutLens3.JPG]]
{{center{Graph visualization without magic lense}}}}}}
{{center{[img[./img/master/2011/cikova/withLens3.JPG]]}}}
{{center{A magic lens filtering significant subgraph}}}
{{center{[img[./img/master/2011/cikova/inheritance3.JPG]]}}}
{{center{A magic lens extracting source code inheritance relations from the graph}}}
{{center{[img[./img/master/2011/cikova/inheritance4.JPG]]}}}
{{center{A magic lens extracting source code inheritance relations from the graph - another view}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{Lots of information has structural character with some kind of relations. This type of information could naturally be represented by the graphs. A common way to enhance human understanding of graph is to visualize it. Many studies have already been devoted to this area, with most of them following conventional graph drawing techniques. In this thesis we present an experimental algorithm based on the spring-embedder technique, which tries to visualize graph structures using realistically rendered 3D soap bubble clusters. For its demonstration, a simple interactive visualization system was implemented. The process of system and algorithm development along with capabilities and issues connected with its use is discussed in detail.}}}
!!!Results
{{center{[img(20cm, )[img/master/2010/ukrop/2010_ukrop_dp.jpg]]}}}
{{center{Visualization of chosen graphs from Rome set}}}
{{center{[img[img/master/2010/ukrop/2010_ukrop_dp_1.jpg]]}}}
{{center{Visualization without space restrictions.}}}
{{center{[img[img/master/2010/ukrop/2010_ukrop_dp_2.jpg]]}}}
{{center{Visualization with active space restrictions.}}}
{{center{[img[img/master/2010/ukrop/2010_ukrop_dp_3.jpg]]}}}
{{center{Visualization of software artifact graph.}}}
{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
!!!Abstract
{{justify{The goal of this thesis is to create a software visualization as 3D city metaphor. A solution will be implemented by suitable mapping of software artifacts to buildings which will be displayed and included in the city infrastructure in the visualization result. For this purpose we design a mechanism to create logical layout of buildings. The city we show as flying city in clouds. Thesis will focus on graphical part. In introduction part we describe a problem of software visualization. Next part consist of analysis which inform about why we need to use visualization for the software. Next, we discuss about visualization technique survey. Next part describes a design of visual mapping and visualization and a progress of implementation. In the end, we evaluate results of analysis and easily refer to solution design.
}}}
{{center{[img(20cm, )[./img/master/2016/Horvath/secPrototype.jpg]]
{{center{Prototype of new building style and placement.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Horvath/trafficAsCity.jpg]]
{{center{Visualization of a smaller software project.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Horvath/trafficOverview.jpg]]
{{center{Visualization of a smaller software project - another view.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Horvath/trafficBuildings.jpg]]
{{center{Showing details of a class.}}}}}}
{{center{[img(20cm, )[./img/master/2016/Horvath/argoumlOverview.jpg]]
{{center{Visualization of a large software project.}}}}}}

{{center{<<storyViewer [[Master theses]] list allbuttons>>}}}
/%
|Name|BreadcrumbsCommand|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsCommand" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsCommand">http://www.TiddlyTools.com/#BreadcrumbsCommand</a></a>|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|BreadcrumbsPlugin|
|Overrides||
|Description|"crumbs" command displays current breadcrumbs list in a popup|

%/<html><hide linebreaks><a href="javascript:;" class="button" title="tiddlers viewed during this session"
	onclick="var p=Popup.create(this); if (!p) return;
		var d=createTiddlyElement(p,'div');
		d.style.whiteSpace='normal'; d.style.width='auto'; d.style.padding='2px';
		wikify('\<\<breadcrumbs [[\<html\>\<hr\>\</html\>]] [[<br>]]\>\>',d);
		Popup.show(p,false); event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation();
		return(false);"
>$1</a></html>
/***
|Name|BreadcrumbsPlugin|
|Author|Eric Shulman|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPlugin" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPlugin">http://www.TiddlyTools.com/#BreadcrumbsPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#BreadcrumbsPluginInfo" title="Linkification: http://www.TiddlyTools.com/#BreadcrumbsPluginInfo">http://www.TiddlyTools.com/#BreadcrumbsPluginInfo</a>|
|Version|2.1.0|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler,TiddlyWiki.prototype.deleteTiddler|
|Options|##Configuration|
|Description|list/jump to tiddlers viewed during this session plus "back" button/macro|
This plugin provides a list of links to all tiddlers opened during the session, creating a "trail of breadcrumbs" from one tiddler to the next, allowing you to quickly navigate to any previously viewed tiddler, or select 'home' to reset the display to the initial set of tiddlers that were open at the start of the session (i.e., when the document was loaded into the browser).
!!!!!Documentation
<<<
see [[BreadcrumbsPluginInfo]]
<<<
!!!!!Configuration
<<<
<<option chkCreateDefaultBreadcrumbs>> automatically create breadcrumbs display (if needed)
<<option chkShowBreadcrumbs>> show/hide breadcrumbs display
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
<<option chkBreadcrumbsHideHomeLink>> omit 'Home' link from breadcrumbs display
<<option chkBreadcrumbsSave>> prompt to save breadcrumbs when 'Home' link is pressed
<<option chkShowStartupBreadcrumbs>> show breadcrumbs for 'startup' tiddlers
<<option chkBreadcrumbsReverse>> show breadcrumbs in reverse order (most recent first)
<<option chkBreadcrumbsLimit>> limit breadcrumbs display to {{twochar{<<option txtBreadcrumbsLimit>>}}} items
<<option chkBreadcrumbsLimitOpenTiddlers>> limit open tiddlers to {{twochar{<<option txtBreadcrumbsLimitOpenTiddlers>>}}} items

<<<
!!!!!Revisions
<<<
2009.03.22 [2.1.0] added 'save breadcrumbs to tiddler' feature
| Please see [[BreadcrumbsPluginInfo]] for previous revision details |
2006.02.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.BreadcrumbsPlugin= {major: 2, minor: 1, revision: 0, date: new Date("March 2, 2009")};

var co=config.options; // abbreviation

// show/hide display option (default is to SHOW breadcrumbs)
if (co.chkShowBreadcrumbs===undefined) co.chkShowBreadcrumbs=true;

// REORDER breadcrumbs when visiting previously viewed tiddler (default)
if (co.chkReorderBreadcrumbs===undefined) co.chkReorderBreadcrumbs=true;

// create default breadcrumbs display as needed (default is to CREATE)
if (co.chkCreateDefaultBreadcrumbs===undefined) co.chkCreateDefaultBreadcrumbs=true;

// show breadcrumbs for 'startup' tiddlers (default is FALSE = only show crumbs for tiddlers opened after startup)
if (co.chkShowStartupBreadcrumbs===undefined) co.chkShowStartupBreadcrumbs=false;

// show crumbs in reverse order (most recent first)
if (co.chkBreadcrumbsReverse===undefined) co.chkBreadcrumbsReverse=false;

// limit number of crumbs displayed
if (co.chkBreadcrumbsLimit===undefined) co.chkBreadcrumbsLimit=false;
if (co.txtBreadcrumbsLimit===undefined) co.txtBreadcrumbsLimit=5;

// limit number of open tiddlers
if (co.chkBreadcrumbsLimitOpenTiddlers===undefined) co.chkBreadcrumbsLimitOpenTiddlers=false;
if (co.txtBreadcrumbsLimitOpenTiddlers===undefined) co.txtBreadcrumbsLimitOpenTiddlers=3;

// omit home link from breadcrumbs display
if (co.chkBreadcrumbsHideHomeLink===undefined) co.chkBreadcrumbsHideHomeLink=false;

// prompt for 'save crumbs' when 'home' button is pressed
if (co.chkBreadcrumbsSave===undefined) co.chkBreadcrumbsSave=false;

config.macros.breadcrumbs =  {
	crumbs: [], // the list of current breadcrumbs
	askMsg: "Save current breadcrumbs before clearing?\nPress OK to save, or CANCEL to continue without saving.",
	saveMsg: 'Enter the name of a tiddler in which to save the current breadcrumbs',
	saveTitle: 'SavedBreadcrumbs',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var area=createTiddlyElement(place,"span",null,"breadCrumbs",null);
		area.setAttribute("homeSep",params[0]?params[0]:this.homeSeparator); // custom home separator
		area.setAttribute("crumbSep",params[1]?params[1]:this.crumbSeparator); // custom crumb separator
		this.render(area);
	},
	add: function (title) {
		var thisCrumb = title;
		var ind = this.crumbs.indexOf(thisCrumb);
		if(ind === -1)
			this.crumbs.push(thisCrumb);
		else if (config.options.chkReorderBreadcrumbs)
			this.crumbs.push(this.crumbs.splice(ind,1)[0]); // reorder crumbs
		else
			this.crumbs=this.crumbs.slice(0,ind+1); // trim crumbs
		if (config.options.chkBreadcrumbsLimitOpenTiddlers)
			this.limitOpenTiddlers();
		this.refresh();
		return false;
	},
	getAreas: function() {
		var crumbAreas=[];
		// find all DIVs with classname=="breadCrumbs"
		// Note: use try/catch to avoid "Bad NPObject as private data" fatal error  caused when
		// some versions of embedded QuickTime player element is accessed by hasClass() function.
		var all=document.getElementsByTagName("*");
		for (var i=0; i<all.length; i++)
			try{ if (hasClass(all[i],"breadCrumbs")) crumbAreas.push(all[i]); } catch(e) {;}
		// find single DIV w/fixed ID (backward compatibility)
		var byID=document.getElementById("breadCrumbs")
		if (byID && !hasClass(byID,"breadCrumbs")) crumbAreas.push(byID);
		if (!crumbAreas.length && config.options.chkCreateDefaultBreadcrumbs) {
			// no existing crumbs display areas... create one...
			var defaultArea = createTiddlyElement(null,"span",null,"breadCrumbs",null);
		 	defaultArea.style.display= "none";
			var targetArea= document.getElementById("tiddlerDisplay");
		 	targetArea.parentNode.insertBefore(defaultArea,targetArea);
			crumbAreas.push(defaultArea);
		}
		return crumbAreas;
	},
	refresh: function() {
		var crumbAreas=this.getAreas();
		for (var i=0; i<crumbAreas.length; i++) {
			crumbAreas[i].style.display = config.options.chkShowBreadcrumbs?"block":"none";
			removeChildren(crumbAreas[i]);
			this.render(crumbAreas[i]);
		}
	},
	render: function(here) {
		var co=config.options; var out=""
		var homeSep=here.getAttribute("homeSep"); if (!homeSep) homeSep=this.homeSeparator;
		var crumbSep=here.getAttribute("crumbSep"); if (!crumbSep) crumbSep=this.crumbSeparator;
		if (!co.chkBreadcrumbsHideHomeLink) {
			createTiddlyButton(here,"Home",null,this.home,"tiddlyLink tiddlyLinkExisting");
			out+=homeSep;
		}
		for (c=0; c<this.crumbs.length; c++) // remove non-existing tiddlers from crumbs
			if (!store.tiddlerExists(this.crumbs[c]) && !store.isShadowTiddler(this.crumbs[c]))
				this.crumbs.splice(c,1);
		var count=this.crumbs.length;
		if (co.chkBreadcrumbsLimit && co.txtBreadcrumbsLimit<count) count=co.txtBreadcrumbsLimit;
		var list=[];
		for (c=this.crumbs.length-count; c<this.crumbs.length; c++) list.push('[['+this.crumbs[c]+']]');
		if (co.chkBreadcrumbsReverse) list.reverse();
		out+=list.join(crumbSep);
		wikify(out,here);
	},
	home: function() {
		var cmb=config.macros.breadcrumbs;
		if (config.options.chkBreadcrumbsSave && confirm(cmb.askMsg)) cmb.saveCrumbs();
		story.closeAllTiddlers(); restart();
		cmb.crumbs = []; var crumbAreas=cmb.getAreas();
		for (var i=0; i<crumbAreas.length; i++) crumbAreas[i].style.display = "none";
		return false;
	},
	saveCrumbs: function() {
		var tid=prompt(this.saveMsg,this.saveTitle); if (!tid||!tid.length) return; // cancelled by user
		var t=store.getTiddler(tid);
		if(t && !confirm(config.messages.overwriteWarning.format([tid]))) return;
		var who=config.options.txtUserName;
		var when=new Date();
		var text='[['+this.crumbs.join(']]\n[[')+']]';
		var tags=t?t.tags:[]; tags.pushUnique('story');
		var fields=t?t.fields:{};
		store.saveTiddler(tid,tid,text,who,when,tags,fields);
		story.displayTiddler(null,tid);
		story.refreshTiddler(tid,null,true);
		displayMessage(tid+' has been '+(t?'updated':'created'));
	},
	limitOpenTiddlers: function() {
		var limit=config.options.txtBreadcrumbsLimitOpenTiddlers; if (limit<1) limit=1;
		for (c=this.crumbs.length-1; c>=0; c--) {
			var tid=this.crumbs[c];
			var elem=document.getElementById(story.idPrefix+tid);
			if (elem) { // tiddler is displayed
				if (limit <=0) { // display limit has been reached
					if (elem.getAttribute("dirty")=="true") { // tiddler is being edited
						var msg="'"+tid+"' is currently being edited.\n\n";
						msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
						if (confirm(msg)) { story.saveTiddler(tid); story.closeTiddler(tid); }
					}
					else
						story.closeTiddler(this.crumbs[c]);
				}
				limit--;
			}
		}
	}
};
if (config.macros.breadcrumbs.homeSeparator==undefined) // note: not a cookie
	config.macros.breadcrumbs.homeSeparator=" | ";
if (config.macros.breadcrumbs.crumbSeparator==undefined)  // note: not a cookie
	config.macros.breadcrumbs.crumbSeparator=" > ";

config.commands.previousTiddler = {
	text: 'back',
	tooltip: 'view the previous tiddler',
	hideReadOnly: false,
	dateFormat: 'DDD, MMM DDth YYYY hh:0mm:0ss',
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var crumbs=config.macros.breadcrumbs.crumbs;
		if (crumbs.length>1) {
			var crumb=crumbs[crumbs.length-2];
			story.displayTiddler(here,crumb);
		}
		else
			config.macros.breadcrumbs.home();
		return false;
	}
};

config.macros.previousTiddler= {
	label: 'back',
	prompt: 'view the previous tiddler',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var label=params.shift(); if (!label) label=this.label;
		var prompt=params.shift(); if (!prompt) prompt=this.prompt;
		createTiddlyButton(place,label,prompt,function() {
			var crumbs=config.macros.breadcrumbs.crumbs;
			if (crumbs.length>1) {
				var crumb=crumbs[crumbs.length-2];
				story.displayTiddler(place,crumb);
			}
			else
				config.macros.breadcrumbs.home();
		});
	}
}

// hijack story.displayTiddler() so crumbs can be refreshed when a tiddler is displayed
if (Story.prototype.breadCrumbs_coreDisplayTiddler==undefined)
	Story.prototype.breadCrumbs_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	this.breadCrumbs_coreDisplayTiddler.apply(this,arguments);
	// if not displaying tiddler during document startup, then add it to the breadcrumbs
	// note: 'startingUp' flag is a global, set/reset by the core init() function
	if (!startingUp || config.options.chkShowStartupBreadcrumbs) config.macros.breadcrumbs.add(title);
}

// hijack store.removeTiddler() so crumbs can be refreshed when a tiddler is deleted
if (TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined)
	TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler= function(title)
{
	this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);
	config.macros.breadcrumbs.refresh();
}
//}}}
/***
|Name|ClickifyPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#ClickifyPlugin" title="Linkification: http://www.TiddlyTools.com/#ClickifyPlugin">http://www.TiddlyTools.com/#ClickifyPlugin</a>|
|Version|1.0.1|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <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|re-compute parameters when a 'command link' macro is clicked|
!!!!!Usage
<<<
Normally, when you use a //computed parameter// in a macro, it's value is determined when the macro is rendered.  The {{{<<clickify>>}}} macro can be used to force the macro parameters of an 'on-click' command link (such as created by the {{{<<newTiddler>>}}} macro) to be automatically re-computed when the command link is clicked, rather than when it is initially displayed.  This allows use of computed values that depend upon data that may change between the time the macro is rendered and when it's action is actually triggered by a click.

To apply this extended processing to any macro that creates a command link, simply insert the 'clickify' keyword in front of the usual macro name, like this:
{{{
<<clickify macroName param param param ...>>
}}}
<<<
!!!!!Example
<<<
When {{{<<newTiddler>>}}} is clicked, prompt for a title and set default text to current timestamp:
{{{
<<clickify newTiddler title:{{prompt('enter a title','NewTiddler')}} text:{{new Date()}}>>
}}}
><<clickify newTiddler title:{{prompt('enter a title','NewTiddler')}} text:{{new Date()}}>>
<<<
!!!!!Revisions
<<<
2009.02.08 [1.0.1] make sure command link has been rendered before trying to modify it
2009.01.25 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ClickifyPlugin={major: 1, minor: 0, revision: 1, date: new Date(2009,2,8)};
config.macros.clickify={
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var cmd='<<'+paramString+'>>';
		var e=createTiddlyElement(place,'span');
		wikify(cmd.replace(/alert\(|prompt\(|confirm\(/g,'isNaN('),e);
		var b=e.getElementsByTagName('a')[0]; if (!b) return;
		b.setAttribute('cmd',cmd);
		b.onclick=function(ev) {
			var cmd=this.getAttribute('cmd');
			var e=createTiddlyElement(this.parentNode,'span');
			e.style.display='none';
			wikify(cmd,e);
			e.getElementsByTagName('a')[0].onclick();
			this.parentNode.removeChild(e);
		}
	}
}
//}}}
/***
|Name|CollapseTiddlersPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a>" title="Linkification: <a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a>"><a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a>"><a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a>"><a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a>"><a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a>"><a class="linkification-ext" href="http://gensoft.revhost.net/Collapse.html" title="Linkification: http://gensoft.revhost.net/Collapse.html">http://gensoft.revhost.net/Collapse.html</a></a>|
|Version|2008.10.05|
|Author|Bradley Meck (modified by ELS)|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|CollapsedTemplate|
|Overrides||
|Description|show/hide content of a tiddler while leaving tiddler title visible|

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

***/

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

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

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

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

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

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


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

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

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

// {{{<<foldFirst>>}}} macro forces tiddler to be folded when *initially* displayed.
// Subsequent re-render does NOT re-fold tiddler, but closing/re-opening tiddler DOES cause it to fold first again.
config.macros.foldFirst = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		var e=story.findContainingTiddler(place);
		if (e.getAttribute("foldedFirst")=="true") return; // already been folded once
		var title=e.getAttribute("tiddler")
		var t=config.commands.collapseTiddler.getCollapsedTemplate();
		config.commands.collapseTiddler.saveTemplate(e);
		config.commands.collapseTiddler.display(title,t);
		e.setAttribute("folded","true");
		e.setAttribute("foldedFirst","true"); // only when tiddler is first rendered
		return false;
	}
}
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::CollapsedToolbar]]'></div>
<div class='title' macro='view title'></div>
<!--}}}-->
Background: #ffffff
Foreground: #000000
PrimaryPale: #8cf
PrimaryLight: #000
PrimaryMid: #000
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/***
|Name|CookieManagerPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPlugin" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPlugin">http://www.TiddlyTools.com/#CookieManagerPlugin</a></a>|
|Version|2.4.0|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|view/add/delete browser-based cookies and "bake" cookies to CookieJar tiddler for 'sticky' settings|
!!!!!Usage
<<<
This plugin provides an interactive control panel that lets you select, view, modify, or delete any of the current values for TiddlyWiki options that have been stored as local, private, //browser cookies//.  You can also use the control panel to "bake cookies", which generates a set of javascript statements that assign hard-coded option values to the TiddlyWiki internal variables that correspond to the current browser cookie settings.  These hard-coded values are then stored in the [[CookieJar]] tiddler, which is tagged with<<tag systemConfig>> so that each time the document is loaded, the baked cookie settings will be automatically applied.

When a set of baked cookies is added to the [[CookieJar]], it is automatically surrounded by a conditional test so that the hard-coded settings will only be applied for the username that was in effect when they were initially generated.  In this way, if you publish or share your document with others, //your// particular baked cookie settings are not automatically applied to others, so that their own browser-based cookie settings (if defined) will be applied as usual.

Whenever you "bake cookies", new hard-coded javascript assignment statements are *appended* to the end of the [[CookieJar]].  However, any baked cookies that were previously generated and stored in the [[CookieJar]] are not automatically removed from the tiddler.  As a result, because the most recently baked cookie settings in the [[CookieJar]] are always the last to be processed, the values assigned by older baked cookies are immediately overridden by the values from the newest baked cookies, so that the newest values will be in effect when the CookieJar startup processing is completed.

Each time you bake a new batch of cookies, it is recommended that you should review and hand-edit the [[CookieJar]] to remove any "stale cookies" or merge the old and new sets of baked cookies into a single block to simplify readability (as well as saving a little tiddler storage space).  Of course, you can also hand-edit the [[CookieJar]] tiddler at any time simply to remove a few individual //baked cookies// if they are no longer needed, and you can even delete the entire [[CookieJar]] tiddler and start fresh, if that is appropriate.  Please note that changing or deleting a baked cookie does not alter the current value of the corresponding option setting, and any changes you make to the [[CookieJar]] will only be applied after you have saved and reloaded the document in your browser.
<<<
!!!!!Examples
<<<
{{{<<cookieManager>>}}}
{{smallform small center{
@@display:block;width:35em;<<cookieManager>>@@}}}
<<<
!!!!!Configuration
<<<
<<option chkAllowBrowserCookies>> store ~TiddlyWiki option settings using private browser cookies
<<option chkMonitorBrowserCookies>> monitor browser cookie activity (show a message whenever a cookie is set or deleted)
<<option chkCookieManagerAddToAdvancedOptions>> display [[CookieManager]] in [[AdvancedOptions]]
//note: this setting does not take effect until you reload the document//
<<<
!!!!!Revisions
<<<
2009.08.05 [2.4.0] changed CookieJar output format to support odd symbols in option names (e.g. '@')
2008.09.14 [2.3.2] fixed handling for blocked cookies (was still allowing some blocked cookies to be set)
2008.09.12 [2.3.1] added blocked[] array and allowBrowserCookie() test function for selective blocking of changes to browser cookies based on cookie name
2008.09.08 [2.3.0] extensive code cleanup: defined removeCookie(), renamed cookies, added 'button' param for stand-alone "bake cookies" button, improved init of shadow [[CookieManager]] and [[CookieJar]] tiddlers for compatibility with new [[CookieSaverPlugin]].
2008.07.11 [2.2.1] fixed recursion error in hijack for saveOptionCookie()
2008.06.26 [2.2.0] added chkCookieManagerNoNewCookies option
2008.06.05 [2.1.3] replaced hard-coded definition for "CookieJar" title with option variable
2008.05.12 [2.1.2] add "cookies" task to backstage (moved from BackstageTasks)
2008.04.09 [2.1.0] added options: chkCookieManagerAddToAdvancedOptions
2008.04.08 [2.0.1] automatically include CookieManager control panel in AdvancedOptions shadow tiddler
2007.08.02 [2.0.0] converted from inline script
2007.04.29 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.CookieManagerPlugin= {major: 2, minor: 3, revision: 1, date: new Date(2008,9,12)};
//}}}
//{{{
config.macros.cookieManager = {
	target:
		config.options.txtCookieJar||"CookieJar",
	blockedCookies:
		[],
	allowBrowserCookie: function(name) {
		return true;
	},
	displayStatus: function(msg) {
		if (config.options.chkMonitorBrowserCookies && !startingUp)
			displayMessage("CookieManager: "+msg);
	},
	init: function() {
		if (config.options.txtCookieJar===undefined)
			config.options.txtCookieJar=this.target;
		if (config.options.chkAllowBrowserCookies===undefined)
			config.options.chkAllowBrowserCookies=true;
		if (config.options.chkMonitorBrowserCookies===undefined)
			config.options.chkMonitorBrowserCookies=false;

		config.shadowTiddlers.CookieManager=
			 "/***\n"
			+"!!![[Browser cookies:|CookieManagerPlugin]] "
			+"{{fine{<<option chkAllowBrowserCookies>>enable <<option chkMonitorBrowserCookies>>monitor}}}\n"
			+"^^Review, modify, or delete browser cookies..."
			+"To block specific cookies, see [[CookieManagerPluginConfig]].^^\n"
			+"@@display:block;width:30em;{{smallform small{\n<<cookieManager>>}}}@@\n"
			+"***/\n";

		// add CookieManager to shadow CookieJar
		var h="/***\n<<tiddler CookieManager>>\n***/\n";
		var t=(config.shadowTiddlers[this.target]||"").replace(new RegExp(h.replace(/\*/g,'\\*'),''),'')
		config.shadowTiddlers[this.target]=h+t;

		if (config.options.chkCookieManagerAddToAdvancedOptions===undefined)
			config.options.chkCookieManagerAddToAdvancedOptions=true;
		if (config.options.chkCookieManagerAddToAdvancedOptions)
			config.shadowTiddlers.AdvancedOptions+="\n!!CookieManager\n><<tiddler CookieManager>>";

		// add "cookies" backstage task
		if (config.tasks && !config.tasks.cookies) { // for TW2.2b3 or above
			config.tasks.cookies = {
				text: "cookies",
				tooltip: "manage cookie-based option settings",
				content: "{{groupbox{<<tiddler CookieManager>><<tiddler [["+this.target+"]]>>}}}"
			}
			config.backstageTasks.push("cookies");
		}
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span=createTiddlyElement(place,"span");
		span.innerHTML=(params[0]&&params[0].toLowerCase()=="button")?this.button:this.panel;
		this.setList(span.firstChild.list);
	},
	panel: '<form style="display:inline;margin:0;padding:0" onsubmit="return false"><!--\
		--><select style="width:99%" name="list" \
			onchange="this.form.val.value=this.value.length?config.options[this.value]:\'\';"><!--\
		--></select><br>\
		<input type="text" style="width:98%;margin:0;" name="val" title="enter an option value"><br>\
		<input type="button" style="width:33%;margin:0;" value="get" title="refresh list" \
			onclick="config.macros.cookieManager.setList(this.form.list);"><!--\
		--><input type="button" style="width:33%;margin:0;" value="set" title="save cookie value" \
			onclick="var cmc=config.macros.cookieManager;\
				var opt=this.form.list.value; var v=this.form.val.value; \
				var msg=opt+\' is a blocked cookie.  OK to proceed?\';\
				if ((!cmc.blockedCookies.contains(opt) && cmc.allowBrowserCookie(opt))||confirm(msg)) {\
					config.options[opt]=opt.substr(0,3)==\'txt\'?v:(v.toLowerCase()==\'true\'); \
					saveOptionCookie(opt);config.macros.cookieManager.setList(this.form.list);\
				}"><!--\
		--><input type="button" style="width:33%;margin:0;" value="del" title="remove cookie" \
			onclick="var cmc=config.macros.cookieManager; var opt=this.form.list.value; \
				var msg=opt+\' is a blocked cookie.  OK to proceed?\';\
				if ((!cmc.blockedCookies.contains(opt) && cmc.allowBrowserCookie(opt))||confirm(msg)) {\
					removeCookie(this.form.list.value,true); \
					cmc.setList(this.form.list);\
				}"><br>\
		<input type="button" style="width:50%;margin:0;" value="bake cookies" \
			title="save current cookie-based option values into a tiddler" \
			onclick="return config.macros.cookieManager.bake(this,false)"><!--\
		--><input type="button" style="width:50%;margin:0;" value="bake all options" \
			title="save ALL option values (including NON-COOKIE values) into a tiddler" \
			onclick="return config.macros.cookieManager.bake(this,true)"><!--\
		--></form>\
	',
	button: '<form style="display:inline;margin:0;padding:0" onsubmit="return false"><!--\
		--><input type="button" style="margin:0;" value="bake cookies" \
			title="save current browser-based cookie values into a tiddler" \
			onclick="return config.macros.cookieManager.bake(this,false)"><!--\
		--></form>\
	',
	getCookieList: function() {
		var cookies = { };
		if (document.cookie != "") {
			var p = document.cookie.split("; ");
			for (var i=0; i < p.length; i++) {
				var pos=p[i].indexOf("=");
				if (pos==-1) cookies[p[i]]="";
				else cookies[p[i].substr(0,pos)]=unescape(p[i].slice(pos+1));
			}
		}
		var opt=new Array(); for (var i in config.options) if (cookies[i]) opt.push(i); opt.sort();
		return opt;
	},
	setList: function(list) {
		if (!list) return false;
		var opt=this.getCookieList();
		var sel=list.selectedIndex;
		while (list.options.length > 1) { list.options[1]=null; } // clear list (except for header item)
		list.options[0]=new Option("There are "+opt.length+" cookies...","",false,false);
		if (!opt.length) { list.form.val.value=""; return; } // no cookies
		var c=1;
		for(var i=0; i<opt.length; i++) {
			var txt="";
			if  (opt[i].substr(0,3)=="chk")
				txt+="["+(config.options[opt[i]]?"\u221A":"_")+"] ";
			txt+=opt[i];
			list.options[c++]=new Option(txt,opt[i],false,false);
		}
		list.selectedIndex=sel>0?sel:0;
		list.form.val.value=sel>0?config.options[list.options[sel].value]:"";
	},
	header:
		"/***\n"
		+"!!![[Baked cookies:|CookieManagerPlugin]]\n"
		+"^^Press {{smallform{<<cookieManager button>>}}} to save the current browser cookies... "
		+"then hand-edit this section to customize the results.^^\n"
		+"***/\n",
	format: function(name) {
		if (name.substr(0,3)=='chk')
			return '\tconfig.options["'+name+'"]='+(config.options[name]?'true;':'false;');
		return '\tconfig.options["'+name+'"]="'+config.options[name]+'";';
	},
	bake: function(here,all) {
		if (story.isDirty(this.target)) return false; // target is being hand-edited... do nothing
		var text=store.getTiddlerText(this.target);
		if (text.indexOf(this.header)==-1) {
			text+=this.header;
			displayMessage("CookieManager: added 'Baked Cookies' section to CookieJar");
		}
		var who=config.options.txtUserName;
		var when=new Date();
		var tags=['systemConfig'];
		var tid=store.getTiddler(this.target)||store.saveTiddler(this.target,this.target,text,who,when,tags,{});
		if (!tid) return false; // if no target... do nothing
		if (all) {
			var opts=new Array();
			for (var i in config.options) if (i.substr(0,3)=='chk'||i.substr(0,3)=='txt') opts.push(i);
			opts.sort();
		}
		else var opts=this.getCookieList();
		var t=tid.text;
		if (t.indexOf(this.header)==-1) t+=this.header;
		t+='\n// '+opts.length+(all?' options':' cookies')+' saved ';
		t+=when.formatString('on DDD, MMM DDth YYYY at 0hh:0mm:0ss');
		t+=' by '+who+'//\n';
		t+='//^^(edit/remove username check and/or individual option settings as desired)^^//\n';
		t+='//{{{\n';
		t+='if (config.options.txtUserName=="'+who+'") {\n';
		for (i=0; i<opts.length; i++) t+=config.macros.cookieManager.format(opts[i])+"\n";
		t+='}\n//}}}\n';
		store.saveTiddler(this.target,this.target,t,who,when,tags,tid?tid.fields:{});
		story.displayTiddler(story.findContainingTiddler(this),this.target);
		story.refreshTiddler(this.target,null,true);
		var msg=opts.length+(all?' options':' cookies')+' have been saved in '+this.target+'.  ';
		msg+='Please review all stored settings.';
		displayMessage(msg);
		return false;
	}
}
//}}}
//{{{
// Hijack saveOptionCookie() to add cookie blocking and monitoring messages
config.macros.cookieManager.saveOptionCookie=saveOptionCookie;
window.saveOptionCookie=function(name,force)
{
	var cmc=config.macros.cookieManager; // abbrev
	if (force || ((config.options.chkAllowBrowserCookies || name=="chkAllowBrowserCookies")
		&& !cmc.blockedCookies.contains(name) && cmc.allowBrowserCookie(name))) {
		cmc.saveOptionCookie.apply(this,arguments);
		cmc.displayStatus(name+"="+config.options[name]);
	} else cmc.displayStatus("setting of '"+name+"' is blocked");
}

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

// ... and then hijack it to add cookie blocking and monitoring messages
config.macros.cookieManager.removeCookie=removeCookie;
window.removeCookie=function(name,force)
{
	var cmc=config.macros.cookieManager; // abbrev
	if (!cmc.getCookieList().contains(name))
		return; // not a current cookie!
	if (force || ((config.options.chkAllowBrowserCookies || name=="chkAllowBrowserCookies")
		&& !cmc.blockedCookies.contains(name) && cmc.allowBrowserCookie(name))) {
		cmc.removeCookie.apply(this,arguments);
		cmc.displayStatus("deleted "+name);
	} else cmc.displayStatus("deletion of '"+name+"' is blocked");
}
//}}}
/***
|Name|CookieManagerPluginConfig|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CookieManagerPluginConfig" title="Linkification: http://www.TiddlyTools.com/#CookieManagerPluginConfig">http://www.TiddlyTools.com/#CookieManagerPluginConfig</a></a>|
|Requires|CookieManagerPlugin|
|Description|custom settings for [[CookieManagerPlugin]]|
!!!!!Browser Cookie Configuration:
***/
// // <<option chkAllowBrowserCookies>> store ~TiddlyWiki option settings using private browser cookies
// // <<option chkMonitorBrowserCookies>> monitor browser cookie activity (shows a message whenever a cookie is updated)
//{{{
// default settings:
config.options.chkAllowBrowserCookies=true;	// if FALSE, this blocks *all* cookies
config.options.chkMonitorBrowserCookies=false;
//}}}

// // Individual cookie names can be prevented from being created, modified, or deleted in your browser's stored cookies by adding them to the {{{config.macros.cookieManager.blockedCookies}}} array:
//{{{
var bc=config.macros.cookieManager.blockedCookies; // abbreviation
bc.push("txtMainTab");			// TiddlyWiki:  SideBarTabs
bc.push("txtTOCSortBy");		// TiddlyTools: TableOfContentsPlugin
bc.push("txtCatalogTab");		// TiddlyTools: ShowCatalog
//}}}
// // You can also define a javascript test function that determines whether or not any particular cookie name should be blocked or allowed.  The following function should return FALSE if the browser cookie should be blocked, or TRUE if changes to the cookie should be allowed:
//{{{
config.macros.cookieManager.allowBrowserCookie=function(name) {
	// add tests based on specific cookie names and runtime conditions
	return true;
}
//}}}
/***
|Name|CopyTiddlerPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#CopyTiddlerPlugin" title="Linkification: http://www.TiddlyTools.com/#CopyTiddlerPlugin">http://www.TiddlyTools.com/#CopyTiddlerPlugin</a></a>|
|Version|3.2.5|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Description|Quickly create a copy of any existing tiddler|
!!!Usage
<<<
The plugin automatically updates the default (shadow) ToolbarCommands definitions to insert the ''copyTiddler'' command, which will appear as ''copy'' when a tiddler is rendered.  If you are already using customized toolbar definitions, you will need to manually add the ''copyTiddler'' toolbar command to your existing ToolbarCommands tiddler, e.g.:
{{{
|EditToolbar|... copyTiddler ... |
}}}
When the ''copy'' command is selected, a new tiddler is created containing an exact copy of the current text/tags/fields, using a title of "{{{TiddlerName (n)}}}", where ''(n)'' is the next available number (starting with 1, of course).  If you copy while //editing// a tiddler, the current values displayed in the editor are used (including any changes you may have already made to those values), and the new tiddler is immediately opened for editing.

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

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

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

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

***/
// // open tickets:
// // {{block{
/***
!!!890 add conditional test to """<<tiddler>>""" macro
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/890 - OPEN
This tweak extends the {{{<<tiddler>>}}} macro syntax so you can include a javascript-based //test expression// to determine if the tiddler transclusion should be performed:
{{{
<<tiddler TiddlerName if:{{...}} with: param param etc.>>
}}}
If the test is ''true'', then the tiddler is transcluded as usual.  If the test is ''false'', then the transclusion is skipped and //no output is produced//.
***/
//{{{
config.macros.tiddler.if_handler = config.macros.tiddler.handler;
config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	params = paramString.parseParams('name',null,true,false,true);
	if (!getParam(params,'if',true)) return;
	this.if_handler.apply(this,arguments);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!831 backslash-quoting for embedding newlines in 'line-mode' formats
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/831" title="Linkification: http://trac.tiddlywiki.org/ticket/831">http://trac.tiddlywiki.org/ticket/831</a> - OPEN
This tweak pre-processes source content to convert 'double-backslash-newline' into {{{<br>}}} before wikify(), so that literal newlines can be embedded in line-mode wiki syntax (e.g., tables, bullets, etc.)
***/
//{{{
window.coreWikify = wikify;
window.wikify = function(source,output,highlightRegExp,tiddler)
{
	if (source) arguments[0]=source.replace(/\\\\\n/mg,'<br>');
	coreWikify.apply(this,arguments);
}
//}}}
// // }}}}}}// // {{block{
/***
!!!829 """<<tag>>""" macro - sortby parameter
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/829" title="Linkification: http://trac.tiddlywiki.org/ticket/829">http://trac.tiddlywiki.org/ticket/829</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/829" title="Linkification: http://trac.tiddlywiki.org/ticket/829">http://trac.tiddlywiki.org/ticket/829</a>">http://trac.tiddlywiki.org/ticket/829</a> - OPEN
This tweak adds an optional 'sortby' parameter to the """<<tag tagname label tip sortby>>""" macro, as well as the """<<allTags excludeTag sortby>>""" macro used to generate the sidebar contents 'tags' list.  Specify the field on which the contents of each tag popup is to be sorted, with a '+' or '-' prefix to indicate ascending/descending order, respectively.

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

Similarly, to change the sort order used by the popups from all tags shown in the sidebar contents, edit the [[TagTags]] shadow tiddler and enter: """<<allTags excludeLists -modified>>"""
***/
//{{{
// hijack tag handler() to add 'sortby' attribute to tag button
config.macros.tag.CoreTweaksSortTags_handler=config.macros.tag.handler;
config.macros.tag.handler = function(place,macroName,params)
{
	this.CoreTweaksSortTags_handler.apply(this,arguments);
	var btn=place.lastChild;
	if (params[3]) btn.setAttribute('sortby',params[3]);
}

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

// tweak tag event handler to:
// * use tag filtering (only if '[' is present in tag value)
// * use optional 'sortby' attribute
// * save 'sortby' value in 'open all' command (for displaying tiddlers in sorted order)
var fn=onClickTag;
fn=fn.toString().replace(
	/store.getTaggedTiddlers\(tag\);/g,
	'(tag.indexOf("[")==-1?store.getTaggedTiddlers(tag):store.filterTiddlers(tag));'
	+'var sortby=this.getAttribute("sortby");'
	+'if(sortby&&sortby.length) store.sortTiddlers(tagged,sortby);'
);
fn=fn.toString().replace(
	/openAll.setAttribute\("tag",\s*tag\);/g,
	'openAll.setAttribute("tag",tag); openAll.setAttribute("sortby",sortby);'
);
eval(fn);

// tweak 'open all' event handler to use 'sortby' attribute
var fn=onClickTagOpenAll;
fn=fn.toString().replace(
	/story.displayTiddlers\(this,\s*tiddlers\);/g,
	'var sortby=this.getAttribute("sortby");'
	+'if(sortby&&sortby.length) store.sortTiddlers(tiddlers,sortby);'
	+'story.displayTiddlers(this,tiddlers);'
);
eval(fn);
//}}}
// // }}}}}}// // {{block{
/***
!!!824 ~WindowTitle - alternative to combined ~SiteTitle/~SiteSubtitle in window titlebar
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a>">http://trac.tiddlywiki.org/ticket/824</a>" title="Linkification: <a class="linkification-ext" href="http://trac.<a class="linkification-ext" href="http://tiddlywiki.org/ticket/824" title="Linkification: http://tiddlywiki.org/ticket/824">tiddlywiki.org/ticket/824</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a></a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a></a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a></a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a></a>"><a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/824" title="Linkification: http://trac.tiddlywiki.org/ticket/824">http://trac.tiddlywiki.org/ticket/824</a>">http://trac.tiddlywiki.org/ticket/824</a></a> - OPEN
This tweak allows definition of an optional [[WindowTitle]] tiddler that, when present, provides alternative text for display in the browser window's titlebar, instead of using the combined text content from [[SiteTitle]] and [[SiteSubtitle]] (which will still be displayed as usual in the TiddlyWiki document header area).

Note: this ticket replaces <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/401" title="Linkification: http://trac.tiddlywiki.org/ticket/401">http://trac.tiddlywiki.org/ticket/401</a> (closed), which proposed using a custom [[PageTitle]] tiddler for this purpose.  ''If you were using the previous '401 ~PageTitle' tweak, you will need to rename [[PageTitle]] to [[WindowTitle]] to continue to use your custom window title text''
***/
//{{{
config.shadowTiddlers.WindowTitle='<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>';
window.getPageTitle=function() { return wikifyPlain('WindowTitle'); }
store.addNotification('WindowTitle',refreshPageTitle); // so title stays in sync with tiddler changes
//}}}
// // }}}}}}// // {{block{
/***
!!!784 allow tiddler sections in TiddlyLinks to be used as anchor points for intra-tiddler scrolling.
><a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/784" title="Linkification: http://trac.tiddlywiki.org/ticket/784">http://trac.tiddlywiki.org/ticket/784</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/784" title="Linkification: http://trac.tiddlywiki.org/ticket/784">http://trac.tiddlywiki.org/ticket/784</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/784" title="Linkification: http://trac.tiddlywiki.org/ticket/784">http://trac.tiddlywiki.org/ticket/784</a></a> - OPEN - Please see separate [[SectionLinksPlugin]]
!!!683 FireFox3 Import bug: 'browse' button replacement
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/683" title="Linkification: http://trac.tiddlywiki.org/ticket/683">http://trac.tiddlywiki.org/ticket/683</a> - OPEN
The web standard 'type=file' input control that has been used as a local path/file picker for TiddlyWiki no longer works as expected in FireFox3, which has, for security reasons, limited javascript access to this control so that *no* local filesystem path information can be revealed, even when it is intentional and necessary, as it is with TiddlyWiki.  This tweak provides alternative HTML source that patches the backstage import panel.  It replaces the 'type=file' input control with a text+button combination of controls that invokes a system-native secure 'file-chooser' dialog box to provide TiddlyWiki with access to a complete path+filename so that TW functions properly locate user-selected local files.
>Note: ''This tweak also requires <a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/604" title="Linkification: http://trac.tiddlywiki.org/ticket/604">http://trac.tiddlywiki.org/ticket/604</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/604" title="Linkification: http://trac.tiddlywiki.org/ticket/604">http://trac.tiddlywiki.org/ticket/604</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/604" title="Linkification: http://trac.tiddlywiki.org/ticket/604">http://trac.tiddlywiki.org/ticket/604</a></a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/604" title="Linkification: http://trac.tiddlywiki.org/ticket/604">http://trac.tiddlywiki.org/ticket/604</a>">http://trac.tiddlywiki.org/ticket/604</a> - cross-platform askForFilename()''
***/
//{{{
if (window.Components) {
	var fixhtml='<input name="txtBrowse" style="width:30em"><input type="button" value="..."'
		+' onClick="window.browseForFilename(this.previousSibling,true)">';
	var cmi=config.macros.importTiddlers;
	cmi.step1Html=cmi.step1Html.replace(/<input type='file' size=50 name='txtBrowse'>/,fixhtml);
}

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

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

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

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

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

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

window.coreTweaks_missingMacro_invokeMacro = window.invokeMacro;
window.invokeMacro = function(place,macro,params,wikifier,tiddler) {
	if (!config.macros[macro] || !config.macros[macro].handler)
		if (config.options.chkHideMissingMacros) return;
	window.coreTweaks_missingMacro_invokeMacro.apply(this,arguments);
}
//}}}
// // }}}}}}// // {{block{
/***
!!!608/609/610 toolbars - toggles, separators and transclusion
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/608" title="Linkification: http://trac.tiddlywiki.org/ticket/608">http://trac.tiddlywiki.org/ticket/608</a>" title="Linkification: http://trac.tiddlywiki.org/ticket/608">http://trac.tiddlywiki.org/ticket/608</a> - OPEN (more/less toggle)
<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/609" title="Linkification: http://trac.tiddlywiki.org/ticket/609">http://trac.tiddlywiki.org/ticket/609</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/609" title="Linkification: http://trac.tiddlywiki.org/ticket/609">http://trac.tiddlywiki.org/ticket/609</a>"><a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/609" title="Linkification: http://trac.tiddlywiki.org/ticket/609">http://trac.tiddlywiki.org/ticket/609</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/609" title="Linkification: http://trac.tiddlywiki.org/ticket/609">http://trac.tiddlywiki.org/ticket/609</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/609" title="Linkification: http://trac.tiddlywiki.org/ticket/609">http://trac.tiddlywiki.org/ticket/609</a></a></a> - OPEN (separators)
<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/610" title="Linkification: http://trac.tiddlywiki.org/ticket/610">http://trac.tiddlywiki.org/ticket/610</a> - OPEN (wikify tiddler/slice/section content)

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

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

					this.createCommand(place,c,tiddler,theClass);
				else { // ELS - WIKIFY TIDDLER/SLICE/SECTION (added)
					if (c.substr(0,1)=='~') c=c.substr(1); // ignore leading ~
					var txt=store.getTiddlerText(c);
					if (txt) {
						// trim any leading/trailing newlines
						txt=txt.replace(/^\n*/,'').replace(/\n*$/,'');
						// trim PRE format wrapper if any
						txt=txt.replace(/^\{\{\{\n/,'').replace(/\n\}\}\}$/,'');
						// render content into toolbar
						wikify(txt,createTiddlyElement(place,'span'),null,tiddler);
					}
				} // ELS - end WIKIFY CONTENT
				break;
		}
	}
};
//}}}
// // }}}}}}// // {{block{
/***
!!!529 IE fixup - case-sensitive element lookup of tiddler elements
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a></a>" title="Linkification: <a class="linkification-ext" href="http://trac.tid<a class="linkification-ext" href="http://dlywiki.org/ticket/529" title="Linkification: http://dlywiki.org/ticket/529">dlywiki.org/ticket/529</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a></a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a></a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a></a>"><a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/529" title="Linkification: http://trac.tiddlywiki.org/ticket/529">http://trac.tiddlywiki.org/ticket/529</a>">http://trac.tiddlywiki.org/ticket/529</a></a> - OPEN
This tweak hijacks the standard browser function, document.getElementById(), to work-around the case-INsensitivity error in Internet Explorer (all versions up to and including IE7) //''Note: This tweak is only applied when using IE, and only for lookups of rendered tiddler elements within the containing 'tiddlerDisplay' element.''//
***/
//{{{
if (config.browser.isIE) {
document.coreTweaks_coreGetElementById=document.getElementById;
document.getElementById=function(id) {
	var e=document.coreTweaks_coreGetElementById(id);
	if (!e || !e.parentNode || e.parentNode.id!='tiddlerDisplay') return e;
	for (var i=0; i<e.parentNode.childNodes.length; i++)
		if (id==e.parentNode.childNodes[i].id) return e.parentNode.childNodes[i];
	return null;
};
}
//}}}
// // }}}}}}// // {{block{
/***
!!!471 'creator' field for new tiddlers
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/471" title="Linkification: http://trac.tiddlywiki.org/ticket/471">http://trac.tiddlywiki.org/ticket/471</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/471" title="Linkification: http://trac.tiddlywiki.org/ticket/471">http://trac.tiddlywiki.org/ticket/471</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/471" title="Linkification: http://trac.tiddlywiki.org/ticket/471">http://trac.tiddlywiki.org/ticket/471</a></a> - OPEN
This tweak HIJACKS the core's saveTiddler() function to automatically add a 'creator' field to a tiddler when it is FIRST created. You can use """<<view creator>>""" (or """<<view creator wikified>>""" if you prefer) to show this value embedded directly within the tiddler content, or {{{<span macro="view creator"></span>}}} in the ViewTemplate and/or EditTemplate to display the creator value in each tiddler.
***/
//{{{
// hijack saveTiddler()
TiddlyWiki.prototype.CoreTweaks_creatorSaveTiddler=TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler=function(title,newTitle,newBody,modifier,modified,tags,fields)
{
	var existing=store.tiddlerExists(title);
	var tiddler=this.CoreTweaks_creatorSaveTiddler.apply(this,arguments);
	if (!existing) store.setValue(title,'creator',config.options.txtUserName);
	return tiddler;
}
//}}}
// // }}}}}}
// // closed: won't fix //(leave as core tweaks)//
// // {{block{
/***
!!!637 TiddlyLink tooltip - custom formatting
***/
// // {{groupbox small{
/***
<a class="linkification-ext" href="<a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/637" title="Linkification: http://trac.tiddlywiki.org/ticket/637">http://trac.tiddlywiki.org/ticket/637</a>" title="Linkification: <a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/637" title="Linkification: http://trac.tiddlywiki.org/ticket/637">http://trac.tiddlywiki.org/ticket/637</a>"><a class="linkification-ext" href="http://trac.tiddlywiki.org/ticket/637" title="Linkification: http://trac.tiddlywiki.org/ticket/637">http://trac.tiddlywiki.org/ticket/637</a></a> - CLOSED: WON'T FIX
This tweak modifies the tooltip format that appears when you mouseover a link to a tiddler.  It adds an option to control the date format, as well as displaying the size of the tiddler (in bytes)

Tiddler link tooltip format:
{{stretch{<<option txtTiddlerLinkTootip>>}}}
^^where: %0=title, %1=username, %2=modification date, %3=size in bytes, %4=description slice^^
Tiddler link tooltip date format:
{{stretch{<<option txtTiddlerLinkTooltipDate>>}}}
***/
//{{{
config.messages.tiddlerLinkTooltip='%0 - %1, %2 (%3 bytes) - %4';
config.messages.tiddlerLinkTooltipDate='DDD, MMM DDth YYYY 0hh12:0mm AM';

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

Tiddler.prototype.getSubtitle = function() {
	var modifier = this.modifier;
	if(!modifier) modifier = config.messages.subtitleUnknown;
	var modified = this.modified;
	if(modified) modified = modified.formatString(config.options.txtTiddlerLinkTooltipDate);
	else modified = config.messages.subtitleUnknown;
	var descr=store.getTiddlerSlice(this.title,'Description')||'';
	return config.options.txtTiddlerLinkTootip.format([this.title,modifier,modified,this.text.length,descr]);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!607 add HREF link on permaview command
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/607 - CLOSED: WON'T FIX
This tweak automatically sets the HREF for the 'permaview' sidebar command link so you can use the 'right click' context menu for faster, easier bookmarking.  Note that this does ''not'' automatically set the permaview in the browser's current location URL... it just sets the HREF on the command link.  You still have to click the link to apply the permaview.
***/
//{{{
config.macros.permaview.handler = function(place)
{
	var btn=createTiddlyButton(place,this.label,this.prompt,this.onClick);
	addEvent(btn,'mouseover',this.setHREF);
	addEvent(btn,'focus',this.setHREF);
};
config.macros.permaview.setHREF = function(event){
	var links = [];
	story.forEachTiddler(function(title,element) {
		links.push(String.encodeTiddlyLink(title));
	});
	var newURL=document.location.href;
	var hashPos=newURL.indexOf('#');
	if (hashPos!=-1) newURL=newURL.substr(0,hashPos);
	this.href=newURL+'#'+encodeURIComponent(links.join(' '));
}
//}}}
// // }}}}}}// // {{block{
/***
!!!458 add permalink-like HREFs on internal TiddlyLinks
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/458 - CLOSED: WON'T FIX
This tweak assigns a permalink-like HREF to internal Tiddler links (which normally do not have any HREF defined).  This permits the link's context menu (right-click) to include 'open link in another window/tab' command.  Based on a request from Dustin Spicuzza.
***/
//{{{
window.coreTweaks_createTiddlyLink=window.createTiddlyLink;
window.createTiddlyLink=function(place,title,includeText,theClass,isStatic,linkedFromTiddler,noToggle)
{
	// create the core button, then add the HREF (to internal links only)
	var link=window.coreTweaks_createTiddlyLink.apply(this,arguments);
	if (!isStatic)
		link.href=document.location.href.split('#')[0]+'#'+encodeURIComponent(String.encodeTiddlyLink(title));
	return link;
}
//}}}
// // }}}}}}
// // <<foldHeadings>>
Supervised students (Academic year ''2016-17''):

''Bachelor projects:```A bachelor project is done in two semesters, ~BP1 is the 1st, ~BP2 the 2nd semester.```''
*''~BP1''
**Sčensný Patrik - Interactive data visualization in augmented reality
**Karas Marek - Interactive data visualization in augmented reality
**Daněk Libor - Interactive data visualization in augmented reality
**Čičman Matúš - Interactive graph visualization
**Nagy Martin - Processing documentation from source code
*''~BP2''
**Kristián Klostermann - Interactive  graph visualization 
**Oliver Macko - Interactive  graph visualization 
**Patrik Schwarz - Generating documentation from source code 
''Master theses:```A master thesis is done in three semesters, ~DP1 is the 1st, ~DP2 the 2nd and ~DP3 the 3rd semester.```''
*''~DP2''
**Bc. Štefánik Matúš - Visual representation of program in an innovative IDE
**Bc. Illés Denis - Software visualization in 3D space
**Bc. Marák Juraj - Data visualization and interaction in augmented reality
**Bc. Žigo Tomáš - Program representation using graph structures
*''~DP3''
**Bc. Michal Valovič - Innovations in IDE
<<tiddler HideTiddlerSubtitle>>
!!!Abstract
{{justify{The work deals with the layout of large-scale undirected graphs using graph layout algorithms on GPU. This work deals with analysis of existing graph layout algorithms as well as the problem of parallelism and implementation on the GPU. The main objective of this work is to implement one of the analyzed algorithms on the graphics card and thus speed up its running time and examine the results of this algorithm. The graphs are displayed in three-dimensional space. The resulting application provides visualization of large-scale graphs using force directed algorithm.}}}
!!!Results
{{center{[img(30cm, )[./img/bachelor/2012/sisko/1.png]]
{{center{Sequence showing the layout progress for a uniform cube grid.}}}}}}
{{center{[img(30cm, )[./img/bachelor/2012/sisko/2.png]]
{{center{Sequence showing the layout progress for a test graph.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2012/sisko/3eltfinal.png]]
{{center{The final graph layout.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
@@color:#F00;[closed]@@
!!!Course objective
{{justify{The goal of this course is to familiarize students with the basic and advanced techniques of information visualization and scientific visualization, which are the basis of visual analytics. The students will learn key techniques of the visualization process which includes the preparation and processing of data, visual mapping and the visualization itself, which is useful for a better understanding of large-scale abstract data, scientific data and processes. The course provides a detailed view of visual perception, the visualized data and the actual visualization, interaction and distorting techniques. The students will become familiar with the design process to develop visualization methods and visualization systems, and methods for their evaluation.}}}
!!!Key words
information visualization, scientific visualization, computer graphics
!!!Mode of delivery, planned learning activities and teaching methods:
*lecture: 2 hours weekly (on-site method)
*laboratory/construction practice: 2 hours weekly (on-site method)
*project/semestral paper: 1 hour weekly (on-site method)
!!!Credits allocated:	6
!!!Recommended semester/trimester:	-- not defined --
!!!Level of study:	2.
!!!Prerequisites for registration:	none
!!!Basic reading list	
*WARD, M. -- GRINSTEIN, G. -- KEIM, D. Interactive Data Visualization : Foundations, Techniques, and Applications. Natick: A K Peters,Ltd, 2010. 496 s. ISBN 978-1-56881-473-5.
!!!Assessment methods:
*interim evaluation: presentation (5%), task (5%), semester project (40%)
**obtaining at least 30b is required
*mid-term test (10%)
*final evaluation:  final written exam (40%)
!!!Conditions for completing the course
*fulfill conditions for passing labs
*obtaining at least 56b of the total score

<<tiddler HideTiddlerSubtitle>>
[tag[startup]]
!!Kolaboratívne virtuálne prostredie pre vizualizáciu dát
{{justify{Vizualizácia rozsiahlych informácií môže priniesť nové poznatky. Často sa používajú grafy na reprezentovanie informácií a relácií medzi nimi. Kolaboratívne prehliadanie zobrazených dát môže značne prispieť k rýchlejšiemu pochopeniu. Cieľom práce bude analýza možností kolaboratívnych virtuálnych prostredí a metód pri skúmaní rozsiahlych dát, najmä grafových štruktúr. Súčasťou riešenia bude návrh a vytvorenie prototypu multi-používateľského distribuovaného kolaboratívneho systému, ktorý umožní interaktívne prehliadanie grafových štruktúr. Používatelia sa budú môcť nezávisle pohybovať v spoločnej virtuálnej scéne a prehliadať  grafové štruktúry. Riešenie bude musieť riešiť spôsob vzájomnej synchronizácie zobrazení medzi používateľmi. Problematika kolaboratívneho skúmania grafov v 3D prostredí si bude vyžadovať aj návrh vhodného používateľského rozhrania.}}}
''Literatúra'': Maxfield, J., Fernando, T., and Dew, P. 1998. A Distributed Virtual Environment for Collaborative Engineering. Presence: Teleoper. Virtual Environ. 7, 3 (Jun. 1998), 241-261.
!!Vizualizácia rozsiahlych grafov
{{justify{Rôzne grafové štruktúry našli uplatnenie v mnohých vedných oblastiach. Vizualizácia grafov často poskytne hodnotné poznatky, ktoré by inak boli stratené v rozsiahlych dátach. Zobrazovanie veľmi rozsiahlych grafov nie je triviálne a algoritmy rozmiestňovania grafov sú často výpočtovo náročné. Značné urýchlenie týchto algoritmov možno dosiahnuť implementáciou pomocou grafických akcelerátorov a tzv. GPGPU programovania. Urobte rešerš v oblasti vizualizácie grafov, zamerajte sa na silovo-riadené algoritmy. Navrhnite a implementujte algoritmus rozmiestňovania grafov v 3D priestore pomocou GPU, ktoré bude efektívne pracovať aj pri náhlych zmenách štruktúry grafu vyvolanými používateľom. Riešenie overte vizualizáciou rozsiahlych grafov.}}}
''Literatúra:'' Frishman, Y. and Tal, A. 2007. ~Multi-Level Graph Layout on the GPU. IEEE Transactions on Visualization and Computer Graphics 13, 6, Nov. 2007
!!Vizualizácia softvéru v 3D
{{justify{S narastajúcou zložitosťou vytváraných softvérových systémov rastie aj potreba ich lepšieho porozumenia. Keďže softvér nie je hmatateľný, práve vizualizácia softvéru má za cieľ pomocou interaktívnych zobrazení napomôcť k lepšiemu porozumeniu či už samotného softvéru alebo procesov súvisiacich s vývojom. Softvér však nie je len zdrojový kód ale aj mnoho iných pridružených softvérových artefaktov, ktoré vznikajú počas celého životného cyklu softvéru. Medzi softvérovými artefaktmi existujú rôzne vzťahy, ktoré sa však strácajú pri ukladaní do rôznych súborových formátov. Tieto softvérové artefakty možno reprezentovať pomocou grafových štruktúr. Keďže problematika vizualizácie softvéru je rozsiahla, práca sa môže uberať viacerými smermi.  Základom vizualizácie je extrakcia softvérových artefaktov zo softvéru, prípadne i z procesov súvisiacich s vývojom softvéru, a ich vhodná reprezentácia a uchovávanie v tzv. softvérových archívoch. Získané artefakty možno vizualizovať a zamerať sa na zobrazenie štruktúry softvéru vychádzajúc zo zdrojových kódov, možno vizualizovať beh vykonávania programu alebo vizualizovať vykonané zmeny v softvéri zachytené v revíziách. Cieľom prace bude návrh vlastnej metódy 3D vizualizácie softvérových artefaktov, pričom sa možno zamerať na niektorú spomínanú oblasť vizualizácie softvéru.}}}
''Literatúra:'' Diehl, S.: Software Visualization - Visualizing the Structure, Behaviour and Evolution of Software. ~Springer-Verlag Berlin Heidelberg (2007)
!!Nové prístupy v používateľských rozhraniach IDE
{{justify{V súčasnosti integrované vývojové prostredia poskytujú mnoho zaujímavých funkcií pre uľahčenie programátorských činností. Z rozmachom UML sa vývoj softvéru uberá aj smerom k vizuálnym reprezentáciám, avšak samotné programovanie prebieha stále prevažne textovým spôsobom. Existujúce IDE poskytujú rôzne pohľady na zdrojový kód, no stále prevláda členenie do súborov. Cieľom tejto práce bude preskúmať možnosti iných ako zaužívaných spôsobov prezentovania, prehliadania a modifikovania zdrojových kódov a k nim pridružených softvérových artefaktov. Súčasťou práce bude návrh a vytvorenie prototypu inovatívneho vývojového prostredia v ktorom sa bude experimentovať s rôznymi spôsobmi vizuálnej interakcie inšpirovanými metódami vizualizácie informácií.}}}
''Literatúra:'' Bragdon, A. Et al.: Code bubbles: rethinking the user interface paradigm of integrated development environments, ICSE '10: Proceedings of the 32nd ACM/IEEE International Conference on Software Engineering, 2010, pp 455-464

[[Back to Software Systems Research|Software Systems Research]]

<<tiddler HideTiddlerSubtitle>>
!!Vizualizácia softvéru v 3D priestore
{{justify{S narastajúcou zložitosťou vytváraných softvérových systémov rastie aj potreba ich lepšieho porozumenia. Keďže softvér nie je hmatateľný, práve vizualizácia softvéru má za cieľ pomocou interaktívnych zobrazení napomôcť k lepšiemu porozumeniu či už samotného softvéru alebo procesov súvisiacich s vývojom. Softvér však nie je len zdrojový kód ale aj mnoho iných pridružených softvérových artefaktov, ktoré vznikajú počas celého životného cyklu softvéru. Medzi softvérovými artefaktmi existujú rôzne vzťahy, ktoré sa však strácajú pri ukladaní do rôznych súborových formátov. Tieto softvérové artefakty možno reprezentovať pomocou grafových štruktúr. Keďže problematika vizualizácie softvéru je rozsiahla, práca sa môže uberať viacerými smermi. Základom vizualizácie je extrakcia softvérových artefaktov zo softvéru, prípadne i z procesov súvisiacich s vývojom softvéru, a ich vhodná reprezentácia a uchovávanie v tzv. softvérových archívoch. Získané artefakty možno vizualizovať a zamerať sa na zobrazenie štruktúry softvéru vychádzajúc zo zdrojových kódov, možno vizualizovať beh vykonávania programu alebo vizualizovať vykonané zmeny v softvéri zachytené v revíziách. Cieľom prace bude návrh vlastnej metódy vizualizácie softvérových artefaktov v 3D priestore, pričom sa možno zamerať na niektorú spomínanú oblasť vizualizácie softvéru.}}}
''Literatúra'': Diehl, S.: Software Visualization - Visualizing the Structure, Behaviour and Evolution of Software. ~Springer-Verlag Berlin Heidelberg (2007)
!!Získavanie, spracovanie a prezentovanie softvérových metrík
{{justify{S narastajúcou zložitosťou vytváraných softvérových systémov rastie aj potreba ľahšieho porozumenia softvéru s čím súvisí aj vyhodnocovanie kvality softvéru. Vzniká potreba vytvárať softvérové nástroje, ktoré napomôžu pri vyhodnocovaní kvality zdrojového kódu alebo procesov súvisiacich s vývojom. Softvérové metriky môžu poskytnúť užitočné informácie o zložitosti softvérového návrhu, môžu pomôcť odhaliť chyby v návrhu i implementácii a pod. Softvérové metriky môžu výrazne napomôcť pri generovaní dokumentácie zo zdrojových kódov a obohatiť ju o štatistické informácie, ktoré môžu uľahčiť prezeranie, navigáciu a pochopenie neznámeho zdrojového kódu. Práca so softvérovými metrikami si vyžaduje analýzu softvéru a získanie rôznych štatistických informácií, ktoré treba následne vhodne uchovať. Získané metriky softvéru je možné následne spracovávať rôznymi metódami a algoritmami a získavať tak komplexnejšie metriky opisujúce softvér z abstraktnejšieho pohľadu. Posledným a najdôležitejším krokom je vhodná interaktívna a grafická prezentácia softvérových metrík vo forme grafov, histogramov a pod. Cieľom práce bude návrh vlastnej metódy pre získanie, spracovanie a vizualizáciu softvérových metrík pre zvolený programovací jazyk.}}}
''Literatúra'': M. Termeer, C.F.J. Lange, A. Telea, and M.R.V. Chaudron, Visual exploration of combined architectural and metric information, Visualizing Software for Understanding and Analysis, International Workshop (Los Alamitos, CA, USA), IEEE Computer Society, 2005, p. 11.
!!Inovatívne prístupy v používateľských rozhraniach IDE
{{justify{V súčasnosti integrované vývojové prostredia poskytujú mnoho zaujímavých funkcií pre uľahčenie programátorských činností. Z rozmachom UML sa vývoj softvéru uberá aj smerom k vizuálnym reprezentáciám, avšak samotné programovanie prebieha stále prevažne textovým spôsobom. Existujúce IDE poskytujú rôzne pohľady na zdrojový kód, no stále prevláda členenie do súborov. Cieľom tejto práce bude preskúmať možnosti iných ako zaužívaných spôsobov prezentovania, prehliadania a modifikovania zdrojových kódov a k nim pridružených softvérových artefaktov. Súčasťou práce bude návrh a vytvorenie prototypu inovatívneho vývojového prostredia v ktorom sa bude experimentovať s rôznymi spôsobmi vizuálnej interakcie inšpirovanými metódami vizualizácie informácií.}}}
''Literatúra'': Bragdon, A. et al.: Code bubbles: rethinking the user interface paradigm of integrated development environments, ICSE '10: Proceedings of the 32nd ACM/IEEE International Conference on Software Engineering, 2010, pp 455-464
!!Pokročilé metódy vizualizácie grafov v 3D
{{justify{Rôzne grafové štruktúry našli uplatnenie v mnohých vedných oblastiach. Vizualizácia grafov často poskytne hodnotné poznatky, ktoré by inak boli stratené v rozsiahlych dátach. Zobrazovanie veľmi rozsiahlych grafov nie je triviálne a algoritmy rozmiestňovania grafov sú často výpočtovo náročné. Zobrazovanie grafov je možné pomocou rôznych deterministických alebo silovo-riadených algoritmov. Porozumenie zobrazeného grafu často komplikuje priveľa zobrazených uzlov a hrán, ktoré komplikujú identifikovanie hlavných štruktúr grafu. V súčastnosti sa experimentuje s pokročilými metódami, ktoré kombinujú viaceré prístupy. Ciele práce sa môžu uberať viacerými smermi. Bude možné skúmať napr. možnosti metód zhlukovania uzlov a/alebo hrán grafu, ktoré sprehľadnia vizualizáciu grafu tak aby zároveň umožnili prístup k elementom grafu, ktoré boli zlúčené do zhlukov. Ďalej je možné sa venovať metódam vizualizácie grafov kombinujúce prístupy deterministických a silovo-riadených algoritmov tak, aby navrhnutá metóda poskytovala výhody oboch prístupov, prípadne umožňovala priestorové obmedzenia rozmiestňovania grafu. Navrhnuté riešenie bude overené na sade existujúcich rozsiahlych grafov. }}}
''Literatúra'': Herman, I., et al. Graph visualization and navigation in information visualization: A survey, IEEE Transactions on Visualization and Computer Graphics, vol6. , pp 24-43, 2000

[[Back to Software Systems Research|Software Systems Research]]
[[GettingStarted]]
[[AdvancedOptions]]
[[cookieJar]]
----
<<tiddler ShowPopup with:
	DocumentSetup##cookies ~CookieManager "view/modify option cookie settings" tiddlyLinkExisting auto sticky>>
<<tiddler ShowPopup with:
	DocumentSetup##tweaker ~TiddlerTweaker "view/modify tiddler values" tiddlyLinkExisting auto sticky>>
----
<<tiddler ShowPopup with:
	DocumentSetup##templates templates "list templates" tiddlyLinkExisting auto>>
<<tiddler ShowPopup with:
	DocumentSetup##stylesheets stylesheets "list stylesheets" tiddlyLinkExisting auto>>
<<tiddler ShowPopup with:
	DocumentSetup##menus menus "list menus" tiddlyLinkExisting auto>>/%
!cookies
{{center{
[[Browser cookies:|CookieManagerPlugin]] {{fine{<<option chkAllowBrowserCookies>>enable <<option chkMonitorBrowserCookies>>monitor}}}
{{fine{
----
{{smallform small{<<cookieManager>>}}}
}}}
!tweaker
{{smallform{
<<tiddlerTweaker>>}}}
!templates
<<matchTags "%0" "<br>" sort:title template>>
!stylesheets
<<matchTags "%0" "<br>" sort:title stylesheet>>
!menus
<<matchTags "%0" "<br>" sort:title menu>>
!end
%/
/***
|''Name:''|EasyEditPlugin|
|''Description:''|Lite and extensible Wysiwyg editor for TiddlyWiki.|
|''Version:''|1.3.3|
|''Date:''|Dec 21,2007|
|''Source:''|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>" title="Linkification: <a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>"><a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>"><a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>"><a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>"><a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>"><a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a></a>|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0|
!Demo
*On the plugin [[homepage|<a class="linkification-ext" href="http://visualtw.ouvaton.org/VisualTW.html" title="Linkification: http://visualtw.ouvaton.org/VisualTW.html">http://visualtw.ouvaton.org/VisualTW.html</a>]], see [[WysiwygDemo]] and use the {{{write}}} button.
!Installation
#import the plugin,
#save and reload,
#use the <<toolbar easyEdit>> button in the tiddler's toolbar (in default ViewTemplate) or add {{{easyEdit}}} command in your own toolbar.
! Useful Addons
*[[HTMLFormattingPlugin|<a class="linkification-ext" href="http://www.tiddlytools.com/#HTMLFormattingPlugin" title="Linkification: http://www.tiddlytools.com/#HTMLFormattingPlugin">http://www.tiddlytools.com/#HTMLFormattingPlugin</a>]] to embed wiki syntax in html tiddlers.<<br>>//__Tips__ : When this plugin is installed, you can use anchor syntax to link tiddlers in wysiwyg mode (example : #example). Anchors are converted back and from wiki syntax when editing.//
*[[TaggedTemplateTweak|http://www.TiddlyTools.com/#TaggedTemplateTweak]] to use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values.
!Configuration
|Buttons in the toolbar (empty = all).<<br>>//Example : bold,underline,separator,forecolor//<<br>>The buttons will appear in this order.| <<option txtEasyEditorButtons>>|
|EasyEditor default height | <<option txtEasyEditorHeight>>|
|Stylesheet applied to the edited richtext |[[EasyEditDocStyleSheet]]|
|Template called by the {{{write}}} button |[[EasyEditTemplate]]|
!How to extend EasyEditor
*To add your own buttons, add some code like the following in a systemConfig tagged tiddler (//use the prompt attribute only if there is a parameter//) :
**{{{EditorToolbar.buttons.heading = {label:"H", toolTip : "Set heading level", prompt: "Enter heading level"};}}}
**{{{EditorToolbar.buttonsList +=",heading";}}}
*To get the list of all possible commands, see the documentation of the [[Gecko built-in rich text editor|<a class="linkification-ext" href="http://developer.mozilla.org/en/docs/Midas" title="Linkification: http://developer.mozilla.org/en/docs/Midas">http://developer.mozilla.org/en/docs/Midas</a>]] or the [[IE command identifiers|<a class="linkification-ext" href="http://msdn2.microsoft.com/en-us/library/ms533049.aspx" title="Linkification: http://msdn2.microsoft.com/en-us/library/ms533049.aspx">http://msdn2.microsoft.com/en-us/library/ms533049.aspx</a>]].
*To go further in customization, see [[Link button|EasyEditPlugin-LinkButton]] as an example.
!Code
***/

//{{{

var geckoEditor={};
var IEeditor={};

config.options.txtEasyEditorHeight = config.options.txtEasyEditorHeight ? config.options.txtEasyEditorHeight : "500px";
config.options.txtEasyEditorButtons = config.options.txtEasyEditorButtons ? config.options.txtEasyEditorButtons : "";

// TW2.1.x compatibility
config.browser.isGecko = config.browser.isGecko ? config.browser.isGecko : (config.userAgent.indexOf("gecko") != -1);
config.macros.annotations = config.macros.annotations ? config.macros.annotations : {handler : function() {}}


// EASYEDITOR MACRO

config.macros.easyEdit = {
	handler : function(place,macroName,params,wikifier,paramString,tiddler) {
		var field = params[0];
		var height = params[1] ? params[1] : config.options.txtEasyEditorHeight;
		var editor = field ? new easyEditor(tiddler,field,place,height) : null;
	},
	gather: function(element){
		var iframes = element.getElementsByTagName("iframe");
		if (iframes.length!=1) return null
		var text = "<html>"+iframes[0].contentWindow.document.body.innerHTML+"</html>";
		text = config.browser.isGecko ? geckoEditor.postProcessor(text) : (config.browser.isIE ? IEeditor.postProcessor(text) : text);
		return text;
	}
}

// EASYEDITOR CLASS

function easyEditor(tiddler,field,place,height) {
	this.tiddler = tiddler;
	this.field = field;
	this.browser = config.browser.isGecko ? geckoEditor : (config.browser.isIE ? IEeditor : null);
	this.wrapper = createTiddlyElement(place,"div",null,"easyEditor");
	this.wrapper.setAttribute("easyEdit",this.field);
	this.iframe = createTiddlyElement(null,"iframe");
	this.browser.setupFrame(this.iframe,height,contextualCallback(this,this.onload));
	this.wrapper.appendChild(this.iframe);
}

easyEditor.prototype.onload = function(){
	this.editor = this.iframe.contentWindow;
	this.doc = this.editor.document;
	if (!this.browser.isDocReady(this.doc)) return null;

	if (!this.tiddler.isReadOnly() && this.doc.designMode.toLowerCase()!="on") {
		this.doc.designMode = "on";
		if (this.browser.reloadOnDesignMode) return false;	// IE fire readystatechange after designMode change
	}

	var internalCSS = store.getTiddlerText("EasyEditDocStyleSheet");
	setStylesheet(internalCSS,"EasyEditDocStyleSheet",this.doc);
	this.browser.initContent(this.doc,store.getValue(this.tiddler,this.field));

	var barElement=createTiddlyElement(null,"div",null,"easyEditorToolBar");
	this.wrapper.insertBefore(barElement,this.wrapper.firstChild);
	this.toolbar = new EditorToolbar(this.doc,barElement,this.editor);

	this.browser.plugEvents(this.doc,contextualCallback(this,this.scheduleButtonsRefresh));
	this.editor.focus();
}

easyEditor.SimplePreProcessoror = function(text) {
	var re = /^<html>(.*)<\/html>$/m;
	var htmlValue = re.exec(text);
	var value = (htmlValue && (htmlValue.length>0)) ? htmlValue[1] : text;
	return value;
}

easyEditor.prototype.scheduleButtonsRefresh=function() { //doesn't refresh buttons state when rough typing
	if (this.nextUpdate) window.clearTimeout(this.nextUpdate);
	this.nextUpdate = window.setTimeout(contextualCallback(this.toolbar,EditorToolbar.onUpdateButton),easyEditor.buttonDelay);
}

easyEditor.buttonDelay = 200;

// TOOLBAR CLASS

function EditorToolbar(target,parent,window){
	this.target = target;
	this.window=window;
	this.elements={};
	var row = createTiddlyElement(createTiddlyElement(createTiddlyElement(parent,"table"),"tbody"),"tr");
	var buttons = (config.options.txtEasyEditorButtons ? config.options.txtEasyEditorButtons : EditorToolbar.buttonsList).split(",");
	for(var cpt = 0; cpt < buttons.length; cpt++){
		var b = buttons[cpt];
		var button = EditorToolbar.buttons[b];
		if (button) {
			if (button.separator)
				createTiddlyElement(row,"td",null,"separator").innerHTML+="&nbsp;";
			else {
				var cell=createTiddlyElement(row,"td",null,b+"Button");
				if (button.onCreate) button.onCreate.call(this, cell, b);
				else EditorToolbar.createButton.call(this, cell, b);
			}
		}
	}
}

EditorToolbar.createButton = function(place,name){
	this.elements[name] = createTiddlyButton(place,EditorToolbar.buttons[name].label,EditorToolbar.buttons[name].toolTip,contextualCallback(this,EditorToolbar.onCommand(name)),"button");
}

EditorToolbar.onCommand = function(name){
	var button = EditorToolbar.buttons[name];
	return function(){
		var parameter = false;
		if (button.prompt) {
			var parameter = this.target.queryCommandValue(name);
			parameter = prompt(button.prompt,parameter);
		}
		if (parameter != null) {
			this.target.execCommand(name, false, parameter);
			EditorToolbar.onUpdateButton.call(this);
		}
		return false;
	}
}

EditorToolbar.getCommandState = function(target,name){
	try {return target.queryCommandState(name)}
	catch(e){return false}
}

EditorToolbar.onRefreshButton = function (name){
	if (EditorToolbar.getCommandState(this.target,name)) addClass(this.elements[name].parentNode,"buttonON");
	else removeClass(this.elements[name].parentNode,"buttonON");
	this.window.focus();
}

EditorToolbar.onUpdateButton = function(){
	for (b in this.elements)
		if (EditorToolbar.buttons[b].onRefresh) EditorToolbar.buttons[b].onRefresh.call(this,b);
		else EditorToolbar.onRefreshButton.call(this,b);
}

EditorToolbar.buttons = {
	separator : {separator : true},
	bold : {label:"B", toolTip : "Bold"},
	italic : {label:"I", toolTip : "Italic"},
	underline : {label:"U", toolTip : "Underline"},
	strikethrough : {label:"S", toolTip : "Strikethrough"},
	insertunorderedlist : {label:"\u25CF", toolTip : "Unordered list"},
	insertorderedlist : {label:"1.", toolTip : "Ordered list"},
	justifyleft : {label:"[\u2261", toolTip : "Align left"},
	justifyright : {label:"\u2261]", toolTip : "Align right"},
	justifycenter : {label:"\u2261", toolTip : "Align center"},
	justifyfull : {label:"[\u2261]", toolTip : "Justify"},
	removeformat : {label:"\u00F8", toolTip : "Remove format"},
	fontsize : {label:"\u00B1", toolTip : "Set font size", prompt: "Enter font size"},
	forecolor : {label:"C", toolTip : "Set font color", prompt: "Enter font color"},
	fontname : {label:"F", toolTip : "Set font name", prompt: "Enter font name"},
	heading : {label:"H", toolTip : "Set heading level", prompt: "Enter heading level (example : h1, h2, ...)"},
	indent : {label:"\u2192[", toolTip : "Indent paragraph"},
	outdent : {label:"[\u2190", toolTip : "Outdent paragraph"},
	inserthorizontalrule : {label:"\u2014", toolTip : "Insert an horizontal rule"},
	insertimage : {label:"\u263C", toolTip : "Insert image", prompt: "Enter image url"}
}

EditorToolbar.buttonsList = "bold,italic,underline,strikethrough,separator,increasefontsize,decreasefontsize,fontsize,forecolor,fontname,separator,removeformat,separator,insertparagraph,insertunorderedlist,insertorderedlist,separator,justifyleft,justifyright,justifycenter,justifyfull,indent,outdent,separator,heading,separator,inserthorizontalrule,insertimage";

if (config.browser.isGecko) {
	EditorToolbar.buttons.increasefontsize = {onCreate : EditorToolbar.createButton, label:"A", toolTip : "Increase font size"};
	EditorToolbar.buttons.decreasefontsize = {onCreate : EditorToolbar.createButton, label:"A", toolTip : "Decrease font size"};
	EditorToolbar.buttons.insertparagraph = {label:"P", toolTip : "Format as paragraph"};
}

// GECKO (FIREFOX, ...) BROWSER SPECIFIC METHODS

geckoEditor.setupFrame = function(iframe,height,callback) {
	iframe.setAttribute("style","width: 100%; height:" + height);
	iframe.addEventListener("load",callback,true);
}

geckoEditor.plugEvents = function(doc,onchange){
	doc.addEventListener("keyup", onchange, true);
	doc.addEventListener("keydown", onchange, true);
	doc.addEventListener("click", onchange, true);
}

geckoEditor.postProcessor = function(text){return text};

geckoEditor.preProcessor = function(text){return easyEditor.SimplePreProcessoror(text)}

geckoEditor.isDocReady = function() {return true;}

geckoEditor.reloadOnDesignMode=false;

geckoEditor.initContent = function(doc,content){
	if (content) doc.execCommand("insertHTML",false,geckoEditor.preProcessor(content));
}

// INTERNET EXPLORER BROWSER SPECIFIC METHODS

IEeditor.setupFrame = function(iframe,height,callback) {
	iframe.width="99%";  //IE displays the iframe at the bottom if 100%. CSS layout problem ? I don't know. To be studied...
	iframe.height=height.toString();
	iframe.attachEvent("onreadystatechange",callback);
}

IEeditor.plugEvents = function(doc,onchange){
	doc.attachEvent("onkeyup", onchange);
	doc.attachEvent("onkeydown", onchange);
	doc.attachEvent("onclick", onchange);
}

IEeditor.isDocReady = function(doc){
	if (doc.readyState!="complete") return false;
	if (!doc.body) return false;
	return (doc && doc.getElementsByTagName && doc.getElementsByTagName("head") && doc.getElementsByTagName("head").length>0);
}

IEeditor.postProcessor = function(text){return text};

IEeditor.preProcessor = function(text){return easyEditor.SimplePreProcessoror(text)}

IEeditor.reloadOnDesignMode=true;

IEeditor.initContent = function(doc,content){
	if (content) doc.body.innerHTML=IEeditor.preProcessor(content);
}

function contextualCallback(obj,func){
    return function(){return func.call(obj)}
}

Story.prototype.previousGatherSaveEasyEdit = Story.prototype.previousGatherSaveEasyEdit ? Story.prototype.previousGatherSaveEasyEdit : Story.prototype.gatherSaveFields; // to avoid looping if this line is called several times
Story.prototype.gatherSaveFields = function(e,fields){
	if(e && e.getAttribute) {
		var f = e.getAttribute("easyEdit");
		if(f){
			var newVal = config.macros.easyEdit.gather(e);
			if (newVal) fields[f] = newVal;
		}
		this.previousGatherSaveEasyEdit(e, fields);
	}
}

config.commands.easyEdit={
	text: "write",
	tooltip: "Edit this tiddler in wysiwyg mode",
	readOnlyText: "view",
	readOnlyTooltip: "View the source of this tiddler",
	handler : function(event,src,title) {
		clearMessage();
		var tiddlerElem = document.getElementById(story.idPrefix + title);
		var fields = tiddlerElem.getAttribute("tiddlyFields");
		story.displayTiddler(null,title,"EasyEditTemplate",false,null,fields);
		return false;
	}
}

config.shadowTiddlers.ViewTemplate = config.shadowTiddlers.ViewTemplate.replace(/\+editTiddler/,"+editTiddler easyEdit");

config.shadowTiddlers.EasyEditTemplate = config.shadowTiddlers.EditTemplate.replace(/macro='edit text'/,"macro='easyEdit text'");

config.shadowTiddlers.EasyEditToolBarStyleSheet = "/*{{{*/\n";
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar {font-size:0.8em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".editor iframe {border:1px solid #DDD}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar td{border:1px solid #888; padding:2px 1px 2px 1px; vertical-align:middle}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar td.separator{border:0}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .button{border:0;color:#444}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .buttonON{background-color:#EEE}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar {margin:0.25em 0}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .boldButton {font-weight:bold}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .italicButton .button {font-style:italic;padding-right:0.65em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .underlineButton .button {text-decoration:underline}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .strikeButton .button {text-decoration:line-through}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .unorderedListButton {margin-left:0.7em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .justifyleftButton .button {padding-left:0.1em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .justifyrightButton .button {padding-right:0.1em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .justifyfullButton .button, .easyEditorToolBar .indentButton .button, .easyEditorToolBar .outdentButton .button {padding-left:0.1em;padding-right:0.1em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .increasefontsizeButton .button {padding-left:0.15em;padding-right:0.15em; font-size:1.3em; line-height:0.75em}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .decreasefontsizeButton .button {padding-left:0.4em;padding-right:0.4em; font-size:0.8em;}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .forecolorButton .button {color:red;}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet += ".easyEditorToolBar .fontnameButton .button {font-family:serif}\n" ;
config.shadowTiddlers.EasyEditToolBarStyleSheet +="/*}}}*/";

store.addNotification("EasyEditToolBarStyleSheet", refreshStyles);

config.shadowTiddlers.EasyEditDocStyleSheet = "/*{{{*/\n \n/*}}}*/";
if (config.annotations) config.annotations.EasyEditDocStyleSheet = "This stylesheet is applied when editing a text with the wysiwyg easyEditor";

//}}}
/***
!Link button add-on
***/
//{{{
EditorToolbar.createLinkButton = function(place,name) {
	this.elements[name] = createTiddlyButton(place,EditorToolbar.buttons[name].label,EditorToolbar.buttons[name].toolTip,contextualCallback(this,EditorToolbar.onInputLink()),"button");
}

EditorToolbar.onInputLink = function() {
	return function(){
		var browser = config.browser.isGecko ? geckoEditor : (config.browser.isIE ? IEeditor : null);
		var value = browser ? browser.getLink(this.target) : "";
		value = prompt(EditorToolbar.buttons["createlink"].prompt,value);
		if (value) browser.doLink(this.target,value);
		else if (value=="") this.target.execCommand("unlink", false, value);
		EditorToolbar.onUpdateButton.call(this);
		return false;
	}
}

EditorToolbar.buttonsList += ",separator,createlink";

EditorToolbar.buttons.createlink = {onCreate : EditorToolbar.createLinkButton, label:"L", toolTip : "Set link", prompt: "Enter link url"};


geckoEditor.getLink=function(doc){
	var range=doc.defaultView.getSelection().getRangeAt(0);
	var container = range.commonAncestorContainer;
	var node = (container.nodeType==3) ? container.parentNode : range.startContainer.childNodes[range.startOffset];
	if (node && node.tagName=="A") {
		var r=doc.createRange();
		r.selectNode(node);
		doc.defaultView.getSelection().addRange(r);
		return (node.getAttribute("tiddler") ? "#"+node.getAttribute("tiddler") : node.href);
	}
	else return (container.nodeType==3 ? "#"+container.textContent.substr(range.startOffset, range.endOffset-range.startOffset).replace(/ $/,"") : "");
}

geckoEditor.doLink=function(doc,link){ // store tiddler in a temporary attribute to avoid url encoding of tiddler's name
	var pin = "href"+Math.random().toString().substr(3);
	doc.execCommand("createlink", false, pin);
	var isTiddler=(link.charAt(0)=="#");
	var node = doc.defaultView.getSelection().getRangeAt(0).commonAncestorContainer;
	var links= (node.nodeType!=3) ? node.getElementsByTagName("a") : [node.parentNode];
	for (var cpt=0;cpt<links.length;cpt++)
			if (links[cpt].href==pin){
				links[cpt].href=isTiddler ? "javascript:;" : link;
				links[cpt].setAttribute("tiddler",isTiddler ? link.substr(1) : "");
			}
}

geckoEditor.beforeLinkPostProcessor = geckoEditor.beforelinkPostProcessor ? geckoEditor.beforelinkPostProcessor : geckoEditor.postProcessor;
geckoEditor.postProcessor = function(text){
	return geckoEditor.beforeLinkPostProcessor(text).replace(/<a tiddler="([^"]*)" href="javascript:;">(.*?)(?:<\/a>)/gi,"[[$2|$1]]").replace(/<a tiddler="" href="/gi,'<a href="');
}

geckoEditor.beforeLinkPreProcessor = geckoEditor.beforeLinkPreProcessor ? geckoEditor.beforeLinkPreProcessor : geckoEditor.preProcessor
geckoEditor.preProcessor = function(text){
	return geckoEditor.beforeLinkPreProcessor(text).replace(/\[\[([^|\]]*)\|([^\]]*)]]/g,'<a tiddler="$2" href="javascript:;">$1</a>');
}


IEeditor.getLink=function(doc){
	var node=doc.selection.createRange().parentElement();
	if (node.tagName=="A") return node.href;
	else return (doc.selection.type=="Text"? "#"+doc.selection.createRange().text.replace(/ $/,"") :"");
}

IEeditor.doLink=function(doc,link){
	doc.execCommand("createlink", false, link);
}

IEeditor.beforeLinkPreProcessor = IEeditor.beforeLinkPreProcessor ? IEeditor.beforeLinkPreProcessor : IEeditor.preProcessor
IEeditor.preProcessor = function(text){
	return IEeditor.beforeLinkPreProcessor(text).replace(/\[\[([^|\]]*)\|([^\]]*)]]/g,'<a ref="#$2">$1</a>');
}

IEeditor.beforeLinkPostProcessor = IEeditor.beforelinkPostProcessor ? IEeditor.beforelinkPostProcessor : IEeditor.postProcessor;
IEeditor.postProcessor = function(text){
	return IEeditor.beforeLinkPostProcessor(text).replace(/<a href="#([^>]*)">([^<]*)<\/a>/gi,"[[$2|$1]]");
}

IEeditor.beforeLinkInitContent = IEeditor.beforeLinkInitContent ? IEeditor.beforeLinkInitContent : IEeditor.initContent;
IEeditor.initContent = function(doc,content){
	IEeditor.beforeLinkInitContent(doc,content);
	var links=doc.body.getElementsByTagName("A");
	for (var cpt=0; cpt<links.length; cpt++) {
		links[cpt].href=links[cpt].ref; //to avoid IE conversion of relative URLs to absolute
		links[cpt].removeAttribute("ref");
	}
}

config.shadowTiddlers.EasyEditToolBarStyleSheet += "\n/*{{{*/\n.easyEditorToolBar .createlinkButton .button {color:blue;text-decoration:underline;}\n/*}}}*/";

config.shadowTiddlers.EasyEditDocStyleSheet += "\n/*{{{*/\na {color:#0044BB;font-weight:bold}\n/*}}}*/";

//}}}
<!--{{{-->
<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 macro='tiddler QuickEditToolbar with: show'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}--><span macro='resizeEditor'></span>
!!!Abstract
{{justify{The bachelor project describes existing interactive 3D user interfaces, visualization techniques and methods for manipulating and browsing of multimedia content in 3D space and discusses these solutions for purpose of possible improvment. This project includes survey of methods of organization data in 3D space and available support libraries for developers, too. The result of project is an application Vilcacora for browsing of multimedia content with a support of physical environment and simulation of real actions.}}}
!!!Results
{{center{[img[img/bachelor/2009/kuric/2009_kuric_bc_1.jpg]]}}}
{{center{View to the desktop, loaded images were moved, rotated, resized by user interaction.}}}
{{center{[img[img/bachelor/2009/kuric/2009_kuric_bc_2.jpg]]}}}
{{center{View to scene of picture overview. In the background is desktop with levitating pictures.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
/%
|Name|ExpandSlidersScript|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ExpandSlidersScript" title="Linkification: http://www.TiddlyTools.com/#ExpandSlidersScript">http://www.TiddlyTools.com/#ExpandSlidersScript</a></a>|
|Version|1.1.0|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin NestedSlidersPlugin (optional)|
|Overrides||
|Description|simulateously expand/collapse all nested sliders in a tiddler (or ID'd DOM element)|

Usage:
	<<tiddler ExpandSlidersScript with: elementID expandlabel collapselabel>>
Where elementID is one of:
	""   = the current tiddler
	here = the current container
	ID   = specific DOM element ID (e.g., "mainMenu")

%/<script label="expand" title="expand/collapse sliders">
	var here=story.findContainingTiddler(place)||place.parentNode.parentNode; // tiddler or container
	if ('$1'!='$'+'1' && '$1'.length) {
		if ('$1'=='here') here=place.parentNode.parentNode; // container
		else here=document.getElementById('$1'); // ID
	}
	if (!here) return false;
	var expandlabel='expand'; if ('$2'!='$'+'2') var expandlabel='$2';
	var collapselabel='collapse'; if ('$3'!='$'+'3') var collapselabel='$3';
	var elems=here.getElementsByTagName('*');
	var state=(place.innerHTML.toLowerCase()==expandlabel)?'none':'block';
	for (var e=0; e<elems.length; e++) { var p=elems[e];
		if (p.className!='sliderPanel' || p.style.display!=state) continue;
		if (p.button) window.onClickNestedSlider({target:p.button});
		else p.previousSibling.onclick();
	}
	place.innerHTML=state=='none'?collapselabel:expandlabel;
	return false;
</script><script>
	place.lastChild.style.fontWeight='normal';
	var expandlabel='expand'; if ('$2'!='$'+'2') var expandlabel='$2';
	var collapselabel='collapse'; if ('$3'!='$'+'3') var collapselabel='$3';
	var currlabel=place.lastChild.innerHTML.toLowerCase();
	place.lastChild.innerHTML=expandlabel;
</script>
/***
|Name|FileDropPlugin|
|Source|http://www.TiddlyTools.com/#FileDropPlugin|
|Version|2.1.4|
|Author|BradleyMeck and Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|drag-and-drop files/directories to create tiddlers|
''requires FireFox or another Mozilla-compatible browser.''
!!!!!Usage
<<<
This plugin automatically creates tiddlers from files that are dropped onto an open TiddlyWiki document.  You can drop multiple selected files and/or folders to create many tiddlers at once.  New tiddler titles are created using the filename of each dropped file (i.e., omitting the path).  If a title is already in use, you are prompted to enter a new title for that file.  If you drop a folder, you will be asked if you want to create a simple 'directory list' of files in a single tiddler or create one tiddler for each file in that folder.

By default, it is assumed that all dropped files contain text.  However, if [[AttachFilePlugin]], [[AttachFilePluginFormatters]] and [[AttachFileMIMETypes]] are installed, then you can drop ''//binary data files//'' as well as text files.  If the MIME type of a dropped file is not "text/plain", then AttachFilePlugin is used to create an 'attachment' tiddler, rather than creating a simple text tiddler.

When creating text tiddlers, you can embed a //link// to the original external file at the top of the new tiddler, in addition to (or instead of) the text content itself.  The format for this link (see Configuration, below) uses embedded ''//replacement markers//'' that allow you to generate a variety of wiki-formatted output, where:
*%0 = filename (without path)
*%1 = local """file://...""" URL
*%2 = local path and filename (OS-native format)
*%3 = relative path (if subdirectory of current document directory)
*%4 = file size
*%5 = file date
*%6 = current date
*%7 = current ~TiddlyWiki username
*\n = newline
By default, the link format uses the filename (%0) and local URL (%1), enclosed within a //hidden section// syntax, like this:
{{{
/%
!link
[[%0|%1]]
!end
%/
}}}
This permits the link to be embedded along with the text content, without changing the appearance of that content when the tiddler is viewed.  To display the link in your tiddler content, use:
{{{
<<tiddler TiddlerName##link>>
}}}
<<<
!!!!!Configuration
<<<
__FileDropPlugin options:__
<<option chkFileDropContent>>Copy file content into tiddlers if smaller than: <<option txtFileDropDataLimit>> bytes
&nbsp; //(note: excess text content will be truncated, oversized binary files will skipped, 0=no limit)//
<<option chkFileDropLink>>Generate external links to files, using this format:{{editor{<html><nowiki><textarea rows="4" onchange="
config.macros.option.propagateOption('txtFileDropLinkFormat','value',this.value.escapeLineBreaks(),'input');
"></textarea></html><<tiddler {{
	var ta=place.lastChild.getElementsByTagName('textarea')[0];
	var v=config.options.txtFileDropLinkFormat.unescapeLineBreaks();
	ta.value=v;
"";}}>>}}}<<option chkFileDropTrimFilename>>Omit file extensions from tiddler titles
<<option chkFileDropDisplay>>Automatically display newly created tiddlers
Tag newly created tiddlers with: <<option txtFileDropTags>>

__FileDropPlugin+AttachFilePlugin options:__ //(binary file data as encoded 'base64' text)//
<<option chkFileDropAttachLocalLink>> attachment includes reference to local path/filename
>Note: if the plugin does not seem to work, enter ''about:config'' in the Firefox address bar, and make sure that {{{signed.applets.codebase_principal_support}}} is set to ''true''
<<<
!!!!!Examples (custom handler functions)
<<<
Adds a single file with confirmation and prompting for title:
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
	function(nsiFile) {
		var msg='You have dropped the file:\n'
			+nsiFile.path+'\n'
			+'onto the page, it will be imported as a tiddler. Is that ok?'
		if(confirm(msg)) {
			var newDate = new Date();
			var title = prompt('what would you like to name the tiddler?');
			store.saveTiddler(title,title,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
		}
		return true;
	});
}}}
Adds a single file without confirmation, using path/filename as tiddler title:
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
	function(nsiFile) {
		var newDate = new Date();
		store.saveTiddler(nsiFile.path,nsiFile.path,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
		story.displayTiddler(null,nsiFile.path)
		return true;
	});
}}}
<<<
!!!!!Revisions
<<<
2010.03.06 2.1.4 added event listener for 'dragover' (for FireFox 3.6+)
2009.10.10 2.1.3 fixed IE code error
2009.10.08 2.1.2 fixed chkFileDropContent bypass handling for binary attachments
2009.10.07 2.1.0 added chkFileDropContent and chkFileDropLink/txtFileDropLinkFormat
2009.08.19 2.0.0 fixed event listener registration for FireFox 3.5+.  Also, merged with FileDropPluginConfig, with code cleanup/reduction
2008.08.11 1.5.1 added chkFileDropAttachLocalLink option to allow suppression of local path/file link
2007.xx.xx *.*.* add suspend/resume of notifications to improve performance when multiple files are handled
2007.01.01 0.9.9 extensions for AttachFilePlugin
2006.11.04 0.1.1 initial release by Bradley Meck
<<<
!!!!!Code
***/
//{{{
version.extensions.FileDropPlugin={major:2, minor:1, revision:4, date: new Date(2010,3,6)};

config.macros.fileDrop = {
	customDropHandlers: [],
	addEventListener: function(paramflavor,func,inFront) {
		var obj={}; obj.flavor=paramflavor; obj.handler=func;
		if (!inFront) this.customDropHandlers.push(obj);
		else this.customDropHandlers.shift(obj);
	},
	dragDropHandler: function(evt) {
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var dragService = Components.classes['@mozilla.org/widget/dragservice;1'].getService(Components.interfaces.nsIDragService);
		var dragSession = dragService.getCurrentSession();
		var transferObject = Components.classes['@mozilla.org/widget/transferable;1'].createInstance();
		transferObject = transferObject.QueryInterface(Components.interfaces.nsITransferable);
		transferObject.addDataFlavor('application/x-moz-file');
		var numItems = dragSession.numDropItems;
		if (numItems>1) {
			clearMessage();
			displayMessage('Reading '+numItems+' files...');
			store.suspendNotifications();
		}
		for (var i = 0; i < numItems; i++) {
			dragSession.getData(transferObject, i);
			var dataObj = {};
			var dropSizeObj = {};
			for(var ind=0; ind<config.macros.fileDrop.customDropHandlers.length; ind++) {
				var item = config.macros.fileDrop.customDropHandlers[ind];
				if(dragSession.isDataFlavorSupported(item.flavor)) {
					transferObject.getTransferData(item.flavor, dataObj, dropSizeObj);
					var droppedFile = dataObj.value.QueryInterface(Components.interfaces.nsIFile);
					var result = item.handler.call(item,droppedFile);
					evt.stopPropagation();
					evt.preventDefault();
					if (result) break;
				}
			}
		}
		if (numItems>1) {
			store.resumeNotifications();
			store.notifyAll();
			displayMessage(numItems+' files have been processed');
		}
	}
}
//}}}
/***
!!!!!window event handlers
***/
//{{{
if(!window.event) {
	window.addEventListener('dragdrop',	// FireFox3.1-
		config.macros.fileDrop.dragDropHandler, true);
	window.addEventListener('drop',		// FireFox3.5+
		config.macros.fileDrop.dragDropHandler, true);
	window.addEventListener('dragover',	// FireFox3.6+
		function(e){e.stopPropagation();e.preventDefault();}, true);
}
//}}}
/***
!!!!!handler for files, directories and binary attachments (see [[AttachFilePlugin]])
***/
//{{{
var defaults={
	chkFileDropDisplay:		true,
	chkFileDropTrimFilename:	false,
	chkFileDropContent:		true,
	chkFileDropLink:		true,
	txtFileDropLinkFormat:		'/%\\n!link\\n[[%0|%1]]\\n!end\\n%/',
	txtFileDropDataLimit:		'32768',
	chkFileDropAttachLocalLink:	true,
	txtFileDropTags:		''
};
for (var id in defaults) if (config.options[id]===undefined)
	config.options[id]=defaults[id];

config.macros.fileDrop.addEventListener('application/x-moz-file',function(nsiFile) {
	var co=config.options; // abbrev
	var header='Index of %0\n^^(as of %1)^^\n|!filename| !size | !modified |\n';
	var item='|[[%0|%1]]| %2|%3|\n';
	var footer='Total of %0 bytes in %1 files\n';
	var now=new Date();
	var files=[nsiFile];
	if (nsiFile.isDirectory()) {
		var folder=nsiFile.directoryEntries;
		var files=[];
		while (folder.hasMoreElements()) {
			var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
			if (f instanceof Components.interfaces.nsILocalFile && !f.isDirectory()) files.push(f);
		}
		var msg=nsiFile.path.replace(/\\/g,'/')+'\n\n';
		msg+='contains '+files.length+' files... ';
		msg+='select OK to attach all files or CANCEL to create a list...';
		if (!confirm(msg)) { // create a list in a tiddler
			var title=nsiFile.leafName; // tiddler name is last directory name in path
			while (title && title.length && store.tiddlerExists(title)) {
				if (confirm(config.messages.overwriteWarning.format([title]))) break;
				title=prompt('Enter a new tiddler title',nsiFile.path.replace(/\\/g,'/'));
			}
			if (!title || !title.length) return true; // cancelled
			var text=header.format([nsiFile.path.replace(/\\/g,'/'),now.toLocaleString()]);
			var total=0;
			for (var i=0; i<files.length; i++) { var f=files[i];
				var name=f.leafName;
				if (co.chkFileDropTrimFilename)
					{ var p=name.split('.'); if (p.length>1) p.pop(); name=p.join('.'); }
				var path='file:///'+f.path.replace(/\\/g,'/');
				var size=f.fileSize; total+=size;
				var when=new Date(f.lastModifiedTime).formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
				text+=item.format([name,path,size,when]);
			}
			text+=footer.format([total,files.length]);
			var newtags=co.txtFileDropTags?co.txtFileDropTags.readBracketedList():[];
			store.saveTiddler(null,title,text,co.txtUserName,now,newtags);
			if (co.chkFileDropDisplay) story.displayTiddler(null,title);
			return true;
		}
	}
	if (files.length>1) store.suspendNotifications();
	for (i=0; i<files.length; i++) {
		var file=files[i];
		if (file.isDirectory()) continue; // skip over nested directories
		var type='text/plain';
		var title=file.leafName; // tiddler name is file name
		if (co.chkFileDropTrimFilename)
			{ var p=title.split('.'); if (p.length>1) p.pop(); title=p.join('.'); }
		var name=file.leafName;
		var path=file.path;
		var url='file:///'+path.replace(/\\/g,'/');
		var size=file.fileSize;
		var when=new Date(file.lastModifiedTime);
		var now=new Date();
		var who=config.options.txtUserName;
		var h=document.location.href;
		var cwd=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf('/')+1)));
		var relpath=path.startsWith(cwd)?'./'+path.substr(cwd.length):path;
		while (title && title.length && store.tiddlerExists(title)) {
			if (confirm(config.messages.overwriteWarning.format([title]))) break;
			title=prompt('Enter a new tiddler title',path.replace(/\\/g,'/'));
		}
		if (!title || !title.length) continue; // cancelled
		if (config.macros.attach) {
			type=config.macros.attach.getMIMEType(name,'');
			if (!type.length)
				type=prompt('Unknown file type.  Enter a MIME type','text/plain');
			if (!type||!type.length) continue; // cancelled
		}
		var newtags=co.txtFileDropTags?co.txtFileDropTags.readBracketedList():[];
		if (type=='text/plain' || !co.chkFileDropContent) {
			var txt=''; var fmt=co.txtFileDropLinkFormat.unescapeLineBreaks();
			if (co.chkFileDropLink) txt+=fmt.format([name,url,path,relpath,size,when,now,who]);
			if (co.chkFileDropContent) {
				var out=loadFile(path); var lim=co.txtFileDropDataLimit;
				txt+=co.txtFileDropDataLimit?out.substr(0,lim):out;
				if (size>lim) txt+='\n----\nfilesize ('+size+')'
					+' is larger than FileDrop limit ('+lim+')...\n'
					+'additional content has been omitted';
			}
			store.saveTiddler(null,title,txt,co.txtUserName,now,newtags);
		} else {
			var embed=co.chkFileDropContent
				&& (!co.txtFileDropDataLimit||size<co.txtFileDropDataLimit);
			newtags.push('attachment'); newtags.push('excludeMissing');
			config.macros.attach.createAttachmentTiddler(path,
				now.formatString(config.macros.timeline.dateFormat),
				'attached by FileDropPlugin', newtags, title,
				embed, co.chkFileDropAttachLocalLink, false,
				relpath, '', type,!co.chkFileDropDisplay);
		}
		if (co.chkFileDropDisplay) story.displayTiddler(null,title);
	}
	if (files.length>1) { store.resumeNotifications(); store.notifyAll(); }
	return true;
})
//}}}
/***
|''Name:''|FootnotesPlugin|
|''Description:''|Create automated tiddler footnotes.|
|''Author:''|Saq Imtiaz ( <a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a>" title="Linkification: <a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a>"><a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a></a>" title="Linkification: <a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a>"><a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a></a>" title="Linkification: <a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a>"><a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a></a>" title="Linkification: <a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a>"><a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a></a>" title="Linkification: <a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">mailto:lewcid@gmail.com</a>"><a class="linkification-ext" href="mailto:lewcid@gmail.com" title="Linkification: mailto:lewcid@gmail.com">lewcid@gmail.com</a></a> )|
|''Source:''|<a class="linkification-ext" href="http://tw.lewcid.org/#FootnotesPlugin" title="Linkification: http://tw.lewcid.org/#FootnotesPlugin">http://tw.lewcid.org/#FootnotesPlugin</a>|
|''Code Repository:''|<a class="linkification-ext" href="http://tw.lewcid.org/svn/plugins" title="Linkification: http://tw.lewcid.org/svn/plugins">http://tw.lewcid.org/svn/plugins</a>|
|''Version:''|2.01|
|''Date:''|10/25/07|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|

!!Usage:
*To create a footnote, just put the footnote text inside triple backticks.
*Footnotes are numbered automatically, and listed at the bottom of the tiddler.
*{{{Creating a footnote is easy. ```This is the text for my footnote```}}}
*[[Example|FootnotesDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.footnotesPlugin = {
	backLabel: "back",
	prompt:"show footnote"
};

config.formatters.unshift( {
    name: "footnotes",
    match: "```",
    lookaheadRegExp: /```((?:.|\n)*?)```/g,
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
            {
			var tiddler = story.findContainingTiddler(w.output);
			if (!tiddler.notes)
				tiddler.notes = [];
			var title = tiddler.getAttribute("tiddler");
			tiddler.notes.pushUnique(lookaheadMatch[1]);
			var pos = tiddler.notes.indexOf(lookaheadMatch[1]) + 1;
			createTiddlyButton(w.output,pos,config.footnotesPlugin.prompt,function(){var x = document.getElementById(title+"ftn"+pos);window.scrollTo(0,ensureVisible(x)+(ensureVisible(x)<findScrollY()?(findWindowHeight()-x.offsetHeight):0));return false;},"ftnlink",title+"ftnlink"+pos);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
            }
    }
});

old_footnotes_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force)
{
    var tiddler = old_footnotes_refreshTiddler.apply(this,arguments);
	if (tiddler.notes && tiddler.notes.length)
	{
		var holder = createTiddlyElement(null,"div",null,"footnoteholder");
		var list = createTiddlyElement(holder,"ol",title+"footnoteholder");
		for (var i=0; i<tiddler.notes.length; i++)
		{
			var ftn = createTiddlyElement(list,"li",title+"ftn"+(i+1),"footnote");
			wikify(tiddler.notes[i]+" ",ftn);
			createTiddlyButton(ftn,"["+config.footnotesPlugin.backLabel+"]",config.footnotesPlugin.backLabel,function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ftn","ftnlink"))));return false;},"ftnbklink");
		}
		var count = tiddler.childNodes.length;
		for (var j=0; j<count; j++){
			if(hasClass(tiddler.childNodes[j],"viewer")){
				var viewer = tiddler.childNodes[j];
			}
		}
		viewer.appendChild(holder);
		tiddler.notes = [];
	}
    return tiddler;
};

setStylesheet(
".tiddler a.ftnlink {vertical-align: super; font-size: 0.8em; color:red;}\n"+
".tiddler a.ftnlink:hover, .tiddler .footnoteholder a.ftnbklink:hover{color:#fff;background:red;}\n"+
".tiddler div.footnoteholder{margin:1.8em 1.0em; padding:0.1em 1.0em 0.1em 1.0em ;border-left: 1px solid #ccc;}"+
".tiddler footnoteholder ol {font-size: 0.9em; line-height: 1.2em;}\n"+
".tiddler .footnoteholder li.footnote {margin: 0 0 5px 0;}\n"+
".tiddler .footnoteholder a.ftnbklink{color:red;}\n","FootNotesStyles");
//!END-PLUGIN-CODE
// %/
!!!Abstract
{{justify{This work deals with the problematics of generating documentation from source code. There are several tools and technologies used in this area. We focus also on the problem of source code analysis and its main types. This work analyzes common techniques like, pretty printing and syntax highlighting, but also describes less common approaches like literate programming. Several existing tools are described and compared. The main goal of this thesis was to develop new features to the existing tool ~LuaDoc. We added functionality to generate global indexes of functions, added pretty printed source code and augmented the generated documentation with basic source code metrics. All added functionality was developed upon parsing expression grammars.}}}
!!!Results
{{center{[img[img/bachelor/2010/duchon/2010_duchon_bc.jpg]]}}}
{{center{Documentation of example file.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Presented thesis deals primarily with graph visualization in 3D space and mentions some information about 2D graph layouts, because these topics are close. There are possibilities to combine existing deterministic and force-directed algorithms. Also layout constraints could be added. The goal of this thesis is to experiment with these possibilities. Graph gets concrete look, instead of abstract one, by applying good designed algorithms. Then graph becomes more readable. This thesis is focused on layered drawing on surface and joining these surfaces together.
}}}
!!!Results
{{center{[img(20cm, )[./img/bachelor/2013/brndiarova/1.png]]
{{center{Graph visualization using force-based algorithm - no restrictions.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2013/brndiarova/2.png]]
{{center{Example of a small tree restricted to a cone.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2013/brndiarova/3.png]]
{{center{Example of a small tree with layer restrictions.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2013/brndiarova/4.png]]
{{center{Cone tree like layout achieved through restricting the force-based algorithm.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2013/brndiarova/5.png]]
{{center{Example of combining the layer and the sphere restrictions.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
''__The following [[setup instructions|GettingStarted]] outline the basic steps for configuring your own copy of this document:__''
{{big{
# get a copy<br>{{normal{
Begin by transferring a copy of this ~QuickStart&trade; document onto your own computer:
{{center{@@font-size:200%;line-height:120%;[[download now!|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a>" title="Linkification: <a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.tiddlytools.com/download.php?file=quickstart/basics.html" title="Linkification: http://www.tiddlytools.com/download.php?file=quickstart/basics.html">http://www.tiddlytools.com/download.php?file=quickstart/basics.html</a></a>]]@@}}}}}}
# open local copy<br>{{normal{After the file is saved to your filesystem, close ''//this//'' browser/tab window and ''open the //local// file you just saved''.}}}
# set titles and menus<br>{{normal{Change content in SiteTitle, SiteSubtitle, and MainMenu}}}
# set default tiddlers<br>{{normal{Edit [[DefaultTiddlers]] to select which tiddlers will be displayed at startup.  The current definition is: {{block{<<wikify "{{{\n%0\n}}}\n" {{store.getTiddlerText("DefaultTiddlers")}}>>Note: the {{{[tag[startup]]}}} syntax automatically includes all tiddlers tagged with<<tag startup>>(if any).  This allows you to quickly add/remove individual tiddlers from the initial display simply by setting/clearing the<<tag startup>>tag on those tiddlers, rather than manually editing the list in DefaultTiddlers.
}}}}}}
# set styles //(optional)//<br>{{normal{If desired, edit the StyleSheet to suit your aesthetic sensibilities}}}
# set preferences //(optional)//<br>{{normal{If desired, edit the [[cookieJar]] to add, remove, or adjust hard-coded plugin preferences (see individual plugins for details).  Current settings are:{{block{
<<tiddler cookieJar>>}}}}}}
# done<br>{{normal{''That's it!''... after you save-and-reload your document, it will be ready to use.}}}
}}}
/***
|Name|GotoPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPlugin" title="Linkification: http://www.TiddlyTools.com/#GotoPlugin">http://www.TiddlyTools.com/#GotoPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#GotoPluginInfo" title="Linkification: http://www.TiddlyTools.com/#GotoPluginInfo">http://www.TiddlyTools.com/#GotoPluginInfo</a>|
|Version|1.9.2|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!Documentation
>see [[GotoPluginInfo]]
!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!Revisions
<<<
2009.05.22 [1.9.2] use reverseLookup() for IncludePlugin
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!Code
***/
//{{{
version.extensions.GotoPlugin= {major: 1, minor: 9, revision: 2, date: new Date(2009,5,22)};

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

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

config.macros.gotoTiddler= {
	listMaxSize: 10,
	listHeading: 'Found %0 matching title%1...',
	searchItem: "Search for '%0'...",
	handler:
	function(place,macroName,params,wikifier,paramString,tiddler) {
		var quiet	=params.contains("quiet");
		var showlist	=params.contains("showlist");
		var search	=params.contains("search");
		params = paramString.parseParams("anon",null,true,false,false);
		var instyle	=getParam(params,"inputstyle","");
		var liststyle	=getParam(params,"liststyle","");
		var filter	=getParam(params,"filter","");
		var html=this.html;
		var keyevent=window.event?"onkeydown":"onkeypress"; // IE event fixup for ESC handling
		html=html.replace(/%keyevent%/g,keyevent);
		html=html.replace(/%search%/g,search);
		html=html.replace(/%quiet%/g,quiet);
		html=html.replace(/%showlist%/g,showlist);
		html=html.replace(/%display%/g,showlist?'block':'none');
		html=html.replace(/%position%/g,showlist?'static':'absolute');
		html=html.replace(/%instyle%/g,instyle);
		html=html.replace(/%liststyle%/g,liststyle);
		html=html.replace(/%filter%/g,filter);
		if (config.browser.isIE) html=this.IEtableFixup.format([html]);
		var span=createTiddlyElement(place,'span');
		span.innerHTML=html; var form=span.getElementsByTagName("form")[0];
		if (showlist) this.fillList(form.list,'',filter,search,0);
	},
	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
			title="Enter title text... ENTER=goto, SHIFT-ENTER=search for text, DOWN=select from list"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list,%search%,%showlist%);"\
			onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,%quiet%,%search%,%showlist%);">\
		<select name=list style="display:%display%;position:%position%;%liststyle%"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=%showlist%?\'block\':\'none\';"\
			%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%showlist%);"\
			onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%showlist%);">\
		</select><input name="filter" type="hidden" value="%filter%">\
	</form>',
	IEtableFixup:
	"<table style='width:100%;display:inline;padding:0;margin:0;border:0;'>\
		<tr style='padding:0;margin:0;border:0;'><td style='padding:0;margin:0;border:0;'>\
		%0</td></tr></table>",
	getItems:
	function(list,val,filter) {
		if (!list.cache || !list.cache.length || val.length<=config.options.txtIncrementalSearchMin) {
			// starting new search, fetch and cache list of tiddlers/shadows/tags
			list.cache=new Array();
			if (filter.length) {
				var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
				var tiddlers=store.sortTiddlers(fn.apply(store,[filter]),'title');
			} else
				var tiddlers=store.reverseLookup('tags','excludeLists');
			for(var t=0; t<tiddlers.length; t++) list.cache.push(tiddlers[t].title);
			if (!filter.length) {
				for (var t in config.shadowTiddlers) list.cache.pushUnique(t);
				var tags=store.getTags();
				for(var t=0; t<tags.length; t++) list.cache.pushUnique(tags[t][0]);
			}
		}
		var found = [];
		var match=val.toLowerCase();
		for(var i=0; i<list.cache.length; i++)
			if (list.cache[i].toLowerCase().indexOf(match)!=-1) found.push(list.cache[i]);
		return found;
	},
	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag
	},
	fillList:
	function(list,val,filter,search,key) {
		if (list.style.display=="none") return; // not visible... do nothing!
		var indent='\xa0\xa0\xa0';
		var found = this.getItems(list,val,filter); // find matching items...
		found.sort(); // alpha by title
		while (list.length > 0) list.options[0]=null; // clear list
		var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
		list.options[0]=new Option(hdr,"",false,false);
		for (var t=0; t<found.length; t++) list.options[list.length]=
			new Option(indent+found[t]+this.getItemSuffix(found[t]),found[t],false,false);
		if (search)
			list.options[list.length]=new Option(this.searchItem.format([val]),"*",false,false);
		list.size=(list.length<this.listMaxSize?list.length:this.listMaxSize); // resize list...
		list.selectedIndex=key==38?list.length-1:key==40?1:0;
	},
	keyProcessed:
	function(ev) { // utility function
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},
	inputEscKeyHandler:
	function(event,here,list,search,showlist) {
		if (event.keyCode==27) {
			if (showlist) { // clear input, reset list
				here.value=here.defaultValue;
				this.fillList(list,'',here.form.filter.value,search,0);
			}
			else if (list.style.display=="none") // clear input
				here.value=here.defaultValue;
			else list.style.display="none"; // hide list
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},
	inputKeyHandler:
	function(event,here,quiet,search,showlist) {
		var key=event.keyCode;
		var list=here.form.list;
		var filter=here.form.filter;
		// non-printing chars bubble up, except for a few:
		if (key<48) switch(key) {
			// backspace=8, enter=13, space=32, up=38, down=40, delete=46
			case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
		}
		// blank input... if down/enter... fall through (list all)... else, and hide or reset list
		if (!here.value.length && !(key==40 || key==13)) {
			if (showlist) this.fillList(here.form.list,'',here.form.filter.value,search,0);
			else list.style.display="none";
			return this.keyProcessed(event);
		}
		// hide list if quiet, or below input minimum (and not showlist)
		list.style.display=(!showlist&&(quiet||here.value.length<config.options.txtIncrementalSearchMin))?'none':'block';
		// non-blank input... enter=show/create tiddler, SHIFT-enter=search for text
		if (key==13 && here.value.length) return this.processItem(event.shiftKey?'*':here.value,here,list,showlist);
		// up or down key, or enter with blank input... shows and moves to list...
		if (key==38 || key==40 || key==13) { list.style.display="block"; list.focus(); }
		this.fillList(list,here.value,filter.value,search,key);
		return true; // key bubbles up
	},
	selectKeyHandler:
	function(event,list,editfield,showlist) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display=showlist?'block':'none'; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,showlist); return this.keyProcessed(event); }
		return true; // key bubbles up
	},
	processItem:
	function(title,here,list,showlist) {
		if (!title.length) return;
		list.style.display=showlist?'block':'none';
		if (title=="*")	{ story.search(here.value); return false; } // do full-text search
		if (!showlist) here.value=title;
		story.displayTiddler(null,title); // show selected tiddler
		return false;
	}
}
//}}}
/***
|Name|HTMLFormattingPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPlugin" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPlugin">http://www.TiddlyTools.com/#HTMLFormattingPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#HTMLFormattingPluginInfo" title="Linkification: http://www.TiddlyTools.com/#HTMLFormattingPluginInfo">http://www.TiddlyTools.com/#HTMLFormattingPluginInfo</a>|
|Version|2.4.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2009.01.05 [2.4.0] in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 4, revision: 0, date: new Date(2009,1,5)};

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

// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode,w)
{
	function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
	switch (theNode.nodeName.toLowerCase()) {
		case 'style': case 'option': case 'select':
			theNode.innerHTML=unmask(theNode.innerHTML);
			break;
		case 'textarea':
			theNode.value=unmask(theNode.value);
			break;
		case '#text':
			var txt=unmask(theNode.nodeValue);
			var newNode=createTiddlyElement(null,"span");
			theNode.parentNode.replaceChild(newNode,theNode);
			wikify(txt,newNode,highlightHack,w.tiddler);
			break;
		default:
			for (var i=0;i<theNode.childNodes.length;i++)
				wikifyTextNodes(theNode.childNodes.item(i),w); // recursion
			break;
	}
}
//}}}
/%
|Name|HideTiddlerBackground|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerBackground" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerBackground">http://www.TiddlyTools.com/#HideTiddlerBackground</a></a>|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's background and border (if any)|

Usage: <<tiddler HideTiddlerBackground>>

%/<script>
	var t=story.findContainingTiddler(place);
	if (!t || t.id=="HideTiddlerBackground") return;
	var nodes=t.getElementsByTagName("*");
	for (var i=0; i<nodes.length; i++) if (hasClass(nodes[i],"viewer")) {
		var s=nodes[i].style;
		s.backgroundImage="none";
		s.backgroundColor="transparent"
		s.borderColor="transparent";
		s.borderWidth=0;
		s.margin=0;
		s.padding=0;
		break;
	}
</script>
/%
!info
|Name|HideTiddlerSubtitle|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerSubtitle" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerSubtitle">http://www.TiddlyTools.com/#HideTiddlerSubtitle</a></a>|
|Version|2.0.1|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|hide a tiddler's subtitle (date and author)|
Usage:
<<<
{{{
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerSubtitle with: TiddlerTitle>>
}}}
<<<
!end
!show
<<tiddler {{
	var title="$1";
	if (title=='$'+'1')
		title=(story.findContainingTiddler(place)||place).getAttribute('tiddler')||'';
	var t=story.getTiddler(title); if (t) {
		var e=t.getElementsByTagName('*');
		for (var i=0; i<e.length; i++)
			if (hasClass(e[i],'subtitle')) e[i].style.display='none';
	}
'';}}>>
!end
%/<<tiddler {{
	var src='HideTiddlerSubtitle';
	src+(tiddler&&tiddler.title==src?'##info':'##show');}}
with: [[$1]]>>
/%
|Name|HideTiddlerTags|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#HideTiddlerTags" title="Linkification: http://www.TiddlyTools.com/#HideTiddlerTags">http://www.TiddlyTools.com/#HideTiddlerTags</a></a>|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's tagged/tagging display elements|

Usage: <<tiddler HideTiddlerTags>>

%/<script>
	var t=story.findContainingTiddler(place);
	if (!t || t.id=="tiddlerHideTiddlerTags") return;
	var nodes=t.getElementsByTagName("div");
	for (var i=0; i<nodes.length; i++)
		if (hasClass(nodes[i],"tagged"))
			nodes[i].style.display="none";
</script>
{{floatleft{[[basics|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/quickstart/basics.html" title="Linkification: http://www.TiddlyTools.com/quickstart/basics.html">http://www.TiddlyTools.com/quickstart/basics.html</a></a>]]&nbsp;}}}
[closed]

All information related to HCI course is available...
[[Special assignments]] must be discussed in the first/second week of semester.
<<tiddler HideTiddlerSubtitle>>
/***
|Name|ImageSizePlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ImageSizePlugin" title="Linkification: http://www.TiddlyTools.com/#ImageSizePlugin">http://www.TiddlyTools.com/#ImageSizePlugin</a></a>|
|Version|1.2.1|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|adds support for resizing images|
This plugin adds optional syntax to scale an image to a specified width and height and/or interactively resize the image with the mouse.
!!!!!Usage
<<<
The extended image syntax is:
{{{
[img(w+,h+)[...][...]]
}}}
where ''(w,h)'' indicates the desired width and height (in CSS units, e.g., px, em, cm, in, or %). Use ''auto'' (or a blank value) for either dimension to scale that dimension proportionally (i.e., maintain the aspect ratio). You can also calculate a CSS value 'on-the-fly' by using a //javascript expression// enclosed between """{{""" and """}}""". Appending a plus sign (+) to a dimension enables interactive resizing in that dimension (by dragging the mouse inside the image). Use ~SHIFT-click to show the full-sized (un-scaled) image. Use ~CTRL-click to restore the starting size (either scaled or full-sized).
<<<
!!!!!Examples
<<<
{{{
[img(100px+,75px+)[images/meow2.jpg]]
}}}
[img(100px+,75px+)[images/meow2.jpg]]
{{{
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
}}}
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
{{tagClear{
}}}
<<<
!!!!!Revisions
<<<
2009.02.24 [1.2.1] cleanup width/height regexp, use '+' suffix for resizing
2009.02.22 [1.2.0] added stretchable images
2008.01.19 [1.1.0] added evaluated width/height values
2008.01.18 [1.0.1] regexp for "(width,height)" now passes all CSS values to browser for validation
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImageSizePlugin= {major: 1, minor: 2, revision: 1, date: new Date(2009,2,24)};
//}}}
//{{{
var f=config.formatters[config.formatters.findByField("name","image")];
f.match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
f.lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](?:\(([^,]*),([^\)]*)\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
f.handler=function(w) {
	this.lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var floatLeft=lookaheadMatch[1];
		var floatRight=lookaheadMatch[2];
		var width=lookaheadMatch[3];
		var height=lookaheadMatch[4];
		var tooltip=lookaheadMatch[5];
		var src=lookaheadMatch[6];
		var link=lookaheadMatch[7];

		// Simple bracketted link
		var e = w.output;
		if(link) { // LINKED IMAGE
			if (config.formatterHelpers.isExternalLink(link)) {
				if (config.macros.attach && config.macros.attach.isAttachment(link)) {
					// see [[AttachFilePluginFormatters]]
					e = createExternalLink(w.output,link);
					e.href=config.macros.attach.getAttachment(link);
					e.title = config.macros.attach.linkTooltip + link;
				} else
					e = createExternalLink(w.output,link);
			} else
				e = createTiddlyLink(w.output,link,false,null,w.isStatic);
			addClass(e,"imageLink");
		}

		var img = createTiddlyElement(e,"img");
		if(floatLeft) img.align="left"; else if(floatRight) img.align="right";
		if(width||height) {
			var x=width.trim(); var y=height.trim();
			var stretchW=(x.substr(x.length-1,1)=='+'); if (stretchW) x=x.substr(0,x.length-1);
			var stretchH=(y.substr(y.length-1,1)=='+'); if (stretchH) y=y.substr(0,y.length-1);
			if (x.substr(0,2)=="{{")
				{ try{x=eval(x.substr(2,x.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			if (y.substr(0,2)=="{{")
				{ try{y=eval(y.substr(2,y.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			img.style.width=x.trim(); img.style.height=y.trim();
			config.formatterHelpers.addStretchHandlers(img,stretchW,stretchH);
		}
		if(tooltip) img.title = tooltip;

		// GET IMAGE SOURCE
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
		else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
			if (config.browser.isIE || config.browser.isSafari) {
				img.onerror=(function(){
					this.src=config.formatterHelpers.resolvePath(this.src,false);
					return false;
				});
			} else
				src=config.formatterHelpers.resolvePath(src,true);
		}
		img.src=src;
		w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
}

config.formatterHelpers.addStretchHandlers=function(e,stretchW,stretchH) {
	e.title=((stretchW||stretchH)?'DRAG=stretch/shrink, ':'')
		+'SHIFT-CLICK=show full size, CTRL-CLICK=restore initial size';
	e.statusMsg='width=%0, height=%1';
	e.style.cursor='move';
	e.originalW=e.style.width;
	e.originalH=e.style.height;
	e.minW=Math.max(e.offsetWidth/20,10);
	e.minH=Math.max(e.offsetHeight/20,10);
	e.stretchW=stretchW;
	e.stretchH=stretchH;
	e.onmousedown=function(ev) { var ev=ev||window.event;
		this.sizing=true;
		this.startX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
		this.startY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
		this.startW=this.offsetWidth;
		this.startH=this.offsetHeight;
		return false;
	};
	e.onmousemove=function(ev) { var ev=ev||window.event;
		if (this.sizing) {
			var s=this.style;
			var currX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var currY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var newW=(currX-this.offsetLeft)/(this.startX-this.offsetLeft)*this.startW;
			var newH=(currY-this.offsetTop )/(this.startY-this.offsetTop )*this.startH;
			if (this.stretchW) s.width =Math.floor(Math.max(newW,this.minW))+'px';
			if (this.stretchH) s.height=Math.floor(Math.max(newH,this.minH))+'px';
			clearMessage(); displayMessage(this.statusMsg.format([s.width,s.height]));
		}
		return false;
	};
	e.onmouseup=function(ev) { var ev=ev||window.event;
		if (ev.shiftKey) { this.style.width=this.style.height=''; }
		if (ev.ctrlKey)  { this.style.width=this.originalW; this.style.height=this.originalH; }
		this.sizing=false;
		clearMessage();
		return false;
	};
	e.onmouseout=function(ev) { var ev=ev||window.event;
		this.sizing=false;
		clearMessage();
		return false;
	};
}
//}}}
/***
|Name|InlineJavascriptPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPlugin" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPlugin">http://www.TiddlyTools.com/#InlineJavascriptPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#InlineJavascriptPluginInfo" title="Linkification: http://www.TiddlyTools.com/#InlineJavascriptPluginInfo">http://www.TiddlyTools.com/#InlineJavascriptPluginInfo</a>|
|Version|1.9.5|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.04.11 [1.9.5] pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};

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

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

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

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
Search in [[Yonban|https://projects.fiit.stuba.sk/yonban2/index.jsp]] for my other projects - not all were assigned to students.
If the projects I am/was supervising are interesting and you would like to work on similar projects, fell free to contact me.

However the process of defining new projects/thesis is a bit complicated, so for:
*Bachelor project - contact me via mail in your 2nd undergraduate study year (mid of summer semester)
*Master thesis - follow [[these|Software Systems Research]] instructions
<<tiddler HideTiddlerSubtitle>>
All related information is available [[here|http://www2.fiit.stuba.sk/~drahos]].
<<tiddler HideTiddlerSubtitle>>
!!!Abstract
{{justify{This document deals with software generating of documentation of Lua language from its source codes. The work describes the ways of analyzing the source code to retrieve information also called parsing. Important part of this document deals with software metrics, their calculation and presentation of outcomes. The document also describes the meaning and calculation of more advanced metrics. The problem of choosing the appropriate metrics for Lua language is mentioned as well as analysis of available tools. The analysis includes examples of tools for analyzing source code of other computer languages. The outcome of this work is specification, design and implementation of an application for source code analysis providing improvement of ~LuaDoc tool in area of calculating and presenting software metrics from source codes.}}}
!!!Results
{{justify{Following figures show various software metrics that were generated and inserted into the source code documentation produced by our modified ~LuaDoc.}}}
{{center{[img(20cm, )[img/bachelor/2011/simko/overenie_metrikyFunkcie.png]]}}}
{{center{Metrics of a Lua function.}}}
{{center{[img(20cm, )[img/bachelor/2011/simko/overenie_metrikyModulu.png]]}}}
{{center{Metrics of a Lua module.}}}
{{center{[img(20cm, )[img/bachelor/2011/simko/overenie_metrikyProjektu1.png]]}}}
{{center{Metrics of a complete Lua project.}}}
{{center{[img(20cm, )[img/bachelor/2011/simko/overenie_metrikyProjektu2.png]]}}}
{{center{Module dependencies in the Lua project.}}}
{{center{[img(20cm, )[img/bachelor/2011/simko/overenie_metrikySuboru.png]]}}}
{{center{Metrics of a Lua file.}}}
{{center{[img(20cm, )[img/bachelor/2011/simko/overenie_metrikyTabulky.png]]}}}
{{center{Metric of a Lua table.}}}
{{center{[img(8cm, )[img/bachelor/2011/simko/graph2.png]]}}}
{{center{Graphical representation of Lua statement usage metrics.}}}
{{center{[img(8cm, )[img/bachelor/2011/simko/graph3.png]]}}}
{{center{Graphical comparison of various module metrics.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{The programmer must be able to work with large amounts of information at a time. Not just code, but also the structure and behavior of the system. Also often it is a problem to understand and navigate in the program with thousands of rows. Furthermore,he is in a hurry, as he shall prosecute the terms in the creation of the system. Visualization allows him to show parts of code to enable him to better understand and improve its operation and quicken the job. In our work we focus on the design and implementation of a tool to assist the programmer in developing the program. We use established concepts of interaction for best results. Furthermore, the tool will be tested on various inputs to determine its usefulness in programming.}}}
{{center{[img(20cm, )[./img/bachelor/2015/Hagara/posun_viac_vrstiev.jpg]]
{{center{Graph visualization using force-based algorithm - no restrictions.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Presented thesis deals with graph drawing methods based on spring embedder. The aim of this thesis is providing the summary of existing force-directed algorithms and designing a system for three-dimensional graph visualization. The system will provide automatic and manual constraining possibilities, in order to produce various specific graph layouts (e.g. walls, spheres, cylinders etc). In addition, it will demonstrate the possibilities of graph or subgraph modifications by means of the insertion and manipulation of additional (dummy) nodes.}}}
!!!Results
{{center{[img(20cm, )[img/bachelor/2009/ukrop/2009_ukrop_bc_1.jpg]]}}}
{{center{Application of restrictions by entities.}}}
{{center{[img(20cm, )[img/bachelor/2009/ukrop/2009_ukrop_bc_2.jpg]]}}}
{{center{Restriction by cube.}}}
{{center{[img(20cm, )[img/bachelor/2009/ukrop/2009_ukrop_bc_3.jpg]]}}}
{{center{Example of restriction usage on better visualization of chosen node set.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This thesis is dedicated to address the issue of augmented reality and interactive manipulation with objects in it. Describes methods of virtual objects visualization in augmented reality, devices that display augmented reality, navigation in 3D scene and also interactive manipulation with objects in augmented reality. This thesis also describes own solutions of problems from this research field, mostly focused on navigation and user manipulation with objects in scene and scene itself. Bigger emphasis was put on hand contour detection, manipulation with camera and methods of node highlight and select.}}}
{{center{[img(20cm, )[./img/bachelor/2015/Marak/img_nodeHighlight_AR.jpg]]
{{center{Graph visualization using in augmented reality.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2015/Marak/path.jpg]]
{{center{Sequence of images showing path creation using hand gestures.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{When creating larger software applications it is necessary to analyze the parts of the software during the development process. We can use so called hypergraph structures to represent some parts of the software such as the code or the documentation (the artifacts). Using visualization of these artifacts and the relationships between them we can offer the analytics the means to gain new knowledge about the analyzed software. The goal of this work is to analyze the possibility and find a solution for visualization of software. As a result of this analysis an application was created which is able to visualize function calls of the simple C programming language.}}}
!!!Results
{{center{[img[img/bachelor/2008/katona/2008_katona_bc_1.jpg]]}}}
{{center{Result of testing on first set of nodes.}}}
{{center{[img[img/bachelor/2008/katona/2008_katona_bc_2.jpg]]}}}
{{center{Result of testing on second set of nodes.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!Abstract
When creating larger software applications it is necessary to analyze the parts of the software during the development process. We can use so called hypergraph structures to represent some parts of the software such as the code or the documentation (the artifacts). Using visualization of these artifacts and the relationships between them we can offer the analytics the means to gain new knowledge about the analyzed software. The goal of this work is to analyze the possibility and find a solution for visualization of software. As a result of this analysis an application was created which is able to visualize function calls of the simple C programming language.
!!!Results
!!! Dissertation thesis
Degree Course: Applied informatics
Author: Peter Kapec
Supervisor: assoc. prof. Martin Šperka, ~PhD.
January 2011
!!! Annotation
{{justify{In the recent years information visualization became very important as it allows us to gain insight into large amounts of data. Better information comprehension can be obtained by observing graphical representations of data, which may reveal hidden patterns. Among various data types that can be visualized, software is a suitable candidate due to software's intangibility. In our work we focused on the visualization of software artifacts and their interconnections. We propose a software visualization method that uses a hypergraph-based data model as a unifying representation that is used in the whole visualization process: from artifacts extraction and representation, trough filtering and querying to visualization. Inspired by the knowledge representation field we propose a modified hypergraph-based representation that enhanced by incidences that are suitable to represent roles objects play in relations. We also propose a query language in which queries and query results are hypergraphs, thus making the approach transparent for visualization. The visualization of the hypergraphs representing the extracted software artifacts and their relations is based on the well known force-based graph layout algorithms. The proposed method was implemented in a software visualization prototype and verified by visualizations of an existing software project.}}}
<<tiddler HideTiddlerSubtitle>>
Lua is a fantastic small embeddable scripting language that I prefer and use for all possible programming problems.
!!!Lua
[[www.lua.org|http://www.lua.org]] – Lua home page
[[www.lua.org/pil|http://www.lua.org/pil]] –  Programming in Lua - free book to learn Lua - for beginners and advanced
[[www.lua.org/manual/5.1|http://www.lua.org/manual/5.1]] – reference manual - for Lua details
!!!Help
[[lua-users.org/wiki|http://lua-users.org/wiki]] – tutorials, libraries, mailing list etc.
!!!Modules
[[www.luaforge.net|http://www.luaforge.net]] – C/C++/Lua modules for Lua
!!!~LuaDist
[[LuaDist|http://www.luadist.org]] is a package management and build tool for Lua modules that I help to develop.
<<tiddler HideTiddlerSubtitle>>
[[About me]]
[[News]]
[[Research]]
[[Publications]]
{{floatright tiny{
&nbsp;<<tiddler ExpandSlidersScript with: 'mainMenu' 'show' 'hide'>>}}}<hr>
<<slider {{config.options['foo']=false;'foo';}}
	MainMenu##Lectures Lectures Lectures>>
<<slider {{config.options['foo']=false;'foo';}}
	MainMenu##Courses Courses Courses>>
<<slider {{config.options['foo']=false;'foo';}}
	MainMenu##Supervisor Supervisor Supervisor>>/%
!Lectures
{{borderleft{
{{center{__Undergraduate Study__}}}[[Basic Methods of Multimedia Content Development]]
{{center{__Graduate Study__}}}[[Data Visualization]]
}}}
!Courses
{{borderleft{
{{center{__Undergraduate Study__}}}[[Principles of Computer Graphics and Image Processing]]<hr>
[[Introduction to Interactive Applications Development]]<hr>
{{center{__Graduate Study__}}}[[Software Systems Research]]
[[Team project]]
[[Praxis]]
}}}
!Supervisor
{{borderleft{
[[Current projects]]
[[Bachelor projects]]
[[Master theses]]
[[Statistics]]
[[Interested?]]
[[Resources & Hints]]
}}}
!end
%/
----
[[Vision & Graphics Group]]
[[Other]]

{{small center{last update on: <script>return document.lastModified.toString();</script>}}}

@@display:none;<<tiddler ToggleRightSidebar>>@@

!!!Abstract
{{justify{This paper deals with visualization of graphs in three-dimensional space. Visualizing large amount of date without overwhelming the user is a problem, which the researchers has dealing with for many years. The need for quality visualization even increased with the advent of social networks. We deal with several problems when there is a lot of data involved. This paper contains an analysis of chosen algorithms and the methods of graph layout that try to tackle the problems associated with it. These issues relate to display graphs with a minimum of crossings, clustering graphs, drawing large graphs, displaying hierarchies, navigation in graph , the location of the virtual camera and the attention is also paid to display aesthetically pleasing results.
}}}
{{center{[img(20cm, )[./img/bachelor/2014/duransky/veolia.png]]
{{center{Graph visualization using force-based algorithm - no restrictions.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2014/duransky/veolianear.png]]
{{center{Previous graph visualization using parallel plane restrictions.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This work deals with the topic of visualization software and system to support software visualization. The document discusses visualization of software and it’s use for the programmer. It shows the basic ways of visualizing and tools that are designed for this purpose. It discusses the advantages and disadvantages of those instruments and how techniques these tools work with windows, their behavior and distribution program. Further analyzed ways of behaving windows systems in use today. It shows innovations that are currently used in the management of windows. It evaluates the advantages and disadvantages of these systems and compares them with each other.
}}}
!!!Results
{{center{[img(17cm, )[./img/bachelor/2014/sulek/screen_moveGroup.png]]
{{center{Mowing windows when documentation windows are opened.}}}}}}
{{center{[img(17cm, )[./img/bachelor/2014/sulek/screen_repulsiveF.png]]
{{center{Moving windows when windows overlap after window move.}}}}}}
{{center{[img(17cm, )[./img/bachelor/2014/sulek/fig_resize.png]]
{{center{Moving windows after window resize.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This thesis deals with visualization of 3D graphs, goes through different drawing methods and algorithms. It deals also with interaction and different interaction methods. The goal is to create a&nbsp;transparent visualization of graph in space and allow interactive viewing and modification. The implemented system is using the designed visualization algorithm, that is based on a&nbsp;gravitation physical model. The graph can be then edited and viewed.}}}
!!!Results
{{center{[img(20cm, )[img/bachelor/2008/jakubeci/2008_jakubeci_bp_1.jpg]]}}}
{{center{Graph with node's content displayed.}}}
{{center{[img(20cm, )[img/bachelor/2008/jakubeci/2008_jakubeci_bp_2.jpg]]}}}
{{center{Graph with two nodes selected and with their content displayed.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{In this paper we occupy ourselves with the methods of finding the optimal viewpoint for three-dimensional straight-line graph drawing. The optimal viewpoint is defined as one that does not generate clipping and  any occlusion of elements of the graph (nodes and edges). Two of the methods are based on a fact, that the viewpoint is better, when it is further from a bad viewpoint  that generates occlusion. The other method works on a principle of comparison between 2D pictures of the observed  object taken from different angles. Space is then divided into areas on the basis of similarity of the pictures.  The last of the methods simulates physical effects of repulsive and attractive forces applied by nodes on the viewpoint. The viewpoint then tries to move to a position where balance is reached. The result of this paper is the implementation of the RSD method, which generates Voronoi diagram for bad viewpoints.  The diagram is used to find the best local viewpoints. They lie on borders (edges) of Voronoi cells.}}}
!!!Results
{{center{[img[img/bachelor/2007/macko/2007_macko_bp_1.jpg]]}}}
{{center{Visualization of Voroni diagram on sphere.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Maintaining good source code documentation is very useful in large system development and for purposes of future modifications. Automatic generation by special software is one alternative, which is based on special comment syntax. The goal of this project is to analyse documentation generation solutions, and to design and to implement such system for Lua scripting language, using this knowledge.}}}
!!!Results
{{center{[img[img/bachelor/2008/sirota/2008_sirota_bc.jpg]]}}}
{{center{HTML output of modified ~LuaDoc.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{The work deals with the issues of graph visualization and graph layout. It analyses existing solutions based on deterministic and force-directed algorithms. It also describes modern, multi-layer algorithms. In the work, a radial layout was used, which was implemented into an existing program using a previously implemented force-directed algorithm, with node movement being constrained to the surface of a sphere and a circle. The solution is mainly focused on user interaction. The goal was to find an effective visualization which would satisfy the maximum amount of aesthetic criteria.
}}}
!!!Results
{{center{[img(18cm, )[./img/bachelor/2014/volovar/veolia_radial.png]]
{{center{Radial 3D layout of a graph.}}}}}}
{{center{[img(18cm, )[./img/bachelor/2014/volovar/predZosilnenim.png]]
{{center{Default repulsive forces.}}}}}}
{{center{[img(18cm, )[./img/bachelor/2014/volovar/poZosilneni.png]]
{{center{Amplified repulsive forces.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2014/volovar/dvojnasobnyRadial.png]]
{{center{Two radial layout restrictions.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2014/volovar/clusters.png]]
{{center{Several radial layout restrictions - forming clustes.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
The objective of this project is to analyze current situation in domain of graph visualization and manipulation in 3D space. It is finding alternative approaches to such a manipulation and tries to demonstrate them using simply system, as well.
!!!Results
{{center{[img(20cm, )[img/bachelor/2008/ludvik/2008_ludvik_bp_1.jpg]]}}}
{{center{Nodes placement using cone selection cursor.}}}
{{center{[img(20cm, )[img/bachelor/2008/ludvik/2008_ludvik_bp_2.jpg]]}}}
{{center{Deleting node's childes using a cylinder selection cursor.}}}
{{center{[img(20cm, )[img/bachelor/2008/ludvik/2008_ludvik_bp_3.jpg]]}}}
{{center{Helper lines that project nodes onto selection planes.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
Master theses I supervised. Each contains an abstract and some results.
!!!2016
*[[Bc. Igor Jurík - Data visualization and interaction in augmented reality]]
*[[Bc. Michael Garaj - Software evolution visualization in 3D captured in revisions]]
*[[Bc. Štefan Horváth - Software visualization as three-dimensional city]]
!!!2015
*[[Bc. Gabriela Brndiarová - Improving readability of graph visualizations in 3D space]]
*[[Bc. Michael Gloger - Visualization of metrics and structure of software systems in three-dimensional space]]
*[[Bc. Michael Scholtz - Incremental parsing in an inovative development environment]]
!!!2014
*[[Bc. Andrej Britvík - Graph clustering visualization using spatial figures]]
*[[Bc. Tomáš Filčák - Extraction of software artifacts for visualization]]
*[[Bc. František Nagy - The use of metrics in software visualization in 3D space]]
!!!2013
*[[Bc. Filip Grznár - Visualization of dynamics of program written in C# language]]
*[[Bc. Vladimır Polak - Visualisation of large graphs]]
*[[Bc. Viliam Kubis - Innovative Integrated Development Environment for Lua language]]
*[[Bc. Ivan Šimko - Interactive presentation of software metrics]]
!!!2012
*[[Bc. Lenka Baková - Visualizing the evolution of software changes in 3D space]]
*[[Bc. Ivan Pleško - Collaborative virtual environment for data visualization]]
!!!2011
*[[Bc. Martin Čaučík - Source code revision management on language constructs level]]
*[[Bc. Zuzana Číková - Use of query languages and magic lenses in graph visualization]]
*[[Bc. Peter Mindek - Visualization Using Metaphors Inspired by Visualization of Biological Processes]]
*[[Bc. Michal Paprčka - Smart camera motion in 3D graphs visualization]]
*[[Bc. Adam Pažitnaj - Visualization of data in time]]
*[[Bc. Jakub Ukrop - Visual access to data stored in graphs]]
!!!2010
*[[Bc. Martin Jakubéci -  Data visualization using sky metaphor]]
*[[Bc. Michal Kottman - Representation of programs in graphs and their execution]]
*[[Bc. Martin Ludvík -  Software development in 3D space]]
*[[Bc. Ivan Ruttkay-Nedecký - Visualization of program execution in 3D environment]]
*[[Bc. Ľuboš Ukrop - Visualizing graph structures using soap bubbles]]
!!!2009
*[[Bc. Peter Čimo - Multiparadigm programming in Lua language]]
*[[Bc. Filip Komorovský - Visual data mining in software]]
*[[Bc. Ladislav Rendek - Visualization in non-linear space]]



!!! What to do in the 1st semester
* search for related materials
* store and organize found materials
* prepare documentation template
* discuss possible approaches and solutions
* write down:
** analysis of current state-of-the-art
** specification
** design
* get familiar with technologies that will be used
!!! What to do in the 2nd semester
* propose and experiment with possible solutions
* implement a prototype of the proposed solution
* write down:
** details about proposed method/approach
** design details
!!! What to do in the 3rd semester
* implement the chosen solution
* experiment with the product
* write down more:
** details about the proposed method/approach
** design details
** evaluation
[[Back to Resources & Hints|Resources & Hints]]
/***
|Name|MatchTagsPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPlugin" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPlugin">http://www.TiddlyTools.com/#MatchTagsPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#MatchTagsPluginInfo" title="Linkification: http://www.TiddlyTools.com/#MatchTagsPluginInfo">http://www.TiddlyTools.com/#MatchTagsPluginInfo</a>|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|'tag matching' with full boolean expressions (AND, OR, NOT, and nested parentheses)|
!!!!!Documentation
> see [[MatchTagsPluginInfo]]
!!!!!Revisions
<<<
2008.09.04 [2.0.0] added "report" and "panel" options to generate formatted results and store in a tiddler.  Also, added config.macros.matchTags.formatList(place,fmt,sep) API to return formatted output for use with other plugins/scripts
| please see [[MatchTagsPluginInfo]] for additional revision details |
2008.02.28 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.MatchTagsPlugin= {major: 2, minor: 0, revision: 0, date: new Date(2008,9,4)};

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

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

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

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

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

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



	untaggedLabel: "no tags",
	untaggedPrompt: "show tiddlers with no tags",
	defTiddler: "MatchingTiddlers",
	defFormat: "%0",
	defSeparator: "\n",
	reportHeading: "Found %0 tiddlers tagged with: '{{{%1}}}'\n----\n",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var mode=params[0]?params[0].toLowerCase():'';
		if (mode=="inline")
			params.shift();
		if (mode=="report" || mode=="panel") {
			params.shift();
			var target=params.shift()||this.defTiddler;
		}
		if (mode=="popup") {
			params.shift();
			if (params[0]&&params[0].substr(0,6)=="label:") var label=params.shift().substr(6);
			if (params[0]&&params[0].substr(0,7)=="prompt:") var prompt=params.shift().substr(7);
		} else {
			var fmt=(params.shift()||this.defFormat).unescapeLineBreaks();
			var sep=(params.shift()||this.defSeparator).unescapeLineBreaks();
		}
		var sortBy="+title";
		if (params[0]&&params[0].substr(0,5)=="sort:") sortBy=params.shift().substr(5);
		var expr = params.join(" ");
		if (mode!="panel" && (!expr||!expr.trim().length)) return;
		if (expr==this.untaggedKeyword)
			{ var label=this.untaggedLabel; var prompt=this.untaggedPrompt };
		switch (mode) {
			case "popup": this.createPopup(place,label,expr,prompt,sortBy); break;
			case "panel": this.createPanel(place,expr,fmt,sep,sortBy,target); break;
			case "report": this.createReport(target,expr,fmt,sep,sortBy); break;
			case "inline": default: this.createInline(place,expr,fmt,sep,sortBy); break;
		}
	},
	formatList: function(tids,fmt,sep) {
		var out=[];
		for (var t=0; t<tids.length; t++) {
			var title="[["+tids[t].title+"]]";
			var who=tids[t].modifier;
			var when=tids[t].modified.toLocaleString();
			var text=tids[t].text;
			var first=tids[t].text.split("\n")[0];
			var desc=store.getTiddlerSlice(tids[t].title,"description");
			desc=desc||store.getTiddlerSlice(tids[t].title,"Description");
			desc=desc||store.getTiddlerText(tids[t].title+"##description");
			desc=desc||store.getTiddlerText(tids[t].title+"##Description");
			out.push(fmt.format([title,who,when,text,first,desc]));
		}
		return out.join(sep);
	},
	createInline: function(place,expr,fmt,sep,sortBy) {
		wikify(this.formatList(store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy),fmt,sep),place);
	},
	createPopup: function(place,label,expr,prompt,sortBy) {
		var btn=createTiddlyButton(place,
			(label||expr).format([expr]),
			(prompt||config.views.wikified.tag.tooltip).format([expr]),
			function(ev){ return config.macros.matchTags.showPopup(this,ev||window.event); });
		btn.setAttribute("sortBy",sortBy);
		btn.setAttribute("expr",expr);
	},
	showPopup: function(here,ev) {
		var p=Popup.create(here); if (!p) return false;
		var tids=store.getMatchingTiddlers(here.getAttribute("expr"));
		store.sortTiddlers(tids,here.getAttribute("sortBy"));
		var list=[]; for (var t=0; t<tids.length; t++) list.push(tids[t].title);
		if (!list.length) createTiddlyText(p,this.noMatch);
		else {
			var b=createTiddlyButton(createTiddlyElement(p,"li"),
				config.views.wikified.tag.openAllText,
				config.views.wikified.tag.openAllTooltip,
				function() {
					var list=this.getAttribute("list").readBracketedList();
					story.displayTiddlers(null,tids);
				});
			b.setAttribute("list","[["+list.join("]] [[")+"]]");
			createTiddlyElement(p,"hr");
		}
		var out=this.formatList(tids," &nbsp;%0&nbsp; ","\n"); wikify(out,p);
		Popup.show(p,false);
		ev.cancelBubble=true;
		if(ev.stopPropagation) ev.stopPropagation();
		return false;
	},
	createReport: function(target,expr,fmt,sep,sortBy) {
		var tids=store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy);
		if (!tids.length) { displayMessage('no matches for: '+expr); return false; }
		var msg=config.messages.overwriteWarning.format([target]);
		if (store.tiddlerExists(target) && !confirm(msg)) return false;
		var out=this.reportHeading.format([tids.length,expr])
		out+=this.formatList(tids,fmt,sep);
		store.saveTiddler(target,target,out,config.options.txtUserName,new Date(),[],{});
		story.closeTiddler(target); story.displayTiddler(null,target);
	},
	createPanel: function(place,expr,fmt,sep,sortBy,tid) {
		var html="<form style='display:inline'><!-- \
			--><input type='text'    name='expr' style='width:55%' title='tag expression'><!-- \
			--><input type='text'    name='fmt'  style='width:10%' title='list item format'><!-- \
			--><input type='text'    name='sep'  style='width:5%'  title='list item separator'><!-- \
			--><input type='text'    name='tid'  style='width:20%' title='target tiddler title'><!-- \
			--><input type='button'  name='go'   style='width:8%'  value='go' onclick=\" \
				var expr=this.form.expr.value; \
				if (!expr.length) { alert('Enter a boolean tag expression'); return false; } \
				var fmt=this.form.fmt.value; \
				if (!fmt.length) { alert('Enter the list item output format'); return false; } \
				var sep=this.form.sep.value.unescapeLineBreaks(); \
				var tid=this.form.tid.value; \
				if (!tid.length) { alert('Enter a target tiddler title'); return false; } \
				config.macros.matchTags.createReport(tid,expr,fmt,sep,'title'); \
				return false;\"> \
			</form>";
		var s=createTiddlyElement(place,"span"); s.innerHTML=html;
		var f=s.getElementsByTagName("form")[0];
		f.expr.value=expr; f.fmt.value=fmt; f.sep.value=sep.escapeLineBreaks(); f.tid.value=tid;
	}
};
//}}}
//{{{
// SHADOW TIDDLER for displaying default panel input form
config.shadowTiddlers.MatchTags="{{smallform{<<matchTags panel>>}}}";
//}}}
//{{{
// TWEAK core filterTiddlers() for enhanced boolean matching in [tag[...]] syntax:
// use getMatchingTiddlers instead getTaggedTiddlers
var fn=TiddlyWiki.prototype.filterTiddlers;
fn=fn.toString().replace(/getTaggedTiddlers/g,"getMatchingTiddlers");
eval("TiddlyWiki.prototype.filterTiddlers="+fn);
//}}}
//{{{
// REDEFINE core handler for enhanced boolean matching in tag:"..." paramifier
// use filterTiddlers() instead of getTaggedTiddlers() to get list of tiddlers.
config.paramifiers.tag = {
	onstart: function(v) {
		var tagged = store.filterTiddlers("[tag["+v+"]]");
		story.displayTiddlers(null,tagged,null,false,null);
	}
};
//}}}
!!!Abstract
{{justify{The paper analyses and describes basic interfaces and methods of human-computer interaction in a 3D environment. It starts with a short description of historical development of different user interfaces. Next, it defines and describes the concepts of virtual reality (VR) and enhanced reality as it's variant. It continues by analyzing and describing main input and output VR interfaces and focuses on various methods of human-computer interaction in a 3D space. Scene graphs as a suitable technology of developing immersive VR worlds are also mentioned. It considers some examples of applications, which tried to implement 3D or pseudo-3D user interfaces. In the next part, the paper deals with a specification, design, development and description of implementation of a specific library, which enables the use of 2D interfaces in a 3D space. The paper ends with evaluation of the developed library and proposes it's next stage of development as a window manager, set in a more complex 3D world.}}}
!!!Results
{{center{[img[img/bachelor/2010/cerman/2010_cerman_bc_2.jpg]]}}}
{{center{Example of more difficult application - database of contacts.}}}
{{center{[img(20cm, )[img/bachelor/2010/cerman/2010_cerman_bc_1.jpg]]}}}
{{center{Example of bigger amount of objects - combined objects.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
/***

|Name|MenuEditPlugin|
|Created by|SaqImtiaz|
|Location|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a>"><a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a>"><a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a>"><a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a>"><a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a>"><a class="linkification-ext" href="http://tw.lewcid.org/#MenuEditPlugin" title="Linkification: http://tw.lewcid.org/#MenuEditPlugin">http://tw.lewcid.org/#MenuEditPlugin</a></a>|
|Version|0.2|
|Requires|~TW2.x|
!Description:
Adds 'doubleclick to edit source' to the MainMenu, SideBarOptions, and SideBarTabs

!History
*20-07-06: version 0.2: hijacked restart, no need to put a macro in the mainMenu anymore.
*28-04-06: version 0.1: working.

!Code
***/
//{{{

window.restart_lewcid_menuedit = restart;
window.restart = function () {
         window.restart_lewcid_menuedit();
var menus = new Array("topMenu","sidebarOptions","sidebarTabs","contentFooter","mainMenu");
for(var t=0; t<menus.length; t++){
         if (document.getElementById(menus[t]))
              {var menu = document.getElementById(menus[t]);
               menu.ondblclick = window.onMenuDblClick;}}
}



window.onMenuDblClick = function(e){
if (!e) var e = window.event;
story.displayTiddler(null,this.getAttribute("tiddler"),2,false,null)
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
//}}}
!!!Abstract
{{justify{Documentation is one of key components of every software. Unfortunately its importance is often underestimated, causing problems especially in later phases of life-cycle. The main problem is, that good-quality documentation has to be manually written by programmer. That means for him to invest some time and energy. Goal of this thesis is therefore to design and implement a tool, that makes writing documentation an easy task. The tool will be inspired by less-known literate programming paradigm. This thesis will be about intuitive, non-demanding and meaningful way of writing and formatting the documentation and focuses on gather as much information from source code and comments as possible. All this for the purpose of maximizing programmers’ motivation to document their own source codes to help themselves and others to easier understand the code.
}}}
!!!Results
{{center{[img(25cm, )[./img/bachelor/2013/juranyi/1.png]]
{{center{Documentation and source code side-by-side.}}}}}}
{{center{[img(15cm, )[./img/bachelor/2013/juranyi/2.png]]
{{center{Short tool-tip description.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Modern-day software often requires complex graphical user interfaces. Qt is a C++ widget toolkit library that provides a convenient way of implementing these interfaces in C++. Lua is simple, small but powerful scripting language. A binding between Qt and Lua would provide an efficient tool in prototyping graphical user interfaces. This document aims to provide insight into the subject of binding Qt to Lua, analyze the possible means of generating such binding, and an overview of existing solutions. A new approach is presented, using commercial-grade binding for the Python language – ~PyQt – and an ~Lua-Python interlanguage bridge – Lunatic Python. Several bugs in the project have been fixed and missing implementation of a class system for Lua is provided. The presented solution is demonstrated on several samples. It is not bound to binding Qt into Lua and could serve as a basis for binding other Python libraries into Lua.}}}
!!!Results

{{center{[img[img/bachelor/2008/kottman/2008_kottman_bc.jpg]]}}}
{{center{Usage of binding on ~PyQt4 and ~PyOpenGL}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Presented thesis deals with problem of drawing graphs using spring method. Goal is to create space visualisation of graph, that way graph would be displayed readable. In program it will be able to watch behaviour of this visualisation and user will be able to interact. Graph should not be draw random, but it is demanded that final visualisation of graphs would be made by layers or faces.}}}
!!!Results
{{center{[img[img/bachelor/2007/ilavsky/2007_ilavsky_bc_1.jpg]]}}}
{{center{Example options by node selection.}}}
{{center{[img[img/bachelor/2007/ilavsky/2007_ilavsky_bc_2.jpg]]}}}
{{center{Advanced usage of node selection on object combination.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This project describes issue of graphical user interfaces, which is focused on 3D interfaces. The first part of this task is analysis containing the brief description of history of user interfaces. It also describes virtual reality and some more ordinary input and output devices for working with virtual reality. Description of methods and techniques for 3D interaction of a man with computer is also part of the analysis, which includes more detailed descriptions of some techniques like Virtual Tricorder, Voodoo Dolls, ~Go-Go technique, World in miniature, Ray Casting and Homer technique. Moreover, in this task I analyze and briefly describe applications using 3D user interface, specifically ~OSGim and ~Tactile3D. In the conclusion of analysis I describe available technologies to create such 3D graphic user interfaces. In the chapter Description of the solution I describe created application, concretely specification, suggestion and implementation of this application. In the chapter verification of the solution is by the pictures described the main funcionality of application. In the document there are also additions, like technical documentation, user guide and contents of the CD.}}}
!!!Results
{{center{[img(20cm, )[img/bachelor/2010/mikulas/2010_mikulas_bc_1.jpg]]}}}
{{center{Resizing of the object.}}}
{{center{[img(20cm, )[img/bachelor/2010/mikulas/2010_mikulas_bc_2.jpg]]}}}
{{center{Rotation of the object.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
/***
|Name|NestedSlidersPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPlugin" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPlugin">http://www.TiddlyTools.com/#NestedSlidersPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#NestedSlidersPluginInfo" title="Linkification: http://www.TiddlyTools.com/#NestedSlidersPluginInfo">http://www.TiddlyTools.com/#NestedSlidersPluginInfo</a>|
|Version|2.4.9|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.11.15 - 2.4.9 in adjustNestedSlider(), don't make adjustments if panel is marked as 'undocked' (CSS class).  In onClickNestedSlider(), SHIFT-CLICK docks panel (see [[MoveablePanelPlugin]])
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release.  Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
<<<
!!!!!Code
***/
//{{{
version.extensions.NestedSlidersPlugin= {major: 2, minor: 4, revision: 9, date: new Date(2008,11,15)};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
	Morpher.prototype.coreStop = Morpher.prototype.stop;
	Morpher.prototype.stop = function() {
		this.coreStop.apply(this,arguments);
		var e=this.element;
		if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
			// adjust panel overflow and position after animation
			e.style.overflow = "visible";
			if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
		}
	};
}
//}}}
*Consultations for new bachelor projects will be in D203:
**27.04.2011 - 12:00-13:00 (13:00-15:00 in TPC)
<<tiddler HideTiddlerSubtitle>>
''22.9.2014'' - Team project - something for inspiration [[Link 1|https://www.youtube.com/watch?v=z-aBUyrhcj0]], [[Link 2|https://www.youtube.com/watch?v=UeH7_QPDtXc]], [[Link 3|https://www.youtube.com/watch?v=KOG7yTz1iTA]] 
<<tiddler HideTiddlerSubtitle>>
[[Luaboratory of short codes]]
<<tiddler HideTiddlerSubtitle>>
> This is a blockquote
> This is a blockquote
> This is a blockquote
|>|>| !This is a header |h
|column1|column2|column3|
|row2| row2 |row2|
|column1|column2|column3|
|row2| row2 |row2|
|column1|column2|column3|
|row2| row2 |row2|
<!--{{{-->
<div class='header'  macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='siteNav' class='siteNav' refresh='content' force='true' tiddler='SiteNav'></div>
<div id='breadCrumbs' class='breadCrumbs' style='font-size:80%;padding:0 1em;'></div>
<div id='mainMenu' refresh='content' force='true' 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' ondblclick='clearMessage()'></div>
<div id='storyMenu' refresh='content' force='true' tiddler='StoryMenu'></div>
<div id='tiddlerDisplay'></div>
<div style="position:fixed;z-index:1001;bottom:.3em;right:.3em;cursor:pointer;font-size:9pt;">
	<a href="javascript:window.scrollTo(0,0)" title="scroll to top of page">&#x25b2;</a>
</div>
</div>
<!--}}}-->
!!!Abstract
{{justify{This thesis deals with the generation of documentation from source code. As part of this work are the approaches and the methods for generating a documentation, techniques of basic analysis of source files, and several existing tools to generate a documentation. The main part of the document is the paradigm of literate programming. This document also describes the properties and characteristics of this technique as well as problems related to literate programming. The thesis also includes a description of several tools for the creation of literate programs. The main goal of this thesis was extend and enhance the functionality of documentation tool ~LuaDocer the way to support the formatting of source code by user-defined templates.
}}}
!!!Results
{{center{[img(20cm, )[./img/bachelor/2013/orisko/1.png]]
{{center{Ugly formated Lua source code - before reformatting.}}}}}}
{{center{[img(10cm, )[./img/bachelor/2013/orisko/2.png]]
{{center{Ugly formated Lua source code - after reformatting..}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This thesis is divided into two parts, the first of which deals with automatic generation of documentation. Generating source code documentation has become an integral part of a software project. It is used for maintenance and possible extension of the software product, but also to better understand the source code. Nowadays, there is no need to write documents manually; instead automatic generators are being used for its production. The second part deals with the metrics and their use in practice. In the past, software metrics used to evaluate of an individual capabilities. However, nowadays they are used rather to evaluate the quality of the code and help uncover weaknesses in the code.}}}
!!!Results
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{The presented thesis deals with the visualization of large graphs. Chosen dynamic graph layout algorithms are analysed in this paper. Algorithms computed on GPU are also mentioned and one of them is analysed. Further, this paper deals with rendering optimization using scene graph. The goal of this thesis was to design and implement system able to visualize large graphs in 3D space using one of the analysed layout algorithms and one of the scene graphs. The system has been tested on the set of graphs with known and unknown shape. It achieves "nice"drawings of graphs up to 5000 vertices in satisfying period of time. Results are presented at the end of this paper.}}}
!!!Results
{{center{[img[img/bachelor/2010/kajan/2010_kajan_bc_2.jpg]]}}}
{{center{Enslyon (2682 nodes).}}}
{{center{[img[img/bachelor/2010/kajan/2010_kajan_bc_3.jpg]]}}}
{{center{Veolia (639 nodes).}}}
{{center{[img[img/bachelor/2010/kajan/2010_kajan_bc_4.jpg]]}}}
{{center{Graph illustrating small world (100 nodes).}}}
{{center{[img[img/bachelor/2010/kajan/2010_kajan_bc_1.jpg]]}}}
{{center{Graph illustrating sending mail between people during year.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This bachelor’s thesis inquires into theme of processing and generation of technical documentation from source code of Lua language. To make a quality documentation is for programmer necessary to write comments relatively frequently on the specified places. The thesis deals with techniques of parsing comments and also the ~LPeg library, that make a parsing in Lua languages by means of PEG grammars. Thesis also inquires into already existing solutions for other programming languages, the structure of generated documentation in HTML pages form and demonstrates ~LDoc and ~LuaDocer tools, that are possible solutions for Lua language. The result of this thesis is the getdoc module, dealing with the storing of comments in tables, providing better access to them in case of further analysis and the expansion of comments module with refilling comment ́ramework into source codes. Another result is the extension of ~LuaDocer device in the process of assessing function documentation.
}}}
!!!Results
{{center{[img(15cm, )[./img/bachelor/2014/mendel/luadocerall.png]]
{{center{Added various types of lists of commented Lua functions.}}}}}}
{{center{[img(15cm, )[./img/bachelor/2014/mendel/notstandard.png]]
{{center{List of non-standardly commented functions.}}}}}}
{{center{[img(15cm, )[./img/bachelor/2014/mendel/partly.png]]
{{center{List of partly commented functions.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Subject of this project is visualization and interactive manipulations with multimedia data in a virtual 3D space. High amount of multimedia data requires more and more sophisticated applications capable of comfortable browsing of this data. The thesis focuses on existing applications, which are serving this purpose, mainly on those using 3D graphics. However, individual techniques used in the field of information visualization, such as graph representation of multimedia or focus+context techniques, are discussed as well. Since state-of-the-art multimedia applications cannot do without animations, the thesis also deals with several techniques used in computer animation. Output of this project is an application capable of easy and spectacular browsing of multimedia files stored on a hard drive or other storage device. The animations used for multimedia browsing are scriptable with Lua scripting language. User can define his or her own methods of displaying multimedia files that way.}}}
!!!Results
{{center{[img(20cm, )[img/bachelor/2009/mindek/2009_mindek_bc_1.jpg]]}}}
{{center{Slideshow mode.}}}
{{center{[img(20cm, )[img/bachelor/2009/mindek/2009_mindek_bc_2.jpg]]}}}
{{center{Animation script - double spiral.}}}
{{center{[img(20cm, )[img/bachelor/2009/mindek/2009_mindek_bc_3.jpg]]}}}
{{center{Animation script - 3D wall.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{Graph visualization is a broad topic itself which involves many problems associated with it. One of the problems is the interaction with graphs which we analyze in this thesis. We first describe graph visualization as a whole and mention some advantages and problems associated with it. We then analyze individual approaches to layout graphs in the space where we focus on graphs in three-dimensional space. There practically exist two main layout algorithms in this area which are automatic algorithms and force-directed algorithms. The main advantages of force-directed algorithms are their flexibility and interactivity. We then look at several viewing techniques which help us in the orientation in huge graphs with hundreds of nodes and edges. We mainly analyze a fisheye view and a distortion viewing techniques. Next, we analyze some modern approaches of interactive navigation in the space, like is for example a 3D cursor. At the end of the analysis, we describe some existing software which deal with graph visualization. We then talk about specification, design and implementation of our addition to an existing visualization software. We mainly focus on distortion viewing techniques and issues connected with it. We introduce concept of restrictions - a mechanism that helps us with the implementation of distortion viewing. We then talk more about a cylinder and a cone restriction shapes and we illustrate how they work. We also depict the architecture of the whole existing visualization system. At the end of this thesis we show the results of several executed tests on various graphs and conclude our overall benefits to the system.
}}}
!!!Results
{{center{[img(20cm, )[./img/bachelor/2012/sivak/regular-graphs-1.png]]
{{center{Distortion applied to a regular grid.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2012/sivak/cylinder-cone-comparison.png]]
{{center{Comparison of cone and cylinder distortions.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2012/sivak/irregular-graphs-1.png]]
{{center{Distortion applied to a real world graph - example 1.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2012/sivak/irregular-graphs-2.png]]
{{center{Distortion applied to a real world graph - example 2.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2012/sivak/irregular-graphs-4.png]]
{{center{Distortion applied to a real world graph - example 3.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
1-2 graduate study students can absolve praxis - feel free to contact me...
<<tiddler HideTiddlerSubtitle>>
@@color:#F00;[closed]@@

All related information is available [[here|http://www2.fiit.stuba.sk/~drahos]].
<<tiddler HideTiddlerSubtitle>>
{{justify{
*The deadline for supervisors of bachelor projects to submit their themes is 21.3.2011.
*I you are interested, have an idea and/or would like to work on some similar project, feel free to propose a theme and [[contact me|About me]].
*Previous supervised [[bachelor projects|Bachelor projects]], and [[master theses|Master theses]] for inspiration.
}}}
<<tiddler HideTiddlerSubtitle>>
!!Papers accepted for publication
N/A ;-(
!!Published papers
!!!2015
*{{justify{Kapec, P., Brndiarová, G., Gloger, M., Marák, J. ''Visual Analysis of Software Systems in Virtual and Augmented Reality.'' 
In: //''IEEE 19th International Conference on Intelligent Engineering Systems'': Proceedings of INES 2015//, September 3–5, Bratislava, Slovakia, pp. 307-312 , 2015}}}
!!!2014
*{{justify{Kapec, P., P. Drahoš, and M. Šperka. ''Trends in information visualization for software analysis and development.'' 
In: //''Current Issues of Science and Research in the Global World'': Proceedings of the International Conference on Current Issues of Science and Research in the Global World//, Vienna, Austria; 27–28 May 2014. CRC Press, 2014. APA}}}
!!!2013
*{{justify{Peter Kapec, Michal Paprčka, Adam Pažitnaj, Vladimír Polák: ''Exploring 3D ~GPU-accelerated graph visualization with time-traveling virtual camera.''
In: //''JTACS'' - Journal of Theoretical and Applied Computer Science//, Vol. 7, No. 2, pp 16-30, ISSN 2299-2634 (printed), 2300-5653 (online), 2013}}}
*{{justify{Grznár, Filip - Kapec, Peter : ''Visualizing dynamics of object oriented programs with time context.''
In: //''SCCG 2013'' - Spring Conference on Computer Graphics // in cooperation with ACM and Eurographics : Conference Proceedingss Smolenice Castle, Slovakia May 1-3, 2013. - Bratislava : Comenius University, 2013. - ISBN 978-80-223-3377-1., pp. 75-82}}}
!!!2012
*{{justify{Peter Kapec, Michal Paprčka, Adam Pažitnaj: ''Intelligent 3D graph exploration with time-travel features''.
In: //''ICCVG'2012'' - Lecture Notes in Computer Science (LNCS): International Conference on Computer Vision and Graphics, Springer//
Warsaw, Poland, September 24-26, 2012 Proceedings, ISSN 0302-9743, Vol. 7594 - Berlin : ~Springer-Verlag Berlin Heidelberg, pp. 113-120}}}
*{{justify{Kapec, Peter: ''Graph visualization and applications in software visualization''.
In: ''//Information Technology Applications.//'' Bratislava : Paneurópska vysoká škola. - ISSN 1338-6468. - No. 1. - , 2012, s. 16-25}}}
*{{justify{Ukrop, Jakub - Číková, Zuzana - Kapec, Peter: ''Visual Access to Graph Content Using Magic Lenses and Filtering''.
In: //''SCCG'2012'' - Spring Conference on Computer Graphics // in Cooperation with ACM and Eurographic : Conference Proceedings Smolenice Castle, Slovakia May 2-4, 2012. - Bratislava : Comenius University, 2012. - ISBN 978-80-223-3211-8. - S. 28-35}}}
!!!2011
*{{justify{Mindek, P., Kapec, P.: ''Graph visualization using the mataphor of biological neural nets''
In: //''SCCG 2011'': Spring Conference on Computer Graphics SCCG 2011 in cooperation with ACM and Eurographics//,
Galbov Mlyn, Viničné April 28-30, 2011 : Conference Prroceedings. - Bratislava : Comenius University, 2011. - ISBN 978-80-223-3018-3, pp. 169-175}}}
!!!2010
*{{justify{Ukrop, Ľ., Jakubéci, M., Kapec, P.:'' Metaphorical Visualizations of Graph Structures'',
In: //''~GraVisMa'2010'': 2nd International Workshop on Computer Graphics, Computer Vision and Mathematics//,
Brno, Czech Republic, September 7-10, 2010, ISBN 978-80-86943-85-5, pp. 115-122}}}
*{{justify{M. Šperka, P. Kapec, I. ~Ruttkay-Nedecký: ''Exploring and Understanding Software Behaviour Using Interactive 3D Visualization''
In: //''ICETA'2010'': 8th International Conference on Emerging eLearning Technologies and Applications//
October 27 – 29, 2010, Stará Lesná, The High Tatras, Slovakia, ISBN 978-80-8086-166-7, elfa, s.r.o., pp. 281-287}}}
*{{justify{Kapec, Peter: ''Visual Programming Environment Based on Hypergraph Representations.''
In: //''ICCVG 2010'' - Lecture Notes in Computer Science: International Conference on Computer Vision and Graphics  //
Warsaw, Poland, September 20-22, 2010 Proceedings, Part II (2010), ISSN 0302-9743, Vol. 6375 - Berlin : ~Springer-Verlag Berlin Heidelberg, pp. 9-16}}}
*{{justify{Šperka, Martin - Kapec, Peter: ''Interactive Visualization of Abstract Data''.
In: //''Science & Military''//.- Vol. 5, No. 1 (2010), s.&nbsp;84-90}}}
*{{justify{Šperka, Martin - Kapec, Peter: ''Visual Information Discovery in Large Data Sets''.
In: //''INTELS'2010'', Intelligent Systems: Proceedings of the Ninth International Symposium//,
Vladimir, Rusko, 28.6.-2.7.2010. - Moskva : RUSAKI, 2010. - ISBN 978-5-93347-407-4. - S.&nbsp;123-128}}}
*{{justify{Kapec, Peter: ''Visualizing software artifacts using hypergraphs.''
In: //''SCCG'2010'' Spring Conference on Computer Graphics in Cooperation with ACM and Eurographics//,
Budmerice, May 13-15, 2010 : Conference Proceedings. - ISBN 978-80-223-2843-2. - S. 33-38}}}
*{{justify{Kottman, Michal - Kapec, Peter: ''Villie - a hypergraph-based visual programming language''.
In: //''ITAT'2010'': Informačné technológie - Aplikácie a Teória : Zborník príspevkov prezentovaných na konferencii ITAT//
Smrekovica, Slovensko, September 2010. - Seňa : PONT s.r.o., 2010. - ISBN 978-80-970179-3-4. - S. 69-74}}}
!!!2009
*{{justify{Kapec, Peter: ''Hypergraph-based software visualization''.
In://''~GraVisMa 2009'' Workshop Proceedings : International Workshop on Computer Graphics, Computer Vision and Mathematics//,
University of West Bohemia, Plzen, Czech Republic September 2-5, 2009. - Plzeň : University of West Bohemia, 2009. - ISBN 978-80-86943-90-9. - S. 149-153}}}
*{{justify{Kapec, Peter: ''Hypergraph-based software visualization.''
In: //''~GraVisMa 2009'' Abstract Proceedings//,
University of West Bohemia Plzen, September 2-5, 2009. - : Západočeská univerzita v Plzni, 2009. - ISBN 978-80-86943-92-3. - 1 s.}}}
*{{justify{Kapec, Peter - Drahoš, Peter: ''Hypergraph based software representation, mining and visualization.''
In: //''INFORMATICS 2009 '': Proceedings of the Tenth International Conference on Informatics//
Herľany, Slovakia, November 23.-25, 2009. - : Department of Computers and Informatics FEEI TU of Košice, 2009. - ISBN 978-80-8086-126-1. - S. 253-258}}}
*{{justify{Kapec, Peter: ''Hypergraph-based Repository for Software Visualization Systems.''
In: //Student Research Conference 2009. 5st Student Research Conference in Informatics and Information Technologies Bratislava//,
April 29, 2009 : Proceedings in Informatics and Information Technologies. - : STU v Bratislave FIIT, 2009. - ISBN 978-80-227-3052-5. - S. 251-258}}}
!!!2008
*{{justify{Drahoš, Peter - Kapec, Peter: ''Knowledge-based programming environments.
''In: //''ITAT 2008'': Informačné Technológie - Aplikácie a Teória : Zborník príspevkov prezentovaných na pracovnom seminári ITAT//,
Hrebienok, September 2008. - Seňa : PONT s.r.o., 2008. - ISBN 978-80-969184-8-5. - S. 27-30}}}
*{{justify{Kapec, Peter - Šperka, Martin: ''Visual Information Discovery in Software Systems.''
In: //''Znalosti 2008'', 7. ročník konferencie//,
Bratislava 13.-15. februára 2008. - Bratislava : STU v Bratislave FIIT, 2008. - ISBN 978-80-227-2827-0. - S. 339-342}}}
*{{justify{Drahoš, Peter - Kapec, Peter: ''Visually Driven Software Development Environment for Heterogeneous Programming.
''In: //Student Research Conference 2008. 4th Student Research Conference in Informatics and Information Technologies Bratislava//,
April 30, 2008 : Proceedings in Informatics and Information Technologies. - : STU v Bratislave FIIT, 2008. - ISBN 978-80-227-2848-5. - S. 222-229}}}
!!!2007
*{{justify{Kapec, Peter: ''Software visualization in three dimensions: A Survey.''
In: //Student Research Conference 2007. 3rd Student Research Conference in Informatics and Information Technologies Bratislava//,
April 18, 2007 : Proceedings in Informatics and Information Technologies. - Bratislava : STU v Bratislave FIIT, 2007. - ISBN 978-80-227-2631-3. - S. 285-292}}}
!!!2004
*{{justify{Kapec, Peter - Drahoš, Peter:'' Animating Human Faces Using Modified Waters Muscle Model. ''
In://''CESCG 2004'': 8th Central European Seminar on Computer Graphics//,
Budmerice, Slovakia, April 19-21, 2004. - Vienna : Institute of Computer Graphics and Algorithms Vienna University of Technology, 2004. - S. 141-148}}}
!!Published papers of supervised students
!!!2011
*{{justify{Mindek, Peter: ''Visual Artefacts Removal in Volumetric Visualization.''
In: //Information Sciences and Technologies. Bulletin of the ACM Slovakia.// - ISSN 1338-1237. - Vol. 3, No. 2 (2011), s. 96-99}}}
*{{justify{Mindek, Peter: ''Visual Artefacts Removal in Volumetric Visualization''
In: //''IIT.SRC'2011'': 7th Student Research Conference in Informatics and Information Technologies Bratislava, Vol. 2//,
May 4, 2011 Proceedings. - Bratislava : STU v Bratislave FIIT, 2011. - ISBN 978-80-227-3488-2. - S. 428-429}}}
*{{justify{Mindek, Peter: ''Maximum Intensity Projection Weighed by Statistical Cues.''
In: //''CESCG'2011'': Proceedings of the 15th Central European Seminar on Computer Graphics//,
May 2-4, 2011, Viničné, Slovakia. - Viedeň : Vienna University of Economics and Business Administration, 2011. - ISBN 978-3-9502533-3-7, pp. 149-155}}}
!!!2010
*{{justify{Ľuboš Ukrop:'' Visualizing graph structures using soap bubbles.''
In: //''IIT.SRC'': 6th Proceedings in Informatics and Information Technologies//, STU in Bratislava FIIT, vol. 2 ISBN 978-80-227-3266-3, pp 467-474, 2010}}}
!!!2009
*{{justify{Peter Čimo: ''Multiparadigm programming in Lua language.'' Extended Abstract
In: //''IIT.SRC'': 5th Proceedings in Informatics and Information Technologies//, STU in Bratislava FIIT, 2009}}}
<<tiddler HideTiddlerSubtitle>>
!!!Abstract
{{justify{This paper deals with generating of software documentation and source code analysis. Furthermore, it contains informations of the measurement of software attributes. Describes some specific metrics and their calculation. Then describes Lua scripting language and the way of making object-oriented programs in this language. In the section „Analysis of problem areas", are some of the actual used tools to deal with the analysis of source code in order to obtain metrics. An important part of the document is also the ways of representation of metrics. This thesis presents also the pros and cons of different ways of representing them. The point of this work was to extend the functionalities of ~LuaDocer tool. The tool has been enhanced in area of calculating new metrics. Another outcome of this work is the module comments, which was implemented with the purpose of parsing various comments. By including this module into the the tool ~LuaDocer we extended it in area of documentation of source files.
}}}
!!!Results
{{center{[img(10cm, )[./img/bachelor/2013/kosa/1.png]]
{{center{New documentation metrics.}}}}}}
{{center{[img(15cm, )[./img/bachelor/2013/kosa/2.png]]
{{center{Added support for documenting typed parameter/return values.}}}}}}
{{center{[img(15cm, )[./img/bachelor/2013/kosa/3.png]]
{{center{Added support for new comment tags.}}}}}}
{{center{[img(15cm, )[./img/bachelor/2013/kosa/4.png]]
{{center{Show lists of (not-)commented functions in project.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
This package provides a toolbar of interactive 'power tools' that you can use while editing a tiddler to quickly insert TiddlyWiki tiddler links, images, macros, etc. or common formatting sequences directly into tiddler content, as well as perform other functions (such as find/replace, sort, split, convert, etc.) that can be used to modify the current tiddler's source content in a variety of ways.

<<tiddler QuickEditToolbar with: show>>
!!!!!Installation:
<<<
Individual ~QuickEdit buttons are defined in separate tiddlers (e.g., [[QuickEdit_replace]]) that have also been //transcluded// into a single toolbar definition named [[QuickEditToolbar]].  You can edit this definition to add, remove, or rearrange the toolbar buttons to best suit your needs, and then embed the [[QuickEditToolbar]] tiddler into your document's [[EditTemplate]], like this:
{{{
<div macro='tiddler QuickEditToolbar'></div>
}}}
Next, in order to support some of the formatting 'shortcuts' provided by the toolbar, add a reference to the shortcuts CSS class definitions in your [[StyleSheet]]:
{{{
[[StyleSheetShortcuts]]
}}}
By default, the QuickEdit toolbar is hidden until you enable it by using the ''toggleQuickEdit'' command, which you can add to the ~EditToolbar definition in [[ToolbarCommands]]:
{{{
|EditToolbar|... toggleQuickEdit ...|
}}}
You can also toggle the ~QuickEdit toolbar display via a single checkbox option that can be added to [[SideBarOptions]] (or any other desired location):
{{{
<<option chkShowQuickEdit>> show QuickEdit toolbar
}}}
Note: You can 'hard-code' the ''chkShowQuickEdit'' setting, so that the toolbar will be //initially// displayed, by creating a tiddler (e.g., ConfigTweaks), tagged with <<tag systemConfig>>, containing:
{{{
config.options.chkShowQuickEdit=true;
}}}
Alternatively, if you want the toolbar to //always// be displayed, regardless of the option setting, you can add a special keyword, ''show'', to the [[EditTemplate]] syntax, like this:
{{{
<div macro='tiddler QuickEditToolbar with: show'></div>
}}}
<<<
/***
|Name|QuickEditPlugin|
|Source|http://www.TiddlyTools.com/#QuickEditPlugin|
|Documentation|http://www.TiddlyTools.com/#QuickEditPackage|
|Version|2.4.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Support functions for [[QuickEditPackage]]: utility functions, toolbar commands, stylesheets|
!!!!!Documentation
>see [[QuickEditPackage]] for details
!!!!!Revisions
<<<
2011.02.14 2.4.4 fix OSX error: use picker.file.path
2009.06.11 2.4.3 added keyup() function to abbreviate listbox handling for CR and ESC
2009.05.07 2.4.2 added processed() function to abbreviate event handler code
2008.09.07 2.4.1 added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.17 2.4.0 copied code from StickyPopupPlugin to remove dependency
2008.05.12 2.3.0 added "toggleQuickEdit" command handler (replaces inline script command)
2008.01.11 2.2.0 converted from inline script
2007.03.29 1.0.0 initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.QuickEditPlugin= {major: 2, minor: 4, revision: 4, date: new Date(2011,2,14)};

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

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

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

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

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

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

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

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

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

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

* see [[QuickEditPackage]] for additional installation options

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

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

!help
Reminders:

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

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

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

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

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

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

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

%/ &nbsp;/%  SPACER

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

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

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

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

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

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

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

Usage: see  <a class="linkification-ext" href="http://www.TiddlyTools.com/#QuickEditToolbar" title="Linkification: http://www.TiddlyTools.com/#QuickEditToolbar">http://www.TiddlyTools.com/#QuickEditToolbar</a>

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

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

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

**** INSERT TIDDLER ****
%/<html><hide linebreaks><a href="javascript:;" class="tiddlyLink"
title="copy content from another tiddler"
onclick="var p=Popup.create(this); if (!p) return false; p.className+=' sticky smallform';
	var s=createTiddlyElement(p,'select'); s.button=this;
	s.options[0]=new Option('select a tiddler...','');
	s.onchange=function(){
		var txt=store.getTiddlerText(this.value);
		if (!txt) { displayMessage(this.value+' not found'); this.selectedIndex=0; this.focus(); return false; }
		config.quickEdit.setSelection(this.button,txt);
		Popup.remove(); return false;
	};
	var tids=store.getTiddlers('title');
	for (var t=0; t<tids.length; t++) {
		s.options[s.length]=new Option(tids[t].title,tids[t].title);
		s.options[s.length-1].title=tids[t].getSubtitle();
	}
	var s=createTiddlyElement(p,'select');
	s.options[0]=new Option('match tag...','');
	s.onchange=function(){
		var tag=this.value;
		var tids=tag.length?store.getTaggedTiddlers(tag,'title'):store.getTiddlers('title');
		var list=this.previousSibling;
		while (list.length) list.options[0]=null;
		var prompt='select a '+(tag.length?'tagged ':'')+'tiddler'+(tag.length?(' ['+tids.length+' matches]'):'')+'...';
		list.options[0]=new Option(prompt,'');
		for (var t=0; t<tids.length; t++) {
			list.options[list.length]=new Option(tids[t].title,tids[t].title);
			list.options[list.length-1].title=tids[t].getSubtitle();
		}
	};
	var tags=store.getTags();
	for (var t=0; t<tags.length; t++) s.options[s.length]=new Option(tags[t][0],tags[t][0]);
	Popup.show(p,false);
	event.cancelBubble=true;if(event.stopPropagation)event.stopPropagation();return false;"
>tiddler</a></html>
/***
|Name|RearrangeTiddlersPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#RearrangeTiddlersPlugin" title="Linkification: http://www.TiddlyTools.com/#RearrangeTiddlersPlugin">http://www.TiddlyTools.com/#RearrangeTiddlersPlugin</a></a>|
|Version|2.0.0|
|Author|Eric Shulman|
|OriginalAuthor|Joe Raii|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.refreshTiddler|
|Description|drag tiddlers by title to re-order story column display|

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

***/
//{{{

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

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

/**************************************************
 * dom-drag.js
 * 09.25.2001
 * <a class="linkification-ext" href="<a class="linkification-ext" href="http://www.youngpup.net" title="Linkification: http://www.youngpup.net">http://www.youngpup.net</a>" title="Linkification: <a class="linkification-ext" href="http://www.youngpup.net" title="Linkification: http://www.youngpup.net">http://www.youngpup.net</a>"><a class="linkification-ext" href="http://www.youngpup.net" title="Linkification: http://www.youngpup.net">www.youngpup.net</a></a>
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 **************************************************/

var Drag = {
	obj:null,

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

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

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

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

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

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

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

config.macros.recentChanges = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var days=10; if (!isNaN(params[0])) days=parseInt(params[0]); // time limit in days (use 0 for all tiddlers)
		var summary=params[1]&&params[1].toLowerCase()=='summary'; if (summary) params.shift();
		var noedit=params[1]&&params[1].toLowerCase()=='noedit'; if (noedit) params.shift();
		var height='15em'; if (params[1]) height=params[1]; // preview area fixed height
		var previewclass='viewer'; if (params[2]) previewclass=params[2]; // preview area CSS class
		var tiddlers=store.getTiddlers('modified','excludeLists').reverse();
		var count=tiddlers.length;
		if (days) {
			var timelimit=(new Date()).getTime()-86400000*days;
			for (var count=0; count<tiddlers.length && tiddlers[count].modified>timelimit; count++);
		}
		var s=count+' tiddlers have changed since ';
		s+=new Date(timelimit).formatString('DDD, MMM DDth YYYY 0hh:0mm');
		s+=' ('+days+' days ago)';
		if (summary)
			{ wikify(s,place); return; }
		var opts='<option value="">'+s+'</option>';
		for (var i=0; i<count; i++) { var t=tiddlers[i];
			opts+='<option value="'+t.title.replace(/"/g,"&#x22;")+'">';
			opts+=t.modified.formatString('YYYY.0MM.0DD 0hh:0mm')+' - '+t.title;
			opts+='</option>';
		}
		var h=store.getTiddlerText('RecentChangesPlugin##html')
		h=h.replace(/%options%/,opts);
		h=h.replace(/%listwidth%/,noedit?79.5:69.5);
		h=h.replace(/%noedit%/,noedit?'none':'inline');
		createTiddlyElement(place,'div').innerHTML=h;
		var preview=createTiddlyElement(place,'div',null,previewclass);
		preview.style.display='none';
		preview.style.whiteSpace='normal';
		preview.style.overflow='auto';
		preview.style.height=height;
	}
}
//}}}
/***
//{{{
!html
<form><select size=1 name="list" style="width:%listwidth%%"
	onchange="this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length;
		var target=this.parentNode.parentNode.nextSibling; removeChildren(target);
		if (!this.value.length)
			{ target.style.display='none'; this.form.preview.value='preview'; }
		else if (target.style.display=='block') {
			wikify('<'+'<tiddler [['+this.value+']]>'+'>',target);
			target.style.display='block';
			this.form.preview.value='done';
		}
">%options%</select><!--
--><input type="button" name="goto" value="goto" disabled title="view selected tiddler" style="width:10%"
	onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target);
		target.style.display='none'; this.form.preview.value='preview';
		story.displayTiddler(story.findContainingTiddler(this),this.form.list.value);
"><input type="button" name="edit" value="edit" disabled title="edit selected tiddler" style="width:10%;display:%noedit%"
	onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target);
		target.style.display='none'; this.form.preview.value='preview';
		story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE);
"><input type="button" name="preview" value="preview" disabled title="show/hide tiddler preview" style="width:10%"
	onclick="var target=this.parentNode.parentNode.nextSibling;
		if (this.value=='preview') {
			removeChildren(target);
			wikify('<'+'<tiddler [['+this.form.list.value+']]>'+'>',target);
			target.style.display=this.form.list.value.length?'block':'none'; this.value='done';
		} else {
			removeChildren(target);
			target.style.display='none'; this.value='preview';
		}
"></form>
!end
//}}}
***/
 
<script label="refresh" title="re-render this tiddler">
		var here=story.findContainingTiddler(place); if (!here) return false;
		story.refreshTiddler(here.getAttribute("tiddler"),null,true);
</script><script>place.lastChild.className='button';</script>
!!!Dissertation
Supervisor: assoc. prof. Martin Šperka, ~PhD.
Theme:  ''Knowledge-based software representation, querying and visualization''

Short [[annotation|Knowledge-based software representation, querying and visualization]] of my thesis. Results have been published in several [[papers|Publications]].
!!!Research interests
[>img(,7cm)[Me...|img/scientist.jpg]]
My research focuses on:
*Software visualization
*Information and knowledge visualization
*Graph visualization
*Computer Graphics
*Programming Languages

<<tiddler HideTiddlerSubtitle>>
Useful information for students working on their bachelor project or master thesis.
!! How-to
* Work on your [[bachelor project|Bachelor project - how-to]]
* Work on your [[master thesis|Master thesis - how-to]]
!!Resources
Search for relevant books, papers, proceedings, conferences etc. using:
* [[CiteSeerX|http://citeseerx.ist.psu.edu/]]
* [[ACM Portal|http://portal.acm.org/]]
* [[IEEE|http://ieeexplore.ieee.org/]]
* [[Google Scholar|http://scholar.google.com/schhp?hl=en&tab=ws]]
* [[Wikipedia|http://www.wikipedia.org/]] is ''NOT'' considered a trustworthy resource!!! (just for introduction to problematics)
Store and organize found materials using programs like [[Zotero|http://www.zotero.org]] or [[Mendeley|http://www.mendeley.com/]].
Or at least rename files to paper title - easier to search...
!!Writing documentation
*use ~LaTeX ([[MikTeX|http://miktex.org/]], ~TexLive, etc.)
*[[LaTeX template|data/latex_template.zip]]
*store and manage citations in ~BibTex using e.g. [[JabRef|http://jabref.sourceforge.net/]]
<<tiddler HideTiddlerSubtitle>>
!!!Abstract
{{justify{This work deals with the process of the creation of documentation from Lua source code. In this work, the whole process is divided into several sections. Each section contains a basic description of objects, interesting findings and relevant information with them. The approach is also focused on UML diagrams. UML slowly growing to standard of documentation content, and option to generate these diagrams, should be included in any good documentation generator. The result of this work is the specification, design and implementation of module to generate UML diagrams, static code analysis and minor changes in ~LuaDocer.}}}
{{center{[img(20cm, )[./img/bachelor/2015/Karasek/umldetail.png]]
{{center{The generated function documentation with the added UML diagram.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
/***
|Name|SaveAsPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPlugin" title="Linkification: http://www.TiddlyTools.com/#SaveAsPlugin">http://www.TiddlyTools.com/#SaveAsPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#SaveAsPluginInfo" title="Linkification: http://www.TiddlyTools.com/#SaveAsPluginInfo">http://www.TiddlyTools.com/#SaveAsPluginInfo</a>|
|Version|2.6.1|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Save current document to a different path/filename|
Adds 'save as' command to 'backstage' menu and {{{<<saveAs>>}}} macro (to embed command link wherever you like).
>//Note: This plugin replaces functionality previously provided by [[NewDocumentPlugin]], except for the HTML+CSS 'snapshot' feature, which has been moved to a separate [[SnapshotPlugin]].//
!!!!!Documentation
<<<
see [[SaveAsPluginInfo]]
<<<
!!!!!Revisions
<<<
2009.08.04 [2.6.1] fixed handling when limit is omitted
| Please see [[SaveAsPluginInfo]] for additional revision details |
2006.02.03 [1.0.0] Created
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveAsPlugin= {major: 2, minor: 6, revision: 1, date: new Date(2009,8,4)};

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

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

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

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

Usage: <<tiddler ScrollBox with: TiddlerName height>>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
	store.notify(config.macros.search.reportTitle,true);
}
//}}}
/%
!info
|Name|ShowPopup|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ShowPopup" title="Linkification: http://www.TiddlyTools.com/#ShowPopup">http://www.TiddlyTools.com/#ShowPopup</a></a>|
|Version|1.1.0|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|transcluded html|
|Requires||
|Overrides||
|Description|display tiddler content in a TiddlyWiki popup panel|
Usage:
<<<
{{{
<<tiddler ShowPopup with: TiddlerName label tooltip buttonClass width popupClass>>
}}}
*{{{TiddlerName}}} is the title of the tiddler whose content is to be displayed
*{{{label}}} is the text of the popup command
*{{{tooltip}}} is the mouseover help text for the command
*{{{buttonClass}}} is a CSS classname applied to the command text (default=button)
*{{{width}}} is the width of the popup (using CSS measurements, default=auto)
*{{{popupClass}}} is a CSS classname applied to the popup panel (default=none).  Use 'sticky' for persistent popups (requires  StickyPopupPlugin)
<<<
Example:
<<<
{{{
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
}}}
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
<<<
!end

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

%/<<tiddler {{'ShowPopup##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]] [[$6]]>>
<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<slider chkSliderSidebarTabs SideBarTabs##tabset 'index »' 'view lists of tiddlers'>>/%
!tabset
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
!end
%/
/***
|Name|SinglePageModePlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePlugin" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePlugin">http://www.TiddlyTools.com/#SinglePageModePlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#SinglePageModePluginInfo" title="Linkification: http://www.TiddlyTools.com/#SinglePageModePluginInfo">http://www.TiddlyTools.com/#SinglePageModePluginInfo</a>|
|Version|2.9.6|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Options|##Configuration|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 [1.0.0] Initial Release.  Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 6, date: new Date(2008,10,17)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
	config.options.chkSinglePageMode=eval(v);
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
		config.lastURL = window.location.hash;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined)
	config.options.chkSinglePageMode=false;
if (config.options.chkSinglePagePermalink==undefined)
	config.options.chkSinglePagePermalink=true;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
	config.options.chkSinglePageKeepFoldedTiddlers=false;
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
	config.options.chkSinglePageKeepEditedTiddlers=false;
if (config.options.chkTopOfPageMode==undefined)
	config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined)
	config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined)
	config.options.chkSinglePageAutoScroll=false;
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
	if (!config.options.chkSinglePageMode)
		{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
	if (config.lastURL == window.location.hash) return; // no change in hash
	var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
	if (tids.length==1) // permalink (single tiddler in URL)
		story.displayTiddler(null,tids[0]);
	else { // restore permaview or default view
		config.lastURL = window.location.hash;
		if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
		story.closeAllTiddlers();
		story.displayTiddlers(null,tids);
	}
}


if (Story.prototype.SPM_coreDisplayTiddler==undefined)
	Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already displayed
	var opt=config.options;
	var single=opt.chkSinglePageMode && !startingUp;
	var top=opt.chkTopOfPageMode && !startingUp;
	var bottom=opt.chkBottomOfPageMode && !startingUp;
	if (single) {
		story.forEachTiddler(function(tid,elem) {
			// skip current tiddler and, optionally, tiddlers that are folded.
			if (	tid==title
				|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
				return;
			// if a tiddler is being edited, ask before closing
			if (elem.getAttribute("dirty")=="true") {
				if (opt.chkSinglePageKeepEditedTiddlers) return;
				// if tiddler to be displayed is already shown, then leave active tiddler editor as is
				// (occurs when switching between view and edit modes)
				if (tiddlerElem) return;
				// otherwise, ask for permission
				var msg="'"+tid+"' is currently being edited.\n\n";
				msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
				if (!confirm(msg)) return; else story.saveTiddler(tid);
			}
			story.closeTiddler(tid);
		});
	}
	else if (top)
		arguments[0]=null;
	else if (bottom)
		arguments[0]="bottom";
	if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
	if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		if (!isTopTiddler && (single || top))
			tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
		else if (bottom)
			tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
		else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	} else
		this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=document.getElementById(story.idPrefix+title);
	if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
		// scroll to top of page or top of tiddler
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
		// if animating, defer scroll until after animation completes
		var delay=opt.chkAnimate?config.animDuration+10:0;
		setTimeout("window.scrollTo(0,"+yPos+")",delay);
	}
}

if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
	Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
	// suspend single/top/bottom modes when showing multiple tiddlers
	var opt=config.options;
	var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
	var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
	var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
	this.SPM_coreDisplayTiddlers.apply(this,arguments);
	opt.chkBottomOfPageMode=saveBPM;
	opt.chkTopOfPageMode=saveTPM;
	opt.chkSinglePageMode=saveSPM;
}
//}}}
{{floatright small{<<tiddler BreadcrumbsCommand with: crumbs>><<tiddler ToggleBreadcrumbs>>}}}{{small{
Goto/Search:
{{transparent{<<gotoTiddler
	inputstyle:"width:100%;font-size:100%;border:2px inset #999;"
	liststyle:"font-size:100%;"
	search
>>}}}}}}
<html>Assistant professor at FIIT STU Bratislava</html>
[<img(,1.5cm)[Stand back, I'm going to try Science |img/stand-back-new.jpg]]&nbsp;&nbsp;&nbsp;Peter Kapec, ~PhD.
/***
|Name|SnapshotPlugin|
|Source|http://www.TiddlyTools.com/#SnapshotPlugin|
|Documentation|http://www.TiddlyTools.com/#SnapshotPluginInfo|
|Version|1.4.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|save or print HTML+CSS image of rendered document content|
This plugin provides a macro as well as tiddler toolbar commands to create a file or browser window containing the //rendered// CSS-and-HTML that is currently being displayed for selected elements of the current document.
!!!!!Documentation
>see [[SnapshotPluginInfo]]
!!!!!Configuration
<<<
<<option chkSnapshotHTMLOnly>> output HTML only (omit CSS)
<<<
!!!!!Revisions
<<<
2011.02.14 1.4.3 fix OSX error: use picker.file.path
2011.01.03 1.4.2 added snapshotSaveViewer toolbar command
2010.12.15 1.4.1 added 'snapshot' class to wrapper
|please see [[SnapshotPluginInfo]] for additional revision details|
2008.04.21 1.0.0 initial release - derived from [[NewDocumentPlugin]] with many improvements...
<<<
!!!!!Code
***/
//{{{
version.extensions.SnapshotPlugin= {major: 1, minor: 4, revision: 3, date: new Date(2011,2,14)};

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

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

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

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

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

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

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

// // COPIED FROM [[StickyPopupPlugin]] TO ELIMINATE PLUGIN DEPENDENCY
//{{{
if (config.options.chkStickyPopups==undefined) config.options.chkStickyPopups=false;
Popup.stickyPopup_onDocumentClick = function(ev)
{
	// if click is in a sticky popup, ignore it so popup will remain visible
	var e = ev ? ev : window.event; var target = resolveTarget(e);
	var p=target; while (p) {
		if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
		else p=p.parentNode;
	}
	if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
		Popup.onDocumentClick(ev);
	return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
/***
|Name|SnapshotPluginInfo|
|Source|http://www.TiddlyTools.com/#SnapshotPlugin|
|Documentation|http://www.TiddlyTools.com/#SnapshotPluginInfo|
|Version|1.4.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for SnapshotPlugin|
This plugin provides a macro as well as tiddler toolbar commands that creates a file or opens a new browser window containing the //rendered// HTML and CSS style definitions that are being displayed for selected elements of the current document.
!!!!!Usage:
<<<
As a macro embedded in tiddler content:
{{{
<<snapshot print label:text prompt:text id:elementID|here|viewer|story|all|ask>
}}}
where:
*''print'' //(optional)//<br>when present, causes the snapshot output to be directed to a new browser tab/window instead of saving it to a file.  In addition, the print dialog for that tab/window is automatically invoked.
*''label'' //(optional)//<br>is the text to be displayed for the command link generated by the macro
*''prompt'' //(optional)//<br>is the 'tool tip' message displayed when you mouseover the command link
*''id:...'' //(optional)//<br>specifies the document element to be captured, and can be one of:
**''elementID''<br>is a specific DOM element ID, such as "displayArea", "mainMenu", "contentWrapper", etc.
**''here''<br>the containing tiddler in which the macro (or toolbar command) occurs, including the tiddler title and subtitle (date/time/author) information.
**''viewer''<br>same as ''here'', but omits the tiddler title, subtitle and toolbar elements (i.e., it includes //only// the content of the tiddler)
**''story''<br>selects all currently displayed tiddlers (i.e., the 'story column')
**''all''<br>selects the entire document contents, including page header, main menu and sidebar displays
**''ask''<br>when the snapshot command link is clicked, a droplist is displayed so you can choose from several pre-defined elements: "current tiddler", "story column", or "entire document", or "DOM element ID..."  When DOM element ID is chosen, the droplist is refreshed to show the individual ID's for all currently rendered DOM elements (at least, the ones that have ID's).  For any given DOM element ID, only the portions of the document that are contained //within// the specified DOM element will be transcribed to the resulting snapshot or print output.
//''NOTE: when no parameters are specified, the macro creates a snapshot file using the containing tiddler as the default element.'' (e.g., equivalent to {{{<<snapshot id:here>>}}}//

The snapshot/print functions can also be embedded as tiddler toolbar commands in [[ViewTemplate]]:
{{{
<span class='toolbar' macro='toolbar snapshotSave'></span>
<span class='toolbar' macro='toolbar snapshotSaveViewer'></span>
<span class='toolbar' macro='toolbar snapshotPrint'></span>
<span class='toolbar' macro='toolbar snapshotPrintViewer'></span>
}}}
* By default, the toolbar commands use the "id:ask" option to display a droplist of elements to select from.  The "...Viewer" form of each command bypasses the droplist and automatically selects the current tiddler viewer area for saving/printing.

Please note that, although the snapshot/print that is created using the HTML+CSS of the displayed content, ''there is NO javascript code'' written into the snapshot.  As a result, the snapshot only ''reproduces the //appearance// of the displayed content, allowing you to //view// or //print// the result'', but does not permit you to interact with it in other ways.

For example, even simple processing (such as mouseover highlighting) will not function from the snapshot.  You can't click a TiddlyLink to open other tiddlers, because A) there is no code that handles the click and B) there is no underlying 'storeArea' (and core code) to retrieve and render anything!  You also can't use ANY command links, since these also require javascript code (and the core) to operate.

__''Custom CSS for printing''__
There can be differences in the appearance of snapshot output when rendered on different devices (e.g. screen vs. printer).  Although these differences are typically very minor, it is sometimes necessary to define alternative CSS styles to account for the differences in device characteristics, such as font metrics, page sizes, resolutions, etc.  You can use the {{{@@media}}} wrapper within your custom StyleSheet CSS to define printer-specific formatting:
{{{
@media print {
...
}
}}}
The plugin places the snapshot output within a custom CSS class wrapper, using the classname, "{{{.snapshot}}}".  This enables you to define and apply custom formatting rules to 'fine tune' the appearance of the snapshot output, regardless of the intended output device.  For example, the following rule will override and hide tiddler borders and background colors when displaying and/or printing snapshots.
{{{
.snapshot .viewer { border:0 !important; background-color:none !important; }
}}}
<<<
!!!!!Examples:
<<<
{{{<<snapshot>>}}}: <<snapshot>>
{{{<<snapshot id:mainMenu>>}}}: <<snapshot id:mainMenu>>
{{{<<snapshot print id:story>>}}}: <<snapshot print id:story>>
{{{<<snapshot print id:ask>>}}}: <<snapshot print id:ask>>
{{{<<snapshot print noCSS id:viewer>>}}}: <<snapshot print noCSS id:viewer>>
<<<
!!!!!Configuration
<<<
<<option chkSnapshotHTMLOnly>> output HTML only (omit CSS)
<<<
!!!!!Revisions
<<<
2011.01.03 1.4.2 added snapshotSaveViewer toolbar command
2010.12.15 1.4.1 added 'snapshot' class to wrapper
2010.11.20 1.4.0 added snapshotPrintViewer toolbar command
2009.10.12 1.3.0 added multi-file story snapshot
2009.09.25 1.2.1 in getSnap(), added META tag to set UTF-8 encoding for I18N support
2009.06.04 1.2.0 added handling in getSnap() so current form input values are shown in snapshots
2008.05.16 1.1.1 added try..catch around addEvent/removeEvent calls to avoid error in Opera
2008.04.28 1.1.0 removed 'viewerHTML' from 'ask' droplist and replaced with toggle for "output HTML only".  Removed 'noCSS' parameter and replaced with config.options.chkSnapshotHTMLOnly global option.  Added "select a tiddler..." to 'ask' droplist
2008.04.24 1.0.1 in saveSnap(), convert output from Unicode to UTF before passing to saveFile().  Fixes "unknown name" error in IE's file.Write() function.
2008.04.21 1.0.0 initial release - derived from [[NewDocumentPlugin]] with many improvements, including: "ask for ID" using droplist of available DOM elements, use "<base href=...>" for correctly resolving image references, wrap 'viewer only' output in class="tiddler viewer" for proper application of inherited CSS styles, snapshotSave and snapshotPrint tiddler toolbar command definitions, and more...

__Excerpted revisions from [[NewDocumentPlugin]] (obsolete)__
2008.04.20 1.8.0 added support for 'noCSS' and 'viewer' params for alternative snapshot output
2007.03.30 1.7.0 added support for "print" param as alternative for "snap".  When "print" is used, the filename is ignored and ouput is directed to another browser tab/window, where the print dialog is then automatically triggered.
2007.03.30 1.6.1 added support for "here" keyword for current tiddler elementID and "prompt:text" param for specifying tooltip text
2006.10.18 1.5.0 new optional param for 'snap'... specify alternative DOM element ID (default is still "contentWrapper").  Based on a suggestion from Xavier Verges.
2006.03.09 1.2.0 added special "snap" filter parameter to generate and write "snapshot" files containing static HTML+CSS for currently rendered document.
2006.02.03 1.0.0 Created.
<<<
All related information is available [[here|http://www2.fiit.stuba.sk/~bielik/courses/vsi-slov/index.html]].

Following master thesis themes under my supervision are available for cosultations: [in Slovak language]
*academic year [[2011-12|Diploma thesis themes 2011]]
*academic year [[2010-11|Diploma thesis themes 2010]]

<<tiddler HideTiddlerSubtitle>>
[in Slovak language]
!!!Rozpoznávanie pohybu tváre používateľa
{{justify{V súčastnosti sú web-kamery súčasťou skoro každého nového počítača. Prítomnosť kamery možno zúžitkovať na detekciu polohy a pohybu tváre používateľa  pracujúceho s počítačom. Polohu a pohyb tváre používateľa možno využiť na zmenu polohy virtuálnej kamery nachádzajúcej sa v 3D scéne, alebo aj priamo na okná na pracovnej ploche monitora. Pre lepšiu ilustráciu pozri nasledujúce videá:}}}
http://www.youtube.com/watch?v=wznrHpL8AJ8&feature=related
http://www.youtube.com/watch?v=P0Cn3y9hrHw&feature=related
http://vimeo.com/14959854
Cieľom práce bude experimentovanie s podobnými riešeniami pre použitie v existujúcom vizualizačnom nástroji na vizualizáciu grafov v 3D priestore.
Poznámky:
*požadované impl. prostredie: C/C++
*návod na detekciu pohybu tváre pomocou knižnice ~OpenCV: http://www.cognotics.com/opencv/servo_2007_series/index.html
*existujúci systém na vizualizáciu grafov používa ~OpenGL a knižnicu OpenSceneGraph
!!!Framework na tvorbu 2D rozhraní v 3D priestore (Kapec, sept.  2010)
{{justify{V súčastnosti je nástup 3D zobrazovania nezadržateľný, avšak väčšina grafických používateľských rozhraní je 2D. Vzniká teda otázka ako vytvárať a používať známe 2D prvky grafických rozhraní v 3D priestore (nemyslí sa okno s 3D pohľadom a 2D prvky „niekde“ okolo tohto okna, ale ako umiestniť 2D GUI prvky priamo v 3D scéne). Presun do 3D sveta umožňuje aj vytváranie GUI pozostávajúcich z 3D telies, čo prináša ďalšie problémy pri interakcii. Cieľom práce bude preskúmať súčasný stav, navrhnúť a implementovať základný framework na vytáranie 2D menu systému (prip. iných GUI prvkov), ktoré budú zasadené do 3D scény.}}}
Poznámky:
*možno vychádzať z prác študentov Bc. Miroslav Mikuláš a Bc. Matúš Čerman - Grafické používateľské rozhrania v 3D priestore
*inšpiráciou môžu byť videá:
http://www.youtube.com/watch?v=bnck2oXdxMo (od minúty 3:30)
http://www.youtube.com/watch?v=iISmdvyp-lQ&feature=related (od minúty 3:50)
<<tiddler HideTiddlerSubtitle>>
!!!Abstract
{{justify{At present the software or code metrics are not using just for counting lines of source code, but their area of use is getting larger. They help programmers in source code’s analyse but moreover they are able to find weak points in modules that can course errors. Software measurement helps also management to find out the state of software development progress and it helps estimate implementation and maintenance costs.}}}
!!!Results
{{center{[img[img/bachelor/2008/turza/2008_turza_bc.jpg]]}}}
{{center{}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
<html>Statistics about students I was supervising:
||''Bachelor projects''|''Master theses''|
|''successful''|{{center{32}}}|{{center{29}}}|
|''failed''|{{center{4}}}|{{center{1}}}|
|''overtime''|{{center{4}}}|{{center{2}}}|
''Notes:''
*successful - on time &amp; successful
*failed - repeated ~BP2 or ~DP3 evaluated FX
*overtime - successful, but some parts were evaluated FX<tiddler hidetiddlersubtitle=""></tiddler></html>
<<tiddler HideTiddlerSubtitle>>
/***
|Name|StickyPopupPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StickyPopupPlugin" title="Linkification: http://www.TiddlyTools.com/#StickyPopupPlugin">http://www.TiddlyTools.com/#StickyPopupPlugin</a></a>|
|Version|1.0.1|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Popup.onDocumentClick|
|Options|##Configuration|
|Description|allow mouse interactions inside popups without automatically closing them|
Usually, when a TW popup is displayed, it is automatically closed whenever a click occurs //anywhere// in the document, either //inside// or //outside// the popup itself.  This plugin makes popups persistent (a.k.a, "sticky"), allowing you to perform multiple mouse interactions on content //inside// the popup (e.g., entering form fields, opening links, selecting text, etc.), remaining visible until you click //outside// the popup or perform an action that opens another popup (only one popup can be displayed at any given time).
!!!!!Configuration
<<<
You can cause popups to behave in a persistent ("sticky") manner simply by selecting the option checkbox below.  The selected popup display behavior will be applied to ALL popups in the document automatically.
><<option chkStickyPopups>> make all popups "sticky"
>{{{usage: <<option chkStickyPopups>>}}}
<<<
!!!!!Usage
<<<
If you are developing your own plugins or inline scripts that create popups programmatically using the core function:
{{{
Popup.create(this)
}}}
you can provide additional parameters that specify the desired CSS classname(s) to assign to the popup DOM element.  The default class when none is specified is simply "popup".  To create a //sticky// popup, simply enter a custom class combination like this:
{{{
Popup.create(this,null,"sticky popup")
}}}
<<<
!!!!!Revisions
<<<
2008.05.16 [1.0.1] added try..catch around addEvent/removeEvent calls to avoid error in Opera
2007.11.25 [1.0.0] initial release - moved from [[CoreTweaks]]
<<<
!!!!!Code
***/
//{{{
version.extensions.StickyPopupPlugin= {major: 1, minor: 0, revision: 1, date: new Date(2008,5,16)};

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

Popup.stickyPopup_onDocumentClick = function(ev)
{
	// if click is in a sticky popup, ignore it so popup will remain visible
	var e = ev ? ev : window.event; var target = resolveTarget(e);
	var p=target; while (p) {
		if (hasClass(p,"popup") && (hasClass(p,"sticky")||config.options.chkStickyPopups)) break;
		else p=p.parentNode;
	}
	if (!p) // not in sticky popup (or sticky popups disabled)... use normal click handling
		Popup.onDocumentClick(ev);
	return true;
};
try{removeEvent(document,"click",Popup.onDocumentClick);}catch(e){};
try{addEvent(document,"click",Popup.stickyPopup_onDocumentClick);}catch(e){};
//}}}
{{center{
{{floatleft{<<tiddler ToggleLeftSidebar>>}}}{{floatright{<<tiddler ToggleRightSidebar>>}}}/%
%/{{small{
<<openStory popup>><script>
	place.lastChild.className='tiddlyLinkExisting';
</script>/%
%/ &nbsp; <<tiddler ShowPopup with:
	[[StoryMenu##changes]] "changes" "show recent changes" tiddlyLinkExisting 60em sticky>>/%
%/ &nbsp; {{span{<script>
	place.style.display=readOnly?'none':'inline';
</script><<tiddler ShowPopup with:
	[[DocumentSetup]] "setup" "configuration and setup" tiddlyLinkExisting auto sticky>>/%
%/}}}
{{smallform{<<unsavedChanges panel>>}}}/%
%/}}}/%
!changes
{{smallform{<<recentChanges 30>>}}}
!end
%/
/***
|Name|StorySaverPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPlugin" title="Linkification: http://www.TiddlyTools.com/#StorySaverPlugin">http://www.TiddlyTools.com/#StorySaverPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#StorySaverPluginInfo" title="Linkification: http://www.TiddlyTools.com/#StorySaverPluginInfo">http://www.TiddlyTools.com/#StorySaverPluginInfo</a>|
|Version|1.7.1|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|MarkupPostBody|
|Overrides|confirmExit(), getParameters()|
|Description|save/restore current tiddler view between browser sessions|
Automatically save a list of currently viewed tiddlers (the 'story') in a local cookie, {{{txtSavedStory}}} and then open those tiddlers when the document is reloaded, so you can resume working from the same place you left off!!  Also, use {{{<<saveStory>>}}} and {{{<<openStory>>}}} macros to quickly save/re-display stories stored in tiddlers, using a command link, droplist, or popup display.
!!!!!Documentation
>see [[StorySaverPluginInfo]]
!!!!!Configuration
<<<
<<option chkStoryAllowAdd>>include 'add a story' command in droplist/popup
<<option chkStoryFold>>fold story tiddlers when opening a story (see [[CollapseTiddlersPlugin]])
<<option chkStoryClose>>close other tiddlers when opening a story
<<option chkStoryTop>>open story tiddlers at top of column
<<option chkStoryBottom>>open story tiddlers at bottom of column
<<<
!!!!!Revisions
<<<
2009.07.27 [1.7.1] corrected test for {{{chkStoryAllowAdd}}} when rendering //list// output
2009.07.27 [1.7.0] added options: {{{chkStoryAllowAdd=true}}}, {{{chkStoryTop=true}}}, and {{{chkStoryBottom=false}}}.  Also, autoscroll to first tiddler in story
|please see [[StorySaverPluginInfo]] for additional revision details|
2007.10.05 [1.0.0] initial release. Moved [[SetDefaultTiddlers]] inline script and rewrote as a {{{<<saveStory>>}}} macro.
<<<
!!!!!Code
***/
//{{{
version.extensions.StorySaverPlugin= {major: 1, minor: 7, revision: 1, date: new Date(2009,7,27)};
//}}}
// // ''save or clear story cookie on exit:''
//{{{
// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
	}
}

if (config.options.chkSaveStory==undefined) config.options.chkSaveStory=false;
if (window.coreTweaks_confirmExit==undefined) {
	window.coreTweaks_confirmExit=window.confirmExit;
	window.confirmExit=function() {
		if (config.options.chkSaveStory) { // save cookie
			var links=[];
			story.forEachTiddler(function(title,element){links.push('[['+title+']]');});
			config.options.txtSavedStory=links.join(' ');
			saveOptionCookie('txtSavedStory');
		} else removeCookie('txtSavedStory');
		return window.coreTweaks_confirmExit.apply(this,arguments);
	}
}
//}}}
/***
''apply saved story on startup:'' //important note: the following code is actually located in [[MarkupPostBody]].  This is because it needs to supercede the core's getParameters() function, which is called BEFORE plugins are loaded, preventing the normal plugin-based hijack method from working, while code loaded into [[MarkupPostBody]] will be processed as soon as the document is read, even before the TW main() function is invoked.//
<<tiddler MarkupPostBody>>
***/
// // MACRO definitions
//{{{
config.macros.saveStory = {
	label: 'set default tiddlers',
	defaultTiddler: 'DefaultTiddlers',
	prompt: 'store a list of currently displayed tiddlers in another tiddler',
	askMsg: 'Enter the name of a tiddler in which to save the current story:',
	tag: 'story',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tid=params.shift()||'DefaultTiddlers';
		var label=params.shift()||this.label;
		var tip=params.shift()||this.prompt;
		var btn=createTiddlyButton(place,label,tip,this.setTiddler,'button');
		btn.setAttribute('tid',tid);
		btn.setAttribute('extratags','[['+params.join(']] [[')+']]');
	},
	setTiddler: function() {
		var cms=config.macros.saveStory; // abbrev
		// get list of current open tiddlers
		var tids=[];
		story.forEachTiddler(function(title,element){tids.push('[['+title+']]')});
		// get target tiddler
		var tid=this.getAttribute('tid');
		if (!tid || tid=='ask') {
			tid=prompt(cms.askMsg,cms.defaultTiddler);
			if (!tid || !tid.length) return; // cancelled by user
		}
		if(store.tiddlerExists(tid) && !confirm(config.messages.overwriteWarning.format([tid]))) return;
		tids=tids.join('\n'); // separate tiddler links by newlines for easier reading
		var t=store.getTiddler(tid); var tags=t?t.tags:[];
		var extratags=this.getAttribute('extratags').readBracketedList();
		for (var i=0; i<extratags.length; i++) tags.pushUnique(extratags[i]);
		tags.pushUnique(cms.tag);
		store.saveTiddler(tid,tid,tids,config.options.txtUserName,new Date(),tags,t?t.fields:null);
		story.displayTiddler(null,tid);
		story.refreshTiddler(tid,null,true);
		displayMessage(tid+' has been '+(t?'updated':'created'));
	}
}
//}}}

//{{{
if (config.options.chkStoryFold==undefined) config.options.chkStoryFold=true;
if (config.options.chkStoryClose==undefined) config.options.chkStoryClose=true;
if (config.options.chkStoryAllowAdd==undefined) config.options.chkStoryAllowAdd=true;
if (config.options.chkStoryTop==undefined) config.options.chkStoryTop=true;
if (config.options.chkStoryBottom==undefined) config.options.chkStoryBottom=false;

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

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

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

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

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

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

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

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

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

/* APA zmena velkosti fontu */
body{font-size:14px}

/* PK - zvyraznovanie odkazov v main menu */
a.tiddlyLink.tiddlyLinkExisting:hover {
background: #fe8;
border-color: #db4;
}

/* ADJUSTMENTS TO SHORTCUTS */
.small	{ font-size:90%; line-height:120%; }
.fine	{ font-size:80%; line-height:120%; }
.tiny	{ font-size:70%; line-height:120%; }
.groupbox	{ padding:.5em; border:1px solid gray; -moz-border-radius:.5em; -webkit-border-radius:.5em; }

/* CUSTOM SHORTCUTS */
.scroll	{ display:block; overflow:auto; width:auto; max-height:8em; padding-bottom:.5em; }
.scroll ul	{ margin:0; }
.scroll li	{ white-space:nowrap; }
*[id="mainMenu"] .scroll li  /* MOZ ONLY */	{ margin-left:-2em; }

/* ADJUSTMENTS TO STANDARD ELEMENTS */
[[StyleSheetAdjustments]]

/* ADJUSTMENTS TO CUSTOM ELEMENTS */
.storyListbox	{ font-size:80%; }
.siteNav	{ position:absolute;z-index:1;right:.5em;top:2em;width:14em; }
.siteNav, .siteNav .button	{ color:#fff }
.siteNav .button:hover	{ color:#009 }
.siteNav input[type="checkbox"]	{ margin:0; }


/*BlackIcity*/
body{	font-family: "Neue Helvetica", Helvetica, "Lucida Grande", Verdana, sans-serif;
	background-color: #fff;
	color: #333;}

#topMenu {position:relative; background:#282826; padding:10px; color:#fff;font-family:'Lucida Grande', Verdana, Sans-Serif;}
#topMenu br {display:none;}

#topMenu a{			color: #999;
			padding: 0px 8px 0px 8px;
			border-right: 1px solid #444;}
#topMenu a:hover {color:#fff; background:transparent;}

/* PK mod - kazi lave menu
#displayArea {margin-left:1em; margin-bottom:2em; margin-top:0.5em;}
*/

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

.viewer a, .viewer a:hover {border-bottom:1px dotted #333; font-weight:bold;}


.viewer .button, .editorFooter .button{
color: #333;
border: 1px solid #333;
}

.viewer .button:hover,
.editorFooter .button:hover, .viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter .highlight{
color: #fff;
background: #333;
border-color: #333;
}

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

.toolbar {font-size:90%;}
.selected .toolbar a {color:#999999;}
.selected .toolbar a:hover {color:#333; background:transparent;border:1px solid #fff;}

.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#333; background:transparent;border:1px solid #fff;}

/***
!Sidebar
***/
#sidebar { margin-bottom:2em !important; margin-bottom:1em; right:0;
}

/***
!SidebarOptions
***/
#sidebarOptions { padding-top:2em;background:#f3f3f3;padding-left:0.5em;}

#sidebarOptions a {
			color:#333;
                        background:#f3f3f3;
                        border:1px solid #f3f3f3;
			text-decoration: none;
}

#sidebarOptions	a:hover, #sidebarOptions a:active {
			color:#222;
			background-color:#fff;border:1px solid #fff;
		}

#sidebarOptions input {border:1px solid #ccc; }

#sidebarOptions .sliderPanel {
	background: #f3f3f3; 	font-size: .9em;
}

#sidebarOptions .sliderPanel input {border:1px solid #999;}
#sidebarOptions .sliderPanel .txtOptionInput {border:1px solid #999;width:9em;}

#sidebarOptions .sliderPanel a {font-weight:normal; color:#555;background-color: #f3f3f3; border-bottom:1px dotted #333;}


#sidebarOptions .sliderPanel a:hover {
color:#111;
background-color: #f3f3f3;
border:none;
border-bottom:1px dotted #111;
}
/***
!SidebarTabs
***/
 .listTitle {color:#222;}
#sidebarTabs {background:#f3f3f3;}

#sidebarTabs .tabContents {background:#cfcfcf;}

#sidebarTabs .tabUnselected:hover {color:#999;}

#sidebarTabs .tabSelected{background:#cfcfcf;}

#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#666;}
#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#222;background:transparent; text-decoration:none;border:none;}

#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#222;background:transparent;}

#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents{
 color: #111;
 background: #f3f3f3; border:1px solid #f3f3f3;
}

#sidebarTabs .txtMoreTab .tabUnselected {
 color: #555;
 background: #AFAFAF;
}



/***
!Tabs
***/
.tabSelected{color:#fefefe; background:#999; padding-bottom:1px;}
 .tabSelected, .tabSelected:hover {
 color: #111;
 background: #fefefe;
 border: solid 1px #cfcfcf;
}

 .tabUnselected {
 color: #999;
 background: #eee;
 border: solid 1px #cfcfcf;
 padding-bottom:1px;
}
.tabUnselected:hover {text-decoration:none; border:1px solid #cfcfcf;}
.tabContents {background:#fefefe;}





.tagging, .tagged {
border: 1px solid #eee;
background-color: #F7F7F7;
}

.selected .tagging, .selected .tagged {
background-color: #f3f3f3;
border: 1px solid #ccc;
}

.tagging .listTitle, .tagged .listTitle {
color: #bbb;
}

.selected .tagging .listTitle, .selected .tagged .listTitle {
color: #333;
}

.tagging .button, .tagged .button {
color:#ccc;
}
.selected .tagging .button, .selected .tagged .button {
color:#aaa;
}

.highlight, .marked {background:transparent; color:#111; border:none; text-decoration:underline;}

.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {
border: none; background:transparent; text-decoration:underline; color:#333;
}

.viewer table, .viewer td {
border: 1px solid #282826;
}

.popup {
background: #cfcfcf;
border: 1px solid #333;
}

.popup li.disabled {
color: #000;
}

.popup li a, .popup li a:visited {
color: #555;
border: none;
}

.popup li a:hover {
background: #f3f3f3;
color: #555;
border: none;
}



#messageArea {

border: 4px dotted #282826;
background: #F3F3F3;
color: #333;
font-size:90%;
}

#messageArea a:hover { background:#f5f5f5; border:none;}


#messageArea .button{
color: #333;
border: 1px solid #282826;
}

#messageArea .button:hover {
color: #fff;
background: #282826;
border-color: #282826;
}

.tiddler {padding-bottom:10px;}

.viewer blockquote {
border-left: 5px solid #282826;
}



.viewer th, thead td {
background: #282826;
border: 1px solid #282826;
color: #fff;
}


.viewer code {
color: #111; background:#f5f5f5;
}

.viewer hr {
border-top: dashed 1px #222; margin:0 1em;
}

.editor input {
border: 1px solid #ccc; margin-top:5px;
}

.editor textarea {
border: 1px solid #ccc;
}

.viewer pre {
border: 1px solid #ccc;
background: #f5f5f5;
}

h1,h2,h3,h4,h5 { color: #282826; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }
h1 {font-size:18px;}
h2 {font-size:16px;}
h3 {font-size: 14px;}



/*}}}*/
/*{{{*/
/* ADJUSTMENTS TO STANDARD ELEMENTS */
.headerShadow, .headerForeground
	{ padding-top:1em; white-space:nowrap; }
#mainMenu
	{ text-align:left; width:14em; padding:0.5em; }
#mainMenu table, #mainMenu table td
	{ border:1px solid #999; border-collapse:collapse; padding:.3em; }
#displayArea
	{ margin-left:16em; margin-right:15em; }
.popup
	{ max-height:40em; overflow:auto; -moz-border-radius:.5em; -webkit-border-radius:.5em; padding:.5em; }
.popup li
	{ white-space:nowrap; line-height:100%; }
.toolbar
	{ float:right; white-space:nowrap; }


/* robi ramcek okolo tiddler - nechcem
.viewer
	{ border:1px solid gray; -moz-border-radius:.5em; -webkit-border-radius:.5em; padding:.5em; }

*/

.tiddler .subtitle
	{ display:inline; }
.tagged
	{ border:1px solid #999; -moz-border-radius:3px; -webkit-border-radius:3px; }
.tagged
	{ opacity:.7; }
.selected .tagged
	{ opacity:1; }
.button, .tiddler .button, #sidebarTabs .button
	{ margin:0px; padding: 0px .3em; border:1px solid transparent;
		-moz-border-radius:3px; -webkit-border-radius:3px; }
.button:hover
	{ border:1px solid #999; }
#sidebarTabs .button
	{ margin:0px 0.2em; padding:0.2em 0.3em; border:1px solid transparent;
		-moz-border-radius:3px; -webkit-border-radius:3px; display:block; }
#sidebarTabs .button:hover
	{ border:1px solid #999; }
.editor textarea
	{ font-family:monospace; }
.tab
	{	padding-bottom:1px;
		-moz-border-radius-topleft:.5em;
		-moz-border-radius-topright:.5em;
		-webkit-border-top-left-radius:.5em;
		-webkit-border-top-right-radius:.5em;
	}
.tabContents
	{ -moz-border-radius:.5em; -webkit-border-radius:.5em; }
.tabContents, .tabSelected
	{ background-color:#eef; }
.tabUnselected
	{ background-color:#79d; }





/*}}}*/
/***
|Name|StyleSheetShortcuts|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#StyleSheetShortcuts" title="Linkification: http://www.TiddlyTools.com/#StyleSheetShortcuts">http://www.TiddlyTools.com/#StyleSheetShortcuts</a></a>|
|Version||
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|CSS|
|Requires||
|Overrides||
|Description|'convenience' classes for common formatting, alignment, boxes, tables, etc.|

These 'style tweaks' can be easily included in other stylesheet tiddler so they can share a baseline look-and-feel that can then be customized to create a wide variety of 'flavors'.
***/
/*{{{*/

/* text alignments */
.left
	{ display:block;text-align:left; }
.center
	{ display:block;text-align:center; }
.center table
	{ margin:auto !important; }
.right
	{ display:block;text-align:right; }
.justify
	{ display:block;text-align:justify; }
.indent
	{ display:block;margin:0;padding:0;border:0;margin-left:2em; }
.floatleft
	{ float:left; }
.floatright
	{ float:right; }
.valignTop, .valignTop table, .valignTop tbody, .valignTop th, .valignTop tr, .valignTop td
	{ vertical-align:top; }
.valignBottom, .valignBottom table, .valignBottom tbody, .valignBottom th, .valignBottom tr, .valignBottom td
	{ vertical-align:bottom; }
.clear
	{ clear:both; }
.wrap
	{ white-space:normal; }
.nowrap
	{ white-space:nowrap; }
.hidden
	{ display:none; }
.show
	{ display:inline !important; }
.span
	{ display:span; }
.block
	{ display:block; }
.relative
	{ position:relative; }
.absolute
	{ position:absolute; }

/* font sizes */
.big
	{ font-size:14pt;line-height:120% }
.medium
	{ font-size:12pt;line-height:120% }
.normal
	{ font-size:9pt;line-height:120% }
.small
	{ font-size:8pt;line-height:120% }
.fine
	{ font-size:7pt;line-height:120% }
.tiny
	{ font-size:6pt;line-height:120% }
.larger
	{ font-size:120%; }
.smaller
	{ font-size:80%; }

/* font styles */
.bold
	{ font-weight:bold; }
.italic
	{ font-style:italic; }
.underline
	{ text-decoration:underline; }

/* plain list items (no bullets or indent) */
.nobullets li { list-style-type: none; margin-left:-2em; }

/* multi-column tiddler content (not supported in Internet Explorer) */
.twocolumns { display:block;
	-moz-column-count:2; -moz-column-gap:1em; -moz-column-width:50%; /* FireFox */
	-webkit-column-count:2; -webkit-column-gap:1em; -webkit-column-width:50%; /* Safari */
	column-count:2; column-gap:1em; column-width:50%; /* Opera */
}
.threecolumns { display:block;
	-moz-column-count:3; -moz-column-gap:1em; -moz-column-width:33%; /* FireFox */
	-webkit-column-count:3; -webkit-column-gap:1em; -webkit-column-width:33%; /* Safari */
	column-count:3; column-gap:1em; column-width:33%; /* Opera */
}
.fourcolumns { display:block;
	-moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%; /* FireFox */
	-webkit-column-count:4; -webkit-column-gap:1em; -webkit-column-width:25%; /* Safari */
	column-count:4; column-gap:1em; column-width:25%; /* Opera */
}

/* show/hide browser-specific content for InternetExplorer vs. non-IE ("moz") browsers */
*[class="ieOnly"]
	{ display:none; } /* hide in moz (uses CSS selector) */
* html .mozOnly, *:first-child+html .mozOnly
	{ display: none; } /* hide in IE (uses IE6/IE7 CSS hacks) */

/* borderless tables */
.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody
	{ border:0 !important; margin:0 !important; padding:0 !important; }
.widetable, .widetable table
	{ width:100%; }

/* thumbnail images (fixed-sized scaled images) */
.thumbnail img { height:5em !important; }

/* stretchable images (auto-size to fit tiddler) */
.stretch img { width:95%; }

/* grouped content */
.outline
	{ display:block; padding:1em; -moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid; }
.menubox
	{ display:block; padding:1em; -moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid; background:#fff; color:#000; }
.menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting
	{ color:#009 !important; }
.groupbox
	{ display:block; padding:1em; -moz-border-radius:1em;-webkit-border-radius:1em; border:1px solid; background:#ffe; color:#000; }
.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting
	{ color:#009 !important; }
.groupbox code
	{ color:#333 !important; }
.borderleft
	{ margin:0;padding:0;border:0;margin-left:1em; border-left:1px dotted; padding-left:.5em; }
.borderright
	{ margin:0;padding:0;border:0;margin-right:1em; border-right:1px dotted; padding-right:.5em; }
.borderbottom
	{ margin:0;padding:1px 0;border:0;border-bottom:1px dotted; margin-bottom:1px; padding-bottom:1px; }
.bordertop
	{ margin:0;padding:0;border:0;border-top:1px dotted; margin-top:1px; padding-top:1px; }

/* scrolled content */
.scrollbars { overflow:auto; }
.height10em { height:10em; }
.height15em { height:15em; }
.height20em { height:20em; }
.height25em { height:25em; }
.height30em { height:30em; }
.height35em { height:35em; }
.height40em { height:40em; }

/* compact form */
.smallform
	{ white-space:nowrap; }
.smallform input, .smallform textarea, .smallform button, .smallform checkbox, .smallform radio, .smallform select
	{ font-size:8pt; }

/* stretchable edit fields and textareas (auto-size to fit tiddler) */
.stretch input { width:99%; }
.stretch textarea { width:99%; }

/* compact input fields (limited to a few characters for entering percentages and other small values) */
.onechar input   { width:1em; }
.twochar input   { width:2em; }
.threechar input { width:3em; }
.fourchar input  { width:4em; }
.fivechar input  { width:5em; }

/* text colors */
.white { color:#fff !important }
.gray  { color:#999 !important }
.black { color:#000 !important }
.red   { color:#f66 !important }
.green { color:#0c0 !important }
.blue  { color:#99f !important }

/* rollover highlighting */
.mouseover
	{color:[[ColorPalette::TertiaryLight]] !important;}
.mouseover a
	{color:[[ColorPalette::TertiaryLight]] !important;}
.selected .mouseover
	{color:[[ColorPalette::Foreground]] !important;}
.selected .mouseover .button, .selected .mouseover a
	{color:[[ColorPalette::PrimaryDark]] !important;}

/* rollover zoom text */
.zoomover
	{ font-size:80% !important; }
.selected .zoomover
	{ font-size:100% !important; }

/* [[ColorPalette]] text colors */
.Background	{ color:[[ColorPalette::Background]];	 }
.Foreground	{ color:[[ColorPalette::Foreground]];	 }
.PrimaryPale	{ color:[[ColorPalette::PrimaryPale]];	 }
.PrimaryLight	{ color:[[ColorPalette::PrimaryLight]];	 }
.PrimaryMid	{ color:[[ColorPalette::PrimaryMid]];	 }
.PrimaryDark	{ color:[[ColorPalette::PrimaryDark]];	 }
.SecondaryPale	{ color:[[ColorPalette::SecondaryPale]]; }
.SecondaryLight	{ color:[[ColorPalette::SecondaryLight]];}
.SecondaryMid	{ color:[[ColorPalette::SecondaryMid]];	 }
.SecondaryDark	{ color:[[ColorPalette::SecondaryDark]]; }
.TertiaryPale	{ color:[[ColorPalette::TertiaryPale]];	 }
.TertiaryLight	{ color:[[ColorPalette::TertiaryLight]]; }
.TertiaryMid	{ color:[[ColorPalette::TertiaryMid]];	 }
.TertiaryDark	{ color:[[ColorPalette::TertiaryDark]];	 }
.Error		{ color:[[ColorPalette::Error]];	 }

/* [[ColorPalette]] background colors */
.BGBackground	  { background-color:[[ColorPalette::Background]];	}
.BGForeground	  { background-color:[[ColorPalette::Foreground]];	}
.BGPrimaryPale	  { background-color:[[ColorPalette::PrimaryPale]];	}
.BGPrimaryLight	  { background-color:[[ColorPalette::PrimaryLight]];	}
.BGPrimaryMid	  { background-color:[[ColorPalette::PrimaryMid]];	}
.BGPrimaryDark	  { background-color:[[ColorPalette::PrimaryDark]];	}
.BGSecondaryPale  { background-color:[[ColorPalette::SecondaryPale]]; 	}
.BGSecondaryLight { background-color:[[ColorPalette::SecondaryLight]];	}
.BGSecondaryMid	  { background-color:[[ColorPalette::SecondaryMid]];	}
.BGSecondaryDark  { background-color:[[ColorPalette::SecondaryDark]]; 	}
.BGTertiaryPale	  { background-color:[[ColorPalette::TertiaryPale]];	}
.BGTertiaryLight  { background-color:[[ColorPalette::TertiaryLight]]; 	}
.BGTertiaryMid	  { background-color:[[ColorPalette::TertiaryMid]];	}
.BGTertiaryDark	  { background-color:[[ColorPalette::TertiaryDark]];	}
.BGError	  { background-color:[[ColorPalette::Error]];	 	}
/*}}}*/
/***
|Name|TaggedTemplateTweak|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweak" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweak">http://www.TiddlyTools.com/#TaggedTemplateTweak</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#TaggedTemplateTweakInfo" title="Linkification: http://www.TiddlyTools.com/#TaggedTemplateTweakInfo">http://www.TiddlyTools.com/#TaggedTemplateTweakInfo</a>|
|Version|1.6.0|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for specific tiddlers|
This plugin extends the core function, story.chooseTemplateForTiddler(), so that any given tiddler can be viewed and/or edited using alternatives to the standard tiddler templates.
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.07.31 [1.6.0] added support for using custom field value as prefix
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 6, revision: 0, date: new Date(2009,7,31)};

if (!config.options.txtTemplateTweakFieldname)
	config.options.txtTemplateTweakFieldname='template';

Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// get core template and split into theme and template name
	var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
	var theme=""; var template=coreTemplate;
	var parts=template.split(config.textPrimitives.sectionSeparator);
	if (parts[1]) { theme=parts[0]; template=parts[1]; }
	else theme=config.options.txtTheme||""; // if theme is not specified
	theme+=config.textPrimitives.sectionSeparator;

	// look for template using title as prefix
	if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
		if (store.getTiddlerText(theme+title+template))
			{ return theme+title+template; } // theme##TitleTemplate
		if (store.getTiddlerText(title+template))
			{ return title+template; }	 // TitleTemplate
	}

	// look for template using tags as prefix
	var tiddler=store.getTiddler(title);
	if (!tiddler) return coreTemplate; // tiddler doesn't exist... use core result
	for (i=0; i<tiddler.tags.length; i++) {
		var t=tiddler.tags[i]+template; // add tag prefix to template
		var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
		if (store.getTiddlerText(theme+t))	{ return theme+t; } // theme##tagTemplate
		if (store.getTiddlerText(theme+c))	{ return theme+c; } // theme##TagTemplate
		if (store.getTiddlerText(t)) 		{ return t; }	    // tagTemplate
		if (store.getTiddlerText(c))		{ return c; }	    // TagTemplate
	}

	// look for templates using custom field value as prefix
	var v=store.getValue(title,config.options.txtTemplateTweakFieldname);
	if (store.getTiddlerText(theme+v+template))
		{ return theme+v+template; }	// theme##valueTemplate
	if (store.getTiddlerText(v+template))
		{ return v+template; }		// valueTemplate

	// no match... use core result
	return coreTemplate;
}
//}}}
I supervised following team projects:
*2015-16 - [[Information visualization in augmented reality|http://labss2.fiit.stuba.sk/TeamProject/2015/team04is-si/]]
*2014-15 - [[Information visualization in augmented reality|http://labss2.fiit.stuba.sk/TeamProject/2014/team09is-si/]]
*2013-14 - [[Information visualization in augmented reality|http://labss2.fiit.stuba.sk/TeamProject/2013/team05is-si/]]
*2010-11 - [[Interactive visualization of graph structures in 3D space|http://labss2.fiit.stuba.sk/TeamProject/2010/team16is-si/]]
*2009-10 - [[Visualization of software artifacts in 3D space|http://labss2.fiit.stuba.sk/TeamProject/2009/team20is-si/]]
*2008-09 - [[3D visualization of software artifacts|http://labss2.fiit.stuba.sk/TeamProject/2008/team08is-si/]]
and probably will continue with similar topics...
<<tiddler HideTiddlerSubtitle>>
/***
|Name|TextAreaPlugin|
|Source|http://www.TiddlyTools.com/#TextAreaPlugin|
|Documentation|http://www.TiddlyTools.com/#TextAreaPluginInfo|
|Version|2.2.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Adds Find/Again keyboard search, autosize, and 'stretch bar' resize for textarea controls|
!!!!!Documentation
>see [[TextAreaPluginInfo]]
!!!!!Configuration
<<<
<<option chkTextAreaExtensions>> use control-f (find), control-g (find again) inside text area
<<option chkDisableAutoSelect>> place cursor at start of textarea instead of pre-selecting content
<<option chkResizeEditor>> modify shadow EditTemplate to add resizeable text area (and autosize command)
<<<
!!!!!Revisions
<<<
2009.04.08 [2.2.1] added autosizeEditor macro to enable automatic autosizing without using toolbar command
2009.04.06 [2.2.0] added resizeListbox macro definition and adjusted dragbar width calculation.
|please see [[TextAreaPluginInfo]] for additional revision details|
2006.01.22 [1.0.0] Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.
<<<
!!!!!Code
***/
//{{{
version.extensions.TextAreaPlugin= {major: 2, minor: 2, revision: 1, date: new Date(2009,4,8)};

if (config.options.chkTextAreaExtensions===undefined) config.options.chkTextAreaExtensions=true;
if (config.options.chkDisableAutoSelect===undefined) config.options.chkDisableAutoSelect=true;
if (config.options.chkResizeEditor===undefined) config.options.chkResizeEditor=true;

// automatically tweak shadow EditTemplate to add "autosizeEditor" toolbar command
if (config.options.chkResizeEditor)
	config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/deleteTiddler/,"deleteTiddler autosizeEditor");
// automatically tweak shadow EditTemplate to add "resizeEditor" macro
if (config.options.chkResizeEditor)
	config.shadowTiddlers.EditTemplate+="<span macro='resizeEditor'></span>";

// Put focus in a specified tiddler field
Story.prototype.TextAreaExtensions_focusTiddler=Story.prototype.focusTiddler;
Story.prototype.focusTiddler = function(title,field)
{
	this.TextAreaExtensions_focusTiddler.apply(this,arguments); // first call core
	var e = this.getTiddlerField(title,field);
	if (e && config.options.chkDisableAutoSelect) {
		if (e.setSelectionRange) // FF
			e.setSelectionRange(0,0);
		else if (e.createTextRange) // IE
			{ var r=e.createTextRange(); r.collapse(true); r.select(); }
	}
	if (e && config.options.chkTextAreaExtensions) addKeyDownHandlers(e);
}
//}}}

//{{{
function addKeyDownHandlers(e)
{
	// exit if not textarea or element doesn't allow selections
	if (e.tagName.toLowerCase()!="textarea"||!e.setSelectionRange||e.initialized) return;

	// utility function: exits keydown handler and prevents browser from processing the keystroke
	var processed=function(ev) {
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	}
	// capture keydown in edit field
	e.saved_onkeydown=e.onkeydown; // save current keydown handler (if any)
	e.onkeydown=function(ev) { if (!ev) var ev=window.event;
		var key=ev.keyCode;
		if (!key) {
			var char=event.which?event.which:event.charCode;
			if (char==102) key=70;
			if (char==103) key=71;
		}
		// process CTRL-F (find matching text) or CTRL-G (find next match)
		if (ev.ctrlKey && (key==70||key==71)) {

			// prompt for text to find
			var defFind=e.findText?e.findText:e.value.substring(e.selectionStart,e.selectionEnd);
			if (key==70||!e.findText||!e.findText.length) // ctrl-f or no saved search text
				{ var f=prompt("find:", defFind); e.focus(); if (f) e.findText=f; }
			if (!e.findText||!e.findText.length) return processed(ev); //  if no search text, exit

			// do case-insensitive match with 'wraparound'...  if not found, alert and exit
			var newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase(),e.selectionStart+1);
			if (newstart==-1) newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase());
			if (newstart==-1) { alert("'"+e.findText+"' not found"); e.focus(); return processed(ev); }

			// set new selection, scroll it into view, and report line position in status bar
			e.setSelectionRange(newstart,newstart+e.findText.length);
			var linecount=e.value.split('\n').length;
			var thisline=e.value.substr(0,e.selectionStart).split('\n').length;
			e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);
			window.status="line: "+thisline+"/"+linecount;
			return processed(ev);
		}
		if (e.saved_onkeydown) // call previous keydown handler (if any)
			e.saved_onkeydown(ev);
	}
	e.initialized=true;
}
//}}}

// // 'autosize' toolbar command
//{{{
config.commands.autosizeEditor = {
	text: 'autosize',
	tooltip: 'automatically adjust the editor height to fit the contents',
	text_alt: '\u221Aautosize',
	hideReadOnly: false,
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i<ta.length;i++) {
			// only autosize textareas actually used to edit tiddler fields
			if (ta[i].getAttribute("edit")==undefined) continue;
			ta[i].button=src;
			if (!ta[i].maxed)
				config.commands.autosizeEditor.on(ta[i]);
			else
				config.commands.autosizeEditor.off(ta[i],true);
		}
		return false;
	},
	on: function(e) {
		if (e.maxed) return; // already autosizing!
		if (e.savedheight==undefined)
			e.savedheight=e.style.height;
		if (e.savedkeyup==undefined) {
			e.savedkeyup=e.onkeyup;
			e.onkeyup=function(ev) {
				if (!ev) var ev=window.event; var e=resolveTarget(ev);
				e.style.height=e.scrollHeight+'px';
				if (e.savedkeyup) e.savedkeyup();
			}
		}
		// IE reports error: "not implemented" for onkeypress
		if (!config.browser.isIE && e.savedkeypress==undefined) {
			e.savedkeypress=e.onkeypress;
			e.onkeypress=function(ev) {
				if (!ev) var ev=window.event; var e=resolveTarget(ev);
				if (ev.keyCode==33) { // PGUP
					if (window.scrollByPages) window.scrollByPages(-1);
					return false;
				}
				if (ev.keyCode==34) { // PGDN
					if (window.scrollByPages) window.scrollByPages(1);
					return false;
				}
				if (e.savedkeypress) e.savedkeypress();
			}
		}
		e.style.height=e.scrollHeight+'px';
		if (e.button) e.button.innerHTML=config.commands.autosizeEditor.text_alt;
		e.maxed=true;
	},
	off: function(e,resetHeight) {
		if (resetHeight) e.style.height=e.savedheight;
		e.onkeyup=e.savedkeyup;
		// IE reports error: "not implemented" for onkeypress
		if (!config.browser.isIE) e.onkeypress=e.savedkeypress;
		if (e.button) e.button.innerHTML=config.commands.autosizeEditor.text;
		e.maxed=false;
	}
};

config.macros.autosizeEditor={
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i<ta.length;i++) {
			// only autosize textareas actually used to edit tiddler fields
			if (ta[i].getAttribute("edit")==undefined) continue;
			config.commands.autosizeEditor.on(ta[i]);
		}
		return false;
	}
}
//}}}

// // grab-and-stretch handle
//{{{
config.macros.resizeEditor = { // add stretch bar to editor textarea
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var ta=here.getElementsByTagName('textarea');
		if (ta) for (i=0;i<ta.length;i++) {
			// only resize tiddler editor textareas
			if (ta[i].getAttribute("edit")==undefined) continue;
			new window.TextAreaResizer(ta[i]);
		}
	}
}

config.macros.resizeTiddler = { // add stretch bar to tiddler viewer element
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var elems=here.getElementsByTagName('div');
		if (elems) for (i=0;i<elems.length;i++) if (hasClass(elems[i],'viewer')) break;
		if (i<elems.length) new window.TextAreaResizer(elems[i]);
	}
}

config.macros.resizeFrame = { // add stretch bar to iframes
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var fr=here.getElementsByTagName('iframe');
		if (fr) for (i=0;i<fr.length;i++) new window.TextAreaResizer(fr[i]);
	}
}

config.macros.resizeListbox = { // add stretch bar to listbox controls
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) here=place;
		var fr=here.getElementsByTagName('select');
		if (fr) for (i=0;i<fr.length;i++) new window.TextAreaResizer(fr[i]);
	}
}

// TextAreaResizer script by Jason Johnston (jj@lojjic.net)
// Created August 2003.  Use freely, but give me credit.
// adds a handle below textareas that the user can drag with the mouse to resize the textarea.
// MODIFIED by ELS for use with TW

window.TextAreaResizer = function(elt) {
	this.element = elt;
	this.create();
}
window.TextAreaResizer.prototype = {
	create : function() {
		var elt = this.element;
		var thisRef = this;
		var h = this.handle = document.createElement("div");
		h.style.height = "3px"; // was 4px... looked too fat!
		h.style.overflow = "hidden"; // ELS: force IE to trim height to < 1em
		var adjust=elt.nodeName=='textarea'?4:0;  // 4 pixels for textarea border edge
//		h.style.width=(elt.offsetWidth-adjust)+"px";
		h.style.width="auto";
		h.style.backgroundColor = "#999"; // ELS: standard mid-tone (dark) gray
		h.style.cursor = "s-resize";
		h.title = "Drag to resize text box";
		h.onmousedown=function(evt){thisRef.dragStart(evt)};
		elt.parentNode.insertBefore(h, elt.nextSibling);
	},
	dragStart : function(evt) {
		if (!evt) var evt=window.event;
		this.dragStop(evt); // ELS: stop any current drag processing first
		var thisRef = this;
		this.dragStartY = evt.clientY;
		this.dragStartH = this.element.offsetHeight;
		document.savedmousemove=document.onmousemove;
		document.onmousemove=this.dragMoveHdlr=function(evt){thisRef.dragMove(evt)};
		document.savedmouseup=document.onmouseup;
		document.onmouseup=this.dragStopHdlr=function(evt){thisRef.dragStop(evt)};
	},
	dragMove : function(evt) {
		if (!evt) var evt=window.event;
		// ELS: make sure height is at least 10px
		var h=this.dragStartH+evt.clientY-this.dragStartY;
		if (h<10) h=10; this.element.style.height=h+"px";
		// ELS: match handle to textarea width (which may have changed due to document scrollbars)
//		var adjust=this.element.nodeName.toLowerCase()=='textarea'?4:0; // 4 pixels for textarea
//		this.handle.style.width=(this.element.offsetWidth-adjust)+"px";
		// ELS: when manually resizing, disable autoresizing (without restoring saved height)
		if (this.element.maxed!=undefined && this.element.maxed)
			config.commands.autosizeEditor.off(this.element,false);
	},
	dragStop : function(evt) {
		if (!evt) var evt=window.event;
		document.onmousemove=(document.savedmousemove!=undefined)?document.savedmousemove:null;
		document.onmousemove=(document.savedmouseup!=undefined)?document.savedmouseup:null;
	},
	destroy : function() {
		var elt = this.element;
		elt.parentNode.removeChild(this.handle);
		elt.style.height = "";
	}
};
//}}}
/***
|Name|TextAreaPluginInfo|
|Source|http://www.TiddlyTools.com/#TextAreaPlugin|
|Documentation|http://www.TiddlyTools.com/#TextAreaPluginInfo|
|Version|2.2.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for TextAreaPlugin|
Adds Find/Again keyboard search, autosize, and 'stretch bar' resize for textarea controls
!!!!!Usage
<<<
When in tiddler editor, use ''Control-F'' and ''control-G'' to ''"Find text"'' and ''"find text aGain"'', respectively, allowing you to copy, find, paste, findagain, paste, etc to perform "search-and-replace" actions.  ''autosize'' toolbar command toggles the tiddler editor textarea height between fixed-height and "automatically fit the contents".  Stretch (change height) of editor (or other element types) using 'grab handle' that is displayed below the editor textarea field.
<<<
!!!!!Configuration
<<<
<<option chkTextAreaExtensions>> use control-f (find), control-g (find again) inside text area
<<option chkDisableAutoSelect>> place cursor at start of textarea instead of pre-selecting content
<<option chkResizeEditor>> modify shadow EditTemplate to add resizeable text area (and autosize command)
* ''Add 'autosizeEditor' command to toolbar:''
{{{
// add command keyword to end of {{{EditToolbar}}} slice definition in [[ToolbarCommands]]:
|EditToolbar| ... autosizeEditor|
}}}
* Alternatively, ''enable autosize by default:''
{{{
// add to the end of the EditTemplate:
<span macro='autosizeEditor'></span>
}}}
* ''Add stretch bar to editor:''
{{{
// add ''resize...'' macro to EditTemplate
<span macro='resizeEditor'></span> or
<span macro='resizeTiddler'></span> or
<span macro='resizeFrame'></span> or
<span macro='resizeListbox'></span>
}}}
<<<
!!!!!Revisions
<<<
2009.04.06 2.2.0 added resizeListbox macro definition and adjusted dragbar width calculation.
2008.01.08 2.1.9 fixed default setting of uninitialized option values so that "false" is not treated as "undefined"
2008.01.07 2.1.8 added 'initialized' flag so keyDownHandlers() will only be added once to each control (prevents recursion errors)
2007.12.21 2.1.7 in dragMove(), subtract 4-pixel 'fudge factor' when adjusting drag bar width to match textarea width.  Apparently textarea 'offsetWidth' includes the 2-pixel surrounding edge, but CSS 100% calculation does NOT, resulting is an increase in the textarea width when displayed in a variable-width moveable panel.
2007.11.19 2.1.6 fix fatal IE errors by NOT setting 'onkeypress' handler (which IE reports as "not implemented").  Also, only add autosize grab bar to textareas that are actually used to edit tiddler fields (i.e., they have an "edit=fieldname" attribute).  This prevents undesirable autosizing of textareas used for HTML/DOM display by [[PreviewPlugin]].
2007.11.18 2.1.5 in config.commands.autosizeEditor, changed alt command text to use character-based "psuedo-checkbox" instead of embedded html fragment
2007.09.04 2.1.4 in window.TextAreaResizer.prototype.create(), set initial grab handle width to auto instead of matching textarea.offsetWidth (which can be initially==0)
2007.04.29 2.1.3 in addKeyDownHandlers(), used 'findText' instead of 'find', hopefully to avoid strict ECMAScript1.5 error on certain browsers.
2007.03.01 2.1.2 use apply() to invoke hijacked core function
2006.11.16 2.1.0 restored chkDisableAutoSelect (place cursor at start of textarea instead of pre-selecting content)
2006.11.16 2.0.0 removed chkDisableEscapeKey (obsolete... use custom EditTemplate to change toolbar definition).  Rewrote focusTiddler as a HIJACK instead of just overwriting core function (permits other plugins to also hijack function).  Removed TAB character processing (now built-in as of TW2.1).  Merged code from ResizeEditorPlugin:
> 2006.11.16 [1.3.x] merged with TextAreaPlugin
> 2006.11.02 1.3.1 in DragMove() and DragStop(), check for undefined properties so IE doesn't report "Not Implemented" error when property is referenced without having been previously initialized.
> 2006.11.01 1.3.0 added 'resizeEditor' MACRO for 'grab handle' stretch resizing (based on code from Jon Scully and Jason Johnston (jj@lojjic.net).
> 2006.11.01 1.2.6 removed increaseEditor, decreaseEditor, and resizeEditor toolbar COMMAND definitions (resize by setting 'rows' property of textarea field conflicts with resize via style.height CSS attribute as set by autosize/drag).
> 2006.11.01 1.2.5 fixed 'savedkeypress' handling (was writing to savedkeyup by mistake)
> 2006.10.28 1.2.4 added '+' to 'saveTiddler' toolbar command (enables ctrl-enter keyhandling)
> 2006.10.18 1.2.3 added decreaseEditor and increaseEditor commands
> 2006.10.18 1.2.2 onkeypress handling to redirect PGUP/PGDN to window.scrollByPages() (works in FF, but not yet in IE)
> 2006.10.18 1.2.1 fixed references to default string constants (oops!)
> 2006.10.18 1.2.0 renamed 'resizeEditor' to 'autosizeEditor' and added new 'resizeEditor' toolbar command to prompt for # of rows to display
> 2006.10.02 1.1.1 show checkbox in button label (when automatic resizing is enabled)
> 2006.10.01 1.1.0 added 'onkeyup' automatic fit-to-contents handling
> 2006.09.30 1.0.0 initial release
2006.08.01 1.1.2 improved processed() utility function to handle IE5 and IE6, as well as calling preventDefault() for moz browsers.  Thanks to Bradley Meck for research and code examples.
2006.07.09 1.1.1 removed chkDisableAutoSelect
2006.02.14 1.1.0 added option for chkDisableEscapeKey (default is standard action)
2006.01.22 1.0.1 only add extra key processing for TEXTAREA elements (not other edit fields).
added option to enable/disable textarea keydown extensions (default is "standard keys" only)
2006.01.22 1.0.0 Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.
<<<
/***
|Name|TiddlerTweakerPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#TiddlerTweakerPlugin" title="Linkification: http://www.TiddlyTools.com/#TiddlerTweakerPlugin">http://www.TiddlyTools.com/#TiddlerTweakerPlugin</a></a>|
|Version|2.4.2|
|Author|Eric Shulman|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a>|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|select multiple tiddlers and modify author, created, modified and/or tag values|
~TiddlerTweaker is a tool for TiddlyWiki authors.  It allows you to select multiple tiddlers from a listbox, either by direct interaction or automatically matching specific criteria.  You can then modify the creator, author, created, modified and/or tag values of those tiddlers using a compact set of form fields.  The values you enter into the fields simultantously overwrite the existing values in all tiddlers you have selected.
!!!!!Usage
<<<
{{{<<tiddlerTweaker>>}}}
{{smallform{<<tiddlerTweaker>>}}}
By default, any tags you enter into the TiddlerTweaker will //replace// the existing tags in all the tiddlers you have selected.  However, you can also use TiddlerTweaker to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged:
>Any tag preceded by a "+" (plus) or "-" (minus), will be added or removed from the existing tags //instead of replacing the entire tag definition// of each tiddler (e.g., enter "-excludeLists" to remove that tag from all selected tiddlers.  When using this syntax, care should be taken to ensure that //every// tag is preceded by "+" or "-", to avoid inadvertently overwriting any other existing tags on the selected tiddlers.  (note: the "+" or "-" prefix on each tag value is NOT part of the tag value, and is only used by TiddlerTweaker to control how that tag value is processed)
Important Notes:
* Inasmuch as TiddlerTweaker is a 'power user' tool that can perform 'batch' functions (operating on many tiddlers at once), you should always have a recent backup of your document (or "save changes" just *before* tweaking the tiddlers), just in case you "shoot yourself in the foot".
* The date and author information on any tiddlers you tweak will ONLY be updated if the corresponding  TiddlyTweaker checkboxes have been selected.  As a general rule, after using TiddlerTweaker, always ''//remember to save your document//'' when you are done, even though the tiddler timeline tab may not show any recently modified tiddlers.
* Selecting and updating all tiddlers in a document can take a while.  Your browser may warn about an "unresponsive script".  Usually, if you allow it to continue, it should complete the processing... eventually.  Nonetheless, be sure to save your work before you begin tweaking lots of tiddlers, just in case something does get 'stuck'.
<<<
!!!!!Revisions
<<<
2009.06.26 [2.4.2] only add brackets around tags containing spaces
2009.06.22 [2.4.1] in setFields(), add brackets around all tags shown tweaker edit field
2009.03.30 [2.4.0] added 'sort by modifier'
2009.01.22 [2.3.0] added support for text pattern find/replace
2008.10.27 [2.2.3] in setTiddlers(), fixed Safari bug by replacing static Array.concat(...) with new Array().concat(...)
2008.09.07 [2.2.2] added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.12 [2.2.1] replace built-in backstage "tweak" task with tiddler tweaker control panel (moved from BackstageTweaks)
2008.01.13 [2.2.0] added "auto-selection" links: all, changed, tags, title, text
2007.12.26 [2.1.0] added support for managing 'creator' custom field (see [[CoreTweaks]])
2007.11.01 [2.0.3] added config.options.txtTweakerSortBy for cookie-based persistence of list display order preference setting.
2007.09.28 [2.0.2] in settiddlers() and deltiddlers(), added suspend/resume notification handling (improves performance when operating on multiple tiddlers)
2007.08.03 [2.0.1] added shadow definition for [[TiddlerTweaker]] tiddler for use as parameter references with {{{<<tiddler>>, <<slider>> or <<tabs>>}}} macros.
2007.08.03 [2.0.0] converted from inline script
2006.01.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlerTweakerPlugin= {major: 2, minor: 4, revision: 1, date: new Date(2009,6,22)};

// shadow tiddler
config.shadowTiddlers.TiddlerTweaker="<<tiddlerTweaker>>";

/// backstage task
if (config.tasks) { // for TW2.2b3 or above
	config.tasks.tweak.tooltip="review/modify tiddler internals: dates, authors, tags, etc.";
	config.tasks.tweak.content="{{smallform small groupbox{<<tiddlerTweaker>>}}}";
}

if (config.options.txtTweakerSortBy==undefined) config.options.txtTweakerSortBy="modified";

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

config.macros.tiddlerTweaker = {
	html: '<form style="display:inline"><!--\
		--><table style="padding:0;margin:0;border:0;width:100%"><tr valign="top" style="padding:0;margin:0;border:0"><!--\
		--><td style="text-align:center;white-space:nowrap;width:99%;padding:0;margin:0;border:0"><!--\
			--><font size=-2><div style="text-align:left;"><span style="float:right"><!--\
			-->&nbsp; <a href="javascript:;" \
				title="select all tiddlers"\
				onclick="\
				var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
				for (var t=0; t<f.list.options.length; t++)\
					if (f.list.options[t].value.length) f.list.options[t].selected=true;\
				config.macros.tiddlerTweaker.selecttiddlers(f.list);\
				return false">all</a><!--\
			-->&nbsp; <a href="javascript:;" \
				title="select tiddlers that are new/changed since the last file save"\
				onclick="\
				var lastmod=new Date(document.lastModified);\
				var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
				for (var t=0; t<f.list.options.length; t++) {\
					var tid=store.getTiddler(f.list.options[t].value);\
					f.list.options[t].selected=tid&&tid.modified>lastmod;\
				}\
				config.macros.tiddlerTweaker.selecttiddlers(f.list);\
				return false">changed</a><!--\
			-->&nbsp; <a href="javascript:;" \
				title="select tiddlers with at least one matching tag"\
				onclick="\
				var t=prompt(\'Enter space-separated tags (match ONE)\');\
				if (!t||!t.length) return false;\
				var tags=t.readBracketedList();\
				var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
				for (var t=0; t<f.list.options.length; t++) {\
					f.list.options[t].selected=false;\
					var tid=store.getTiddler(f.list.options[t].value);\
					if (tid&&tid.tags.containsAny(tags)) f.list.options[t].selected=true;\
				}\
				config.macros.tiddlerTweaker.selecttiddlers(f.list);\
				return false">tags</a><!--\
			-->&nbsp; <a href="javascript:;" \
				title="select tiddlers whose titles include matching text"\
				onclick="\
				var txt=prompt(\'Enter a title (or portion of a title) to match\');\
				if (!txt||!txt.length) return false;\
				var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
				for (var t=0; t<f.list.options.length; t++) {\
					f.list.options[t].selected=f.list.options[t].value.indexOf(txt)!=-1;\
				}\
				config.macros.tiddlerTweaker.selecttiddlers(f.list);\
				return false">titles</a><!--\
			-->&nbsp; <a href="javascript:;" \
				title="select tiddlers containing matching text"\
				onclick="\
				var txt=prompt(\'Enter tiddler text (content) to match\');\
				if (!txt||!txt.length) return false;\
				var f=this; while (f&&f.nodeName.toLowerCase()!=\'form\')f=f.parentNode;\
				for (var t=0; t<f.list.options.length; t++) {\
					var tt=store.getTiddlerText(f.list.options[t].value,\'\');\
					f.list.options[t].selected=(tt.indexOf(txt)!=-1);\
				}\
				config.macros.tiddlerTweaker.selecttiddlers(f.list);\
				return false">text</a> &nbsp;<!--\
			--></span><span>select tiddlers</span><!--\
			--></div><!--\
			--></font><select multiple name=list size="11" style="width:99.99%" \
				title="use click, shift-click and/or ctrl-click to select multiple tiddler titles" \
				onclick="config.macros.tiddlerTweaker.selecttiddlers(this)" \
				onchange="config.macros.tiddlerTweaker.setfields(this)"><!--\
			--></select><br><!--\
			-->show<input type=text size=1 value="11" \
				onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--\
			-->by<!--\
			--><select name=sortby size=1 \
				onchange="config.macros.tiddlerTweaker.init(this.form,this.value)"><!--\
			--><option value="title">title</option><!--\
			--><option value="size">size</option><!--\
			--><option value="modified">modified</option><!--\
			--><option value="created">created</option><!--\
			--><option value="modifier">modifier</option><!--\
			--></select><!--\
			--><input type="button" value="refresh" \
				onclick="config.macros.tiddlerTweaker.init(this.form,this.form.sortby.value)"<!--\
			--> <input type="button" name="stats" disabled value="totals..." \
				onclick="config.macros.tiddlerTweaker.stats(this)"><!--\
		--></td><td style="white-space:nowrap;padding:0;margin:0;border:0;width:1%"><!--\
			--><div style="text-align:left"><font size=-2>&nbsp;modify values</font></div><!--\
			--><table border=0 style="width:100%;padding:0;margin:0;border:0;"><tr style="padding:0;border:0;"><!--\
			--><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=settitle unchecked \
					title="allow changes to tiddler title (rename tiddler)" \
					onclick="this.form.title.disabled=!this.checked">title<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=title size=35 style="width:98%" disabled><!--\
			--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=setcreator unchecked \
					title="allow changes to tiddler creator" \
					onclick="this.form.creator.disabled=!this.checked">created by<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=creator size=35 style="width:98%" disabled><!--\
			--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=setwho unchecked \
					title="allow changes to tiddler author" \
					onclick="this.form.who.disabled=!this.checked">modified by<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=who size=35 style="width:98%" disabled><!--\
			--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=setcdate unchecked \
					title="allow changes to created date" \
					onclick="var f=this.form; f.cm.disabled=f.cd.disabled=f.cy.disabled=f.ch.disabled=f.cn.disabled=!this.checked"><!--\
				-->created on<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=cm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
				--> / <input type=text name=cd size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
				--> / <input type=text name=cy size=4 style="width:3em;padding:0;text-align:center" disabled><!--\
				--> at <input type=text name=ch size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
				--> : <input type=text name=cn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
			--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=setmdate unchecked \
					title="allow changes to modified date" \
					onclick="var f=this.form; f.mm.disabled=f.md.disabled=f.my.disabled=f.mh.disabled=f.mn.disabled=!this.checked"><!--\
				-->modified on<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=mm size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
				--> / <input type=text name=md size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
				--> / <input type=text name=my size=4 style="width:3em;padding:0;text-align:center" disabled><!--\
				--> at <input type=text name=mh size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
				--> : <input type=text name=mn size=2 style="width:2em;padding:0;text-align:center" disabled><!--\
			--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=replacetext unchecked\
					title="find/replace matching text" \
					onclick="this.form.pattern.disabled=this.form.replacement.disabled=!this.checked">replace text<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=pattern size=15 value="" style="width:40%" disabled \
					title="enter TEXT PATTERN (regular expression)"> with <!--\
				--><input type=text name=replacement size=15 value="" style="width:40%" disabled \
					title="enter REPLACEMENT TEXT"><!--\
			--></td></tr><tr style="padding:0;border:0;"><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=checkbox name=settags checked \
					title="allow changes to tiddler tags" \
					onclick="this.form.tags.disabled=!this.checked">tags<!--\
			--></td><td style="padding:1px;border:0;white-space:nowrap"><!--\
				--><input type=text name=tags size=35 value="" style="width:98%" \
					title="enter new tags or use \'+tag\' and \'-tag\' to add/remove tags from existing tags"><!--\
			--></td></tr></table><!--\
			--><div style="text-align:center"><!--\
			--><nobr><input type=button name=display disabled style="width:32%" value="display tiddlers" \
				onclick="config.macros.tiddlerTweaker.displaytiddlers(this)"><!--\
			--> <input type=button name=del disabled style="width:32%" value="delete tiddlers" \
				onclick="config.macros.tiddlerTweaker.deltiddlers(this)"><!--\
			--> <input type=button name=set disabled style="width:32%" value="update tiddlers" \
				onclick="config.macros.tiddlerTweaker.settiddlers(this)"></nobr><!--\
			--></div><!--\
		--></td></tr></table><!--\
		--></form><span style="display:none"><!--content replaced by tiddler "stats"--></span>\
	',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span=createTiddlyElement(place,"span");
		span.innerHTML=this.html;
		this.init(span.firstChild,config.options.txtTweakerSortBy);
	},
	init: function(f,sortby) { // initialize form controls
		if (!f) return; // form might not be rendered yet...
		while (f.list.options[0]) f.list.options[0]=null; // empty current list content
		var tids=store.getTiddlers(sortby);
		if (sortby=='size') // descending order
			tids.sort(function(a,b) {return a.text.length > b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});
		var who='';
		for (i=0; i<tids.length; i++) { var t=tids[i];
			var label=t.title; var value=t.title;
			switch (sortby) {
				case 'modified':
				case 'created':
					var t=tids[tids.length-i-1]; // reverse order
					var when=t[sortby].formatString('YY.0MM.0DD 0hh:0mm ');
					label=when+t.title;
					value=t.title;
					break;
				case 'size':
					label='['+t.text.length+'] '+label;
					break;
				case 'modifier':
				case 'creator':
					if (who!=t[sortby]) {
						who=t[sortby];
						f.list.options[f.list.length]=new Option('by '+who+':','',false,false);
					}
					label='\xa0\xa0\xa0'+label; // indent
					break;
			}
			f.list.options[f.list.length]=new Option(label,value,false,false);
		}
		f.title.value=f.who.value=f.creator.value=f.tags.value="";
		f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";
		f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";
		f.stats.disabled=f.set.disabled=f.del.disabled=f.display.disabled=true;
		f.settitle.disabled=false;
		config.options.txtTweakerSortBy=sortby; // remember current setting
		f.sortby.value=sortby; // sync droplist selection with current setting
		if (sortby!="modified") // non-default preference... save cookie
			saveOptionCookie("txtTweakerSortBy");
		else removeCookie("txtTweakerSortBy"); // default preference... clear cookie
	},
	selecttiddlers: function(here) { // enable/disable tweaker fields based on number of items selected
		// count how many tiddlers are selected
		var f=here.form; var list=f.list;
		var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
		if (c>1) f.title.disabled=true;
		if (c>1) f.settitle.checked=false;
		f.set.disabled=(c==0);
		f.del.disabled=(c==0);
		f.display.disabled=(c==0);
		f.settitle.disabled=(c>1);
		f.stats.disabled=(c==0);
		var msg=(c==0)?'select tiddlers':(c+' tiddler'+(c!=1?'s':'')+' selected');
		here.previousSibling.firstChild.firstChild.nextSibling.innerHTML=msg;
		if (c) clearMessage(); else displayMessage("no tiddlers selected");
	},
	setfields: function(here) { // set tweaker edit fields from first selected tiddler
		var f=here.form;
		if (!here.value.length) {
			f.title.value=f.who.value=f.creator.value=f.tags.value="";
			f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value="";
			f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value="";
			return;
		}
		var tid=store.getTiddler(here.value); if (!tid) return;
		f.title.value=tid.title;
		f.who.value=tid.modifier;
		f.creator.value=tid.fields['creator']||''; // custom field - might not exist
		f.tags.value=tid.tags.map(function(t){return String.encodeTiddlyLink(t)}).join(' ');
		var c=tid.created; var m=tid.modified;
		f.cm.value=c.getMonth()+1;
		f.cd.value=c.getDate();
		f.cy.value=c.getFullYear();
		f.ch.value=c.getHours();
		f.cn.value=c.getMinutes();
		f.mm.value=m.getMonth()+1;
		f.md.value=m.getDate();
		f.my.value=m.getFullYear();
		f.mh.value=m.getHours();
		f.mn.value=m.getMinutes();
	},
	settiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		var cdate=new Date(f.cy.value,f.cm.value-1,f.cd.value,f.ch.value,f.cn.value);
		var mdate=new Date(f.my.value,f.mm.value-1,f.md.value,f.mh.value,f.mn.value);
		if (tids.length>1 && !confirm("Are you sure you want to update these tiddlers:\n\n"+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			var title=!f.settitle.checked?tid.title:f.title.value;
			var who=!f.setwho.checked?tid.modifier:f.who.value;
			var text=tid.text;
			if (f.replacetext.checked) text=text.replace(new RegExp(f.pattern.value,'mg'),f.replacement.value);
			var tags=tid.tags;
			if (f.settags.checked) {
				var intags=f.tags.value.readBracketedList();
				var addtags=[]; var deltags=[]; var reptags=[];
				for (i=0;i<intags.length;i++) {
					if (intags[i].substr(0,1)=='+')
						addtags.push(intags[i].substr(1));
					else if (intags[i].substr(0,1)=='-')
						deltags.push(intags[i].substr(1));
					else
						reptags.push(intags[i]);
				}
				if (reptags.length)
					tags=reptags;
				if (addtags.length)
					tags=new Array().concat(tags,addtags);
				if (deltags.length)
					for (i=0;i<deltags.length;i++)
						{ var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }
			}
			if (!f.setcdate.checked) cdate=tid.created;
			if (!f.setmdate.checked) mdate=tid.modified;
			store.saveTiddler(tid.title,title,text,who,mdate,tags,tid.fields);
			if (f.setcreator.checked) store.setValue(tid.title,'creator',f.creator.value); // set creator
			if (f.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date
		}
		store.resumeNotifications();
		this.init(f,f.sortby.value);
	},
	displaytiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		story.displayTiddlers(story.findContainingTiddler(f),tids)
	},
	deltiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		if (!confirm("Are you sure you want to delete these tiddlers:\n\n"+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			if (tid.tags.contains("systemConfig"))
				if (!confirm("'"+tid.title+"' is tagged with 'systemConfig'.\n\nRemoving this tiddler may cause unexpected results.  Are you sure?"))
					continue;
			store.removeTiddler(tid.title);
			story.closeTiddler(tid.title);
		}
		store.resumeNotifications();
		this.init(f,f.sortby.value);
	},
	stats: function(here) {
		var f=here.form; var list=f.list; var tids=[]; var out=''; var tot=0;
		var target=f.nextSibling;
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert("please select at least one tiddler"); return; }
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
		}
		var avg=tot/tids.length;
		out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<\n';
		removeChildren(target);
		target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' "
			+"onclick='this.parentNode.parentNode.style.display=\"none\"'>close</a></font>";
		wikify(out,target);
		target.style.display="block";
	}
};
//}}}
/%
|Name|ToggleBreadcrumbs|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleBreadcrumbs" title="Linkification: http://www.TiddlyTools.com/#ToggleBreadcrumbs">http://www.TiddlyTools.com/#ToggleBreadcrumbs</a></a>|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|BreadcrumbsPlugin, InlineJavascriptPlugin|
|Overrides||
|Description|dynamically enable/disable BreadcrumbsPlugin display|
%/<script>
if (config.options.chkShowBreadcrumbs==undefined) config.options.chkShowBreadcrumbs=true;
</script><<option chkShowBreadcrumbs>><script>
	var chk=place.lastChild;
	chk.coreOnChange=chk.onchange;
	chk.onchange=function() {
		if (this.coreOnChange) this.coreOnChange.apply(this,arguments);
		this.checked=config.options.chkShowBreadcrumbs;
		if (config.macros.breadcrumbs) config.macros.breadcrumbs.refresh();
	};
</script>
/%
|Name|ToggleFullScreen|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleFullScreen" title="Linkification: http://www.TiddlyTools.com/#ToggleFullScreen">http://www.TiddlyTools.com/#ToggleFullScreen</a></a>|
|Version|1.1.3|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide main menu, sidebar and page header|

Usage:
	<<tiddler ToggleFullScreen with: label altlabel>>
		- displays 'onclick' command link that toggles full screen display mode
	or
	<<tiddler ToggleFullScreen##ON>>
		- immediately sets full screen mode
	or
	<<tiddler ToggleFullScreen##OFF>>
		- immediately resets full screen mode

!ON
<script> if (!config.options.chkFullScreen) window.toggleFullScreen(); </script>
!end ON

!OFF
<script> if (config.options.chkFullScreen) window.toggleFullScreen(); </script>
!end OFF

%/<script>
window.toggleFullScreen=function(here) {
	config.options.chkFullScreen=!config.options.chkFullScreen;
	var showmm=!config.options.chkFullScreen && config.options.chkShowLeftSidebar!==false;
	var showsb=!config.options.chkFullScreen && config.options.chkShowRightSidebar!==false;
	var showcrumbs=!config.options.chkFullScreen && config.options.chkShowBreadcrumbs!==false
		&& config.macros.breadcrumbs && config.macros.breadcrumbs.crumbs.length;
	var cw=document.getElementById('contentWrapper');
	var da=document.getElementById('displayArea');
	var mm=document.getElementById('mainMenu');
	var sb=document.getElementById('sidebar');
	var sm=document.getElementById('storyMenu');
	var bc=document.getElementById('breadCrumbs');
	var sn=document.getElementById('siteNav');
	if (cw){
		for (var i=0; i<cw.childNodes.length; i++)
			if (hasClass(cw.childNodes[i],'header')) { var h=cw.childNodes[i]; break; }
		if (h) h.style.display=!config.options.chkFullScreen?'block':'none';
	}
	if (mm) {
		mm.style.display=showmm?'block':'none';
		da.style.marginLeft=showmm?(config.options.txtDisplayAreaLeftMargin||''):'1em';
	}
	if (sb) {
		sb.style.display=showsb?'block':'none';
		da.style.marginRight=showsb?(config.options.txtDisplayAreaRightMargin||''):'1em';
	}
	if (sm)
		sm.style.display=!config.options.chkFullScreen ?'block':'none';
	if (bc)
		bc.style.display=showcrumbs?'block':'none';
	if (sn)
		sn.style.display=!config.options.chkFullScreen?'block':'none';
	var label=('$'+'1'=='$1')?'fullscreen':'$1';
	var altlabel='$2'; if ('$'+'2'=='$2') altlabel=label;
	if (typeof(here)!='undefined' && here!=window.place)
		here.innerHTML=!config.options.chkFullScreen?label:altlabel;
	var b=document.getElementById('restoreFromFullscreenButton');
	if (b) removeNode(b);
	else {
		var b=createTiddlyElement(null,'span','restoreFromFullscreenButton','selected');
		b.innerHTML='&loz;';
		b.title='RESTORE: redisplay page header, menu and sidebar';
		b.onclick=window.toggleFullScreen;
		var s=b.style;
		s.position='fixed'; s.top='.3em'; s.right='.3em'; s.zIndex='10001';
		s.border='2px outset ButtonFace';
		s.padding='0px 3px';
		s.cursor='pointer';
		s.fontSize='8pt';
		s.backgroundColor='ButtonFace';
		if (config.browser.isGecko) {
			s.color='ButtonText !important';
			s.MozAppearance='button';
		}
		document.body.insertBefore(b,null);
	}
	return false;
};
</script>/%

%/<script label="$1" title="FULLSCREEN: toggle display of mainmenu, sidebar, and page header">
	window.toggleFullScreen(place);
	return false;
</script><script>
	place.lastChild.innerHTML=('$'+'1'=='$1')?'fullscreen':'$1';
</script>
/%
|Name|ToggleLeftSidebar|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleLeftSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleLeftSidebar">http://www.TiddlyTools.com/#ToggleLeftSidebar</a></a>|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide left sidebar (MainMenu)|

Usage: <<tiddler ToggleLeftSidebar with: "label">>

Config settings:
	config.options.chkShowLeftSidebar (true)
	config.options.txtToggleLeftSideBarLabelShow (►)
	config.options.txtToggleLeftSideBarLabelHide (◄)

%/<script label="$1" title="show/hide MainMenu content">
	var co=config.options;
	if (co.chkShowLeftSidebar=='undefined') co.chkShowLeftSidebar=true;
	co.chkShowLeftSidebar=!co.chkShowLeftSidebar;
	var mm=document.getElementById('mainMenu'); if (!mm) return;
	mm.style.display=co.chkShowLeftSidebar?'block':'none';
	document.getElementById('displayArea').style.marginLeft=co.chkShowLeftSidebar?'':'1em';
	saveOptionCookie('chkShowLeftSidebar');
	var labelShow=co.txtToggleLeftSideBarLabelShow||'&#x25BA;';
	var labelHide=co.txtToggleLeftSideBarLabelHide||'&#x25C4;';
	if (typeof(place)!='undefined' && '$1'=='$'+'1') {
		place.innerHTML=co.chkShowLeftSidebar?labelHide:labelShow;
		place.title=(co.chkShowLeftSidebar?'hide':'show')+' left sidebar';
	}
	var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
</script><script>
	var co=config.options;
	if (co.chkShowLeftSidebar=='undefined') co.chkShowLeftSidebar=true;
	var mm=document.getElementById('mainMenu'); if (!mm) return;
	mm.style.display=co.chkShowLeftSidebar?'block':'none';
	document.getElementById('displayArea').style.marginLeft=co.chkShowLeftSidebar?'':'1em';
	if ('$1'=='$'+'1') {
		var labelShow=co.txtToggleLeftSideBarLabelShow||'&#x25BA;';
		var labelHide=co.txtToggleLeftSideBarLabelHide||'&#x25C4;';
		place.lastChild.innerHTML=co.chkShowLeftSidebar?labelHide:labelShow;
		place.lastChild.title=(co.chkShowLeftSidebar?'hide':'show')+' left sidebar';
	}
</script>
/%
|Name|ToggleRightSidebar|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#ToggleRightSidebar" title="Linkification: http://www.TiddlyTools.com/#ToggleRightSidebar">http://www.TiddlyTools.com/#ToggleRightSidebar</a></a>|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide right sidebar (MainMenu)|

Usage: <<tiddler ToggleRightSidebar with: "label">>

Config settings:
	config.options.chkShowRightSidebar (true)
	config.options.txtToggleRightSideBarLabelShow (◄)
	config.options.txtToggleRightSideBarLabelHide (►)

%/<script label="$1" title="show/hide right sidebar content">
	var co=config.options;
	if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
	co.chkShowRightSidebar=!co.chkShowRightSidebar;
	var sb=document.getElementById('sidebar'); if (!sb) return;
	sb.style.display=co.chkShowRightSidebar?'block':'none';
	document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
	saveOptionCookie('chkShowRightSidebar');
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
	if (typeof(place)!='undefined' && '$1'=='$'+'1') {
		place.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
		place.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
	}
	var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
</script><script>
	var co=config.options;
	if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
	var sb=document.getElementById('sidebar'); if (!sb) return;
	sb.style.display=co.chkShowRightSidebar?'block':'none';
	document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
	if ('$1'=='$'+'1') {
		var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
		var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
		place.lastChild.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
		place.lastChild.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
	}
</script>
|~ViewToolbar|collapseTiddler collapseOthers RefreshCommand snapshotPrint closeTiddler closeOthers editTiddler +easyEdit > < * fields permalink references jump|
|~CollapsedToolbar|expandTiddler collapseOthers RefreshCommand snapshotPrint closeTiddler closeOthers +editTiddler > < * fields permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler copyTiddler deleteTiddler autosizeEditor|
/***
|Name|UnsavedChangesPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#UnsavedChangesPlugin" title="Linkification: http://www.TiddlyTools.com/#UnsavedChangesPlugin">http://www.TiddlyTools.com/#UnsavedChangesPlugin</a></a>|
|Version|3.3.3|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|<a class="linkification-ext" href="http://creativecommons.org/licenses/by-sa/2.5/" title="Linkification: http://creativecommons.org/licenses/by-sa/2.5/">http://creativecommons.org/licenses/by-sa/2.5/</a>]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|TiddlyWiki.prototype.setDirty,store.saveTiddler,store.removeTiddler|
|Description|show droplist of tiddlers that have changed since the last time the document was saved|
Display a list of tiddlers that have been changed since the last time the document was saved.  The list includes all new/modified tiddlers as well as those changed with "minor edits" enabled and any tiddlers that you import during the session, regardless of their modification date.
!!!!!Usage
<<<
{{{
<<unsavedChanges panel>> or <<unsavedChanges>>
}}}
{{indent{
the ''panel'' keyword displays a 'control panel' interface containing a droplist of unsaved tiddlers and a 'goto' button, along with a command link to 'save changes'.  Depending upon what other plugins are installed, several additional elements will also be displayed: When [[NestedSlidersPlugin]] is installed, the entire control panel is contained within a ''SLIDER''.  When [[LoadTiddlersPlugin]] is installed, a ''REVERT'' button is added.  When [[SaveAsPlugin]] is installed, a ''SAVE AS'' link is added.  When [[UploadPlugin]] is installed, an ''UPLOAD'' (or ''save to web'') link is added.  When [[TrashPlugin]] is installed and there are tiddlers tagged with<<tag Trash>>, an ''EMPTY TRASH'' link is added.
}}}
{{{
<<unsavedChanges list separator>>
}}}
{{indent{
the ''list'' keyword displays a simple space-separated list of unsaved tiddlers without any other command links.  You can specify an optional ''separator'' value that can be used in place of the default space character.  For example, you can specify {{{"<br>"}}} as the separator in order to display each link, one per line.
}}}
{{{
<<unsavedChanges command label tip>>
}}}
{{indent{
the ''command'' keyword displays a single 'command link' that, when clicked, displays a ~TiddlyWiki popup containing the list of unsaved tiddlers, the 'save changes' command and, depending upon what other plugins are installed, additional commands for 'save as', 'upload', and 'empty trash' (similar to the panel display described above).

You can specify optional ''label'' and ''tip'' parameters in the macro to customize the command link text and tooltip.  The default label for the command link is: "There %1 %0 unsaved tiddler%2...", where:
* %0 is automatically replaced with the number of unsaved changes
* %1 is either "is" (if changes=1) or "are" (if changes>1)
* %2 is either blank (if changes=1) or "s" (if changes>1)
resulting in the text: //"There is 1 unsaved tiddler...", "There are 2 unsaved tiddlers...", etc.//
}}}
<<<
!!!!!Examples
<<<
^^//note: the following examples will not display any output unless you have already created/modified tiddlers in the current document.//^^
{{{<<unsavedChanges>>}}}
<<unsavedChanges>>
----
{{{<<unsavedChanges command>>}}}
<<unsavedChanges command>>
----
{{{<<unsavedChanges list>>}}}
<<unsavedChanges list>>
----
{{{<<unsavedChanges list "<br>">>}}}
<<unsavedChanges list "<br>">>
<<<
!!!!!Revisions
<<<
2009.03.02 [3.3.3] fix handling for titles that contain HTML special chars (lt,gt,quot,amp)
2008.09.02 [3.3.2] cleanup popup list output generation and added timestamps/sizes to popup display
2008.08.23 [3.3.1] added optional custom 'label' and 'tip' params to 'command' mode and defined default values for mode, label, tip, and separator as object properties for I18N/L10N-readiness.
2008.08.21 [3.3.0] complete re-write of rendering and refresh processing to support multiple instances and automatic self-refresh (no longer depends upon core refresh notifications)
2008.08.21 [3.2.0] added 'command' option for link+popup as alternative to 'control panel' interface
2008.04.22 [3.1.2] use SaveAsPlugin instead of obsolete NewDocumentPlugin to add "save as" link
2007.12.22 [3.1.1] hijack removeTiddler() instead of low-level deleteTiddler() to correct tracking and refresh handling issues.  in saveTiddler(), check for 'tiddler rename' (title!=newtitle) and adjust list accordingly.
2007.12.21 [3.1.0] added support for {{{<<unsavedChanges list separator>>}}} usage to unsaved tiddlers as a simple list of links, embedded in tiddler content (e.g., [[MainMenu]])
2007.12.20 [3.0.0] rewrite to track ALL changed tiddlers, including imports and minor edits, regardless of saved modification dates.  Also, rewrote display logic to directly refresh macro output instead of triggering a page refresh.  The entire process is MUCH more efficient now.
2007.08.02 [2.0.0] converted from inline script
2007.01.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.UnsavedChangesPlugin= {major: 3, minor: 3, revision: 3, date: new Date(2009,3,2)};

config.macros.unsavedChanges = {
	changed: [], // list of currently unsaved tiddler titles
	defMode: "panel",
	defSep: " ",
	defLabel: "There %1 %0 unsaved tiddler%2...",
	defTip: "view a list of unsaved tiddler changes",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var wrapper=createTiddlyElement(place,"span",null,"unsavedChanges");
		wrapper.setAttribute("mode",params[0]||this.defMode);
		wrapper.setAttribute("sep",params[1]||this.defSep); // for 'list' mode
		wrapper.setAttribute("label",params[1]||this.defLabel); // for 'command' mode
		wrapper.setAttribute("tip",params[2]||this.defTip); // for 'command' mode
		this.render(wrapper);
	},
	render: function(wrapper) {
		removeChildren(wrapper); // make sure its empty
		if (!this.changed.length) return; // no changes = no output
		switch (wrapper.getAttribute("mode")) {
			case "command": this.command(wrapper); break;
			case "list": this.list(wrapper); break;
			case "panel": default: this.panel(wrapper); break;
		}
	},
	refresh: function() {
		var wrappers=document.getElementsByTagName("span");
		for (var w=0; w<wrappers.length; w++)
			if (hasClass(wrappers[w],"unsavedChanges"))
				this.render(wrappers[w]);
	},
	list: function(place) { // show simple list of unsaved tiddlers
		wikify("[["+this.changed.join("]]"+place.getAttribute("sep")+"[[")+"]]",place);
	},
	command: function(place) { // show command link with popup list
		var c=this.changed.length;
		var txt=place.getAttribute("label").format([c,c==1?'is':'are',c==1?'':'s']);
		var tip=place.getAttribute("tip");
		var action=function(ev) { if (!ev) var ev=window.event;
			var p=Popup.create(this); if (!p) return false;
			var d=createTiddlyElement(p,"div");
			d.style.whiteSpace="normal"; d.style.width="auto"; d.style.padding="2px";
			// gather pretty links for changed tiddlers
			var list=[]; var item=" &nbsp;[[%1 - %0 (%2 bytes)|%0]]&nbsp; ";
			for (var i=config.macros.unsavedChanges.changed.length-1; i>=0; i--) {
				var tid=store.getTiddler(config.macros.unsavedChanges.changed[i]);
				if (!tid) continue;
				var when=tid.modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
				list.push(item.format([tid.title,when,tid.text.length]));
			}
			wikify("@@white-space:nowrap;"+list.join("<br>")+"@@",d);
			if (!readOnly) {
				var t="\n----\n";
				t+="@@white-space:nowrap;display:block;text-align:center; &nbsp;";
				t+="<<saveChanges>>";
				t+=config.macros.saveAs?" | <<saveAs>>":"";
				t+=config.macros.upload?" | <<upload>>":"";
				t+=(config.macros.emptyTrash&&store.getTaggedTiddlers("Trash").length)?" | <<emptyTrash>>":"";
				t+="&nbsp; @@";
				wikify(t,d);
			}
			Popup.show(p,false);
			ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation();
			return(false);
		}
		createTiddlyButton(place,txt,tip,action,"button");
	},
	panel: function(place) { // show composite droplist+buttons+commands
		// gather changed tiddlers (in reverse order by date - most recent first)
		var tids=[]; for (var i=this.changed.length-1; i>=0; i--)
			{ var t=store.getTiddler(this.changed[i]); if (t) tids.push(t); }
		tids.sort(function(a,b){return a.modified<b.modified?-1:(a.modified==b.modified?0:1);});
		// generate droplist items
 		var list=[]; var item='<option value="%0">%1 - %0 (%2 bytes)</option>';
		for (var i=tids.length-1; i>=0; i--) {
			var when=tids[i].modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
			list.push(item.format([tids[i].title.htmlEncode(),when,tids[i].text.length]));
		}
		// display droplist, buttons, and command links
		var out=''; var c=this.changed.length;
		var NSP=config.formatters.findByField("name","nestedSliders");
		var summary=this.defLabel.format([c,c==1?'is':'are',c==1?'':'s'])
		out+=NSP?'+++(unsaved)['+summary+'|'+this.defTip+']...':(summary+"\n");
		out+='<html><form style="display:inline"><!--\
			--><select size="1" name="list" \
				title="select a tiddler to view" \
				onchange="var v=this.value; if (v.length) story.displayTiddler(null,v);"><!--\
			-->'+list.join('')+'<!--\
			--></select><!--\
			--><input type="button" value="goto" onclick="this.form.list.onchange();">';
		if (config.macros.loadTiddlers)  {
			out+='<input type="button" value="revert" \
				title="import the last saved version of this tiddler" \
				onclick="var v=this.form.list.value; if (!v.length) return; \
					var t=\'<\'+\'<loadTiddlers [[tiddler:\'+v+\']] \'; \
					t+=document.location.href; \
					t+=\' confirm force noreport>\'+\'>\'; \
					var e=document.getElementById(\'executeRevert\'); \
					if (e) e.parentNode.removeChild(e); \
					e=document.createElement(\'span\'); \
					e.id=\'executeRevert\'; \
					wikify(t,e);">';
		}
		out+='</form></html>';
		if (!readOnly) {
			out+='\n{{small nowrap{';
			out+="<<saveChanges>>";
			out+=config.macros.saveAs?" | <<saveAs>>":"";
			out+=config.macros.upload?" | <<upload>>":"";
			out+=(config.macros.emptyTrash&&store.getTaggedTiddlers("Trash").length)?" | <<emptyTrash>>":"";
			out+='}}}';
		}
		out+=NSP?'===':'';
		wikify(out,place);
	}
};

// hijack store.saveTiddler() to track changes to tiddlers
if (store.showUnsaved_saveTiddler==undefined) {
	store.showUnsaved_saveTiddler=store.saveTiddler;
	store.saveTiddler=function(title,newtitle) {
		if (title!=newtitle) {
			var i=config.macros.unsavedChanges.changed.indexOf(title);
			if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove old from list
		}
		var i=config.macros.unsavedChanges.changed.indexOf(newtitle);
		if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove new title from list
		config.macros.unsavedChanges.changed.push(newtitle); // add new title to END of list
		var t=this.showUnsaved_saveTiddler.apply(this,arguments);
		if (!this.notificationLevel) config.macros.unsavedChanges.refresh();
		return t;
	}
}

// hijack store.removeTiddler() to track changes to tiddlers
if (store.showUnsaved_removeTiddler==undefined) {
	store.showUnsaved_removeTiddler=store.removeTiddler;
	store.removeTiddler=function(title) {
		var i=config.macros.unsavedChanges.changed.indexOf(title);
		if (i!=-1) config.macros.unsavedChanges.changed.splice(i,1); // remove from list
		this.showUnsaved_removeTiddler.apply(this,arguments);
		if (!this.notificationLevel) config.macros.unsavedChanges.refresh();
	}
}

// hijack store.setDirty() function to reset change list after file save
// note: do NOT hijack the prototype function.  This hijack should only be applied to
// the main 'store' instance only (i.e., don't refresh when loading temporary store
// as part of ImportTiddlers processing)
if (store.showUnsaved_setDirty==undefined) {
	store.showUnsaved_setDirty=store.setDirty;
	store.setDirty = function(flag) {
		var refresh=this.isDirty() && !flag; // 'dirty' to 'clean', force a refresh...
		this.showUnsaved_setDirty.apply(this,arguments); // but change the flag first.
		if (refresh) {
			config.macros.unsavedChanges.changed=[]; // clear changed list
			config.macros.unsavedChanges.refresh();
		}
	}
}
//}}}
!!!Abstract
{{justify{Software metrics provide a powerful tool to describe a software system. They are obtained by analyzing the source code and they point out many software features. With this objective quantitative measure expressed numerically we can not only determine the quality of the product or process, but also predict and improve it in the first place. Implementing software metrics in the form of graphical representations through a set of visualization methods result in a number of benefits for the user. Such a graphic description provides a higher information value than the information presented merely in a linear text display. Metrics visualization amplifies the understanding of software, helps uncover hidden relationships or often repetitive patterns. The primary objective of this work is to design a modular graphics library of a suitable set of software metrics visualization methods, integrated into an innovative IDE development environment for editing and viewing source code. The work identifies software aspects suitable for visualizing in the form of metrics as data entry. Consequently it discusses the different visualization methods respecting the principles of an appropriate graphic display. Then it analyzes some current existing libraries with the intention of identifying a suitable way of creating an interactive visualization.
}}}
!!!Results
{{center{[img(20cm, )[./img/bachelor/2014/prochotska/BBBB.PNG]]
{{center{Halstead metrics visualization using parallel coordinates and table.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2014/prochotska/DFvis.png]]
{{center{Different visualizations for a data set.}}}}}}
{{center{[img(20cm, )[./img/bachelor/2014/prochotska/DFInteraktivita.PNG]]
{{center{Interaction with visualization: (top) zooming, (bottom) filtering.}}}}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<span class='title' macro='view title'></span>
<div class='subtitle fine'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagClear'></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' style='line-height:100%;margin-top:.5em;'><a href="javascript:;"
	onclick="window.scrollTo(0,ensureVisible(story.findContainingTiddler(this)));return false;"
	onmouseover="this.title='scroll to top of '+story.findContainingTiddler(this).getAttribute('tiddler')">&#x25b2;</a>
</div>
<div class='tagClear'></div>
<!--}}}-->
!!!Abstract
{{justify{This thesis presents data visualization prototype in spatial projective augmented reality, which is based on projective texturing used on virtual scene that mimics real-world geometry. It shows test results of projection on mostly linear surfaces. It also describes test results of graph perspective changes based on viewer’s position. Apart from presented prototype thesis mentions several works, which deal with data visualization in augmented reality, while focusing mainly on projective AR solutions.}}}
{{center{[img(20cm, )[img/bachelor/2016/Kostan/design_Retazec_renderovania.png]]
{{center{Hardware setup.}}}}}}
{{center{[img(10cm, )[./img/bachelor/2016/Kostan/test_04_viewer_45_low_fov90_white.jpg]]
{{center{Projecting a graph onto 2 perpendicular planes.}}}}}}


{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
!!!Abstract
{{justify{This work deals with the problem of generating documentation from source code, it describes commonly used practices in the field of documentation generation, which are based on structural analysis of source code, together with less common practices such as literate programming. This work describes the methods that are necessary to perform a successful structural analysis of source code, and describes the possibilities that arise from the knowledge of this information. Described possibilities include pretty-printing of source code and processing documentation comments that might be present in the source code. Several existing documentation generation tools are analyzed and described together with their highlights and bad properties, but the main focus is laid on extending and adding functionality of ~LuaDoc, which is a tool for generating documentation from source code of programs written in the Lua scripting language. During implementation of various tasks, abstract syntax trees acquired upon structural analysis of source code based on PEG grammars using Lua libraries ~LPeg and Leg are used.}}}
!!!Results
{{justify{Following figures show various enhancements of the generated source code documentation produced by our modified ~LuaDoc.}}}
{{center{[img(20cm, )[img/bachelor/2011/kubis/function_detail.png]]}}}
{{center{A separate page with details of a function with function's source code.}}}
{{center{[img(15cm, )[img/bachelor/2011/kubis/list_of_functions.png]]}}}
{{center{Indexed list of functions found in a Lua project.}}}
{{center{[img(20cm, )[img/bachelor/2011/kubis/quick_function_detail_vh.png]]}}}
{{center{Showing source code directly in the function list.}}}
{{center{[img(13cm, )[img/bachelor/2011/kubis/source_toggle.png]]}}}
{{center{Highlighting Lua variables when placing the mouse cursor over a variable.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
{{justify{The [[Vision & Graphics Group|http://vgg.fiit.stuba.sk]] is an informal research group at the Institute of Applied Informatics at FIIT STU that is interested in computer vision, computer graphics, visualization and related problem fields.}}}
!!!News
*''04.10.2011 12:00 D124'' Preliminary program:
**Peter Drahoš, ~PhD. - presents results of his dissertation: ''A Photo-realistic Head Model for Real-time Animation''
**short master thesis presentations
<<tiddler HideTiddlerSubtitle>>  	
/***
|Name|WikifyPlugin|
|Source|<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="<a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a></a>" title="Linkification: <a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a>"><a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPlugin" title="Linkification: http://www.TiddlyTools.com/#WikifyPlugin">http://www.TiddlyTools.com/#WikifyPlugin</a></a>|
|Documentation|<a class="linkification-ext" href="http://www.TiddlyTools.com/#WikifyPluginInfo" title="Linkification: http://www.TiddlyTools.com/#WikifyPluginInfo">http://www.TiddlyTools.com/#WikifyPluginInfo</a>|
|Version|1.1.4|
|Author|Eric Shulman - ELS Design Studios|
|License|<a class="linkification-ext" href="http://www.TiddlyTools.com/#LegalStatements" title="Linkification: http://www.TiddlyTools.com/#LegalStatements">http://www.TiddlyTools.com/#LegalStatements</a> <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|substitute fields, slices, or computed values into a wiki-syntax format string and render results dynamically|
The {{{<<wikify>>}}} macro allows you to easily retrieve values from custom tiddler fields, tiddler slices, computed values (using javascript) or just plain old literals, and assemble them into small bits of generated wiki-syntax text content that can be rendered directly into a tiddler, or used in the ViewTemplate or EditTemplate to add dynamically-generated content to each tiddler.

The {{{<<wikiCalc>>}}} macro performs the same processing as {{{<<wikify>>}}} and, in addition, passes the assembled text content through javascript's {{{eval()}}} function before rendering the results.  This allows you to, for example, construct and compute mathematical expressions that use input values extracted from tiddler fields or slices.
!!!!!Documentation
> see [[WikifyPluginInfo]]
!!!!!Revisions
<<<
2009.03.29 [1.1.4] in handler(), pass 'tiddler' value to wikify() to fix macro errors in rendered content
|please see [[WikifyPluginInfo]] for additional revision details|
2007.06.22 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.WikifyPlugin= {major: 1, minor: 1, revision: 4, date: new Date(2009,3,29)};

config.macros.wikify={
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var fmt=params.shift();
		var values=[];
		var out="";
		if (!fmt.match(/\%[0-9]/g) && params.length) // format has no markers, just join all params with spaces
			out=fmt+" "+params.join(" ");
		else { // format param has markers, get values and perform substitution
			while (p=params.shift()) values.push(this.getFieldReference(place,p));
			out=fmt.format(values);
		}
		if (macroName=="wikiCalc") out=eval(out).toString();
		wikify(out.unescapeLineBreaks(),place,null,tiddler);
	},
	getFieldReference: function(place,p) { // "slicename::tiddlername" or "fieldname@tiddlername" or "fieldname"
		if (typeof p != "string") return p; // literal non-string value... just return it...
		var parts=p.split(config.textPrimitives.sliceSeparator);
		if (parts.length==2) {// maybe a slice reference?
			var tid=parts[0]; var slice=parts[1];
			if (!tid || !tid.length || tid=="here") { // no target (or "here"), use containing tiddler
				tid=story.findContainingTiddler(place);
				if (tid) tid=tid.getAttribute("tiddler")
				else tid="SiteSlices"; // fallback for 'non-tiddler' areas (e.g, header, sidebar, etc.)
			}
			var val=store.getTiddlerSlice(tid,slice);  // get tiddler slice value
		}
		if (val==undefined) {// not a slice, or slice not found, maybe a field reference?
			var parts=p.split("@");
			var field=parts[0];
			if (!field || !field.length) field="checked"; // missing fieldname, fallback: checked@tiddlername
			var tid=parts[1];
			if (!tid || !tid.length || tid=="here") { // no target (or "here"), use containing tiddler
				tid=story.findContainingTiddler(place);
				if (tid) tid=tid.getAttribute("tiddler")
				else tid="SiteFields"; // fallback for 'non-tiddler' areas (e.g, header, sidebar, etc.)
			}
			var val=store.getValue(tid,field);
		}
		// not a slice or field, or slice/field not found... return value unchanged
		return val===undefined?p:val;
	}
}
//}}}
//{{{
// define alternative macroName for triggering pre-rendering call to eval()
config.macros.wikiCalc=config.macros.wikify;
//}}}
<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>
//{{{
readOnly=false; // TW core setting
config.options.chkInsertTabs=true; // TW core option
config.options.txtMaxEditRows="20"; // TW core option
config.options.chkShowLeftSidebar=true; // ToggleLeftSidebar
config.options.chkShowRightSidebar=false; // ToggleRightSidebar
config.options.chkSliderunsaved=true; // UnsavedChangesPlugin
config.options.chkStoryFold=false; // StorySaverPlugin
config.options.chkSinglePageMode=true;  // SinglePageMode
config.options.txtBreadcrumbsLimit=5; // Max 5 Breadcrumbs
//}}}
!!!Abstract
{{justify{Presented thesis deals with the field of information visualization. Lots of information has structural character with some kind of relations. This type of information could be naturally represented by graph, often in form of tree-like, hierarchical structure. The aim of this thesis was to introduce different algorithms for visualization of such structures in three dimensions and to design an experimental algorithm, which will visualize hierarchical structure reaching the shape of a soap bubble cluster. After the exploration of existing hierarchy visualization solutions a dynamical algorithm was created. It is based on the spring model, which was determined as the most appropriate technique for this task. For demonstrational purposes simple interactive visualization system was implemented. The process of system and algorithm development, along with capabilities and issues connected with its use, is discussed in detail.}}}
!!!Results
{{center{[img[img/bachelor/2008/ukrop/2008_ukrop_bc_1.jpg]]}}}
{{center{Visualization without transparent nodes.}}}
{{center{[img[img/bachelor/2008/ukrop/2008_ukrop_bc_2.jpg]]}}}
{{center{Visualization with transparent nodes.}}}
{{center{[img[img/bachelor/2008/ukrop/2008_ukrop_bc_3.jpg]]}}}
{{center{Visualization with standard string length.}}}
{{center{[img[img/bachelor/2008/ukrop/2008_ukrop_bc_4.jpg]]}}}
{{center{Visualization with modified string length.}}}
{{center{<<storyViewer [[Bachelor projects]] list allbuttons>>}}}
>