<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>Climate Change 2.0 | plugins</title>
<link>http://www.climate-change-two.net/</link>
<description>tiddlywiki plugins only</description>
<language>en-us</language>
<copyright>Copyright 2007 Webster</copyright>
<pubDate>Thu, 22 Nov 2007 17:30:28 GMT</pubDate>
<lastBuildDate>Thu, 22 Nov 2007 17:30:28 GMT</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>TiddlyWiki 2.2.5</generator>
<item>
<title>TwHelpSearchPlugin</title>
<description>&lt;strong&gt;TwHelpSearch&lt;/strong&gt; for TiddlyWiki 2.0.x to 2.2.x&lt;br&gt;&lt;sup&gt;author: Morris S. Gray&lt;br&gt;source: &lt;a target=&quot;_blank&quot; title=&quot;External link to http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin&quot; href=&quot;http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin&quot; class=&quot;externalLink&quot;&gt;http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin&lt;/a&gt;&lt;br&gt;license: &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;&lt;br&gt;&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td colspan=&quot;4&quot; align=&quot;left&quot;&gt;&lt;a class=&quot;button&quot; title=&quot;Search this TiddlyWiki&quot; href=&quot;javascript:;&quot;&gt;search&lt;/a&gt;&lt;input autocomplete=&quot;off&quot; accesskey=&quot;F&quot; size=&quot;15&quot; type=&quot;text&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td colspan=&quot;3&quot; align=&quot;center&quot;&gt;look for in&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td align=&quot;center&quot;&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchTitles&quot; type=&quot;checkbox&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchText&quot; type=&quot;checkbox&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchTags&quot; type=&quot;checkbox&quot;&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkHoldSearches&quot; type=&quot;checkbox&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td align=&quot;center&quot;&gt;titles&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;text&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tags&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;hold&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;strong&gt;A Plugin Tweak for:&lt;/strong&gt; SearchOptionsPlugin&lt;br&gt;&lt;h5&gt;Description&lt;/h5&gt;&lt;blockquote&gt;This plugin defines an alternative format for the SearchResults tiddler that is generated by the SearchOptionsPlugin . It presents the search results in tabular form numbering the rows; and showing the tiddler title, the size in bytes, and the tags.  It is ready to be used with the &lt;a target=&quot;_blank&quot; title=&quot;External link to http://solo.dc3.com/tw/#SortableGridPlugin&quot; href=&quot;http://solo.dc3.com/tw/#SortableGridPlugin&quot; class=&quot;externalLink&quot;&gt;SortableGridPlugin&lt;/a&gt; (check versions) so any column can be sorted; such as size in ascending or descending order.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;Import (or copy/paste) the following tiddlers into your TiddlyWiki:&lt;br&gt;&lt;ul&gt;&lt;li&gt; &lt;a target=&quot;_blank&quot; title=&quot;External link to http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin&quot; href=&quot;http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin&quot; class=&quot;externalLink&quot;&gt;http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SearchOptionsPlugin from &lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.tiddlytools.com/#SearchOptionsPlugin&quot; href=&quot;http://www.tiddlytools.com/#SearchOptionsPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.tiddlytools.com/#SearchOptionsPlugin&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Get more documentation here TwHelpSearchDoc or here:&lt;/li&gt;&lt;li&gt; &lt;a target=&quot;_blank&quot; title=&quot;External link to http://twhelp.tiddlyspot.com/#TwHelpSearchDoc&quot; href=&quot;http://twhelp.tiddlyspot.com/#TwHelpSearchDoc&quot; class=&quot;externalLink&quot;&gt;http://twhelp.tiddlyspot.com/#TwHelpSearchDoc&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;br&gt;&lt;strong&gt;2007.09.12  [1.0.6]&lt;/strong&gt;&lt;br&gt;Added overflow scroll to TWHelp-SearchResults for long titles or tags.&lt;br&gt;&lt;strong&gt;2006.02.03  [1.0.5]&lt;/strong&gt;&lt;br&gt;Added facility for holding the results of multiple searches with tick box on dashboard.&lt;br&gt;&lt;strong&gt;2006.02.02  [1.0.4]&lt;/strong&gt;&lt;br&gt;Added several options, cleaned up design.Planning one version basic and one with added options this is the added options version.&lt;br&gt;&lt;strong&gt;2006.01.27  [1.0.3&lt;/strong&gt;&lt;br&gt;Added a column for the size of the text in each tiddler, this does not include the size of the title or tags.  Added overall TW statistics button requires TiddlerStatsPlugin.&lt;br&gt;&lt;strong&gt;2006.01.23 [1.0.2 ]&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;a)&lt;/strong&gt;Changed function reportSearchResults(text,matches) to  window.reportSearchResults=function(text,matches)&lt;br&gt;&lt;strong&gt;b)&lt;/strong&gt;Added a line so that Incremental Search is automatically disabled config.options.chkSearchIncremental=false; turn off key-by-key searching&lt;br&gt;&lt;strong&gt;c)&lt;/strong&gt;Removed space inside parens. bgcolor(#fe8 )&quot; to &quot;bgcolor(#fe8)&quot;.  This&lt;br&gt;is what was causing IE to 'crap out' halfway through drawing the table&lt;br&gt;headings.&lt;br&gt;&lt;strong&gt;d)&lt;/strong&gt;Added &lt;code&gt;config.options.chkSearchList=true;&lt;/code&gt;&lt;br&gt;&lt;strong&gt;2006.01.20 [1.0.1]&lt;/strong&gt;&lt;br&gt;ELS: reportSearchResults() definition moved to this Plugin Tweak tiddler and removed extranous code&lt;br&gt;&lt;strong&gt;2006.01.19 [1.0.0]&lt;/strong&gt;&lt;br&gt;This is an adaptation of Eric Shulman's SearchOptionsPlugin. Adapted by MorrisGray to provide search results in table form. All the necessary controls for refining the search is provided within the table including slide-down access to &lt;a tiddlylink=&quot;AdvancedOptions&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#AdvancedOptions&quot; href=&quot;http://www.climate-change-two.net/#AdvancedOptions&quot; class=&quot;externalLink&quot;&gt;AdvancedOptions&lt;/a&gt;.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;br&gt;&lt;pre&gt;if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkRegExpSearch==undefined) config.options.chkRegExpSearch=true;
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=false;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=false;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=true;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=true;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=false;
if (config.options.chkToggleLinks==true) config.options.chkToggleLinks=false;
if (config.options.chkHoldSearches==undefined) config.options.chkHoldSearches=false;
if (config.options.chkSortTags==undefined) config.options.chkSortTags=false;

config.options.chkToggleLinks=false;
config.options.chkSinglePageMode=false;
config.options.chkHoldSearches=false;
config.options.chkSearchIncremental=false;
config.options.chkHttpReadOnly = false;
config.options.chkRegExpSearch=true;
config.options.chkSearchList=true;
config.options.chkToggleLinks=false;

config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkHoldSearches&amp;gt;&amp;gt; Hold search results&quot;;
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;// Give the report a custom name
config.macros.search.reportTitle=&quot;TWHelp-SearchResults&quot;;

// Override default SearchOptionsPlugin formatting for SearchResults tiddler
window.reportSearchResults=function(text,matches)

{
  
        var title=config.macros.search.reportTitle
	config.macros.search.reportTitle;
	var q = config.options.chkRegExpSearch ? &quot;/&quot; : &quot;'&quot;;
        if (!config.options.chkHoldSearches)  body=&quot;&quot;;

body+=&quot;\n|&amp;gt;|bgcolor(#8af):@@color(#000080):''&quot;+config.macros.search.successMsg.format([matches.length,q+&quot;{{{&quot;+text+&quot;}}}&quot;+q])+&quot;''@@|bgcolor(#8af):  @@color(#A00000): SearchHelp@@ &quot;+&quot;|&quot;+&quot;\n&quot;;
        body+=&quot;|&amp;gt;|&amp;gt;|bgcolor(#E3FFE3):&amp;lt;&amp;lt;search&amp;gt;&amp;gt; &amp;lt;&amp;lt;option chkSearchTitles&amp;gt;&amp;gt; Titles &amp;lt;&amp;lt;option chkSearchText&amp;gt;&amp;gt; Text &amp;lt;&amp;lt;option chkSearchTags&amp;gt;&amp;gt;Tags &amp;lt;&amp;lt;option chkHoldSearches&amp;gt;&amp;gt; Hold |&quot;+&quot;\n&quot;;
        body+=&quot;\n|&amp;amp;nbsp;|bgcolor(#8af): @@color(#000080):sort by: ''Titles''@@ |bgcolor(#8af): @@color(#000080): ''Size'' (bytes)@@ |bgcolor(#8af): @@color(#000080): ''Tags''@@ |h&quot;;
	for(var t=0;t&amp;lt;matches.length;t++) 
        body+=&quot;\n&quot;+&quot;| &quot;+(t+1)+&quot;|[[&quot;+matches[t].title+&quot;]]| &quot;+matches[t].text.length+&quot;|&quot;+matches[t].tags+&quot;|&quot;;
        body+=&quot;\n&quot;;
       


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


	// render tiddler
	var oldprompt=config.macros.search.label;
	config.macros.search.label=&quot;search again&quot;; // use alternate &quot;search again&quot; label
        story.displayTiddler(null,title,1); // force refresh
	config.macros.search.label=oldprompt;	// restore standard search label
}
&lt;/pre&gt;</description>
<category>quickedit</category>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#TwHelpSearchPlugin</link>
<pubDate>Wed, 31 Oct 2007 18:31:00 GMT</pubDate>
</item>
<item>
<title>YourSearchPlugin macro</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;thead&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;strong&gt;YourSearchPlugin&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;Udo Borkowski&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Udo Borkowski&quot; href=&quot;http://www.climate-change-two.net/#Udo%20Borkowski&quot; class=&quot;externalLink&quot;&gt;Udo Borkowski&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;2.02 (2006.02.13)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;Provide enhanced search options.&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#YourSearchPlugin&quot; href=&quot;http://tiddlywiki.abego-software.de/#YourSearchPlugin&quot; class=&quot;externalLink&quot;&gt;http://tiddlywiki.abego-software.de/#YourSearchPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Licence&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;BSD open source licence&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#BSD open source licence&quot; href=&quot;http://www.climate-change-two.net/#BSD%20open%20source%20licence&quot; class=&quot;externalLink&quot;&gt;BSD open source licence&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;TW Version&lt;/td&gt;&lt;td&gt;2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Browser:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Firefox 1.0.4+; Firefox 1.5+; Internet Explorer 6.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span tiddler=&quot;YourSearch Introduction&quot; refresh=&quot;content&quot;&gt;&lt;/span&gt;&lt;br&gt;For more information see &lt;a tiddlylink=&quot;YourSearch Help&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#YourSearch Help&quot; href=&quot;http://www.climate-change-two.net/#YourSearch%20Help&quot; class=&quot;externalLink&quot;&gt;Help&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;h1&gt;Compatibility&lt;/h1&gt;This plugin requires TiddlyWiki 2.0. &lt;br&gt;Use &lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1&quot; href=&quot;http://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1&quot; class=&quot;externalLink&quot;&gt;http://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1&lt;/a&gt; for older TiddlyWiki versions.&lt;br&gt;&lt;br&gt;&lt;h1&gt;Revision history&lt;/h1&gt;&lt;ul&gt;&lt;li&gt; v2.0.2 (2006-02-13)&lt;ul&gt;&lt;li&gt; Bugfix for Firefox 1.5.0.1 related to the &quot;Show prefix&quot; checkbox. Thanks to Ted Pavlic for reporting and to BramChen for fixing. &lt;/li&gt;&lt;li&gt; Internal&lt;ul&gt;&lt;li&gt; Make &quot;JSLint&quot; conform&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; v2.0.1 (2006-02-05)&lt;ul&gt;&lt;li&gt; Support &quot;Exact Word Match&quot; (use '=' to prefix word)&lt;/li&gt;&lt;li&gt; Support default filter settings (when no filter flags are given in search term)&lt;/li&gt;&lt;li&gt; Rework on the &quot;less than 3 chars search text&quot; feature (thanks to EricShulman)&lt;/li&gt;&lt;li&gt; Better support SinglePageMode when doing &quot;Open all tiddlers&quot; (thanks to EricShulman)&lt;/li&gt;&lt;li&gt; Support Firefox 1.5.0.1&lt;/li&gt;&lt;li&gt; Bug: Fixed a hilite bug in &quot;classic search mode&quot; (thanks to EricShulman)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; v2.0.0 (2006-01-16)&lt;ul&gt;&lt;li&gt; Add User Interface&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; v1.0.1 (2006-01-06)&lt;ul&gt;&lt;li&gt; Support TiddlyWiki 2.0&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; v1.0.0 (2005-12-28)&lt;ul&gt;&lt;li&gt; initial version&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;Code&lt;/h1&gt;The code is compressed. &lt;br&gt;&lt;br&gt;You can retrieve a readable source code version from &lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#YourSearchPlugin-src&quot; href=&quot;http://tiddlywiki.abego-software.de/#YourSearchPlugin-src&quot; class=&quot;externalLink&quot;&gt;http://tiddlywiki.abego-software.de/#YourSearchPlugin-src&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;h1&gt;Licence and Copyright&lt;/h1&gt;Copyright (c) abego Software GmbH, 2005-2006 (&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.abego-software.de&quot; href=&quot;http://www.abego-software.de&quot; class=&quot;externalLink&quot;&gt;www.abego-software.de&lt;/a&gt;)&lt;br&gt;&lt;br&gt;Redistribution and use in source and binary forms, with or without modification,&lt;br&gt;are permitted provided that the following conditions are met:&lt;br&gt;&lt;br&gt;Redistributions of source code must retain the above copyright notice, this&lt;br&gt;list of conditions and the following disclaimer.&lt;br&gt;&lt;br&gt;Redistributions in binary form must reproduce the above copyright notice, this&lt;br&gt;list of conditions and the following disclaimer in the documentation and/or other&lt;br&gt;materials provided with the distribution.&lt;br&gt;&lt;br&gt;Neither the name of abego Software nor the names of its contributors may be&lt;br&gt;used to endorse or promote products derived from this software without specific&lt;br&gt;prior written permission.&lt;br&gt;&lt;br&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND ANY&lt;br&gt;EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES&lt;br&gt;OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT&lt;br&gt;SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br&gt;INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED&lt;br&gt;TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR&lt;br&gt;BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br&gt;CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN&lt;br&gt;ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH&lt;br&gt;DAMAGE.&lt;br&gt;</description>
<category>3rd party plugin</category>
<category>excludeLists</category>
<category>excludeSearch</category>
<category>plugin macro</category>
<category>systemConfig</category>
<category>abego software</category>
<category>systemConfigDisable</category>
<link>http://www.climate-change-two.net/#%5B%5BYourSearchPlugin%20macro%5D%5D</link>
<pubDate>Wed, 31 Oct 2007 17:17:00 GMT</pubDate>
</item>
<item>
<title>MultiRssPlugin</title>
<description>&lt;pre&gt;config.macros.saveRss = {};
config.macros.saveRss.handler = function(place)
{
	if(!readOnly)
		createTiddlyButton(place,'save rss','save rss',function(e){saveMultiRss();return false;});
}

window.getRssMarkers = function()
{
    var s = [];
    myregexp=/\|(?:.*?)\|(?:.*?)\|(.*?)\|(?:.*?)\|(.*?)\|/g;
    while((m = myregexp.exec(store.getTiddlerText(&quot;MultiRssConfig&quot;))) != null)
         s.push(&quot;&amp;lt;link rel='alternate' type='application/rss+xml' title='%0' href='%1'&amp;gt;&quot;.format([m[1].trim(),m[2].trim()]));
    return s.splice(1,s.length).join(&quot;\n&quot;);
}

updateMarkupBlock_old_multirss = window.updateMarkupBlock;
window.updateMarkupBlock = function (s,blockName,tiddlerName)
{
    s = updateMarkupBlock_old_multirss.apply(this,arguments);
    if (blockName == &quot;PRE-HEAD&quot;)
        s = lewcidRSSAddToMarkupBlock(s);
    return s;
}

window.lewcidRSSAddToMarkupBlock = function (s)
{
    var pos = s.indexOf(&quot;&amp;lt;!--PRE-HEAD-END--&amp;gt;&quot;);
    return ( s.substring(0,pos).replace(&quot;&amp;lt;link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'&amp;gt;&quot;,&quot;&quot;) + &quot;\n&quot; + getRssMarkers() + &quot;\n&quot; + s.substring(pos) );
}

TiddlyWiki.prototype.rssgetTiddlers = function(field,includeTag,excludeTag)
{
          var results = [];
          this.forEachTiddler(function(title,tiddler)
          {
          if(excludeTag == undefined || excludeTag == '' || tiddler.tags.find(excludeTag) == null)
                        if(includeTag == undefined || includeTag == '' || tiddler.tags.find(includeTag)!=null)
                                      results.push(tiddler);
          });
          if(field)
                   results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] &amp;lt; b[field]) ? -1 : +1; });
          return results;
}

window.generateRss = function (tiddlers,title,subtitle)
{
	var s = [];
	var d = new Date();
	var u = store.getTiddlerText(&quot;SiteUrl&quot;);
	s.push(&quot;&amp;lt;&quot; + &quot;?xml version=\&quot;1.0\&quot;?&quot; + &quot;&amp;gt;&quot;);
	s.push(&quot;&amp;lt;rss version=\&quot;2.0\&quot;&amp;gt;&quot;);
	s.push(&quot;&amp;lt;channel&amp;gt;&quot;);
	s.push(&quot;&amp;lt;title&quot; + &quot;&amp;gt;&quot; + ((title &amp;amp;&amp;amp; title != '') ? wikifyPlain(&quot;SiteTitle&quot;).htmlEncode()+ &quot; | &quot;+ title: wikifyPlain(&quot;SiteTitle&quot;).htmlEncode()) + &quot;&amp;lt;/title&quot; + &quot;&amp;gt;&quot;);
	if(u)
		s.push(&quot;&amp;lt;link&amp;gt;&quot; + u.htmlEncode() + &quot;&amp;lt;/link&amp;gt;&quot;);
	s.push(&quot;&amp;lt;description&amp;gt;&quot; + ((subtitle &amp;amp;&amp;amp; subtitle != '')? subtitle : wikifyPlain(&quot;SiteSubtitle&quot;).htmlEncode()) + &quot;&amp;lt;/description&amp;gt;&quot;);
	s.push(&quot;&amp;lt;language&amp;gt;en-us&amp;lt;/language&amp;gt;&quot;);
	s.push(&quot;&amp;lt;copyright&amp;gt;Copyright &quot; + d.getFullYear() + &quot; &quot; + config.options.txtUserName.htmlEncode() + &quot;&amp;lt;/copyright&amp;gt;&quot;);
	s.push(&quot;&amp;lt;pubDate&amp;gt;&quot; + d.toGMTString() + &quot;&amp;lt;/pubDate&amp;gt;&quot;);
	s.push(&quot;&amp;lt;lastBuildDate&amp;gt;&quot; + d.toGMTString() + &quot;&amp;lt;/lastBuildDate&amp;gt;&quot;);
	s.push(&quot;&amp;lt;docs&amp;gt;http://blogs.law.harvard.edu/tech/rss&amp;lt;/docs&amp;gt;&quot;);
	s.push(&quot;&amp;lt;generator&amp;gt;TiddlyWiki &quot; + version.major + &quot;.&quot; + version.minor + &quot;.&quot; + version.revision + &quot;&amp;lt;/generator&amp;gt;&quot;);
	if (!tiddlers)
        var tiddlers = store.getTiddlers(&quot;modified&quot;,&quot;excludeLists&quot;);
	var n = config.numRssItems &amp;gt; tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
	for (var t=tiddlers.length-1; t&amp;gt;=n; t--)
		s.push(tiddlers[t].saveToRss(u));
	s.push(&quot;&amp;lt;/channel&amp;gt;&quot;);
	s.push(&quot;&amp;lt;/rss&amp;gt;&quot;);
	return s.join(&quot;\n&quot;);
}


old_multiRss_saveChanges = window.saveChanges;
window.saveChanges = function(onlyIfDirty)
{
    var rssStatus = config.options.chkGenerateAnRssFeed;
    config.options.chkGenerateAnRssFeed = false;
    old_multiRss_saveChanges.apply(this,arguments);
    config.options.chkGenerateAnRssFeed = rssStatus;
    if(config.options.chkGenerateAnRssFeed)
        saveMultiRss();
}

window.saveMultiRss = function()
{
      var rssIndex = store.getTiddlerText(&quot;MultiRssConfig&quot;).split(&quot;\n&quot;);
      rssIndex = rssIndex.splice(1,rssIndex.length);
      for (var i=0; i&amp;lt;rssIndex.length; i++)
          {
          var rss = rssIndex[i].split(&quot;|&quot;);
          var localPath = getLocalPath(document.location.toString());
          var rssPath = getRssPath(localPath)+ (rss[5].trim());
          var rssSave = saveFile(rssPath,convertUnicodeToUTF8(generateRss(store.rssgetTiddlers(&quot;modified&quot;,rss[1].trim(),rss[2].trim()),rss[3].trim(),rss[4].trim())));
          if(rssSave)
              displayMessage(config.messages.rssSaved,&quot;file://&quot; + rssPath);
          else
              alert(config.messages.rssFailed);
          }
}

window.getRssPath = function(str) {
    var slash = (str.indexOf('/')!=-1)? '/':'\\';
    return str.substring(0,str.lastIndexOf(slash) + 1);
}

config.shadowTiddlers.MultiRssConfig = &quot;| !includeTag | !excludeTag | !title | !description | !filename |\n| rss | |rss only| this feed has rss tiddlers only | rss-feed.xml |\n|  systemConfig| |plugins| tiddlywiki plugins only |plugins.xml|\n| | systemConfig excludeRSS| Main RSS feed | everything but plugins | rss.xml|&quot;;
&lt;/pre&gt;</description>
<category>systemConfig</category>
<category>rss file</category>
<link>http://www.climate-change-two.net/#MultiRssPlugin</link>
<pubDate>Sat, 06 Oct 2007 19:01:00 GMT</pubDate>
</item>
<item>
<title>Better timeline plugin macro</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;thead&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;strong&gt;timeline&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;Saq Imtiaz&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Saq Imtiaz&quot; href=&quot;http://www.climate-change-two.net/#Saq%20Imtiaz&quot; class=&quot;externalLink&quot;&gt;Saq Imtiaz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;0.5 bet&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;A replacement for the core timeline macro that offers more features&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://lewcid.googlepages.com/lewcid.html#BetterTimelineMacro&quot; href=&quot;http://lewcid.googlepages.com/lewcid.html#BetterTimelineMacro&quot; class=&quot;externalLink&quot;&gt;http://lewcid.googlepages.com/lewcid.html#BetterTimelineMacro&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;TW Version&lt;/td&gt;&lt;td&gt;2.x&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Features:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;list tiddlers with only specific tag&lt;/li&gt;&lt;li&gt;exclude tiddlers with a particular tag&lt;/li&gt;&lt;li&gt;limit entries to any number of days, for example one week&lt;/li&gt;&lt;li&gt;specify a start date for the timeline, only tiddlers after that date will be listed.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;h3&gt;Installation:&lt;/h3&gt;Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.&lt;br&gt;&lt;br&gt;&lt;h3&gt;Syntax:&lt;/h3&gt;&lt;code&gt;&amp;lt;&amp;lt;timeline better:true&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;strong&gt;the param &lt;a target=&quot;_blank&quot; title=&quot;External link to better:true&quot; href=&quot;better:true&quot; class=&quot;externalLink&quot;&gt;better:true&lt;/a&gt; enables the advanced features, without it you will get the old timeline behaviour.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;additonal params:&lt;br&gt;(use only the ones you want)&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;timeline better:true  onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;explanation of syntax:&lt;/strong&gt;&lt;br&gt;onlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.&lt;br&gt;excludeTag: tiddlers with this tag will not be listed.&lt;br&gt;sortBy: sort tiddlers by date modified or date created. Possible values are modified or created.&lt;br&gt;firstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006&lt;br&gt;maxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.&lt;br&gt;maxEntries: limit the total number of entries in the timeline.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;History:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;28-07-06: ver 0.5 beta, first release&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;h3&gt;Code&lt;/h3&gt;&lt;pre&gt;// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
          var results = [];
          this.forEachTiddler(function(title,tiddler)
          {
          if(excludeTag == undefined || tiddler.tags.find(excludeTag) == null)
                        if(includeTag == undefined || tiddler.tags.find(includeTag)!=null)
                                      results.push(tiddler);
          });
          if(field)
                   results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] &amp;lt; b[field]) ? -1 : +1; });
          return results;
}



//this function by Udo
function getParam(params, name, defaultValue)
{
          if (!params)
          return defaultValue;
          var p = params[0][name];
          return p ? p[0] : defaultValue;
}

