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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.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:0px; top:0px;}

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

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

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin: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:0px 3px 0px 3px;}

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

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

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

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

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

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#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>>
D. Simitopoulos, S.A. Tsaftaris, N.V. Boulgouris and M.G. Strintzis: "Digital watermarking of ~MPEG-1 and ~MPEG-2 multiplexed streams for copyright protection", in //Proceedings of IEEE International Workshop on Digital and Computational Video (DCV 2001)//, Tampa, Florida, USA, pp. 140-147, February 2001.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/dcv2001.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/dcv2001.pdf]] ] 

''Abstract''
A new technique for watermarking of ~MPEG-1/2 compressed video streams is proposed. The watermarking scheme operates directly in the domain of ~MPEG-1/2 program streams. Perceptual models are used during the embedding process in order to preserve the quality of the video. The detection of the watermark is performed in the compressed domain without requiring the original video. The resulting watermarking system is very fast and reliable and is suitable for copyright protection and real-time content authentication applications.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/2475499]]
D. Simitopoulos, S.A. Tsaftaris, N.V. Boulgouris, G.A. Triantafyllidis and M.G. Strintzis: "//Digital Watermarking for the Copyright Protection of Compressed Video//", "Intelligent Integrated Media Communication Techniques", eds. Mohammed Najim, Michael Ansorge, Jurij F. Tasic, Kluwer Academic Pub, December 2003.  [[Find it at Springer|http://www.springerlink.com/content/g5640h3h7h7772r7/]]

''Abstract''
In this chapter, a new technique for the watermarking of ~MPEG-1 and ~MPEG-2 compressed video streams is proposed. The watermarking scheme operates directly in the domain of ~MPEG-1 system streams and ~MPEG-2 program streams (multiplexed streams). Perceptual models are used during the embedding process in order to preserve video quality. The watermark is embedded in the compressed domain and is detected without the use of the original video sequence. Experimental evaluation demonstrates that the proposed scheme is able to withstand a variety of attacks. The resulting watermarking system is very fast and reliable, and is suitable for the copyright protection of video content.


[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/8119020]]
D. Simitopoulos, S.A. Tsaftaris, N.V. Boulgouris, A. Briassouli and M.G. Strintzis, "Fast watermarking of ~MPEG-1/2 streams using compressed-domain perceptual embedding and a generalized correlator detector," // EURASIP Journal on Applied Signal Processing//, vol. 8, pp. 1088-1106, July 2004. 
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_JASP_2004.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papersTsaftaris_JASP_2004.pdf]] ]

''Abstract''
A novel technique is proposed for watermarking of ~MPEG-1 and ~MPEG-2 compressed video streams. The proposed scheme is applied directly in the domain of ~MPEG-1 system streams and ~MPEG-2 program streams (multiplexed streams). Perceptual models are used during the embedding process in order to avoid degradation of the video quality. The watermark is detected without the use of the original video sequence. A modified correlation-based detector is introduced that applies nonlinear preprocessing before correlation. Experimental evaluation demonstrates that the proposed scheme is able to withstand several common attacks. The resulting watermarking system is very fast and therefore suitable for copyright protection of compressed video.
In support of the P.A.T.T. event at The Note of WED June 27th 2007.

Track Listing:
1. DJ Pierre - Good Love ( Dennis Ferrer's foreplay Mix )
2. Bob Sinclar ft Ron Carroll - Wonderful World
3. DJ Pierre - Switch 2001
4. Bob Sinclar ft Gary Pine - Love Generation (Ron Carroll bmc black gospel mix)
5. DJ Pierre - Destroy this track filthy rich remix

[[MP3|http://users.eecs.northwestern.edu/~stsaft/DJ/pierre_carroll.mp3]]
S. A. Tsaftaris and A. K. Katsaggelos, "DNA sequencing," in //Wiley Encyclopedia of Medical Devices and Instrumentation//, 2nd ed., J. G. Webster, Ed. Reading, Massachusetts:
John Wiley and Sons, 2006, vol. 2, pp. 427–437. [[link|http://www.wiley.com/WileyCDA/WileyTitle/productCd-0471263583.html]]
[<img[IEEE SP COVER vol 5 2004|http://users.eecs.northwestern.edu/~stsaft/media/sig_pro_1.png]] S.A. Tsaftaris, A.K. Katsaggelos, T.N. Pappas and E.T. Papoutsakis, "DNA computing from a signal processing viewpoint", //IEEE Signal Processing Magazine//, vol. 21, no. 5, pp. 100-106, September 2004.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/SP_mag_1_04.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/SP_mag_1_04.pdf]] ]


[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/532281]]
D. Simitopoulos, S.A. Tsaftaris, N.V. Boulgouris, and M.G. Strintzis: "Fast compressed domain watermarking of MPEG multiplexed streams", in //Proceedings of Information and Knowledge Management for Integrated Media Communication Workshop//, Madrid, Spain, November 2001.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/FinalCOST276.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/FinalCOST276.pdf]] ]
D.Simitopoulos, S.A. Tsaftaris, N.V. Boulgouris and M.G. Strintzis: "Compressed-domain Video Watermarking of MPEG Streams", in //Proceedings of IEEE International Conference on Multimedia and Expo (ICME 2002)//, Lausanne, Switzerland, vol. 1, pp. 569 -572, August 2002.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/icme2002.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/icme2002.pdf]] ]

''Abstract''
A new technique for watermarking of MPEG compressed video streams is proposed. The watermarking scheme operates directly in the domain of MPEG program streams. Perceptual models are used during the embedding process in order to preserve the video quality. The watermark is embedded in the compressed domain and is detected without the use of the original video sequence. Experimental evaluation demonstrates that the proposed scheme is able to withstand a variety of attacks. The resulting watermarking system is fast and reliable, and is suitable for copyright protection and real-time content authentication applications.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/2475489]]
S.A. Tsaftaris and A.K. Katsaggelos, "contribution to //Matisse: Radical Invention, 1913 - 1917//," exhibit catalogue, available at [[AIC Museum Shop|http://www.artinstituteshop.org/item.asp?productID=3904]].
[<img[IEEE SP COVER vol 6 2004|http://users.eecs.northwestern.edu/~stsaft/media/sig_pro_2.png]] S.A. Tsaftaris, A.K. Katsaggelos, T.N. Pappas and E.T. Papoutsakis, "How can ~DNA-Computing be applied in Digital Signal Processing?" // IEEE Signal Processing Magazine//, vol.21, no. 6, pp. 57-61, November 2004.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/SP_mag_2_04.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/SP_mag_2_04.pdf]] ]

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/503213]]
D. Simitopoulos, S.A. Tsaftaris, N.V. Boulgouris and M.G. Strintzis: "Fast MPEG Watermarking for Copyright Protection", in //Proceedings of IEEE International Conference on Electronics, Circuits and Systems (ICECS 2002)//, Dubrovnik, Croatia, vol. 3, pp. 1027-1030, September 2002.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/icecs2002.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/icecs2002.pdf]] ]

''Abstract''
In this paper, a new technique for watermarking of MPEG compressed video streams is proposed. The watermarking scheme operates directly in the domain of MPEG multiplexed streams. Perceptual models are used during the embedding process in order to preserve the quality of the video. The watermark is embedded in the compressed domain and is detected without the use of the original video sequence. Experimental evaluation demonstrates that the proposed scheme is able to withstand a variety of attacks. The resulting watermarking system is very fast and reliable, and is suitable for copyright protection and real-time content authentication applications.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/2475521]]
S.A. Tsaftaris, V. Hatzimanikatis, and A.K. Katsaggelos, "//In silico// estimation of annealing specificity of query searches in DNA databases", // Journal of Japan Society of Simulation Technology (JSST)// special issue // "Application and Simulation of DNA Computing"//, vol. 24, no. 4, pp. 268-276, December 2005.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris05JSST.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris05JSST.pdf]] ]


''Abstract''
We consider DNA implementations of databases for digital signals with retrieval and mining capabilities. Digital signals are encoded in DNA sequences and retrieval is achieved through annealing between query DNA primers and data carrying DNA target sequences. The hybridization between query and target can be non-specific containing multiple mismatches thus implementing similarity-based searches. In this paper we examine theoretically and by simulation the efficiency of such a system by estimating the concentrations of query-target duplex formations at equilibrium. A coupled kinetic model is used to estimate the concentrations. We offer a derivation that results in an equation that is guaranteed to have a solution and can be easily and accurately solved computationally with bisection root-finding methods. Finally, we also provide an approximate solution at dilute query concentrations that results in a closed form expression. This expression is used to improve the speed of the bi-section algorithm and also to find a closed form expression for the specificity ratios.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/524016]]
S.A. Tsaftaris, F. Casadio, G. Gautier, J.-L. Andral, and A.K. Katsaggelos, “La Joie De Vivre: The Evolution of a Masterpiece,” in //Picasso Express//, J.-L. Andral (ed.), May 2011. 
S.A. Tsaftaris, A.K. Katsaggelos, T.N. Pappas and E.T. Papoutsakis, "DNA Based Matching of Digital Signals", in //Proceedings of IEEE International Conference on Acoustics, Speech, and Signal Processing//, vol. 5, pp. 581-584, Montreal, Quebec, Canada, 17-21 May 2004.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/ICASSPd.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/ICASSPd.pdf]] ]

''Abstract''
Adleman with his pioneering work set the stage for the new field of bio-computing research.  His main idea was to use actual chemistry to solve problems that are either unsolvable by conventional computers, or require an enormous amount of computation.  The main focus of our research is to consider the application of molecular computing to the domain of digital signal processing (DSP).  In this paper we consider matching problems that arise in signal processing applications and are amenable to a ~DNA-based solution.  Digital data are encoded in DNA sequences using a sophisticated codeword set that satisfies the Noise Tolerance Constraint (NTC) that we introduce. NTC, one of the main contributions of our work, takes into account the presence of noise in digital signals by exploiting the annealing between non-perfect complementary sequences.  We propose an algorithm to map binary values into DNA codewords by satisfying a number of constraints, including the NTC.  Using that algorithm we retrieved 128 codewords that enables us to use a DNA based approach to digital signal matching.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/523917]]
H. Wang, S.A. Tsaftaris and A.K. Katsaggelos, "Joint source-channel coding for wireless object-based video communications utilizing data hiding," //IEEE Trans. Image Processing//, vol. 15, no. 8, pp. 2158-2169, Aug. 2006. [ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/WangTsaftKats_TIP06.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/WangTsaftKats_TIP06.pdf]] ]

''Abstract''
In recent years, joint source-channel coding for multimedia communications has gained increased popularity. However, very limited work has been conducted to address the problem of joint source-channel coding for object-based video. In this paper, we propose a data hiding scheme that improves the error resilience of object-based video by adaptively embedding the shape and motion information into the texture data. Within a rate-distortion theoretical framework, the source coding, channel coding, data embedding, and decoder error concealment are jointly optimized based on knowledge of the transmission channel conditions. Our goal is to achieve the best video quality as expressed by the minimum total expected distortion. The optimization problem is solved using Lagrangian relaxation and dynamic programming. The performance of the proposed scheme is tested using simulations of a Rayleigh-fading wireless channel, and the algorithm is implemented based on the ~MPEG-4 verification model. Experimental results indicate that the proposed hybrid source-channel coding scheme significantly outperforms methods without data hiding or unequal error protection

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/796845]]
S.A. Tsaftaris and A.K. Katsaggelos, "A new codeword design algorithm for DNA based Storage and retrieval of digital signals," in Preproceedings of the //11th International Meeting on ~DNA-based computers DNA 11 //, London, Ontario, Canada, 2005.
[<img[IEEE PROCEEDINGS COVER|http://users.eecs.northwestern.edu/~stsaft/media/ieeeproc_cover.png]] S.A. Tsaftaris and A.K. Katsaggelos, "The Not So Digital Future of Digital Signal Processing," in //Proceedings of the IEEE//, vol. 96, no. 3, March 2008.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris08TheNotSo.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris08TheNotSo.pdf]] ]

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/2461515]]
S.A. Tsaftaris and A.K. Katsaggelos, "On Designing DNA Databases for the Storage and Retrieval of Digital Signals", International Conference on Natural Computation, special session on Recent Advances in Biomolecular Computing, Changsha, China, August 26-29, 2005, //Lecture Notes in Computer Science//, vol. 3611, pp. 1192-1201, Jul 2005.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_LNCS_china.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_LNCS_china.pdf]] ]

''Abstract''
In this paper we propose a procedure for the storage and retrieval of digital signals utilizing DNA. Digital signals are encoded in DNA sequences that satisfy among other constraints the Noise Tolerance Constraint (NTC) that we have previously introduced. NTC takes into account the presence of noise in digital signals by exploiting the annealing between non-perfect complementary sequences. We discuss various issues arising from the development of ~DNA-based database solutions (i) in vitro (in test tubes, or other materials) for short-term storage and (ii) in vivo (inside organisms) for long-term storage. We discuss the benefits and drawbacks of each scheme and its effects on the codeword design problem and performance. We also propose a new way of constructing the database elements such that a short-term database can be converted into a long term one and vice versa without the need for a re-synthesis. The latter improves efficiency and reduces the cost of a long-term database.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/523990]]
[<img[IEEE NanoBioscience COVER|http://ieeexplore.ieee.org/images/cover_images/Nanobioscience.jpg]] S.A. Tsaftaris and A.K. Katsaggelos, "Retrieval Efficiency of ~DNA-Based Databases of Digital Signals," //IEEE Transactions on ~NanoBioscience//, vol. 8, no. 3, pp. 259-270, Sept. 2009.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_TNB_2009.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_TNB_2009.pdf]] ]

''Abstract''
Using DNA to store digital signals, or data in general, offers significant advantages when compared to other media. The DNA molecule, especially in its double-stranded form, is very stable, compact, and inexpensive. In the past, we have shown that DNA can be used to store and retrieve digital signals encoded and stored in DNA. We have also shown that DNA hybridization can be used as a similarity criterion for retrieving digital signals encoded and stored in a DNA database. Retrieval is achieved through hybridization of //query// and //data// DNA molecules. In this paper, we present a mathematical framework to simulate single-query and parallel-query scenarios, and to estimate hybridization efficiency. Our framework allows for exact numerical solutions as well as closed-form approximations under certain conditions. Similarly to the digital domain, we define a DNA SNR measure to assess the performance of the ~DNA-based retrieval scheme in terms of database size and source statistics. With approximations, we show that the SNR of any finite-sized ~DNA-based database is upper bounded by the SNR of an infinitely large ~DNA-based database that has the same source distribution. Computer simulations are presented to validate our results.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/5907599]]
S.A. Tsaftaris, V. Hatzimanikatis, and A.K. Katsaggelos, "DNA Hybridization as a Similarity Criterion for Querying Digital Signals Stored in DNA Databases", in //Proceedings of 31st International Conference on Acoustics, Speech, and Signal Processing (ICASSP)//, Toulouse, France, May 14-19, vol. 2, pp. ~II-1084 - ~II-1087, 2006.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICASSP_2006.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICASSP_2006.pdf]] ]

''Abstract''
We demonstrate via simulation that hybridization of DNA molecules can be used as a similarity criterion for retrieving digital signals encoded and stored in a synthesized DNA database. After introducing some necessary DNA terminology, we briefly explain how digital signals are transformed to DNA sequences. Since retrieval is achieved through hybridization of query and data carrying DNA molecules, we present a mathematical model to estimate hybridization efficiency (also known as selectivity annealing). We show that selectivity annealing is inversely proportional to the mean squared error (MSE) of the encoded signal values. In addition, we show that the concentration of the molecules plays the same role as the decision threshold employed in digital signal matching algorithms. Finally, similar to the digital domain, we define a DNA signal-to-noise ratio (SNR) measure to assess the performance of the ~DNA-based retrieval scheme. Simulations are presented to validate our arguments.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/796846]]
[<img[IEEE PROCEEDINGS COVER|http://www.bcdecker.com/Covers/MI_Update.jpg]] R. Dharmakumar, Z. Zhang, I. Koktzoglou, S.A. Tsaftaris, D. Li, "Dual Contrast Cellular Magnetic Resonance Imaging," //Molecular Imaging//, vol. 8, no. 5, pp. 254-263, 2009. [[PDF available at Molecular Imaging Journal|http://www.bcdecker.com/pubMedLinkOut.aspx?pub=MIO&vol=8&iss=5&page=254]]

''Abstract''
Negative contrast magnetic resonance imaging (MRI) methods using magnetic susceptibility shifting agents have become one of the most important approaches in cellular imaging research. However, visualizing and tracking labeled cells on the basis of negative contrast is often met with limited specificity and sensitivity. Here we report on a MRI method for cellular imaging that generates a new contrast with a distinct topology for identifying labeled cells that has the potential to significantly improve both the sensitivity and the specificity. Specifically, we show that low flip-angle steady-state free precession MRI can be used to generate fast three-dimensional images of tissue that can be rapidly processed to generate quantitative metrics enabling color overlays indicative of regions containing labeled cells. The technique substantially improves the ability of MRI for detecting labeled cells by overcoming the fundamental limits that currently plague negative contrast methods.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/5907603]]
S.A. Tsaftaris, V. Hatzimanikatis, and A.K. Katsaggelos, "DNA as a Medium for Storing Digital Signals", in //Proceedings Artificial Life X//, Bloomington, Indiana USA, June 3-7, 2006, pp. 303-309, Luis Mateus Rocha (Editor), The MIT Press, Aug 1, 2006. 
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_Alife10.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_Alife10.pdf]] ] [[book@Amazon|http://www.amazon.com/Artificial-Life-Proceedings-International-Conference/dp/0262681625]]

''Abstract''
Motivated by the storage capacity and efficiency of the DNA molecule in this paper we propose to utilize DNA molecules to store digital signals. We show that hybridization of DNA molecules can be used as a similarity criterion for retrieving digital signals encoded and stored in a DNA database. Since retrieval is achieved through hybridization of query and data carrying DNA molecules, we present a mathematical model to estimate hybridization efficiency (also known as selectivity annealing). We show that selectivity annealing is inversely proportional to the mean squared error (MSE) of the encoded signal values. In addition, we show that the concentration of the molecules plays the same role as the decision threshold employed in digital signal matching algorithms. Finally, similarly to the digital domain, we define a DNA signal-to-noise ratio (SNR) measure to assess the performance of the ~DNA-based retrieval scheme. Simulations are presented to validate our arguments. 

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/697660]]
[<img[JMRI COVER|http://onlinelibrary.wiley.com/store/10.1002/jmri.v31:3/asset/cover.gif?v=1&s=1feb3671fdd11b743f533a480566d67ef1210b05]] S. A. Tsaftaris, E. Offerman, R. R. Edelman, and I. Koktzoglou, "Fully automated reconstruction of ungated ghost magnetic resonance angiograms," //Journal of Magnetic Resonance Imaging//, vol. 31, no. 3, pp. 655-662, 2010.
[[Full text|http://www3.interscience.wiley.com/journal/123304062/abstract]]

''Abstract''
//Purpose:// To completely automate the reconstruction process during noncardiac-gated unenhanced ghost magnetic resonance angiography (MRA).
//Materials and Methods:// Ungated unenhanced ghost MRA of the calf was performed in 16 volunteers. //K-means// and //fuzzy c-means// (FCM) clustering algorithms using prominent image features were applied to automatically create angiograms of the calf in volunteers undergoing ungated ghost MRA. Ghost angiograms reconstructed automatically were compared to those created manually on the basis of diagnostic image quality and apparent arterial-to-background contrast-to-noise ratio (CNR). Images were also ranked by an expert user in their order of preference using an ordinal scale.
//Results:// Compared with the ghost angiograms created manually, ghost angiograms reconstructed automatically with the use of clustering analysis provided similar arterial-to-background CNR values. No differences in diagnostic quality or preference were identified between images reconstructed manually and automatically.
//Conclusion:// We present fully automated image reconstruction algorithms for use with ungated and unenhanced ghost MRA. These automated algorithms, based on the use of k-means or FCM clustering, can be used to eliminate manual postprocessing that is time-consuming and subject to variability. 

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/7477854]]
[<img[JMRI COVER|http://onlinelibrary.wiley.com/store/10.1002/jmri.v31:4/asset/cover.gif?v=1&s=0c892715deafc3ac186489aa5890fb37a33dee0b]] X. Zhou, S. A. Tsaftaris, Y. Liu, R. Tang, R. Klein, S. Zuehlsdorff, D. Li, and R. Dharmakumar, "Artifact-reduced two-dimensional cine steady state free precession for myocardial blood- oxygen-level-dependent imaging," //Journal of Magnetic Resonance Imaging//, vol. 31, no. 4, pp. 863-871, 2010.
[[Full text|http://www3.interscience.wiley.com/journal/123336189/abstract]]

''Abstract''
//Purpose:// To minimize image artifacts in long TR cardiac phase-resolved steady state free precession (SSFP) based blood-oxygen-level-dependent (BOLD) imaging.
//Materials and Methods:// Nine healthy dogs (four male, five female, 20–25 kg) were studied in a clinical 1.5 Tesla MRI scanner to investigate the effect of temporal resolution, readout bandwidth, and motion compensation on long repetition time (TR) SSFP images. Breath-held 2D SSFP cine sequences with various temporal resolutions (10–204 ms), bandwidths (239–930 Hz/pixel), with and without first-order motion compensation were prescribed in the basal, mid-ventricular, and apical along the short axis. Preliminary myocardial BOLD studies in dogs with controllable coronary stenosis were performed to assess the benefits of artifact-reduction strategies.
//Results:// Shortening the readout time by means of increasing readout bandwidth had no observable reduction in image artifacts. However, increasing the temporal resolution in the presence of first-order motion compensation led to significant reduction in image artifacts. Preliminary studies demonstrated that BOLD signal changes can be reliably detected throughout the cardiac cycle.
//Conclusion:// Artifact-reduction methods used in this study provide significant improvement in image quality compared with conventional long TR SSFP BOLD MRI. It is envisioned that the methods proposed here may enable reliable detection of myocardial oxygenation changes throughout the cardiac cycle with long TR ~SSFP-based myocardial BOLD MRI. 

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/7477680]]
S.A. Tsaftaris, and A.K. Katsaggelos, "Retrieval Accuracy of Very Large ~DNA-Based Databases of Digital Signals," In //Proceedings of European Signal Processing Conference (~EUSIPCO-2007)//, Poznań, Polland, September 3-7, pp. 1561 - 1565, 2007
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_EUSIPCO_2007.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_EUSIPCO_2007.pdf]] ]

''Abstract''
In this paper a simulation of single query searches in very large ~DNA-based databases that are capable of storing and retrieving digital signals is presented. Similarly to the digital domain, a signal-to-noise ratio (SNR) measure to assess the performance of the ~DNA-based retrieval scheme in terms of database size and source statistics is defined. With approximations, it is shown that the SNR of any finite size DNA based database is upper bounded by the SNR of an infinitely large one with the same source distribution. Computer simulations are presented to validate the theoretical outcomes.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/1682938]]
S.A. Tsaftaris, R. Ahuja, D. Shiell, and A.K. Katsaggelos, "DNA Microarray Image Intensity Extraction Using Eigenspots," In //Proceedings International Conference on Image Processing (ICIP)//, September 16-19 2007, San Antonio Texas.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2007.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2007.pdf]] ]

''Abstract''
DNA microarrays are commonly used in the rapid analysis of gene expression in organisms.  Image analysis is used to measure the average intensity of circular image areas (spots), which correspond to the level of expression of the genes. A crucial aspect of image analysis is the estimation of the background noise.  Currently, background subtraction algorithms are used to estimate the local background noise and subtract it from the signal.  In this paper we use Principal Component Analysis (PCA) to de-correlate the signal from the noise, by projecting each spot on the space of eigenvectors, which we term eigenspots. PCA is well suited for such application due to the structural nature of the images. To compare the proposed method with other background estimation methods we use the industry standard signal to noise metric xdev.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/1683343]]
X. Zhou, V. Rundell, Y. Liu, R. Tang, R. Klein, S. Shah, S. Zuehlsdorff , S.A. Tsaftaris, D. Li, and R. Dharmakumar, "T2-weighted STIR imaging of myocardial edema associated with ischemia-reperfusion injury: The influence of proton density effect on image contrast," //Journal of Magnetic Resonance Imaging//, Vol. 33, no. 4, pp. 962–967, April 2011. [[Full Text|http://onlinelibrary.wiley.com/doi/10.1002/jmri.22456/full]]
 
''Abstract''
Purpose: To investigate the contribution of proton density (PD) in ~T2-STIR based edema imaging in the setting of acute myocardial infarction (AMI).
Materials and Methods: Canines (n = 5), subjected to full occlusion of the left anterior descending artery for 3 hours, underwent serial magnetic resonance imaging (MRI) studies 2 hours postreperfusion (day 0) and on day 2. During each study, T1 and T2 maps, STIR (TE = 7.1 msec and 64 msec) and late gadolinium enhancement (LGE) images were acquired. Using T1 and T2 maps, relaxation and PD contributions to myocardial edema contrast (EC) in STIR images at both ~TEs were calculated.
Results: Edematous territories showed significant increase in ~PD (20.3 ± 14.3%, P < 0.05) relative to healthy territories. The contributions of T1 changes and T2 or PD changes toward EC were in opposite directions. One-tailed t-test confirmed that the mean T2 and ~PD-based EC at both ~TEs were greater than zero. EC from STIR images at TE = 7.1 msec was dominated by PD than T2 effects (94.3 ± 11.3% vs. 17.6 ± 2.5%, P < 0.05), while at TE = 64 msec, T2 effects were significantly greater than PD effects (90.8 ± 20.3% vs. 12.5 ± 11.9%, P < 0.05). The contribution from PD in standard STIR acquisitions (TE = 64 msec) was significantly higher than 0 (P < 0.05).
Conclusion: In addition to T2-weighting, edema detection in the setting of AMI with T2-weighted STIR imaging has a substantial contribution from PD changes, likely stemming from increased free-water content within the affected tissue. This suggests that imaging approaches that take advantage of both PD as well as T2 effects may provide the optimal sensitivity for detecting myocardial edema.