window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
          var args = paramString.parseParams(&quot;list&quot;,null,true);
          var betterMode = getParam(args, &quot;better&quot;, &quot;false&quot;);
          if (betterMode == 'true')
          {
          var sortBy = getParam(args,&quot;sortBy&quot;,&quot;modified&quot;);
          var excludeTag = getParam(args,&quot;excludeTag&quot;,undefined);
          var includeTag = getParam(args,&quot;onlyTag&quot;,undefined);
          var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
          var firstDayParam = getParam(args,&quot;firstDay&quot;,undefined);
          var firstDay = (firstDayParam!=undefined)? firstDayParam: &quot;00010101&quot;;
          var lastDay = &quot;&quot;;
          var field= sortBy;
          var maxDaysParam = getParam(args,&quot;maxDays&quot;,undefined);
          var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
          var maxEntries = getParam(args,&quot;maxEntries&quot;,undefined);
          var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
          for(var t=tiddlers.length-1; t&amp;gt;=last; t--)
                  {
                  var tiddler = tiddlers[t];
                  var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
                  if ((theDay&amp;gt;=firstDay)&amp;amp;&amp;amp; (tiddler[field].getTime()&amp;gt; (new Date()).getTime() - maxDays))
                     {
                     if(theDay != lastDay)
                               {
                               var theDateList = document.createElement(&quot;ul&quot;);
                               place.appendChild(theDateList);
                               createTiddlyElement(theDateList,&quot;li&quot;,null,&quot;listTitle&quot;,tiddler[field].formatString(this.dateFormat));
                               lastDay = theDay;
                               }
                  var theDateListItem = createTiddlyElement(theDateList,&quot;li&quot;,null,&quot;listLink&quot;,null);
                  theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
                  }
                  }
          }

          else
              {
              window.old_timeline_handler.apply(this,arguments);
              }
}
&lt;/pre&gt;</description>
<category>excludeLists</category>
<category>lewcidExtension</category>
<category>plugin macro</category>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#%5B%5BBetter%20timeline%20plugin%20macro%5D%5D</link>
<pubDate>Sun, 23 Sep 2007 18:27:00 GMT</pubDate>
</item>
<item>
<title>Include plugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;abego.IncludePlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Version:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;1.0.0 (2007-02-08)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Type:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Source:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#IncludePlugin&quot; href=&quot;http://tiddlywiki.abego-software.de/#IncludePlugin&quot; class=&quot;externalLink&quot;&gt;http://tiddlywiki.abego-software.de/#IncludePlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Author:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Udo Borkowski (ub [at] abego-software [dot] de)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Documentation:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D&quot; href=&quot;http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D&quot; class=&quot;externalLink&quot;&gt;IncludePlugin Documentation&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Community:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;(&lt;a target=&quot;_blank&quot; title=&quot;External link to http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin&quot; href=&quot;http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin&quot; class=&quot;externalLink&quot;&gt;del.icio.us&lt;/a&gt;) (&lt;a target=&quot;_blank&quot; title=&quot;External link to http://groups.google.com/group/TiddlyWiki&quot; href=&quot;http://groups.google.com/group/TiddlyWiki&quot; class=&quot;externalLink&quot;&gt;Support&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Copyright:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;©&lt;/span&gt; 2007 &lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.abego-software.de&quot; href=&quot;http://www.abego-software.de&quot; class=&quot;externalLink&quot;&gt;abego Software&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Licence:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.abego-software.de/legal/apl-v10.html&quot; href=&quot;http://www.abego-software.de/legal/apl-v10.html&quot; class=&quot;externalLink&quot;&gt;BSD open source license (abego Software)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;CoreVersion:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2.1.3&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Browser:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Firefox 1.5.0.9 or better; Internet Explorer 6.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This plugin's source code is compressed (and hidden). Use this &lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js&quot; href=&quot;http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js&quot; class=&quot;externalLink&quot;&gt;link&lt;/a&gt; to get the readable source code.&lt;br&gt;&lt;em&gt;&lt;br&gt;&lt;/em&gt;</description>
<category>systemConfig</category>
<category>include</category>
<category>systemConfigDisable</category>
<category>abego software</category>
<link>http://www.climate-change-two.net/#%5B%5BInclude%20plugin%5D%5D</link>
<pubDate>Sun, 23 Sep 2007 18:23:00 GMT</pubDate>
</item>
<item>
<title>IntelliTaggerPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;em&gt;Name:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;IntelliTaggerPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;em&gt;Version:&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1.0.0&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;Date:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;26 April 2006 - 2006-04-26&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;em&gt;Tags:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;tagging intellitagger plugin 'abego software' intelligence 'key words'&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;em&gt;Type:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;em&gt;Source:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin&quot; href=&quot;http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin&quot; class=&quot;externalLink&quot;&gt;http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;em&gt;Author:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;Udo Borkowski (ub [at] abego-software [dot] de)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;em&gt;Documentation:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf&quot; href=&quot;http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf&quot; class=&quot;externalLink&quot;&gt;IntelliTaggerPlugin Documentation&lt;/a&gt; (pdf)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;em&gt;Source Code:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to [http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin SourceCode&quot; href=&quot;%5Bhttp://tiddlywiki.abego-software.de/#IntelliTaggerPlugin%20SourceCode&quot; class=&quot;externalLink&quot;&gt;IntelliTaggerPlugin SourceCode&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;em&gt;Licence:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#BSD open source license (abego Software)&quot; href=&quot;http://tiddlywiki.abego-software.de/#BSD%20open%20source%20license%20%28abego%20Software%29&quot; class=&quot;externalLink&quot;&gt;BSD open source license (abego Software)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;em&gt;TiddlyWiki:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;Version 2.0.8 or better&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;em&gt;Browser:&lt;/em&gt;&lt;/td&gt;&lt;td&gt;Firefox 1.5.0.2 or better&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;em&gt; &lt;br&gt;&lt;/em&gt;</description>
<category>3rd party plugin</category>
<category>excludeLists</category>
<category>plugin macro</category>
<category>systemConfig</category>
<category>abego software</category>
<category>tag management</category>
<link>http://www.climate-change-two.net/#IntelliTaggerPlugin</link>
<pubDate>Sun, 23 Sep 2007 17:45:00 GMT</pubDate>
</item>
<item>
<title>Settings plugin macro</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;thead&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;strong&gt;SettingsPlugin&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;Udo Borkowski&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Udo Borkowski&quot; href=&quot;http://www.climate-change-two.net/#Udo%20Borkowski&quot; class=&quot;externalLink&quot;&gt;Udo Borkowski&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;1.1.0 (2006.07.30)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://tiddlywiki.abego-software.de/#SettingsPlugin&quot; href=&quot;http://tiddlywiki.abego-software.de/#SettingsPlugin&quot; class=&quot;externalLink&quot;&gt;http://tiddlywiki.abego-software.de/#SettingsPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Licence&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;BSD open source licence&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#BSD open source licence&quot; href=&quot;http://www.climate-change-two.net/#BSD%20open%20source%20licence&quot; class=&quot;externalLink&quot;&gt;BSD open source licence&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;TW Version&lt;/td&gt;&lt;td&gt;2.0.7&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Documentation:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;SettingsPlugin Documentation&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SettingsPlugin Documentation&quot; href=&quot;http://www.climate-change-two.net/#SettingsPlugin%20Documentation&quot; class=&quot;externalLink&quot;&gt;SettingsPlugin Documentation&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;SourceCode:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;SettingsPlugin SourceCode&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SettingsPlugin SourceCode&quot; href=&quot;http://www.climate-change-two.net/#SettingsPlugin%20SourceCode&quot; class=&quot;externalLink&quot;&gt;SettingsPlugin SourceCode&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Browser:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Firefox 1.5.0.2 or better; Internet Explorer 6.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;sup&gt;This tiddler contains compressed source code. &lt;a tiddlylink=&quot;SettingsPlugin SourceCode&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SettingsPlugin SourceCode&quot; href=&quot;http://www.climate-change-two.net/#SettingsPlugin%20SourceCode&quot; class=&quot;externalLink&quot;&gt;Full Source Code&lt;/a&gt;.&lt;/sup&gt;&lt;br&gt;&lt;em&gt; &lt;br&gt;&lt;br&gt;&lt;/em&gt;</description>
<category>plugin macro</category>
<category>systemConfig</category>
<category>systemConfigX</category>
<category>abego software</category>
<link>http://www.climate-change-two.net/#%5B%5BSettings%20plugin%20macro%5D%5D</link>
<pubDate>Sun, 23 Sep 2007 17:38:00 GMT</pubDate>
</item>
<item>
<title>ImportTiddlersPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;ImportTiddlersPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#ImportTiddlersPlugin&quot; href=&quot;http://www.TiddlyTools.com/#ImportTiddlersPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#ImportTiddlersPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;3.5.5&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Date&lt;/td&gt;&lt;td&gt;2007.06.25&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;config.macros.importTiddlers.handler&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;interactive controls for import/export with filtering.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;When many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important.  It can also be very extremely helpful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)&lt;br&gt;&lt;br&gt;This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents.  An interactive control panel lets you pick a document to import from, and then select which tiddlers to import, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles.  Automatically add tags to imported tiddlers so they are easy to find later on.  Generates a detailed report of import 'history' in ImportedTiddlers.&lt;br&gt;&lt;h5&gt;Usage&lt;/h5&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;&amp;lt;importTiddlers&amp;gt;&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;&amp;lt;importTiddlers core&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;invokes the built-in importTiddlers macro (TW2.1.x+).  If installed in documents using TW2.0.x or earlier, fallback is to use 'link' display (see below)&lt;br&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;importTiddlers link label tooltip&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;The &lt;strong&gt;link&lt;/strong&gt; keyword creates an &quot;import tiddlers&quot; link that when clicked to show/hide import control panel.  &lt;strong&gt;label&lt;/strong&gt; and &lt;strong&gt;tooltip&lt;/strong&gt; are optional text parameters (enclosed in quotes or &lt;code&gt;[[...]]&lt;/code&gt;, and allow you to override the default display text for the link and the mouseover help text, respectively.&lt;br&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;importTiddlers inline&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;creates import control panel directly in tiddler content&lt;br&gt;&lt;br&gt;&lt;span style=&quot;position: static; display: block;&quot; id=&quot;importPanel&quot;&gt;&lt;!-- source and report --&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;	import from	&lt;input class=&quot;rad&quot; name=&quot;importFrom&quot; id=&quot;importFromFile&quot; value=&quot;file&quot; checked=&quot;checked&quot; onclick=&quot;document.getElementById('importLocalPanel').style.display=this.checked?'block':'none';			document.getElementById('importHTTPPanel').style.display=!this.checked?'block':'none'&quot; type=&quot;radio&quot;&gt; local file	&lt;input class=&quot;rad&quot; name=&quot;importFrom&quot; id=&quot;importFromWeb&quot; value=&quot;http&quot; onclick=&quot;document.getElementById('importLocalPanel').style.display=!this.checked?'block':'none';			document.getElementById('importHTTPPanel').style.display=this.checked?'block':'none'&quot; type=&quot;radio&quot;&gt; web server&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;	&lt;input class=&quot;chk&quot; id=&quot;chkImportReport&quot; checked=&quot;checked&quot; onclick=&quot;config.options['chkImportReport']=this.checked;&quot; type=&quot;checkbox&quot;&gt; create a report&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;!-- import from local file  --&gt;&lt;div id=&quot;importLocalPanel&quot; style=&quot;border-top: 1px solid rgb(153, 153, 153); display: block; margin-bottom: 5px; margin-top: 5px; padding-top: 3px;&quot;&gt;local document path/filename:&lt;br&gt;&lt;input id=&quot;fileImportSource&quot; size=&quot;57&quot; style=&quot;width: 100%;&quot; onkeyup=&quot;config.macros.importTiddlers.src=this.value&quot; onchange=&quot;config.macros.importTiddlers.src=this.value;&quot; type=&quot;file&quot;&gt;&lt;/div&gt;&lt;!--panel--&gt;&lt;!-- import from http server --&gt;&lt;div id=&quot;importHTTPPanel&quot; style=&quot;border-top: 1px solid rgb(153, 153, 153); display: none; margin-bottom: 5px; margin-top: 5px; padding-top: 3px;&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;	remote document URL:&lt;br&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;	&lt;input class=&quot;chk&quot; id=&quot;importUseProxy&quot; onclick=&quot;config.macros.importTiddlers.useProxy=this.checked;			document.getElementById('importSiteProxy').style.display=this.checked?'block':'none'&quot; type=&quot;checkbox&quot;&gt; use a proxy script&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;input id=&quot;importSiteProxy&quot; style=&quot;display: none; margin-bottom: 1px;&quot; onfocus=&quot;this.select()&quot; value=&quot;SiteProxy&quot; onkeyup=&quot;config.macros.importTiddlers.proxy=this.value&quot; onchange=&quot;config.macros.importTiddlers.proxy=this.value;&quot; type=&quot;text&quot;&gt;&lt;input id=&quot;importSourceURL&quot; onfocus=&quot;this.select()&quot; value=&quot;SiteUrl&quot; onkeyup=&quot;config.macros.importTiddlers.src=this.value&quot; onchange=&quot;config.macros.importTiddlers.src=this.value;&quot; type=&quot;text&quot;&gt;&lt;/div&gt;&lt;!--panel--&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;	select:	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectAll&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;select all tiddlers&quot;&gt;		&amp;nbsp;all&amp;nbsp;&lt;/a&gt;	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectNew&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;select tiddlers not already in destination document&quot;&gt;		&amp;nbsp;added&amp;nbsp;&lt;/a&gt; 	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectChanges&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;select tiddlers that have been updated in source document&quot;&gt;		&amp;nbsp;changes&amp;nbsp;&lt;/a&gt; 	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectDifferences&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;select tiddlers that have been added or are different from existing tiddlers&quot;&gt;		&amp;nbsp;differences&amp;nbsp;&lt;/a&gt; 	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importToggleFilter&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;show/hide selection filter&quot;&gt;		&amp;nbsp;filter&amp;nbsp;&lt;/a&gt; &lt;/td&gt;&lt;td align=&quot;right&quot;&gt;	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importListSmaller&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;reduce list size&quot;&gt;		&amp;nbsp;–&amp;nbsp;&lt;/a&gt;	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importListLarger&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;increase list size&quot;&gt;		&amp;nbsp;+&amp;nbsp;&lt;/a&gt;	&lt;a href=&quot;JavaScript:;&quot; id=&quot;importListMaximize&quot; onclick=&quot;onClickImportButton(this)&quot; title=&quot;maximize/restore list size&quot;&gt;		&amp;nbsp;=&amp;nbsp;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;select id=&quot;importList&quot; size=&quot;8&quot; multiple=&quot;multiple&quot; onchange=&quot;setTimeout('refreshImportList('+this.selectedIndex+')',1)&quot;&gt;	&lt;!-- NOTE: delay refresh so list is updated AFTER onchange event is handled --&gt;&lt;option value=&quot;&quot;&gt;please load a document...&lt;/option&gt;&lt;/select&gt;&lt;input class=&quot;chk&quot; id=&quot;chkAddTags&quot; checked=&quot;checked&quot; onclick=&quot;config.macros.importTiddlers.addTags=this.checked;&quot; type=&quot;checkbox&quot;&gt;add new tags &amp;nbsp;&lt;input class=&quot;chk&quot; id=&quot;chkImportTags&quot; checked=&quot;checked&quot; onclick=&quot;config.macros.importTiddlers.importTags=this.checked;&quot; type=&quot;checkbox&quot;&gt;import source tags &amp;nbsp;&lt;input class=&quot;chk&quot; id=&quot;chkKeepTags&quot; checked=&quot;checked&quot; onclick=&quot;config.macros.importTiddlers.keepTags=this.checked;&quot; type=&quot;checkbox&quot;&gt;keep existing tags&lt;br&gt;&lt;input id=&quot;txtNewTags&quot; size=&quot;15&quot; onkeyup=&quot;config.macros.importTiddlers.newTags=this.value&quot; autocomplete=&quot;off&quot; type=&quot;text&quot;&gt;&lt;div align=&quot;center&quot;&gt;	&lt;input id=&quot;importLoad&quot; class=&quot;importButton&quot; style=&quot;width: 32%;&quot; value=&quot;load&quot; title=&quot;load listbox with tiddlers from source document&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;	&lt;input id=&quot;importStart&quot; class=&quot;importButton&quot; style=&quot;width: 32%;&quot; value=&quot;import&quot; title=&quot;add selected source tiddlers to the current document&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;	&lt;input id=&quot;importClose&quot; class=&quot;importButton&quot; style=&quot;width: 32%;&quot; value=&quot;close&quot; title=&quot;clear listbox or hide control panel&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;&lt;/div&gt;&lt;div id=&quot;importCollisionPanel&quot;&gt;	tiddler already exists:	&lt;input id=&quot;importNewTitle&quot; size=&quot;15&quot; autocomplete=&quot;off&amp;quot;&quot; type=&quot;text&quot;&gt;	&lt;div align=&quot;center&quot;&gt;	&lt;input id=&quot;importSkip&quot; class=&quot;importButton&quot; style=&quot;width: 23%;&quot; value=&quot;skip&quot; title=&quot;do not import this tiddler&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;	&lt;input id=&quot;importRename&quot; class=&quot;importButton&quot; style=&quot;width: 23%;&quot; value=&quot;rename&quot; title=&quot;rename the incoming tiddler&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;	&lt;input id=&quot;importMerge&quot; class=&quot;importButton&quot; style=&quot;width: 23%;&quot; value=&quot;merge&quot; title=&quot;append the incoming tiddler to the existing tiddler&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;	&lt;input id=&quot;importReplace&quot; class=&quot;importButton&quot; style=&quot;width: 23%;&quot; value=&quot;replace&quot; title=&quot;discard the existing tiddler&quot; onclick=&quot;onClickImportButton(this)&quot; type=&quot;button&quot;&gt;	&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;Press &lt;strong&gt;[browse]&lt;/strong&gt; to select a TiddlyWiki document file to import, and then press &lt;strong&gt;[open]&lt;/strong&gt;.  Alternatively, you can type in the path/filename or a remote document URL (starting with &lt;a target=&quot;_blank&quot; title=&quot;External link to http://&quot; href=&quot;http://&quot; class=&quot;externalLink&quot;&gt;http://&lt;/a&gt;).  When you have entered the desired source location, press &lt;strong&gt;[load]&lt;/strong&gt; to retrieve the tiddlers from the remote source.  &lt;em&gt;Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.&lt;/em&gt;&lt;br&gt;&lt;br&gt;Select one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items).  You can press &lt;strong&gt;[select all]&lt;/strong&gt; to quickly highlight all tiddler titles in the list.  Use the &lt;strong&gt;[-]&lt;/strong&gt;, &lt;strong&gt;[+]&lt;/strong&gt;, or &lt;strong&gt;[=]&lt;/strong&gt; links to adjust the listbox size so you can view more (or less) tiddler titles at one time.  When you have chosen the tiddlers you want to import and entered any extra tags, press &lt;strong&gt;[import]&lt;/strong&gt; to begin copying them to the current TiddlyWiki document.&lt;br&gt;&lt;br&gt;&lt;strong&gt;select: all, new, changes, or differences&lt;/strong&gt;&lt;br&gt;&lt;br&gt;You can click on &lt;strong&gt;all&lt;/strong&gt;, &lt;strong&gt;new&lt;/strong&gt;, &lt;strong&gt;changes&lt;/strong&gt;, or &lt;strong&gt;differences&lt;/strong&gt; to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:&lt;br&gt;&lt;blockquote&gt;&lt;strong&gt;&quot;all&quot;&lt;/strong&gt; selects ALL tiddlers from the import source document, even if they have not been changed.&lt;br&gt;&lt;strong&gt;&quot;new&quot;&lt;/strong&gt; selects only tiddlers that are found in the import source document, but do not yet exist in the destination document&lt;br&gt;&lt;strong&gt;&quot;changes&quot;&lt;/strong&gt; selects only tiddlers that exist in both documents but that are newer in the source document&lt;br&gt;&lt;strong&gt;&quot;differences&quot;&lt;/strong&gt; selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;&lt;strong&gt;Import Tagging:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;Tiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document.  New tags are entered into the &quot;add tags&quot; input field, and then &lt;em&gt;added&lt;/em&gt; to the existing tags for each tiddler as it is imported.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Skip, Rename, Merge, or Replace:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;When importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: &lt;strong&gt;[skip]&lt;/strong&gt;, &lt;strong&gt;[rename]&lt;/strong&gt;, &lt;strong&gt;[merge]&lt;/strong&gt; and &lt;strong&gt;[replace]&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;To bypass importing this tiddler, press &lt;strong&gt;[skip]&lt;/strong&gt;.  To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press &lt;strong&gt;[rename]&lt;/strong&gt;.   Press &lt;strong&gt;[merge]&lt;/strong&gt; to combine the content from both tiddlers into a single tiddler.  Press &lt;strong&gt;[replace]&lt;/strong&gt; to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.&lt;br&gt;&lt;br&gt;&lt;em&gt;Note: if both the title &lt;strong&gt;and&lt;/strong&gt; modification date&lt;/em&gt;&lt;em&gt;/time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.&lt;/em&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;Import Report History&lt;/strong&gt;&lt;br&gt;&lt;br&gt;When tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.&lt;br&gt;&lt;br&gt;When the import process is completed, the ImportedTiddlers report is automatically displayed for your review.  If more tiddlers are subsequently imported, a new report is &lt;em&gt;added&lt;/em&gt; to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.&lt;br&gt;&lt;br&gt;If a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.&lt;br&gt;&lt;br&gt;Note: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the &quot;create a report&quot; checkbox before beginning the import processing.&lt;br&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;copy/paste the following tiddlers into your document:&lt;br&gt;&lt;strong&gt;ImportTiddlersPlugin&lt;/strong&gt; &lt;br&gt;&lt;strong&gt;ImportTiddlersPluginPatch2.1.x&lt;/strong&gt; (only for installation in TW2.1.x or earlier)&lt;br&gt;(both tagged with &lt;span class=&quot;quickopentag&quot;&gt;&lt;a tiddlylink=&quot;systemConfig&quot; refresh=&quot;link&quot; tip=&quot;The ''systemConfig'' tag is used for [[Plugin Macros]] and instructs TiddlyWiki to include the plugin in its J&quot; class=&quot;tiddlyLink tiddlyLinkExisting&quot; title=&quot;&quot; href=&quot;javascript:;&quot;&gt;systemConfig&lt;/a&gt;&lt;a tag=&quot;systemConfig&quot; class=&quot;button&quot; title=&quot;Show tiddlers tagged with 'systemConfig'&quot; href=&quot;javascript:;&quot;&gt;▾&lt;/a&gt;&lt;/span&gt;)&lt;br&gt;&lt;blockquote&gt;Important Notes:&lt;br&gt;* As of 6/27/2007, &quot;patch&quot; functions that provide backward-compatibility with TW2.1.x and earlier have been split into a separate &lt;a tiddlylink=&quot;ImportTiddlersPluginPatch2.1.x&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ImportTiddlersPluginPatch2.1.x&quot; href=&quot;http://www.climate-change-two.net/#ImportTiddlersPluginPatch2.1.x&quot; class=&quot;externalLink&quot;&gt;ImportTiddlersPluginPatch2.1.x&lt;/a&gt; tiddler to reduce installation overhead for &lt;em&gt;this&lt;/em&gt; plugin.  You only need to install this additional plugin tiddler when using ImportTiddlersPlugin in documents using TW2.1.x or earlier.&lt;br&gt;* As of 3/21/2007, the interactive &lt;code&gt;&amp;lt;&amp;lt;importTiddlers&amp;gt;&amp;gt;&lt;/code&gt; and non-interactive &lt;code&gt;&amp;lt;&amp;lt;loadTiddlers&amp;gt;&amp;gt;&lt;/code&gt; macro definitions and related code have been split into separate &lt;a tiddlylink=&quot;ImportTiddlersPlugin&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ImportTiddlersPlugin&quot; href=&quot;http://www.climate-change-two.net/#ImportTiddlersPlugin&quot; class=&quot;externalLink&quot;&gt;ImportTiddlersPlugin&lt;/a&gt; and &lt;a tiddlylink=&quot;LoadTiddlersPlugin&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#LoadTiddlersPlugin&quot; href=&quot;http://www.climate-change-two.net/#LoadTiddlersPlugin&quot; class=&quot;externalLink&quot;&gt;LoadTiddlersPlugin&lt;/a&gt; to permit selective installation of either the interactive and/or non-interactive macro functions&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;Quick Installation Tip #1:&lt;/strong&gt;&lt;br&gt;If you are using an unmodified version of TiddlyWiki (core release version &lt;span&gt;2.2.5&lt;/span&gt;), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (&lt;strong&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to TW+ImportExport.html&quot; href=&quot;TW+ImportExport.html&quot; class=&quot;externalLink&quot;&gt;download from here&lt;/a&gt;&lt;/strong&gt;), and then simply import all your content from your old document into this new, empty document.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2007.06.27 [3.5.5]&lt;/strong&gt; added missing 'fields' params to saveTiddler() calls.  Fixes problem where importing tiddlers would lose the custom fields.  Also, moved functions for backward-compatibility with TW2.1.x to separate &lt;a tiddlylink=&quot;ImportTiddlersPluginPatch2.1.x&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ImportTiddlersPluginPatch2.1.x&quot; href=&quot;http://www.climate-change-two.net/#ImportTiddlersPluginPatch2.1.x&quot; class=&quot;externalLink&quot;&gt;ImportTiddlersPluginPatch2.1.x&lt;/a&gt; tiddler, reducing the size of &lt;em&gt;this&lt;/em&gt; plugin tiddler by a significant amount.&lt;br&gt;&lt;strong&gt;2007.06.25 [3.5.4]&lt;/strong&gt; added calls to store.suspendNotifications() and store.resumeNotifications().  Eliminates redisplay processing overhead DURING import activities&lt;br&gt;&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;please see &lt;a tiddlylink=&quot;ImportTiddlersPluginHistory&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ImportTiddlersPluginHistory&quot; href=&quot;http://www.climate-change-two.net/#ImportTiddlersPluginHistory&quot; class=&quot;externalLink&quot;&gt;ImportTiddlersPluginHistory&lt;/a&gt; for additional revision details&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;strong&gt;2005.07.20 [1.0.0]&lt;/strong&gt; Initial Release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by EricShulman from &lt;a target=&quot;_blank&quot; title=&quot;External link to http:/www.elsdesign.com&quot; href=&quot;http:/www.elsdesign.com&quot; class=&quot;externalLink&quot;&gt;ELS Design Studios&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;em&gt; &lt;/em&gt; &lt;strong&gt;MACRO DEFINITION&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;// Version
version.extensions.importTiddlers = {major: 3, minor: 5, revision: 5, date: new Date(2007,6,27)};

// IE needs explicit global scoping for functions/vars called from browser events
window.onClickImportButton=onClickImportButton;
window.refreshImportList=refreshImportList;

// default cookie/option values
if (!config.options.chkImportReport) config.options.chkImportReport=true;

merge(config.macros.importTiddlers,{
	label: &quot;import tiddlers&quot;,
	prompt: &quot;Copy tiddlers from another document&quot;,
	openMsg: &quot;Opening %0&quot;,
	openErrMsg: &quot;Could not open %0 - error=%1&quot;,
	readMsg: &quot;Read %0 bytes from %1&quot;,
	foundMsg: &quot;Found %0 tiddlers in %1&quot;,
	countMsg: &quot;%0 tiddlers selected for import&quot;,
	importedMsg: &quot;Imported %0 of %1 tiddlers from %2&quot;,
	loadText: &quot;please load a document...&quot;,
	closeText: &quot;close&quot;,	// text for close button when remote file is loaded
	doneText: &quot;done&quot;,	// text for close button when remote file is not loaded
	src: &quot;&quot;,		// path/filename or URL of document to import (retrieved from SiteUrl tiddler)
	proxy: &quot;&quot;,		// URL for remote proxy script (retrieved from SiteProxy tiddler)
	useProxy: false,	// use specific proxy script in front of remote URL
	inbound: null,		// hash-indexed array of tiddlers from other document
	newTags: &quot;&quot;,		// text of tags added to imported tiddlers
	addTags: true,		// add new tags to imported tiddlers
	listsize: 8,		// # of lines to show in imported tiddler list
	importTags: true,	// include tags from remote source document when importing a tiddler
	keepTags: true,		// retain existing tags when replacing a tiddler
	index: 0,		// current processing index in import list
	sort: &quot;&quot;		// sort order for imported tiddler listbox
});

if (config.macros.importTiddlers.coreHandler==undefined)
	config.macros.importTiddlers.coreHandler=config.macros.importTiddlers.handler; // save built-in handler

config.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	if (!params[0] || params[0].toLowerCase()=='core') { // default to built in
		if (config.macros.importTiddlers.coreHandler)
			config.macros.importTiddlers.coreHandler.apply(this,arguments);
		else 
			createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);
	}
	else if (params[0]=='link') { // show link to floating panel
		var label=params[1]?params[1]:this.label;
		var prompt=params[2]?params[2]:this.prompt;
		createTiddlyButton(place,label,prompt,onClickImportMenu);
	}
	else if (params[0]=='inline') {// show panel as INLINE tiddler content
		createImportPanel(place);
		document.getElementById(&quot;importPanel&quot;).style.position=&quot;static&quot;;
		document.getElementById(&quot;importPanel&quot;).style.display=&quot;block&quot;;
	}
	else if (config.macros.loadTiddlers)
		config.macros.loadTiddlers.handler(place,macroName,params); // any other params: loadtiddlers
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; &lt;strong&gt;INTERFACE DEFINITION&lt;/strong&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; Handle link click to create/show/hide control panel&lt;br&gt;&lt;pre&gt;function onClickImportMenu(e)
{
	if (!e) var e = window.event;
	var parent=resolveTarget(e).parentNode;
	var panel = document.getElementById(&quot;importPanel&quot;);
	if (panel==undefined || panel.parentNode!=parent)
		panel=createImportPanel(parent);
	var isOpen = panel.style.display==&quot;block&quot;;
	if(config.options.chkAnimate)
		anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,&quot;none&quot;));
	else
		panel.style.display = isOpen ? &quot;none&quot; : &quot;block&quot; ;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	return(false);
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; Create control panel: HTML, CSS&lt;br&gt;&lt;pre&gt;function createImportPanel(place) {
	var panel=document.getElementById(&quot;importPanel&quot;);
	if (panel) { panel.parentNode.removeChild(panel); }
	setStylesheet(config.macros.importTiddlers.css,&quot;importTiddlers&quot;);
	panel=createTiddlyElement(place,&quot;span&quot;,&quot;importPanel&quot;,null,null)
	panel.innerHTML=config.macros.importTiddlers.html;
	refreshImportList();
	var siteURL=store.getTiddlerText(&quot;SiteUrl&quot;); if (!siteURL) siteURL=&quot;&quot;;
	document.getElementById(&quot;importSourceURL&quot;).value=siteURL;
	config.macros.importTiddlers.src=siteURL;
	var siteProxy=store.getTiddlerText(&quot;SiteProxy&quot;); if (!siteProxy) siteProxy=&quot;SiteProxy&quot;;
	document.getElementById(&quot;importSiteProxy&quot;).value=siteProxy;
	config.macros.importTiddlers.proxy=siteProxy;
	return panel;
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; CSS&lt;br&gt;&lt;pre&gt;config.macros.importTiddlers.css = '\
#importPanel {\
	display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\
	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;\
}\
#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\
#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\
#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\
#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\
#importPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\
#importPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
#importPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px;}\
#importPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\
#importPanel .rad { width:auto; }\
#importPanel .chk { width:auto; margin:1px;border:0; }\
#importPanel .btn { width:auto; }\
#importPanel .btn1 { width:98%; }\
#importPanel .btn2 { width:48%; }\
#importPanel .btn3 { width:32%; }\
#importPanel .btn4 { width:24%; }\
#importPanel .btn5 { width:19%; }\
#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\
#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\
#importCollisionPanel { display:none; margin:0.5em 0em 0em 0em; }\
';
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; HTML &lt;br&gt;&lt;pre&gt;config.macros.importTiddlers.html = '\
&amp;lt;!-- source and report --&amp;gt;\
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left&amp;gt;\
	import from\
	&amp;lt;input type=&quot;radio&quot; class=&quot;rad&quot; name=&quot;importFrom&quot; id=&quot;importFromFile&quot; value=&quot;file&quot; CHECKED\
		onClick=&quot;document.getElementById(\'importLocalPanel\').style.display=this.checked?\'block\':\'none\';\
			document.getElementById(\'importHTTPPanel\').style.display=!this.checked?\'block\':\'none\'&quot;&amp;gt; local file\
	&amp;lt;input type=&quot;radio&quot; class=&quot;rad&quot; name=&quot;importFrom&quot; id=&quot;importFromWeb&quot;  value=&quot;http&quot;\
		onClick=&quot;document.getElementById(\'importLocalPanel\').style.display=!this.checked?\'block\':\'none\';\
			document.getElementById(\'importHTTPPanel\').style.display=this.checked?\'block\':\'none\'&quot;&amp;gt; web server\
&amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt;\
	&amp;lt;input type=checkbox class=&quot;chk&quot; id=&quot;chkImportReport&quot; checked\
		onClick=&quot;config.options[\'chkImportReport\']=this.checked;&quot;&amp;gt; create a report\
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;\
&amp;lt;!-- import from local file  --&amp;gt;\
&amp;lt;div id=&quot;importLocalPanel&quot; style=&quot;display:block;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999&quot;&amp;gt;\
local document path/filename:&amp;lt;br&amp;gt;\
&amp;lt;input type=&quot;file&quot; id=&quot;fileImportSource&quot; size=57 style=&quot;width:100%&quot;\
	onKeyUp=&quot;config.macros.importTiddlers.src=this.value&quot;\
	onChange=&quot;config.macros.importTiddlers.src=this.value;&quot;&amp;gt;\
&amp;lt;/div&amp;gt;&amp;lt;!--panel--&amp;gt;\
\
&amp;lt;!-- import from http server --&amp;gt;\
&amp;lt;div id=&quot;importHTTPPanel&quot; style=&quot;display:none;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999&quot;&amp;gt;\
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left&amp;gt;\
	remote document URL:&amp;lt;br&amp;gt;\
&amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt;\
	&amp;lt;input type=&quot;checkbox&quot; class=&quot;chk&quot; id=&quot;importUseProxy&quot;\
		onClick=&quot;config.macros.importTiddlers.useProxy=this.checked;\
			document.getElementById(\'importSiteProxy\').style.display=this.checked?\'block\':\'none\'&quot;&amp;gt; use a proxy script\
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;\
&amp;lt;input type=&quot;text&quot; id=&quot;importSiteProxy&quot; style=&quot;display:none;margin-bottom:1px&quot; onfocus=&quot;this.select()&quot; value=&quot;SiteProxy&quot;\
	onKeyUp=&quot;config.macros.importTiddlers.proxy=this.value&quot;\
	onChange=&quot;config.macros.importTiddlers.proxy=this.value;&quot;&amp;gt;\
&amp;lt;input type=&quot;text&quot; id=&quot;importSourceURL&quot; onfocus=&quot;this.select()&quot; value=&quot;SiteUrl&quot;\
	onKeyUp=&quot;config.macros.importTiddlers.src=this.value&quot;\
	onChange=&quot;config.macros.importTiddlers.src=this.value;&quot;&amp;gt;\
&amp;lt;/div&amp;gt;&amp;lt;!--panel--&amp;gt;\
\
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left&amp;gt;\
	select:\
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectAll&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;select all tiddlers&quot;&amp;gt;\
		&amp;amp;nbsp;all&amp;amp;nbsp;&amp;lt;/a&amp;gt;\
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectNew&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;select tiddlers not already in destination document&quot;&amp;gt;\
		&amp;amp;nbsp;added&amp;amp;nbsp;&amp;lt;/a&amp;gt; \
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectChanges&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;select tiddlers that have been updated in source document&quot;&amp;gt;\
		&amp;amp;nbsp;changes&amp;amp;nbsp;&amp;lt;/a&amp;gt; \
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importSelectDifferences&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;select tiddlers that have been added or are different from existing tiddlers&quot;&amp;gt;\
		&amp;amp;nbsp;differences&amp;amp;nbsp;&amp;lt;/a&amp;gt; \
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importToggleFilter&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;show/hide selection filter&quot;&amp;gt;\
		&amp;amp;nbsp;filter&amp;amp;nbsp;&amp;lt;/a&amp;gt; \
&amp;lt;/td&amp;gt;&amp;lt;td align=right&amp;gt;\
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importListSmaller&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;reduce list size&quot;&amp;gt;\
		&amp;amp;nbsp;&amp;amp;#150;&amp;amp;nbsp;&amp;lt;/a&amp;gt;\
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importListLarger&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;increase list size&quot;&amp;gt;\
		&amp;amp;nbsp;+&amp;amp;nbsp;&amp;lt;/a&amp;gt;\
	&amp;lt;a href=&quot;JavaScript:;&quot; id=&quot;importListMaximize&quot;\
		onclick=&quot;onClickImportButton(this)&quot; title=&quot;maximize/restore list size&quot;&amp;gt;\
		&amp;amp;nbsp;=&amp;amp;nbsp;&amp;lt;/a&amp;gt;\
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;\
&amp;lt;select id=&quot;importList&quot; size=8 multiple\
	onchange=&quot;setTimeout(\'refreshImportList(\'+this.selectedIndex+\')\',1)&quot;&amp;gt;\
	&amp;lt;!-- NOTE: delay refresh so list is updated AFTER onchange event is handled --&amp;gt;\
&amp;lt;/select&amp;gt;\
&amp;lt;input type=checkbox class=&quot;chk&quot; id=&quot;chkAddTags&quot; checked\
	onClick=&quot;config.macros.importTiddlers.addTags=this.checked;&quot;&amp;gt;add new tags &amp;amp;nbsp;\
&amp;lt;input type=checkbox class=&quot;chk&quot; id=&quot;chkImportTags&quot; checked\
	onClick=&quot;config.macros.importTiddlers.importTags=this.checked;&quot;&amp;gt;import source tags &amp;amp;nbsp;\
&amp;lt;input type=checkbox class=&quot;chk&quot; id=&quot;chkKeepTags&quot; checked\
	onClick=&quot;config.macros.importTiddlers.keepTags=this.checked;&quot;&amp;gt;keep existing tags&amp;lt;br&amp;gt;\
&amp;lt;input type=text id=&quot;txtNewTags&quot; size=15 onKeyUp=&quot;config.macros.importTiddlers.newTags=this.value&quot; autocomplete=off&amp;gt;\
&amp;lt;div align=center&amp;gt;\
	&amp;lt;input type=button id=&quot;importLoad&quot; class=&quot;importButton&quot; style=&quot;width:32%&quot; value=&quot;load&quot;\
		title=&quot;load listbox with tiddlers from source document&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
	&amp;lt;input type=button id=&quot;importStart&quot;	 class=&quot;importButton&quot; style=&quot;width:32%&quot; value=&quot;import&quot;\
		title=&quot;add selected source tiddlers to the current document&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
	&amp;lt;input type=button id=&quot;importClose&quot;	 class=&quot;importButton&quot; style=&quot;width:32%&quot; value=&quot;close&quot;\
		title=&quot;clear listbox or hide control panel&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
&amp;lt;/div&amp;gt;\
&amp;lt;div id=&quot;importCollisionPanel&quot;&amp;gt;\
	tiddler already exists:\
	&amp;lt;input type=text id=&quot;importNewTitle&quot; size=15 autocomplete=off&quot;&amp;gt;\
	&amp;lt;div align=center&amp;gt;\
	&amp;lt;input type=button id=&quot;importSkip&quot;	class=&quot;importButton&quot; style=&quot;width:23%&quot; value=&quot;skip&quot;\
		title=&quot;do not import this tiddler&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
	&amp;lt;input type=button id=&quot;importRename&quot;  class=&quot;importButton&quot; style=&quot;width:23%&quot; value=&quot;rename&quot;\
		title=&quot;rename the incoming tiddler&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
	&amp;lt;input type=button id=&quot;importMerge&quot;   class=&quot;importButton&quot; style=&quot;width:23%&quot; value=&quot;merge&quot;\
		title=&quot;append the incoming tiddler to the existing tiddler&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
	&amp;lt;input type=button id=&quot;importReplace&quot; class=&quot;importButton&quot; style=&quot;width:23%&quot; value=&quot;replace&quot;\
		title=&quot;discard the existing tiddler&quot;\
		onclick=&quot;onClickImportButton(this)&quot;&amp;gt;\
	&amp;lt;/div&amp;gt;\
&amp;lt;/div&amp;gt;\
';
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; Control interactions&lt;br&gt;&lt;pre&gt;function onClickImportButton(which)
{
	// DEBUG alert(which.id);
	var theList		  = document.getElementById('importList');
	if (!theList) return;
	var thePanel	= document.getElementById('importPanel');
	var theCollisionPanel   = document.getElementById('importCollisionPanel');
	var theNewTitle   = document.getElementById('importNewTitle');
	var count=0;
	switch (which.id)
		{
		case 'fileImportSource':
		case 'importLoad':		// load import source into hidden frame
			importReport();		// if an import was in progress, generate a report
			config.macros.importTiddlers.inbound=null;	// clear the imported tiddler buffer
			refreshImportList();	// reset/resize the listbox
			if (config.macros.importTiddlers.src==&quot;&quot;) break;
			// Load document, read it's DOM and fill the list
			config.macros.importTiddlers.loadRemoteFile(config.macros.importTiddlers.src,
				function(success,params,txt,src,xhr) {
					var src=src.replace(/%20/g,&quot; &quot;);
					if (!success) { displayMessage(config.macros.importTiddlers.openErrMsg.format([src,xhr.status])); return; }
					var tiddlers = config.macros.importTiddlers.readTiddlersFromHTML(txt);
					var count=tiddlers?tiddlers.length:0;
					var querypos=src.lastIndexOf(&quot;?&quot;); if (querypos!=-1) src=src.substr(0,querypos);
					displayMessage(config.macros.importTiddlers.foundMsg.format([count,src]));
					config.macros.importTiddlers.inbound=tiddlers;
					window.refreshImportList(0);
				});
			break;
		case 'importSelectAll':		// select all tiddler list items (i.e., not headings)
			importReport();		// if an import was in progress, generate a report
			for (var t=0,count=0; t &amp;lt; theList.options.length; t++) {
				if (theList.options[t].value==&quot;&quot;) continue;
				theList.options[t].selected=true;
				count++;
			}
			clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));
			break;
		case 'importSelectNew':		// select tiddlers not in current document
			importReport();		// if an import was in progress, generate a report
			for (var t=0,count=0; t &amp;lt; theList.options.length; t++) {
				theList.options[t].selected=false;
				if (theList.options[t].value==&quot;&quot;) continue;
				theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);
				count+=theList.options[t].selected?1:0;
			}
			clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));
			break;
		case 'importSelectChanges':		// select tiddlers that are updated from existing tiddlers
			importReport();		// if an import was in progress, generate a report
			for (var t=0,count=0; t &amp;lt; theList.options.length; t++) {
				theList.options[t].selected=false;
				if (theList.options[t].value==&quot;&quot;||!store.tiddlerExists(theList.options[t].value)) continue;
				for (var i=0; i&amp;lt;config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler
					{ var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }
				theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified&amp;gt;0); // updated tiddler
				count+=theList.options[t].selected?1:0;
			}
			clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));
			break;
		case 'importSelectDifferences':		// select tiddlers that are new or different from existing tiddlers
			importReport();		// if an import was in progress, generate a report
			for (var t=0,count=0; t &amp;lt; theList.options.length; t++) {
				theList.options[t].selected=false;
				if (theList.options[t].value==&quot;&quot;) continue;
				if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }
				for (var i=0; i&amp;lt;config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler
					{ var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }
				theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler
				count+=theList.options[t].selected?1:0;
			}
			clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));
			break;
		case 'importToggleFilter': // show/hide filter
		case 'importFilter': // apply filter
			alert(&quot;coming soon!&quot;);
			break;
		case 'importStart':		// initiate the import processing
			importReport();		// if an import was in progress, generate a report
			config.macros.importTiddlers.index=0;
			config.macros.importTiddlers.index=importTiddlers(0);
			importStopped();
			break;
		case 'importClose':		// unload imported tiddlers or hide the import control panel
			// if imported tiddlers not loaded, close the import control panel
			if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }
			importReport();		// if an import was in progress, generate a report
			config.macros.importTiddlers.inbound=null;	// clear the imported tiddler buffer
			refreshImportList();	// reset/resize the listbox
			break;
		case 'importSkip':	// don't import the tiddler
			var theItem	= theList.options[config.macros.importTiddlers.index];
			for (var j=0;j&amp;lt;config.macros.importTiddlers.inbound.length;j++)
			if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;
			var theImported = config.macros.importTiddlers.inbound[j];
			theImported.status='skipped after asking';			// mark item as skipped
			theCollisionPanel.style.display='none';
			config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1);	// resume with NEXT item
			importStopped();
			break;
		case 'importRename':		// change name of imported tiddler
			var theItem		= theList.options[config.macros.importTiddlers.index];
			for (var j=0;j&amp;lt;config.macros.importTiddlers.inbound.length;j++)
			if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;
			var theImported		= config.macros.importTiddlers.inbound[j];
			theImported.status	= 'renamed from '+theImported.title;	// mark item as renamed
			theImported.set(theNewTitle.value,null,null,null,null);		// change the tiddler title
			theItem.value		= theNewTitle.value;			// change the listbox item text
			theItem.text		= theNewTitle.value;			// change the listbox item text
			theCollisionPanel.style.display='none';
			config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index);	// resume with THIS item
			importStopped();
			break;
		case 'importMerge':	// join existing and imported tiddler content
			var theItem	= theList.options[config.macros.importTiddlers.index];
			for (var j=0;j&amp;lt;config.macros.importTiddlers.inbound.length;j++)
			if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;
			var theImported	= config.macros.importTiddlers.inbound[j];
			var theExisting	= store.getTiddler(theItem.value);
			var theText	= theExisting.text+'\n----\n^^merged from: ';
			theText		+='[['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\n';
			theText		+='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\n'+theImported.text;
			var theDate	= new Date();
			var theTags	= theExisting.getTags()+' '+theImported.getTags();
			theImported.set(null,theText,null,theDate,theTags);
			theImported.status   = 'merged with '+theExisting.title;	// mark item as merged
			theImported.status  += ' - '+theExisting.modified.formatString(&quot;MM/DD/YYYY 0hh:0mm:0ss&quot;);
			theImported.status  += ' by '+theExisting.modifier;
			theCollisionPanel.style.display='none';
			config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index);	// resume with this item
			importStopped();
			break;
		case 'importReplace':		// substitute imported tiddler for existing tiddler
			var theItem		  = theList.options[config.macros.importTiddlers.index];
			for (var j=0;j&amp;lt;config.macros.importTiddlers.inbound.length;j++)
			if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;
			var theImported     = config.macros.importTiddlers.inbound[j];
			var theExisting	  = store.getTiddler(theItem.value);
			theImported.status  = 'replaces '+theExisting.title;		// mark item for replace
			theImported.status += ' - '+theExisting.modified.formatString(&quot;MM/DD/YYYY 0hh:0mm:0ss&quot;);
			theImported.status += ' by '+theExisting.modifier;
			theCollisionPanel.style.display='none';
			config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index);	// resume with THIS item
			importStopped();
			break;
		case 'importListSmaller':		// decrease current listbox size, minimum=5
			if (theList.options.length==1) break;
			theList.size-=(theList.size&amp;gt;5)?1:0;
			config.macros.importTiddlers.listsize=theList.size;
			break;
		case 'importListLarger':		// increase current listbox size, maximum=number of items in list
			if (theList.options.length==1) break;
			theList.size+=(theList.size&amp;lt;theList.options.length)?1:0;
			config.macros.importTiddlers.listsize=theList.size;
			break;
		case 'importListMaximize':	// toggle listbox size between current and maximum
			if (theList.options.length==1) break;
			theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;
			break;
		}
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; refresh listbox&lt;br&gt;&lt;pre&gt;function refreshImportList(selectedIndex)
{
	var theList  = document.getElementById(&quot;importList&quot;);
	if (!theList) return;
	// if nothing to show, reset list content and size
	if (!config.macros.importTiddlers.inbound) 
	{
		while (theList.length &amp;gt; 0) { theList.options[0] = null; }
		theList.options[0]=new Option(config.macros.importTiddlers.loadText,&quot;&quot;,false,false);
		theList.size=config.macros.importTiddlers.listsize;
		document.getElementById('importLoad').disabled=false;
		document.getElementById('fileImportSource').disabled=false;
		document.getElementById('importFromFile').disabled=false;
		document.getElementById('importFromWeb').disabled=false;
		document.getElementById('importClose').value=config.macros.importTiddlers.closeText;
		return;
	}

	// get the sort order
	if (!selectedIndex)   selectedIndex=0;
	if (selectedIndex==0) config.macros.importTiddlers.sort='title';		// heading
	if (selectedIndex==1) config.macros.importTiddlers.sort='title';
	if (selectedIndex==2) config.macros.importTiddlers.sort='modified';
	if (selectedIndex==3) config.macros.importTiddlers.sort='tags';
	if (selectedIndex&amp;gt;3) {
		// display selected tiddler count
		for (var t=0,count=0; t &amp;lt; theList.options.length; t++) {
			if (!theList.options[t].selected) continue;
			if (theList.options[t].value!=&quot;&quot;)
				count+=1;
			else { // if heading is selected, deselect it, and then select and count all in section
				theList.options[t].selected=false;
				for ( t++; t&amp;lt;theList.options.length &amp;amp;&amp;amp; theList.options[t].value!=&quot;&quot;; t++) {
					theList.options[t].selected=true;
					count++;
				}
			}
		}
		clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));
		return; // no refresh needed
	}

	// there are inbound tiddlers loaded... disable inapplicable controls...
	document.getElementById('importLoad').disabled=true;
	document.getElementById('fileImportSource').disabled=true;
	document.getElementById('importFromFile').disabled=true;
	document.getElementById('importFromWeb').disabled=true;
	document.getElementById('importClose').value=config.macros.importTiddlers.doneText;

	// get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)
	var tiddlers=config.macros.importTiddlers.inbound;
	tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] &amp;lt; b['title']) ? -1 : +1; });
	// clear current list contents
	while (theList.length &amp;gt; 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+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',&quot;&quot;,false,false);
	theList.options[i++]=new Option(((config.macros.importTiddlers.sort==&quot;title&quot;   )?&quot;&amp;gt;&quot;:indent)+' [by title]',&quot;&quot;,false,false);
	theList.options[i++]=new Option(((config.macros.importTiddlers.sort==&quot;modified&quot;)?&quot;&amp;gt;&quot;:indent)+' [by date]',&quot;&quot;,false,false);
	theList.options[i++]=new Option(((config.macros.importTiddlers.sort==&quot;tags&quot;)?&quot;&amp;gt;&quot;:indent)+' [by tags]',&quot;&quot;,false,false);
	// output the tiddler list
	switch(config.macros.importTiddlers.sort)
		{
		case &quot;title&quot;:
			for(var t = 0; t &amp;lt; tiddlers.length; t++)
				theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);
			break;
		case &quot;modified&quot;:
			// sort descending for newest date first
			tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] &amp;gt; b['modified']) ? -1 : +1; });
			var lastSection = &quot;&quot;;
			for(var t = 0; t &amp;lt; tiddlers.length; t++) {
				var tiddler = tiddlers[t];
				var theSection = tiddler.modified.toLocaleDateString();
				if (theSection != lastSection) {
					theList.options[i++] = new Option(theSection,&quot;&quot;,false,false);
					lastSection = theSection;
				}
				theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);
			}
			break;
		case &quot;tags&quot;:
			var theTitles = {}; // all tiddler titles, hash indexed by tag value
			var theTags = new Array();
			for(var t=0; t&amp;lt;tiddlers.length; t++) {
				var title=tiddlers[t].title;
				var tags=tiddlers[t].tags;
				if (!tags || !tags.length) {
					if (theTitles[&quot;untagged&quot;]==undefined) { theTags.push(&quot;untagged&quot;); theTitles[&quot;untagged&quot;]=new Array(); }
					theTitles[&quot;untagged&quot;].push(title);
				}
				else for(var s=0; s&amp;lt;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&amp;lt;theTags.length; tagindex++) {
				var theTag=theTags[tagindex];
				theList.options[i++]=new Option(theTag,&quot;&quot;,false,false);
				for(var t=0; t&amp;lt;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
	if (theList.size&amp;lt;config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;
	if (theList.size&amp;gt;theList.options.length) theList.size=theList.options.length;
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; re-entrant processing for handling import with interactive collision prompting&lt;br&gt;&lt;pre&gt;function importTiddlers(startIndex)
{
	if (!config.macros.importTiddlers.inbound) return -1;

	var theList = document.getElementById('importList');
	if (!theList) return;
	var t;
	// if starting new import, reset import status flags
	if (startIndex==0)
		for (var t=0;t&amp;lt;config.macros.importTiddlers.inbound.length;t++)
			config.macros.importTiddlers.inbound[t].status=&quot;&quot;;
	for (var i=startIndex; i&amp;lt;theList.options.length; i++)
		{
		// if list item is not selected or is a heading (i.e., has no value), skip it
		if ((!theList.options[i].selected) || ((t=theList.options[i].value)==&quot;&quot;))
			continue;
		for (var j=0;j&amp;lt;config.macros.importTiddlers.inbound.length;j++)
			if (config.macros.importTiddlers.inbound[j].title==t) break;
		var inbound = config.macros.importTiddlers.inbound[j];
		var theExisting = store.getTiddler(inbound.title);
		// avoid redundant import for tiddlers that are listed multiple times (when 'by tags')
		if (inbound.status==&quot;added&quot;)
			continue;
		// don't import the &quot;ImportedTiddlers&quot; history from the other document...
		if (inbound.title=='ImportedTiddlers')
			continue;
		// if tiddler exists and import not marked for replace or merge, stop importing
		if (theExisting &amp;amp;&amp;amp; (inbound.status.substr(0,7)!=&quot;replace&quot;) &amp;amp;&amp;amp; (inbound.status.substr(0,5)!=&quot;merge&quot;))
			return i;
		// assemble tags (remote + existing + added)
		var newTags = &quot;&quot;;
		if (config.macros.importTiddlers.importTags)
			newTags+=inbound.getTags()	// import remote tags
		if (config.macros.importTiddlers.keepTags &amp;amp;&amp;amp; theExisting)
			newTags+=&quot; &quot;+theExisting.getTags(); // keep existing tags
		if (config.macros.importTiddlers.addTags &amp;amp;&amp;amp; config.macros.importTiddlers.newTags.trim().length)
			newTags+=&quot; &quot;+config.macros.importTiddlers.newTags; // add new tags
		inbound.set(null,null,null,null,newTags.trim());
		// set the status to 'added' (if not already set by the 'ask the user' UI)
		inbound.status=(inbound.status==&quot;&quot;)?'added':inbound.status;
		// do the import!
		store.suspendNotifications();
		store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags, inbound.fields, true, inbound.created);
                store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value (needed for TW2.1.x and earlier)
		store.resumeNotifications();
		}
	return(-1);	// signals that we really finished the entire list
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;function importStopped()
{
	var theList     = document.getElementById('importList');
	var theNewTitle = document.getElementById('importNewTitle');
	if (!theList) return;
	if (config.macros.importTiddlers.index==-1)
		importReport();		// import finished... generate the report
	else
		{
		// import collision... show the collision panel and set the title edit field
		document.getElementById('importCollisionPanel').style.display='block';
		theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;
		}
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; &lt;strong&gt;REPORT GENERATOR&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;function importReport(quiet)
{
	if (!config.macros.importTiddlers.inbound) return;
	// DEBUG alert('importReport: start');

	// if import was not completed, the collision panel will still be open... close it now.
	var panel=document.getElementById('importCollisionPanel'); if (panel) panel.style.display='none';

	// get the alphasorted list of tiddlers
	var tiddlers = config.macros.importTiddlers.inbound;
	// gather the statistics
	var count=0;
	for (var t=0; t&amp;lt;tiddlers.length; t++)
		if (tiddlers[t].status &amp;amp;&amp;amp; tiddlers[t].status.trim().length &amp;amp;&amp;amp; tiddlers[t].status.substr(0,7)!=&quot;skipped&quot;) count++;

	// generate a report
	if (count &amp;amp;&amp;amp; config.options.chkImportReport) {
		// get/create the report tiddler
		var theReport = store.getTiddler('ImportedTiddlers');
		if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text  = &quot;&quot;; }
		// format the report content
		var now = new Date();
		var newText = &quot;On &quot;+now.toLocaleString()+&quot;, &quot;+config.options.txtUserName
		newText +=&quot; imported &quot;+count+&quot; tiddler&quot;+(count==1?&quot;&quot;:&quot;s&quot;)+&quot; from\n[[&quot;+config.macros.importTiddlers.src+&quot;|&quot;+config.macros.importTiddlers.src+&quot;]]:\n&quot;;
		if (config.macros.importTiddlers.addTags &amp;amp;&amp;amp; config.macros.importTiddlers.newTags.trim().length)
			newText += &quot;imported tiddlers were tagged with: \&quot;&quot;+config.macros.importTiddlers.newTags+&quot;\&quot;\n&quot;;
		newText += &quot;&amp;lt;&amp;lt;&amp;lt;\n&quot;;
		for (var t=0; t&amp;lt;tiddlers.length; t++) if (tiddlers[t].status) newText += &quot;#[[&quot;+tiddlers[t].title+&quot;]] - &quot;+tiddlers[t].status+&quot;\n&quot;;
		newText += &quot;&amp;lt;&amp;lt;&amp;lt;\n&quot;;
		// update the ImportedTiddlers content and show the tiddler
		theReport.text	 = newText+((theReport.text!=&quot;&quot;)?'\n----\n':&quot;&quot;)+theReport.text;
		theReport.modifier = config.options.txtUserName;
		theReport.modified = new Date();
                store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags, theReport.fields);
		if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }
	}

	// reset status flags
	for (var t=0; t&amp;lt;config.macros.importTiddlers.inbound.length; t++) config.macros.importTiddlers.inbound[t].status=&quot;&quot;;

	// mark document as dirty and let display update as needed
	if (count) { store.setDirty(true); store.notifyAll(); }

	// always show final message when tiddlers were actually loaded
	if (count) displayMessage(config.macros.importTiddlers.importedMsg.format([count,tiddlers.length,config.macros.importTiddlers.src.replace(/%20/g,&quot; &quot;)]));
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; File and XMLHttpRequest I/O&lt;br&gt;&lt;pre&gt;config.macros.importTiddlers.fileExists=function(theFile) {
	var found=false;
	// DEBUG: alert('testing fileExists('+theFile+')...');
	if(window.Components) {
		try { netscape.security.PrivilegeManager.enablePrivilege(&quot;UniversalXPConnect&quot;); }
		catch(e) { return false; } // security access denied
		var file = Components.classes[&quot;@mozilla.org/file/local;1&quot;].createInstance(Components.interfaces.nsILocalFile);
		try { file.initWithPath(theFile); }
		catch(e) { return false; } // invalid directory
		found = file.exists();
	}
	else { // use ActiveX FSO object for MSIE 
		var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
		found = fso.FileExists(theFile)
	}
	// DEBUG: alert(theFile+&quot; &quot;+(found?&quot;exists&quot;:&quot;not found&quot;));
	return found;
}

config.macros.importTiddlers.loadRemoteFile = function(src,callback,quiet) {
	if (src==undefined || !src.length) return null; // filename is required
	if (!quiet) clearMessage();
	if (!quiet) displayMessage(this.openMsg.format([src.replace(/%20/g,&quot; &quot;)]));
	if (src.substr(0,5)!=&quot;http:&quot; &amp;amp;&amp;amp; src.substr(0,5)!=&quot;file:&quot;) { // if src is relative (i.e., not a URL)
		if (!this.fileExists(src)) { // if file cannot be found, might be relative path.. try fixup
			var pathPrefix=document.location.href;  // get current document path and trim off filename
			var slashpos=pathPrefix.lastIndexOf(&quot;/&quot;); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf(&quot;\\&quot;); 
			if (slashpos!=-1 &amp;amp;&amp;amp; slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
			src=pathPrefix+src;
			if (pathPrefix.substr(0,5)!=&quot;http:&quot;) src=getLocalPath(src);
		}
	}
	if (src.substr(0,5)!=&quot;http:&quot; &amp;amp;&amp;amp; src.substr(0,5)!=&quot;file:&quot;) { // if not a URL, read from local filesystem
		var txt=loadFile(src);
		if ((txt==null)||(txt==false)) // file didn't load
			{ if (!quiet) displayMessage(config.macros.importTiddlers.openErrMsg.format([src.replace(/%20/g,&quot; &quot;),&quot;(filesystem error)&quot;])); }
		else {
			if (!quiet) displayMessage(config.macros.importTiddlers.readMsg.format([txt.length,src.replace(/%20/g,&quot; &quot;)]));
			if (callback) callback(true,quiet,convertUTF8ToUnicode(txt),src,null);
		}
	}
	else {
		var xhr=loadRemoteFile(src,callback,quiet);
		if (!quiet &amp;amp;&amp;amp; !xhr) displayMessage(config.macros.importTiddlers.openErrMsg.format([src,&quot;(XMLHTTPRequest error)&quot;]));
	}
}

config.macros.importTiddlers.readTiddlersFromHTML=function(html)
{
	var remoteStore=new TiddlyWiki();
	remoteStore.importTiddlyWiki(html);
	return remoteStore.getTiddlers(&quot;title&quot;);	
}
&lt;/pre&gt;</description>
<category>systemConfig</category>
<category>includeNew</category>
<category>editing</category>
<category>ImportExportPackage</category>
<link>http://www.climate-change-two.net/#ImportTiddlersPlugin</link>
<pubDate>Sun, 23 Sep 2007 17:30:00 GMT</pubDate>
</item>
<item>
<title>DisableWikiLinksPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;DisableWikiLinksPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Source:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#DisableWikiLinksPlugin&quot; href=&quot;http://www.TiddlyTools.com/#DisableWikiLinksPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#DisableWikiLinksPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Author:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;License:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;CoreVersion:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2.0.10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;This plugin allows you to disable TiddlyWiki's automatic WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links.  To create a tiddler link when automatic linking is disabled, you must enclose the link text within &lt;code&gt;[[...]]&lt;/code&gt;.&lt;br&gt;&lt;br&gt;You can also block automatic WikiWord linking behavior only for non-existing tiddler titles, while still automatically linking WikiWords that correspond to existing tiddlers titles or shadow tiddler titles.&lt;br&gt;&lt;br&gt;You can also block specific selected WikiWords from being automatically linked by listing them in &lt;a tiddlylink=&quot;DisableWikiLinksList&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#DisableWikiLinksList&quot; href=&quot;http://www.climate-change-two.net/#DisableWikiLinksList&quot; class=&quot;externalLink&quot;&gt;DisableWikiLinksList&lt;/a&gt;, separated by whitespace.  This tiddler is optional and, when present, causes the listed words to always be excluded, even if automatic linking of other WikiWords is being permitted.  &lt;br&gt;&lt;br&gt;Note: WikiWords contained in default &lt;strong&gt;shadow&lt;/strong&gt; tiddlers will be automatically linked unless you select an additional checkbox option lets you disable these automatic links as well, though this is not recommended, since it can make it more difficult to access some TiddlyWiki standard default content (such as &lt;a tiddlylink=&quot;AdvancedOptions&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#AdvancedOptions&quot; href=&quot;http://www.climate-change-two.net/#AdvancedOptions&quot; class=&quot;externalLink&quot;&gt;AdvancedOptions&lt;/a&gt; or &lt;a tiddlylink=&quot;SideBarTabs&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SideBarTabs&quot; href=&quot;http://www.climate-change-two.net/#SideBarTabs&quot; class=&quot;externalLink&quot;&gt;SideBarTabs&lt;/a&gt;)&lt;br&gt;&lt;br&gt;&lt;h5&gt;Configuration&lt;/h5&gt;&lt;blockquote&gt;Self-contained control panel:&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkDisableNonExistingWikiLinks&quot; type=&quot;checkbox&quot;&gt; Disable automatic WikiWord links for non-existing tiddlers&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkDisableWikiLinks&quot; type=&quot;checkbox&quot;&gt; Disable ALL automatic WikiWord tiddler links&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkAllowLinksFromShadowTiddlers&quot; type=&quot;checkbox&quot;&gt; ... except for WikiWords contained in shadow tiddlers&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;&lt;strong&gt;DisableWikiLinksPlugin&lt;/strong&gt; (tagged with &lt;span class=&quot;quickopentag&quot;&gt;&lt;a tiddlylink=&quot;systemConfig&quot; refresh=&quot;link&quot; tip=&quot;The ''systemConfig'' tag is used for [[Plugin Macros]] and instructs TiddlyWiki to include the plugin in its J&quot; class=&quot;tiddlyLink tiddlyLinkExisting&quot; title=&quot;&quot; href=&quot;javascript:;&quot;&gt;systemConfig&lt;/a&gt;&lt;a tag=&quot;systemConfig&quot; class=&quot;button&quot; title=&quot;Show tiddlers tagged with 'systemConfig'&quot; href=&quot;javascript:;&quot;&gt;▾&lt;/a&gt;&lt;/span&gt;)&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2006.12.31 [1.4.0]&lt;/strong&gt; in formatter, test for chkDisableNonExistingWikiLinks&lt;br&gt;&lt;strong&gt;2006.12.09 [1.3.0]&lt;/strong&gt; in formatter, test for excluded wiki words specified in DisableWikiLinksList&lt;br&gt;&lt;strong&gt;2006.12.09 [1.2.2]&lt;/strong&gt; fix logic in autoLinkWikiWords() (was allowing links TO shadow tiddlers, even when chkDisableWikiLinks is TRUE).  &lt;br&gt;&lt;strong&gt;2006.12.09 [1.2.1]&lt;/strong&gt; revised logic for handling links in shadow content&lt;br&gt;&lt;strong&gt;2006.12.08 [1.2.0]&lt;/strong&gt; added hijack of Tiddler.prototype.autoLinkWikiWords so regular (non-bracketed) WikiWords won't be added to the missing list&lt;br&gt;&lt;strong&gt;2006.05.24 [1.1.0]&lt;/strong&gt; added option to NOT bypass automatic wikiword links when displaying default shadow content (default is to auto-link shadow content)&lt;br&gt;&lt;strong&gt;2006.02.05 [1.0.1]&lt;/strong&gt; wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals&lt;br&gt;&lt;strong&gt;2005.12.09 [1.0.0]&lt;/strong&gt; initial release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by EricShulman from &lt;a target=&quot;_blank&quot; title=&quot;External link to http:/www.elsdesign.com&quot; href=&quot;http:/www.elsdesign.com&quot; class=&quot;externalLink&quot;&gt;ELS Design Studios&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.disableWikiLinks= {major: 1, minor: 4, revision: 0, date: new Date(2006,12,31)};

if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks= false;
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
	for (var i=0; i&amp;lt;config.formatters.length &amp;amp;&amp;amp; config.formatters[i].name!=&quot;wikiLink&quot;; i++);
	config.formatters[i].coreHandler=config.formatters[i].handler;
	config.formatters[i].handler=function(w) {
		// supress any leading &quot;~&quot; (if present)
		var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
		var title=w.matchText.substr(skip);
		var exists=store.tiddlerExists(title);
		var inShadow=w.tiddler &amp;amp;&amp;amp; store.isShadowTiddler(w.tiddler.title);

		// check for specific excluded wiki words
		var t=store.getTiddlerText(&quot;DisableWikiLinksList&quot;)
		if (t &amp;amp;&amp;amp; t.length &amp;amp;&amp;amp; t.indexOf(w.matchText)!=-1)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not disabling links from shadows (default setting)
		if (config.options.chkAllowLinksFromShadowTiddlers &amp;amp;&amp;amp; inShadow)
			return this.coreHandler(w);

		// check for non-existing non-shadow tiddler
		if (config.options.chkDisableNonExistingWikiLinks &amp;amp;&amp;amp; !exists)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not enabled, just do standard WikiWord link formatting
		if (!config.options.chkDisableWikiLinks)
			return this.coreHandler(w);

		// just return text without linking
		w.outputText(w.output,w.matchStart+skip,w.nextMatch)
	}
}

Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
	// DEBUG alert(&quot;processing: &quot;+this.title);
	// if all automatic links are not disabled, just return results from core function
	if (!config.options.chkDisableWikiLinks)
		return this.coreAutoLinkWikiWords.apply(this,arguments);
	return false;
}
&lt;/pre&gt;</description>
<category>systemConfig</category>
<category>authoring</category>
<category>excludeLists</category>
<category>els design</category>
<link>http://www.climate-change-two.net/#DisableWikiLinksPlugin</link>
<pubDate>Sun, 23 Sep 2007 17:18:00 GMT</pubDate>
</item>
<item>
<title>SearchOptions plugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;thead&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;strong&gt;SearchOptions&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;Eric Shulman&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Eric Shulman&quot; href=&quot;http://www.climate-change-two.net/#Eric%20Shulman&quot; class=&quot;externalLink&quot;&gt;Eric Shulman&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;2.2.1 (2006.02.03)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;Allows modification of search criteria.&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#SearchOptionsPlugin&quot; href=&quot;http://www.TiddlyTools.com/#SearchOptionsPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#SearchOptionsPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Licence&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;Creative Commons Attribution ShareAlike 2.5 Licence&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Creative Commons Attribution ShareAlike 2.5 Licence&quot; href=&quot;http://www.climate-change-two.net/#Creative%20Commons%20Attribution%20ShareAlike%202.5%20Licence&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution ShareAlike 2.5 Licence&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text'). However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases.  In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.&lt;br&gt;&lt;br&gt;&lt;h5&gt;Usage&lt;/h5&gt;&lt;blockquote&gt;This plugin adds checkboxes (see below and in &lt;a tiddlylink=&quot;AdvancedOptions&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#AdvancedOptions&quot; href=&quot;http://www.climate-change-two.net/#AdvancedOptions&quot; class=&quot;externalLink&quot;&gt;AdvancedOptions&lt;/a&gt;) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags.  It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated &quot;SearchResults&quot; tiddler), rather than actually displaying all matching tiddlers.  You can also enable/disable the &quot;incremental search&quot; (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the &quot;search:&quot; prompt text.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Configuration&lt;/h5&gt;&lt;blockquote&gt;In additional to the checkboxes in &lt;a tiddlylink=&quot;AdvancedOptions&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#AdvancedOptions&quot; href=&quot;http://www.climate-change-two.net/#AdvancedOptions&quot; class=&quot;externalLink&quot;&gt;AdvancedOptions&lt;/a&gt;, a self-contained control panel is included here for your convenience:&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchTitles&quot; type=&quot;checkbox&quot;&gt; Search tiddler titles&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchText&quot; type=&quot;checkbox&quot;&gt; Search tiddler text&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchTags&quot; type=&quot;checkbox&quot;&gt; Search in tiddler tags&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchTitlesFirst&quot; type=&quot;checkbox&quot;&gt; Show title matches first&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchList&quot; type=&quot;checkbox&quot;&gt; Show list of matching tiddlers&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSearchIncremental&quot; type=&quot;checkbox&quot;&gt; Incremental searching&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;&lt;strong&gt;SearchOptionsPlugin&lt;/strong&gt; (tagged with &lt;span class=&quot;quickopentag&quot;&gt;&lt;a tiddlylink=&quot;systemConfig&quot; refresh=&quot;link&quot; tip=&quot;The ''systemConfig'' tag is used for [[Plugin Macros]] and instructs TiddlyWiki to include the plugin in its J&quot; class=&quot;tiddlyLink tiddlyLinkExisting&quot; title=&quot;&quot; href=&quot;javascript:;&quot;&gt;systemConfig&lt;/a&gt;&lt;a tag=&quot;systemConfig&quot; class=&quot;button&quot; title=&quot;Show tiddlers tagged with 'systemConfig'&quot; href=&quot;javascript:;&quot;&gt;▾&lt;/a&gt;&lt;/span&gt;)&lt;br&gt;&lt;sup&gt;documentation and javascript for SearchOptionsPlugin handling&lt;/sup&gt;&lt;br&gt;&lt;br&gt;When installed, this plugin automatically adds checkboxes in the &lt;a tiddlylink=&quot;AdvancedOptions&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#AdvancedOptions&quot; href=&quot;http://www.climate-change-two.net/#AdvancedOptions&quot; class=&quot;externalLink&quot;&gt;AdvancedOptions&lt;/a&gt; shadow tiddler so you can enable/disable the extended search behavior.  However, if you have customized your &lt;a tiddlylink=&quot;AdvancedOptions&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#AdvancedOptions&quot; href=&quot;http://www.climate-change-two.net/#AdvancedOptions&quot; class=&quot;externalLink&quot;&gt;AdvancedOptions&lt;/a&gt;, you will need to manually add &lt;code&gt;&amp;lt;&amp;lt;option chkSearchTitles&amp;gt;&amp;gt;&lt;/code&gt;,  &lt;code&gt;&amp;lt;&amp;lt;option chkSearchText&amp;gt;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;&amp;lt;option chkSearchTitlesFirst&amp;gt;&amp;gt;&lt;/code&gt;  (with suitable prompt text) to your customized tiddler.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2006.02.03 [2.2.1]&lt;/strong&gt;&lt;br&gt;rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes.  note that core no longer permits &quot;blank=all&quot; searches, so neither does this plugin.  To search for all, use &quot;.&quot; with text patterns enabled.&lt;br&gt;&lt;strong&gt;2006.02.02 [2.2.0]&lt;/strong&gt;&lt;br&gt;in search.handler(), KeyHandler() function clears 'left over' timeout when search input is &amp;lt; 3 chars.  Prevents searching on shorter text when shortened by rapid backspaces (&amp;lt;500msec)&lt;br&gt;&lt;strong&gt;2006.02.01 [2.1.9]&lt;/strong&gt;&lt;br&gt;in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching&lt;br&gt;also, blank search text now presents &quot;No search text.  Continue anyway?&quot; confirm() message box, so search on blank can still be processed if desired by user.&lt;br&gt;&lt;strong&gt;2006.02.01 [2.1.8]&lt;/strong&gt;&lt;br&gt;in doSearch(), added alert/return if search text is blank&lt;br&gt;&lt;strong&gt;2006.01.20 [2.1.7]&lt;/strong&gt;&lt;br&gt;fixed setting of config.macros.search.reportTitle so that Tweaks can override it.&lt;br&gt;&lt;strong&gt;2006.01.19 [2.1.6]&lt;/strong&gt;&lt;br&gt;improved SearchResults formatting, added a &quot;search again&quot; form to the report (based on a suggestion from MorrisGray)&lt;br&gt;define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title&lt;br&gt;&lt;strong&gt;2006.01.18 [2.1.5]&lt;/strong&gt;&lt;br&gt;Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.&lt;br&gt;&lt;strong&gt;2006.01.17 [2.1.4]&lt;/strong&gt;&lt;br&gt;Use regExp.search() instead of regExp.test() to scan for matches.  Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.&lt;br&gt;&lt;strong&gt;2006.01.15 [2.1.3]&lt;/strong&gt;&lt;br&gt;Added information (date/time, username, search options used) to SearchResults output&lt;br&gt;&lt;strong&gt;2006.01.10 [2.1.2]&lt;/strong&gt;&lt;br&gt;use displayTiddlers() to render matched tiddlers.  This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.&lt;br&gt;&lt;strong&gt;2006.01.08 [2.1.1]&lt;/strong&gt;&lt;br&gt;corrected invalid variable reference, &quot;txt.value&quot; to &quot;text&quot; in story.search()&lt;br&gt;&lt;strong&gt;2006.01.08 [2.1.0]&lt;/strong&gt;&lt;br&gt;re-write to match new store.search(), store.search.handler() and story.search() functions.&lt;br&gt;&lt;strong&gt;2005.12.30 [2.0.0]&lt;/strong&gt;&lt;br&gt;Upgraded to TW2.0&lt;br&gt;when rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.&lt;br&gt;&lt;strong&gt;2005.12.26 [1.4.0]&lt;/strong&gt;&lt;br&gt;added option to search for matching text in tiddler tags&lt;br&gt;&lt;strong&gt;2005.12.21 [1.3.7]&lt;/strong&gt;&lt;br&gt;use \\ to 'escape' single quotes in tiddler titles when generating &quot;Open all matching tiddlers&quot; link.  Also, added access key: &quot;O&quot;, to trigger &quot;open all&quot; link.&lt;br&gt;Based on a suggestion by UdoBorkowski.&lt;br&gt;&lt;strong&gt;2005.12.18 [1.3.6]&lt;/strong&gt;&lt;br&gt;call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon&lt;br&gt;&lt;strong&gt;2005.12.17 [1.3.5]&lt;/strong&gt;&lt;br&gt;if no matches found, just display message and delete any existing SearchResults tiddler.&lt;br&gt;&lt;strong&gt;2005.12.17 [1.3.4]&lt;/strong&gt;&lt;br&gt;use &lt;span&gt;{{{&lt;/span&gt;  and &lt;span&gt;}}}&lt;/span&gt; to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered &lt;br&gt;Based on a suggestion by UdoBorkowski.&lt;br&gt;&lt;strong&gt;2005.12.14 [1.3.3]&lt;/strong&gt;&lt;br&gt;tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches&lt;br&gt;Based on a suggestion by UdoBorkowski.&lt;br&gt;&lt;strong&gt;2005.12.14 [1.3.2]&lt;/strong&gt;&lt;br&gt;added &quot;open all matching tiddlers...&quot; link to search results output.&lt;br&gt;Based on a suggestion by UdoBorkowski.&lt;br&gt;&lt;strong&gt;2005.12.10 [1.3.1]&lt;/strong&gt;&lt;br&gt;added &quot;discard search results&quot; link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.&lt;br&gt;&lt;strong&gt;2005.12.01 [1.3.0]&lt;/strong&gt;&lt;br&gt;added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).&lt;br&gt;added handling for Enter key so it can be used to start a search.&lt;br&gt;Based on a suggestion by LyallPearce&lt;br&gt;&lt;strong&gt;2005.11.25 [1.2.1]&lt;/strong&gt;&lt;br&gt;renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin&lt;br&gt;&lt;strong&gt;2005.11.25 [1.2.0]&lt;/strong&gt;&lt;br&gt;added chkSearchList option&lt;br&gt;Based on a suggestion by RodneyGomes&lt;br&gt;&lt;strong&gt;2005.10.19 [1.1.0]&lt;/strong&gt;&lt;br&gt;added chkSearchTitlesFirst option.&lt;br&gt;Based on a suggestion by ChristianHauck&lt;br&gt;&lt;strong&gt;2005.10.18 [1.0.0]&lt;/strong&gt;&lt;br&gt;Initial Release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by &lt;a tiddlylink=&quot;Eric Shulman&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Eric Shulman&quot; href=&quot;http://www.climate-change-two.net/#Eric%20Shulman&quot; class=&quot;externalLink&quot;&gt;Eric Shulman&lt;/a&gt; from &lt;a target=&quot;_blank&quot; title=&quot;External link to http:/www.elsdesign.com&quot; href=&quot;http:/www.elsdesign.com&quot; class=&quot;externalLink&quot;&gt;ELS Design Studios&lt;/a&gt;.&lt;br&gt;Based on a suggestion by Lyall Pearce.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.SearchTitleOrText = {major: 2, minor: 2, revision: 1, date: new Date(2006,2,3)};
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=false;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;

config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkSearchTitles&amp;gt;&amp;gt; Search in tiddler titles&quot;;
config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkSearchText&amp;gt;&amp;gt; Search in tiddler text&quot;;
config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkSearchTags&amp;gt;&amp;gt; Search in tiddler tags&quot;;
config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkSearchTitlesFirst&amp;gt;&amp;gt; Search results show title matches first&quot;;
config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkSearchList&amp;gt;&amp;gt; Search results show list of matching tiddlers&quot;;
config.shadowTiddlers.AdvancedOptions += &quot;\n&amp;lt;&amp;lt;option chkSearchIncremental&amp;gt;&amp;gt; Incremental searching&quot;;
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;if (config.macros.search.reportTitle==undefined)
config.macros.search.reportTitle=&quot;SearchResults&quot;;
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;config.macros.search.handler = function(place,macroName,params)
{
var lastSearchText = &quot;&quot;;
var searchTimeout = null;
var doSearch = function(txt)
{
if (txt.value.length&amp;gt;0)
{
story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
lastSearchText = txt.value;
}
};
var clickHandler = function(e)
{
doSearch(this.nextSibling);
return false;
};
var keyHandler = function(e)
{
if (!e) var e = window.event;
switch(e.keyCode)
{
case 13: // ELS: handle enter key
doSearch(this);
break;
case 27:
this.value = &quot;&quot;;
clearMessage();
break;
}
if (config.options.chkSearchIncremental)
{
if(this.value.length &amp;gt; 2)
{
if(this.value != lastSearchText)
{
if(searchTimeout) clearTimeout(searchTimeout);
var txt = this;
searchTimeout = setTimeout(function() {doSearch(txt);},500);
}
}
else
if(searchTimeout) clearTimeout(searchTimeout);
}
};
var focusHandler = function(e)
{
this.select();
};
var btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);
var txt = createTiddlyElement(place,&quot;input&quot;,null,null,null);
if(params[0])
txt.value = params[0];
txt.onkeyup = keyHandler;
txt.onfocus = focusHandler;
txt.setAttribute(&quot;size&quot;,this.sizeTextbox);
txt.setAttribute(&quot;accessKey&quot;,this.accessKey);
txt.setAttribute(&quot;autocomplete&quot;,&quot;off&quot;);
if(config.browser.isSafari)
{
txt.setAttribute(&quot;type&quot;,&quot;search&quot;);
txt.setAttribute(&quot;results&quot;,&quot;5&quot;);
}
else
txt.setAttribute(&quot;type&quot;,&quot;text&quot;);
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? &quot;mg&quot; : &quot;img&quot;);
var matches = store.search(highlightHack,&quot;title&quot;,&quot;excludeSearch&quot;);
var q = useRegExp ? &quot;/&quot; : &quot;'&quot;;
clearMessage();
if (!matches.length) {
if (config.options.chkSearchList) discardSearchResults();
displayMessage(config.macros.search.failureMsg.format([q+text+q]));
} else {
if (config.options.chkSearchList) 
reportSearchResults(text,matches);
else {
var titles = []; for(var t=0; t&amp;lt;matches.length; t++) titles.push(matches[t].title);
this.closeAllTiddlers(); story.displayTiddlers(null,titles);
displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
}
}
highlightHack = null;
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
var candidates = this.reverseLookup(&quot;tags&quot;,excludeTag,false,sortField);

// scan for matching titles
var title_results = [];
if (config.options.chkSearchTitles)
for(var t=0; t&amp;lt;candidates.length; t++)
if(candidates[t].title.search(searchRegExp)!=-1)
title_results.push(candidates[t]);

// scan for matching text
var text_results = [];
if (config.options.chkSearchText)
for(var t=0; t&amp;lt;candidates.length; t++)
if(candidates[t].text.search(searchRegExp)!=-1)
text_results.push(candidates[t]);

// scan for matching tags
var tag_results = [];
if (config.options.chkSearchTags)
for(var t=0; t&amp;lt;candidates.length; t++)
if(candidates[t].tags.join(&quot; &quot;).search(searchRegExp)!=-1)
tag_results.push(candidates[t]);

// merge the results, eliminating redundant matches
var results = [];
for(var t=0; t&amp;lt;title_results.length; t++) results.pushUnique(title_results[t]);
for(var t=0; t&amp;lt;text_results.length; t++) results.pushUnique(text_results[t]);
for(var t=0; t&amp;lt;tag_results.length; t++) results.pushUnique(tag_results[t]);

// if not 'titles first',  re-sort results to so titles, text and tag matches are mixed together
if(!sortField) sortField = &quot;title&quot;;
var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] &amp;lt; b[sortField]) ? -1 : +1; }
if (!config.options.chkSearchTitlesFirst) results.sort(bySortField);
return results;
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; &lt;strong&gt;REPORT GENERATOR&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? &quot;/&quot; : &quot;'&quot;;
var body=&quot;&quot;;

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

// numbered list of links to matching tiddlers
body+=&quot;\n&amp;lt;&amp;lt;&amp;lt;&quot;;
for(var t=0;t&amp;lt;matches.length;t++) body+=&quot;\n# [[&quot;+matches[t].title+&quot;]]&quot;;
body+=&quot;\n&amp;lt;&amp;lt;&amp;lt;\n&quot;;

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

// discard search results button
body+=&quot;&amp;lt;html&amp;gt;&amp;lt;input type=\&quot;button\&quot; href=\&quot;javascript:;\&quot; &quot;;
body+=&quot;onclick=\&quot;story.closeTiddler('&quot;+title+&quot;'); store.deleteTiddler('&quot;+title+&quot;');\&quot; &quot;;
body+=&quot;value=\&quot;discard &quot;+title+&quot;\&quot;&amp;gt;&amp;lt;/html&amp;gt;&quot;;

// search again
body+=&quot;\n\n----\n&quot;;
body+=&quot;&amp;lt;&amp;lt;search \&quot;&quot;+text+&quot;\&quot;&amp;gt;&amp;gt; &quot;;
body+=&quot;&amp;lt;&amp;lt;option chkSearchTitles&amp;gt;&amp;gt;titles &quot;;
body+=&quot;&amp;lt;&amp;lt;option chkSearchText&amp;gt;&amp;gt;text &quot;;
body+=&quot;&amp;lt;&amp;lt;option chkSearchTags&amp;gt;&amp;gt;tags&quot;;
body+=&quot;&amp;lt;&amp;lt;option chkCaseSensitiveSearch&amp;gt;&amp;gt;case-sensitive &quot;;
body+=&quot;&amp;lt;&amp;lt;option chkRegExpSearch&amp;gt;&amp;gt;text patterns&quot;;

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