[[BibTeX and EndNote entry via CiteULike|http://www.citeulike.org/user/stsaft/article/9312491]]
F. Jiang, J. Yuan, S.A. Tsaftaris, and A.K. Katsaggelos, "Anomalous Video Event Detection Using Spatiotemporal Context", in //Computer Vision and Image Understanding Special Issue on ~Feature-Oriented Image and Video Computing for Extracting Contexts and Semantics//,  Vol. 115, No. 3, pp. 323-333. doi:10.1016/j.cviu.2010.10.008, 18 March 2011. [ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_CVIU_2010.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_CVIU_2010.pdf]] ]

''Abstract''
Compared to other anomalous video event detection approaches that analyze object trajectories only, we propose a context-aware method to detect anomalies. By tracking all moving objects in the video, three different levels of spatiotemporal contexts are considered, i.e., point anomaly of a video object, sequential anomaly of an object trajectory, and co-occurrence anomaly of multiple video objects. A hierarchical data mining approach is proposed. At each level, frequency based analysis is performed to automatically discover regular rules of normal events. Events deviating from these rules are identified as anomalies. The proposed method is computationally efficient and can infer complex rules. Experiments on real traffic video validate that the detected video anomalies are hazardous or illegal according to traffic regulations.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/8341325]]
I. Koktzoglou, S.A. Tsaftaris, S. Zuelhlsdorff, D. Li, A.K. Katsaggelos, and R. Dharmakumar, "Automated Tracking of a Passive Intramyocardial Needle with ~Off-Resonance MRI A feasibility Study," presented at //Society of Cardiovascular Magnetic Resonance//, January 2008.
I. Koktzoglou, S.A. Tsaftaris, S. Zuelhlsdorff, D. Li, A.K. Katsaggelos, and R. Dharmakumar, "Automated Tracking of a Passive Endomyocardial Stiletto Catheter with Dephased FLAPS MRI: A feasibility Study," to appear // The 16th Meeting of the International Society for Magnetic Resonance in Medicine//, Toronto, Canada, May 2008.
[<img[IEEE Signal Processing COVER|http://ieeexplore.ieee.org/ielx5/79/5753066/5753066.jpg]] S.A. Tsaftaris, K. Lister, I. Fiedler, F. Casadio, and A.K. Katsaggelos, "Colorizing a Masterpiece," //IEEE Signal Processing Magazine//, vol. 28, no. 3, pp. 113-119, May 2011. @@Highlighted on the cover@@
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_IEEE_SPM_May_11.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_IEEE_SPM_May_11.pdf]] ]

''Abstract''
The purpose of this article is to discuss the process of colorizing a historical artifact—a black and white archival photo of Bathers by a River, 1909–1917, by Henri Matisse (Art Institute of Chicago 1953.158), taken in November 1913, when the artist was still working on the painting and showing it in a significantly different state compared to the one seen today. 

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/9563460]]
S. A. Tsaftaris, V. Andermatt, A. Schlegel, A. K. Katsaggelos, D. Li, and R. Dharmakumar, "A Dynamic Programming Solution to Tracking and Elastically Matching Left Ventricular Walls in Cardiac CINE MRI," in //Proceedings of International Conference on Image Processing (ICIP)//, 2008.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2008_MRI.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2008_MRI.pdf]] ]

''Abstract''
In this paper an algorithm to detect and elastically match the contours of the epicardial walls of the left ventricle (LV) in cardiac phase-resolved 2-D Magnetic Resonance (MR) images is presented. For both tasks, dynamic programming (DP) is used. A mask conforming to the six segment model of the LV is fitted on a reference image and propagated utilizing the elastic matching information. At its present form the algorithm requires minimal parameter corrections among different sets of cine MRI images. Future extensions include comparisons with contours hand labeled by imaging experts.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/3883789]]
E. Soyak, S.A. Tsaftaris, and A.K. Katsaggelos, "~Low-Complexity ~Tracking-Aware H.264 Video Compression for Transportation Surveillance," //IEEE Transactions on Circuits and Systems for Video Technology, Special Issue on Video Analysis on ~Resource-Limited Systems//, vol. 21, no. 10, pp. 1378-1389, Oct 2010. [ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Soyak_2011_TCSVT.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Soyak_2011_TCSVT.pdf]] ]

''Abstract''
In centralized transportation surveillance systems, video is captured and compressed at low processing power remote nodes and transmitted to a central location for processing. Such compression can reduce the accuracy of centrally run automated object tracking algorithms. In typical systems, the majority of communications bandwidth is spent on encoding temporal pixel variations such as acquisition noise or local changes to lighting. We propose a tracking-aware, H.264-compliant compression algorithm that removes temporal components of low tracking interest and optimizes the quantization of frequency coefficients, particularly those that most influence trackers, significantly reducing bitrate while maintaining comparable tracking accuracy. We utilize tracking accuracy as our compression criterion in lieu of mean squared error metrics. Our proposed system is designed with low processing power and memory requirements in mind, and as such can be deployed on remote nodes. Using H.264/AVC video coding and a commonly used state-of-the-art tracker we show that our algorithm allows for over 90% bitrate savings while maintaining comparable tracking accuracy.  

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/9891352]]
S.A. Tsaftaris, X. Zhou, R. Tang, D. Li, and R. Dharmakumar, ``Ischemic Extent as a Biomarker for Characterizing Severity of Coronary Artery Stenosis with Blood Oxygen-Sensitive Cardiac MRI," //Journal of Magnetic Resonance Imaging//, in press. [[Full Text|http://onlinelibrary.wiley.com/doi/10.1002/jmri.23577/abstract]]

''Abstract''
Purpose: To investigate whether a statistical analysis of myocardial blood-oxygen-level-dependent (mBOLD) signal intensities can lead to the identification and quantification of the ischemic area supplied by the culprit artery.
Materials and Methods: Cardiac BOLD images were acquired in a canine model (n = 9) with controllable LCX stenosis at rest and during adenosine infusion on a 1.5T clinical scanner. Statistical distributions of myocardial pixel-intensities derived from BOLD images were used to compute an area metric (ischemic extent, IE). True myocardial perfusion was estimated from microsphere analysis. IE was compared against a standard metric (segment-intensity-response, SIR). Additional animals (n = 3) were used to investigate the feasibility of the approach for identifying ischemic territories due to LAD stenosis from mBOLD images.
Results: Regression analyses showed that IE and myocardial flow ratio between rest and adenosine infusion (MFR) were exponentially related (R2 > 0.70, P < 0.001, for end-systole and end-diastole), while SIR and MFR were linearly related to end-systole (R2 = 0.51, P < 0.04) and unrelated to end-diastole (R2 ≈ 0, P = 0.91). Receiver-operating-characteristic analysis that IE was superior to SIR for detecting critical stenosis (MFR ≤2) in end-systole and end-diastole. Feasibility studies on LAD narrowing demonstrated that the proposed approach could also identify oxygenation changes in the LAD territories.
Conclusion: The proposed evaluation of cardiac BOLD magnetic resonance imaging (MRI) offers marked improvement in sensitivity and specificity for detecting critical coronary stenosis at 1.5T compared to the mean segmental intensity approach. Patient studies are now warranted to determine its clinical utility. 

[[BibTeX and EndNote entry via CiteULike|http://www.citeulike.org/user/stsaft/article/10348819]]
E. Maani, S. A. Tsaftaris, and A. K. Katsaggelos, "Local Feature Extraction for Video Copy Detection in a Database," in //Proceedings of International Conference on Image Processing (ICIP)//, 2008.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2008_EHSAN.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2008_EHSAN.pdf]] ]

''Abstract''
In this paper a new content-based copy identification method for video sequences is presented that is robust to a number of image transformations and particulary robust to compression artifacts. A scale and rotation invariant local image descriptor for corner points in detected key frames is proposed based on a generalized radon transform. In addition, a distance similarity metric is used that fuses intensity and geometry information to compare key frames extracted using a scene detection algorithm. Furthermore, to achieve low querying computational complexity a DP approach is employed. Experimental results demonstrate the effectiveness of the proposed approach.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/3883351]]
S. A. Tsaftaris,  J. Zujovic, and A. K. Katsaggelos, "Automated Line Flattening of Atomic Force Microscopy Images," in //Proceedings of International Conference on Image Processing (ICIP)//, 2008.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2008_AFM.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2008_AFM.pdf]] ]

''Abstract''
In this paper, an automated algorithm to flatten lines from Atomic Force Microscopy (AFM) images is presented. Due to the mechanics of the AFM, there is a curvature distortion (bowing effect) present in the acquired images. At present, flattening such images requires human intervention to manually segment object data from the background, which is time consuming and highly inaccurate. The proposed method classifies the data into objects and background, and fits convex lines in an iterative fashion. Results on real images from DNA wrapped carbon nanotubes (~DNA-CNTs) and synthetic experiments are presented, demonstrating the effectiveness of the proposed algorithm in increasing the resolution of the surface to-pography.     

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/4057459]]
S. A. Tsaftaris,  J. Zujovic, and A. K. Katsaggelos, "Restoration of the Cantilever Bowing Distortion in Atomic Force Microscopy," in //Proceedings of 16th  European Signal Processing Conference//, Lausanne, Switzerland, August 2008.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_EUSIPCO_2008_AFM.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_EUSIPCO_2008_AFM.pdf]] ]

''Abstract''
Due to the mechanics of the Atomic Force Microscope (AFM), there is a curvature distortion (bowing effect) present in the acquired images. At present, flattening such images requires human intervention to manually segment object data from the background, which is time consuming and highly inaccurate. In this paper, an automated algorithm to flatten lines from AFM images is presented. The proposed method classifies the data into objects and background, and fits convex lines in an iterative fashion. Results on real images from DNA wrapped carbon nanotubes (~DNA-CNTs) and synthetic experiments are presented, demonstrating the effectiveness of the proposed algorithm in increasing the resolution of the surface topography.  In addition a link between the flattening problem and MRI inhomogeneity (shading) is given and the proposed method is compared to an entropy based MRI inhomogeniety correction method.   

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/4057459]]
X. Zhou, R. Tang, R. Klein, S.A. Tsaftaris, D. Li, R. Dharmakumar, "Impact of Temporal Resolution on Cardiac ~Phase-Resolved ~Oxygen-Sensitive Myocardial ~Steady-State Free Precession Imaging," //Society for Cardiovascular Magnetic Resonance//, Florida, 2009.

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/11/S1/P178]]
S.A. Tsaftaris, R. Tang, R. Klein, D. Li, R. Dharmakumar, "Visualizing Regional Myocardial Oxygenation Changes with Statistically Optimal Colormaps," //Society for Cardiovascular Magnetic Resonance//, Florida, 2009.

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/11/S1/P276]]
S.A. Tsaftaris, X. Zhou, R. Tang, R. Klein, R. Dharmakumar, "An Automated Method for Left Ventricular Localization and Identification of ~End-Systolic and ~End-Diastolic Images from Cine Cardiac MRI," //Society for Cardiovascular Magnetic Resonance//, Florida, 2009.

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/11/S1/P222]]
S.A. Tsaftaris, R. Tang, R. Klein, D. Li, R. Dharmakumar, "Visualizing and Quantifying Myocardial Oxygenation Changes with Statistically Optimal Colormaps," to be presented at //The 17th Meeting of the International Society for Magnetic Resonance in Medicine//, Hawaii, 2009.
S.A. Tsaftaris, X. Zhou, R. Tang, R. Klein, R. Dharmakumar, "An Intensity Based Statistical Approach for Left Ventricular Localization and Identification of ~End-Systolic and ~End-Diastolic Images from Cine Cardiac MRI," to appear at //The 17th Meeting of the International Society for Magnetic Resonance in Medicine//, Hawaii, 2009.
R. Dharmakumar, I. Koktoglou, S.A. Tsaftaris, S. Zuehlsdorff, R. Tang, W. Graham, D. Li, "Visualization and Tracking of a Conventional Guidewire with Low Flip Angle SSFP Imaging: An Initial Study," The //17th Meeting of the International Society for Magnetic Resonance in Medicine//, Hawaii, 2009.
S.A. Tsaftaris and C. Noutsos, "Plant Phenotyping with Low Cost Digital Cameras and Image Analytics," in //Proceedings of the 4th International Symposium on Information Technologies in Environmental Engineering//, May 2009, Thessaloniki, Greece. [ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_phenotyping_final.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_phenotyping_final.pdf]] ]

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/5880470]]
E. Soyak, S.A. Tsaftaris, and A.K. Katsaggelos,  "~Content-Aware H.264 Encoding for Traffic Video Tracking Applications,"  //International Conference on Acoustics, Speech, and Signal Processing (ICASSP), Dallas, TX//, March 2010, pp. 730 – 733.
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICASSP_2010_EREN.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICASSP_2010_EREN.pdf]] ]

''Abstract''
The compression of video can reduce the accuracy of tracking algorithms, which is problematic for centralized applications that rely on remotely captured and compressed video for input. We show the effects of high compression on the features commonly used in real-time video object tracking. We propose a computationally efficient Region of Interest (ROI) extraction method, which is used during standard-compliant H.264 encoding to concentrate bitrate on regions in video most likely to contain objects of tracking interest (vehicles). This algorithm is shown to significantly increase tracking accuracy, which is measured by employing a commonly used automatic tracker.

[[BibTeX or EndNote Entry via CiteULike|http://www.citeulike.org/user/stsaft/article/7916935]]
X. Zhou, S. Tsaftaris, Y. Liu, R. Tang, R. Klein, S. Zuehlsdorff, D. Li, and R. Dharmakumar, "Artifacts-reduced 2d cine ssfp with flow compensation for myocardial bold imaging," //Journal of Cardiovascular Magnetic Resonance//, vol. 12, no. Suppl 1, pp. P68+, 2010.

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/12/S1/P68]]
S. Tsaftaris, X. Zhou, R. Tang, D. Li, and R. Dharmakumar, "Automated detection and quantification of microcirculatory oxygenation changes in the heart," //Journal of Cardiovascular Magnetic Resonance//, vol. 12, no. Suppl 1, pp. P216+, 2010.

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/11/S1/P216]]
X. Zhou, V. Rundell, Y. Liu, R. Tang, R. Klein, S. Giri, S. Shah, S. Tsaftaris, S. Zuehlsdorff, O. Simonetti, D. Li, and R. Dharmakumar, "On the mechanism of myocardial edema contrast in t2-stir images," //Journal of Cardiovascular Magnetic Resonance//, vol. 12, no. Suppl 1, pp. O19+, 2010. 

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/12/S1/O19]]
X. Zhou, V. Rundell, Y. Liu, R. Tang, R. Klein, S. Giri, S. Shah, S.A. Tsaftaris, S. Zuehlsdorff, O. Simonetti, D. Li, and R. Dharmakumar, "On the origin of myocardial edema contrast in ~T2-STIR images," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine//, Stockholm, Sweden, 2010.
X. Zhou, S.A. Tsaftaris, Y. Liu, R. Tang, R. Klein, S. Zuehlsdorff, D. Li, and R. Dharmakumar, "Myocardial BOLD imaging using flow compensated 2D cine bSSFP," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
S.A. Tsaftaris, X. Zhou, R. Tang, and R. Dharmakumar, "Unsupervised and Reproducible Image-based Identification of Cardiac Phases in Cine SSFP MRI," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
S.A. Tsaftaris, X. Zhou, R. Tang, R. Klein, A. Katsaggelos, and R. Dharmakumar, "Automated synchronization of cardiac phases for myocardial BOLD MRI," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
S.A. Tsaftaris, E. Offerman, R.R. Edelman, and I. Koktzoglou, "Unsupervised reconstruction for ungated ghost angiography by clustering of image features," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
S.A. Tsaftaris, X. Zhou, and R. Dharmakumar, "Automated Assessment of Ghost Artifacts in MRI," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
S.A. Tsaftaris, X. Zhou, D. Li, and R. Dharmakumar, "A New Quantitative Imaging Biomarker for Identifying Critical Coronary Artery Stenosis with Myocardial BOLD MRI," // The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
R. Dharmakumar, Z. Zhang, I. Koktzoglou, S.A. Tsaftaris, D. Li, "Dual Contrast Cellular MRI," //The 18th Meeting of the International Society for Magnetic Resonance in Medicine, Stockholm, Sweden, 2010.//
E. Soyak, S.A. Tsaftaris, and A.K. Katsaggelos,  "Quantization Optimized H.264 Encoding for Traffic Video Tracking Applications," //International Conference on Image Processing (ICIP), Hong Kong 2010// 
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2010_EREN.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2010_EREN.pdf]] ]

''Abstract''
The compression of video can reduce the accuracy of post-compression tracking algorithms. This is problematic for centralized applications such as traffic surveillance systems, where remotely captured and compressed video is transmitted to a central location for tracking. We propose a low complexity optimization framework that automatically identifies video features critical to tracking and concentrates bitrate on these features via quantization tables. Using the H.264 video coding standard and two commonly used state-of-the-art trackers we show that our algorithm allows for over 60% bitrate savings while maintaining comparable tracking accuracy.
F. Jiang, J. Yuan, S.A. Tsaftaris, A.K. Katsaggelos, "Video Anomaly Detection in Spatiotemporal Context," //International Conference on Image Processing (ICIP), Hong Kong 2010// 
[ [[PDF|http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2010_FRANCIS.pdf]] ] [ [[Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/papers/Tsaftaris_ICIP_2010_FRANCIS.pdf]] ]

''Abstract''
Compared to other approaches that analyze object trajectories, we propose to detect anomalous video events at three levels considering spatiotemporal context of video objects, i.e., point anomaly, sequential anomaly, and co-occurrence anomaly. A hierarchical data mining approach is proposed to achieve this task. At each level, the frequency based analysis is performed to automatically discover regular rules of normal events. The events deviating from these rules are detected as anomalies. Experiments on real traffic video prove that the detected video anomalies are hazardous or illegal according to the traffic rule.
E. Soyak, S.A. Tsaftaris, and A. K. Katsaggelos, "~Tracking-Optimal Pre- and Post-processing for H.264 Compression in Traffic Video Surveillance Applications," to be presented //IEEE International Conference on Electronics Circuits and Systems (ICECS 2010), Athens, Greece, December 12-15, 2010//. 
S.A. Tsaftaris, X. Zhou, and R. Dharmakumar, “A Fully Automated Statistical Method for Characterization of Flow Artifact Presence in cardiac MRI,” //Society for Cardiovascular Magnetic Resonance//, 2011, vol. 13 (Suppl 1) : P45, Feb. 2011. 

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/13/S1/P45]]
S.A. Tsaftaris, X. Zhou, D. Li, and R. Dharmakumar,  “An Area-based  Imaging Biomarker for Characterizing Coronary Artery Stenosis with Myocardial BOLD MRI,” //Society for Cardiovascular Magnetic Resonance//, 2011, vol. 13 (Suppl 1) : O22, Feb. 2011. @@Early Career Award Finalist@@