// use alternate &quot;search again&quot; label in &amp;lt;&amp;lt;search&amp;gt;&amp;gt; macro
var oldprompt=config.macros.search.label;
config.macros.search.label=&quot;search again&quot;;

// render tiddler
story.displayTiddler(null,title,1); // force refresh

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

}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
// remove the tiddler
story.closeTiddler(config.macros.search.reportTitle);
store.deleteTiddler(config.macros.search.reportTitle);
}
&lt;/pre&gt;&lt;br&gt;&lt;br&gt;</description>
<category>3rd party plugin</category>
<category>excludeLists</category>
<category>plugin macro</category>
<category>systemConfig</category>
<category>els design</category>
<category>search</category>
<link>http://www.climate-change-two.net/#%5B%5BSearchOptions%20plugin%5D%5D</link>
<pubDate>Sun, 23 Sep 2007 17:12:00 GMT</pubDate>
</item>
<item>
<title>NestedSlidersPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;NestedSlidersPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Source:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#NestedSlidersPlugin&quot; href=&quot;http://www.TiddlyTools.com/#NestedSlidersPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#NestedSlidersPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;Author:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;&lt;strong&gt;License:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;&lt;strong&gt;CoreVersion:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2.0.10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;Quickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content.  Optional syntax allows &lt;strong&gt;default to open&lt;/strong&gt;, &lt;strong&gt;custom button label/tooltip&lt;/strong&gt; and &lt;strong&gt;automatic blockquote formatting.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created.  This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.&lt;br&gt;&lt;br&gt;For more details, please click on a section headline below:&lt;br&gt;!!!!![Configuration]&amp;gt;&lt;br&gt;Debugging messages for 'lazy sliders' deferred rendering:&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkDebugLazySliderDefer&quot; type=&quot;checkbox&quot;&gt; show debugging alert when deferring slider rendering&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkDebugLazySliderRender&quot; type=&quot;checkbox&quot;&gt; show debugging alert when deferred slider is actually rendered&lt;br&gt;===&lt;br&gt;!!!!![Usage and Options]&amp;gt;&lt;br&gt;When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content.  Use &lt;code&gt;+++&lt;/code&gt; and &lt;code&gt;===&lt;/code&gt; to delimit the slider content.  Additional optional syntax elements let you specify&lt;br&gt;&lt;ul&gt;&lt;li&gt;default to open&lt;ul&gt;&lt;li&gt; closed  &lt;code&gt;+++&lt;/code&gt; and  &lt;code&gt;===&lt;/code&gt;&lt;/li&gt;&lt;li&gt; open &lt;code&gt;++++&lt;/code&gt; and &lt;code&gt;===&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;blockquote&gt; mark the start and end of the slider definition, respectively.  When the extra &lt;code&gt;+&lt;/code&gt; is used, the slider will be open when initially displayed.&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;cookiename: &lt;code&gt;(cookiename)&lt;/code&gt; - saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.&lt;/li&gt;&lt;li&gt;heading level&lt;/li&gt;&lt;li&gt;floater: (with optional CSS width value)&lt;/li&gt;&lt;li&gt;mouse auto rollover: &lt;code&gt;*&lt;/code&gt; &lt;sup&gt; automatically opens/closes slider on &quot;rollover&quot; as well as when clicked&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;custom class/label/tooltip/accesskey: &lt;code&gt;{{class{[label=key|tooltip]&lt;/code&gt;}}} &lt;sup&gt;uses custom label/tooltip/accesskey.  &lt;code&gt;{{class{...&lt;/code&gt;}}}, &lt;code&gt;=key&lt;/code&gt; and &lt;code&gt;|tooltip&lt;/code&gt; are optional.  'class' is any valid CSS class name, used to style the slider label text.  'key' must be a &lt;strong&gt;single letter only&lt;/strong&gt;.  Default labels/tootips are: &quot;&amp;gt;&quot; (more) and &quot;&amp;lt;&quot; (less), with no default access key assignment.&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;automatic blockquote:  &lt;code&gt;&quot;&amp;gt;&quot;&lt;/code&gt; &lt;em&gt;(without the quotes)&lt;/em&gt; &lt;sup&gt;automatically adds blockquote formatting to slider content&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;deferred rendering&lt;/li&gt;&lt;/ul&gt;The complete syntax, using all options, is:&lt;br&gt;&lt;pre&gt;++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}&amp;gt;...
content goes here
===
&lt;/pre&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt; &lt;code&gt;!&lt;/code&gt; through &lt;code&gt;!!!!!&lt;/code&gt;&lt;sup&gt;&lt;br&gt;displays the slider label using a formatted headline (Hn) style instead of a button/link style&lt;/sup&gt;&lt;/li&gt;&lt;li&gt; &lt;code&gt;^width^&lt;/code&gt; (or just &lt;code&gt;^&lt;/code&gt;)&lt;sup&gt;&lt;br&gt;makes the slider 'float' on top of other content rather than shifting that content downward.  'width' must be a valid CSS value (e.g., &quot;30em&quot;, &quot;180px&quot;, &quot;50%&quot;, etc.).  If omitted, the default width is &quot;auto&quot; (i.e., fit to content)&lt;/sup&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt; &lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt; &lt;code&gt;&quot;...&quot;&lt;/code&gt; &lt;em&gt;(without the quotes)&lt;/em&gt;&lt;sup&gt;&lt;br&gt;defers rendering of closed sliders until the first time they are opened.  &lt;em&gt;Note: deferred rendering may produce unexpected results in some cases.  Use with care.&lt;/em&gt;&lt;/sup&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;em&gt;Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the &lt;code&gt;+++&lt;/code&gt; 'start slider' or preceding the &lt;code&gt;===&lt;/code&gt; 'end slider' sequence are automatically suppressed so that excess whitespace is eliminated from the output.&lt;/em&gt;&lt;br&gt;===&lt;br&gt;!!!!![Examples]&amp;gt;&lt;br&gt;simple in-line slider: &lt;br&gt;&lt;pre&gt;+++
   content
===
&lt;/pre&gt;&lt;a class=&quot;button&quot; title=&quot;show&quot; href=&quot;javascript:;&quot;&gt;&amp;gt;&lt;/a&gt;&lt;div style=&quot;display: none;&quot; class=&quot;sliderPanel&quot;&gt;content&lt;/div&gt;&lt;hr&gt;use a custom label and tooltip: &lt;br&gt;&lt;pre&gt;+++[label|tooltip]
   content
===
&lt;/pre&gt;&lt;a class=&quot;button&quot; title=&quot;tooltip&quot; href=&quot;javascript:;&quot;&gt;label&lt;/a&gt;&lt;div style=&quot;display: none;&quot; class=&quot;sliderPanel&quot;&gt;content&lt;/div&gt;&lt;hr&gt;content automatically blockquoted: &lt;br&gt;&lt;pre&gt;+++&amp;gt;
   content
===
&lt;/pre&gt;&lt;a class=&quot;button&quot; title=&quot;show&quot; href=&quot;javascript:;&quot;&gt;&amp;gt;&lt;/a&gt;&lt;div style=&quot;display: none;&quot; class=&quot;sliderPanel&quot;&gt;&lt;blockquote&gt;content&lt;/blockquote&gt;&lt;/div&gt;&lt;hr&gt;all options combined &lt;em&gt;(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)&lt;/em&gt;&lt;br&gt;&lt;pre&gt;++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}&amp;gt;...
   content
===
&lt;/pre&gt;(testcookie)!!!^30em^*&lt;span class=&quot;big&quot;&gt;[label=Z|click or press Alt-Z to open]&lt;/span&gt;&amp;gt;...&lt;br&gt;   content&lt;br&gt;===&lt;br&gt;&lt;hr&gt;complex nesting example:&lt;br&gt;&lt;pre&gt;+++^[get info...=I|click for information or press Alt-I]
   put some general information here, plus a floating slider with more specific info:
   +++^10em^[view details...|click for details]
      put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
   ===
===
&lt;/pre&gt;&lt;a accesskey=&quot;I&quot; class=&quot;button&quot; title=&quot;click for information or press Alt-I&quot; href=&quot;javascript:;&quot;&gt;get info...&lt;/a&gt;&lt;div style=&quot;display: none; left: 0px; top: 0px;&quot; class=&quot;floatingPanel&quot;&gt;put some general information here, plus a floating slider with more specific info:&lt;br&gt;   &lt;a class=&quot;button&quot; title=&quot;click for details&quot; href=&quot;javascript:;&quot;&gt;view details...&lt;/a&gt;&lt;div style=&quot;display: none; width: 10em; left: 0px; top: 0px;&quot; class=&quot;floatingPanel&quot;&gt;put some detail here, which could include a rollover with a &lt;a class=&quot;button&quot; title=&quot;show glossary definition&quot; href=&quot;javascript:;&quot;&gt;glossary definition&lt;/a&gt;&lt;div style=&quot;display: none; width: 25em; left: 0px; top: 0px;&quot; class=&quot;floatingPanel&quot;&gt;explaining technical terms&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;===&lt;br&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;&lt;strong&gt;NestedSlidersPlugin&lt;/strong&gt; (tagged with &lt;span class=&quot;quickopentag&quot;&gt;&lt;a tiddlylink=&quot;systemConfig&quot; refresh=&quot;link&quot; tip=&quot;The ''systemConfig'' tag is used for [[Plugin Macros]] and instructs TiddlyWiki to include the plugin in its J&quot; class=&quot;tiddlyLink tiddlyLinkExisting&quot; title=&quot;&quot; href=&quot;javascript:;&quot;&gt;systemConfig&lt;/a&gt;&lt;a tag=&quot;systemConfig&quot; class=&quot;button&quot; title=&quot;Show tiddlers tagged with 'systemConfig'&quot; href=&quot;javascript:;&quot;&gt;▾&lt;/a&gt;&lt;/span&gt;)&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2006.07.28 - 2.0.0&lt;/strong&gt; added custom class syntax around label/tip/key syntax: &lt;code&gt;{{classname{[label=key|tip]&lt;/code&gt;}}}&lt;br&gt;&lt;strong&gt;2006.07.25 - 1.9.3&lt;/strong&gt; when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it.  Significantly reduces the 'cookie overhead' when default slider states are used.&lt;br&gt;&lt;strong&gt;2006.06.29 - 1.9.2&lt;/strong&gt; in onClickNestedSlider(), when setting focus to first control, skip over type=&quot;hidden&quot;&lt;br&gt;&lt;strong&gt;2006.06.22 - 1.9.1&lt;/strong&gt; added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value&lt;br&gt;&lt;strong&gt;2006.05.11 - 1.9.0&lt;/strong&gt; added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label&lt;br&gt;&lt;strong&gt;2006.05.09 - 1.8.0&lt;/strong&gt; in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element&lt;br&gt;&lt;strong&gt;2006.04.24 - 1.7.8&lt;/strong&gt; in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position&lt;br&gt;&lt;strong&gt;2006.02.16 - 1.7.7&lt;/strong&gt; corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie&lt;br&gt;&lt;strong&gt;2006.02.15 - 1.7.6&lt;/strong&gt; in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)&lt;br&gt;&lt;strong&gt;2006.02.04 - 1.7.5&lt;/strong&gt; add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals&lt;br&gt;&lt;strong&gt;2006.01.18 - 1.7.4&lt;/strong&gt; only define adjustSliderPos() function if it has not already been provided by another plugin.  This lets other plugins 'hijack' the function even when they are loaded first.&lt;br&gt;&lt;strong&gt;2006.01.16 - 1.7.3&lt;/strong&gt; added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels.  While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels.  Short-term workaround is to only adjust the position for 'top-level' floaters.&lt;br&gt;&lt;strong&gt;2006.01.16 - 1.7.2&lt;/strong&gt; added button property to slider panel elements so that slider panel can tell which button it belongs to.  Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that &quot;&lt;a target=&quot;_blank&quot; title=&quot;External link to overflow:hidden&quot; href=&quot;overflow:hidden&quot; class=&quot;externalLink&quot;&gt;overflow:hidden&lt;/a&gt;&quot; can be reset to &quot;&lt;a target=&quot;_blank&quot; title=&quot;External link to overflow:visible&quot; href=&quot;overflow:visible&quot; class=&quot;externalLink&quot;&gt;overflow:visible&lt;/a&gt;&quot; after animation ends&lt;br&gt;&lt;strong&gt;2006.01.14 - 1.7.1&lt;/strong&gt; added optional &quot;^&quot; syntax for floating panels.  Defines new CSS class, &quot;.floatingPanel&quot;, as an alternative for standard in-line &quot;.sliderPanel&quot; styles.&lt;br&gt;&lt;strong&gt;2006.01.14 - 1.7.0&lt;/strong&gt; added optional &quot;*&quot; syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)&lt;br&gt;&lt;strong&gt;2006.01.03 - 1.6.2&lt;/strong&gt; When using optional &quot;!&quot; heading style, instead of creating a clickable &quot;Hn&quot; element, create an &quot;A&quot; element inside the &quot;Hn&quot; element.  (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)&lt;br&gt;&lt;strong&gt;2005.12.15 - 1.6.1&lt;/strong&gt; added optional &quot;...&quot; syntax to invoke deferred ('lazy') rendering for initially hidden sliders&lt;br&gt;removed checkbox option for 'global' application of lazy sliders&lt;br&gt;&lt;strong&gt;2005.11.25 - 1.6.0&lt;/strong&gt; added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)&lt;br&gt;&lt;strong&gt;2005.11.21 - 1.5.1&lt;/strong&gt; revised regular expressions: if present, a single newline &lt;em&gt;preceding&lt;/em&gt; and/or &lt;em&gt;following&lt;/em&gt; a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability.  Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.&lt;br&gt;&lt;strong&gt;2005.11.20 - 1.5.0&lt;/strong&gt; added (cookiename) syntax for optional tracking and restoring of slider open/close state&lt;br&gt;&lt;strong&gt;2005.11.11 - 1.4.0&lt;/strong&gt; added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style&lt;br&gt;&lt;strong&gt;2005.11.07 - 1.3.0&lt;/strong&gt; removed alternative syntax &lt;code&gt;(((&lt;/code&gt; and &lt;code&gt;)))&lt;/code&gt; (so they can be used by other&lt;br&gt;formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines&lt;br&gt;&lt;strong&gt;2005.11.05 - 1.2.1&lt;/strong&gt; changed name to NestedSlidersPlugin&lt;br&gt;more documentation&lt;br&gt;&lt;strong&gt;2005.11.04 - 1.2.0&lt;/strong&gt; added alternative character-mode syntax &lt;code&gt;(((&lt;/code&gt; and &lt;code&gt;)))&lt;/code&gt;&lt;br&gt;tweaked &quot;eat newlines&quot; logic for line-mode &lt;code&gt;+++&lt;/code&gt; and &lt;code&gt;===&lt;/code&gt; syntax&lt;br&gt;&lt;strong&gt;2005.11.03 - 1.1.1&lt;/strong&gt; fixed toggling of default tooltips (&quot;more...&quot; and &quot;less...&quot;) when a non-default button label is used&lt;br&gt;code cleanup, added documentation&lt;br&gt;&lt;strong&gt;2005.11.03 - 1.1.0&lt;/strong&gt; changed delimiter syntax from &lt;code&gt;(((&lt;/code&gt; and &lt;code&gt;)))&lt;/code&gt; to &lt;code&gt;+++&lt;/code&gt; and &lt;code&gt;===&lt;/code&gt;&lt;br&gt;changed name to EasySlidersPlugin&lt;br&gt;&lt;strong&gt;2005.11.03 - 1.0.0&lt;/strong&gt; initial public release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was implemented by EricShulman from &lt;a target=&quot;_blank&quot; title=&quot;External link to http:/www.elsdesign.com&quot; href=&quot;http:/www.elsdesign.com&quot; class=&quot;externalLink&quot;&gt;ELS Design Studios&lt;/a&gt; with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.nestedSliders = {major: 2, minor: 0, revision: 0, date: new Date(2006,7,28)};
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;

// default styles for 'floating' class
setStylesheet(&quot;.floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }&quot;,&quot;floatingPanelStylesheet&quot;);
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;config.formatters.push( {
	name: &quot;nestedSliders&quot;,
	match: &quot;\\n?\\+{3}&quot;,
	terminator: &quot;\\s*\\={3}\\n?&quot;,
	lookahead: &quot;\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\&amp;gt;]*\\^)?)?(\\*)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(?:\\}{3})?(\\&amp;gt;)?(\\.\\.\\.)?\\s*&quot;,
	handler: function(w)
		{
			// defopen=lookaheadMatch[1]
			// cookiename=lookaheadMatch[2]
			// header=lookaheadMatch[3]
			// panelwidth=lookaheadMatch[4]
			// rollover=lookaheadMatch[5]
			// class=lookaheadMatch[6]
			// label=lookaheadMatch[7]
			// blockquote=lookaheadMatch[8]
			// deferred=lookaheadMatch[9]

			 lookaheadRegExp = new RegExp(this.lookahead,&quot;mg&quot;);
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch &amp;amp;&amp;amp; lookaheadMatch.index == w.matchStart)
			{
				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey
				var show=&quot;none&quot;; var title=&quot;&amp;gt;&quot;; var tooltip=&quot;show&quot;; var cookie=&quot;&quot;; var key=&quot;&quot;;

				// extra &quot;+&quot;, default to open
				if (lookaheadMatch[1])
					{ show=&quot;block&quot;; title=&quot;&amp;lt;&quot;; tooltip=&quot;hide&quot;; }

				// cookie, use saved open/closed state
				if (lookaheadMatch[2]) {
					cookie=lookaheadMatch[2].trim().slice(1,-1);
					cookie=&quot;chkSlider&quot;+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show==&quot;block&quot;) }
					if (config.options[cookie])
						{ show=&quot;block&quot;; title=&quot;&amp;lt;&quot;; tooltip=&quot;hide&quot;; }
					else
						{ show=&quot;none&quot;; title=&quot;&amp;gt;&quot;; tooltip=&quot;show&quot;; }
				}

				// parse custom label/tooltip/accesskey: [label=X|tooltip]
				if (lookaheadMatch[7]) {
					title = lookaheadMatch[7].trim().slice(1,-1);
					var pos=title.indexOf(&quot;|&quot;);
					if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }
					if (title.substr(title.length-2,1)==&quot;=&quot;) { key=title.substr(title.length-1,1); title=title.slice(0,-2); }
					if (pos==-1) tooltip += &quot; &quot;+title; // default tooltip: &quot;show/hide &amp;lt;title&amp;gt;&quot;
				}

				// create the button
				if (lookaheadMatch[3]) { // use &quot;Hn&quot; header format instead of button/link
					var lvl=(lookaheadMatch[3].length&amp;gt;6)?6:lookaheadMatch[3].length;
					var btn = createTiddlyElement(createTiddlyElement(place,&quot;h&quot;+lvl,null,null,null),&quot;a&quot;,null,lookaheadMatch[6],title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute(&quot;href&quot;,&quot;javascript:;&quot;);
					btn.setAttribute(&quot;title&quot;,tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);

				// set extra button attributes
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter (&quot;&quot; if none)
				if (key.length) {
					btn.setAttribute(&quot;accessKey&quot;,key); // init access key
					btn.onfocus=function(){this.setAttribute(&quot;accessKey&quot;,this.keyparam);}; // **reclaim** access key on focus
				}

				// &quot;non-click&quot; MouseOver open/close slider
				if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;

				// create slider panel
				var panelClass=lookaheadMatch[4]?&quot;floatingPanel&quot;:&quot;sliderPanel&quot;;
				var panel=createTiddlyElement(place,&quot;div&quot;,null,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				panel.defaultPanelWidth=(lookaheadMatch[4] &amp;amp;&amp;amp; lookaheadMatch[4].length&amp;gt;2)?lookaheadMatch[4].slice(1,-1):&quot;&quot;; // save requested panel size
				btn.sliderPanel=panel;
				panel.style.display = show;
				panel.style.width=panel.defaultPanelWidth;

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

// TBD: ignore 'quoted' delimiters (e.g., &quot;{{{+++foo===}}}&quot; isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount &amp;amp;&amp;amp; endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	var theLabel = theTarget.firstChild.data;
	var theSlider = theTarget.sliderPanel
	var isOpen = theSlider.style.display!=&quot;none&quot;;
	// if using default button labels, toggle labels
	if (theLabel==&quot;&amp;gt;&quot;) theTarget.firstChild.data = &quot;&amp;lt;&quot;;
	else if (theLabel==&quot;&amp;lt;&quot;) theTarget.firstChild.data = &quot;&amp;gt;&quot;;
	// if using default tooltips, toggle tooltips
	if (theTarget.getAttribute(&quot;title&quot;)==&quot;show&quot;)
		theTarget.setAttribute(&quot;title&quot;,&quot;hide&quot;);
	else if (theTarget.getAttribute(&quot;title&quot;)==&quot;hide&quot;)
		theTarget.setAttribute(&quot;title&quot;,&quot;show&quot;);
	if (theTarget.getAttribute(&quot;title&quot;)==&quot;show &quot;+theLabel)
		theTarget.setAttribute(&quot;title&quot;,&quot;hide &quot;+theLabel);
	else if (theTarget.getAttribute(&quot;title&quot;)==&quot;hide &quot;+theLabel)
		theTarget.setAttribute(&quot;title&quot;,&quot;show &quot;+theLabel);
	// deferred rendering (if needed)
	if (theSlider.getAttribute(&quot;rendered&quot;)==&quot;false&quot;) {
		if (config.options.chkDebugLazySliderRender)
			alert(&quot;rendering '&quot;+theLabel+&quot;':\n\n&quot;+theSlider.getAttribute(&quot;raw&quot;));
		var place=theSlider;
		if (theSlider.getAttribute(&quot;blockquote&quot;)==&quot;true&quot;)
			place=createTiddlyElement(place,&quot;blockquote&quot;);
		wikify(theSlider.getAttribute(&quot;raw&quot;),place);
		theSlider.setAttribute(&quot;rendered&quot;,&quot;true&quot;);
	}
	// show/hide the slider
	if(config.options.chkAnimate)
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,&quot;none&quot;));
	else
		theSlider.style.display = isOpen ? &quot;none&quot; : &quot;block&quot;;
	// reset to default width (might have been changed via plugin code)
	theSlider.style.width=theSlider.defaultPanelWidth;
	// align slider/floater position with target button
	if (!isOpen) adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!=&quot;none&quot;) {
		var ctrls=theSlider.getElementsByTagName(&quot;*&quot;);
		for (var c=0; c&amp;lt;ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t==&quot;input&quot; &amp;amp;&amp;amp; ctrls[c].type!=&quot;hidden&quot;) || t==&quot;textarea&quot; || t==&quot;select&quot;)
				{ ctrls[c].focus(); break; }
		}
	}
	if (this.sliderCookie &amp;amp;&amp;amp; this.sliderCookie.length) {
		config.options[this.sliderCookie]=!isOpen;
		if (config.options[this.sliderCookie]!=this.defOpen)
			saveOptionCookie(this.sliderCookie);
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = this.sliderCookie+&quot;=novalue; path=/; expires=&quot;+ex.toGMTString();
		}
	}
	return false;
}

// hijack animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = &quot;visible&quot;; }

// adjust panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
	if (panelClass==&quot;floatingPanel&quot;) {
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position!=&quot;relative&quot;) {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p &amp;amp;&amp;amp; p.className!='floatingPanel') p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
		}
		if (left+panel.offsetWidth &amp;gt; getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;
		panel.style.left=left+&quot;px&quot;; panel.style.top=top+&quot;px&quot;;
	}
}

function getWindowWidth() {
	if(document.width!=undefined)
		return document.width; // moz (FF)
	if(document.documentElement &amp;amp;&amp;amp; ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		return document.documentElement.clientWidth; // IE6
	if(document.body &amp;amp;&amp;amp; ( document.body.clientWidth || document.body.clientHeight ) )
		return document.body.clientWidth; // IE4
	if(window.innerWidth!=undefined)
		return window.innerWidth; // IE - general
	return 0; // unknown
}
&lt;/pre&gt;</description>
<category>systemConfig</category>
<category>includeNew</category>
<category>authoring</category>
<category>menus</category>
<category>slider</category>
<category>3rd party plugin</category>
<category>els design</category>
<link>http://www.climate-change-two.net/#NestedSlidersPlugin</link>
<pubDate>Sun, 23 Sep 2007 16:49:00 GMT</pubDate>
</item>
<item>
<title>Refresh macro</title>
<description>&lt;br&gt;&lt;pre&gt;config.commands.refresh = {
 text: 'refresh',
 tooltip: 'Refresh this tiddler',
 handler: function(e,src,title) {
  clearMessage();
  story.refreshTiddler(title,false,true); // force=true
  return false;
 }
};
&lt;/pre&gt;</description>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#%5B%5BRefresh%20macro%5D%5D</link>
<pubDate>Wed, 19 Sep 2007 17:22:00 GMT</pubDate>
</item>
<item>
<title>siteMap plugin macro</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;thead&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;strong&gt;siteMap&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;&lt;a tiddlylink=&quot;Simon Baird&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#Simon Baird&quot; href=&quot;http://www.climate-change-two.net/#Simon%20Baird&quot; class=&quot;externalLink&quot;&gt;Simon Baird&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;1.0.3 (2006.03.15)&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;Displays a Site Map&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Syntax&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;&amp;lt;siteMap tiddlertitle&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://mptw2.tiddlyspot.com/#SiteMapMacro&quot; href=&quot;http://mptw2.tiddlyspot.com/#SiteMapMacro&quot; class=&quot;externalLink&quot;&gt;http://mptw2.tiddlyspot.com/#SiteMapMacro&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Examples&lt;/h2&gt;See SiteMap and SliderSiteMap for example usage.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Parameters&lt;/h2&gt;&lt;ul&gt;&lt;li&gt; Name of tiddler to start at&lt;/li&gt;&lt;li&gt; Max depth (a number) &lt;/li&gt;&lt;li&gt; Format (eg, nested, see formats below)&lt;/li&gt;&lt;li&gt; Don't show root flag (anything other than null turns it on)&lt;/li&gt;&lt;li&gt; Tags - a string containing a bracketed list of tags that we are interested in&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;h2&gt;History&lt;/h2&gt;&lt;ul&gt;&lt;li&gt; 1.0.3 (15-Mar-06)&lt;ul&gt;&lt;li&gt; added tag filtering&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; 1.0.2 (15-Mar-06)&lt;ul&gt;&lt;li&gt; Added json format and dontshowroot option&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; 1.0.1 (9-Mar-06)&lt;ul&gt;&lt;li&gt; Added selectable formats and fixed nested slider format&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; 1.0.0 (8-Mar-06)&lt;ul&gt;&lt;li&gt; first release&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;pre&gt;version.extensions.SiteMapMacro = {
major: 1,
minor: 0,
revision: 3,
date: new Date(2006,3,15),
source: &quot;http://simonbaird.com/mptw/#SiteMapMacro&quot;
};

config.macros.siteMap = {

formats: {
bullets: {
formatString: &quot;%0[[%1]]\n%2&quot;,
indentString: &quot;*&quot;
},

// put this in your StyleSheet to make it look good.
// .sliderPanel { margin-left: 2em; }

sliders: {
formatString: &quot;[[%1]]+++\n%2===\n\n&quot;,
formatStringLeaf: &quot;[[%1]]\n&quot;
},

openSliders: {
formatString: &quot;[[%1]]++++\n%2===\n\n&quot;,
formatStringLeaf: &quot;[[%1]]\n&quot;
},

popups: {
formatString: &quot;[[%1]]+++^\n%2===\n\n&quot;,
formatStringLeaf: &quot;[[%1]]\n&quot;
},

// these don't work too well
openPopups: {
formatString: &quot;[[%1]]++++^\n%2===\n\n&quot;,
formatStringLeaf: &quot;[[%1]]\n&quot;
},

// this is a little nuts but it works
json: {
formatString: '\n%0{&quot;%1&quot;:[%2\n%0]}',
formatStringLeaf: '\n%0&quot;%1&quot;',
indentString: &quot;  &quot;,
separatorString: &quot;,&quot;
}


},

defaultFormat: &quot;bullets&quot;,

treeTraverse: function(title,depth,maxdepth,format,dontshowroot,tags,excludetags) {

var tiddler = store.getTiddler(title);
var tagging = store.getTaggedTiddlers(title);

if (dontshowroot)
depth = 0;

var indent = &quot;&quot;;
if (this.formats[format].indentString)
for (var j=0;j&amp;lt;depth;j++)
indent += this.formats[format].indentString;

var childOutput = &quot;&quot;;
if (!maxdepth || depth &amp;lt; parseInt(maxdepth)) 
for (var i=0;i&amp;lt;tagging.length;i++)
if (tagging[i].title != title) {
if (this.formats[format].separatorString &amp;amp;&amp;amp; i != 0)
childOutput += this.formats[format].separatorString;
childOutput += this.treeTraverse(tagging[i].title,depth+1,maxdepth,format,null,tags,excludetags);
}

if (childOutput == &quot;&quot; &amp;amp;&amp;amp; (
(tags &amp;amp;&amp;amp; tags != &quot;&quot; &amp;amp;&amp;amp; !tiddler.tags.containsAll(tags.readBracketedList())) ||
(excludetags &amp;amp;&amp;amp; excludetags != &quot;&quot; &amp;amp;&amp;amp; tiddler.tags.containsAny(excludetags.readBracketedList()))
)
) {
// so prune it cos it doesn't have the right tags and neither do any of it's children
return &quot;&quot;;
}

if (dontshowroot)
return childOutput;

if (this.formats[format].formatStringLeaf &amp;amp;&amp;amp; childOutput == &quot;&quot;) {
// required for nestedSliders
return this.formats[format].formatStringLeaf.format([indent,title,childOutput]);
}

return this.formats[format].formatString.format([indent,title,childOutput]);
},

handler: function (place,macroName,params,wikifier,paramString,tiddler) {
wikify(this.treeTraverse(
params[0] &amp;amp;&amp;amp; params[0] != '.' ? params[0] : tiddler.title, 1, 
params[1] &amp;amp;&amp;amp; params[1] != '.' ? params[1] : null, // maxdepth
params[2] &amp;amp;&amp;amp; params[2] != '.' ? params[2] : this.defaultFormat, // format
params[3] &amp;amp;&amp;amp; params[3] != '.' ? params[3] : null, // dontshowroot
params[4] &amp;amp;&amp;amp; params[4] != '.' ? params[4] : null, // tags
params[5] &amp;amp;&amp;amp; params[5] != '.' ? params[5] : null // excludetags
),place);
}

}
&lt;/pre&gt;</description>
<category>3rd party plugin</category>
<category>excludeLists</category>
<category>plugin macro</category>
<category>Simon Baird</category>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#%5B%5BsiteMap%20plugin%20macro%5D%5D</link>
<pubDate>Wed, 19 Sep 2007 14:48:00 GMT</pubDate>
</item>
<item>
<title>TextAreaPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;TextAreaPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#TextAreaPlugin&quot; href=&quot;http://www.TiddlyTools.com/#TextAreaPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#TextAreaPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;2.1.3&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;Story.prototype.focusTiddler&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;Adds extra keyboard functions to the standard textarea control in the tiddler editor&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;strong&gt;Control-F&lt;/strong&gt; and &lt;strong&gt;control-G&lt;/strong&gt; will &lt;strong&gt;&quot;Find text&quot;&lt;/strong&gt; and &lt;strong&gt;&quot;find text aGain&quot;&lt;/strong&gt;, respectively, allowing you to copy, find, paste, findagain, paste, etc to perform &quot;search-and-replace&quot; actions.  The plugin also adds an &lt;strong&gt;autosize toolbar&lt;/strong&gt; command and &lt;strong&gt;resizeEditor macro&lt;/strong&gt; (to be placed in the &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt;) to permit on-the-fly adjustment of the tiddler editor text area height.&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt; &lt;strong&gt;autosizeEditor&lt;/strong&gt; - toggles the tiddler editor textarea height between fixed-height and &quot;automatically fit the contents&quot;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;resizeEditor&lt;/strong&gt; - adds 'grab handle' below textarea to stretch field height&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Configuration&lt;/h5&gt;&lt;blockquote&gt;enable&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkTextAreaExtensions&quot; type=&quot;checkbox&quot;&gt; use control-f (find), control-g (find again) inside text area&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkDisableAutoSelect&quot; type=&quot;checkbox&quot;&gt; place cursor at start of textarea instead of pre-selecting content&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkResizeEditor&quot; type=&quot;checkbox&quot;&gt; modify shadow &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt; to add resizeable text area (and autosize command)&lt;br&gt;&lt;blockquote&gt; Note: if you are using the default (shadow) &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt;, the plugin automatically updates the template to include the &lt;strong&gt;autosizeEditor&lt;/strong&gt; toolbar command and &lt;strong&gt;resizeEditor&lt;/strong&gt; macro.  If you have created a custom &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt; tiddler, you will need to manually add the &lt;strong&gt;autosizeEditor&lt;/strong&gt; toolbar command and &lt;strong&gt;resizeEditor&lt;/strong&gt; macro to your existing template:&lt;br&gt;&lt;/blockquote&gt;&lt;pre&gt;&amp;lt;!-- add 'autosizeEditor' command to end of existing editor toolbar definition --&amp;gt;
&amp;lt;div class='toolbar' macro='toolbar ... autosizeEditor'&amp;gt;
&lt;/pre&gt;and&lt;br&gt;&lt;pre&gt;&amp;lt;!-- add span with 'resizeEditor' macro anywhere in the edit template --&amp;gt;
&amp;lt;span macro='resizeEditor'&amp;gt;&amp;lt;/span&amp;gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;Import (or copy/paste) the following tiddlers into your document:&lt;br&gt;&lt;strong&gt;TextAreaPlugin&lt;/strong&gt; (tagged with &lt;span class=&quot;quickopentag&quot;&gt;&lt;a tiddlylink=&quot;systemConfig&quot; refresh=&quot;link&quot; tip=&quot;The ''systemConfig'' tag is used for [[Plugin Macros]] and instructs TiddlyWiki to include the plugin in its J&quot; class=&quot;tiddlyLink tiddlyLinkExisting&quot; title=&quot;&quot; href=&quot;javascript:;&quot;&gt;systemConfig&lt;/a&gt;&lt;a tag=&quot;systemConfig&quot; class=&quot;button&quot; title=&quot;Show tiddlers tagged with 'systemConfig'&quot; href=&quot;javascript:;&quot;&gt;▾&lt;/a&gt;&lt;/span&gt;)&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2007.09.04 [2.1.4]&lt;/strong&gt; in window.TextAreaResizer.prototype.create(), set initial grab handle width to auto instead of matching textarea.offsetWidth (which can be initially==0)&lt;br&gt;&lt;strong&gt;2007.04.29 [2.1.3]&lt;/strong&gt; in addKeyDownHandlers(), used 'findText' instead of 'find', hopefully to avoid strict ECMAScript1.5 error on certain browsers.&lt;br&gt;&lt;strong&gt;2007.03.01 [2.1.2]&lt;/strong&gt; use apply() to invoke hijacked core function&lt;br&gt;&lt;strong&gt;2006.11.16 [2.1.0]&lt;/strong&gt; restored chkDisableAutoSelect (place cursor at start of textarea instead of pre-selecting content)&lt;br&gt;&lt;strong&gt;2006.11.16 [2.0.0]&lt;/strong&gt; removed chkDisableEscapeKey (obsolete... use custom &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt; to change toolbar definition).  Rewrote focusTiddler as a HIJACK instead of just overwriting core function (permits other plugins to also hijack function).  Removed TAB character processing (now built-in as of TW2.1).  Merged code from ResizeEditorPlugin:&lt;br&gt;&lt;blockquote&gt; &lt;strong&gt;2006.11.16 [1.3.x]&lt;/strong&gt; merged with TextAreaPlugin&lt;br&gt; &lt;strong&gt;2006.11.02 [1.3.1]&lt;/strong&gt; in DragMove() and DragStop(), check for undefined properties so IE doesn't report &quot;Not Implemented&quot; error when property is referenced without having been previously initialized.&lt;br&gt; &lt;strong&gt;2006.11.01 [1.3.0]&lt;/strong&gt; added 'resizeEditor' MACRO for 'grab handle' stretch resizing (based on code from Jon Scully and Jason Johnston (jj@lojjic.net).  &lt;br&gt; &lt;strong&gt;2006.11.01 [1.2.6]&lt;/strong&gt; removed increaseEditor, decreaseEditor, and resizeEditor toolbar COMMAND definitions (resize by setting 'rows' property of textarea field conflicts with resize via style.height CSS attribute as set by autosize/drag).&lt;br&gt; &lt;strong&gt;2006.11.01 [1.2.5]&lt;/strong&gt; fixed 'savedkeypress' handling (was writing to savedkeyup by mistake)&lt;br&gt; &lt;strong&gt;2006.10.28 [1.2.4]&lt;/strong&gt; added '+' to 'saveTiddler' toolbar command (enables ctrl-enter keyhandling)&lt;br&gt; &lt;strong&gt;2006.10.18 [1.2.3]&lt;/strong&gt; added decreaseEditor and increaseEditor commands&lt;br&gt; &lt;strong&gt;2006.10.18 [1.2.2]&lt;/strong&gt; onkeypress handling to redirect PGUP/PGDN to window.scrollByPages() (works in FF, but not yet in IE)&lt;br&gt; &lt;strong&gt;2006.10.18 [1.2.1]&lt;/strong&gt; fixed references to default string constants (oops!)&lt;br&gt; &lt;strong&gt;2006.10.18 [1.2.0]&lt;/strong&gt; renamed 'resizeEditor' to 'autosizeEditor' and added new 'resizeEditor' toolbar command to prompt for # of rows to display&lt;br&gt; &lt;strong&gt;2006.10.02 [1.1.1]&lt;/strong&gt; show checkbox in button label (when automatic resizing is enabled)&lt;br&gt; &lt;strong&gt;2006.10.01 [1.1.0]&lt;/strong&gt; added 'onkeyup' automatic fit-to-contents handling&lt;br&gt; &lt;strong&gt;2006.09.30 [1.0.0]&lt;/strong&gt; initial release&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;2006.08.01 [1.1.2]&lt;/strong&gt; improved processed() utility function to handle IE5 and IE6, as well as calling preventDefault() for moz browsers.  Thanks to Bradley Meck for research and code examples.&lt;br&gt;&lt;strong&gt;2006.07.09 [1.1.1]&lt;/strong&gt; removed chkDisableAutoSelect&lt;br&gt;&lt;strong&gt;2006.02.14 [1.1.0]&lt;/strong&gt; added option for chkDisableEscapeKey (default is standard action)&lt;br&gt;&lt;strong&gt;2006.01.22 [1.0.1]&lt;/strong&gt; only add extra key processing for TEXTAREA elements (not other edit fields).&lt;br&gt;added option to enable/disable textarea keydown extensions (default is &quot;standard keys&quot; only)&lt;br&gt;&lt;strong&gt;2006.01.22 [1.0.0]&lt;/strong&gt; Moved from temporary &quot;System Tweaks&quot; tiddler into 'real' TextAreaPlugin tiddler.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;&lt;blockquote&gt;This feature was developed by EricShulman from &lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.elsdesign.com&quot; href=&quot;http://www.elsdesign.com&quot; class=&quot;externalLink&quot;&gt;ELS Design Studios&lt;/a&gt; with 'grab handle' stretch resizing adapted from TW code by Jon Scully and TextAreaResizer() by Jason Johnston (jj@lojjic.net).&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.textAreaPlugin= {major: 2, minor: 1, revision: 4, date: new Date(2007,9,4)};
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;if (!config.options.chkTextAreaExtensions) config.options.chkTextAreaExtensions=true;
if (!config.options.chkDisableAutoSelect) config.options.chkDisableAutoSelect=true;
if (!config.options.chkResizeEditor) config.options.chkResizeEditor=true;

// automatically tweak shadow EditTemplate to add &quot;autosizeEditor&quot; toolbar command
if (config.options.chkResizeEditor)
	config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/deleteTiddler/,&quot;deleteTiddler autosizeEditor&quot;);
// automatically tweak shadow EditTemplate to add &quot;resizeEditor&quot; macro
if (config.options.chkResizeEditor)
	config.shadowTiddlers.EditTemplate+=&quot;&amp;lt;span macro='resizeEditor'&amp;gt;&amp;lt;/span&amp;gt;&quot;;

// Put focus in a specified tiddler field
Story.prototype.TextAreaExtensions_focusTiddler=Story.prototype.focusTiddler;
Story.prototype.focusTiddler = function(title,field)
{
	this.TextAreaExtensions_focusTiddler.apply(this,arguments); // first call core
	var e = this.getTiddlerField(title,field);
	if (e &amp;amp;&amp;amp; config.options.chkDisableAutoSelect) {
		if (e.setSelectionRange) // FF
			e.setSelectionRange(0,0);
		else if (e.createTextRange) // IE
			{ var r=e.createTextRange(); r.collapse(true); r.select(); }
	}
	if (e &amp;amp;&amp;amp; config.options.chkTextAreaExtensions) addKeyDownHandlers(e);
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;function addKeyDownHandlers(e)
{
	// exit if not textarea or element doesn't allow selections
	if (e.tagName.toLowerCase()!=&quot;textarea&quot; || !e.setSelectionRange) return;

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

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

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

			// set new selection, scroll it into view, and report line position in status bar
			e.setSelectionRange(newstart,newstart+e.findText.length);
			var linecount=e.value.split('\n').length;
			var thisline=e.value.substr(0,e.selectionStart).split('\n').length;
			e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);
			window.status=&quot;line: &quot;+thisline+&quot;/&quot;+linecount;
			return processed(ev);
		}
		if (e.saved_onkeydown) // call previous keydown handler (if any)
			e.saved_onkeydown(ev);
	}
}
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; 'autosize' toolbar command&lt;br&gt;&lt;pre&gt;config.commands.autosizeEditor = {
	text: 'autosize',
	tooltip: 'adjust the editor height to fit the contents',
	text_alt: '&amp;lt;input type=&quot;checkbox&quot; style=&quot;padding:0;margin:0;border:0;background:transparent;&quot; checked&amp;gt;autosize',
	tooltip_alt: 'uncheck to reset the editor to the standard height',
	hideReadOnly: false,
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i&amp;lt;ta.length;i++) { ta[i].button=src; if (!ta[i].maxed) this.start(ta[i]); else this.stop(ta[i],true); }
		return false;
	},
	start: function(e) {
		if (!e.savedkeyup) e.savedkeyup=e.onkeyup;
		if (!e.savedkeypress) e.savedkeypress=e.onkeypress;
		e.savedheight=e.style.height;
		e.style.height=e.scrollHeight-2+'px'; // NOTE &quot;-2&quot; adjustment...  for scrollbar top+bottom border width???
		e.onkeypress=function(ev) {
			if (!ev) var ev=window.event; var e=resolveTarget(ev);
			if (ev.keyCode==33) { // PGUP
				if (window.scrollByPages) window.scrollByPages(-1);
				return false;
			}
			if (ev.keyCode==34) { // PGDN
				if (window.scrollByPages) window.scrollByPages(1);
				return false;
			}
			if (e.savedkeypress) e.savedkeypress();
		}
		e.onkeyup=function(ev) {
			if (!ev) var ev=window.event; var e=resolveTarget(ev);
			e.style.height=e.scrollHeight-2+'px';
			if (e.savedkeyup) e.savedkeyup();
		}
		e.button.innerHTML=config.commands.autosizeEditor.text_alt;
		e.button.title=config.commands.autosizeEditor.tooltip_alt;
		e.maxed=true;
	},
	stop: function(e,resetHeight) {
		if (resetHeight) e.style.height=e.savedheight;
		e.onkeyup=e.savedkeyup;
		e.onkeypress=e.savedkeypress;
		e.button.innerHTML=config.commands.autosizeEditor.text;
		e.button.title=config.commands.autosizeEditor.tooltip;
		e.maxed=false;
	}
};
&lt;/pre&gt;&lt;br&gt;&lt;em&gt; &lt;/em&gt; grab-and-stretch handle for textareas&lt;br&gt;&lt;pre&gt;config.macros.resizeEditor = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i&amp;lt;ta.length;i++) new window.TextAreaResizer(ta[i]);
	}
}

// TextAreaResizer script by Jason Johnston (jj@lojjic.net)
// Created August 2003.  Use freely, but give me credit.
// adds a handle below textareas that the user can drag with the mouse to resize the textarea.
// MODIFIED by ELS for cross-browser (IE) compatibility, including:
//    fixups and adjustments to CSS styles,
//    use 'old style' assignment of mouse event handlers instead of using addEventListener(),
//    use window.event if event param is null,
//    use offsetHeight instead of getComputedStyle()
//    use explicit window.* global scope declaration for functions called from event handlers

window.TextAreaResizer = function(elt) {
	this.element = elt;
	this.create();
}
window.TextAreaResizer.prototype = {
	create : function() {
		var elt = this.element;
		var thisRef = this;
		var h = this.handle = document.createElement(&quot;div&quot;);
		h.style.height = &quot;3px&quot;; // was 4px... looked too fat!
		h.style.overflow = &quot;hidden&quot;; // ELS: force IE to trim height to &amp;lt; 1em
		h.style.width=&quot;auto&quot;;
		h.style.backgroundColor = &quot;#999&quot;; // ELS: standard mid-tone (dark) gray
		h.style.cursor = &quot;s-resize&quot;;
		h.title = &quot;Drag to resize text box&quot;;
		h.onmousedown=function(evt){thisRef.dragStart(evt)};
		elt.parentNode.insertBefore(h, elt.nextSibling);
	},
	dragStart : function(evt) {
		if (!evt) var evt=window.event;
		this.dragStop(evt); // ELS: stop any current drag processing first
		var thisRef = this;
		this.dragStartY = evt.clientY;
		this.dragStartH = this.element.offsetHeight;
		document.savedmousemove=document.onmousemove;
		document.onmousemove=this.dragMoveHdlr=function(evt){thisRef.dragMove(evt)};
		document.savedmouseup=document.onmouseup;
		document.onmouseup=this.dragStopHdlr=function(evt){thisRef.dragStop(evt)};
	},
	dragMove : function(evt) {
		if (!evt) var evt=window.event;
		// ELS: make sure height is at least 10px
		var h=this.dragStartH+evt.clientY-this.dragStartY;
		if (h&amp;lt;10) h=10; this.element.style.height=h+&quot;px&quot;;
		// ELS: match textarea width (which can change due to document scrollbars)
		this.handle.style.width=this.element.offsetWidth+&quot;px&quot;;
		// ELS: when manually resizing, disable autoresizing (without restoring saved height)
		if (this.element.maxed!=undefined &amp;amp;&amp;amp; this.element.maxed)
			config.commands.autosizeEditor.stop(this.element,false);
	},
	dragStop : function(evt) {
		if (!evt) var evt=window.event;
		document.onmousemove=(document.savedmousemove!=undefined)?document.savedmousemove:null;
		document.onmousemove=(document.savedmouseup!=undefined)?document.savedmouseup:null;
	},
	destroy : function() {
		var elt = this.element;
		elt.parentNode.removeChild(this.handle);
		elt.style.height = &quot;&quot;;
	}
};
&lt;/pre&gt;</description>
<category>AuthoringPackage</category>
<category>includeNew</category>
<category>systemConfig</category>
<category>TidIDEPackage</category>
<category>InputPackage</category>
<link>http://www.climate-change-two.net/#TextAreaPlugin</link>
<pubDate>Wed, 05 Sep 2007 07:05:00 GMT</pubDate>
</item>
<item>
<title>ListboxPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;ListboxPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#ListboxPlugin&quot; href=&quot;http://www.TiddlyTools.com/#ListboxPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#ListboxPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;0.8.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;set tiddler fields by selecting enumerated values from a listbox or droplist&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Status&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;BETA - SUBJECT TO CHANGE&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;h5&gt;Usage&lt;/h5&gt;&lt;blockquote&gt;The &lt;code&gt;&amp;lt;&amp;lt;select&amp;gt;&amp;gt;&lt;/code&gt; macro sets tiddler field values by selecting from pre-configured enumerated values in listbox/droplist control.  The macro may be used within the &lt;a tiddlylink=&quot;ViewTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ViewTemplate&quot; href=&quot;http://www.climate-change-two.net/#ViewTemplate&quot; class=&quot;externalLink&quot;&gt;ViewTemplate&lt;/a&gt; or &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt; to a listbox/droplist to every tiddler, or embedded directly in specific tiddler content to create interfaces for custom-built TW &quot;applications&quot; that use tiddler fields to store application-specific values.&lt;br&gt;&lt;br&gt;Syntax for use in &lt;a tiddlylink=&quot;ViewTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ViewTemplate&quot; href=&quot;http://www.climate-change-two.net/#ViewTemplate&quot; class=&quot;externalLink&quot;&gt;ViewTemplate&lt;/a&gt;/&lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt;:&lt;br&gt;&lt;pre&gt;&amp;lt;div class=&quot;editor&quot; macro=&quot;select fieldname@tiddlername rows:nn width:xxx autoSave allowBlank allowOther
	value value value ...&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;editor&quot; macro=&quot;select fieldname@tiddlername rows:nn width:xxx autoSave allowBlank allowOther
	label=value label=value label=value ...&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;editor&quot; macro=&quot;select fieldname@tiddlername rows:nn width:xxx autoSave allowBlank allowOther
	+TiddlerName allowEdit&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;br&gt;Syntax for direct embedding in tiddler content:&lt;br&gt;&lt;pre&gt;&amp;lt;&amp;lt;select fieldname@tiddlername rows:nn width:xxx allowBlank allowOther
	value value value ...&amp;gt;&amp;gt;
&amp;lt;&amp;lt;select fieldname@tiddlername rows:nn width:xxx allowBlank allowOther
	label=value label=value label=value ...&amp;gt;&amp;gt;
&amp;lt;&amp;lt;select fieldname@tiddlername rows:nn width:xxx allowBlank allowOther
	+TiddlerName allowEdit&amp;gt;&amp;gt;