[[Full Paper and Citation via JCMR-Online|http://jcmr-online.com/content/13/S1/O2]]
S.A. Tsaftaris, R. Tang, X. Zhou, D. Li, and R. Dharmakumar,  “An Area-based  Imaging Biomarker for the Characterization of Coronary Artery Stenosis with Blood ~Oxygen-Sensitive MRI,”  //The 19th Meeting of the International Society for Magnetic Resonance in Medicine//, Montreal, Canada, 2011.
S.A. Tsaftaris, V. Rundell, X. Zhou, Y. Liu, R. Tang, D. Li, and R. Dharmakumar,  “Detecting Myocardial Ischemia at Rest with Cardiac ~Phase-Resolved BOLD MRI: Early Findings,”  //The 19th Meeting of the International Society for Magnetic Resonance in Medicine//, Montreal, Canada, 2011.
E. Soyak, S.A. Tsaftaris, and A. K. Katsaggelos, "Channel Protection for H.264 Compression in Transportation Video Surveillance Applications," to appear //IEEE International Conference on Image Processing (ICIP 2011)//, Brussels, Belgium, Sept. 11-14, 2011.
E. Soyak, S.A. Tsaftaris, and A. K. Katsaggelos, "~Tracking-Optimized Quantization for H.264 Compression in Transportation Video Surveillance Applications," to appear //IEEE International Conference on Image Processing (ICIP 2011)//, Brussels, Belgium, Sept. 11-14, 2011.
S.A. Tsaftaris, “PHIDIAS: Plant Phenotyping with a High-throughput, Intelligent, Distributed, and Integrated Analysis System,” 2nd International Plant Phenotyping Symposium, Juelich, Germany, Sept. 5 -7, 2011.
S.A. Tsaftaris, X. Zhou, R. Tang, D. Li, and R. Dharmakumar, “Detecting Myocardial Ischemic Territories in the Setting of Acute Coronary Obstructions at Rest with Cardiac Phase- Resolved Blood Oxygen Level Dependent (CP-BOLD) MRI,” American Heart Association Scientific Sessions 2011, Orlando, Florida, Nov. 13 – 15, 2011. [[Full Text|http://circ.ahajournals.org/cgi/content/meeting_abstract/124/21_MeetingAbstracts/A9203?sid=0a355dd0-10ff-4dba-9477-f626f475a927]]
S.A. Tsaftaris, X. Zhou, R. Tang, J. Min, D. Li, and R. Dharmakumar, “Detecting ACS and Identifying Acute Ischemic Territories with Cardiac Phase-Resolved BOLD MRI at Rest,” to appear The 20th Meeting of the ISMRM, Melbourne, Australia, May 5 – 11, 2012. ''Magna Cum Laude Award''
This site runs on a completely self-contained personal wiki called a [[TiddlyWiki|http://www.tiddlywiki.com]] sometimes shorthanded as TW, invented by a fellow named Jeremy Ruston. I use TW version <<version>>.

It is really easy to edit and makes updating a breeze.  All the text, except PDF's, and pictures is included in one HTML file.

It works great with Firefox, good with Internet Explorer but ok with Opera. Please let me know ([[Contact]]) if you have any problems browsing my pages.

!Navigating this site
Navigating this site is a bit tricky and un-conventional.  Each page is not static.  It is created dynamically according to what you have clicked on.  Everything you click on opens in front of you while 'older' stuff are below in the page.  If you open something that its not to your interest you can close it.

You can use the left navigation bar to open major areas.  You can also use the search to find things that you like.  Phrases underlined are external links while phrases in bold blue font are internal links.

!If you came thru Google Search
If you came thru google search due to the uniqueness of ~TiddlyWiki the web result you saw on google may not appear on this website.  To find it just remember the query items and put on the search line to the upper right of this page. You should be able to find the item you were looking for.

!My Links/Tips on ~TiddlyWiki
Here you can find information on @@How To@@ start a website based on ~TiddlyWiki.  Basically its a collection for all the things I had to do to make this site work, with favicon, nice search, automatic lists, etc
<<listTags tips>>

!Tools and Fun
[[Fun Stuff]]
[[Tools of Trade]]
<<tiddler ToggleRightSidebar>>
* ([[My CV|http://users.eecs.northwestern.edu/~stsaft/media/tsaftaris_CV.pdf]] | PDF)
[[Curriculum Vitae]] 
[[NIH Style Biosketch]]
[[Short Biography]]
The titles of my book chapters articles are the following. Click on each to retrieve full reference and abstract.
<<listTags BookChapter>>
[<img(60%,auto)[Collaboration Network|co_authors_network.png]] A polar network of my co-authors and collaborators (as of October 2010). 
''Nodes'' are last-names of co-authors. 
''Node color'' indicates area of work.
''Edge labels'' are total number of publications with each co-author. ''Edge thickness'' is proportional to the number of papers. The closer to the center (myself) the more papers I have with this co-author.

@@Table@@ below has the list of co-authors and collaborators.

The network was generated by [[NodeXL|http://nodexl.codeplex.com/]], a network/graph plugin for excel. I tried [[protovis|http://vis.stanford.edu/protovis/]] and [[graphviz|http://www.graphviz.org/]] but the learning curve was too demanding. Analysis is inspired by [[McCormick Co-authorship/Collaboration Network|http://collaboration.mccormick.northwestern.edu/]] made by [[Datascope Analytics|http://datascopeanalytics.com/]].

<br>
<br>
|''List of co-authors and collaborators: name links to website.''|c
|!Name|!Position|!Affiliation|!Area|!Number of <br>Papers|!Country|h
|[[Aggelos Katsaggelos|http://ivpl.eecs.northwestern.edu/people/akatsaggelos/]] |Professor|Northwestern|EECS|26|USA|
|[[Rohan Dharmakumar|http://www.cardiacmri.northwestern.edu/people/rohan-dharmakumar-phd/]] |Professor|Northwestern|Radiology|23|USA|
|[[Debiao Li|http://www.cedars-sinai.edu/Research-and-Education/QL-Info/Faculty-Directory.aspx]] |Professor|~Cedars-Sinai Medical Center|Radiology|17|USA|
|[[Xiangzhi Zhou|http://www.linkedin.com/in/xiangzhizhou]] |Engineer|n/a|Radiology|14|USA|
|[[Ioannis Koktzoglou|http://www.northshore.org/content.aspx?id=5425]] |Professor|~NorthShore University Health System|Radiology|7|USA|
|[[Sven Zuehlsdorff|http://www.xing.com/profile/Sven_Zuehlsdorff]] |Manager|Siemens|Industry|7|USA|
|[[Nikos Boulgouris|http://www.brunel.ac.uk/about/acad/sed/sedstaff/ece/nikolaosboulgouris]] |Professor|Brunel|EECS|6|UK|
|[[Dimitris Simitopoulos|]] |Engineer|OTE|EECS|6|Greece|
|[[Michael Strintzis|http://www.ee.auth.gr/greek/tmhma/proswpiko/proswpiko-tomea-hlektronikhs-kai-upologistwn.html]] |Professor|AUTH|EECS|6|Greece|
|[[Saurabh Shah|http://www.linkedin.com/pub/saurabh-shah/11/19b/591]] |Engineer|Siemens|Industry|3|USA|
|[[Thrasos Pappas|http://users.eecs.northwestern.edu/~pappas/]] |Professor|Northwestern|EECS|3|USA|
|[[Vassili Hatzimanikatis|http://isic2.epfl.ch/page63322.html]] |Professor|EPFL |Chemical Engineering|3|USA|
|[[Terry Papoutsakis|http://www.papoutsakis.org/]] |Professor|Univ. of Delaware |Chemical Engineering|3|USA|
|[[Eren Soyak*|http://www.linkedin.com/pub/eren-soyak/a/324/3a1]] |Ph.D. Student|Northwestern|EECS|3|USA|
|[[Robert Edelman|http://www.northshore.org/research/investigators/advanced-imaging/edelman-robert-r-md.aspx]] |Professor|~NorthShore University Health System|Radiology|2|USA|
|[[Jana Zujovic*|http://users.eecs.northwestern.edu/~jzu850/index.html]] |Ph.D. Student|Northwestern|EECS|2|USA|
|[[Zhuoli Zhang|]] |Professor|Northwestern|Radiology|2|USA|
|[[Christos Noutsos|http://ware.cshl.edu/people.html]] |Researcher|Cold Spring Harbor Lab |Genetics|1|USA|
|[[Haohong Wang|http://users.eecs.northwestern.edu/~haohong/]] |Engineer|~TCL-Thomson Electronics |Industry|1|USA|
|[[Ramandeed Ahuja*|http://www.linkedin.com/in/ramandeepahuja]] |Engineer|Rho Trading Securities, LLC|Industry|1|USA|
|[[Derek Shiell*|http://www.linkedin.com/pub/derek-shiell/21/a12/25a]] |Engineer|Epson|Industry|1|USA|
|[[Ehsan Maani|http://www.linkedin.com/pub/ehsan-maani/14/36/b9a]] |Engineer|Sony Electronics |Industry|1|USA|
|[[Fan Jiang*|http://users.eecs.northwestern.edu/~fji295/index.html]] |Ph.D. Student|Northwestern|EECS|1|USA|
|[[George Triantafyllidis |http://users.teicrete.gr/gt/]] |Researcher|~TEI - Crete|EECS|1|Greece|
|[[Orlando Simonetti|http://www.cardioimaging.osu.edu/5931.cfm]] |Professor|Ohio State|Radiology|1|USA|
|[[Junsong Yuan|http://www3.ntu.edu.sg/home/jsyuan/]] |Professor|Nanyang Technological University|EECS|1|Singapore|
|[[Valentin Andermatt*|]] |Engineer|n/a |Industry|1|Switzerland|
|[[Andreas Schlegel|*]] |Engineer|n/a |Industry|1|Switzerland|
|[[Alexia Briasouli|http://mklab.iti.gr/mklab_people/~abria/]] |Researcher|~ITI-CERTH |EECS|1|Greece|
|[[Graham Wright|http://sunnybrook.ca/team/member.asp?t=13&m=184&page=172]] |Professor|Univ. of Toronto|Radiology|1|Canada|
|*Ex or current advisee|>|>|>|>|>|f
Codeword Design is the problem of encoding a mathematical problem into DNA sequences such that it can be solved using techniques from DNA Computing.  My work deals with Noise Tolerant Codewords where a new constraint the Noise Tolerance Constraint (NTC) is enforced.  The NTC is necessary such that similarity matches can be achieved.
Rename this tiddler to 'ColorPalette' to enable this color scheme

Background: #ffc
Foreground: #000
PrimaryPale: #fc8
PrimaryLight: #f81
PrimaryMid: #b40
PrimaryDark: #410
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #e88
TertiaryLight: #c66
TertiaryMid: #944
TertiaryDark: #633
The titles of my journal articles are the following. Click on each to retrieve full reference and abstract and an electronic copy.
<<listTags Conference>>
* I have been consulting for a number of universities, non-profits, and corporations since 2000. 
* I have been involved with the design of automated systems and image processing pipelines as well as litigation as an expert witness for patent infringement cases.  
* I am an expert witness with the [[Round Table Group|http://www.roundtablegroup.com/]]. 

If you wish to hear more about my experience and are interested in consulting services please [[Contact]] me.
[[Contact Form]]: contact me directly through the browser 
''Email me:'' <<email sotirios.tsaftaris at imtlucca dot it>>

@@Phone and address are provided upon email communication for security and privacy reasons.@@
<HTML><iframe src="https://spreadsheets.google.com/embeddedform?formkey=dExKVFZUbC1oV3lOX2g5eFVVUUh5RlE6MA" width="760" height="985" frameborder="0" marginheight="0" marginwidth="0">Loading...</iframe> </HTML>
This website presents published material to ensure timely dissemination of scholarly and technical work. Copyright and all rights therein are retained by authors or by other copyright holders. All persons copying this information are expected to adhere to the terms and constraints invoked by each author's copyright. In most cases, these works may not be reposted without the explicit permission of the copyright holder.
* Many of the works presented herein are under copyright by the IEEE and adhere to the following policy: <br>"©2007 IEEE. Personal use of this material is permitted. However, permission to reprint/republish this material for advertising or promotional purposes or for creating new collective works for resale or redistribution to servers or lists, or to reuse any copyrighted component of this work in other works must be obtained from the IEEE."
* Some papers are copyright of the Society of ~Photo-Optical Instrumentation Engineers. These papers were published in various SPIE proceedings, and are made available as an electronic reprint with permission of SPIE. One print or electronic copy may be made for personal use only. Systematic or multiple reproduction, distribution to multiple locations via electronic or other means, duplication of any material in this paper for a fee or for commercial purposes, or modification of the content of the paper are prohibited.
* Many of the works presented herein are under copyright by the ~Springer-Verlag and adhere to the following policy: <br> Copyright © by ~Springer-Verlag The Author may publish his/her contribution on his/her personal Web page provided that he/she creates a link to the above mentioned volume of LNCS at the ~Springer-Verlag server or to the LNCS series Homepage (URL: http://www.springer.de/comp/lncs/index.html) and that together with this electronic version it is clearly pointed out, by prominently adding "© ~Springer-Verlag", that the copyright for this contribution is held by Springer.
* Some of the works presented herein are under copyright by Elsevier and adhere to the following policy: <br> http://www1.elsevier.com/homepage/authors/?main=/homepage/about/ita/copyright.shtml#rights
* Some of the works presented herein are under copyright by ~Wiley-Blackwell and adhere to the following policy: <br> http://www.wiley.com/bw/static/selfarchive.asp
Work on Copyright Protection
[[CV in PDF|http://users.eecs.northwestern.edu/~stsaft/media/tsaftaris_CV.pdf]]   
[[CV in Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/media/tsaftaris_CV.pdf]] 
[img[Three EigenSpots|http://users.eecs.northwestern.edu/~stsaft/media/eigen.png]]
DNA microarray images are comprised of thousands of near circular spots arranged in a regular grid structure. The spot intensity is related to the concentration of a gene in a genomic sample. A new method to estimate the spot intensity without resorting to heuristic methods was found. The method relies on the principal component analysis of the image information of spots and the projection of data to the eigenvectors of spots, termed ''~EigenSpots'' (see picture to the left). Using this method, global and local noise can be removed more efficiently.

Relevant Publications:
<<forEachTiddler
 where
        'tiddler.tags.contains("Microarray Imaging") && tiddler.tags.contains("paper")'
write
        '((index == 0) ? "" : ", ")+"[["+tiddler.title+"]]"'
>> 
I am investigating alternative media for storing digital signals.  Currenlty I am interested in DNA.

Before the digital revolution, image and signal processing was performed using analog circuitry.  Today digital signal processing (DSP) has defined our lives.  Although some mixed-signal designs are of current interest, DSP dominates everything that we own or use everyday. DSP chips exist in many devices such as our cell phones, our iPODs, our wireless router, our new HDTV.

The purpose of my research is to consider possibilities of doing DSP outside the semiconductor or electronic domain.  Organic elements (such as DNA, polymers) that conduct electricity can be used to built organic semiconductors at the molecular level, However, more fundamental questions can be asked. Can DSP be performed in exotic materials, such as chemical substrates, cells, organisms, or even DNA, without the use of electrical currents? Will we be able to built fully blown DSP systems out of these materials? Or will some DSP functions (such as storage and data archiving) be implemented with such materials?

[img[DNA DSP|http://users.eecs.northwestern.edu/~stsaft/media/DNAdisp.png]]
These are questions that are worth answering. Our group at Northwestern has been studying the use of DNA for DSP for a number of years.  Due to its unique characteristics, DNA is an excellent medium for storing information, resulting in the creation of a ~DNA-based database of digital signals. Digital samples can be recorded in DNA strands using, instead of their binary representation, the quaternary DNA alphabet.  After they are synthesized, DNA sequences can be either kept in liquid form placed in test tubes, freeze-dried to save volume, or even piggybacked among the genome of organisms (i.e., bacteria).  Once they are stored, DNA sequences can be replicated economically with commonly used laboratory techniques.  This allows for the creation of database replicas with low cost.  The most attractive aspect of this approach is that querying the database can be implemented with a plethora of techniques. With digital databases the query time increases proportionally to the size of the database. However, in DNA databases with appropriate search mechanisms, the querying time is independent of the database size, under certain conditions.

For more information you can look my papers [[06. The Not So Digital Future of Digital Signal Processing]] and [[03. How can DNA-Computing be applied in Digital Signal Processing?]].  If you want an introduction on DNA Computing from a signal processing viewpoint see the similarly titled paper [[02. DNA computing from a signal processing viewpoint]].
I am interesting in alternative methods for storing digital signals.  I am currently investigating DNA as such medium.

See related publications.
<<listTags Simulation>>
[<img[Idea Chart|http://users.eecs.northwestern.edu/~stsaft/media/DNAstorage.png]]DNA offers significant advantages when compared to other media for storing digital signals or data.  DNA, especially in its double stranded form, is very stable, compact, and inexpensive.  DNA hybridization is an ideal retrieval mechanism that can even utilize a similarity criterion.  Furthermore, due to the unique properties of the hybridization reaction, the retrieval complexity, as expressed by the search time, does not depend on the size of the database (number of stored records).  In addition, DNA hybridization allows for parallel retrieval.

The first step towards developing a ~DNA-based storage and similarity-based retrieval system is the word design problem (that is the encoding of digital signals into DNA).  This problem is rather well suited to signal processing research because it is closely related to source and channel coding.  I have focused most of my work on finding efficient algorithms that can satisfy certain thermodynamic and kinetic-based constraints.  For more information see [[Codeword Design]].

A critical element of any word design problem is the ability to simulate the behavior of DNA molecular systems.  I have developed models that estimate the thermodynamic and kinetic behavior (see [[Simulations]] of DNA molecules. Therefore, words can be designed more efficiently and the efficiency and performance of a DNA database can be estimated.  This type of work can be readily applied to many biotechnological protocols that rely on DNA to DNA interactions (see [[Molecular Computing for Biotechnology]]).

See <<forEachTiddler
 where
        'tiddler.tags.contains("DNABasedStorageofSignals")'
write
        '((index == 0) ? "" : ", ")+"[["+tiddler.title+"]]"'
>> for more information.

I base my research on [[simulations|Simulations]] but I am interested in experimental verification as well.  If you are interested in this research and you would like to fund our efforts please [[Contact]] me.
[[Welcome]]
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};

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

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

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

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

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

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

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

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

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

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

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

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

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

}
//}}}
A project funded by the [[Andrew W. Mellon Foundation|http://www.mellon.org/]] to digitally restore a painting of Matisse from the collection of [[The Art Institute of Chicago|http://www.artic.edu/aic/]].  
[img[Bathers by a River|http://www.artic.edu/aic/exhibitions/matisse/images/splash-1.jpg]] 
//Henri Matisse. Bathers by a River. 1909–10, 1913, 1916–17. Oil on canvas, 102 1/2 x 154 3/16" (260 x 392 cm). The Art Institute of Chicago, Charles H. and Mary F. S. Worcester Collection. © 2010 Succession H. Matisse/Artists Rights Society (ARS), New York// 

The painting 'Bathers by a River' is the center piece of a new exhibit organized jointly by [[The Art Institute of Chicago|http://www.artic.edu/aic/]] and [[The Museum of Modern Art|http://www.moma.org/]]. The exhibit first visited Chicago and then went to [[MoMa|http://www.moma.org/visit/calendar/exhibitions/969]].

This work (joint with Prof. Katsaggelos) involved the colorization of a grayscale photograph which portrayed the painting at an earlier state.

You can see a short ''multimedia demo'' about the work at the [[AIC website|http://www.artic.edu/aic/exhibitions/matisse/p0.html]].

Watch a ''video'' with interviews of most of the members of this project:
<html><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13009857&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=5a14c9&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=13009857&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=5a14c9&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object><p><a href="http://vimeo.com/13009857">Art and Science Collide in Revealing Matisse Exhibit</a> from <a href="http://vimeo.com/northwestern">Northwestern News</a> on <a href="http://vimeo.com">Vimeo</a>.</p> </html>
@@''PRESS COVERAGE''@@: Work on [[Digital Restoration of Paintings]] appearing in 
* [[MIT Technology Review|http://www.technologyreview.com/computing/25820/]] 
* [[New York Times|http://www.nytimes.com/2010/07/11/arts/design/11matisse.html]] 
* [[MSNBC's Cosmic Blog|http://cosmiclog.msnbc.msn.com/_news/2010/07/12/4662626-matisse-masterpiece-remade]]
* [[Northwestern's FrontPage|http://www.northwestern.edu/newscenter/stories/2010/07/matisse-conservation-technology.html]]
* [[McCormick News|http://www.mccormick.northwestern.edu/news/articles/article_734.html]]
* [[PhysOrg|http://www.physorg.com/news198167416.html]]
* [[The Daily Northwestern|http://www.dailynorthwestern.com/northwestern-art-institute-of-chicago-use-new-process-to-colorize-a-black-and-white-painting-1.2281744]]
* [[TA NEA (Ελληνική εφημερίδα "ΤΑ ΝΕΑ") Greek Newspaper|http://www.tanea.gr/default.asp?pid=2&ct=2&artid=4587121]]     [[[PDF|http://users.eecs.northwestern.edu/~stsaft/media/epistimi.pdf]]]
* [[McCormick Magazine|http://magazine.mccormick.northwestern.edu/fall2010/matisse.html]]     [[[PDF|http://users.eecs.northwestern.edu/~stsaft/media/mccormick.pdf]]]
* [["Κ" (Ελληνική εφημερίδα "ΚΑΘΗΜΕΡΙΝΗ") Greek Newspaper|http://www.kathimerini.gr/]]     [[[PDF|http://users.eecs.northwestern.edu/~stsaft/media/Kathimerini_K_6_Mar_2011_p58-62.pdf]]]
In TiddlyWiki you can define certain operators to format text, paragraphs etc. Below are some links on how you can do that.
* [[Extended Text Formatting|http://www.tiddlywiki.com/#ExtendedFormatting]]
* [[Date Formatting|http://www.tiddlywiki.com/#DateFormatString]]
* [[Bullets and Numbering|http://www.tiddlywiki.com/#BlockQuotes%20BulletPoints%20NumberedBulletPoints]]
* Commenting text enclose it in {{{/%}}} something {{{%/}}}. [[Source|http://www.tiddlywiki.com/#TiddlerComments]]
// //''Name:'' EmailLink
// //''Version:'' <<getversion email>> (<<getversiondate email "DD MMM YYYY">>)
// //''Author:'' AlanHecht
// //''Type:'' [[Macro|Macros]]

// //''Description:'' email lets you list a "email" address without displaying it as readable text.  This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words "at" and "dot" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email.

// //''Syntax:'' << {{{email SoToS at yourdomain dot com "?optional parameters"}}} >>
// //Example 1: <<email sample at nowhere dot com>> (standard)
// //Example 2: <<email multiple dot sample at somewhere dot nowhere dot com>> (multiple dots)
// //Example 3: <<email sample at nowhere dot com "?subject=Submission&body=Type your message here.">> (with optional parameters)

// //''Directions:'' <<tiddler MacroDirections>>

// //''Notes:'' You can use the optional email parameters to stipulate a subject or message body for the message.  Most (not all) email clients will use this information to construct the email message.

// //''Related Links:'' none

// //''Revision History:''
// // v0.1.0 (20 July 2005): initial release
// // v0.1.1 (22 July 2005): renamed the macro from "mailto" to "email" to further thwart email harvesters.
// // v0.1.2 (15 October 2005): added global replacement of "dots" thanks to a suggestion from Ralph Winter

// //''Code section:''
version.extensions.email = {major: 0, minor: 1, revision: 2, date: new Date("Oct 15, 2005")};
config.macros.email = {}
config.macros.email.handler = function(place,macroName,params)
{
var temp = params.join(" ");
data = temp.split("?");
var recipient = data[0];
recipient = recipient.replace(" at ","@").replace(" dot ",".","g");
recipient = recipient.replace(/\s/g,"");
var optional = data[1] ? "?" + data[1] : "";
var theLink = createExternalLink(place,"ma"+"il"+"to:"+recipient+optional);
theLink.appendChild(document.createTextNode(recipient))
}
Publications on Error Correction with Data Hiding
/***
|Name|ExportTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExportTiddlersPluginInfo|
|Version|2.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|interactively select/export tiddlers to a separate file|
!!!!!Documentation
>see [[ExportTiddlersPluginInfo]]
!!!!!Inline control panel (live):
><<exportTiddlers inline>>
!!!!!Revisions
<<<
2010.02.25 2.9.5 added merge checkbox option and improved 'merge' status message
|please see [[ExportTiddlersPluginInfo]] for additional revision details|
2005.10.09 0.0.0 development started
<<<
!!!!!Code
***/
//{{{
// version
version.extensions.ExportTiddlersPlugin= {major: 2, minor: 9, revision: 5, date: new Date(2010,2,25)};

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

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

config.macros.exportTiddlers = {
	$: function(id) { return document.getElementById(id); }, // abbreviation
	label: 'export tiddlers',
	prompt: 'Copy selected tiddlers to an export document',
	okmsg: '%0 tiddler%1 written to %2',
	failmsg: 'An error occurred while creating %1',
	overwriteprompt: '%0\ncontains %1 tiddler%2 that will be discarded or replaced',
	mergestatus: '%0 tiddler%1 added, %2 tiddler%3 updated, %4 tiddler%5 unchanged',
	statusmsg: '%0 tiddler%1 - %2 selected for export',
	newdefault: 'export.html',
	datetimefmt: '0MM/0DD/YYYY 0hh:0mm:0ss',  // for 'filter date/time' edit fields
	type_TW: "tw", type_PS: "ps", type_TX: "tx", type_CS: "cs", type_NF: "nf", // file type tokens
	type_map: { // maps type param 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"
	},
	handler: function(place,macroName,params) {
		if (params[0]!='inline')
			{ createTiddlyButton(place,this.label,this.prompt,this.togglePanel); return; }
		var panel=this.createPanel(place);
		panel.style.position='static';
		panel.style.display='block';
	},
	createPanel: function(place) {
		var panel=this.$('exportPanel');
		if (panel) { panel.parentNode.removeChild(panel); }
		setStylesheet(store.getTiddlerText('ExportTiddlersPlugin##css',''),'exportTiddlers');
		panel=createTiddlyElement(place,'span','exportPanel',null,null)
		panel.innerHTML=store.getTiddlerText('ExportTiddlersPlugin##html','');
		this.initFilter();
		this.refreshList(0);
		var fn=this.$('exportFilename');
		if (window.location.protocol=='file:' && !fn.value.length) {
			// get new target path/filename
			var newPath=getLocalPath(window.location.href);
			var slashpos=newPath.lastIndexOf('/'); if (slashpos==-1) slashpos=newPath.lastIndexOf('\\'); 
			if (slashpos!=-1) newPath=newPath.substr(0,slashpos+1); // trim filename
			fn.value=newPath+this.newdefault;
		}
		return panel;
	},
	togglePanel: function(e) { var e=e||window.event;
		var cme=config.macros.exportTiddlers; // abbrev
		var parent=resolveTarget(e).parentNode;
		var panel=cme.$('exportPanel');
		if (panel==undefined || panel.parentNode!=parent)
			panel=cme.createPanel(parent);
		var isOpen=panel.style.display=='block';
		if(config.options.chkAnimate)
			anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,'none'));
		else
			panel.style.display=isOpen?'none':'block' ;
		if (panel.style.display!='none') {
			cme.refreshList(0);
			cme.$('exportFilename').focus(); 
			cme.$('exportFilename').select();
		}
		e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);
	},
	process: function(which) { // process panel control interactions
		var theList=this.$('exportList'); if (!theList) return false;
		var count = 0;
		var total = store.getTiddlers('title').length;
		switch (which.id) {
			case 'exportFilter':
				count=this.filterExportList();
				var panel=this.$('exportFilterPanel');
				if (count==-1) { panel.style.display='block'; break; }
				this.$('exportStart').disabled=(count==0);
				this.$('exportDelete').disabled=(count==0);
				this.displayStatus(count,total);
				if (count==0) { alert('No tiddlers were selected'); panel.style.display='block'; }
				break;
			case 'exportStart':
				this.go();
				break;
			case 'exportDelete':
				this.deleteTiddlers();
				break;
			case 'exportHideFilter':
			case 'exportToggleFilter':
				var panel=this.$('exportFilterPanel')
				panel.style.display=(panel.style.display=='block')?'none':'block';
				break;
			case 'exportSelectChanges':
				var lastmod=new Date(document.lastModified);
				for (var t = 0; t < theList.options.length; t++) {
					if (theList.options[t].value=='') continue;
					var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;
					theList.options[t].selected=(tiddler.modified>lastmod);
					count += (tiddler.modified>lastmod)?1:0;
				}
				this.$('exportStart').disabled=(count==0);
				this.$('exportDelete').disabled=(count==0);
				this.displayStatus(count,total);
				if (count==0) alert('There are no unsaved changes');
				break;
			case 'exportSelectAll':
				for (var t = 0; t < theList.options.length; t++) {
					if (theList.options[t].value=='') continue;
					theList.options[t].selected=true;
					count += 1;
				}
				this.$('exportStart').disabled=(count==0);
				this.$('exportDelete').disabled=(count==0);
				this.displayStatus(count,count);
				break;
			case 'exportSelectOpened':
				for (var t=0; t<theList.options.length; t++) theList.options[t].selected=false;
				var tiddlerDisplay=this.$('tiddlerDisplay');
				for (var t=0; t<tiddlerDisplay.childNodes.length;t++) {
					var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);
					for (var i=0; i<theList.options.length; i++) {
						if (theList.options[i].value!=tiddler) continue;
						theList.options[i].selected=true; count++; break;
					}
				}
				this.$('exportStart').disabled=(count==0);
				this.$('exportDelete').disabled=(count==0);
				this.displayStatus(count,total);
				if (count==0) alert('There are no tiddlers currently opened');
				break;
			case 'exportSelectRelated':
				// recursively build list of related tiddlers
				function getRelatedTiddlers(tid,tids) {
					var t=store.getTiddler(tid); if (!t || tids.contains(tid)) return tids;
					tids.push(t.title);
					if (!t.linksUpdated) t.changed();
					for (var i=0; i<t.links.length; i++)
						if (t.links[i]!=tid) tids=getRelatedTiddlers(t.links[i],tids);
					return tids;
				}
				// for all currently selected tiddlers, gather up the related tiddlers (including self) and select them as well
				var tids=[];
				for (var i=0; i<theList.options.length; i++)
					if (theList.options[i].selected) tids=getRelatedTiddlers(theList.options[i].value,tids);
				// select related tiddlers (includes original selected tiddlers)
				for (var i=0; i<theList.options.length; i++)
					theList.options[i].selected=tids.contains(theList.options[i].value);
				this.displayStatus(tids.length,total);
				break;
			case 'exportListSmaller':	// decrease current listbox size
				var min=5;
				theList.size-=(theList.size>min)?1:0;
				break;
			case 'exportListLarger':	// increase current listbox size
				var max=(theList.options.length>25)?theList.options.length:25;
				theList.size+=(theList.size<max)?1:0;
				break;
			case 'exportClose':
				this.$('exportPanel').style.display='none';
				break;
		}
		return false;
	},
	displayStatus: function(count,total) {
		var txt=this.statusmsg.format([total,total!=1?'s':'',!count?'none':count==total?'all':count]);
		clearMessage();	displayMessage(txt);
		return txt;
	},
	refreshList: function(selectedIndex) {
		var theList = this.$('exportList'); if (!theList) return;
		// get the sort order
		var sort;
		if (!selectedIndex)   selectedIndex=0;
		if (selectedIndex==0) sort='modified';
		if (selectedIndex==1) sort='title';
		if (selectedIndex==2) sort='modified';
		if (selectedIndex==3) sort='modifier';
		if (selectedIndex==4) sort='tags';

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

		// disable 'export' and 'delete' buttons if no tiddlers selected
		this.$('exportStart').disabled=(count==0);
		this.$('exportDelete').disabled=(count==0);

		// show selection count
		var tiddlers = store.getTiddlers('title');
		if (theList.options.length) this.displayStatus(count,tiddlers.length);

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

		// clear current list contents
		while (theList.length > 0) { theList.options[0] = null; }
		// add heading and control items to list
		var i=0;
		var indent=String.fromCharCode(160)+String.fromCharCode(160);
		theList.options[i++]=
			new Option(tiddlers.length+' tiddlers in document', '',false,false);
		theList.options[i++]=
			new Option(((sort=='title'   )?'>':indent)+' [by title]', '',false,false);
		theList.options[i++]=
			new Option(((sort=='modified')?'>':indent)+' [by date]', '',false,false);
		theList.options[i++]=
			new Option(((sort=='modifier')?'>':indent)+' [by author]', '',false,false);
		theList.options[i++]=
			new Option(((sort=='tags'    )?'>':indent)+' [by tags]', '',false,false);

		// output the tiddler list
		switch(sort) {
			case 'title':
				for(var t = 0; t < tiddlers.length; t++)
					theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);
				break;
			case 'modifier':
			case 'modified':
				var tiddlers = store.getTiddlers(sort);
				// sort descending for newest date first
				tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });
				var lastSection = '';
				for(var t = 0; t < tiddlers.length; t++) {
					var tiddler = tiddlers[t];
					var theSection = '';
					if (sort=='modified') theSection=tiddler.modified.toLocaleDateString();
					if (sort=='modifier') theSection=tiddler.modifier;
					if (theSection != lastSection) {
						theList.options[i++] = new Option(theSection,'',false,false);
						lastSection = theSection;
					}
					theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);
				}
				break;
			case 'tags':
				var theTitles = {}; // all tiddler titles, hash indexed by tag value
				var theTags = new Array();
				for(var t=0; t<tiddlers.length; t++) {
					var title=tiddlers[t].title;
					var tags=tiddlers[t].tags;
					if (!tags || !tags.length) {
						if (theTitles['untagged']==undefined) { theTags.push('untagged'); theTitles['untagged']=new Array(); }
						theTitles['untagged'].push(title);
					}
					else for(var s=0; s<tags.length; s++) {
						if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }
						theTitles[tags[s]].push(title);
					}
				}
				theTags.sort();
				for(var tagindex=0; tagindex<theTags.length; tagindex++) {
					var theTag=theTags[tagindex];
					theList.options[i++]=new Option(theTag,'',false,false);
					for(var t=0; t<theTitles[theTag].length; t++)
						theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);
				}
				break;
			}
		theList.selectedIndex=selectedIndex; // select current control item
		this.$('exportStart').disabled=true;
		this.$('exportDelete').disabled=true;
		this.displayStatus(0,tiddlers.length);
	},
	askForFilename: function(here) {
		var msg=here.title; // use tooltip as dialog box message
		var path=getLocalPath(document.location.href);
		var slashpos=path.lastIndexOf('/'); if (slashpos==-1) slashpos=path.lastIndexOf('\\'); 
		if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash
		var filetype=this.$('exportFormat').value.toLowerCase();
		var defext='html';
		if (filetype==this.type_TX) defext='txt';
		if (filetype==this.type_CS) defext='csv';
		if (filetype==this.type_NF) defext='xml';
		var file=this.newdefault.replace(/html$/,defext);
		var result='';
		if(window.Components) { // moz
			try {
				netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
				var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
				var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
				picker.init(window, msg, nsIFilePicker.modeSave);
				var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
				thispath.initWithPath(path);
				picker.displayDirectory=thispath;
				picker.defaultExtension=defext;
				picker.defaultString=file;
				picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
				if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
			}
			catch(e) { alert('error during local file access: '+e.toString()) }
		}
		else { // IE
			try { // XPSP2 IE only
				var s = new ActiveXObject('UserAccounts.CommonDialog');
				s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|XML files|*.xml|';
				s.FilterIndex=defext=='txt'?2:'html'?3:'xml'?4:1;
				s.InitialDir=path;
				s.FileName=file;
				if (s.showOpen()) var result=s.FileName;
			}
			catch(e) {  // fallback
				var result=prompt(msg,path+file);
			}
		}
		return result;
	},
	initFilter: function() {
		this.$('exportFilterStart').checked=false; this.$('exportStartDate').value='';
		this.$('exportFilterEnd').checked=false;  this.$('exportEndDate').value='';
		this.$('exportFilterTags').checked=false; this.$('exportTags').value='';
		this.$('exportFilterText').checked=false; this.$('exportText').value='';
		this.showFilterFields();
	},
	showFilterFields: function(which) {
		var show=this.$('exportFilterStart').checked;
		this.$('exportFilterStartBy').style.display=show?'block':'none';
		this.$('exportStartDate').style.display=show?'block':'none';
		var val=this.$('exportFilterStartBy').value;
		this.$('exportStartDate').value
			=this.getFilterDate(val,'exportStartDate').formatString(this.datetimefmt);
		if (which && (which.id=='exportFilterStartBy') && (val=='other'))
			this.$('exportStartDate').focus();

		var show=this.$('exportFilterEnd').checked;
		this.$('exportFilterEndBy').style.display=show?'block':'none';
		this.$('exportEndDate').style.display=show?'block':'none';
		var val=this.$('exportFilterEndBy').value;
		this.$('exportEndDate').value
			=this.getFilterDate(val,'exportEndDate').formatString(this.datetimefmt);
		 if (which && (which.id=='exportFilterEndBy') && (val=='other'))
			this.$('exportEndDate').focus();

		var show=this.$('exportFilterTags').checked;
		this.$('exportTags').style.display=show?'block':'none';

		var show=this.$('exportFilterText').checked;
		this.$('exportText').style.display=show?'block':'none';
	},
	getFilterDate: function(val,id) {
		var result=0;
		switch (val) {
			case 'file':
				result=new Date(document.lastModified);
				break;
			case 'other':
				result=new Date(this.$(id).value);
				break;
			default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31
				var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;
				var oneday=86400000;
				if (id=='exportStartDate')
					result=new Date((Math.floor(now/oneday)-val)*oneday+tz);
				else
					result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);
				break;
		}
		return result;
	},
	filterExportList: function() {
		var theList  = this.$('exportList'); if (!theList) return -1;
		var filterStart=this.$('exportFilterStart').checked;
		var val=this.$('exportFilterStartBy').value;
		var startDate=config.macros.exportTiddlers.getFilterDate(val,'exportStartDate');
		var filterEnd=this.$('exportFilterEnd').checked;
		var val=this.$('exportFilterEndBy').value;
		var endDate=config.macros.exportTiddlers.getFilterDate(val,'exportEndDate');
		var filterTags=this.$('exportFilterTags').checked;
		var tags=this.$('exportTags').value;
		var filterText=this.$('exportFilterText').checked;
		var text=this.$('exportText').value;
		if (!(filterStart||filterEnd||filterTags||filterText)) {
			alert('Please set the selection filter');
			this.$('exportFilterPanel').style.display='block';
			return -1;
		}
		if (filterStart&&filterEnd&&(startDate>endDate)) {
			var msg='starting date/time:\n'
			msg+=startDate.toLocaleString()+'\n';
			msg+='is later than ending date/time:\n'
			msg+=endDate.toLocaleString()
			alert(msg);
			return -1;
		}
		// if filter by tags, get list of matching tiddlers
		// use getMatchingTiddlers() (if MatchTagsPlugin is installed) for full boolean expressions
		// otherwise use getTaggedTiddlers() for simple tag matching
		if (filterTags) {
			var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
			var t=fn.apply(store,[tags]);
			var tagged=[];
			for (var i=0; i<t.length; i++) tagged.push(t[i].title);
		}
		// scan list and select tiddlers that match all applicable criteria
		var total=0;
		var count=0;
		for (var i=0; i<theList.options.length; i++) {
			// get item, skip non-tiddler list items (section headings)
			var opt=theList.options[i]; if (opt.value=='') continue;
			// get tiddler, skip missing tiddlers (this should NOT happen)
			var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; 
			var sel=true;
			if ( (filterStart && tiddler.modified<startDate)
			|| (filterEnd && tiddler.modified>endDate)
			|| (filterTags && !tagged.contains(tiddler.title))
			|| (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))
				sel=false;
			opt.selected=sel;
			count+=sel?1:0;
			total++;
		}
		return count;
	},
	deleteTiddlers: function() {
		var list=this.$('exportList'); if (!list) return;
		var tids=[];
		for (i=0;i<list.length;i++)
			if (list.options[i].selected && list.options[i].value.length)
				tids.push(list.options[i].value);
		if (!confirm('Are you sure you want to delete these tiddlers:\n\n'+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			var msg="'"+tid.title+"' is tagged with 'systemConfig'.\n\n";
			msg+='Removing this tiddler may cause unexpected results.  Are you sure?'
			if (tid.tags.contains('systemConfig') && !confirm(msg)) continue;
			store.removeTiddler(tid.title);
			story.closeTiddler(tid.title);
		}
		store.resumeNotifications();
		alert(tids.length+' tiddlers deleted');
		this.refreshList(0); // reload listbox
		store.notifyAll(); // update page display
	},
	go: function() {
		if (window.location.protocol!='file:') // make sure we are local
			{ displayMessage(config.messages.notFileUrlError); return; }
		// get selected tidders, target filename, target type, and notes
		var list=this.$('exportList'); if (!list) return;
		var tids=[]; for (var i=0; i<list.options.length; i++) {
			var opt=list.options[i]; if (!opt.selected||!opt.value.length) continue;
			var tid=store.getTiddler(opt.value); if (!tid) continue;
			tids.push(tid);
		}
		if (!tids.length) return; // no tiddlers selected
		var target=this.$('exportFilename').value.trim();
		if (!target.length) {
			displayMessage('A local target path/filename is required',target);
			return;
		}
		var merge=this.$('exportMerge').checked;
		var filetype=this.$('exportFormat').value.toLowerCase();
		var notes=this.$('exportNotes').value.replace(/\n/g,'<br>');
		var total={val:0};
		var out=this.assembleFile(target,filetype,tids,notes,total,merge);
		if (!total.val) return; // cancelled file overwrite
		var link='file:///'+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 ok=saveFile(target,out);
		displayMessage((ok?this.okmsg:this.failmsg).format([total.val,total.val!=1?'s':'',target]),link);
	},
	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>http://blogs.law.harvard.edu/tech/rss</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,notes,total,merge) {
		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.ExportTiddlersPlugin; var pver = v.major+'.'+v.minor+'.'+v.revision;
		var headerargs=[src,title,subtitle,now,user,twver,'ExportTiddlersPlugin',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;
				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) { displayMessage(config.messages.cantSaveError); return; }
				var posDiv = locateStoreArea(original);
				if (!posDiv) { displayMessage(config.messages.invalidFileError.format([currPath])); return; }
				var header = original.substr(0,posDiv[0]+startSaveArea.length)+'\n';
				var footer = '\n'+original.substr(posDiv[1]);
				break;
		}
		var out=this.getData(target,filetype,tids,fields,merge);
		var revised = header+convertUnicodeToUTF8(out.join('\n'))+footer;
		// if full TW, insert page title and language attr, and reset all MARKUP blocks...
		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,fields,merge) {
		// 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) {
			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)) {
					var existing=remoteStore.getTiddlers('title');
					var msg=this.overwriteprompt.format([target,existing.length,existing.length!=1?'s':'']);
					if (merge) {
						var added=titles.length; var updated=0; var kept=0;
						for (var i=0; i<existing.length; i++)
							if (titles.contains(existing[i].title)) {
								added--; updated++;
							} else {
								out.push(this.formatItem(remoteStore,filetype,existing[i],url));
								kept++;
							}
						displayMessage(this.mergestatus.format(
							[added,added!=1?'s':'',updated,updated!=1?'s':'',kept,kept!=1?'s':'',]));
					}
					else if (!confirm(msg)) out=[]; // empty the list = don't write file
				}
			}
		}
		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||"";
	}
}
//}}}
/***
!!!Control panel CSS
//{{{
!css
#exportPanel {
	display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;
	background-color: #eee; color:#000; font-size: 8pt; line-height:110%;
	border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;
	padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em;
}
#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }
#exportPanel table {
	width:100%; border:0px; padding:0px; margin:0px;
	font-size:8pt; line-height:110%; background:transparent;
}
#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }
#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }
#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}
#exportPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }
#exportPanel textarea  { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }
#exportPanel .box {
	border:1px solid black; padding:3px; margin-bottom:5px;
	background:#f8f8f8; -moz-border-radius:5px;-webkit-border-radius:5px; }
#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }
#exportPanel .rad { width:auto;border:0 }
#exportPanel .chk { width:auto;border:0 }
#exportPanel .btn { width:auto; }
#exportPanel .btn1 { width:98%; }
#exportPanel .btn2 { width:48%; }
#exportPanel .btn3 { width:32%; }
#exportPanel .btn4 { width:24%; }
#exportPanel .btn5 { width:19%; }
!end
//}}}
!!!Control panel HTML
//{{{
!html
<!-- target path/file  -->
<div>
<div style="float:right;padding-right:.5em">
<input type="checkbox" style="width:auto" id="exportMerge" CHECKED
	title="combine selected tiddlers with existing tiddlers (if any) in export file"> merge
</div>
export to:<br>
<input type="text" id="exportFilename" size=40 style="width:93%"><input 
	type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%" 
	onclick="var fn=config.macros.exportTiddlers.askForFilename(this); if (fn.length) this.previousSibling.value=fn; ">
</div>

<!-- output format -->
<div>
format:
<select id="exportFormat" size=1>
	<option value="TW">TiddlyWiki HTML document (includes core code)</option>
	<option value="PS">TiddlyWiki "PureStore" HTML file (tiddler data only)</option>
	<option value="TX">TiddlyWiki plain text TXT file (tiddler source listing)</option>
	<option value="CS">Comma-Separated Value (CSV) data file</option>
	<option value="NF">RSS NewsFeed XML file</option>
</select>
</div>

<!-- notes -->
<div>
notes:<br>
<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> 
</div>

<!-- list of tiddlers -->
<table><tr align="left"><td>
	select:
	<a href="JavaScript:;" id="exportSelectAll"
		onclick="return config.macros.exportTiddlers.process(this)" title="select all tiddlers">
		&nbsp;all&nbsp;</a>
	<a href="JavaScript:;" id="exportSelectChanges"
		onclick="return config.macros.exportTiddlers.process(this)" title="select tiddlers changed since last save">
		&nbsp;changes&nbsp;</a>
	<a href="JavaScript:;" id="exportSelectOpened"
		onclick="return config.macros.exportTiddlers.process(this)" title="select tiddlers currently being displayed">
		&nbsp;opened&nbsp;</a>
	<a href="JavaScript:;" id="exportSelectRelated"
		onclick="return config.macros.exportTiddlers.process(this)" title="select tiddlers related to the currently selected tiddlers">
		&nbsp;related&nbsp;</a>
	<a href="JavaScript:;" id="exportToggleFilter"
		onclick="return config.macros.exportTiddlers.process(this)" title="show/hide selection filter">
		&nbsp;filter&nbsp;</a>
</td><td align="right">
	<a href="JavaScript:;" id="exportListSmaller"
		onclick="return config.macros.exportTiddlers.process(this)" title="reduce list size">
		&nbsp;&#150;&nbsp;</a>
	<a href="JavaScript:;" id="exportListLarger"
		onclick="return config.macros.exportTiddlers.process(this)" title="increase list size">
		&nbsp;+&nbsp;</a>
</td></tr></table>
<select id="exportList" multiple size="10" style="margin-bottom:5px;"
	onchange="config.macros.exportTiddlers.refreshList(this.selectedIndex)">
</select><br>

<!-- selection filter -->
<div id="exportFilterPanel" style="display:none">
<table><tr align="left"><td>
	selection filter
</td><td align="right">
	<a href="JavaScript:;" id="exportHideFilter"
		onclick="return config.macros.exportTiddlers.process(this)" title="hide selection filter">hide</a>
</td></tr></table>
<div class="box">

<input type="checkbox" class="chk" id="exportFilterStart" value="1"
	onclick="config.macros.exportTiddlers.showFilterFields(this)"> starting date/time<br>
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">
	<select size=1 id="exportFilterStartBy"
		onchange="config.macros.exportTiddlers.showFilterFields(this);">
		<option value="0">today</option>
		<option value="1">yesterday</option>
		<option value="7">a week ago</option>
		<option value="30">a month ago</option>
		<option value="file">file date</option>
		<option value="other">other (mm/dd/yyyy hh:mm)</option>
	</select>
</td><td width="50%">
	<input type="text" id="exportStartDate" onfocus="this.select()"
		onchange="config.macros.exportTiddlers.$('exportFilterStartBy').value='other';">
</td></tr></table>

<input type="checkbox" class="chk" id="exportFilterEnd" value="1"
	onclick="config.macros.exportTiddlers.showFilterFields(this)"> ending date/time<br>
<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">
	<select size=1 id="exportFilterEndBy"
		onchange="config.macros.exportTiddlers.showFilterFields(this);">
		<option value="0">today</option>
		<option value="1">yesterday</option>
		<option value="7">a week ago</option>
		<option value="30">a month ago</option>
		<option value="file">file date</option>
		<option value="other">other (mm/dd/yyyy hh:mm)</option>
	</select>
</td><td width="50%">
	<input type="text" id="exportEndDate" onfocus="this.select()"
		onchange="config.macros.exportTiddlers.$('exportFilterEndBy').value='other';">
</td></tr></table>

<input type="checkbox" class="chk" id=exportFilterTags value="1"
	onclick="config.macros.exportTiddlers.showFilterFields(this)"> match tags<br>
<input type="text" id="exportTags" onfocus="this.select()">

<input type="checkbox" class="chk" id=exportFilterText value="1"
	onclick="config.macros.exportTiddlers.showFilterFields(this)"> match titles/tiddler text<br>
<input type="text" id="exportText" onfocus="this.select()">

</div> <!--box-->
</div> <!--panel-->

<!-- action buttons -->
<div style="text-align:center">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
	id="exportFilter" value="apply filter">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
	id="exportStart" value="export tiddlers">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
	id="exportDelete" value="delete tiddlers">
<input type=button class="btn4" onclick="config.macros.exportTiddlers.process(this)"
	id="exportClose" value="close">
</div><!--center-->
!end
//}}}
***/
 
/***
|Name|ExportTiddlersPluginInfo|
|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|
|Documentation|http://www.TiddlyTools.com/#ExportTiddlersPluginInfo|
|Version|2.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for ExportTiddlersPlugin|
interactively select and extract tiddlers from your ~TiddlyWiki document, and write them into another file, using one of several different file formats:
* ~TiddlyWiki - a complete, stand-alone, standard TiddlyWiki HTML document
* ~PureStore - a small HTML archive file containing tiddler data only (no core code)
* ~PlainText - a simple TXT text file with tiddler source listings
* Comma - a "Comma Separated Value" data/spreadsheet file
* ~NewsFeed  - an XML-format file that can be published for RSS syndication.
!!!!!Usage
<<<
{{{
<<exportTiddlers>> (sidebar menu item)
<<exportTiddlers inline>> (embedded control panel)
}}}

Inline control panel (live):
<<exportTiddlers inline>>

Optional "special tiddlers" used by this plugin:
* SiteUrl<br>URL for official server-published version of document being viewed (used in XML export). Default: //none//
<<<
!!!!!Revisions
<<<
2010.02.25 2.9.5 added merge checkbox option and improved 'merge' status message
2009.09.12 2.9.4 fixed 'return false' to prevent IE page transitions
2009.07.06 2.9.3 moved HTML to section for size reduction
2009.07.03 2.9.2 TW252 fixup: don't call convertUTF8ToUnicode() for local loadFile() I/O
2009.04.30 2.9.1 custom fields in CSV output
2009.04.19 2.9.0 added CSV format
2009.02.26 2.8.5 use macro-specific definition of $() function abbreviation (avoids conflict with JQuery)
2008.09.29 2.8.4 in getData(), convert existing TW file from UTF8 to Unicode before merging to correct handling of international characters and symbols.
2008.09.26 2.8.3 in go(), if rewriting *current* file and chkSaveBackups and/or chkGenerateAnRssFeed is enabled, then write a backup file or RSS feed, respectively.
2008.09.24 2.8.2 in assembleFile(), make sure that markup block is updated if corresponding Markup* tiddler is exported.
2008.09.19 2.8.1 in formatItem(), removed unnecessary convertUnicodeToUTF8() (was causing double-conversion!)
2008.09.11 2.8.0 extensive code cleanup: moved all global functions inside macro object. Re-wrote file generator and I/O to support TiddlyWiki, PlainText, PureStore, and NewsFeed file formats.  Replaced inline 'match tags' code with use of getMatchingTiddlers() from [[MatchTagsPlugin]] (if installed), with fallback to core getTaggedTiddlers() otherwise.
2008.05.27 2.7.0 added ability to 'merge' with existing export file.  Also, revised 'matchTags' functionality to be more robust and more efficient
2008.05.12 2.6.1 automatically add 'export' task to backstage (moved from BackstageTweaks)
2008.03.10 2.6.0 added "delete tiddlers" button
2007.12.04 *.*.* update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.11.10 2.5.1 removed debugging alert messages from promptForExportFilename()
2007.10.31 2.5.0 code reduction: removed incomplete/unused interface and supporting functions for exporting directly to http, https or ftp servers.  Plugin now supports exporting to local file only.  Also, updated TW document output to generate TW2.2 compatible file format.
2007.10.30 2.4.2 added automatic shadow tiddler definition for [[ExportTiddlers]]
2007.07.16 2.4.1 in exportTWHeader(), reset HTML source 'markup' so installed markup is NOT copied to new file.
2007.06.30 2.4.0 added "select related tiddlers" feature.  Recursively scans the tiddler links[] info to find all tiddlers referenced by any of the currently selected tiddler, and then selects them all (including the original tiddlers).
2007.04.19 2.3.0 in exportData(), pass SiteURL value as param to saveToRss().  Fixes 'undefined' appearing in tiddler link in XML output.  Also, in refreshExportList(), added 'sort by tags'.  Also, added 'group select'... selecting a heading (date,author,tag) auto-selects all tiddlers in that group.
2007.03.02 2.2.6 in onClickExportButton(), when selecting open tiddlers for TW2.2, look for "storyDisplay" with fallback to "tiddlerDisplay" for TW2.1 or earlier
2007.03.01 2.2.5 removed hijack of store.saveChanges()
2006.11.08 2.2.4 added promptForExportFilename() and replaced type="file" control with edit field + browse button ("...").
2006.10.12 2.2.3 in exportDIVFooter(), write POST-BODY-START/END markers for compatibility with TW2.1 core file format.
2006.05.11 2.2.2 in createExportPanel, removed call to addNotification() to reduce unneeded feedback messages and increase overall document performance.
2006.05.02 2.2.1 Use displayMessage() to show number of selected tiddlers instead of updating listbox 'header' item after each selection.  Prevents awkward 'scroll-to-top' behavior that made multi-select via ctrl-click nearly impossible.
2006.04.29 2.2.0 New features: free-form "Notes" text inserted in the header of PureStore files.
2006.03.29 2.1.3 added calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.
2006.02.12 2.1.2 more FF1501 bug fixes.
2006.02.04 2.1.1 added var to unintended globals to avoids FireFox1501 crash bug
2006.02.02 2.1.0 Added support for output of complete TiddlyWiki documents
2006.01.21 2.0.1 Defer initial panel creation and only register a notification function when panel first is created
in saveChanges 'hijack', create panel as needed.  Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.
2005.12.27 2.0.0 Update for TW2.0.
2005.12.24 0.9.5 Minor adjustments to CSS to force correct link colors regardless of TW stylesheet selection
2005.12.16 0.9.4 Dynamically create/remove exportPanel so only one instance exists at a time
2005.11.15 0.9.2 added non-Ajax post to bypass cross-domain security restrictions.
2005.11.08 0.9.1 moved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time.
2005.10.28 0.9.0 added 'select opened tiddlers' feature. Based on a suggestion by Geoff Slocock
2005.10.24 0.8.3 Corrected hijack of 'save changes' when using http:
2005.10.18 0.8.2 added AJAX functions
2005.10.18 0.8.1 Corrected timezone handling and error checking/reporting when filtering tiddlers. More style tweaks, minor text changes and some assorted layout cleanup.
2005.10.17 0.8.0 First pre-release.
2005.10.16 0.7.0 filter by tags
2005.10.15 0.6.0 filter by title/text
2005.10.14 0.5.0 export to local file (DIV or XML)
2005.10.14 0.4.0 filter by start/end date
2005.10.13 0.3.0 panel interaction
2005.10.11 0.2.0 panel layout
2005.10.10 0.1.0 code framework
2005.10.09 0.0.0 development started
<<<
!Favorite Sites
* I frequently visit [[Digg|http://www.digg.com]] for news. I admit I used to read [[Slashdot|http://www.slashdot.org]] but somehow I prefer digg's format.  Slashdot has too many italics.
* To buy stuff I always consult first [[Slickdeals|http://www.slickdeals.net]], then [[dealnews|http://dealnews.com]] and then all the shopping engines and google.
* I always visit [[Gizmodo|http://www.gizmodo.com]] and [[EnGadget|http://www.engadget.com]] for gadget news and [[Lifehacker|http://www.lifehacker.com]].
* [[My about.me profile|http://about.me/sotos]]: An attempt to collect all your online info.
* One of my favorite economists [[Cristina Tealdi|http://sites.google.com/site/cristinatealdiphd/Home]]
!~DJing
My biggest hobby is ''~DJing''.  Favorite styles of music are:
* NYC House
* Chicago House
* Afro/Tribal House
* Latin/Miami House
* Tek House
* Goa Trance
* Detroit Techno
''Favorite ~DJs/Producers'': Dennis Ferrer, Stacy Kidd, Ron Carroll, Glenn Underground, Kings of Tomorrow, Masters at Work, Bob Sinclar, Freemasons, Mr V, Africanism, Nicolas Matar, Erick Morillo, Deep Dish, Carl Kennedy, DJ Pierre, DJ Sneak, Moloko, Roger Sanchez, Robbie Rivera, Quentin Harris, Danny Tenaglia, Martin Solveig, Jerome Sydenham, Abicah Soul Project, Joe Claussell, Tiger Stripes, Pete Heller, Ian Pooley, Mark Farina, Justice, Satoshi Tomiie, Hiroshi Watanabe, Juno Reactor, Infected Mushroom, DJ Gregory, ~G-Pal, ~Awa-Klash, Little Louie Vega, and many many others.

My style could be characterized as frequency mixed, with multiple breaks. I rarely scratch. I incorporate a lot of acapellas, filters, and effects.

The ''tools'' I use are:
* Windows Laptop
* Hercules DJ Console: MIDI Controller. Contemplating xponent by ~M-Audio
* Virtual DJ: DJ software.
* Mixed in Key: Music library analyzer, although I dont trust it completely.  Experience always matters more.
* Audacity: Waveform editor.
* A bunch of filters/effects for Virtual DJ.
* Meizu Mini Player: A great portable Mp3 player.
* Creative ~EP-630 in-ear headphones.
* Wireless full ear headphones

Check out some of my MiXes.
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>>
Use the code from [[Hawksworx Blog|http://www.hawksworx.com/journal/2007/07/05/tracking-tiddlywiki-with-google-analytics/]]
and paste it into a tiddler (say ~GA_tracker) after you put your GA tracking code in the tiddler (see the blog for instructions). Note that if you have single page mode enabled make sure the ~GA_tracker tiddler is loaded after the singlePagemode plugin, ie., rename the tracker tiddler as zzGA_tracker. 
Install 
[[ToggleRightSidebar plugin|http://www.tiddlytools.com/#ToggleRightSidebar]]
and put the following wherever you want
{{{ 
<<tiddler ToggleRightSidebar>>
}}}

Also make a tiddler and tag systemConfig with the following 
{{{
config.options.chkShowRightSidebar=false;
config.options.txtToggleRightSideBarLabelShow="◄";
config.options.txtToggleRightSideBarLabelHide="►";
}}}
to control options
/***
|Name|ImageSizePlugin|
|Source|http://www.TiddlyTools.com/#ImageSizePlugin|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|extends image syntax to add optional CSS width/height values|
!!!!!Usage
<<<
Extends standard TiddlyWiki image syntax, ''{{{[img[...]]}}}'', so you can specify CSS width/height values.

The extended syntax is:
>''{{{[img(x,y)[...]]}}}''
>where x and y are the desired width and height of the image, specified using CSS units of measurement (e.g., px, em, cm, in, or %).  Use ''auto'' (or omit the value) for width or height to scale image proportionally (i.e., maintain aspect ratio).  You may also calculate a CSS value on-the-fly by using //evaluated javascript//, enclosed between """{{""" and """}}""", e.g, {{{({{widthFunction()}},{{heightFunction()}})}}}.

Note: this plugin also includes enhancements to support:
*[[AttachFilePluginFormatters]] (embed image files as text-encoded tiddlers)
* [[ImagePathPlugin]] (fallback locations for missing images)
Please refer to those plugins for details...
<<<
!!!!!Examples
<<<
{{{
[<img(34%,auto)[images/meow.gif]]
[<img(21%,auto)[images/meow.gif]]
[<img(13%,auto)[images/meow.gif]]
[<img(8%,auto)[images/meow.gif]]
[<img(5%,auto)[images/meow.gif]]
[<img(3%,auto)[images/meow.gif]]
[<img(2%,auto)[images/meow.gif]]
[img(1%,auto)[images/meow.gif]]
}}}
[<img(34%,auto)[images/meow.gif]]
[<img(21%,auto)[images/meow.gif]]
[<img(13%,auto)[images/meow.gif]]
[<img(8%,auto)[images/meow.gif]]
[<img(5%,auto)[images/meow.gif]]
[<img(3%,auto)[images/meow.gif]]
[<img(2%,auto)[images/meow.gif]]
[img(1%,auto)[images/meow.gif]]
{{clear block{}}}
<<<
!!!!!Revisions
<<<
2008.01.19 [1.1.0] added support for evaluated width/height values!!
2008.01.18 [1.0.1] code cleanup plus improved regexp for matching "(width,height)" by eliminating hard-coded recognition of [px,em,cm,in,%] CSS units.  Syntax now accepts ANY values for width/height, and leaves it to the browser's CSS processing to handle any invalid values.
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.imageSize = {major: 1, minor: 1, revision: 0, date: new Date(2008,1,19)};

// replace standard handler for image formatter
// note: includes modifications for [[AttachFilePluginFormatters]] AND [[ImagePathPlugin]]
var f=config.formatters.findByField("name","image");
config.formatters[f].match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
config.formatters[f].lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](\([^,]*,[^\)]*\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
config.formatters[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 XY=lookaheadMatch[3];
		var tooltip=lookaheadMatch[4];
		var src=lookaheadMatch[5];
		var link=lookaheadMatch[6];
		// 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"; // FLOAT LEFT/RIGHT
		if(XY) { // CUSTOM SIZE with optional EVAL'ED width/height ({{...}},{{...}})
			var parts=XY.replace(/[\(\)]/g,'').split(","); var x=parts[0]; var y=parts[1];
			if (x.substr(0,2)=="{{") {
				try{img.style.width=eval(x.substr(2,x.length-4));}
				catch(e){displayMessage(e.description||e.toString())}
			} else img.style.width=x;

			if (y.substr(0,2)=="{{") {
				try{img.style.height=eval(y.substr(2,y.length-4));}
				catch(e){displayMessage(e.description||e.toString())}
			} else img.style.height=y;
		}
		if(tooltip) img.title = tooltip; // TOOLTIP
		// GET IMAGE SOURCE (get attachment or resolve fallback path as needed)
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
		else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
			// Note: IE and Safari use onError to call resolvePath() only if initial lookup fails
			// (avoids security messages for initial filesystem access)... otherwise, attempt to
			// resolve the original path/file before initial rendering
			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(lookaheadMatch[5],true);
		}
		img.src=src; // RENDER IMAGE
		w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
}
//}}}
/***
!Description
Use the code below to Insert a favicon.ico.  Change the n.href line to the location of your ico.
tag the tiddler with systemConfig
Source: [[TiddlyWiki Google Groups|http://groups.google.com/group/TiddlyWikiDev/browse_frm/thread/17caafee81eab118/450e723340672f7a?lnk=st&q=%22var+n+%3D+document.createElement(%22link%22)%3B%22&rnum=1&hl=en#450e723340672f7a]]
!Code
***/
//{{{
version.extensions.favicon = {major: 0, minor: 1, revision: 0, date: new Date("Jul 18, 2005")};
var n = document.createElement("link");
n.rel = "shortcut icon";
n.href = "http://users.eecs.northwestern.edu/~stsaft/favicon.ico";
document.getElementsByTagName("head")[0].appendChild(n);
//}}}
The titles of my journal articles are the following. Click on each to retrieve full reference and abstract and an electronic copy.
<<listTags Journal>>
<html>
<table border = "0">
<tr>
<td><div style="text-align:center">
<object type="application/x-shockwave-flash" width="300" height="300" id="FlowPlayer" data="http://users.eecs.northwestern.edu/~stsaft/FlowPlayerLight.swf">
  <param name="movie" value="http://users.eecs.northwestern.edu/~stsaft/FlowPlayerLight.swf"/>
  <param name="scale" value="noScale"/>
  <param name="wmode" value="transparent"/>
  <param name="allowScriptAccess" value="sameDomain"/>
  <param name="quality" value="high"/>
  <param name="flashvars" value="config={
    loop: false,
    autoPlay:false,
    initialScale: 'fit',
    videoFile: 'http://users.eecs.northwestern.edu/~stsaft/media/pig.flv',
    autoBuffering: true,
    bufferLength: 12,
    startingBufferLength: 10,
  }"/>
</object> </div>
<b>An example of Tracking and Elastically Matching Left Ventricle Contours.</b></td>
<td><div style="text-align:center">
<object type="application/x-shockwave-flash" width="300" height="300" id="FlowPlayer" data="http://users.eecs.northwestern.edu/~stsaft/FlowPlayerLight.swf">
  <param name="movie" value="http://users.eecs.northwestern.edu/~stsaft/FlowPlayerLight.swf"/>
  <param name="scale" value="noScale"/>
  <param name="wmode" value="transparent"/>
  <param name="allowScriptAccess" value="sameDomain"/>
  <param name="quality" value="high"/>
  <param name="flashvars" value="config={
    loop: false,
    autoPlay:false,
    initialScale: 'fit',
    videoFile: 'http://users.eecs.northwestern.edu/~stsaft/media/odd.flv',
    autoBuffering: false,
    bufferLength: 12,
    startingBufferLength: 10,
  }"/>
</object> </div>
<b>An example of an MRI image sequence of a needle tip in a phantom.</b></td>
</tr>
</table>
</html>/% ffmpeg -i odd.avi -vcodec h264 -sameq odd.mp4 %/
In collaboration with ''Prof. Dharmakumar'' (NU Radiology) and ''Dr. Koktzoglou'' (Evanston Northwestern Healthcare) I have been working on cardiac MRI for disease detection and interventional myocardial therapies. Specifically, we are working on the detection of myocardial ischemia based on MRI data. I am advising two visiting students that work on the detection and elastic registration of the heart’s left ventricle. This allows us to monitor the "change in blood perfusion" (which might indicate a medical condition) along the cardiac cycle. In another effort, we have developed a real time MRI protocol that can be used to visualize an industry standard radiopaque catheter with signal properties that are similar to those realized with circuit bearing (active) devices (not yet approved by the FDA). I am advising an undergraduate student for creating an object tracking algorithm that is used to track the tip of the catheter (essentially the tip of a needle) in MR sequences, to assist in delivery of therapeutic agents (stem cells, human growth factor) and in other minimally invasive therapies. This task is very challenging, since the object signature is very small, and object occlusions and diffusion with the background are very common.

Recently, we have focused in visualization tools for assessing and quantifying oxygenation deficits resulting from coronary artery stenosis.  Specifically we process the myocardial intensity signals, which are collected with the steady state free precession blood-oxygen-level-dependent (BOLD SSFP) technique that Dr. Dharmakumar pioneered. We are able to define statistical thresholds that are used to visualize and quantify the extent of hypointense regions in the myocardium. 

Relevant Publications:
<<list filter "[tag[(publications and CardiacMRI)]]">> 
The tiddler 'Main Page' doesn't yet exist. Double-click to create it
[img(100%,auto)[none|sotos.jpg]]
[[Welcome]]
[[Biography]]
[[My Research]]
[[Publications]]
[[Press Coverage]]

''@@[[Openings]]@@''

[[Consulting]]

[[Contact]]

[[About This Site]]

<html>
<a href="http://www.statcounter.com/" target="_blank"><img src="http://c15.statcounter.com/counter.php?sc_project=1546007&java=0&security=7a48d2b2&invisible=0" alt="site stats" border="0"></a>
<a href="http://www.citeulike.org/user/stsaft" style="text-decoration:none;"><span style="font: 80% Arial,sans-serif; color:#0783B6;"><img src="http://wiki.citeulike.org/images/1/17/Cul_icon.gif"  width="16" height="16" border="0" alt="View Sotirios (Sotos) Tsaftaris CiteULike Library" style="vertical-align:middle" border="0"></span></a>   <a href="http://www.linkedin.com/in/sotost" style="text-decoration:none;"><span style="font: 80% Arial,sans-serif; color:#0783B6;"><img src="http://www.linkedin.com/img/webpromo/btn_in_20x15.png" width="20" height="15" alt="View Sotirios (Sotos) Tsaftaris's LinkedIn profile" style="vertical-align:middle" border="0"></span></a>
</html>
I am super lazy and I dont like photo editing programs like photoshop. The steps I followed to make my icon were:
* Opened Powerpoint 2003 (Yes PowerPoint)
* Made the icon that I wanted in a regular presentation.  Used small fonts like 18.
* Selected the items that made the icon.
* ~Right-Click and select Save as Image
* Choose PNG format
* Surf to [[Favicon From Pics|http://www.chami.com/html-kit/services/favicon/]] and follow the steps.
* See [[Inserting a favicon into TiddlyWiki]] on how to put in TiddlyWiki
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
/***
|Name|MatchTagsPlugin|
|Source|http://www.TiddlyTools.com/#MatchTagsPlugin|
|Documentation|http://www.TiddlyTools.com/#MatchTagsPluginInfo|
|Version|2.0.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|'tag matching' with full boolean expressions (AND, OR, NOT, and nested parentheses)|
!!!!!Documentation
> see [[MatchTagsPluginInfo]]
!!!!!Revisions
<<<
2010.08.11 2.0.4 in getMatchingTiddlers(), fixed sorting for descending order (e.g, "-created")
| please see [[MatchTagsPluginInfo]] for additional revision details |
2008.02.28 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.MatchTagsPlugin= {major: 2, minor: 0, revision: 4, date: new Date(2010,8,11)};

// 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();
	if (tids && sortfield) tids=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",
	defTags: "",
	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,this.defTags,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 i=0; i<tids.length; i++) { var t=tids[i];
			var title=t.title;
			var who=t.modifier;
			var when=t.modified.toLocaleString();
			var text=t.text;
			var first=t.text.split("\n")[0];
			var desc=store.getTiddlerSlice(t.title,"description");
			desc=desc||store.getTiddlerSlice(t.title,"Description");
			desc=desc||store.getTiddlerText(t.title+"##description");
			desc=desc||store.getTiddlerText(t.title+"##Description");
			var tags=t.tags.length?'[['+t.tags.join(']] [[')+']]':'';
			out.push(fmt.format([title,who,when,text,first,desc,tags]));
		}
		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();
		ev.cancelBubble=true;
		if(ev.stopPropagation) ev.stopPropagation();
		return false;
	},
	createReport: function(target,tags,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(),tags,{});
		story.closeTiddler(target); story.displayTiddler(null,target);
	},
	createPanel: function(place,expr,fmt,sep,sortBy,tid) {
		var s=createTiddlyElement(place,"span"); s.innerHTML=store.getTiddlerText("MatchTagsPlugin##html");
		var f=s.getElementsByTagName("form")[0];
		f.expr.value=expr; f.fmt.value=fmt; f.sep.value=sep.escapeLineBreaks();
		f.tid.value=tid; f.tags.value=this.defTags;
	}
};
//}}}
/***
//{{{
!html
<form style='display:inline;white-space:nowrap'>
<input type='text'    name='expr' style='width:50%' 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:12%' title='target tiddler title'><!--
--><input type='text'    name='tags' style='width:10%' title='target tiddler tags'><!--
--><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; }
	var tags=this.form.tags.value;
	config.macros.matchTags.createReport(tid,tags,expr,fmt,sep,'title');
	return false;">
</form>
!end
//}}}
***/
//{{{
// SHADOW TIDDLER for displaying default panel input form
config.shadowTiddlers.MatchTags="<<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);
	}
};
//}}}
The list of mixes are here:
<<listTags mix>>
If you dont want to show the Timeline, or tabs or etc then you will want to edit the SideBarTabs.

Search for tiddler SideBarTabs and edit its content.

The content will look like this:
{{{<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>}}} and will result in:
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>

If you remove the Timeline Stuff you get this:
{{{<<tabs txtMainTab All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>}}}
<<tabs txtMainTab All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>

Some usefull info [[here|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/43112f955cbb16d9/7d15b0059f9f1100?lnk=st&q=tiddlywiki+sidebar+timeline&rnum=2&hl=en#7d15b0059f9f1100]]
This type of work can be readily applied to many biotechnological protocols that rely on DNA to DNA interactions. To this effect I have been investigating an alternative approach to microarray design that maintains all of the advantages of microarrays but simplifies the design optimization task and suppresses the labeling bias found in microarray assays. The basis is a novel linker construction that employs a simple ~DNA-based computational device to reduce mishybridization. The proposed method introduces another level of reliability in the chemical protocols, as well as in the intensity measurements. A patent has been filled.
[>img[Idea Chart|http://users.eecs.northwestern.edu/~stsaft/media/logo.png]]Signal processing has become an integral part of our everyday life. It is present in everyday appliances and has even found application in biology (for example, genomic signal processing). On the other hand, biologically inspired ideas such as evolutionary optimization are routinely applied to an increasing number of signal processing problems.

My research is inspired by nature and creates another level of hybrid connection and interaction between biology and signal processing. I use DNA molecules to manage large amounts of digital signals. It is interdisciplinary research in that it requires knowledge of signal processing on one hand, and molecular biology and biotechnology on the other.

I am also very interested in applying signal processing to solve unique imaging and signaling problems in the life sciences, such as cardiac MRI, AFM Imaging, Plant Phenotyping and even art!

!Research Areas
Overall, for the past 9 years I have been working on: 
<<listTags Research>>

!Co-authors and Collaborators
I collaborate closely with  [[Dr Angelo Bifone|http://www.imtlucca.it/whos_at_imt/personal_page.php?n=Angelo+Bifone&p=7082]] at the Italian Institute of Technology IIT@[[NEST|http://www.sns.it/en/laboratori/laboratoriscienze/nest/]] in Pisa, [[Professor Aggelos Katsaggelos|http://users.eecs.northwestern.edu/%7Eaggk/]] at the [[Image and Video Processing Laboratory|http://ivpl.ece.northwestern.edu/]], Professor Rohan Dharmakumar at the Biomedical Imaging Research Institute, ~Cedars-Sinai Medical Center, Los Angeles California, and [[Dr Francesca Casadio|http://www.matsci.northwestern.edu/aic/about_us.htm]] with the [[Conservation Department of the Art Institute of Chicago|http://www.artic.edu/aic/conservation/index.html]]. Visit [[IVPL|http://ivpl.ece.northwestern.edu/Staff/Sotos.html]] and [[Cardiac MRI|http://www.cardiacmri.nmh.org/]] for some information on my colleagues and other projects.

You can also check [[Co-Authors and Collaborators]] for the network of my co-authors and collaborators.

!Research Sponsoring Agencies / Foundations
[img[http://www.issnaf.org/_old/images/stories/logo_230x230.gif][http://www.imtlucca.it]][img[http://www.nih.gov/glmedia/head_main_logo.gif][http://www.nih.gov/]][img[http://www.artic.edu/aic/gfx/header_aic_logo.gif][http://www.artic.edu/aic/]][img[http://www.mellon.org/logo.jpg][http://www.mellon.org/]][img[none|http://www.sdfoundation.org/Portals/_default/skins/sdfoundation/images/logo.jpg][http://www.sdfoundation.org/]][img[http://www.northwestern.edu/univ-relations/identity-system/logos/NU_Logo_purple.jpg][http://www.northwestern.edu]][img[http://users.eecs.northwestern.edu/~stsaft/media/dot.png][http://www.dot.gov/new/index.htm]]
[img[http://users.eecs.northwestern.edu/~stsaft/media/onassis.png][http://www.onassis.gr/index.php]]
[[NIH Style Biosketch in PDF|http://users.eecs.northwestern.edu/~stsaft/media/tsaftaris_NIH.pdf]]
[[NIH Style Biosketch in Google PDF Viewer|http://docs.google.com/viewer?url=http://users.eecs.northwestern.edu/~stsaft/media/tsaftaris_NIH.pdf]] 
<script src="http://www.google-analytics.com/urchin.js" type="text/
javascript"></script>
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>

rename it as SideBarTabs to recover the old sidebar

<<tabs txtMainTab Tags 'All tags' TabTags>>
!~Post-Doc Openings

* Brain Imaging and Computational Morphometry - 1 Post Doctoral Fellow Position
We invite applications for a ~Post-Doctoral Fellowship in the area of pattern recognition and image analysis. Candidates with a Ph.D. in electrical or biomedical engineering, computer science, imaging, or equivalent are preferable. 
We are specifically interested in the ''development of new data-driven computational methods for morphometric assessment of Magnetic Resonance images of the brain''. The fellow will have access to a large collection of datasets modeling human disease of the Central Nervous System. The ideal candidate should have a strong mathematical and computational background, experience in pattern recognition and machine learning and biomedical image analysis and excellent programming skills. Previous experience with brain image processing (e.g., non-linear registration, VBM, TBM) and suites (e.g., FSL, FreeSurfer) will be considered a plus but is not required. Candidates must have an excellent track record of high-impact international publications and an excellent level of both written and spoken English is mandatory. 
The fellow is expected to focus mostly on research and mentoring Ph.D. students. Limited participation in teaching of graduate courses may be requested. 
We offer competitive salary packages and several benefits. More information regarding the position, as well as the ''online application form'', can be found here: [[Application Form|http://www.imtlucca.it/faculty/positions/junior_faculty_recruitment_program.php#brain_imaging]]
[[IMT Lucca|http://www.imtlucca.it]] is a public international Graduate School and Institute of Technology that acts as a research university situated in Lucca, Italy. 
The deadline for applications is ''May 20th 2012''. 

''PRIAn @ ISMRM'': One of the principal investigators of PRIAn, Prof. Sotirios Tsaftaris, will be @@attending ISMRM 2012 in Melbourne, Australia@@. Interested candidates are welcome to contact him via email (s.tsaftaris@imtlucca.it) should they want to discuss at ISMRM.


!Marie Curie Scholars, Visiting Scholars Openings
We welcome applications by talented individuals that want to collaborate with us in a post-doc capacity should they have external funding (e.g., the EU, the Chinese Government, U.S.A). If EU citizens are interested in submitting Marie Curie proposals to fund their research at IMT I can work with them and help them with their application. Please [[Contact]] me and we can explore all possible scenarios.



!~PhD Student Openings
IMT will be opening its call for PhD applicants soon.
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

See AdvancedOptions
<!--{{{-->
<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="headerSearch" macro="search"></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>
<!--}}}-->
/***
!Description
Creates a list of all tiddlers with a certain tag by invoking {{{<<}}}listTags yourTag{{{>>}}}

Source code [[here|http://tiddlywikitips.com/#%5B%5BPlugin%20listTags%5D%5D]]
More usage info [[here|http://tiddlywikitips.com/#%5B%5BTip%20%2304%3A%20Tag%20Listing%20*%5D%5D]]

!The Code
***/
//{{{
config.macros.listTags = { text: "Hello" };
config.macros.listTags.handler = function(place,macroName,params)
{
 var tagged = store.getTaggedTiddlers(params[0]);
 var ul = createTiddlyElement(place,"ul",null,null,"");
 for(var r=0;r<tagged.length;r++)
 {
 var li = createTiddlyElement(ul,"li",null,null,"");
 createTiddlyLink(li,tagged[r].title,true);
 }
}
//}}}
<<plugins>>
I have a certain number of plugins installed. So if you want to get a page like mine, you have to install them as well.
On how to install a plugin see [[this|http://www.tiddlywiki.com/#InstallingPlugins]] or better [[this one|http://mnteractive.com/archive/how-to-install-a-tiddlywiki-plugin/]]

The plugins I have installed are:
<<listTags systemConfig>>
Work on [[Digital Restoration of Paintings]] appeared in 
* [[MIT Technology Review|http://www.technologyreview.com/computing/25820/]] 
* [[New York Times|http://www.nytimes.com/2010/07/11/arts/design/11matisse.html]] 
* [[MSNBC's Cosmic Blog|http://cosmiclog.msnbc.msn.com/_news/2010/07/12/4662626-matisse-masterpiece-remade]]
* [[Northwestern's FrontPage|http://www.northwestern.edu/newscenter/stories/2010/07/matisse-conservation-technology.html]]
* [[McCormick News|http://www.mccormick.northwestern.edu/news/articles/article_734.html]]
* [[PhysOrg|http://www.physorg.com/news198167416.html]]
* [[The Daily Northwestern|http://www.dailynorthwestern.com/northwestern-art-institute-of-chicago-use-new-process-to-colorize-a-black-and-white-painting-1.2281744]]
* [[TA NEA (Ελληνική εφημερίδα "ΤΑ ΝΕΑ") Greek Newspaper|http://www.tanea.gr/default.asp?pid=2&ct=2&artid=4587121]]     [[[PDF|http://users.eecs.northwestern.edu/~stsaft/media/epistimi.pdf]]]
* [[McCormick Magazine|http://magazine.mccormick.northwestern.edu/fall2010/matisse.html]]     [[[PDF|http://users.eecs.northwestern.edu/~stsaft/media/mccormick.pdf]]]
* [["Κ" (Ελληνική εφημερίδα "ΚΑΘΗΜΕΡΙΝΗ") Greek Newspaper|http://www.kathimerini.gr/]]     [[[PDF|http://users.eecs.northwestern.edu/~stsaft/media/Kathimerini_K_6_Mar_2011_p58-62.pdf]]]

Work on [[DNA-Based Digital Signal Processing]] and specifically the paper [[06. The Not So Digital Future of Digital Signal Processing]], appeared at the following online media:
* [[McCormick News|http://www.mccormick.northwestern.edu/news/archives/355]]
* [[Science Daily|http://www.sciencedaily.com/releases/2008/04/080407153030.htm]]
* [[PhysOrg|http://www.physorg.com/news126800671.html]]
[[Publications By Type]], Journals, Conferences, Book Chapters, etc
[[Publications By Research Topic]], ie., papers on cardiac MRI, ~DNA-based Digital Signal Processing, etc

[[Co-Authors and Collaborators]] contains an overall analysis of all my co-authors and collaborators. 
!~DNA-based Digital Signal Processing, Molecular Simulations, Codeword Design, Thermodynamics
<<list filter "[tag[publications and (DNA-Based Digital Signal Processing OR Codeword Design OR Simulation)]]">> 
!Magnetic Resonance Imaging
<<list filter "[tag[(publications and CardiacMRI)]]">> 
!Imaging for biological sciences (imaging at the nanoscale, macroscale, cellular level)
<<list filter "[tag[publications and (Microarray Imaging OR AFM OR Phenotyping OR Cellular Imaging)]]">> 
!Imaging for art conservation
<<list filter "[tag[publications and (Digital Restoration of Paintings)]]">> 
!Watermarking, Data Hiding, Copyright Protection
<<listTags [[Copyright Protection]]&&publications>>
!Transportation, Data Mining, Traffic Video Compression
<<list filter "[tag[publications and Vehicle Tracking]]">> 

[[Copyright Notices]]
Here you can find my publications in chronological order divided in four categories ''Book Chapters'', ''Journals'', ''Conference Papers'', ''Theses & Dissertations''. Click on each of the links to retrieve more information (ie. full citation, abstract, PDF reprint, etc).
/%<<forEachTiddler
where 'tiddler.tags.contains("tips")'
sortBy "tiddler.title.toLowerCase()"
script 'function open(tiddler) {
story.closeTiddler(tiddler.title,false,false);
story.displayTiddler(null,tiddler.title); return ""; }'
write 'open(tiddler);' >> %/
!Book Chapters
<<listTags BookChapter>>
!Journals
<<listTags Journal>>
!Conference Papers
<<listTags Conference>>
!Theses & Dissertations
* S.A. Tsaftaris, "//~DNA-Based Storage and Retrieval of Digital Signals//," ~PhD Dissertation, Northwestern University, Department of Electrical and Computer Engineering, Advisor Dr. Katsaggelos, May 2006.
* S.A. Tsaftaris, "//~DNA-Based Digital Signal Processing//," ~MSc Thesis, Northwestern University, Department of Electrical and Computer Engineering, Advisor Dr. Katsaggelos, May 2003.
* S.A. Tsaftaris, "//Copyright protection of MPEG 1&2 Video Sequences using digital watermarking//," Diploma Thesis (in Greek), Aristotle University of Thessaloniki, Department of Electrical and Computer Engineering, Advisor Dr. Strintzis, June 2000.

[[Copyright Notices]]
Put in PageTemplate header
{{{
<div id='headerSearch' macro='search'></div>
}}}
Put in StyleSheet
{{{
#headerSearch {
      position: absolute;
      top: 2px;
      right: 85px;
 }
 #headerSearch a {
      border: none;
} 
}}}

Put the "search" div outside the header... preferably at the beginning
or end of the PageTemplate. 
!Purpose / But

I wrote this Search Engine Optimization plugin to improve ~TiddlyWiki website's ranking on Google, Yahoo, etc. Basically, it does two things:
1) For each tiddler and each tag of this one, it creates a html file with the tiddler's content and named according to the tiddler's title. The html file is written in a way that it can be easily crawled by a search engine (short and with html format, not ~TiddlyWiki's format), but if it is opened (which will be the case if it appears in the results of a search engine), it redirects to the ~TiddlyWiki with the corresponding tiddler opened.
2) It creates the sitemap.xml and urllist.txt files for Google and Yahoo which included generated html files.

J'ai écrit ce plugin d'optimisation pour les moteurs de recherche pour améliorer l'indexation d'un ~TiddlyWiki par Google, Yahoo, etc.
Le plugin fait deux choses :
1) Pour chaque tiddler et chaque tag de celui-ci, il créé un fichier html avec le contenu du tiddler et nommé selon le titre du tiddler. Le fichier html est écrit de sorte qu'il soit facilement indexable par un moteur de recherche (court et avec un balisage html et non un balisage ~TiddlyWiki), mais que s'il est ouvert (ce qui sera le cas s'il apparaît dans les résultats d'un moteur de recherche), il redirige vers le ~TiddlyWiki avec le tiddler correspondant ouvert.
2) Il créé les fichiers sitemap.xml et urllist.txt pour Google et Yahoo, qui inclue les fichiers html générés.

!How to install / Comment l'installer

1) Create two tiddlers like these one (same name and content):
[[SEOTiddlyWikiPlugin]] [[SEOTiddlyWikiConfig]]
NB: double-clic on each tiddler to get edit mode and copy-paste their content.
2) Fill in shadow tiddlers SiteUrl, SiteTitle and SiteSubtitle.
3) Edit this tiddler and see the code behind the following link to understand how to launch the process, once the plugin installed: <html><a href="javascript:generateSEOFiles();">Generate SEO files</a></html>.
4) See http://www.google.com/webmasters/sitemaps/ to register your  sitemap.xml file.

Tips
1) Feel free to modify html template [[SEOTiddlyWikiConfig]].
2) Use tag //excludeSearch// to disallow the export of a tiddler.

Limitation
If you remove a tiddler after an export, you have to manually remove the corresponding html file.

1) Créez un tiddler comme ceux-ci (même nom et contenu) :
[[SEOTiddlyWikiPlugin]] [[SEOTiddlyWikiConfig]]
NB: double-cliquez sur chaque tiddler pour le passe en mode d'édition et copier-coller leur contenu.
2) Remplissez les tiddlers cachés SiteUrl, SiteTitle et SiteSubtitle.
3) Editez le contenu de ce tiddler pour voir le code derrière le lien suivant et comprendre comment lancer le processus une fois le plugin installé : <html><a href="javascript:generateSEOFiles();">Générer les fichiers SEO</a></html>.
4) Voyez http://www.google.com/webmasters/sitemaps/ pour enregistrer votre fichier sitemap.xml.

Astuces
1) N'hésitez pas à modifier le modèle html [[SEOTiddlyWikiConfig]].
2) Utilisez le tag //excludeSearch// pour interdire l'export d'un tiddler.

Limitation
Si vous supprimez un tiddler après un export, vous devez manuellement effacer le fichier html correspondant.

!Sample results / Exemple de résultats

http://www.google.com/search?q=site:superphysique.net
http://www.superphysique.net/
http://www.superphysique.net/materials/strength-cycles.htm
http://www.superphysique.net/gallery/eric.htm
http://www.superphysique.net/gallery/jean-louis.htm
http://www.superphysique.net/tiddlywiki/seo-tiddlywiki-plugin.htm
http://www.superphysique.net/gallery/fabrice.htm
http://www.superphysique.net/gallery/alan.htm
http://www.superphysique.net/materials/external-resources.htm
http://www.superphysique.net/gallery/dusan.htm
http://www.superphysique.net/gallery/rudy.htm
http://www.superphysique.net/gallery/fabien-s..htm
http://www.superphysique.net/gallery/fabien-m..htm
http://www.superphysique.net/gallery/franck.htm
http://www.superphysique.net/gallery/benjamin.htm
http://www.superphysique.net/gallery/jerome.htm
http://www.superphysique.net/gallery/pierre.htm
http://www.superphysique.net/super%20physique/updates.htm
http://www.superphysique.net/materials/materials.htm
http://www.superphysique.net/appendix/appendix.htm
http://www.superphysique.net/appendix/quotes.htm
http://www.superphysique.net/appendix/copyright.htm
http://www.superphysique.net/super%20physique/about-a-propos.htm
http://www.superphysique.net/gallery/yann.htm

!Report a bug / Reporter un bug

<<email fabrice.proudhon at yahoo dot com>>

!Copyright

<html><!--Creative Commons License--><a rel="license" href="http://creativecommons.org/licenses/by/2.5/"><img alt="Creative Commons License" style="border-width: 0" src="http://i.creativecommons.org/l/by/2.5/88x31.png"/></a><br/>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5  License</a>.<!--/Creative Commons License--><!-- <rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
	<Work rdf:about="">
		<license rdf:resource="http://creativecommons.org/licenses/by/2.5/" />
	</Work>
	<License rdf:about="http://creativecommons.org/licenses/by/2.5/"><permits rdf:resource="http://web.resource.org/cc/Reproduction"/><permits rdf:resource="http://web.resource.org/cc/Distribution"/><requires rdf:resource="http://web.resource.org/cc/Notice"/><requires rdf:resource="http://web.resource.org/cc/Attribution"/><permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/></License></rdf:RDF> --></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>SITE_TITLE: TIDDLER_TITLE</title>
<meta name="description" content="SITE_SUBTITLE">
<meta name="keywords" content="TIDDLER_KEYWORDS">
<script language="JavaScript" type="text/javascript">
location.href = 'TIDDLER_URL';
</script>
<base href="TIDDLER_URL">
</head>

<body>
<noscript>
<a href="TIDDLER_URL">TIDDLER_TITLE</a>
</noscript>
TIDDLER_CONTENT
</body>
</html>
function generateSEOFiles()
{
	// last update: 2007-02-14 by Fabrice Proudhon
	// http://www.superphysique.net#%5B%5BSEO%20TiddlyWiki%20Plugin%5D%5D
        // new additions (Oct 2010) by Sotirios A Tsaftaris to allow the script to work with more special characters in tiddlers such as ?, :, ! etc.
	var originalPath = document.location.toString();
	if(originalPath.substr(0,5) != "file:") 
	{
		alert(config.messages.notFileUrlError);
		if(store.tiddlerExists(config.messages.saveInstructions))
			story.displayTiddler(null,config.messages.saveInstructions);
		return;
	}
	var y = [];
	var g = [];
	var localPath = getLocalPath(originalPath);
	var c = store.getTiddlerText("SEOTiddlyWikiConfig");
	var su = store.getTiddlerText("SiteUrl");
	var st = wikifyPlain("SiteTitle");
	var sbt = wikifyPlain("SiteSubtitle");
	var htmlPath = localPath.substr(0,localPath.lastIndexOf("\\"));
	var tiddlers = store.getTiddlers("modified","excludeSearch");
	g.push('<url><loc>' + su.htmlEncode() + '</loc></url>');
	y.push(su.htmlEncode());
	for (var t=0; t<tiddlers.length; t++) {
		var content = c;
		var filename = tiddlers[t].title.htmlEncode();
		filename = filename.toLowerCase();
		filename = filename.replace(/ |\/|@|[?]|:/gi, '-');
		filename = filename.replace(/(-)\1+/gi, '$1');
        	content = content.replace(/SITE_TITLE/gi, st.htmlEncode());
        	content = content.replace(/SITE_SUBTITLE/gi, sbt.htmlEncode());
        	content = content.replace(/TIDDLER_TITLE/gi, tiddlers[t].title.htmlEncode());
		content = content.replace(/TIDDLER_URL/gi, su.htmlEncode() + '#' + String.encodeTiddlyLink(tiddlers[t].title));
        	content = content.replace(/TIDDLER_KEYWORDS/gi, tiddlers[t].tags.join(',').htmlEncode());
        	content = content.replace(/TIDDLER_CONTENT/gi, wikifyStatic(tiddlers[t].text,null,tiddlers[t]).htmlEncode());
        	content = content.replace(/&lt;/gi, '<');
        	content = content.replace(/&gt;/gi, '>');
        	content = content.replace(/&quot;/gi, '"');
		var d = tiddlers[t].modified.getFullYear() + '-';
		if (tiddlers[t].modified.getMonth() + 1 < 10) d = d + '0';
		d = d + (tiddlers[t].modified.getMonth() + 1) + '-';
		if (tiddlers[t].modified.getDate() < 10) d = d + '0';
		d = d + tiddlers[t].modified.getDate();
		for (var ta=0; ta<tiddlers[t].tags.length; ta++) {
			var tag = tiddlers[t].tags[ta].toLowerCase();
			g.push('<url><loc>' + su.htmlEncode() + escape(tag) + '/' + escape(filename) + '.htm' + '</loc><lastmod>' + d + '</lastmod></url>');
			y.push(su.htmlEncode() + escape(tag) + '/' + escape(filename) + '.htm');
			saveFile(htmlPath + '\\' + tag + '\\' + filename + '.htm', convertUnicodeToUTF8(content));
		}
	}
	saveFile(htmlPath + '\\urllist.txt', convertUnicodeToUTF8(y.join('\n')));
	saveFile(htmlPath + '\\sitemap.xml', '<?xml version="1.0" encoding="utf-8"?><urlset xmlns="http://www.google.com/schemas/sitemap/0.9">\n' + convertUnicodeToUTF8(g.join('\n')) + '</urlset>');
	displayMessage('SEO files created', '');
}
function generateSEOFilesOLD()
{
	// last update: 2007-02-14 by Fabrice Proudhon
	// http://www.superphysique.net#%5B%5BSEO%20TiddlyWiki%20Plugin%5D%5D
	var originalPath = document.location.toString();
	if(originalPath.substr(0,5) != "file:") 
	{
		alert(config.messages.notFileUrlError);
		if(store.tiddlerExists(config.messages.saveInstructions))
			story.displayTiddler(null,config.messages.saveInstructions);
		return;
	}
	var y = [];
	var g = [];
	var localPath = getLocalPath(originalPath);
	var c = store.getTiddlerText("SEOTiddlyWikiConfig");
	var su = store.getTiddlerText("SiteUrl");
	var st = wikifyPlain("SiteTitle");
	var sbt = wikifyPlain("SiteSubtitle");
	var htmlPath = localPath.substr(0,localPath.lastIndexOf("\\"));
	var tiddlers = store.getTiddlers("modified","excludeSearch");
	g.push('<url><loc>' + su.htmlEncode() + '</loc></url>');
	y.push(su.htmlEncode());
	for (var t=0; t<tiddlers.length; t++) {
		var content = c;
		var filename = tiddlers[t].title.htmlEncode();
		filename = filename.toLowerCase();
		filename = filename.replace(/ |\/|@/gi, '-');
		filename = filename.replace(/(-)\1+/gi, '$1');
        	content = content.replace(/SITE_TITLE/gi, st.htmlEncode());
        	content = content.replace(/SITE_SUBTITLE/gi, sbt.htmlEncode());
        	content = content.replace(/TIDDLER_TITLE/gi, tiddlers[t].title.htmlEncode());
		content = content.replace(/TIDDLER_URL/gi, su.htmlEncode() + '#' + String.encodeTiddlyLink(tiddlers[t].title));
        	content = content.replace(/TIDDLER_KEYWORDS/gi, tiddlers[t].tags.join(',').htmlEncode());
        	content = content.replace(/TIDDLER_CONTENT/gi, wikifyStatic(tiddlers[t].text,null,tiddlers[t]).htmlEncode());
        	content = content.replace(/&lt;/gi, '<');
        	content = content.replace(/&gt;/gi, '>');
        	content = content.replace(/&quot;/gi, '"');
		var d = tiddlers[t].modified.getFullYear() + '-';
		if (tiddlers[t].modified.getMonth() + 1 < 10) d = d + '0';
		d = d + (tiddlers[t].modified.getMonth() + 1) + '-';
		if (tiddlers[t].modified.getDate() < 10) d = d + '0';
		d = d + tiddlers[t].modified.getDate();
		for (var ta=0; ta<tiddlers[t].tags.length; ta++) {
			var tag = tiddlers[t].tags[ta].toLowerCase();
			g.push('<url><loc>' + su.htmlEncode() + escape(tag) + '/' + escape(filename) + '.htm' + '</loc><lastmod>' + d + '</lastmod></url>');
			y.push(su.htmlEncode() + escape(tag) + '/' + escape(filename) + '.htm');
			saveFile(htmlPath + '\\' + tag + '\\' + filename + '.htm', convertUnicodeToUTF8(content));
		}
	}
	saveFile(htmlPath + '\\urllist.txt', convertUnicodeToUTF8(y.join('\n')));
	saveFile(htmlPath + '\\sitemap.xml', '<?xml version="1.0" encoding="utf-8"?><urlset xmlns="http://www.google.com/schemas/sitemap/0.84">\n' + convertUnicodeToUTF8(g.join('\n')) + '</urlset>');
	displayMessage('SEO files created', '');
}
Dr. Sotirios A. Tsaftaris was born in Thessaloniki Greece in 1978.  He currently is an Assistant Professor in the [[Area of Computer Science and Applications|http://www.imtlucca.it/faculty/current_faculty/index.php#csa_professors]] at [[IMT Institutions Markets Technologies - Institute for Advanced Studies Lucca|http://www.imtlucca.it/]] in [[Lucca, Italy|http://en.wikipedia.org/wiki/Lucca]]. Previously he was a
 Research Assistant Professor at Northwestern University, with the Departments of Electrical and Computer Engineering and Radiology.  He received his ~PhD and ~MSc from [[Northwestern University|http://www.northwestern.edu]] in June 2006 and 2003, respectively. He received his Diploma in 2000 from the Dept. of Electrical and Computer Engineering of the Aristotle University of Thessaloniki.  In 1995 he graduated from the [[Experimental high school of Aristotle University of Thessaloniki|http://web.auth.gr/piramatiko/]].

He was awarded the Murphy Fellowship of Northwestern University and the //Alexander S. Onassis Postgraduate Scholarship// from the [[Alexander S. Onassis Public Benefit Foundation|http://www.onassis.gr/]].  He was also awarded the top class award by the [[Technical Chamber of Greece (TEE)|http://www.tee.gr/]].

After his Bachelor's degree, he worked for a year as a researcher for the [[Informatics and Telematics Institute|http://www.iti.gr/]] of the [[Center for Research and Technology - Hellas|http://www.certh.gr/]].  He has published many papers on DNA computing and digital watermarking.  In parallel, he was working as a technology consultant for Gnosi Anaptyxiaki and he also participated as project leader in the start-up company Multimedia Lab of Thessaloniki.  In the past, he has also worked as a system administrator and designer for [[Antisel S.A|http://www.antisel.gr/]] and ~Makridis-Goras Sport ~Photo-Reportage Studio.

He is a member of the [[International Society for Magnetic Resonance in Medicine|http://www.ismrm.org]], [[International Society of Nanoscale Science, Computation, and Engineering|http://www.isnsce.org/]], the [[IEEE|http://www.ieee.org]], the [[Hellenic Association of Mechanical & Electrical Engineers (HAMEE)|http://www.tee.gr/teeassoc/silogoi/psdmh/index.htm]] and the [[Technical Chamber of Greece (TEE)|http://www.tee.gr/]].

He has consulted for a number of companies and non-profits.

He has also served for numerous committees for the EECS department and Northwestern University. Some of those are, the Computing Facilities, the Graduate and the Curriculum Committee of the ECE Department and the Graduate Student Advisor Committee of the ~McCormick School of Engineering and Applied Sciences.

At Northwestern he also taught EECS 202. See [[Teaching]] for more details.

He speaks English and French. He has experience in biotechnology, imaging modalities for nanotechnology, MPEG engineering and has an excellent knowledge of programming languages such as C, C++, and Matlab.

His main research interests are DNA computing, bioinformatics and nanotechnology and commercialization of those as well as in MRI, molecular and cellular imaging, and nano-imaging. He is also interested in Digital Watermarking, International Standards, Image and Video Coding, Video Editing, Computer Networking. 

See [[Curriculum Vitae]] and [[NIH Style Biosketch]] for more details.

//A little name disambiguation: My name in greek is Σωτήριος Τσαυτάρης, which in English is translated to Sotirios Tsaftaris. Most people call me either Sotiris or Sotos, (from the greek Σώτος or Σωτήρης). //

These are my publications related to simulating DNA databases.
<<listTags Simulation>>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|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)};
//}}}
//{{{
// sotos test: Eric this the idea that i have:
// var localSafari = config.browser.isSafari && !(config.userAgent.indexOf("Chrome") != -1);
// for now revert to Eric's implementation until Eric sees this. This is just a demo!. Eric the bug appears to be for Safari 1.3, after that I think it was fixed. 
// Maybe you can put a check for safari earlier than version 2 // or smth, in the spirit of the isBadSafari flag.
// var localSafari = config.browser.isSafari;
// since eric has not seen it yet, I am reverting to using localSafari as the isBadSafari
var localSafari = config.browser.isBadSafari;

config.paramifiers.SPM = { onstart: function(v) {
	config.options.chkSinglePageMode=eval(v);
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !localSafari) {
		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 && !localSafari) {
		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;
}
//}}}
Ph.D<<tiddler ToggleRightSidebar with:".">>
Sotirios ([[SoToS|About Me]]) Tsaftaris
http://users.eecs.northwestern.edu/~stsaft/
/***
|''Name:''|SparklinePlugin|
|''Description:''|Sparklines macro|
***/
//{{{
if(!version.extensions.SparklinePlugin) {
version.extensions.SparklinePlugin = {installed:true};

//--
//-- Sparklines
//--

config.macros.sparkline = {};
config.macros.sparkline.handler = function(place,macroName,params)
{
    var data = [];
    var min = 0;
    var max = 0;
    var v;
    for(var t=0; t<params.length; t++) {
        v = parseInt(params[t]);
        if(v < min)
            min = v;
        if(v > max)
            max = v;
        data.push(v);
    }
    if(data.length < 1)
        return;
    var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
    box.title = data.join(",");
    var w = box.offsetWidth;
    var h = box.offsetHeight;
    box.style.paddingRight = (data.length * 2 - w) + "px";
    box.style.position = "relative";
    for(var d=0; d<data.length; d++) {
        var tick = document.createElement("img");
        tick.border = 0;
        tick.className = "sparktick";
        tick.style.position = "absolute";
        tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
        tick.style.left = d*2 + "px";
        tick.style.width = "2px";
        v = Math.floor(((data[d] - min)/(max-min)) * h);
        tick.style.top = (h-v) + "px";
        tick.style.height = v + "px";
        box.appendChild(tick);
    }
};


}
//}}}
.viewer img { padding-left:1em; padding-right:1em; }
/*{{{*/ 
#headerSearch {
     position: absolute;
     top: 68px;
     right: 20px;

}
#headerSearch a {
     border: none;
}
/*}}}*/ 
/***
!Colors Used
*@@bgcolor(#8cf): #8cf - Background blue@@
*@@bgcolor(#18f): #18f - Top blue@@
*@@bgcolor(#04b): #04b - Mid blue@@
*@@bgcolor(#014):color(#fff): #014 - Bottom blue@@
*@@bgcolor(#ffc): #ffc - Bright yellow@@
*@@bgcolor(#fe8): #fe8 - Highlight yellow@@
*@@bgcolor(#db4): #db4 - Background yellow@@
*@@bgcolor(#841): #841 - Border yellow@@
*@@bgcolor(#703):color(#fff): #703 - Title red@@
*@@bgcolor(#866): #866 - Subtitle grey@@
!Generic Rules /%==============================================%/
***/
/*{{{*/
body {
    background: #fff;
    color: #000;
}

a{
    color: #04b;
}

a:hover{
    background: #04b;
    color: #fff;
}

a img{
    border: 0;
}

h1,h2,h3,h4,h5 {
    color: #703;
    background: #8cf;
}

.button {
    color: #014;
    border: 1px solid #fff;
}

.button:hover {
    color: #014;
    background: #fe8;
    border-color: #db4;
}

.button:active {
    color: #fff;
    background: #db4;
    border: 1px solid #841;
}

/*}}}*/
/***
!Header /%==================================================%/
***/
/*{{{*/
.header {
    background: #04b;
}

.headerShadow {
    color: #000;
}

.headerShadow a {
    font-weight: normal;
    color: #000;
}

.headerForeground {
    color: #fff;
}

.headerForeground a {
    font-weight: normal;
    color: #8cf;
}

/*}}}*/
/***
!General tabs /%=================================================%/
***/
/*{{{*/

.tabSelected{
    color: #014;
    background: #eee;
    border-left: 1px solid #ccc;
    border-top: 1px solid #ccc;
    border-right: 1px solid #ccc;
}

.tabUnselected {
    color: #fff;
    background: #999;
}

.tabContents {
    color: #014;
    background: #eee;
    border: 1px solid #ccc;
}

.tabContents .button {
     border: 0;}

/*}}}*/
/***
!Sidebar options /%=================================================%/
~TiddlyLinks and buttons are treated identically in the sidebar and slider panel
***/
/*{{{*/
#sidebar {
}

#sidebarOptions input {
    border: 1px solid #04b;
}

#sidebarOptions .sliderPanel {
    background: #8cf;
}

#sidebarOptions .sliderPanel a {
    border: none;
    color: #04b;
}

#sidebarOptions .sliderPanel a:hover {
    color: #fff;
    background: #04b;
}

#sidebarOptions .sliderPanel a:active {
    color: #04b;
    background: #fff;
}
/*}}}*/
/***
!Message Area /%=================================================%/
***/
/*{{{*/
#messageArea {
    border: 1px solid #841;
    background: #db4;
    color: #014;
}

#messageArea .button {
    padding: 0.2em 0.2em 0.2em 0.2em;
    color: #014;
    background: #fff;
}

/*}}}*/
/***
!Popup /%=================================================%/
***/
/*{{{*/
.popup {
    background: #18f;
    border: 1px solid #04b;
}

.popup hr {
    color: #014;
    background: #014;
    border-bottom: 1px;
}

.popup li.disabled {
    color: #04b;
}

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

.popup li a:hover {
    background: #014;
    color: #fff;
    border: none;
}
/*}}}*/
/***
!Tiddler Display /%=================================================%/
***/
/*{{{*/
.tiddler .defaultCommand {
 font-weight: bold;
}

.shadow .title {
    color: #866;
}

.title {
    color: #703;
}

.subtitle {
    color: #866;
}

.toolbar {
    color: #04b;
}

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

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

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

.tagging .button, .tagged .button {
        border: none;
}

.footer {
    color: #ddd;
}

.selected .footer {
    color: #888;
}

.sparkline {
    background: #8cf;
    border: 0;
}

.sparktick {
    background: #014;
}

.errorButton {
    color: #ff0;
    background: #f00;
}

.cascade {
    background: #eef;
    color: #aac;
    border: 1px solid #aac;
}

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

/*}}}*/
/***
''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/
***/
/*{{{*/

.viewer .listTitle {list-style-type: none; margin-left: -2em;}

.viewer .button {
    border: 1px solid #db4;
}

.viewer blockquote {
    border-left: 3px solid #666;
}

.viewer table {
    border: 2px solid #333;
}

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

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

.viewer pre {
    border: 1px solid #fe8;
    background: #ffc;
}

.viewer code {
    color: #703;
}

.viewer hr {
    border: 0;
    border-top: dashed 1px #666;
    color: #666;
}

.highlight, .marked {
    background: #fe8;
}
/*}}}*/
/***
''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/
***/
/*{{{*/
.editor input {
    border: 1px solid #04b;
}

.editor textarea {
    border: 1px solid #04b;
    width: 100%;
}

.editorFooter {
    color: #aaa;
}

/*}}}*/
/*{{{*/
#tiddlersBar .button {border:0}
#tiddlersBar .tab {white-space:wrap}
#tiddlersBar {padding : 1em 0.5em 2px 0.5em}
.tabUnselected .tabButton, .tabSelected .tabButton {padding : 0 2px 0 2px; margin: 0 0 0 4px;}
.tiddler, .tabContents {border:1px [[ColorPalette::TertiaryPale]] solid;}
/*}}}*/
<<list all>>
<<tabs txtMoreTab Missing 'Missing tiddlers' TabMoreMissing Orphans 'Orphaned tiddlers' TabMoreOrphans Shadowed 'Shadowed tiddlers' TabMoreShadowed>>
Currently I am not teaching any classes at IMT.

At Northwestern I taught [[EECS202 Introduction to Electrical Engineering|http://www.eecs.northwestern.edu/courses/eecs-202.html]]. Usually four professors co-teach the class. Each professor was responsible for a set of lectures. I taught in 11 lectures, material that relates to Signals, Systems, and Communications.  This class is very interesting since it aims to introduce EE to a diverse classroom audience. The audience is comprised from EE, CE, CS sophomores, undecided sophomores/freshmen, and seniors from basically every major our engineering school offers. 

The class also has a mandatory lab, where students are practicing what they learn in class on the innards of a CD player.

This class is a challenge for the professor, since it has to keep the material interesting and attractive without resorting to theory. Lectures are filled by applications and in-class demos.  

I use powerpoint for my lectures and write on the board some examples and mathematical derivations. I also give a student a [[LiveScribe pen|http://www.livescribe.com]] to take [["livenotes" or "penscasts"|http://eecs202.notlong.com]] while I am teaching, so the users have an audio-text synced snapshot of the lecture. My teaching style is very interactive, since I keep asking students questions and we jointly develop the lecture. It is very much affected by the [[Socratic Method|http://en.wikipedia.org/wiki/Socratic_method]].
* S.A. Tsaftaris, "//~DNA-Based Storage and Retrieval of Digital Signals//," ~PhD Dissertation, Northwestern University, Department of Electrical and Computer Engineering, Advisor Dr. Katsaggelos, May 2006.
* S.A. Tsaftaris, "//~DNA-Based Digital Signal Processing//," ~MSc Thesis, Northwestern University, Department of Electrical and Computer Engineering, Advisor Dr. Katsaggelos, May 2003.
* S.A. Tsaftaris, "//Copyright protection of MPEG 1&2 Video Sequences using digital watermarking//," Diploma Thesis (in Greek), Aristotle University of Thessaloniki, Department of Electrical and Computer Engineering, Advisor Dr. Strintzis, June 2000.
/***
|''Name:''|TiddlersBarPlugin|
|''Description:''|A bar to switch between tiddlers through tabs (like browser tabs bar).|
|''Version:''|1.2.5|
|''Date:''|Jan 18,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demos
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], open several tiddlers to use the tabs bar.
!Installation
#import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
#save and reload
#''if you're using a custom [[PageTemplate]]'', add {{{<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>}}} before {{{<div id='tiddlerDisplay'></div>}}}
#optionally, adjust StyleSheetTiddlersBar
!Tips
*Doubleclick on the tiddlers bar (where there is no tab) create a new tiddler.
*Tabs include a button to close {{{x}}} or save {{{!}}} their tiddler.
*By default, click on the current tab close all others tiddlers.
!Configuration options 
<<option chkDisableTabsBar>> Disable the tabs bar (to print, by example).
<<option chkHideTabsBarWhenSingleTab >> Automatically hide the tabs bar when only one tiddler is displayed. 
<<option txtSelectedTiddlerTabButton>> ''selected'' tab command button.
<<option txtPreviousTabKey>> previous tab access key.
<<option txtNextTabKey>> next tab access key.
!Code
***/
//{{{
config.options.chkDisableTabsBar = config.options.chkDisableTabsBar ? config.options.chkDisableTabsBar : false;
config.options.chkHideTabsBarWhenSingleTab  = config.options.chkHideTabsBarWhenSingleTab  ? config.options.chkHideTabsBarWhenSingleTab  : false;
config.options.txtSelectedTiddlerTabButton = config.options.txtSelectedTiddlerTabButton ? config.options.txtSelectedTiddlerTabButton : "closeOthers";
config.options.txtPreviousTabKey = config.options.txtPreviousTabKey ? config.options.txtPreviousTabKey : "";
config.options.txtNextTabKey = config.options.txtNextTabKey ? config.options.txtNextTabKey : "";
config.macros.tiddlersBar = {
	tooltip : "see ",
	tooltipClose : "click here to close this tab",
	tooltipSave : "click here to save this tab",
	promptRename : "Enter tiddler new name",
	currentTiddler : "",
	previousState : false,
	previousKey : config.options.txtPreviousTabKey,
	nextKey : config.options.txtNextTabKey,	
	tabsAnimationSource : null, //use document.getElementById("tiddlerDisplay") if you need animation on tab switching.
	handler: function(place,macroName,params) {
		var previous = null;
		if (config.macros.tiddlersBar.isShown())
			story.forEachTiddler(function(title,e){
				if (title==config.macros.tiddlersBar.currentTiddler){
					var d = createTiddlyElement(null,"span",null,"tab tabSelected");
					config.macros.tiddlersBar.createActiveTabButton(d,title);
					if (previous && config.macros.tiddlersBar.previousKey) previous.setAttribute("accessKey",config.macros.tiddlersBar.nextKey);
					previous = "active";
				}
				else {
					var d = createTiddlyElement(place,"span",null,"tab tabUnselected");
					var btn = createTiddlyButton(d,title,config.macros.tiddlersBar.tooltip + title,config.macros.tiddlersBar.onSelectTab);
					btn.setAttribute("tiddler", title);
					if (previous=="active" && config.macros.tiddlersBar.nextKey) btn.setAttribute("accessKey",config.macros.tiddlersBar.previousKey);
					previous=btn;
				}
				var isDirty =story.isDirty(title);
				var c = createTiddlyButton(d,isDirty ?"!":"x",isDirty?config.macros.tiddlersBar.tooltipSave:config.macros.tiddlersBar.tooltipClose, isDirty ? config.macros.tiddlersBar.onTabSave : config.macros.tiddlersBar.onTabClose,"tabButton");
				c.setAttribute("tiddler", title);
				if (place.childNodes) {
					place.insertBefore(document.createTextNode(" "),place.firstChild); // to allow break line here when many tiddlers are open
					place.insertBefore(d,place.firstChild); 
				}
				else place.appendChild(d);
			})
	}, 
	refresh: function(place,params){
		removeChildren(place);
		config.macros.tiddlersBar.handler(place,"tiddlersBar",params);
		if (config.macros.tiddlersBar.previousState!=config.macros.tiddlersBar.isShown()) {
			story.refreshAllTiddlers();
			if (config.macros.tiddlersBar.previousState) story.forEachTiddler(function(t,e){e.style.display="";});
			config.macros.tiddlersBar.previousState = !config.macros.tiddlersBar.previousState;
		}
	},
	isShown : function(){
		if (config.options.chkDisableTabsBar) return false;
		if (!config.options.chkHideTabsBarWhenSingleTab) return true;
		var cpt=0;
		story.forEachTiddler(function(){cpt++});
		return (cpt>1);
	},
	selectNextTab : function(){  //used when the current tab is closed (to select another tab)
		var previous="";
		story.forEachTiddler(function(title){
			if (!config.macros.tiddlersBar.currentTiddler) {
				story.displayTiddler(null,title);
				return;
			}
			if (title==config.macros.tiddlersBar.currentTiddler) {
				if (previous) {
					story.displayTiddler(null,previous);
					return;
				}
				else config.macros.tiddlersBar.currentTiddler=""; 	// so next tab will be selected
			}
			else previous=title;
			});		
	},
	onSelectTab : function(e){
		var t = this.getAttribute("tiddler");
		if (t) story.displayTiddler(null,t);
		return false;
	},
	onTabClose : function(e){
		var t = this.getAttribute("tiddler");
		if (t) {
			if(story.hasChanges(t) && !readOnly) {
				if(!confirm(config.commands.cancelTiddler.warning.format([t])))
				return false;
			}
			story.closeTiddler(t);
		}
		return false;
	},
	onTabSave : function(e) {
		var t = this.getAttribute("tiddler");
		if (!e) e=window.event;
		if (t) config.commands.saveTiddler.handler(e,null,t);
		return false;
	},
	onSelectedTabButtonClick : function(event,src,title) {
		var t = this.getAttribute("tiddler");
		if (!event) event=window.event;
		if (t && config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton])
			config.commands[config.options.txtSelectedTiddlerTabButton].handler(event, src, t);
		return false;
	},
	onTiddlersBarAction: function(event) {
		var source = event.target ? event.target.id : event.srcElement.id; // FF uses target and IE uses srcElement;
		if (source=="tiddlersBar") story.displayTiddler(null,'New Tiddler',DEFAULT_EDIT_TEMPLATE,false,null,null);
	},
	createActiveTabButton : function(place,title) {
		if (config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton]) {
			var btn = createTiddlyButton(place, title, config.commands[config.options.txtSelectedTiddlerTabButton].tooltip ,config.macros.tiddlersBar.onSelectedTabButtonClick);
			btn.setAttribute("tiddler", title);
		}
		else
			createTiddlyText(place,title);
	}
}

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

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

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

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

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

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

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

//}}}
The tiddler 'TiddlyWiki' doesn't yet exist. Double-click to create it
Collection of nice TiddlyWiki pages with either nice templates, plugins, tips, info, etc
* For a nice example of a TiddlyWiki page see [[Frank Dellaert's|http://www-static.cc.gatech.edu/~dellaert/]] web site.
* [[TiddlyWiki Tips|http://tiddlywikitips.com/]]
* [[Mahesh's page|http://www.cse.msu.edu/~arumugam/]]
TiddlyWiki is encoded in ~UTF-8. If another encoding is chosen some errors could arise.  Although the html code is encoded to set the encoding for ~UTF-8 some web servers disregard that.  A possible fix is suggested at the TiddlyWiki site although I find it rather technical.  For a quick fix check the 2nd to last message on [[Google Groups|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/951913058c915f6d/9590409cc07cebda?lnk=st&q=tiddlywiki+encoding+UTF-8&rnum=3#9590409cc07cebda]]. For ease I quote here the content "In the subdirectory where I serve the tiddlywiki file, I created a file called ".htaccess". In this file I placed a single line: ~AddCharset ~UTF-8 .html What this does is force all *.html files in that subdirectory (and child subdirectories too) to be served as ~UTF-8. "
/%
!info
|Name|ToggleRightSidebar|
|Source|http://www.TiddlyTools.com/#ToggleRightSidebar|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|show/hide right sidebar (SideBarOptions)|
Usage
<<<
{{{
<<tiddler ToggleRightSidebar>>
<<tiddler ToggleRightSidebar with: label tooltip>>
}}}
Try it: <<tiddler ToggleRightSidebar##show
	with: {{config.options.chkShowRightSidebar?'►':'◄'}}>>
<<<
Configuration:
<<<
copy/paste the following settings into a tiddler tagged with <<tag systemConfig>> and then modify the values to suit your preferences:
{{{
config.options.chkShowRightSidebar=true;
config.options.txtToggleRightSideBarLabelShow="◄";
config.options.txtToggleRightSideBarLabelHide="►";
}}}
<<<
!end
!show
<<tiddler {{
	var co=config.options;
	if (co.chkShowRightSidebar===undefined) co.chkShowRightSidebar=true;
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {
		sb.style.display=co.chkShowRightSidebar?'block':'none';
		da.style.marginRight=co.chkShowRightSidebar?'':'1em';
	}
'';}}>><html><nowiki><a href='javascript:;' title="$2"
onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
onclick="
	var co=config.options;
	var opt='chkShowRightSidebar';
	var show=co[opt]=!co[opt];
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {
		sb.style.display=show?'block':'none';
		da.style.marginRight=show?'':'1em';
	}
	saveOptionCookie(opt);
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
	if (this.innerHTML==labelShow||this.innerHTML==labelHide) 
		this.innerHTML=show?labelHide:labelShow;
	this.title=(show?'hide':'show')+' right sidebar';
	var sm=document.getElementById('storyMenu');
	if (sm) config.refreshers.content(sm);
	return false;
">$1</a></html>
!end
%/<<tiddler {{
	var src='ToggleRightSidebar';
	src+(tiddler&&tiddler.title==src?'##info':'##show');
}} with: {{
	var co=config.options;
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
	'$1'!='$'+'1'?'$1':(co.chkShowRightSidebar?labelHide:labelShow);
}} {{
	var tip=(config.options.chkShowRightSidebar?'hide':'show')+' right sidebar';
	'$2'!='$'+'2'?'$2':tip;
}}>>
!Research Stuff
* I work on [[MATLAB|http://www.mathworks.com]] and ''C/C++''.
* I use ''UNIX'' and ''Perl'' scripts to get things done.
* I mostly work on ''Windows'' but run code on ''linux''.
* I write my papers/documents on --MS Word-- ~LaTeX.  Shout out to the [[MikTeX|http://www.miktex.org/]] Developing team and [[WinEDT|http://www.winedt.com/]].
* I write grant proposals on MS Word though. I wish latex had good and easy collaboration functionality. I wish [[MonkeyTex|http://monkeytex.bradcater.webfactional.com/]] will get better.
* I write my web pages in --HTML-- ~TiddlyWiki. ~TiddlyWiki allows you to have a non-linear website. See [[About This Site]]
* Love Chrome --Firefox-- and --Eudora-- --Thunderbird-- GMAIL.
* Visit [[del.icio.us|http://del.icio.us/sotos]] my ''Favorite Bookmarking Service'' and see my very own bookmarks.
* The best way to keep track of your literature and papers is ''~CiteULike''. See my collection at [[My CiteUlike|http://www.citeulike.org/user/stsaft]]. I also use [[Mendeley|http://www.mendeley.com/profiles/sotirios-tsaftaris/]].
!Favorite Apps
* [[Launchy|http://www.launchy.net]]: The Open Source Keystroke Launcher for Windows
* [[UltraMon|http://ww.realtimesoft.com/ultramon/]]: Best $$ software for management of multiple displays.
* [[TeamViewer|http://www.teamviewer.com/index.aspx]]: Remote Desktop application, similar to VNC. Great for admin or helping out a friend from far away.
* [[Skype|http://www.skype.com]]
* [[Notepad++|http://notepad-plus-plus.org/]] --PSPad-- editor: Great Free Text Editor
* [[ExpanDrive/SftpDrive|http://www.expandrive.com/windows]]: $$ App that maps an SFTP server as a hard drive in windows.
* My backup solution: [[Mozy|http://www.mozy.com]] to backup to a server the most important files, and an external HD backing up all my data weekly with [[xxcopy|http://www.xxcopy.com/index.htm]].
* I used to use Windows Live Sync, but know that Microsoft decided to denounce XP users from their support, I have to find a new solution.
* MediaCoder: The best and easiest to use media converter.
This as a new effort in collaboration with Professors Ying Wu and Katsaggelos funded by the US Department of Transportation.  Our goal is to use computer vision and tracking to track vehicles and analyze their trajectories to study congestion propagation patterns.

We also work on content aware enhancements of the H.264 video compression standard such that it performs better with tracking applications in mind.
My name is Sotirios A. Tsaftaris but most people call me @@''Sotos''@@.  I am currently an Assistant Professor in the [[Area of Computer Science and Applications|http://www.imtlucca.it/faculty/current_faculty/index.php#csa_professors]] at [[IMT Institutions Markets Technologies - Institute for Advanced Studies Lucca|http://www.imtlucca.it/]] in [[Lucca, Italy|http://en.wikipedia.org/wiki/Lucca]]. Previously I held a joint Research Assistant Professor appointment at [[Northwestern University|http://www.northwestern.edu]] with the Departments of [[Electrical Engineering and Computer Science|http://www.eecs.northwestern.edu/]] and [[Radiology Feinberg School of Medicine|http://www.radiology.northwestern.edu/]].  

I am a core faculty of the Pattern Recognition and Image Analysis Unit ([[PRIAn|http://www.imtlucca.it/research/computer_science_and_applications.php#research_units_projects]]).

You might be interested in [[My Research]] and [[Publications]].  I also use [[LinkedIn|http://www.linkedin.com/pub/0/92b/291]] to manage my professional contacts.

@@''~PostDoc Positions Available''@@ We are looking for talented PostDocs at IMT in the areas of Brain Imaging and Complex Networks. Please see [[Openings]] for details.

[>img[IEEE Signal Processing COVER|http://ieeexplore.ieee.org/ielx5/79/5753066/5753066.jpg]] @@''MATISSE ON THE COVER''@@: Work on [[Digital Restoration of Paintings]] appeared on the cover of the [[May 2011 issue of the IEEE Signal Processing Magazine|http://ieeexplore.ieee.org/xpl/tocresult.jsp?isnumber=5753066]]
/***
|''Name:''|YourSearchPlugin|
|''Version:''|2.1.5 (2010-02-16)|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2010 [[abego Software|http://www.abego-software.de]]|
|''~CoreVersion:''|2.1.0|
|''Community:''|[[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23YourSearchPlugin]]|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!

For more information see [[Help|YourSearch Help]].
!Compatibility
This plugin requires TiddlyWiki 2.1. 
Check the [[archive|http://tiddlywiki.abego-software.de/archive]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.
!Source Code
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/Plugin-YourSearch-src.2.1.5.js]] to get the readable source code.
***/
///%
if(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:5,source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin",licence:"[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",copyright:"Copyright (c) abego Software GmbH, 2005-2010 (www.abego-software.de)"};if(!window.abego){window.abego={};}if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,_4=_1.length;i<_4;i++){_2.call(_3,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,_7=this.length;i<_7;i++){_5.call(_6,this[i],i,this);}};}abego.toInt=function(s,_8){if(!s){return _8;}var n=parseInt(s);return (n==NaN)?_8:n;};abego.createEllipsis=function(_9){var e=createTiddlyElement(_9,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_a){if(!_a){return _a;}var _b={};for(var n in _a){_b[n]=_a[n];}return _b;};abego.copyOptions=function(_c){return !_c?{}:abego.shallowCopy(_c);};abego.countStrings=function(_d,s){if(!s){return 0;}var _e=s.length;var n=0;var _f=0;while(1){var i=_d.indexOf(s,_f);if(i<0){return n;}n++;_f=i+_e;}return n;};abego.getBracedText=function(_10,_11,_12){if(!_11){_11=0;}var re=/\{([^\}]*)\}/gm;re.lastIndex=_11;var m=re.exec(_10);if(m){var s=m[1];var _13=abego.countStrings(s,"{");if(!_13){if(_12){_12.lastIndex=re.lastIndex;}return s;}var len=_10.length;for(var i=re.lastIndex;i<len&&_13;i++){var c=_10.charAt(i);if(c=="{"){_13++;}else{if(c=="}"){_13--;}}}if(!_13){if(_12){_12.lastIndex=i-1;}return _10.substring(m.index+1,i-1);}}};abego.select=function(_14,_15,_16,_17){if(!_17){_17=[];}_14.forEach(function(t){if(_15.call(_16,t)){_17.push(t);}});return _17;};abego.consumeEvent=function(e){if(e.stopPropagation){e.stopPropagation();}if(e.preventDefault){e.preventDefault();}e.cancelBubble=true;e.returnValue=true;};abego.TiddlerFilterTerm=function(_18,_19){if(!_19){_19={};}var _1a=_18;if(!_19.textIsRegExp){_1a=_18.escapeRegExp();if(_19.fullWordMatch){_1a="\\b"+_1a+"\\b";}}var _1b=new RegExp(_1a,"m"+(_19.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_1b,_19.fields,_19.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_1c){return this.tester.test(_1c);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\.(?:\s+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}var _1d=m[2]?m[2].trim():"";r.push({name:"text",value:_1d});r[0].text=[_1d];return {title:m[1].trim(),params:r};}else{return {title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_1e,_1f,_20){var re=/\s*(?:(?:\{([^\}]*)\})|(?:(=)|([#%!])|(?:(\w+)\s*\:(?!\/\/))|(?:(?:("(?:(?:\\")|[^"])+")|(?:\/((?:(?:\\\/)|[^\/])+)\/)|(\w+\:\/\/[^\s]+)|([^\s\)\-\"]+)))))/mg;var _21={"!":"title","%":"text","#":"tags"};var _22={};var _23;re.lastIndex=_1f;while(1){var i=re.lastIndex;var m=re.exec(_1e);if(!m||m.index!=i){throw "Word or String literal expected";}if(m[1]){var _24={};var _25=abego.getBracedText(_1e,0,_24);if(!_25){throw "Invalid {...} syntax";}var f=Function("tiddler","return ("+_25+");");return {func:f,lastIndex:_24.lastIndex,markRE:null};}if(m[2]){_23=true;}else{if(m[3]){_22[_21[m[3]]]=1;}else{if(m[4]){_22[m[4]]=1;}else{var _26=m[6];var _27=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _20=abego.copyOptions(_20);_20.fullWordMatch=_23;_20.textIsRegExp=_26;var _28=[];for(var n in _22){_28.push(n);}if(_28.length==0){_20.fields=_20.defaultFields;}else{_20.fields=_28;_20.withExtendedFields=false;}var _29=new abego.TiddlerFilterTerm(_27,_20);var _2a=_26?_27:_27.escapeRegExp();if(_2a&&_23){_2a="\\b"+_2a+"\\b";}return {func:function(_2b){return _29.test(_2b);},lastIndex:re.lastIndex,markRE:_2a?"(?:"+_2a+")":null};}}}}};abego.BoolExp=function(s,_2c,_2d){this.s=s;var _2e=_2d&&_2d.defaultOperationIs_OR;var _2f=/\s*(?:(\-|not)|(\())/gi;var _30=/\s*\)/g;var _31=/\s*(?:(and|\&\&)|(or|\|\|))/gi;var _32=/\s*[^\)\s]/g;var _33=/\s*(\-|not)?(\s*\()?/gi;var _34;var _35=function(_36){_33.lastIndex=_36;var m=_33.exec(s);var _37;var _38;if(m&&m.index==_36){_36+=m[0].length;_37=m[1];if(m[2]){var e=_34(_36);_30.lastIndex=e.lastIndex;if(!_30.exec(s)){throw "Missing ')'";}_38={func:e.func,lastIndex:_30.lastIndex,markRE:e.markRE};}}if(!_38){_38=_2c(s,_36,_2d);}if(_37){_38.func=(function(f){return function(_39){return !f(_39);};})(_38.func);_38.markRE=null;}return _38;};_34=function(_3a){var _3b=_35(_3a);while(1){var l=_3b.lastIndex;_31.lastIndex=l;var m=_31.exec(s);var _3c;var _3d;if(m&&m.index==l){_3c=!m[1];_3d=_35(_31.lastIndex);}else{try{_3d=_35(l);}catch(e){return _3b;}_3c=_2e;}_3b.func=(function(_3e,_3f,_40){return _40?function(_41){return _3e(_41)||_3f(_41);}:function(_42){return _3e(_42)&&_3f(_42);};})(_3b.func,_3d.func,_3c);_3b.lastIndex=_3d.lastIndex;if(!_3b.markRE){_3b.markRE=_3d.markRE;}else{if(_3d.markRE){_3b.markRE=_3b.markRE+"|"+_3d.markRE;}}}};var _43=_34(0);this.evalFunc=_43.func;if(_43.markRE){this.markRegExp=new RegExp(_43.markRE,_2d.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_44,_45){this.re=re;this.fields=_44?_44:["title","text","tags"];this.withExtendedFields=_45;};abego.MultiFieldRegExpTester.prototype.test=function(_46){var re=this.re;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_46,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}if(this.withExtendedFields){return store.forEachField(_46,function(_47,_48,_49){return typeof _49=="string"&&re.test(_49)?_48:null;},true);}return null;};abego.TiddlerQuery=function(_4a,_4b,_4c,_4d,_4e){if(_4c){this.regExp=new RegExp(_4a,_4b?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_4d,_4e);}else{this.expr=new abego.BoolExp(_4a,abego.parseTiddlerFilterTerm,{defaultFields:_4d,caseSensitive:_4b,withExtendedFields:_4e});}this.getQueryText=function(){return _4a;};this.getUseRegExp=function(){return _4c;};this.getCaseSensitive=function(){return _4b;};this.getDefaultFields=function(){return _4d;};this.getWithExtendedFields=function(){return _4e;};};abego.TiddlerQuery.prototype.test=function(_4f){if(!_4f){return false;}if(this.regExp){return this.tester.test(_4f);}return this.expr.exec(_4f);};abego.TiddlerQuery.prototype.filter=function(_50){return abego.select(_50,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return (this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_51){this.items=_51;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_52){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_53){this.firstIndexOnPage=Math.min(Math.max(0,_53),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_54,_55){},renderPage:function(_56){if(_56.beginRendering){_56.beginRendering(this);}try{if(this.getItemsCount()){var _57=this.getLastIndexOnPage();var _58=-1;for(var i=this.getFirstIndexOnPage();i<=_57;i++){_58++;_56.render(this,this.items[i],i,_58);}}}finally{if(_56.endRendering){_56.endRendering(this);}}},addPageNavigation:function(_59){if(!this.getItemsCount()){return;}var _5a=this;var _5b=function(e){if(!e){var e=window.event;}abego.consumeEvent(e);var _5c=abego.toInt(this.getAttribute("page"),0);var _5d=_5a.getCurrentPageIndex();if(_5c==_5d){return;}var _5e=_5c*_5a.getItemsPerPage();_5a.setFirstIndexOnPage(_5e);_5a.onPageChanged(_5c,_5d);};var _5f;var _60=this.getCurrentPageIndex();var _61=this.getLastPageIndex();if(_60>0){_5f=createTiddlyButton(_59,"Previous","Go to previous page (Shortcut: Alt-'<')",_5b,"prev");_5f.setAttribute("page",(_60-1).toString());_5f.setAttribute("accessKey","<");}for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _62=_60+i;if(_62<0){continue;}if(_62>_61){break;}var _63=(i+_60+1).toString();var _64=_62==_60?"currentPage":"otherPage";_5f=createTiddlyButton(_59,_63,"Go to page %0".format([_63]),_5b,_64);_5f.setAttribute("page",(_62).toString());}if(_60<_61){_5f=createTiddlyButton(_59,"Next","Go to next page (Shortcut: Alt-'>')",_5b,"next");_5f.setAttribute("page",(_60+1).toString());_5f.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _65=40;var _66=4;var _67=function(_68,_69,_6a){var n=_68.length;if(n==0){_68.push({start:_69,end:_6a});return;}var i=0;for(;i<n;i++){var _6b=_68[i];if(_6b.start<=_6a&&_69<=_6b.end){var r;var _6c=i+1;for(;_6c<n;_6c++){r=_68[_6c];if(r.start>_6a||_69>_6b.end){break;}}var _6d=_69;var _6e=_6a;for(var j=i;j<_6c;j++){r=_68[j];_6d=Math.min(_6d,r.start);_6e=Math.max(_6e,r.end);}_68.splice(i,_6c-i,{start:_6d,end:_6e});return;}if(_6b.start>_6a){break;}}_68.splice(i,0,{start:_69,end:_6a});};var _6f=function(_70){var _71=0;for(var i=0;i<_70.length;i++){var _72=_70[i];_71+=_72.end-_72.start;}return _71;};var _73=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _74=function(s,_75){if(!_73(s[_75])){return null;}for(var i=_75-1;i>=0&&_73(s[i]);i--){}var _76=i+1;var n=s.length;for(i=_75+1;i<n&&_73(s[i]);i++){}return {start:_76,end:i};};var _77=function(s,_78,_79){var _7a;if(_79){_7a=_74(s,_78);}else{if(_78<=0){return _78;}_7a=_74(s,_78-1);}if(!_7a){return _78;}if(_79){if(_7a.start>=_78-_66){return _7a.start;}if(_7a.end<=_78+_66){return _7a.end;}}else{if(_7a.end<=_78+_66){return _7a.end;}if(_7a.start>=_78-_66){return _7a.start;}}return _78;};var _7b=function(s,_7c){var _7d=[];if(_7c){var _7e=0;var n=s.length;var _7f=0;do{_7c.lastIndex=_7e;var _80=_7c.exec(s);if(_80){if(_7e<_80.index){var t=s.substring(_7e,_80.index);_7d.push({text:t});}_7d.push({text:_80[0],isMatch:true});_7e=_80.index+_80[0].length;}else{_7d.push({text:s.substr(_7e)});break;}}while(true);}else{_7d.push({text:s});}return _7d;};var _81=function(_82){var _83=0;for(var i=0;i<_82.length;i++){if(_82[i].isMatch){_83++;}}return _83;};var _84=function(s,_85,_86,_87,_88){var _89=Math.max(Math.floor(_88/(_87+1)),_65);var _8a=Math.max(_89-(_86-_85),0);var _8b=Math.min(Math.floor(_86+_8a/3),s.length);var _8c=Math.max(_8b-_89,0);_8c=_77(s,_8c,true);_8b=_77(s,_8b,false);return {start:_8c,end:_8b};};var _8d=function(_8e,s,_8f){var _90=[];var _91=_81(_8e);var pos=0;for(var i=0;i<_8e.length;i++){var t=_8e[i];var _92=t.text;if(t.isMatch){var _93=_84(s,pos,pos+_92.length,_91,_8f);_67(_90,_93.start,_93.end);}pos+=_92.length;}return _90;};var _94=function(s,_95,_96){var _97=_96-_6f(_95);while(_97>0){if(_95.length==0){_67(_95,0,_77(s,_96,false));return;}else{var _98=_95[0];var _99;var _9a;if(_98.start==0){_99=_98.end;if(_95.length>1){_9a=_95[1].start;}else{_67(_95,_99,_77(s,_99+_97,false));return;}}else{_99=0;_9a=_98.start;}var _9b=Math.min(_9a,_99+_97);_67(_95,_99,_9b);_97-=(_9b-_99);}}};var _9c=function(_9d,s,_9e,_9f,_a0){if(_9f.length==0){return;}var _a1=function(_a2,s,_a3,_a4,_a5){var t;var _a6;var pos=0;var i=0;var _a7=0;for(;i<_a3.length;i++){t=_a3[i];_a6=t.text;if(_a4<pos+_a6.length){_a7=_a4-pos;break;}pos+=_a6.length;}var _a8=_a5-_a4;for(;i<_a3.length&&_a8>0;i++){t=_a3[i];_a6=t.text.substr(_a7);_a7=0;if(_a6.length>_a8){_a6=_a6.substr(0,_a8);}if(t.isMatch){createTiddlyElement(_a2,"span",null,"marked",_a6);}else{createTiddlyText(_a2,_a6);}_a8-=_a6.length;}if(_a5<s.length){abego.createEllipsis(_a2);}};if(_9f[0].start>0){abego.createEllipsis(_9d);}var _a9=_a0;for(var i=0;i<_9f.length&&_a9>0;i++){var _aa=_9f[i];var len=Math.min(_aa.end-_aa.start,_a9);_a1(_9d,s,_9e,_aa.start,_aa.start+len);_a9-=len;}};this.render=function(_ab,s,_ac,_ad){if(s.length<_ac){_ac=s.length;}var _ae=_7b(s,_ad);var _af=_8d(_ae,s,_ac);_94(s,_af,_ac);_9c(_ab,s,_ae,_af,_ac);};};(function(){function _b0(msg){alert(msg);throw msg;};if(version.major<2||(version.major==2&&version.minor<1)){_b0("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\n\nCheck the archive for YourSearch plugins\nsupporting older versions of TiddlyWiki.\n\nArchive: http://tiddlywiki.abego-software.de/archive");}abego.YourSearch={};var _b1;var _b2;var _b3=function(_b4){_b1=_b4;};var _b5=function(){return _b1?_b1:[];};var _b6=function(){return _b1?_b1.length:0;};var _b7=4;var _b8=10;var _b9=2;var _ba=function(s,re){var m=s.match(re);return m?m.length:0;};var _bb=function(_bc,_bd){var _be=_bd.getMarkRegExp();if(!_be){return 1;}var _bf=_bc.title.match(_be);var _c0=_bf?_bf.length:0;var _c1=_ba(_bc.getTags(),_be);var _c2=_bf?_bf.join("").length:0;var _c3=_bc.title.length>0?_c2/_bc.title.length:0;var _c4=_c0*_b7+_c1*_b9+_c3*_b8+1;return _c4;};var _c5=function(_c6,_c7,_c8,_c9,_ca,_cb){_b2=null;var _cc=_c6.reverseLookup("tags",_cb,false);try{var _cd=[];if(config.options.chkSearchInTitle){_cd.push("title");}if(config.options.chkSearchInText){_cd.push("text");}if(config.options.chkSearchInTags){_cd.push("tags");}_b2=new abego.TiddlerQuery(_c7,_c8,_c9,_cd,config.options.chkSearchExtendedFields);}catch(e){return [];}var _ce=_b2.filter(_cc);var _cf=abego.YourSearch.getRankFunction();for(var i=0;i<_ce.length;i++){var _d0=_ce[i];var _d1=_cf(_d0,_b2);_d0.searchRank=_d1;}if(!_ca){_ca="title";}var _d2=function(a,b){var _d3=a.searchRank-b.searchRank;if(_d3==0){if(a[_ca]==b[_ca]){return (0);}else{return (a[_ca]<b[_ca])?-1:+1;}}else{return (_d3>0)?-1:+1;}};_ce.sort(_d2);return _ce;};var _d4=80;var _d5=50;var _d6=250;var _d7=50;var _d8=25;var _d9=10;var _da="yourSearchResult";var _db="yourSearchResultItems";var _dc;var _dd;var _de;var _df;var _e0;var _e1=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _e2=function(){return _dd!=null&&_dd.parentNode==document.body;};var _e3=function(){if(_e2()){document.body.removeChild(_dd);}};var _e4=function(e){_e3();var _e5=this.getAttribute("tiddlyLink");if(_e5){var _e6=this.getAttribute("withHilite");var _e7=highlightHack;if(_e6&&_e6=="true"&&_b2){highlightHack=_b2.getMarkRegExp();}story.displayTiddler(this,_e5);highlightHack=_e7;}return (false);};var _e8=function(){if(!_de){return;}var _e9=_de;var _ea=findPosX(_e9);var _eb=findPosY(_e9);var _ec=_e9.offsetHeight;var _ed=_ea;var _ee=_eb+_ec;var _ef=findWindowWidth();if(_ef<_dd.offsetWidth){_dd.style.width=(_ef-100)+"px";_ef=findWindowWidth();}var _f0=_dd.offsetWidth;if(_ed+_f0>_ef){_ed=_ef-_f0-30;}if(_ed<0){_ed=0;}_dd.style.left=_ed+"px";_dd.style.top=_ee+"px";_dd.style.display="block";};var _f1=function(){if(_dd){window.scrollTo(0,ensureVisible(_dd));}if(_de){window.scrollTo(0,ensureVisible(_de));}};var _f2=function(){_e8();_f1();};var _f3;var _f4;var _f5=new abego.PageWiseRenderer();var _f6=function(_f7){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){_b0("YourSearchItemTemplate not found");}this.place=document.getElementById(_db);if(!this.place){this.place=createTiddlyElement(_f7,"div",_db);}};merge(_f6.prototype,{render:function(_f8,_f9,_fa,_fb){_f3=_fb;_f4=_f9;var _fc=createTiddlyElement(this.place,"div",null,"yourSearchItem");_fc.innerHTML=this.itemHtml;applyHtmlMacros(_fc,null);refreshElements(_fc,null);},endRendering:function(_fd){_f4=null;}});var _fe=function(){if(!_dd||!_de){return;}var _ff=store.getTiddlerText("YourSearchResultTemplate");if(!_ff){_ff="<b>Tiddler YourSearchResultTemplate not found</b>";}_dd.innerHTML=_ff;applyHtmlMacros(_dd,null);refreshElements(_dd,null);var _100=new _f6(_dd);_f5.renderPage(_100);_f2();};_f5.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_d9):abego.toInt(config.options.txtItemsPerPage,_d8);return (n>0)?n:1;};_f5.onPageChanged=function(){_fe();};var _101=function(){if(_de==null||!config.options.chkUseYourSearch){return;}if((_de.value==_dc)&&_dc&&!_e2()){if(_dd&&(_dd.parentNode!=document.body)){document.body.appendChild(_dd);_f2();}else{abego.YourSearch.onShowResult(true);}}};var _102=function(){_e3();_dd=null;_dc=null;};var _103=function(self,e){while(e!=null){if(self==e){return true;}e=e.parentNode;}return false;};var _104=function(e){if(e.target==_de){return;}if(e.target==_df){return;}if(_dd&&_103(_dd,e.target)){return;}_e3();};var _105=function(e){if(e.keyCode==27){_e3();}};addEvent(document,"click",_104);addEvent(document,"keyup",_105);var _106=function(text,_107,_108){_dc=text;_b3(_c5(store,text,_107,_108,"title","excludeSearch"));abego.YourSearch.onShowResult();};var _109=function(_10a,_10b,_10c,_10d,_10e,_10f){_e1();_dc="";var _110=null;var _111=function(txt){if(config.options.chkUseYourSearch){_106(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_dc=txt.value;};var _112=function(e){_111(_de);return false;};var _113=function(e){if(!e){var e=window.event;}_de=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_e0&&_e2()){_e0.onclick.apply(_e0,[e]);}else{_111(this);}break;case 27:if(_e2()){_e3();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_101();}if(this.value.length<3&&_110){clearTimeout(_110);}if(this.value.length>2){if(this.value!=_dc){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_110){clearTimeout(_110);}var txt=this;_110=setTimeout(function(){_111(txt);},500);}}else{if(_110){clearTimeout(_110);}}}if(this.value.length==0){_e3();}};var _114=function(e){this.select();clearMessage();_101();};var args=_10e.parseParams("list",null,true);var _115=getFlag(args,"buttonAtRight");var _116=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_115){btn=createTiddlyButton(_10a,this.label,this.prompt,_112);}var txt=createTiddlyElement(null,"input",null,"txtOptionInput searchField",null);if(_10c[0]){txt.value=_10c[0];}txt.onkeyup=_113;txt.onfocus=_114;txt.setAttribute("size",_116);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}if(_10a){_10a.appendChild(txt);}if(_115){btn=createTiddlyButton(_10a,this.label,this.prompt,_112);}_de=txt;_df=btn;};var _117=function(){_e3();var _118=_b5();var n=_118.length;if(n){var _119=[];for(var i=0;i<n;i++){_119.push(_118[i].title);}story.displayTiddlers(null,_119);}};var _11a=function(_11b,_11c,_11d,_11e){invokeMacro(_11b,"option",_11c,_11d,_11e);var elem=_11b.lastChild;var _11f=elem.onclick;elem.onclick=function(e){var _120=_11f.apply(this,arguments);_fe();return _120;};return elem;};var _121=function(s){var _122=["''","{{{","}}}","//","<<<","/***","***/"];var _123="";for(var i=0;i<_122.length;i++){if(i!=0){_123+="|";}_123+="("+_122[i].escapeRegExp()+")";}return s.replace(new RegExp(_123,"mg"),"").trim();};var _124=function(){var i=_f3;return (i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _125=new abego.LimitedTextRenderer();var _126=function(_127,s,_128){_125.render(_127,s,_128,_b2.getMarkRegExp());};var _129=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_12a,_12b,_12c,_12d,_12e,tags,_12f){_129.apply(this,arguments);_102();};var _130=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_131){_130.apply(this,arguments);_102();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_132,_133,_134,_135,_136,_137){if(_134.length==0){return;}var name=_134[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_132,_133,_134,_135,_136,_137);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _b6()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_138){if(_b6()){var _139=_f5.getLastIndexOnPage();var s="%0 - %1".format([_f5.getFirstIndexOnPage()+1,_139+1]);createTiddlyText(_138,s);}},count:function(_13a){createTiddlyText(_13a,_b6().toString());},query:function(_13b){if(_b2){createTiddlyText(_13b,_b2.toString());}},version:function(_13c){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_13c,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">"+t+"<font>";},copyright:function(_13d){var e=createTiddlyElement(_13d,"a");e.setAttribute("href","http://www.abego-software.de");e.innerHTML="<font color=\"black\" face=\"Arial, Helvetica, sans-serif\">&copy; 2005-2008 <b><font color=\"red\">abego</font></b> Software<font>";},newTiddlerButton:function(_13e){if(_b2){var r=abego.parseNewTiddlerCommandLine(_b2.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_13e,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _13f=btn.onclick;btn.onclick=function(){_e3();_13f.apply(this,arguments);};_e0=btn;}},linkButton:function(_140,_141,_142,_143,_144,_145){if(_142<2){return;}var _146=_142[1];var text=_142<3?_146:_142[2];var _147=_142<4?text:_142[3];var _148=_142<5?null:_142[4];var btn=createTiddlyButton(_140,text,_147,_e4,null,null,_148);btn.setAttribute("tiddlyLink",_146);},closeButton:function(_149,_14a,_14b,_14c,_14d,_14e){var _14f=createTiddlyButton(_149,"close","Close the Search Results (Shortcut: ESC)",_e3);},openAllButton:function(_150,_151,_152,_153,_154,_155){var n=_b6();if(n==0){return;}var _156=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _157=createTiddlyButton(_150,_156,"Open all found tiddlers (Shortcut: Alt-O)",_117);_157.setAttribute("accessKey","O");},naviBar:function(_158,_159,_15a,_15b,_15c,_15d){_f5.addPageNavigation(_158);},"if":function(_15e,_15f,_160,_161,_162,_163){if(_160.length<2){return;}var _164=_160[1];var _165=(_164=="not");if(_165){if(_160.length<3){return;}_164=_160[2];}var test=config.macros.yourSearch.tests[_164];var _166=false;try{if(test){_166=test(_15e,_15f,_160,_161,_162,_163)!=_165;}else{_166=(!eval(_164))==_165;}}catch(ex){}if(!_166){_15e.style.display="none";}},chkPreviewText:function(_167,_168,_169,_16a,_16b,_16c){var _16d=_169.slice(1).join(" ");var elem=_11a(_167,"chkPreviewText",_16a,_16c);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_16e,_16f,_170,_171,_172,_173){var name=_170[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_16e,_16f,_170,_171,_172,_173);}},funcs:{title:function(_174,_175,_176,_177,_178,_179){if(!_f4){return;}var _17a=_124();var _17b=_17a>=0?"Open tiddler (Shortcut: Alt-%0)".format([_17a.toString()]):"Open tiddler";var btn=createTiddlyButton(_174,null,_17b,_e4,null);btn.setAttribute("tiddlyLink",_f4.title);btn.setAttribute("withHilite","true");_126(btn,_f4.title,_d4);if(_17a>=0){btn.setAttribute("accessKey",_17a.toString());}},tags:function(_17c,_17d,_17e,_17f,_180,_181){if(!_f4){return;}_126(_17c,_f4.getTags(),_d5);},text:function(_182,_183,_184,_185,_186,_187){if(!_f4){return;}_126(_182,_121(_f4.text),_d6);},field:function(_188,_189,_18a,_18b,_18c,_18d){if(!_f4){return;}var name=_18a[1];var len=_18a.length>2?abego.toInt(_18a[2],_d7):_d7;var v=store.getValue(_f4,name);if(v){_126(_188,_121(v),len);}},number:function(_18e,_18f,_190,_191,_192,_193){var _194=_124();if(_194>=0){var text="%0)".format([_194.toString()]);createTiddlyElement(_18e,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_d8,txtItemsPerPageWithPreview:_d9};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\nWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\n|!What you want|!What you type|!Example|\n|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\n|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\n|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\n\nUsing this feature you may"+" also search the extended fields (\"Metadata\") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \"1\".\n\nYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \"long form\") finds tiddlers containin"+"g \"Plugin\" either in the title or in the tags (but does not look for \"Plugin\" in the text). \n\n!Boole"+"an Search\nThe Boolean Search is useful when searching for multiple words.\n|!What you want|!What you "+"type|!Example|\n|''All words'' must exist|List of words|{{{jonny jeremy}}} (or {{{jonny and jeremy}}}"+")|\n|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\n|A word ''must "+"not exist''|Start word with ''-''|{{{-jonny}}} (or {{{not jonny}}})|\n\n''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\"john brown\"}}}.\n\nUsing parenthesis you may change "+"the default \"left to right\" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \"jonny\" nor \"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \"jonny\" or that contain \"j"+"eremy\".\n\n!'Exact Word' Search\nBy default a search result all matches that 'contain' the searched tex"+"t. E.g. if you search for {{{Task}}} you will get all tiddlers containing 'Task', but also '~Complet"+"edTask', '~TaskForce' etc.\n\nIf you only want to get the tiddlers that contain 'exactly the word' you"+" need to prefix it with a '='. E.g. typing '=Task' will find the tiddlers that contain the word 'Tas"+"k', ignoring words that just contain 'Task' as a substring.\n\n!~CaseSensitiveSearch and ~RegExpSearch"+"\nThe standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearc"+"h. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\n\nIn addition you m"+"ay do a \"regular expression\" search even with the ''~RegExpSearch'' set to false by directly enterin"+"g the regular expression into the search field, framed with {{{/.../}}}. \n\nExample: {{{/m[ae][iy]er/"+"}}} will find all tiddlers that contain either \"maier\", \"mayer\", \"meier\" or \"meyer\".\n\n!~JavaScript E"+"xpression Filtering\nIf you are familiar with JavaScript programming and know some TiddlyWiki interna"+"ls you may also use JavaScript expression for the search. Just enter a JavaScript boolean expression"+" into the search field, framed with {{{ { ... } }}}. In the code refer to the variable tiddler and e"+"valuate to {{{true}}} when the given tiddler should be included in the result. \n\nExample: {{{ { tidd"+"ler.modified > new Date(\"Jul 4, 2005\")} }}} returns all tiddler modified after July 4th, 2005.\n\n!Com"+"bined Search\nYou are free to combine the various search options. \n\n''Examples''\n|!What you type|!Res"+"ult|\n|{{{!jonny !jeremy -%football}}}|all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its tit"+"les, but no {{{football}}} in content.|\n|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact wor"+"d). Tags named '~CompletedTask', '~TaskForce' etc. are not considered.|\n\n!Access Keys\nYou are encour"+"aged to use the access keys (also called \"shortcut\" keys) for the most frequently used operations. F"+"or quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\n\n|"+"!Key|!Operation|\n|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search in"+"put field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the pr"+"evious search result. This way you can quickly display multiple tiddlers using \"Press {{{Alt-F}}}. S"+"elect tiddler.\" sequences.|\n|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Resul"+"t]] is already closed and the cursor is in the search input field the field's content is cleared so "+"you start a new query.|\n|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second e"+"tc. tiddler from the result list.|\n|{{{Alt-O}}}|Opens all found tiddlers.|\n|{{{Alt-P}}}|Toggles the "+"'Preview Text' mode.|\n|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[Your"+"Search Result]].|\n|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the "+"{{{Return}}} key actually starts the search (as does pressing the 'search' button).|\n\n//If some of t"+"hese shortcuts don't work for you check your browser if you have other extensions installed that alr"+"eady \"use\" these shortcuts.//";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\n|>|<<option chkUseYourSearch>> Use 'Your Search'|\n|!|<<option chkPreviewText"+">> Show Text Preview|\n|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required"+" to start search)|\n|!|Default Search Filter:<<option chkSearchInTitle>>Title ('!')     <<option chk"+"SearchInText>>Text ('%')     <<option chkSearchInTags>>Tags ('#')    <<option chkSearchExtendedFiel"+"ds>>Extended Fields<html><br><font size=\"-2\">The fields of a tiddlers that are searched when you don"+"'t explicitly specify a filter in the search text <br>(Explictly specify fields using one or more '!"+"', '%', '#' or 'fieldname:' prefix before the word/text to find).</font></html>|\n|!|Number of items "+"on search result page: <<option txtItemsPerPage>>|\n|!|Number of items on search result page with pre"+"view text: <<option txtItemsPerPageWithPreview>>|\n";config.shadowTiddlers["YourSearchStyleSheet"]="/***\n!~YourSearchResult Stylesheet\n***/\n/*{{{*/\n.yourSearchResult {\n\tposition: absolute;\n\twidth: 800"+"px;\n\n\tpadding: 0.2em;\n\tlist-style: none;\n\tmargin: 0;\n\n\tbackground: #ffd;\n\tborder: 1px solid DarkGra"+"y;\n}\n\n/*}}}*/\n/***\n!!Summary Section\n***/\n/*{{{*/\n.yourSearchResult .summary {\n\tborder-bottom-width:"+" thin;\n\tborder-bottom-style: solid;\n\tborder-bottom-color: #999999;\n\tpadding-bottom: 4px;\n}\n\n.yourSea"+"rchRange, .yourSearchCount, .yourSearchQuery   {\n\tfont-weight: bold;\n}\n\n.yourSearchResult .summary ."+"button {\n\tfont-size: 10px;\n\n\tpadding-left: 0.3em;\n\tpadding-right: 0.3em;\n}\n\n.yourSearchResult .summa"+"ry .chkBoxLabel {\n\tfont-size: 10px;\n\n\tpadding-right: 0.3em;\n}\n\n/*}}}*/\n/***\n!!Items Area\n***/\n/*{{{*"+"/\n.yourSearchResult .marked {\n\tbackground: none;\n\tfont-weight: bold;\n}\n\n.yourSearchItem {\n\tmargin-to"+"p: 2px;\n}\n\n.yourSearchNumber {\n\tcolor: #808080;\n}\n\n\n.yourSearchTags {\n\tcolor: #008000;\n}\n\n.yourSearc"+"hText {\n\tcolor: #808080;\n\tmargin-bottom: 6px;\n}\n\n/*}}}*/\n/***\n!!Footer\n***/\n/*{{{*/\n.yourSearchFoote"+"r {\n\tmargin-top: 8px;\n\tborder-top-width: thin;\n\tborder-top-style: solid;\n\tborder-top-color: #999999;"+"\n}\n\n.yourSearchFooter a:hover{\n\tbackground: none;\n\tcolor: none;\n}\n/*}}}*/\n/***\n!!Navigation Bar\n***/"+"\n/*{{{*/\n.yourSearchNaviBar a {\n\tfont-size: 16px;\n\tmargin-left: 4px;\n\tmargin-right: 4px;\n\tcolor: bla"+"ck;\n\ttext-decoration: underline;\n}\n\n.yourSearchNaviBar a:hover {\n\tbackground-color: none;\n}\n\n.yourSe"+"archNaviBar .prev {\n\tfont-weight: bold;\n\tcolor: blue;\n}\n\n.yourSearchNaviBar .currentPage {\n\tcolor: #"+"FF0000;\n\tfont-weight: bold;\n\ttext-decoration: none;\n}\n\n.yourSearchNaviBar .next {\n\tfont-weight: bold"+";\n\tcolor: blue;\n}\n/*}}}*/\n";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\n{{{\n-->\n<span macro=\"yourSearch if found\">\n<!-- The Summary Header ============================"+"================ -->\n<table class=\"summary\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">"+"<tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Result <span class=\"yourSearchRange\" macro=\"yourSearc"+"h itemRange\"></span>\n\t\t&nbsp;of&nbsp;<span class=\"yourSearchCount\" macro=\"yourSearch count\"></span>\n"+"\t\tfor&nbsp;<span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>\n\t</td>\n\t<td class=\"yourSea"+"rchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch chkPreviewText\"></span><span class=\"chkBoxLabel"+"\">preview text</span>\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch openAllButton\"></span>\n\t\t<span macro=\"yourSearch lin"+"kButton 'YourSearch Options' options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkB"+"utton 'YourSearch Help' help 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch clo"+"seButton\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n\n<!-- The List of Found Tiddlers ================="+"=========================== -->\n<div id=\"yourSearchResultItems\" itemsPerPage=\"25\" itemsPerPageWithPr"+"eview=\"10\"></div>\n\n<!-- The Footer (with the Navigation) ==========================================="+"= -->\n<table class=\"yourSearchFooter\" border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody"+">\n  <tr>\n\t<td align=\"left\">\n\t\tResult page: <span class=\"yourSearchNaviBar\" macro=\"yourSearch naviBar"+"\"></span>\n\t</td>\n\t<td align=\"right\"><span macro=\"yourSearch version\"></span>, <span macro=\"yourSearc"+"h copyright\"></span>\n\t</td>\n  </tr>\n</tbody></table>\n<!-- end of the 'tiddlers found' case ========="+"================================== -->\n</span>\n\n\n<!-- The \"No tiddlers found\" case ================="+"========================== -->\n<span macro=\"yourSearch if not found\">\n<table class=\"summary\" border="+"\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tbody>\n  <tr>\n\t<td align=\"left\">\n\t\tYourSearch Resu"+"lt: No tiddlers found for <span class=\"yourSearchQuery\" macro=\"yourSearch query\"></span>.\n\t</td>\n\t<t"+"d class=\"yourSearchButtons\" align=\"right\">\n\t\t<span macro=\"yourSearch newTiddlerButton\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Options'"+" options 'Configure YourSearch'\"></span>\n\t\t<span macro=\"yourSearch linkButton 'YourSearch Help' help"+" 'Get help how to use YourSearch'\"></span>\n\t\t<span macro=\"yourSearch closeButton\"></span>\n\t</td>\n  <"+"/tr>\n</tbody></table>\n</span>\n\n\n<!--\n}}}\n-->\n";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\n{{{\n-->\n<span class='yourSearchNumber' macro='foundTiddler number'></span>\n<span class='yourSea"+"rchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\n<span class='yourSearchTags' macro='found"+"Tiddler field tags 50'/></span>\n<span macro=\"yourSearch if previewText\"><div class='yourSearchText' macro='fo"+"undTiddler field text 250'/></div></span>\n<!--\n}}}\n-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";config.macros.search.handler=_109;var _195=function(){if(config.macros.search.handler!=_109){alert("Message from YourSearchPlugin:\n\n\nAnother plugin has disabled the 'Your Search' features.\n\n\nYou may "+"disable the other plugin or change the load order of \nthe plugins (by changing the names of the tidd"+"lers)\nto enable the 'Your Search' features.");}};setTimeout(_195,5000);abego.YourSearch.getStandardRankFunction=function(){return _bb;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return _f4;};abego.YourSearch.closeResult=function(){_e3();};abego.YourSearch.getFoundTiddlers=function(){return _b1;};abego.YourSearch.getQuery=function(){return _b2;};abego.YourSearch.onShowResult=function(_196){highlightHack=_b2?_b2.getMarkRegExp():null;if(!_196){_f5.setItems(_b5());}if(!_dd){_dd=createTiddlyElement(document.body,"div",_da,"yourSearchResult");}else{if(_dd.parentNode!=document.body){document.body.appendChild(_dd);}}_fe();highlightHack=null;};})();}
//%/
config.macros.allTagsC = {tooltip: "Show tiddlers tagged with '%0'", noTags: "There are no tagged tiddlers"},
config.macros.allTagsC.handler = function(place,macroName,params)
{
    var tags = store.getTags();
    var theDateList = createTiddlyElement(place,"ul",null,null,null);
    if(tags.length == 0)
        createTiddlyElement(theDateList,"span",null,"listTitle",this.noTags);
    for(var t=0; t<tags.length; t++)
        {
        var theListItem =createTiddlyElement(theDateList,"span",null,null,null);
        var theTag = createTiddlyButton(theListItem,tags[t][0] + " (" + tags[t][1] + ")",this.tooltip.format([tags[t][0]]),onClickTag);
        theTag.setAttribute("tag",tags[t][0]);
        }
}
Type the text for 'paper'
if(config.options.txtUserName != "SoToS") {
config.options.chkShowRightSidebar=false;
readOnly = true;
showBackstage = false;
config.options.chkSinglePageMode= true;
config.options.chkSinglePagePermalink= true;
}
{{{
try {
    var pageTracker = _gat._getTracker("UA-4175362-1");
    pageTracker._trackPageview(); // comment it out so it does not register twice ???
} catch(err) {}

// CustomTracker as a namespace for tracking related functions
var CustomTracker = {
    // store a reference to the original displayTiddler function
    displayTiddler: story.displayTiddler
};

CustomTracker.track = function() {
    if (readOnly) {
        try {
            pageTracker._trackPageview.apply(this, arguments);
        } catch(err) {}
    }
};

CustomTracker.trackAndDisplayTiddler = function(srcElement, titles) {
    // this supposedly takes care of the \[object Object] problem in Google Analytics reports. Adapted from http://osmosoft.com/tiddlytweets/ .
    var titleG = titles.title || titles;
     // log with the tracker
    CustomTracker.track('/' + titleG);
    // call the original displayTiddler function
    return CustomTracker.displayTiddler.apply(this,arguments);
};

// replace the default displayTiddler function with a tracking version
story.displayTiddler = CustomTracker.trackAndDisplayTiddler;

// Call once for the initial page load
CustomTracker.track(); // I am wondering if this necessary, since even in the initial page load a tiddler will be called. 
}}}
{{{
// Specify your account number here!
_uacct = "UA-4175362-1";

// CustomTracker as a namespace for tracking related functions
var CustomTracker = {
// store a reference to the original displayTiddler function
displayTiddler: story.displayTiddler
};

CustomTracker.track = function() {
// if (readOnly) {
urchinTracker.apply(this, arguments);
// }
};

CustomTracker.trackAndDisplayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc){
var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler;
// log with the tracker
CustomTracker.track('/' + title);
// call the original displayTiddler function
CustomTracker.displayTiddler.apply(this,arguments);
};

// replace the default displayTiddler function with a tracking version
story.displayTiddler = CustomTracker.trackAndDisplayTiddler;

// Call once for the initial page load
CustomTracker.track();
}}}
{{{
Story.prototype.refreshTiddler = function(title,template,force)
{
        var theTiddler = document.getElementById(this.idPrefix + title);
        if(theTiddler) {
                if(theTiddler.getAttribute("dirty") == "true" && !force)
                        return theTiddler;
                template = this.chooseTemplateForTiddler(title,template);
                var currTemplate = theTiddler.getAttribute("template");
                if((template != currTemplate) || force)
                        {
                        var tiddler = store.getTiddler(title);
                        if(!tiddler)
                                {
                                tiddler = new Tiddler();
                                if(store.isShadowTiddler(title))

tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,[],version.date);
                                else
                                        {
                                        var text = template=="EditTemplate"
                                                                ? config.views.editor.defaultText.format([title])
                                                                : config.views.wikified.defaultText.format([title]);

tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date);
                                        }
                                }
                        theTiddler.setAttribute("tags",tiddler.tags.join(" "));
                        theTiddler.setAttribute("tiddler",title);

/*****************************************************************/
// modif AirCarnet
        // titles modifications (as they are sent to urchin)
                document.title=title;
                var lurlsac="#";
                if(title.split(" ")[1]) lurlsac+="[["+title+"]] ";
                else lurlsac+=title;
                if(window.location.hash!=lurlsac) window.location.hash=lurlsac;
        // google count
                comptageGoogle(title);
/*******************************************************************/

                        theTiddler.setAttribute("template",template);
                        var me = this;
                        theTiddler.onmouseover = this.onTiddlerMouseOver;
                        theTiddler.onmouseout = this.onTiddlerMouseOut;
                        theTiddler.ondblclick = this.onTiddlerDblClick;
                        theTiddler[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress;
                        var html = this.getTemplateForTiddler(title,template,tiddler);
                        theTiddler.innerHTML = html;
                        applyHtmlMacros(theTiddler,tiddler);
                        if(store.getTaggedTiddlers(title).length > 0)
                                addClass(theTiddler,"isTag");
                        else
                                removeClass(theTiddler,"isTag");
                        if(!store.tiddlerExists(title))
                                {
                                if(store.isShadowTiddler(title))
                                        addClass(theTiddler,"shadow");
                                else
                                        addClass(theTiddler,"missing");
                                }
                        else
                                {
                                removeClass(theTiddler,"shadow");
                                removeClass(theTiddler,"missing");
                                }
                        }
                }
        return theTiddler;

} 
}}}
{{{
// Sotos update: This tiddler must be loaded after the single page mode plugin tiddler. Otherwise it breaks the single page mode. Google analytics tracking code for tiddlywiki  from: http://blog.spacelag.com/2007/10/tracking-tiddlywiki-with-google.html
// Specify your account number here!
_uacct = "UA-4175362-1";

// CustomTracker as a namespace for tracking related functions
var CustomTracker = {
// store a reference to the original displayTiddler function
displayTiddler: story.displayTiddler,
pageTracker: _gat._getTracker("UA-4175362-1")
};

CustomTracker.track = function() {
if (readOnly) {
// urchinTracker.apply(this, arguments);
pageTracker._trackPageview.apply(this, arguments); // uses the new (not urchin) tracker for Google Analytics
}
};
// update from osmosoft.com/tiddlytweets/
CustomTracker.trackAndDisplayTiddler = function(srcElement, t) {
// cope whether a tiddler or a string is passed 
//	var title = t.title || t;
// log with the tracker
CustomTracker.track('/' + t);
// call the original displayTiddler function
CustomTracker.displayTiddler.apply(this,arguments);
};

// replace the default displayTiddler function with a tracking version
story.displayTiddler = CustomTracker.trackAndDisplayTiddler;

// Call once for the initial page load
CustomTracker.track();
}}}