&lt;/pre&gt;&lt;br&gt;&lt;em&gt;where:&lt;/em&gt;&lt;br&gt;&lt;strong&gt;fieldname@tiddlername&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;specifies the tiddler field associated with the list display.  The &quot;@tiddlername&quot; portion is optional and, when omitted, the current tiddler is assumed (note: you may also use the special keyword, &quot;@here&quot;, to designate the current tiddler)&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to rows:nn&quot; href=&quot;rows:nn&quot; class=&quot;externalLink&quot;&gt;rows:nn&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;specifies the number of lines to display in the list.  If rows=1, a 'droplist' is displayed. If rows&amp;gt;1 a fixed-height listbox is used.  By default (or if rows=0 is used), the listbox is displayed with enough lines to show all items without scrolling (i.e., &quot;fit to contents - vertically&quot;)&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to width:xxx&quot; href=&quot;width:xxx&quot; class=&quot;externalLink&quot;&gt;width:xxx&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;specifies the width of the list, using a CSS dimension value (px, em, in, cm, or %).  The default is auto (i.e., &quot;fit to contents - horizontally&quot;).&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;autoSave&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;when used in &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt;, this keyword forces selection changes to be applied immediately rather than waiting for the &quot;done&quot; command to be invoked.  Note: because the standard &lt;a tiddlylink=&quot;ViewTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ViewTemplate&quot; href=&quot;http://www.climate-change-two.net/#ViewTemplate&quot; class=&quot;externalLink&quot;&gt;ViewTemplate&lt;/a&gt; toolbar does not have a &quot;done&quot; command to signal the end of the editing activity, &lt;strong&gt;autoSave&lt;/strong&gt; is always enabled when working with a selection list that is not being displayed via &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt;.&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;allowBlank&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;when the value of a tiddler field is &quot;undefined&quot;, a special 'blank' list item is added at the beginning of the list so that the undefined field value can be indicated.  If a field value is subsequently selected, the blank item is removed from the list.   Use the &lt;strong&gt;allowBlank&lt;/strong&gt; keyword to always include the blank item in the list and allow it to be re-selected, allowing you to set the field value back to &quot;undefined&quot; (i.e., delete the field).&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;allowOther&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;when the value of a tiddler field does not match any of the values in the list, a special 'other' is added at the end of the list so that the unrecognized field value can be indicated.  If another field value is subsequently selected, the 'other' item is removed from the list.  Use the &lt;strong&gt;allowOther&lt;/strong&gt; keyword to always include the 'other item in the list.  When this item is selected, you will be prompted to enter a custom value to assign to the field.&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;value value value ...&lt;/strong&gt; &lt;em&gt;(inline list definition)&lt;/em&gt;&lt;br&gt;&lt;em&gt;or&lt;/em&gt; &lt;strong&gt;label=value label=value label=value ...&lt;/strong&gt; &lt;em&gt;(inline list definition)&lt;/em&gt;&lt;br&gt;&lt;em&gt;or&lt;/em&gt; &lt;strong&gt;+TiddlerName&lt;/strong&gt; (&lt;em&gt;or&lt;/em&gt; &lt;strong&gt;*TiddlerName&lt;/strong&gt;) &lt;em&gt;(tiddler-based list definition)&lt;/em&gt;&lt;br&gt;&lt;blockquote&gt;specifies list item values or label/value pairs.  You can also use the &lt;strong&gt;+TiddlerName&lt;/strong&gt; or &lt;strong&gt;*TiddlerName&lt;/strong&gt; syntax to define the values or label/value pairs using a tiddler containing an &quot;HR-separated&quot; list, where each list item is one or two lines of text, separated from the next item by a horizontal rule: &lt;span&gt;----&lt;/span&gt;.  The first line of each item contains the value or label=value that will appear in the list.  The second, optional line allows you to specify a custom tooltip for that list item.  If you use &quot;*&quot; preceding the TiddlerName, the contents of the tiddler will be processed by the TiddlyWiki parser before being processed as a list definition.  This allows you to use macros to dynamically generate list definitions based on the current document contents (such as available tag names).  The default tooltip for a list item is: &quot;&lt;code&gt;set fieldname@tiddlername=itemvalue&lt;/code&gt;&quot;.  Note: if all list entries are single-line (i.e., you are not defining ANY custom tooltips), you can omit the horizontal rule between entries... each line of text will be treated as a separate list entry.&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;allowEdit&lt;/strong&gt; &lt;em&gt;(for use with +TiddlerName param only)&lt;/em&gt;&lt;br&gt;&lt;blockquote&gt;adds optional &quot;edit list...&quot; item to the end of the list, to enable quick editing of a tiddler-based list definition.  Note: if the &lt;strong&gt;+TiddlerName&lt;/strong&gt; parameter refers to a tiddler that does not yet exist, the &quot;edit list...&quot; item is automatically added to the list, even if &lt;strong&gt;allowEdit&lt;/strong&gt; was not specified.  This allows you to place an 'empty' tiddler-based list into your content (e.g., &lt;span&gt;&amp;lt;&amp;lt;select fieldname =NewTiddlerName&amp;gt;&amp;gt;&lt;/span&gt;), and then create and define the tiddler-based list later on.&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;h5&gt;Examples&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;inline list definition:&lt;/strong&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;select thing rows:1 eenie meenie miney moe&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;span&gt;&lt;select edit=&quot;thing&quot; onclick=&quot;return config.macros.select.onClick(this,event)&quot; onchange=&quot;return config.macros.select.onChange(this,event)&quot; ondblclick=&quot;return false&quot; autosave=&quot;true&quot; allowblank=&quot;false&quot; allowother=&quot;false&quot; allowedit=&quot;undefined&quot; rows=&quot;1&quot; size=&quot;1&quot; tiddler=&quot;SiteFields&quot; listsrc=&quot;undefined&quot; wikifydata=&quot;undefined&quot; title=&quot;select a value for thing@SiteFields&quot; style=&quot;width: auto;&quot;&gt;&lt;option value=&quot;&quot; title=&quot;set thing@SiteFields=[null] (delete field value)&quot;&gt;&lt;/option&gt;&lt;option value=&quot;eenie&quot; title=&quot;set thing@SiteFields=eenie&quot;&gt;eenie&lt;/option&gt;&lt;option value=&quot;meenie&quot; title=&quot;set thing@SiteFields=meenie&quot;&gt;meenie&lt;/option&gt;&lt;option value=&quot;miney&quot; title=&quot;set thing@SiteFields=miney&quot;&gt;miney&lt;/option&gt;&lt;option value=&quot;moe&quot; title=&quot;set thing@SiteFields=moe&quot;&gt;moe&lt;/option&gt;&lt;/select&gt;&lt;/span&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;select size rows:1 xsmall=30 small=32 medium=34 large=36 xlarge=38&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;span&gt;&lt;select edit=&quot;size&quot; onclick=&quot;return config.macros.select.onClick(this,event)&quot; onchange=&quot;return config.macros.select.onChange(this,event)&quot; ondblclick=&quot;return false&quot; autosave=&quot;true&quot; allowblank=&quot;false&quot; allowother=&quot;false&quot; allowedit=&quot;undefined&quot; rows=&quot;1&quot; size=&quot;1&quot; tiddler=&quot;SiteFields&quot; listsrc=&quot;undefined&quot; wikifydata=&quot;undefined&quot; title=&quot;select a value for size@SiteFields&quot; style=&quot;width: auto;&quot;&gt;&lt;option value=&quot;&quot; title=&quot;set size@SiteFields=[null] (delete field value)&quot;&gt;&lt;/option&gt;&lt;option value=&quot;30&quot; title=&quot;set size@SiteFields=30&quot;&gt;xsmall&lt;/option&gt;&lt;option value=&quot;32&quot; title=&quot;set size@SiteFields=32&quot;&gt;small&lt;/option&gt;&lt;option value=&quot;34&quot; title=&quot;set size@SiteFields=34&quot;&gt;medium&lt;/option&gt;&lt;option value=&quot;36&quot; title=&quot;set size@SiteFields=36&quot;&gt;large&lt;/option&gt;&lt;option value=&quot;38&quot; title=&quot;set size@SiteFields=38&quot;&gt;xlarge&lt;/option&gt;&lt;/select&gt;&lt;/span&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;select size allowOther xsmall=30 small=32 medium=34 large=36 xlarge=38&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;span&gt;&lt;select edit=&quot;size&quot; onclick=&quot;return config.macros.select.onClick(this,event)&quot; onchange=&quot;return config.macros.select.onChange(this,event)&quot; ondblclick=&quot;return false&quot; autosave=&quot;true&quot; allowblank=&quot;false&quot; allowother=&quot;true&quot; allowedit=&quot;undefined&quot; rows=&quot;0&quot; size=&quot;7&quot; tiddler=&quot;SiteFields&quot; listsrc=&quot;undefined&quot; wikifydata=&quot;undefined&quot; title=&quot;select a value for size@SiteFields&quot; style=&quot;width: auto;&quot;&gt;&lt;option value=&quot;&quot; title=&quot;set size@SiteFields=[null] (delete field value)&quot;&gt;&lt;/option&gt;&lt;option value=&quot;30&quot; title=&quot;set size@SiteFields=30&quot;&gt;xsmall&lt;/option&gt;&lt;option value=&quot;32&quot; title=&quot;set size@SiteFields=32&quot;&gt;small&lt;/option&gt;&lt;option value=&quot;34&quot; title=&quot;set size@SiteFields=34&quot;&gt;medium&lt;/option&gt;&lt;option value=&quot;36&quot; title=&quot;set size@SiteFields=36&quot;&gt;large&lt;/option&gt;&lt;option value=&quot;38&quot; title=&quot;set size@SiteFields=38&quot;&gt;xlarge&lt;/option&gt;&lt;option value=&quot;&quot; title=&quot;set size@SiteFields=[???] (enter custom value)&quot;&gt;other...&lt;/option&gt;&lt;/select&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;strong&gt;tiddler-based list definition:&lt;/strong&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;select color rows:1 +ListboxSample&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;span&gt;&lt;select edit=&quot;color&quot; onclick=&quot;return config.macros.select.onClick(this,event)&quot; onchange=&quot;return config.macros.select.onChange(this,event)&quot; ondblclick=&quot;return false&quot; autosave=&quot;true&quot; allowblank=&quot;false&quot; allowother=&quot;false&quot; allowedit=&quot;undefined&quot; rows=&quot;1&quot; size=&quot;1&quot; tiddler=&quot;SiteFields&quot; listsrc=&quot;ListboxSample&quot; wikifydata=&quot;false&quot; title=&quot;select a value for color@SiteFields&quot; style=&quot;width: auto;&quot;&gt;&lt;option value=&quot;&quot; title=&quot;set color@SiteFields=[null] (delete field value)&quot;&gt;&lt;/option&gt;&lt;option value=&quot;#FF0000&quot; title=&quot;set color@SiteFields=#FF0000&quot;&gt;Red&lt;/option&gt;&lt;option value=&quot;#FF9900&quot; title=&quot;set color@SiteFields=#FF9900&quot;&gt;Orange&lt;/option&gt;&lt;option value=&quot;#FFFF00&quot; title=&quot;set color@SiteFields=#FFFF00&quot;&gt;Yellow&lt;/option&gt;&lt;option value=&quot;#00FF00&quot; title=&quot;set color@SiteFields=#00FF00&quot;&gt;Green&lt;/option&gt;&lt;option value=&quot;#0000FF&quot; title=&quot;set color@SiteFields=#0000FF&quot;&gt;Blue&lt;/option&gt;&lt;option value=&quot;#000099&quot; title=&quot;set color@SiteFields=#000099&quot;&gt;Indigo&lt;/option&gt;&lt;option value=&quot;#9900FF&quot; title=&quot;set color@SiteFields=#9900FF&quot;&gt;Violet&lt;/option&gt;&lt;option value=&quot;#000000&quot; title=&quot;set color@SiteFields=#000000&quot;&gt;Black&lt;/option&gt;&lt;option value=&quot;#FFFFFF&quot; title=&quot;set color@SiteFields=#FFFFFF&quot;&gt;White&lt;/option&gt;&lt;/select&gt;&lt;/span&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;select color allowBlank allowOther +ListboxSample allowEdit&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;span&gt;&lt;select edit=&quot;color&quot; onclick=&quot;return config.macros.select.onClick(this,event)&quot; onchange=&quot;return config.macros.select.onChange(this,event)&quot; ondblclick=&quot;return false&quot; autosave=&quot;true&quot; allowblank=&quot;true&quot; allowother=&quot;true&quot; allowedit=&quot;true&quot; rows=&quot;0&quot; size=&quot;12&quot; tiddler=&quot;SiteFields&quot; listsrc=&quot;ListboxSample&quot; wikifydata=&quot;false&quot; title=&quot;select a value for color@SiteFields&quot; style=&quot;width: auto;&quot;&gt;&lt;option value=&quot;&quot; title=&quot;set color@SiteFields=[null] (delete field value)&quot;&gt;&lt;/option&gt;&lt;option value=&quot;#FF0000&quot; title=&quot;set color@SiteFields=#FF0000&quot;&gt;Red&lt;/option&gt;&lt;option value=&quot;#FF9900&quot; title=&quot;set color@SiteFields=#FF9900&quot;&gt;Orange&lt;/option&gt;&lt;option value=&quot;#FFFF00&quot; title=&quot;set color@SiteFields=#FFFF00&quot;&gt;Yellow&lt;/option&gt;&lt;option value=&quot;#00FF00&quot; title=&quot;set color@SiteFields=#00FF00&quot;&gt;Green&lt;/option&gt;&lt;option value=&quot;#0000FF&quot; title=&quot;set color@SiteFields=#0000FF&quot;&gt;Blue&lt;/option&gt;&lt;option value=&quot;#000099&quot; title=&quot;set color@SiteFields=#000099&quot;&gt;Indigo&lt;/option&gt;&lt;option value=&quot;#9900FF&quot; title=&quot;set color@SiteFields=#9900FF&quot;&gt;Violet&lt;/option&gt;&lt;option value=&quot;#000000&quot; title=&quot;set color@SiteFields=#000000&quot;&gt;Black&lt;/option&gt;&lt;option value=&quot;#FFFFFF&quot; title=&quot;set color@SiteFields=#FFFFFF&quot;&gt;White&lt;/option&gt;&lt;option value=&quot;&quot; title=&quot;set color@SiteFields=[???] (enter custom value)&quot;&gt;other...&lt;/option&gt;&lt;option value=&quot;ListboxSample&quot; title=&quot;edit 'color' list definition (ListboxSample)&quot;&gt;edit list...&lt;/option&gt;&lt;/select&gt;&lt;/span&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;select demo@ListboxDemoTarget +ListboxNewSample&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;span&gt;&lt;select edit=&quot;demo&quot; onclick=&quot;return config.macros.select.onClick(this,event)&quot; onchange=&quot;return config.macros.select.onChange(this,event)&quot; ondblclick=&quot;return false&quot; autosave=&quot;true&quot; allowblank=&quot;false&quot; allowother=&quot;false&quot; allowedit=&quot;undefined&quot; rows=&quot;0&quot; size=&quot;2&quot; tiddler=&quot;ListboxDemoTarget&quot; listsrc=&quot;ListboxNewSample&quot; wikifydata=&quot;false&quot; title=&quot;select a value for demo@ListboxDemoTarget&quot; style=&quot;width: auto;&quot;&gt;&lt;option value=&quot;&quot; title=&quot;set demo@ListboxDemoTarget=[null] (delete field value)&quot;&gt;&lt;/option&gt;&lt;option value=&quot;ListboxNewSample&quot; title=&quot;edit 'demo' list definition (ListboxNewSample)&quot;&gt;edit list...&lt;/option&gt;&lt;/select&gt;&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;ListboxPlugin&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2007.08.31 [0.8.2]&lt;/strong&gt; corrected handling for &quot;@tiddlername&quot; syntax for non-default 'target' tiddler.&lt;br&gt;&lt;strong&gt;2007.08.06 [0.8.1]&lt;/strong&gt; added support for &quot;@here&quot; keyword syntax and cleaned up handling for identifying 'target' tiddler.  Also added 'onclick' handler for &quot;other:&quot; item, so that prompt dialog is presented even if &quot;other&quot; was already selected (and hence, no &quot;onchange&quot; event)&lt;br&gt;&lt;strong&gt;2007.07.29 [0.8.0]&lt;/strong&gt; added getWikifiedData() and support for &quot;*&quot; prefix on TiddlerName.  Causes tiddler content to be wikified before processing it as a listbox definition.  Allows you to use macros or inline scripts to *generate* dynamic list definitions from current document content.  Based on a request from EdgarWhipple.&lt;br&gt;&lt;strong&gt;2007.07.26 [0.7.3]&lt;/strong&gt; in onChange(), corrected call to config.macros.select.setFieldValue() instead of config.macros.setFieldValue().  Thanks to EdgarWhipple for the bug report!&lt;br&gt;&lt;strong&gt;2007.07.24 [0.7.2]&lt;/strong&gt; in setFieldValue(), 'touch' target tiddler AFTER setting value to avoid early refresh event that steps on listbox attributes, causing a fatal error (in IE only).  Thanks go to Ken Girard for the bug report!  Also, in render(), fixed problem where selecting &quot;edit list...&quot; would set the value of the field to the name of the tiddler containing the list.  Also removed unneeded deferred (setTimeout) handling for invoking setFieldValue()&lt;br&gt;&lt;strong&gt;2007.06.28 [0.7.1]&lt;/strong&gt; in render(), retrieve current val from tiddler editor control (when editing) or use stored field (when viewing).&lt;br&gt;&lt;strong&gt;2007.05.29 [0.7.0]&lt;/strong&gt; split render() logic from handler(), added notification-based refresh() for lists that use +TiddlerName definition so changes in underlying tiddler definition are automatically sync'ed up in any currently displayed lists&lt;br&gt;&lt;strong&gt;2007.05.15 [0.6.1]&lt;/strong&gt; code/documentation cleanup&lt;br&gt;&lt;strong&gt;2007.05.14 [0.6.0]&lt;/strong&gt; lots more options&lt;br&gt;&lt;strong&gt;2007.05.12 [0.5.0]&lt;/strong&gt; started&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by Eric L Shulman / ELS Design Studios&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.select= {major: 0, minor: 8, revision: 2, date: new Date(2007,8,31)};

config.macros.select = {
	tooltip: &quot;select a value for %0@%1&quot;,
	blankTooltip: &quot;set %0@%1=[null] (delete field value)&quot;,
	valueTooltip: &quot;set %0@%1=%2&quot;,
	otherLabel: &quot;other&quot;,
	otherTooltip: &quot;set %0@%1=[???] (enter custom value)&quot;,
	otherPrompt: &quot;enter a value for '%0'&quot;,
	editLabel: &quot;edit list...&quot;,
	editTooltip: &quot;edit '%0' list definition (%1)&quot;,
	changeMsg: &quot;setting %0@%1=%2&quot;,
	verbose: false,
	hereKeyword: &quot;here&quot;,
	defaultTarget: &quot;SiteFields&quot;,
	handler:
	function(place,macroName,params,wikifier,paramString,tiddler) {

		// get containing tiddler (or use default &quot;SiteFields&quot; catch-all tiddler)
		var here=story.findContainingTiddler(place);
		var targetID=here?here.getAttribute(&quot;tiddler&quot;):this.defaultTarget;
		// get field name
		var field=params.shift();
		var pos=field.indexOf(&quot;@&quot;); // if non-default target (&quot;field@tiddler&quot; syntax)
		if(pos!=-1) { // split field into field and tiddlername.
			if (field.substr(pos+1)!=this.hereKeyword) // &quot;here&quot; == use default target
				targetID=field.substr(pos+1); // switch to different target tiddler
			field=field.substr(0,pos);
		}

		// if no field name, do nothing
		if(!field || !field.length) return;

		var p=params.shift();
		var rows=&quot;0&quot;; if (p.substr(0,5)==&quot;rows:&quot;) { rows=p.substr(5); p=params.shift(); } // optional list height in lines
		var width=&quot;auto&quot;; if (p.substr(0,6)==&quot;width:&quot;) { width=p.substr(6); p=params.shift(); } // optional CSS width
		var autosave=(p.toLowerCase()==&quot;autosave&quot;); if (autosave) p=params.shift(); // optional autosave
		var allowBlank=(p.toLowerCase()==&quot;allowblank&quot;); if (allowBlank) p=params.shift(); // add optional empty item
		var allowOther=(p.toLowerCase()==&quot;allowother&quot;); if (allowOther) p=params.shift(); // add optional &quot;other: ____&quot; item

		if (tiddler &amp;amp;&amp;amp; !story.isDirty(tiddler.title)) autosave=true; // if tiddler is in VIEW mode, force autosave

		if (p.substr(0,1)==&quot;+&quot;||p.substr(0,1)==&quot;*&quot;) { // get list from HR-separated tiddler (* means wikify source first)
			var listsrc=p.substr(1);
			var listtxt=store.getTiddlerText(listsrc);
			var wikifyData=p.substr(0,1)==&quot;*&quot;; if (wikifyData) listtxt=this.getWikifiedData(listtxt);
			var separator=&quot;\n&quot;;
			if (listtxt &amp;amp;&amp;amp; listtxt.indexOf(&quot;\n----\n&quot;)!=-1) separator=&quot;\n----\n&quot;;
			var list=[];
			if (listtxt &amp;amp;&amp;amp; listtxt.length) var list=listtxt.split(separator);
			var allowEdit=(params[0] &amp;amp;&amp;amp; params[0].toLowerCase()==&quot;allowedit&quot;); // add optional &quot;edit list...&quot; item
			if (allowEdit) p=params.shift();
		}
		else { // get list from macro params: &quot;value value value ...&quot; or &quot;label=value label=value label=value ...&quot;
			var list=[];
			while (p) {
				var parts=p.split(&quot;=&quot;);
				var label=parts[0]; var v=parts[1]?parts[1]:parts[0];
				list.push(label+&quot;=&quot;+v);
				p=params.shift();
			}
		}
		// register notification handler for ALL tiddler changes (to sync lists)
		store.addNotification(null,this.refresh);
		// render the control
		this.render(createTiddlyElement(place,&quot;span&quot;), null, targetID, field, list, listsrc, wikifyData, rows, width, autosave, allowBlank, allowOther, allowEdit);
	},
	getWikifiedData: // wikify tiddler content, then extract text WITH newlines and HRs included
	function(txt) {
		var e=createTiddlyElement(document.body,&quot;div&quot;); wikify(txt,e);
		var breaks=e.getElementsByTagName(&quot;br&quot;);
		for (var b=0; b&amp;lt;breaks.length; b++) breaks[b].parentNode.insertBefore(document.createTextNode(&quot;\n&quot;),breaks[b]);
		var lines=e.getElementsByTagName(&quot;hr&quot;);
		for (var l=0; l&amp;lt;lines.length; l++) lines[l].parentNode.insertBefore(document.createTextNode(&quot;----\n&quot;),lines[l]);
		var items=e.getElementsByTagName(&quot;li&quot;);
		for (var i=0; i&amp;lt;items.length; i++) items[i].parentNode.insertBefore(document.createTextNode(&quot;\n&quot;),items[i]);
		var txt=getPlainText(e); removeNode(e); return txt;
	},
	refresh:
	function (title) {
		var lists=document.getElementsByTagName(&quot;select&quot;);
		for (i=0; i&amp;lt;lists.length; i++) {
			if (lists[i].getAttribute(&quot;listsrc&quot;)==title) {
				var here=lists[i];
				var place=here.parentNode;
				var targetID=here.getAttribute(&quot;tiddler&quot;);
				var field=here.getAttribute(&quot;edit&quot;);
				var listsrc=here.getAttribute(&quot;listsrc&quot;);
				var rows=here.getAttribute(&quot;rows&quot;);
				var width=here.getAttribute(&quot;width&quot;);
				var autosave=here.getAttribute(&quot;autosave&quot;)==&quot;true&quot;;
				var allowBlank=here.getAttribute(&quot;allowBlank&quot;)==&quot;true&quot;;
				var allowOther=here.getAttribute(&quot;allowOther&quot;)==&quot;true&quot;;
				var allowEdit=here.getAttribute(&quot;allowEdit&quot;)==&quot;true&quot;;
				var wikifyData=here.getAttribute(&quot;wikifyData&quot;)==&quot;true&quot;;
				// get the list
				var listtxt=store.getTiddlerText(listsrc,&quot;&quot;); if (wikifyData) listtxt=config.macros.select.getWikifiedData(listtxt);
				var separator=&quot;\n&quot;; if (listtxt &amp;amp;&amp;amp; listtxt.indexOf(&quot;\n----\n&quot;)!=-1) separator=&quot;\n----\n&quot;;
				var list=[]; if (listtxt &amp;amp;&amp;amp; listtxt.length) var list=listtxt.split(separator);
				// re-render control
				config.macros.select.render(place, here, targetID, field, list, listsrc, wikifyData, rows, width, autosave, allowBlank, allowOther, allowEdit);
			}
		}
	},
	render:
	function (place, here, targetID, field, list, listsrc, wikifyData, rows, width, autosave, allowBlank, allowOther, allowEdit) {
		// use selected value from existing listbox (except for &quot;edit list...&quot; item)
		if (here &amp;amp;&amp;amp; here.selectedIndex!=-1 &amp;amp;&amp;amp; here.options[here.selectedIndex].text!=config.macros.select.editLabel)
			{ var val=here.value; if (val &amp;amp;&amp;amp; !val.length) val=undefined; }
		// if listbox doesn't yet exist, or 'edit list' item was selected, use value from existing field, if available...
		if (!val) var val=store.getValue(targetID,field);
		var count=0; var options=&quot;&quot;;
		// add default 'undefined' item
		if (val==undefined || allowBlank) {
			var title=this.blankTooltip.format([field,targetID]);
			options+='&amp;lt;option value=&quot;&quot; title=&quot;'+title+'&quot;&amp;gt;&amp;lt;/option&amp;gt;';
			count++;
		}
		// add enumerated items
		var isOther=(val!=undefined);
		for (opt=0; opt&amp;lt;list.length; opt++) {
			var lines=list[opt].split(&quot;\n&quot;); var parts=lines[0].split(&quot;=&quot;);
			var label=parts[0];
			var v=parts[1]?parts[1]:parts[0];
			var title=lines[1]?lines[1]:this.valueTooltip.format([field,targetID,v]);
			options+='&amp;lt;option value=&quot;'+v+'&quot; '+(val==v?'selected':'')+' title=&quot;'+title+'&quot;&amp;gt;'+label+'&amp;lt;/option&amp;gt;';
			if (val==v) isOther=false; // found matching value in list
			count++;
		}
		// add other... item
		if (isOther||allowOther) {
			var label=&quot;other&quot;+(isOther?(&quot;: &quot;+val):&quot;...&quot;);
			var v=isOther?val:&quot;&quot;;
			var title=this.otherTooltip.format([field,targetID]);
			options+='&amp;lt;option value=&quot;'+v+'&quot; '+(isOther?'selected':'')+' title=&quot;'+title+'&quot;&amp;gt;'+label+'&amp;lt;/option&amp;gt;';
			count++;
		}
		// add edit list... item
		if (listsrc &amp;amp;&amp;amp; (!store.tiddlerExists(listsrc) || allowEdit)) {
			var title=this.editTooltip.format([field,listsrc]);
			options+='&amp;lt;option value=&quot;'+listsrc+'&quot; title=&quot;'+title+'&quot;&amp;gt;'+this.editLabel+'&amp;lt;/option&amp;gt;';
			count++;
		}
		// construct full HTML
		var html='&amp;lt;select ';
		html+=(val!=undefined?'value=&quot;'+val+'&quot; ':'')+'&quot; edit=&quot;'+field+'&quot; ';
		html+='onclick=&quot;return config.macros.select.onClick(this,event)&quot; ';
		html+='onchange=&quot;return config.macros.select.onChange(this,event)&quot; ';
		html+='ondblclick=&quot;return false&quot; ';
		html+='autosave=&quot;'+autosave+'&quot; allowBlank=&quot;'+allowBlank+'&quot; ';
		html+='allowOther=&quot;'+allowOther+'&quot; allowEdit=&quot;'+allowEdit+'&quot; ';
		html+='rows=&quot;'+rows+'&quot; size=&quot;'+(rows!=0?rows:count)+'&quot; ';
		html+='tiddler=&quot;'+targetID+'&quot; '+'&quot; listsrc=&quot;'+listsrc+'&quot; wikifyData=&quot;'+wikifyData+'&quot; ';
		html+='title=&quot;'+this.tooltip.format([field,targetID])+'&quot; style=&quot;width:'+width+'&quot;&amp;gt;'+options+'&amp;lt;/select&amp;gt;';
		// pass to browser for rendering
		place.innerHTML=html;
	},
	onClick:
	function(here,event) {
		var label=config.macros.select.otherLabel;
		if (here.getAttribute(&quot;allowother&quot;)==&quot;true&quot; &amp;amp;&amp;amp; here.options[here.selectedIndex].text.substr(0,label.length)==label)
			here.onchange.apply(here,arguments);
	},
	onChange:
	function(here,event) {
		if (here.options[here.selectedIndex].text==config.macros.select.editLabel) {
			story.displayTiddler(story.findContainingTiddler(here),here.value,DEFAULT_EDIT_TEMPLATE);
			return false;
		}
		var label=config.macros.select.otherLabel;
		if (here.getAttribute(&quot;allowother&quot;)==&quot;true&quot; &amp;amp;&amp;amp; here.options[here.selectedIndex].text.substr(0,label.length)==label) {
			var newval=prompt(config.macros.select.otherPrompt.format([here.getAttribute(&quot;edit&quot;)]),here.value);
			if (!newval) {// user cancelled
				var v=store.getValue(here.getAttribute(&quot;tiddler&quot;),here.getAttribute(&quot;edit&quot;));
				{ here.value=v; if (v==undefined) here.selectedIndex=0; return false; }
			};
			here.options[here.selectedIndex].value=newval;
			here.options[here.selectedIndex].text=config.macros.select.otherLabel+&quot;: &quot;+newval;
			here.value=newval;
		}
		if (here.getAttribute(&quot;autosave&quot;)==&quot;true&quot;) config.macros.select.setFieldValue(here);
		return false;
	},
	setFieldValue: function(here) {
		var tid=here.getAttribute(&quot;tiddler&quot;); if (!tid || !tid.length) return; // no target tiddler specified, do nothing
		var field=here.getAttribute(&quot;edit&quot;);
		// if tiddler doesn't exist, create it...
		if (!store.tiddlerExists(tid)) store.saveTiddler(tid,tid,&quot;&quot;,config.options.txtUserName,new Date(),[]);
		// set the field value in the target tiddler
		store.setValue(tid,field,here.value.length?here.value:null); // if value is blank, delete field
		// touch target tiddler so that modified and modifier are updated
		var t=store.getTiddler(tid);
		store.saveTiddler(tid,tid,t.body,config.options.txtUserName,new Date(),t.tags,t.fields);
		if (config.macros.select.verbose) // tell user what happened
			{ clearMessage(); displayMessage(config.macros.select.changeMsg.format([field,tid,here.value])); }
	}
}
&lt;/pre&gt;</description>
<category>FormattingPackage</category>
<category>MediaPackage</category>
<category>TaskPackage</category>
<category>includeNew</category>
<category>systemConfig</category>
<category>InputPackage</category>
<link>http://www.climate-change-two.net/#ListboxPlugin</link>
<pubDate>Fri, 31 Aug 2007 23:54:00 GMT</pubDate>
</item>
<item>
<title>EditFieldPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;EditFieldPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#EditFieldPlugin&quot; href=&quot;http://www.TiddlyTools.com/#EditFieldPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#EditFieldPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;1.0.0&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;extend core edit macro for use in ViewTemplates or direct embedding in tiddler content&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;This HIJACK extends the core &lt;code&gt;&amp;lt;&amp;lt;edit fieldname&amp;gt;&amp;gt;&lt;/code&gt; macro for use in a &lt;a tiddlylink=&quot;ViewTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ViewTemplate&quot; href=&quot;http://www.climate-change-two.net/#ViewTemplate&quot; class=&quot;externalLink&quot;&gt;ViewTemplate&lt;/a&gt; or directly embedded in tiddler content.  Enter single- or multi- line text from 'view mode' tiddler displays and save/discard your input using ENTER, ESC, or automatic 'blur' handling.&lt;br&gt;&lt;h5&gt;Usage&lt;/h5&gt;&lt;blockquote&gt;Normally, when you edit a tiddler, any changes you make are only saved (or discarded) when you press the &quot;done&quot; (or &quot;cancel&quot;) command in the tiddler editor's toolbar.  However, when in a 'view mode' context, these command items are not available, and so cannot be used to trigger the 'save/discard' handling once you have decided that your input activities are complete.  Instead, you will be automatically prompted to save/discard your changes (if any) as soon as you move away from a text edit field or multi-line text area.  Alternatively, pressing ENTER while in an edit field will save your input, while pressing ESCAPE will abandon your input (after prompting for confirmation).  &lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Examples&lt;/h5&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;&amp;lt;edit foobar&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;input autocomplete=&quot;off&quot; size=&quot;40&quot; edit=&quot;foobar&quot; type=&quot;text&quot;&gt;&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;edit mumble 5&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;fieldset class=&quot;fieldsetFix&quot;&gt;&lt;div&gt;&lt;textarea edit=&quot;mumble&quot; rows=&quot;5&quot;&gt;&lt;/textarea&gt;&lt;/div&gt;&lt;/fieldset&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document: &lt;a tiddlylink=&quot;EditFieldPlugin&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditFieldPlugin&quot; href=&quot;http://www.climate-change-two.net/#EditFieldPlugin&quot; class=&quot;externalLink&quot;&gt;EditFieldPlugin&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2007.08.22 [1.0.0]&lt;/strong&gt; initial release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by Eric L Shulman / ELS Design Studios&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.editFieldPlugin= {major: 1, minor: 0, revision: 0, date: new Date(2007,8,22)};

config.macros.edit.editFieldPlugin_savedHandler=config.macros.edit.handler;
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// let core create edit field
	config.macros.edit.editFieldPlugin_savedHandler.apply(this,arguments);
	// get edit field or textarea
	var ins=place.getElementsByTagName(params[0]==&quot;text&quot;||params[1]?'textarea':'input');
	var e=ins[ins.length-1];
	// if viewing tiddler, add autosave handlers
	var here=story.findContainingTiddler(place);
	if (here &amp;amp;&amp;amp; here.getAttribute(&quot;template&quot;).indexOf(&quot;ViewTemplate&quot;)!=-1) {
		story.setDirty(tiddler.title,false); // clear tiddler (&quot;dirty&quot;) flag set by core when field was created
		var field=e.getAttribute(&quot;edit&quot;);
		var val=store.getValue(tiddler.title,field); if (!val) val=&quot;&quot;;
		e.setAttribute(&quot;currval&quot;,val); // remember starting value
		e.setAttribute(&quot;tiddler&quot;,tiddler.title); // remember target tiddler
		e.onkeydown=function(ev) { // ENTER key=save (for single-line edit fields only)
			var event=ev?ev:window.event;
			this.setAttribute(&quot;keyCode&quot;,event.keyCode); // save last keyCode for blur() handler
			if (event.keyCode==13 &amp;amp;&amp;amp; this.nodeName.toUpperCase()!=&quot;TEXTAREA&quot;)
				this.saveField(); // save input to tiddler field
		}
		e.onblur=function(ev) { // accept or reject input when focus moves away from field
			var event=ev?ev:window.event;
			var tid=this.getAttribute(&quot;tiddler&quot;); if (!tid || !tid.length) return;
			var field=this.getAttribute(&quot;edit&quot;);
			if (this.value!=this.getAttribute(&quot;currval&quot;)) { // if value has changed
				if (this.getAttribute(&quot;keyCode&quot;)==&quot;27&quot;) { // if user pressed ESC
					var msg=&quot;Abandon changes to %0@%1?&quot;.format([field,tid]);
					if (confirm(msg)) this.value=this.getAttribute(&quot;currval&quot;); // reset to starting value
					this.id=new Date().getTime(); // set unique ID
					setTimeout(&quot;document.getElementById('&quot;+this.id+&quot;').focus()&quot;,1); // restore focus (after blur completes)
				} else { // other focus change events
					var msg=&quot;Save changes to %0@%1?&quot;.format([field,tid]);
					if (confirm(msg)) this.saveField(); // save input to tiddler field, then continue blur
					else this.value=this.getAttribute(&quot;currval&quot;); // reset to starting value, then continue blur
				}
			}
		};
		e.saveField=function() { // save input value to tiddler field (create, touch or rename tiddler as needed)
			var tid=this.getAttribute(&quot;tiddler&quot;); if (!tid || !tid.length) return;
			var field=this.getAttribute(&quot;edit&quot;);
			var title=(field==&quot;title&quot;)?this.value:tid;
			if (!title.length) { // prevent blank tiddler title from being used
				this.value=this.getAttribute(&quot;currval&quot;); // reset to starting value
				this.id=new Date().getTime(); // set unique ID
				setTimeout(&quot;displayMessage('Please enter a non-blank value')&quot;,1); // notify user
				setTimeout(&quot;document.getElementById('&quot;+this.id+&quot;').focus()&quot;,2); // set focus to continue editing
				return;
			}
			var t=store.getTiddler(tid);
			store.suspendNotifications();
			var anim=config.options.chkAnimate; config.options.chkAnimate=false; // suspend animation
			store.saveTiddler(t?tid:title,title,t?t.body:&quot;&quot;,config.options.txtUserName,new Date(),t?t.tags:[],t?t.fields:null);
			store.setValue(title,field,this.value); // save value in tiddler field
			this.setAttribute(&quot;currval&quot;,this.value); // remember new starting value
			if (tid!=title) // if title changed, display renamed tiddler in place of current one
				{ story.displayTiddler(story.findContainingTiddler(this),title); story.closeTiddler(tid); }
			if (field==&quot;text&quot;) // if tiddler content changed, refresh tiddler display
				{ story.refreshTiddler(title,null,true); }
			config.options.chkAnimate=anim; // resume animation
			store.resumeNotifications();
		};
	}
}
&lt;/pre&gt;</description>
<category>systemConfig</category>
<category>InputPackage</category>
<link>http://www.climate-change-two.net/#EditFieldPlugin</link>
<pubDate>Wed, 22 Aug 2007 15:24:00 GMT</pubDate>
</item>
<item>
<title>SaveFromWebPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;SaveFromWebPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#SaveFromWebPlugin&quot; href=&quot;http://www.TiddlyTools.com/#SaveFromWebPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#SaveFromWebPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;1.3.5&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;extend 'save changes' to get remote document contents and save to local filesystem&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Status&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;BETA/EXPERIMENTAL - USE WITH CAUTION - VERIFY ALL SAVED CHANGES - RETAIN BACKUPS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;Normally, when you are viewing a TiddlyWiki document over the web (i.e., not via &lt;code&gt;file://&lt;/code&gt;) and you select the &quot;save changes&quot; (or &quot;save to disk&quot;) command, an error message is displayed: &lt;em&gt;&lt;u&gt;&quot;You need to save this TiddlyWiki to a file before you can save changes.&quot;&lt;/u&gt;&lt;/em&gt;  This plugin extends the use of &lt;code&gt;&amp;lt;&amp;lt;saveChanges&amp;gt;&amp;gt;&lt;/code&gt; so that when you are viewing and/or editing a remote TiddlyWiki document, instead of receiving this somewhat confusing and unhelpful message, you can still click the &quot;save changes&quot; (or &quot;save to disk&quot;) command to &lt;strong&gt;store a copy of the remote document directly onto your local filesystem&lt;/strong&gt;, &lt;em&gt;including any unsaved tiddler changes/additions you have made while working on-line.&lt;/em&gt;&lt;br&gt;&lt;h5&gt;Usage&lt;/h5&gt;&lt;blockquote&gt;When you select &lt;a accesskey=&quot;S&quot; class=&quot;button&quot; title=&quot;Save all tiddlers to create a new TiddlyWiki&quot; href=&quot;javascript:;&quot;&gt;save changes&lt;/a&gt; while viewing a remote document (i.e., a URL starting with http: rather than file:), the plugin first &lt;strong&gt;retrieves the TiddlyWiki core source code from the original document&lt;/strong&gt; file stored on the remote server.  Then, it &lt;strong&gt;combines that core source with the tiddlers&lt;/strong&gt; contained in the currently loaded document, &lt;strong&gt;including any changes you have made.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;While the next step &lt;em&gt;should&lt;/em&gt; be to simply write the merged core+tiddler data directly to your hard drive, certain JavaScript features, such as reading/writing directly to the local filesystem, require expanded &quot;cross-domain&quot; privileges that are normally restricted for use only with &lt;strong&gt;signed&lt;/strong&gt; scripts.  Although some browsers will let you grant filesystem permissions to a remotely-loaded script, this usually involves either a series of popup confirmation messages or manually re-configuring (and/or disabling) your browser's built-in security protections, which often include settings and options that most users find difficult to understand and inconvenient to access.&lt;br&gt;&lt;br&gt;To avoid these security complications, the &quot;save from web&quot; processing requires just a few additional steps to prepare the modified document and deliver it to your browser: rather than writing the document data directly to the local filesystem, the plugin &lt;strong&gt;sends the merged core+tiddler data to a small companion script installed on the remote server&lt;/strong&gt; (see savefromweb.php, below).  This simple &quot;reflector&quot; script then immediately &lt;strong&gt;downloads the new document data back to the browser&lt;/strong&gt;, which prompts you to either open the downloaded document for viewing or save it to your local hard drive.  Once the document has been stored on your filesystem, you can open that copy in your browser and work offline with full access to all TiddlyWiki features.&lt;br&gt;&lt;br&gt;&lt;a class=&quot;button&quot; title=&quot;show Note for users of Internet Explorer's Popup Blocker feature...&quot; href=&quot;javascript:;&quot;&gt;Note for users of Internet Explorer's Popup Blocker feature...&lt;/a&gt;&lt;div style=&quot;display: none;&quot; class=&quot;sliderPanel&quot;&gt;&lt;blockquote&gt;The default security settings of IE's &quot;Popup Blocker&quot; feature will warn you whenever an attempt is made to download a file in response to a scripted action such as the internal javascript processing performed by SaveFromWebPlugin.  However, if you then click IE's yellow warning message and select the 'download this file...' menu command, this will also cause IE to attempt a 'page transition' away from the currently loaded TiddlyWiki document... but, because there are unsaved changes in the document, you will first receive a confirmation message, allowing you to cancel the page transition.  Regrettably, this also prevents the download from succeeding.  Unfortunately, if you &lt;em&gt;do&lt;/em&gt; permit the page transition to occur, then your TiddlyWiki document is immediately reloaded and all the unsaved tiddler changes are discarded... and the download still fails to complete.&lt;br&gt;&lt;br&gt;&lt;strong&gt;&lt;u&gt;To permit SaveFromWeb to function properly with Internet Explorer, you will need to adjust the &quot;download&quot; security setting...&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;From the &lt;strong&gt;Tools &amp;gt; Internet Options &amp;gt; Security&lt;/strong&gt; tab,&lt;/li&gt;&lt;li&gt;Select the &quot;Internet&quot; security zone (or what ever zone you are using to view the remote document)&lt;/li&gt;&lt;li&gt;Press the &quot;Custom level...&quot; button&lt;/li&gt;&lt;li&gt;In the &quot;Settings&quot; listbox, scroll to the &quot;Downloads&quot; section&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ENABLE &quot;automatic prompting for downloads&quot;&lt;/strong&gt;(the first setting in the section)&lt;/li&gt;&lt;li&gt;Press OK to accept the new settings.&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;h5&gt;Direct filesystem access (configuring browser security permissions)&lt;/h5&gt;&lt;blockquote&gt;Although sending the merged document data from browser to server and back again allows it to be saved to your filesystem without requiring you to extensively re-configure your browser's built-in security protections, it also increases the overall processing time because the document's data is actually being transmitted &lt;em&gt;three&lt;/em&gt; times: it is first retrieved from the remote server to get the TiddlyWiki core source; then, after merging with the updated tiddler data, it is sent back to the server, which immediately 'reflects' it back to the browser for final handling by the built-in &quot;file download&quot; interface.&lt;br&gt;&lt;br&gt;However, &lt;strong&gt;if you are accessing a &quot;trusted site&quot;&lt;/strong&gt; (perhaps on a server within a secure private network), depending upon the specific options provided by your browser, &lt;strong&gt;you may be able to eliminate the round-trip processing by authorizing the appropriate filesystem security permissions in your browser&lt;/strong&gt;.  When filesystem access has been permitted, instead of making the round trip with the merged core+tiddler data, the plugin will immediately prompt you for a destination path/file, using your computer's &quot;native&quot; path/file selection interface, and then write new the TiddlyWiki document data directly to the indicated location on your local file system.&lt;br&gt;&lt;br&gt;&lt;a class=&quot;button&quot; title=&quot;show Configuring security in FireFox...&quot; href=&quot;javascript:;&quot;&gt;Configuring security in FireFox...&lt;/a&gt;&lt;div style=&quot;display: none;&quot; class=&quot;sliderPanel&quot;&gt;&lt;blockquote&gt;&lt;strong&gt;FireFox needs security permissions to be set to allow a remote URL to save a new file to your local filesystem.&lt;/strong&gt;  FireFox can be configured to allow or disallow expanded &quot;cross-domain&quot; privileges based on the digital signature of the originator (or &lt;strong&gt;principal&lt;/strong&gt;) of a signed script.  However, &lt;strong&gt;unsigned&lt;/strong&gt; scripts, such as TiddlyWiki, do not contain a digital signature and are not normally allowed access to filesystem functions.  Fortunately, an &lt;em&gt;&lt;strong&gt;unsigned&lt;/strong&gt;&lt;/em&gt; script can still be granted expanded filesystem privileges through use of a &lt;strong&gt;codebase principal&lt;/strong&gt;, which relies upon the originating URL of the script (it's &quot;codebase&quot;) to identify the &quot;trusted source&quot;, rather than verifying a digital signature of a certificate.&lt;br&gt;&lt;blockquote&gt;&lt;strong&gt;In FireFox (and most other browsers) use of codebase principals is disabled by default&lt;/strong&gt;;&lt;br&gt;To use codebase principals, go to &quot;&lt;a target=&quot;_blank&quot; title=&quot;External link to about:config&quot; href=&quot;about:config&quot; class=&quot;externalLink&quot;&gt;about:config&lt;/a&gt;&quot; in your browser, and set:&lt;br&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;code&gt;signed.applets.codebase_principal_support&lt;/code&gt;&lt;/strong&gt; to &lt;strong&gt;&lt;code&gt;true&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;em&gt;note: you can also set this value by editing FireFox's &lt;code&gt;prefs.js&lt;/code&gt; and adding:&lt;/em&gt;&lt;br&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;user_pref(&quot;signed.applets.codebase_principal_support&quot;, true);&lt;/code&gt;&lt;br&gt;&lt;/blockquote&gt;After you have enabled codebase principals, you will begin receiving security notices whenever TiddlyWiki requests permission to invoke various privileged functions.  You can press the &quot;allow&quot; button to permit the processing to continue, or press &quot;deny&quot; to prevent the privileged functions from being used by that remote site.&lt;br&gt;&lt;br&gt;When you invoke &lt;code&gt;&amp;lt;&amp;lt;saveChanges&amp;gt;&amp;gt;&lt;/code&gt;, there may be several of these notices in a row before the file saving process is done.  These messages are normal, and you should ALLOW each of them, so that the file saving procedure can continue to completion.  Once you are confident that the remote site is trustworthy, you can mark the &quot;remember this decision&quot; checkbox to eliminate additional notices for that remote site, so that the process can proceed without further interruptions.  This setting will only be applied to the specific web domain in question, so you will still receive security notices when using privileged functions from any other web sites.&lt;br&gt;&lt;br&gt;&lt;em&gt;Note: If codebase principals are enabled, security notices are also reported when accessing TiddlyWiki documents locally (i.e., via &lt;code&gt;file://&lt;/code&gt;).  This is a result of TiddlyWiki's normal file I/O processing and should always be considered safe to allow, inasmuch as you control the contents of your own local filesystem, and thus, should be able to consider the &lt;code&gt;file://&lt;/code&gt; codebase location as a trusted source.&lt;/em&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;h5&gt;Configuration&lt;/h5&gt;&lt;blockquote&gt;Target (destination) filename: &lt;input class=&quot;txtOptionInput&quot; option=&quot;txtSaveFromWebTargetFilename&quot;&gt;&lt;br&gt;&lt;div class=&quot;fine borderleft&quot;&gt;specifies the desired destination filename for the saved file.  This will appear as the default value when you are prompted to save the file.  If blank, default is the filename from the URL of the current document (or the current domain name if there is no filename in the URL)&lt;/div&gt;&lt;br&gt;TW core source location: &lt;input class=&quot;txtOptionInput&quot; option=&quot;txtSaveFromWebSourceFile&quot;&gt;&lt;br&gt;&lt;div class=&quot;fine borderleft&quot;&gt;specifies the URL from which to retrieve the TW core source.  If blank, defaults to the current document URL.&lt;/div&gt;&lt;br&gt;Server-side reflector script location: &lt;input class=&quot;txtOptionInput&quot; option=&quot;txtSaveFromWebScriptURL&quot;&gt;&lt;br&gt;&lt;div class=&quot;fine borderleft&quot;&gt;note: the reflector script can be located at any URL, even one on a different domain from the document you are saving&lt;/div&gt;&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSaveFromWebAttemptLocalIO&quot; type=&quot;checkbox&quot;&gt; attempt to use direct filesystem I/O (requires browser security permissions)&lt;br&gt;&lt;div class=&quot;fine borderleft&quot;&gt;the plugin will try to obtain security permission for direct filesystem I/O.  If you grant filesystem access to the script, then it writes the document directly to your filesystem, and doesn't use the server-side reflector script at all.  This allows you to save a remote file to your local filesystem, even if your net connection drops after you open the document.  Note: if filesystem permissions are not granted, the plugin will automatically attempt to use the server-side reflector script as a fallback... even if no longer connected to the net.&lt;/div&gt;&lt;br&gt;&lt;input class=&quot;chkOptionInput&quot; option=&quot;chkSaveFromWebPreFetch&quot; type=&quot;checkbox&quot;&gt; pre-fetch TW core source (in background) during document startup&lt;br&gt;&lt;div class=&quot;fine borderleft&quot;&gt;this option causes the plugin to retrieve the TiddlyWiki core source as soon as you load the document, instead of waiting for the first time you save.  This ensures that the TiddlyWiki core source can still be saved to the local filesystem even if your network connection is dropped before you save your changes.  Note that, even without pre-fetching, the core source is always cached after it is retrieved, so that subsequent saves don't do extra work to get it again.&lt;/div&gt;&lt;br&gt;Important note: while you can configure the plugin using the fields shown above, these settings will be stored as cookies, which are associated with the local browser installation, rather than the document itself.  To &quot;hard-code&quot; these settings so they are always applied to the document when viewed from &lt;em&gt;any&lt;/em&gt; browser, please see &lt;a tiddlylink=&quot;SaveFromWebConfig&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SaveFromWebConfig&quot; href=&quot;http://www.climate-change-two.net/#SaveFromWebConfig&quot; class=&quot;externalLink&quot;&gt;SaveFromWebConfig&lt;/a&gt;.&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;&lt;a tiddlylink=&quot;SaveFromWebPlugin&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SaveFromWebPlugin&quot; href=&quot;http://www.climate-change-two.net/#SaveFromWebPlugin&quot; class=&quot;externalLink&quot;&gt;SaveFromWebPlugin&lt;/a&gt;, &lt;a tiddlylink=&quot;SaveFromWebConfig&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#SaveFromWebConfig&quot; href=&quot;http://www.climate-change-two.net/#SaveFromWebConfig&quot; class=&quot;externalLink&quot;&gt;SaveFromWebConfig&lt;/a&gt;&lt;br&gt;&lt;br&gt;On your web server, in the same directory as your published document, create a file called &lt;strong&gt;&lt;code&gt;savefromweb.php&lt;/code&gt;&lt;/strong&gt;, containing the following PHP server-side script.  &lt;em&gt;(note: you can actually give this script any name you like, and place it at &lt;/em&gt;any&lt;em&gt; URL, even one that is on a different domain from the document you are saving.  However, to do so you must specify the server-side script location using the plugin's configuration settings (see above).&lt;/em&gt;&lt;br&gt;&lt;pre&gt;&amp;lt;?php
// savefromweb.php
// Author: Eric L. Shulman / ELS Design Studios
// Source: http://www.TiddlyTools.com/savefromweb.php
// License: http://www.TiddlyTools.com/#LegalStatements
// Usage: install the php script on the server in the same directory as your TiddlyWiki document(s)

// This script acts as a 'reflector', so that any contents sent to it (via form POST) will
// be sent back to the browser as a binary file.  The browser then prompts you to
// save the content to a local file.  Because this process uses the browser's built-in
// download-and-save/open handler, it does not require security permissions to access
// the local filesystem.

$args=$_POST;
header('Pragma: private');
header('Cache-control: private, must-revalidate');
header('Content-type: application/binary; charset=&quot;UTF-8&quot;');
header('Content-disposition: attachment; filename=&quot;'.$args['filename'].'&quot;');
$c=$args['contents'];
$c=str_replace(&quot;\\'&quot;,&quot;'&quot;,$c); // decode single-quotes
$c=str_replace(&quot;\\\&quot;&quot;,&quot;\&quot;&quot;,$c); // decode double-quotes
$c=str_replace(&quot;\\\\&quot;,&quot;\\&quot;,$c); // decode backslashes
$c=str_replace(&quot;\r\n&quot;,&quot;\n&quot;,$c); // change CRLF to LF
print $c;
?&amp;gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2007.08.08 [1.3.0]&lt;/strong&gt; added caching of the downloaded TW core source code so it only has to be retrieved once.  Also, added an option to 'pre-fetch' the TW core when plugin is initialized, so that the download-and-cache will be performed, in background, each time the document is loaded/re-loaded.  Also, added option to allow attempt to use direct filesystem access (bypassing the round-trip through the server-side reflector script) so you can save a remote file to your local filesystem, even if the connection to the network is dropped after the document was loaded into the browser.  If local filesystem permissions are not granted, the plugin will still attempt to use the server-side reflector script as a fallback.&lt;br&gt;&lt;strong&gt;2007.08.07 [1.2.0]&lt;/strong&gt; removed 'download only' optimization: when a document is unchanged, instead of performing a simple download from server, the plugin now performs a full 'round-trip' process (i.e., download the TW source from a server, merge with current tiddlers, and then upload merged document and reflect back as a binary file).  Although the round-trip takes longer, it does permit the reflector script to be located ANYWHERE on the net, at ANY valid URL, rather than having to be placed on the same server and in the same directory as the remote document.  This should permit online services such as TiddlySpot to support SaveFromWebPlugin using a single hosted copy of the reflector script that can be shared by all users.&lt;br&gt;&lt;strong&gt;2007.07.27 [1.1.1]&lt;/strong&gt; new documentation and code cleanup&lt;br&gt;&lt;strong&gt;2007.07.26 [1.1.0]&lt;/strong&gt; re-wrote to support savefromweb.php remote &quot;reflector&quot; script.  Allows use of browser's native download dialog to receive file as a fallback alternative to using local filesystem I/O (which would require additional security permissions)&lt;br&gt;&lt;strong&gt;2007.06.27 [1.0.1]&lt;/strong&gt; in saveFromWeb(), pass content from server through convertUnicodeToUTF8() before writing to file.&lt;br&gt;&lt;strong&gt;2007.06.26 [1.0.0]&lt;/strong&gt; initial release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by Eric L Shulman / ELS Design Studios&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.SaveFromWeb= {major: 1, minor: 3, revision: 0, date: new Date(2007,8,8)};
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;// DEFAULT SETTINGS
if (config.options.txtSaveFromWebScriptURL==undefined)
	config.options.txtSaveFromWebScriptURL=&quot;savefromweb.php&quot;;
if (config.options.txtSaveFromWebTargetFilename==undefined)
	config.options.txtSaveFromWebTargetFilename=&quot;&quot;; // use current filename when blank
if (config.options.txtSaveFromWebSourceFile==undefined)
	config.options.txtSaveFromWebSourceFile=&quot;&quot;; // use current URL when blank
if (config.options.chkSaveFromWebAttemptLocalIO==undefined)
	config.options.chkSaveFromWebAttemptLocalIO=true; // true=try to use local filesystem I/O (requires security permissions)
if (config.options.chkSaveFromWebPreFetch==undefined)
	config.options.chkSaveFromWebPreFetch=false; // true=retrieve TW core when document is first loaded
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;// OPTIONAL: get TW core source code when plugin is loaded (i.e., once per document session)
if (document.location.protocol!=&quot;file:&quot; &amp;amp;&amp;amp; config.options.chkSaveFromWebPreFetch) {
	// retrieve TW source from server...
	var src=document.location.href;
	if (config.options.txtSaveFromWebSourceFile &amp;amp;&amp;amp; config.options.txtSaveFromWebSourceFile.length)
		src=config.options.txtSaveFromWebSourceFile;
	var target=config.options.txtSaveFromWebTargetFilename;
	if (!target.length) { // use current filename
		var loc=document.location.pathname;
		var slashpos=loc.lastIndexOf(&quot;/&quot;);
		target=(slashpos==-1)?loc:loc.substr(slashpos+1);
		if (!target.length) target=document.location.host+&quot;.html&quot;;
	}
	var xhr=loadRemoteFile(src,function(success,target,txt,src,xhr){if(success)config.saveFromWebSourceCache=txt;},target);
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;window.saveFromWeb_saveChanges = window.saveChanges;
window.saveChanges = function(onlyIfDirty,tiddlers) {
	// if on file:, just use standard core save handling
	if(document.location.protocol == &quot;file:&quot;) { window.saveFromWeb_saveChanges.apply(this,arguments); return; }
	// get target filename
	var target=config.options.txtSaveFromWebTargetFilename;
	if (!target.length) { // use current filename
		var loc=document.location.pathname;
		var slashpos=loc.lastIndexOf(&quot;/&quot;);
		target=(slashpos==-1)?loc:loc.substr(slashpos+1);
		if (!target.length) target=document.location.host+&quot;.html&quot;;
	}
	// get TW core source location
	var src=document.location.href;
	if (config.options.txtSaveFromWebSourceFile &amp;amp;&amp;amp; config.options.txtSaveFromWebSourceFile.length)
		src=config.options.txtSaveFromWebSourceFile;
	// if core source has already been cached, go straight to saving the file...
	if (config.saveFromWebSourceCache)
		{ window.saveFromWeb(true,target,config.saveFromWebSourceCache,src,null); return; }
	// otherwise, retrieve TW source from server...
	displayMessage(&quot;Retrieving TiddlyWiki core from &quot;+src);
	var xhr=loadRemoteFile(src,window.saveFromWeb,target);
	if (!xhr) { // couldn't load remote, report core error message
		displayMessage(&quot;Could not retrieve TiddlyWiki core... download unsuccessful.&quot;);
		alert(config.messages.notFileUrlError);
		if(store.tiddlerExists(config.messages.saveInstructions))
			story.displayTiddler(null,config.messages.saveInstructions);
	}
	return;
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;window.saveFromWeb = function(success,target,txt,url,xhr) {
	if(!success) {
		displayMessage(&quot;Could not retrieve TiddlyWiki core... download unsuccessful.&quot;);
		alert(config.messages.cantSaveError);
		if(store.tiddlerExists(config.messages.saveInstructions))
			story.displayTiddler(null,config.messages.saveInstructions);
		return;
	}
	// Locate the storeArea div's in the original source
	var posDiv = locateStoreArea(txt);
	if(!posDiv) {
		alert(config.messages.invalidFileError.format([url]));
		return;
	}

	// cache the document source so subsequent saves don't have to retrieve the source each time
	if (!config.saveFromWebSourceCache) config.saveFromWebSourceCache=txt;

	// if we can get local filesystem access, then ask for a filename and merge/write the file
	if (config.options.chkSaveFromWebAttemptLocalIO) {
		try {
			// get destination path+filename
			var target=promptForFilename( &quot;Save file as:&quot;,&quot;C:\\&quot;,target,&quot;html&quot;); // this be blocked by browser security
			if (!target || !target.length) return;
			saveBackup(target,txt);
			saveRss(target);
			saveEmpty(target,txt,posDiv);
			saveMain(target,txt,posDiv);
			return;
		}
		catch(e) { 
			displayMessage(&quot;Direct file access has been blocked by browser security settings.&quot;);
			if (config.options.txtSaveFromWebScriptURL.length)
				displayMessage(&quot;Attempting to download document using server-side 'reflector' script...&quot;);
		}
	}
	// otherwise, fallback to using online 'reflector' script (if any)
	if (config.options.txtSaveFromWebScriptURL.length) {
		displayMessage(&quot;Merging tiddlers with core and preparing for download...&quot;);
		// create form in a hidden frame and submit it to server
		var html='&amp;lt;input type=&quot;hidden&quot; name=&quot;filename&quot; value=&quot;&quot;&amp;gt;&amp;lt;input type=&quot;hidden&quot; name=&quot;contents&quot; value=&quot;&quot;&amp;gt;';
		var form=window.createHiddenForm(config.options.txtSaveFromWebScriptURL,html);
		form.filename.value=target;
		form.contents.value=updateOriginal(txt,posDiv); // merge tiddlers with source and set into form field
		form.submit();
	}
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;window.createHiddenForm=function(action,body) {
	var f=document.getElementById(&quot;saveFromWebFrame&quot;);
	if (f) document.body.removeChild(f);
	var f=createTiddlyElement(document.body,&quot;iframe&quot;,&quot;saveFromWebFrame&quot;);
	f.style.width=&quot;0px&quot;; f.style.height=&quot;0px&quot;; f.style.border=&quot;0px&quot;;
	var d=f.document;
	if (f.contentDocument) d=f.contentDocument; // For NS6
	else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6
	d.open();
	d.writeln('&amp;lt;form target=&quot;_self&quot; action=&quot;'+action+'&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;'+body+'&amp;lt;/form&amp;gt;');
	d.close();
	return d.getElementsByTagName(&quot;form&quot;)[0];
}
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;// note: if blocked by browser security, this function will throw an error...
// the CALLING function should use &quot;try{...} catch(e){...}&quot; to handle the security errors
window.promptForFilename=function(msg,path,file,defext) {
	var result=&quot;&quot;;
	if(window.Components) { // moz
		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);
		picker.displayDirectory=null;
		picker.defaultExtension=defext;
		picker.defaultString=file;
		picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
		if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;
	}
	else { // IE (XP only)
		var s = new ActiveXObject('UserAccounts.CommonDialog');
		s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
		s.FilterIndex=1; // default to ALL files;
		s.InitialDir=path;
		s.FileName=file;
		if (s.showOpen()) var result=s.FileName;
	}
	return result;
}
&lt;/pre&gt;</description>
<category>ImportExportPackage</category>
<category>includeNew</category>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#SaveFromWebPlugin</link>
<pubDate>Thu, 09 Aug 2007 04:36:00 GMT</pubDate>
</item>
<item>
<title>SaveFromWebConfig</title>
<description>&lt;pre&gt;// location of server-side 'reflector' script. Can be on ANY domain... 
config.options.txtSaveFromWebScriptURL=&quot;savefromweb.php&quot;;

// use alternative document URL for retrieving TiddlyWiki core source code.
// Using *empty* TW minimizes data transfer for retrieving TW core.
// Can be on ANY domain... If blank, uses current document URL
config.options.txtSaveFromWebSourceFile=&quot;http://www.TiddlyTools.com/empty.html&quot;;

// use alternative target filename for the downloaded document.
// Can be any valid filename for local filesystem.  If blank, uses current filename
config.options.txtSaveFromWebTargetFilename=&quot;&quot;;

// Pre-fetch option
// true=get (and cache) TW core code when document is first loaded (i.e., when plugin is initialized)
// false=get  and cache core code the first time the file is being saved
// pre-fetching and caching the core code permits &quot;save changes&quot; to still be performed,
// even if the connection to the net is dropped during the session.
config.options.chkSaveFromWebPreFetch=false;

// Local I/O option (requires browser security permissions, i.e., &quot;trusted site&quot; settings)
config.options.chkSaveFromWebAttemptLocalIO=false;

// enable editing features over http so that 'save changes' is available online by default
config.options.chkHttpReadOnly=readOnly=false;
&lt;/pre&gt;</description>
<category>ImportExportPackage</category>
<category>includeNew</category>
<category>settings</category>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#SaveFromWebConfig</link>
<pubDate>Wed, 08 Aug 2007 16:50:00 GMT</pubDate>
</item>
<item>
<title>CheckboxPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;CheckboxPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#CheckboxPlugin&quot; href=&quot;http://www.TiddlyTools.com/#CheckboxPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#CheckboxPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;2.2.4&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;Add checkboxes to your tiddler content&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This plugin extends the TiddlyWiki syntax to allow definition of checkboxes that can be embedded directly in tiddler content.  Checkbox states are preserved by either:&lt;br&gt;&lt;ul&gt;&lt;li&gt; automatically modifying the tiddler content (deprecated)&lt;/li&gt;&lt;li&gt; or, by setting/removing tags on specified tiddlers,&lt;/li&gt;&lt;li&gt; or, by setting custom field values on specified tiddlers,&lt;/li&gt;&lt;li&gt; or, by saving to a locally-stored cookie ID.&lt;/li&gt;&lt;/ul&gt;When an ID is assigned to the checkbox, it enables direct programmatic access to the checkbox DOM element, as well as creating an entry in TiddlyWiki's config.options[ID] internal data.  In addition to tracking the checkbox state, you can also specify custom javascript for programmatic initialization and onClick event handling for any checkbox, so you can provide specialized side-effects in response to state changes.&lt;br&gt;&lt;h5&gt; Inline wiki-syntax usage&lt;/h5&gt;&lt;blockquote&gt;&lt;pre&gt;[ ]or[_] and [x]or[X]
&lt;/pre&gt;Simple checkboxes using 'Inline X' storage.  The current unchecked/checked state is indicated by the character between the &lt;code&gt;[&lt;/code&gt; and &lt;code&gt;]&lt;/code&gt; brackets (&quot;_&quot; means unchecked, &quot;X&quot; means checked).  When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding &quot;_&quot; or &quot;X&quot; character in between the brackets.&lt;br&gt;&lt;blockquote&gt;&lt;em&gt;&lt;strong&gt;NOTE: 'Inline X' syntax has been deprecated...&lt;/strong&gt;  This storage format only works properly for checkboxes that are directly embedded and accessed from content in a single tiddler.  However, if that tiddler is 'transcluded' into another (by using the &lt;code&gt;&amp;lt;&amp;lt;tiddler TiddlerName&amp;gt;&amp;gt;&lt;/code&gt; macro), the 'Inline X' will be &lt;strong&gt;erroneously stored in the containing tiddler's source content, resulting in corrupted content in that tiddler.&lt;/strong&gt;  For anything but the most simple of &quot;to do list&quot; uses, you should select from the various alternative storage methods described below...&lt;/em&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;pre&gt;[x=id]
&lt;/pre&gt;Assign an optional ID to the checkbox so you can use &lt;code&gt;document.getElementByID(&quot;id&quot;)&lt;/code&gt; to manipulate the checkbox DOM element, as well as tracking the current checkbox state in &lt;code&gt;config.options[&quot;id&quot;]&lt;/code&gt;.  If the ID starts with &quot;chk&quot; the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default &lt;code&gt;[x]&lt;/code&gt; or &lt;code&gt;[_]&lt;/code&gt; value).  If a cookie value is kept, the &quot;_&quot; or &quot;X&quot; character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.&lt;br&gt;&lt;pre&gt;[x(title|tag)] or [x(title:tag)]
&lt;/pre&gt;Initializes and tracks the current checkbox state by setting or removing a particular tag value from a specified tiddler.  If you omit the tiddler title (and the | or : separator), the specified tag is assigned to the current tiddler.  If you omit the tag value, as in &lt;code&gt;(title|)&lt;/code&gt;, the default tag, &lt;code&gt;checked&lt;/code&gt;, is assumed.  Omitting both the title and tag, &lt;code&gt;()&lt;/code&gt;, tracks the checkbox state by setting the &quot;checked&quot; tag on the current tiddler.  When tag tracking is used, the &quot;_&quot; or &quot;X&quot; character in the tiddler content remains unchanged, and is not used to set or track the checkbox state.  If a tiddler title named in the tag does not exist, the checkbox state defaults to the &quot;inline X&quot; value.  If this value is &lt;em&gt;checked&lt;/em&gt;, or is subsequently changed to &lt;em&gt;checked&lt;/em&gt;, it will automatically create the missing tiddler and then add the tag to it.  &lt;em&gt;&lt;strong&gt;NOTE: beginning with version 2.1.2 of this plugin, the &quot;|&quot; separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when &quot;:&quot; is used within tiddler titles or tag names.&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;&lt;pre&gt;[x(field@tiddler)]
&lt;/pre&gt;Initializes and tracks the current checkbox state by setting a particular custom field value from a specified tiddler.  If you omit the tiddler title (but not the &quot;@&quot; separator), the specified field on the current tiddler is used.  If you omit the field name, as in &lt;code&gt;(@tiddler)&lt;/code&gt;, a default fieldname of &lt;code&gt;checked&lt;/code&gt; is assumed.  Omitting both the field and the tiddler title, &lt;code&gt;(@)&lt;/code&gt;, defaults to setting the &quot;checked&quot; field on the current tiddler.  When field tracking is used, the &quot;_&quot; or &quot;X&quot; character in the tiddler content remains unchanged, and is not used to set or track the checkbox state.  If the tiddler title named in the parameter does not exist, the checkbox state defaults to the &quot;inline X&quot; value.  If this value is &lt;em&gt;checked&lt;/em&gt; or is subsequently changed to &lt;em&gt;checked&lt;/em&gt;, it will automatically create the missing tiddler and then add the field to it.&lt;br&gt;&lt;pre&gt;[x{javascript}{javascript}]
&lt;/pre&gt;You can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox.  The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.&lt;br&gt;&lt;br&gt;The first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state.  The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).&lt;br&gt;&lt;br&gt;Note: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: &lt;code&gt; [x=id{}{javascript}] &lt;/code&gt; &lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt; Macro usage&lt;/h5&gt;&lt;blockquote&gt;In addition to embedded checkboxes using the wiki syntax described above, a &lt;strong&gt;macro-based syntax&lt;/strong&gt; is also provided, for use in templates where wiki syntax cannot be directly used.  This macro syntax can also be used in tiddler content, as an alternative to the wiki syntax.  When embedded in &lt;a tiddlylink=&quot;PageTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#PageTemplate&quot; href=&quot;http://www.climate-change-two.net/#PageTemplate&quot; class=&quot;externalLink&quot;&gt;PageTemplate&lt;/a&gt;, &lt;a tiddlylink=&quot;ViewTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#ViewTemplate&quot; href=&quot;http://www.climate-change-two.net/#ViewTemplate&quot; class=&quot;externalLink&quot;&gt;ViewTemplate&lt;/a&gt;, or &lt;a tiddlylink=&quot;EditTemplate&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/#EditTemplate&quot; href=&quot;http://www.climate-change-two.net/#EditTemplate&quot; class=&quot;externalLink&quot;&gt;EditTemplate&lt;/a&gt; (or custom alternative templates), use the following macro syntax:&lt;br&gt;&lt;pre&gt;&amp;lt;span macro=&quot;checkbox target checked id onInit onClick&quot;&amp;gt;&amp;lt;/span&amp;gt;
&lt;/pre&gt;or, when embedded in tiddler content, use the following macro syntax:&lt;br&gt;&lt;pre&gt;&amp;lt;&amp;lt;checkbox target checked id onInit onClick&amp;gt;&amp;gt;
&lt;/pre&gt;where:&lt;br&gt;&lt;strong&gt;target&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;is either a tag reference (e.g., &lt;strong&gt;tagname|tiddlername&lt;/strong&gt;) or a field reference (e.g. &lt;strong&gt;fieldname@tiddlername&lt;/strong&gt;), as described above.&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;checked&lt;/strong&gt; (optional)&lt;br&gt;&lt;blockquote&gt;is a keyword that sets the initial state of the checkbox to &quot;checked&quot;.  When omitted, the default checkbox state is &quot;unchecked&quot;.&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;id&lt;/strong&gt; (optional)&lt;br&gt;&lt;blockquote&gt;specifies an internal config.options.* ID, as described above.  If the ID begins with &quot;chk&quot;, a cookie-based persistent value will be created to track the checkbox state in between sessions.&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;onInit&lt;/strong&gt; (optional)&lt;br&gt;&lt;blockquote&gt;contains a javascript event handler to be performed when the checkbox is initially rendered (see details above).&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;onClick&lt;/strong&gt; (optional)&lt;br&gt;&lt;blockquote&gt;contains a javascript event handler to be performed each time the checkbox is clicked (see details above).&lt;br&gt;&lt;em&gt;note: to use the default onInit handler with a custom onClick handler, use &quot;&quot; (empty quotes) as a placeholder for the onInit parameter&lt;/em&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;h5&gt;Examples&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;checked and unchecked static default (&quot;inline X&quot;) values:&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;[X] label
[_] label
&lt;/pre&gt;&lt;blockquote&gt;&lt;input type=&quot;checkbox&quot;&gt; label&lt;br&gt;&lt;input type=&quot;checkbox&quot;&gt; label&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;document-based value (id='demo', no cookie):&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;[_=demo] label
&lt;/pre&gt;&lt;blockquote&gt;&lt;input id=&quot;demo&quot; type=&quot;checkbox&quot;&gt; label&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;cookie-based value  (id='chkDemo'):&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;[_=chkDemo] label
&lt;/pre&gt;&lt;blockquote&gt;&lt;input id=&quot;chkDemo&quot; type=&quot;checkbox&quot;&gt; label&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;tag-based value (TogglyTagging):&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;[_(CheckboxPlugin|demotag)]
[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]
&lt;/pre&gt;&lt;blockquote&gt;&lt;input type=&quot;checkbox&quot;&gt; toggle 'demotag' (and refresh tiddler display)&lt;br&gt;&lt;input type=&quot;checkbox&quot;&gt; toggle 'demotag' (no refresh)&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;field-based values:&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;[_(demofield@CheckboxPlugin)] demofield@CheckboxPlugin
[_(demofield@)] demofield@ (equivalent to demonfield@ current tiddler)
[_(checked@CheckboxPlugin)] checked@CheckboxPlugin
[_(@CheckboxPlugin)] @CheckboxPlugin
[_(@)] @ (equivalent to checked@ current tiddler)
&lt;/pre&gt;&lt;blockquote&gt;&lt;input type=&quot;checkbox&quot;&gt; demofield@CheckboxPlugin&lt;br&gt;&lt;input type=&quot;checkbox&quot;&gt; demofield@ (current tiddler)&lt;br&gt;&lt;input type=&quot;checkbox&quot;&gt; checked@CheckboxPlugin&lt;br&gt;&lt;input type=&quot;checkbox&quot;&gt; @CheckboxPlugin&lt;br&gt;&lt;input type=&quot;checkbox&quot;&gt; toggle field: @ (defaults to &quot;checked@here&quot;)&lt;br&gt;click to view current: &lt;a tiddler=&quot;CheckboxPlugin&quot; commandname=&quot;fields&quot; class=&quot;button&quot; title=&quot;Show the extended fields of this tiddler&quot; href=&quot;javascript:;&quot;&gt;fields&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;custom init and onClick functions:&lt;/strong&gt;&lt;br&gt;&lt;pre&gt;[X{this.checked=true}{alert(this.checked?&quot;on&quot;:&quot;off&quot;)}] message box with checkbox state
&lt;/pre&gt;&lt;blockquote&gt;&lt;input type=&quot;checkbox&quot;&gt; message box with checkbox state&lt;br&gt;&lt;/blockquote&gt;&lt;strong&gt;retrieving option values:&lt;/strong&gt;&lt;br&gt;&lt;blockquote&gt;config.options['demo']=&amp;lt;script&amp;gt;return config.options['demo']?&quot;true&quot;:&quot;false&quot;;&amp;lt;/script&amp;gt;&lt;br&gt;config.options['chkDemo']=&amp;lt;script&amp;gt;return config.options['chkDemo']?&quot;true&quot;:&quot;false&quot;;&amp;lt;/script&amp;gt;&lt;br&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;h5&gt;Configuration&lt;/h5&gt;&lt;blockquote&gt;Normally, when a checkbox state is changed, the affected tiddlers are automatically re-rendered, so that any checkbox-dependent dynamic content can be updated.  There are three possible tiddlers to be re-rendered, depending upon where the checkbox is placed, and what kind of storage method it is using.&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;container&lt;/strong&gt;: the tiddler in which the checkbox is displayed. (e.g., this tiddler)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;tagged&lt;/strong&gt;: the tiddler that is being tagged (e.g., &quot;MyTask&quot; when tagging &quot;MyTask:done&quot;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;tagging&lt;/strong&gt;: the &quot;tag tiddler&quot; (e.g., &quot;~done&quot; when tagging &quot;MyTask:done&quot;)&lt;/li&gt;&lt;/ul&gt;You can set the default refresh handling for all checkboxes in your document by using the following javascript syntax either in a systemConfig plugin, or as an inline script.  (Substitute true/false values as desired):&lt;br&gt;&lt;code&gt;config.checkbox.refresh = { tagged:true, tagging:true, container:true };&lt;/code&gt;&lt;br&gt;&lt;br&gt;You can also override these defaults for any given checkbox by using an initialization function to set one or more of the refresh options.  For example:&lt;br&gt;&lt;code&gt;[_{this.refresh.container=false}]&lt;/code&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;&lt;strong&gt;CheckboxPlugin&lt;/strong&gt; (tagged with &lt;span class=&quot;quickopentag&quot;&gt;&lt;a tiddlylink=&quot;systemConfig&quot; refresh=&quot;link&quot; tip=&quot;The ''systemConfig'' tag is used for [[Plugin Macros]] and instructs TiddlyWiki to include the plugin in its J&quot; class=&quot;tiddlyLink tiddlyLinkExisting&quot; title=&quot;&quot; href=&quot;javascript:;&quot;&gt;systemConfig&lt;/a&gt;&lt;a tag=&quot;systemConfig&quot; class=&quot;button&quot; title=&quot;Show tiddlers tagged with 'systemConfig'&quot; href=&quot;javascript:;&quot;&gt;▾&lt;/a&gt;&lt;/span&gt;)&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;2007.08.06 - 2.2.5 supress automatic refresh of any tiddler that is currently being edited.  Ensures that current tiddler edit sessions are not prematurely discarded (losing any changes).  However, if checkbox changes a tag on a tiddler being edited, update the &quot;tags&quot; input field (if any) so that saving the edited tiddler correctly reflects any changes due to checkbox activity... see refreshEditorTagField().&lt;br&gt;2007.07.13 - 2.2.4 in handler(), fix srctid reference (was &quot;w.tiddler&quot;, should have been &quot;w.tiddler.title&quot;).  This fixes broken 'inline X' plus fatal macro error when using PartTiddlerPlugin.  Thanks to cmari for reporting the problem and UdoBorkowski for finding the code error.&lt;br&gt;2007.06.21 - 2.2.3 suppress automatic refresh of tiddler when using macro-syntax to prevent premature end of tiddler editing session.&lt;br&gt;2007.06.20 - 2.2.2 fixed handling for 'inline X' when checkboxes are contained in a 'trancluded' tiddler.  Now, regardless of where an inline X checkbox appears, the X will be placed in the originating source tiddler, rather than the tiddler in which the checkbox appears.&lt;br&gt;2007.06.17 - 2.2.1 Refactored code to add checkbox &lt;em&gt;macro&lt;/em&gt; syntax for use in templates (e.g., &lt;code&gt;macro=&quot;checkbox ...&quot;&lt;/code&gt;. Also, code cleanup of existing tag handling.&lt;br&gt;2007.06.16 - 2.2.0 added support for tracking checkbox states using tiddler fields via &quot;(fieldname@tiddlername)&quot; syntax.&lt;br&gt;2006.05.04 - 2.1.3 fix use of findContainingTiddler() to check for a non-null return value, so that checkboxes won't crash when used outside of tiddler display context (such as in header, sidebar or mainmenu)&lt;br&gt;2006.03.11 - 2.1.2 added &quot;|&quot; as delimiter to tag-based storage syntax (e.g. &quot;tiddler|tag&quot;) to avoid parsing ambiguity when tiddler titles or tag names contain &quot;:&quot;.   Using &quot;:&quot; as a delimiter is still supported but is deprecated in favor of the new &quot;|&quot; usage.  Based on a problem reported by JeffMason.&lt;br&gt;2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags&lt;br&gt;2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.&lt;br&gt;2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as &quot;to-do&quot; lists) can be re-rendered.&lt;br&gt;2006.02.23 - 2.0.2 when using tag-based storage, allow use &lt;a tiddlylink=&quot; and &quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to http://www.climate-change-two.net/# and &quot; href=&quot;http://www.climate-change-two.net/#%20and%20&quot; class=&quot;externalLink&quot;&gt; and &lt;/a&gt; to quote tiddler or tag names that contain spaces:&lt;br&gt;&lt;code&gt;[x([[Tiddler with spaces]]:[[tag with spaces]])]&lt;/code&gt;&lt;br&gt;2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'.  For example, if you toggle the &quot;systemConfig&quot; tag on a plugin, the corresponding &quot;systemConfig&quot; TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.&lt;br&gt;2006.01.04 - 2.0.0 update for TW2.0&lt;br&gt;2005.12.27 - 1.1.2 Fix lookAhead regExp handling for &lt;code&gt;[x=id]&lt;/code&gt;, which had been including the &quot;]&quot; in the extracted ID.  &lt;br&gt;Added check for &quot;chk&quot; prefix on ID before calling saveOptionCookie()&lt;br&gt;2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing &lt;code&gt;[X]&lt;/code&gt; in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.&lt;br&gt;2005.12.26 - 1.1.0 Revise syntax so all optional parameters are included INSIDE the [ and ] brackets.  Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin.   Based on a suggestion by GeoffSlocock&lt;br&gt;2005.12.25 - 1.0.0 added support for tracking checkbox state using tags (&quot;TogglyTagging&quot;)&lt;br&gt;Revised version number for official post-beta release.&lt;br&gt;2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.&lt;br&gt;2005.12.08 - 0.9.2 clean up lookahead pattern&lt;br&gt;2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different.  Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)&lt;br&gt;2005.12.07 - 0.9.0 initial BETA release&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was created by EricShulman from &lt;a target=&quot;_blank&quot; title=&quot;External link to http:/www.elsdesign.com&quot; href=&quot;http:/www.elsdesign.com&quot; class=&quot;externalLink&quot;&gt;ELS Design Studios&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.CheckboxPlugin = {major: 2, minor: 2, revision:5 , date: new Date(2007,8,6)};
&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: &quot;checkbox&quot;,
	match: &quot;\\[[xX_ ][\\]\\=\\(\\{]&quot;,
	lookahead: &quot;\\[([xX_ ])(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?\\]&quot;,
	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,&quot;mg&quot;);
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch &amp;amp;&amp;amp; lookaheadMatch.index == w.matchStart) {
			// get params
			var checked=(lookaheadMatch[1].toUpperCase()==&quot;X&quot;);
			var id=lookaheadMatch[2];
			var target=lookaheadMatch[3];
			if (target) target=target.substr(1,target.length-2).trim(); // trim off parentheses
			var fn_init=lookaheadMatch[4];
			var fn_click=lookaheadMatch[5];
			var tid=story.findContainingTiddler(w.output);  if (tid) tid=tid.getAttribute(&quot;tiddler&quot;);
			var srctid=w.tiddler?w.tiddler.title:null;
			config.macros.checkbox.create(w.output,tid,srctid,w.matchStart+1,checked,id,target,config.checkbox.refresh,fn_init,fn_click);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} );
config.macros.checkbox = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one
			var here=story.findContainingTiddler(place);
			if (here) tiddler=store.getTiddler(here.getAttribute(&quot;tiddler&quot;))
		}
		var srcpos=0; // &quot;inline X&quot; not applicable to macro syntax
		var target=params.shift(); if (!target) target=&quot;&quot;;
		var defaultState=params[0]==&quot;checked&quot;; if (defaultState) params.shift();
		var id=params.shift(); if (id &amp;amp;&amp;amp; !id.length) id=null;
		var fn_init=params.shift(); if (fn_init &amp;amp;&amp;amp; !fn_init.length) fn_init=null;
		var fn_click=params.shift(); if (fn_click &amp;amp;&amp;amp; !fn_click.length) fn_click=null;
		var refresh={ tagged:true, tagging:true, container:false };
		this.create(place,tiddler.title,tiddler.title,0,defaultState,id,target,refresh,fn_init,fn_click);
	},
	create: function(place,tid,srctid,srcpos,defaultState,id,target,refresh,fn_init,fn_click) {
		// create checkbox element
		var c = document.createElement(&quot;input&quot;);
		c.setAttribute(&quot;type&quot;,&quot;checkbox&quot;);
		c.onclick=this.onClickCheckbox;
		c.srctid=srctid; // remember source tiddler
		c.srcpos=srcpos; // remember location of &quot;X&quot;
		c.container=tid; // containing tiddler (may be null if not in a tiddler)
		c.tiddler=tid; // default target tiddler 
		c.refresh = {};
		c.refresh.container = refresh.container;
		c.refresh.tagged = refresh.tagged;
		c.refresh.tagging = refresh.tagging;
		place.appendChild(c);
		// set default state
		c.checked=defaultState;
		// track state in config.options.ID
		if (id) {
			c.id=id.substr(1); // trim off leading &quot;=&quot;
			if (config.options[c.id]!=undefined)
				c.checked=config.options[c.id];
			else
				config.options[c.id]=c.checked;
		}
		// track state in (tiddlername|tagname) or (fieldname@tiddlername)
		if (target) {
			var pos=target.indexOf(&quot;@&quot;);
			if (pos!=-1) {
				c.field=pos?target.substr(0,pos):&quot;checked&quot;; // get fieldname (or use default &quot;checked&quot;)
				c.tiddler=target.substr(pos+1); // get specified tiddler name (if any)
				if (!c.tiddler || !c.tiddler.length) c.tiddler=tid; // if tiddler not specified, default == container
				if (store.getValue(c.tiddler,c.field)!=undefined)
					c.checked=(store.getValue(c.tiddler,c.field)==&quot;true&quot;); // set checkbox from saved state
			} else {
				var pos=target.indexOf(&quot;|&quot;); if (pos==-1) var pos=target.indexOf(&quot;:&quot;);
				c.tag=target;
				if (pos==0) c.tag=target.substr(1); // trim leading &quot;|&quot; or &quot;:&quot;
				if (pos&amp;gt;0) { c.tiddler=target.substr(0,pos); c.tag=target.substr(pos+1); }
				if (!c.tag.length) c.tag=&quot;checked&quot;;
				var t=store.getTiddler(c.tiddler);
				if (t &amp;amp;&amp;amp; t.tags)
					c.checked=t.isTagged(c.tag); // set checkbox from saved state
			}
		}
		if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters
		if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);
		c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
	},
	onClickCheckbox: function(event) {
		if (this.fn_init)
			// custom function hook to set initial state (run only once)
			{ try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage(&quot;Checkbox init error: &quot;+e.toString()); } }
		else if (this.fn_click)
			// custom function hook to override or react to changes in checkbox state
			{ try { eval(this.fn_click) } catch(e) { displayMessage(&quot;Checkbox click error: &quot;+e.toString()); } }
		if (this.id)
			// save state in config AND cookie (only when ID starts with 'chk')
			{ config.options[this.id]=this.checked; if (this.id.substr(0,3)==&quot;chk&quot;) saveOptionCookie(this.id); }
		if (this.srctid &amp;amp;&amp;amp; this.srcpos&amp;gt;0 &amp;amp;&amp;amp; (!this.id || this.id.substr(0,3)!=&quot;chk&quot;) &amp;amp;&amp;amp; !this.tag &amp;amp;&amp;amp; !this.field) {
			// save state in tiddler content only if not using cookie, tag or field tracking
			var t=store.getTiddler(this.srctid); // put X in original source tiddler (if any)
			if (t &amp;amp;&amp;amp; this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()==&quot;X&quot;)) { // if changed
				t.set(null,t.text.substr(0,this.srcpos)+(this.checked?&quot;X&quot;:&quot;_&quot;)+t.text.substr(this.srcpos+1),null,null,t.tags);
				if (!story.isDirty(t.title)) story.refreshTiddler(t.title,null,true);
				store.setDirty(true);
			}
		}
		if (this.field) {
			if (this.checked &amp;amp;&amp;amp; !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,&quot;&quot;,config.options.txtUserName,new Date());
			// set the field value in the target tiddler
			store.setValue(this.tiddler,this.field,this.checked?&quot;true&quot;:&quot;false&quot;);
			// DEBUG: displayMessage(this.field+&quot;@&quot;+this.tiddler+&quot; is &quot;+this.checked);
		}
		if (this.tag) {
			if (this.checked &amp;amp;&amp;amp; !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,&quot;&quot;,config.options.txtUserName,new Date());
			var t=store.getTiddler(this.tiddler);
			if (t) {
				var tagged=(t.tags &amp;amp;&amp;amp; t.tags.find(this.tag)!=null);
				if (this.checked &amp;amp;&amp;amp; !tagged) { t.tags.push(this.tag); store.setDirty(true); }
				if (!this.checked &amp;amp;&amp;amp; tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }
			}
			// if tag state has been changed, update display of corresponding tiddlers (unless they are in edit mode...)
			if (this.checked!=tagged) {
				if (this.refresh.tagged) {
					if (!story.isDirty(this.tiddler)) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler in view mode
					else config.macros.checkbox.refreshEditorTagField(this.tiddler,this.tag,this.checked); // the TAGGED tiddler in edit mode (with tags field)
				}
				if (this.refresh.tagging)
					if (!story.isDirty(this.tag)) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
			}
		}
		// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!) (and not when editing container)
		if (!this.init &amp;amp;&amp;amp; this.refresh.container &amp;amp;&amp;amp; this.container!=this.tiddler)
			if (!story.isDirty(this.container)) story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
		return true;
	},
	refreshEditorTagField: function(title,tag,set) {
		var tagfield=story.getTiddlerField(title,&quot;tags&quot;);
		if (!tagfield||tagfield.getAttribute(&quot;edit&quot;)!=&quot;tags&quot;) return; // if no tags field in editor (i.e., custom template)
		var tags=tagfield.value.readBracketedList();
		if (tags.contains(tag)==set) return; // if no change needed
		if (set) tags.push(tag); // add tag
		else tags.splice(tags.indexOf(tag),1); // remove tag
		for (var t=0;t&amp;lt;tags.length;t++) tags[t]=String.encodeTiddlyLink(tags[t]);
		tagfield.value=tags.join(&quot; &quot;); // reassemble tag string (with brackets as needed)
		return;
	}
}
&lt;/pre&gt;</description>
<category>FormattingPackage</category>
<category>MediaPackage</category>
<category>TaskPackage</category>
<category>includeNew</category>
<category>systemConfig</category>
<category>InputPackage</category>
<link>http://www.climate-change-two.net/#CheckboxPlugin</link>
<pubDate>Tue, 07 Aug 2007 04:02:00 GMT</pubDate>
</item>
<item>
<title>RecentChangesPlugin</title>
<description>&lt;table class=&quot;twtable&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;RecentChangesPlugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Source&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#RecentChangesPlugin&quot; href=&quot;http://www.TiddlyTools.com/#RecentChangesPlugin&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#RecentChangesPlugin&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Version&lt;/td&gt;&lt;td&gt;1.0.0&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Eric Shulman - ELS Design Studios&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;License&lt;/td&gt;&lt;td&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://www.TiddlyTools.com/#LegalStatements&quot; href=&quot;http://www.TiddlyTools.com/#LegalStatements&quot; class=&quot;externalLink&quot;&gt;http://www.TiddlyTools.com/#LegalStatements&lt;/a&gt; &lt;br&gt;and &lt;a target=&quot;_blank&quot; title=&quot;External link to http://creativecommons.org/licenses/by-sa/2.5/&quot; href=&quot;http://creativecommons.org/licenses/by-sa/2.5/&quot; class=&quot;externalLink&quot;&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;CoreVersion&lt;/td&gt;&lt;td&gt;2.1&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Requires&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;evenRow&quot;&gt;&lt;td&gt;Overrides&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class=&quot;oddRow&quot;&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;display droplist of recently changed tiddlers with goto, edit, and preview buttons&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;h5&gt;Usage&lt;/h5&gt;&lt;blockquote&gt;The &lt;code&gt;&amp;lt;&amp;lt;recentChanges&amp;gt;&amp;gt;&lt;/code&gt; macro displays a droplist of all tiddlers that have been changed within the last N days (default=10 days).  &lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Examples&lt;/h5&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;&amp;lt;recentChanges&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;div&gt;&lt;form&gt;&lt;!--		--&gt;&lt;select size=&quot;1&quot; name=&quot;list&quot; style=&quot;width: 69.5%;&quot; onchange=&quot; 				this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length; 				var target=this.parentNode.parentNode.nextSibling; removeChildren(target); 				if (!this.value.length) 					{ target.style.display='none'; this.form.preview.value='preview'; } 				else if (target.style.display=='block') { 					wikify('&lt;'+'&lt;tiddler [['+this.value+']]&gt;'+'&gt;',target); 					target.style.display='block'; 					this.form.preview.value='done'; 				} &quot;&gt;&lt;!--		--&gt;&lt;option value=&quot;&quot;&gt;2 tiddlers have changed since Monday, November 12th 2007 12:31 (10 days ago)&lt;/option&gt;&lt;option value=&quot;MainMenu&quot;&gt;2007.11.19 02:26 - MainMenu&lt;/option&gt;&lt;option value=&quot;PageTemplate&quot;&gt;2007.11.14 17:15 - PageTemplate&lt;/option&gt;&lt;!--		--&gt;&lt;/select&gt;&lt;!--		--&gt;&lt;input name=&quot;goto&quot; value=&quot;goto&quot; disabled=&quot;disabled&quot; title=&quot;view selected tiddler&quot; style=&quot;width: 10%;&quot; onclick=&quot;var target=this.parentNode.parentNode.nextSibling; removeChildren(target); 				target.style.display='none'; this.form.preview.value='preview'; 				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value); &quot; type=&quot;button&quot;&gt;&lt;!--		--&gt;&lt;input name=&quot;edit&quot; value=&quot;edit&quot; disabled=&quot;disabled&quot; title=&quot;edit selected tiddler&quot; style=&quot;width: 10%;&quot; onclick=&quot;var target=this.parentNode.parentNode.nextSibling; removeChildren(target); 				target.style.display='none'; this.form.preview.value='preview'; 				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE); &quot; type=&quot;button&quot;&gt;&lt;!--		--&gt;&lt;input name=&quot;preview&quot; value=&quot;preview&quot; disabled=&quot;disabled&quot; title=&quot;show/hide tiddler preview&quot; style=&quot;width: 10%;&quot; onclick=&quot;var target=this.parentNode.parentNode.nextSibling; 				if (this.value=='preview') { 					removeChildren(target); 					wikify('&lt;'+'&lt;tiddler [['+this.form.list.value+']]&gt;'+'&gt;',target); 					target.style.display=this.form.list.value.length?'block':'none'; this.value='done'; 				} else { 					removeChildren(target); 					target.style.display='none'; this.value='preview'; 				} &quot; type=&quot;button&quot;&gt;&lt;!--		--&gt;&lt;/form&gt;&lt;/div&gt;&lt;span style=&quot;overflow: auto; display: none; white-space: normal; height: 15em;&quot; class=&quot;viewer&quot;&gt;&lt;/span&gt;&lt;br&gt;or&lt;br&gt;&lt;code&gt;&amp;lt;&amp;lt;recentChanges #ofdays previewheight previewclass&amp;gt;&amp;gt;&lt;/code&gt;&lt;br&gt;where:&lt;br&gt;&lt;ul&gt;&lt;li&gt; #ofdays specifies the time limit for list changed tiddlers.  Use 0 (zero) to list all tiddlers in the document&lt;/li&gt;&lt;li&gt; previewheight is a CSS height measurement and sets the FIXED height of the tiddler preview area (default is 15em)&lt;/li&gt;&lt;li&gt; previewclass is any CSS classname, and can be used to apply custom styles to the preview area (default is to use the standard 'viewer' class)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;form&gt;&lt;!--		--&gt;&lt;select size=&quot;1&quot; name=&quot;list&quot; style=&quot;width: 69.5%;&quot; onchange=&quot; 				this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length; 				var target=this.parentNode.parentNode.nextSibling; removeChildren(target); 				if (!this.value.length) 					{ target.style.display='none'; this.form.preview.value='preview'; } 				else if (target.style.display=='block') { 					wikify('&lt;'+'&lt;tiddler [['+this.value+']]&gt;'+'&gt;',target); 					target.style.display='block'; 					this.form.preview.value='done'; 				} &quot;&gt;&lt;!--		--&gt;&lt;option value=&quot;&quot;&gt;2 tiddlers have changed since Thursday, November 8th 2007 12:31 (14 days ago)&lt;/option&gt;&lt;option value=&quot;MainMenu&quot;&gt;2007.11.19 02:26 - MainMenu&lt;/option&gt;&lt;option value=&quot;PageTemplate&quot;&gt;2007.11.14 17:15 - PageTemplate&lt;/option&gt;&lt;!--		--&gt;&lt;/select&gt;&lt;!--		--&gt;&lt;input name=&quot;goto&quot; value=&quot;goto&quot; disabled=&quot;disabled&quot; title=&quot;view selected tiddler&quot; style=&quot;width: 10%;&quot; onclick=&quot;var target=this.parentNode.parentNode.nextSibling; removeChildren(target); 				target.style.display='none'; this.form.preview.value='preview'; 				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value); &quot; type=&quot;button&quot;&gt;&lt;!--		--&gt;&lt;input name=&quot;edit&quot; value=&quot;edit&quot; disabled=&quot;disabled&quot; title=&quot;edit selected tiddler&quot; style=&quot;width: 10%;&quot; onclick=&quot;var target=this.parentNode.parentNode.nextSibling; removeChildren(target); 				target.style.display='none'; this.form.preview.value='preview'; 				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE); &quot; type=&quot;button&quot;&gt;&lt;!--		--&gt;&lt;input name=&quot;preview&quot; value=&quot;preview&quot; disabled=&quot;disabled&quot; title=&quot;show/hide tiddler preview&quot; style=&quot;width: 10%;&quot; onclick=&quot;var target=this.parentNode.parentNode.nextSibling; 				if (this.value=='preview') { 					removeChildren(target); 					wikify('&lt;'+'&lt;tiddler [['+this.form.list.value+']]&gt;'+'&gt;',target); 					target.style.display=this.form.list.value.length?'block':'none'; this.value='done'; 				} else { 					removeChildren(target); 					target.style.display='none'; this.value='preview'; 				} &quot; type=&quot;button&quot;&gt;&lt;!--		--&gt;&lt;/form&gt;&lt;/div&gt;&lt;span style=&quot;overflow: auto; display: none; white-space: normal; height: 10em;&quot; class=&quot;groupbox&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Installation&lt;/h5&gt;&lt;blockquote&gt;import (or copy/paste) the following tiddlers into your document:&lt;br&gt;RecentChangesPlugin&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Revision History&lt;/h5&gt;&lt;blockquote&gt;&lt;strong&gt;2007.07.26 [2.0.0]&lt;/strong&gt; re-written as plugin&lt;br&gt;&lt;strong&gt;[1.0.0]&lt;/strong&gt; initial release (as inline script ShowRecentChanges)&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Credits&lt;/h5&gt;&lt;blockquote&gt;This feature was developed by Eric Shulman / ELS Design Studios&lt;br&gt;&lt;/blockquote&gt;&lt;h5&gt;Code&lt;/h5&gt;&lt;pre&gt;version.extensions.recentChanges= {major: 2, minor: 0, revision: 0, date: new Date(2007,7,26)};

config.macros.recentChanges = {
	layout: '&amp;lt;form&amp;gt;&amp;lt;!--\
		--&amp;gt;&amp;lt;select size=1 name=&quot;list&quot; style=&quot;width:69.5%&quot; \
			onchange=&quot; \
				this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length; \
				var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				if (!this.value.length) \
					{ target.style.display=\'none\'; this.form.preview.value=\'preview\'; } \
				else if (target.style.display==\'block\') { \
					wikify(\'&amp;lt;\'+\'&amp;lt;tiddler [[\'+this.value+\']]&amp;gt;\'+\'&amp;gt;\',target); \
					target.style.display=\'block\'; \
					this.form.preview.value=\'done\'; \
				} \
			&quot;&amp;gt;&amp;lt;!--\
		--&amp;gt;%options%&amp;lt;!--\
		--&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;!--\
		--&amp;gt;&amp;lt;input type=&quot;button&quot; name=&quot;goto&quot; value=&quot;goto&quot; disabled title=&quot;view selected tiddler&quot; style=&quot;width:10%&quot; \
			onclick=&quot;var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value); \
			&quot;&amp;gt;&amp;lt;!--\
		--&amp;gt;&amp;lt;input type=&quot;button&quot; name=&quot;edit&quot; value=&quot;edit&quot; disabled title=&quot;edit selected tiddler&quot; style=&quot;width:10%&quot; \
			onclick=&quot;var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE); \
			&quot;&amp;gt;&amp;lt;!--\
		--&amp;gt;&amp;lt;input type=&quot;button&quot; name=&quot;preview&quot; value=&quot;preview&quot; disabled title=&quot;show/hide tiddler preview&quot; style=&quot;width:10%&quot; \
			onclick=&quot;var target=this.parentNode.parentNode.nextSibling; \
				if (this.value==\'preview\') { \
					removeChildren(target); \
					wikify(\'&amp;lt;\'+\'&amp;lt;tiddler [[\'+this.form.list.value+\']]&amp;gt;\'+\'&amp;gt;\',target); \
					target.style.display=this.form.list.value.length?\'block\':\'none\'; this.value=\'done\'; \
				} else { \
					removeChildren(target); \
					target.style.display=\'none\'; this.value=\'preview\'; \
				} \
			&quot;&amp;gt;&amp;lt;!--\
		--&amp;gt;&amp;lt;/form&amp;gt;',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var days=10; if (!isNaN(params[0])) days=parseInt(params[0]); // time limit in days (use 0 for all tiddlers)
		var height='15em'; if (params[1]) height=params[1]; // preview area fixed height
		var previewclass='viewer'; if (params[2]) previewclass=params[2]; // preview area CSS class
		var tiddlers=store.getTiddlers('modified','excludeLists').reverse();
		var count=tiddlers.length;
		if (days) {
			var timelimit=(new Date()).getTime()-86400000*days;
			for (var count=0; count&amp;lt;tiddlers.length &amp;amp;&amp;amp; tiddlers[count].modified&amp;gt;timelimit; count++);
		}
		var opts=&quot;&quot;;
		opts+='&amp;lt;option value=&quot;&quot;&amp;gt;';
		opts+=count+' tiddlers have changed since ';
		opts+=new Date(timelimit).formatString(&quot;DDD, MMM DDth YYYY 0hh:0mm&quot;);
		opts+=' ('+days+' days ago)';
		opts+='&amp;lt;/option&amp;gt;';
		for (var i=0; i&amp;lt;count; i++) { var t=tiddlers[i];
			opts+='&amp;lt;option value=&quot;'+t.title+'&quot;&amp;gt;';
			opts+=t.modified.formatString('YYYY.0MM.0DD 0hh:0mm')+' - '+t.title;
			opts+='&amp;lt;/option&amp;gt;';
		}
		createTiddlyElement(place,&quot;div&quot;).innerHTML=this.layout.replace(/%options%/,opts);
		var preview=createTiddlyElement(place,&quot;span&quot;,null,previewclass);
		preview.style.display='none';
		preview.style.whiteSpace='normal';
		preview.style.overflow='auto';
		preview.style.height=height
	}
}
&lt;/pre&gt;</description>
<category>CatalogPackage</category>
<category>DiscoveryPackage</category>
<category>includeNew</category>
<category>systemConfig</category>
<link>http://www.climate-change-two.net/#RecentChangesPlugin</link>
<pubDate>Fri, 27 Jul 2007 12:27:00 GMT</pubDate>
</item>
</channel>
</rss>