~TiddlyTools presents ''Technologies, Techniques, Tricks, Tips, Tweaks and Tutorials'' for ~TiddlyWiki readers, authors and developers, using a combination of ''plugins, macros, scripts, templates, and stylesheets'' from [[ELS Design Studios|ELSDesignStudios]] (and other sources) to customize the default features and functions provided by the ~TiddlyWiki standard distribution.\n\nYou can install these ~TiddlyWiki "accessories" into ''//your//'' documents to add just a few new features and functions or assemble your own complete ''custom ~TiddlyWiki applications''. You can also download ~TiddlyWiki ''starter documents'' with selected bundles of accessories, pre-installed and optimized for various activities, ready for you to fill in your own content \n\n[>img[ELS Design Studios|els/banner_small.gif]] //Just copy the accessories, documents and files that fit your needs and start growing your own ~TiddlyWiki content right away!//\n\n----\n{{fine{@@display:block;This document is based on ''[[TiddlyWiki|http://www.TiddlyWiki.com/]] version <<version>>'' by Jeremy Ruston with program enhancements and installable plugins developed by Eric Shulman from [[ELS Design Studios|http://www.elsdesign.com/]]. Additional plugins from other sources have also been installed in this document. Much thanks go to the creators of these features for their fine contributions to the ~TiddlyWiki developer and user communities.@@}}}
<html><form>\nPlease enter information about a contact:<br><!--\n--><input type="hidden" name="cardtype" value="AddressBookLongForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:18.5%" title="card ID" name="cardID" value="card ID"><!-- card name (required)\n--><input type="text" onfocus="this.select()" style="width:40%" title="name" name="title" value="name"><!-- card title (required)\n--><input type="text" onfocus="this.select()" style="width:40%" title="email" name="email" value="email"><br><!--\n--><input type="text" onfocus="this.select()" style="width:33%" title="phone" name="phone" value="phone"><!--\n--><input type="text" onfocus="this.select()" style="width:33%" title="fax" name="fax" value="fax"><!--\n--><input type="text" onfocus="this.select()" style="width:32.5%" title="cell/voicemail" name="cell" value="cell/voicemail"><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="web site(url)" name="url" value="web site (url)"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n-->USPS mailing address:<br><input type="text" onfocus="this.select()" style="width:100%" title="address line1" name="addr1" value="address line 1"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="address line2" name="addr2" value="address line 2"><br><!--\n--><input type="text" onfocus="this.select()" style="width:75%" title="city" name="city" value="city"><!--\n--><input type="text" onfocus="this.select()" style="width:10%" title="state" name="state" value="state"><!--\n--><input type="text" onfocus="this.select()" style="width:13.5%" title="zip" name="zip" value="zip"><br><!--\n-->tags:<br><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="AddressBookCard"><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="family"> family <!--\n--><input type="checkbox" name="friend"> friend <!--\n--><input type="checkbox" name="co-worker"> co-worker <!--\n--><input type="checkbox" name="service/support"> service/support <!--\n--></div>\n</form></html>
<html><form>\nPlease enter information about a contact:<br><!--\n--><input type="hidden" name="cardtype" value="AddressBookShortForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card ID" name="cardID" value="card ID"><!-- card name (required)\n--><input type="text" onfocus="this.select()" style="width:79%" title="name" name="title" value="name"><br><!-- card title (required)\n--><input type="text" onfocus="this.select()" style="width:33%" title="phone" name="phone" value="phone"><!--\n--><input type="text" onfocus="this.select()" style="width:33%" title="fax" name="fax" value="fax"><!--\n--><input type="text" onfocus="this.select()" style="width:32.5%" title="cell/voicemail" name="cell" value="cell/voicemail"><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="web site(url)" name="url" value="web site (url)"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><!--\n--><span style="visibility:hidden;"><!--\n--><input type="hidden" name="email" value=""><!--\n--><input type="hidden" name="addr1" value=""><!--\n--><input type="hidden" name="addr2" value=""><!--\n--><input type="hidden" name="city" value=""><!--\n--><input type="hidden" name="state" value=""><!--\n--><input type="hidden" name="zip" value=""><!--\n--><input type="hidden" name="tags" value="AddressBookCard"><!--\n--><input type="checkbox" name="family"> family <!--\n--><input type="checkbox" name="friend"> friend <!--\n--><input type="checkbox" name="co-worker"> co-worker <!--\n--><input type="checkbox" name="service/support"> service/support <!--\n--></span>\n</form></html>\n----\n
/***\n''AliasPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#AliasPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nCreate text-substitution macros that define abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.\n\n!!!!!Usage\n<<<\nFirst, decide upon a suitable "alias" for the text to be substituted. This is usually a short keyword or other abbreviated term that is easily input with just a few keystrokes. You can use any alias you like, but don't include any spaces in the alias name, since it will be used as the name of the 'alias macro' that is created, and macro names cannot contain spaces.\n\n//Note: If you use an alias name that ''does'' contain spaces, they will be automatically replaced with underscores ("_"), so that the resulting alias name will still be a valid macro name//\n\nTo create alias definitions, embed << {{{alias //newname// //"text to display"//}}} >> macros in a tiddler. These macros don't actually produce any visible output, but simply define the alias macros that you want to use in your document, and thus they can be safely added to practically any tiddler without producing a change in that tiddler's appearance.\n\nIn order to ensure that your aliases are defined and available for use throughout your document, you should add your definitions to a tiddler that you are certain will be displayed when your TW is first loaded, such as MainMenu or SiteTitle (or, any tiddler listed in DefaultTiddlers).\n<<<\n!!!!!Examples\n<<<\n<<alias>> {{{<<alias>>}}}\nmissing alias name: fail safe, do nothing\n\n<<alias alias1>> {{{<<alias alias1>>}}}\nmissing text params, default to text=name (e.g., "<<alias1>>")\n\n<<alias alias2 simple multi-word text substitution>> {{{<<alias alias2 simple multi-word text substitution>>}}}\n<<alias2>>\n\n<<alias "alias3 with spaces" "spaces in aliasname converted to _">> {{{<<alias "alias3 with spaces" "spaces in aliasname converted to _ ">>}}}\n<<alias3_with_spaces>>\n\n<<alias alias4 "multi-line \ntext\nsubstitution">> {{{<<alias alias4 "multi-line\ntext\nsubstitution">>}}}\n<<alias4>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''AliasPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for this plugin^^\n<<<\n!!!!!Revision History\n<<<\n''2005.10.09 [1.0.3]''\ncombined documentation and code into a single tiddler\n''2005.08.12 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.alias= {major: 1, minor: 0, revision: 3, date: new Date(2005,10,9)};\nconfig.macros.alias= { };\nconfig.macros.alias.handler = function(place,macroName,params) {\n var alias=params.shift(); if (!alias) return; alias=alias.replace(/ /g,"_"); // don't allow spaces in alias\n if (config.macros[alias]==undefined) // create new macro (as needed)\n { \n config.macros[alias] = { };\n config.macros[alias].handler =\n function (place,macroName,params)\n { wikify(config.macros[macroName].text,place,null,null); }\n }\n config.macros[alias].text = params[0]?params.join(' '):alias; // set alias text\n}\n//}}}\n
text/plain\n.txt .text .js .vbs .asp .cgi .pl\n----\ntext/html\n.htm .html .hta .htx .mht\n----\ntext/comma-separated-values\n.csv\n----\ntext/javascript\n.js\n----\ntext/css\n.css\n----\ntext/xml\n.xml .xsl .xslt\n----\nimage/gif\n.gif\n----\nimage/jpeg\n.jpg .jpe .jpeg\n----\nimage/png\n.png\n----\nimage/bmp\n.bmp\n----\nimage/tiff\n.tif .tiff\n----\naudio/basic\n.au .snd\n----\naudio/wav\n.wav\n----\naudio/x-pn-realaudio\n.ra .rm .ram\n----\naudio/x-midi\n.mid .midi\n----\naudio/mp3\n.mp3\n----\naudio/m3u\n.m3u\n----\nvideo/x-ms-asf\n.asf\n----\nvideo/avi\n.avi\n----\nvideo/mpeg\n.mpg .mpeg\n----\nvideo/quicktime\n.qt .mov .qtvr\n----\napplication/pdf\n.pdf\n----\napplication/rtf\n.rtf\n----\napplication/postscript\n.ai .eps .ps\n----\napplication/wordperfect\n.wpd\n----\napplication/mswrite\n.wri\n----\napplication/msexcel\n.xls .xls3 .xls4 .xls5 .xlw\n----\napplication/msword\n.doc\n----\napplication/mspowerpoint\n.ppt .pps\n----\napplication/x-director\n.swa\n----\napplication/x-shockwave-flash\n.swf\n----\napplication/x-zip-compressed\n.zip\n----\napplication/x-gzip\n.gz\n----\napplication/x-rar-compressed\n.rar\n----\napplication/octet-stream\n.com .exe .dll .ocx
/***\n''AttachFilePlugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#AttachFilePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nStore or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content. Binary file content can be stored in three different locations:\n<<<\n#embedded in the attachment tiddler (encoded as base64)\n#on your filesystem (a 'local link' path/filename)\n#on a web server (a 'remote link' URL)\n<<<\nThe plugin creates an "attachment tiddler" for each file you attach. Regardless of where you store the binary content, your document can refer to the attachment tiddler rather than using a direct file or URL reference in your embedded image or external links, so that changing document locations will not require updating numerous tiddlers or copying files from one system to another.\n\n@@display:block;font-size:8pt;line-height:110%;Note: although you can edit an attachment tiddler, ''don't change any of the encoded content below the attachment header'', as it has been prepared for use in the rest of your document, and even changing a single character can make the attachment unusable. //If needed, you ''can'' edit the header information or even the MIME type declaration in the attachment data, but be very careful not to change any of the base64-encoded binary data.//@@\n!!!!!Inline interface (live)\n><<attach demoID>>\n!!!!!Usage\n<<<\nWhen you attach a file, a tiddler (tagged with<<tag attachment>>) is generated (using the source filename as the tiddler's title). The tiddler contains //''base64 text-encoded binary data''//, surrounded by {{{/%...%/}}} comment markers (so they are not visible when viewing the tiddler). The tiddler also includes summary details about the file: when it was attached, by whom, etc. and, if the attachment is an image file (jpg, gif, or png), the image is automatically displayed below the summary information.\n\nWith embedded data, your TW document can be completely self-contained...unfortunately, embedding just a few moderately-sized binary files using base64 text-encoding can dramatically increase the size of your document. To avoid this problem, you can create attachment tiddlers that define external local filesystem (file://) and/or remote web server (http://) 'reference' links, without embedding the binary data directly in the tiddler (i.e., uncheck "embed data" in the 'control panel').\n\nThese links provide an alternative source for the binary data: if embedded data is not found (or you are running on Internet Explorer, which does not currently support using embedded data), then the plugin tries the local filesystem reference. If a local file is not found, then the remote reference (if any) is used. This "fallback" approach also lets you 'virtualize' the external links in your document, so that you can access very large binary content such as PDFs, MP3's, and even *video* files, by using just a 'remote reference link' without embedding any data or downloading huge files to your hard disk.\n\nOf course, when you //do// download an attached file, the local copy will be used instead of accessing a remote server each time, thereby saving bandwidth and allowing you to 'go mobile' without having to edit any tiddlers to alter the link locations...\n\nLastly, though not completed (but nearly there), the plugin includes an integrated 'uploader' that will let you create a 'remote link' attachment tiddler AND transfer the local file to a remote server location in the same step!\n<<<\n!!!!!Syntax / Examples\n<<<\nTo embed attached files as images or link to them from other tiddlers, use the standard ~TiddlyWiki image syntax ({{{[img[tooltip|filename]]}}}), linked image syntax ({{{[img[tooltip|filename][tiddlername]]}}}) , or "external link" syntax ({{{[[text|URL]]}}}), replacing the filename or URL that is normally entered with the title of an attachment tiddler.\n\nembedded image data:\n>{{{[img[Meow|AttachFileSample]]}}}\n>[img[Meow|AttachFileSample]]\nembedded image data with link to larger remote image:\n>{{{[img[click for larger view|AttachFileSample][AttachFileSample2]]}}}\n>[img[click for larger view|AttachFileSample][AttachFileSample2]]\n'external' link to embedded image data:\n>{{{[[click to view attachment|AttachFileSample]]}}}\n>[[click to view attachment|AttachFileSample]]\n'external' link to remote image:\n>{{{[[click to view attachment|AttachFileSample2]]}}}\n>[[click to view attachment|AttachFileSample2]]\nregular ~TiddlyWiki links to attachment tiddlers:\n>{{{[[AttachFileSample]]}}} [[AttachFileSample]]\n>{{{[[AttachFileSample2]]}}} [[AttachFileSample2]]\n<<<\n!!!!!Defining MIME types and Server Scripts\n<<<\nWhen you select a source file, a ''[[MIME|http://en.wikipedia.org/wiki/MIME]]'' file type is automatically suggested, based on filename extension. The AttachFileMIMETypes tiddler defines the list of MIME types that will be recognized by the plugin. Each MIME type definition consists of exactly two lines of text: the official MIME type designator (e.g., "text/plain", "image/gif", etc.), and a space-separated list of file extensions associated with that type. List entries are separated by "----" (horizontal rules).\n\nTo upload files, a script must first be installed on a remote server so it can receive and store the files online. The AttachFileServerScripts tiddler defines the list of ''server scripts'' that will be available for you to select from when attaching and uploading a file. The list format is as described above for MIME types, except that the first line is simply the text that will appear in the ''server scripts'' droplist, while the second line is the fully-qualified URL for submitting files to that server (e.g., {{{http://www.xyz.com/path/to/cgi-bin/upload.cgi}}} or something similar).\n<<<\n!!!!!Known Limitations\n<<<\n* ''Internet Explorer does not support the use of //embedded// data for TW file attachments. However, you can still use the local/remote link definitions to create file attachments that are stored externally''\n## //while it is easy to read text files, reading binary files is not supported by IE's FileSystemObject (FSO) methods, and other file I/O techniques are subject to security barriers or require additional MS proprietary technologies (like ASP or VB) that make implementation more difficult.//\n## //IE does not support the data: URI scheme, and cannot render the embedded images or links. This would seem to be an insurmountable shortcoming in the browser. Let's hope it is added in the next version...//\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n* AttachFilePlugin (tagged with <<tag systemConfig>>)\n* AttachFilePluginFormatters ("distribution library") (tagged with <<tag systemConfig>>)\n* AttachFileSample and AttachFileSample2 //(sample attachment tiddler containing an image file)//\n* AttachFileMIMETypes //(defines known binary file types)//\n* AttachFileServerScripts //(remote upload server locations)//\n<<<\n!!!!!Revision History\n<<<\n''2006.07.24 [3.4.3]'' in prettyLink formatter, added check for isShadowTiddler() to fix problem where shadow links became external links.\n''2006.07.13 [3.4.2]'' in getAttachment(), fixed stripping of newlines so data: used in CSS will work\n''2006.05.21 [3.4.1]'' in getAttachment(), fixed substring() to extract data: URI (was losing last character, which broken rendering of SOME images)\n''2006.05.20 [3.4.0]'' hijack core getRecursiveTiddlerText() to support rendering attachments in stylesheets (e.g. {{{url([[AttachFileSample]])}}})\n''2006.05.20 [3.3.6]'' add "description" feature to easily include notes in attachment tiddler (you can always edit to add them later... but...)\n''2006.05.19 [3.3.5]'' add "attach as" feature to change default name for attachment tiddlers. Also, new optional param to specify tiddler name (disables editing)\n''2006.05.16 [3.3.0]'' completed XMLHttpRequest handling for GET or POST to configurable server scripts\n''2006.05.13 [3.2.0]'' added interface for ''upload'' feature. Major rewrite of code for clean object definitions. Major improvements in UI interaction and validation.\n''2006.05.09 [3.1.1]'' add wikifer support for using attachments in links from "linked image" syntax: {{{[img[tip|attachment1][attachment2]]}}}\n''2006.05.09 [3.1.0]'' lots of code changes: new options for attachments that use embedded data and/or links to external files (local or remote)\n''2006.05.03 [3.0.2]'' added {{{/%...%/}}} comments around attachment data to hide it when viewing attachment tiddler.\n''2006.02.05 [3.0.1]'' wrapped wikifier hijacks in initAttachmentFormatters() function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2005.12.27 [3.0.0]'' Update for TW2.0. Automatically add 'excludeMissing' tag to attachments\n''2005.12.16 [2.2.0]'' Dynamically create/remove attachPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.\n''2005.11.20 [2.1.0]'' added wikifier handler extensions for "image" and "prettyLink" to render tiddler attachments\n''2005.11.09 [2.0.0]'' begin port from old ELS Design plugin/adaptation hybrid based on ~TW1.2.33\n''2005.08.05 [1.1.0]'' moved CSS and HTML definitions into plugin code tiddler instead of using separate tiddlers\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // version\n//{{{\nversion.extensions.attach = {major: 3, minor: 4, revision: 3, date: new Date(2006,7,24)};\n//}}}\nconfig.macros.attach = {\n// // configuration\n//{{{\n hideUpload: false,\n//}}}\n// // lingo\n//{{{\n label: "attach file",\n tooltip: "Attach a file to this document",\n linkTooltip: "Attachment: ",\n\n scriptList: "AttachFileServerScripts",\n typeList: "AttachFileMIMETypes",\n\n titlePrompt: " enter tiddler title...",\n MIMEPrompt: "<option value=''>select MIME type...</option><option value='editlist'>[edit list...]</option>",\n localPrompt: " enter local path/filename...",\n URLPrompt: " enter remote URL...",\n scriptPrompt: "<option value=''>select server script...</option><option value='editlist'>[edit list...]</option>",\n targetPrompt: " enter remote path/filename...",\n\n tiddlerErr: "Please enter a tiddler title",\n sourceErr: "Please enter a source path/filename",\n storageErr: "Please select a storage method: embedded, local or remote",\n MIMEErr: "Unrecognized file format. Please select a MIME type",\n localErr: "Please enter a local path/filename",\n URLErr: "Please enter a remote URL",\n scriptErr: "Please select a server script",\n targetErr: "Please enter a remote target path/filename",\n notSupportedErr: "Sorry, this browser does not support embedded data.\snPlease uncheck 'embed data' and use a local and/or remote link instead.",\n\n sourceReport: "| source file|{{{%0}}}|\sn",\n nosourceReport: "| source file|//none//|\sn",\n dateReport: "| attached on|%0 by %1|\sn",\n notesReport: "| description|%0|\sn",\n dataReport: "| embedded data|[[%0|%0]] - {{{type=%1, size=%2 bytes, encoded=%3 bytes}}}|\sn",\n nodataReport: "| embedded data|//none//|\sn",\n localReport: "| local link|/%LOCAL_LINK%/[[%0|%1]]|\sn",\n nolocalReport: "| local link|//none//|\sn",\n URLReport: "| remote link|/%REMOTE_LINK%/[[%0|%0]]|\sn",\n noURLReport: "| remote link|//none//|\sn",\n\n uploadReport: "upload\sn<<<\sn__server script__\sn''%0''\sn{{{%1}}}\sn__remote path/filename__\sn{{{%2}}}\sn__transfer log__\sn%3/%RESULT%/\sn<<<\sn",\n\n imageReport: "image\sn<<<\snusage: {{{[img[tooltip|%0]] or [img[tooltip|%0][link]]}}}\sn[img[tooltip|%0]]\sn<<<\sn",\n dataBlock: "\sn/% DO NOT EDIT BELOW THIS POINT\sn---BEGIN_DATA---\sn%0;base64,\sn%1\sn---END_DATA---\sn%/",\n//}}}\n// // macro definition\n//{{{\n handler:\n function(place,macroName,params) {\n if (params && !params[0]) { createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }\n var id=params.shift();\n this.createAttachPanel(place,id+"_attachPanel",params);\n document.getElementById(id+"_attachPanel").style.position="static";\n document.getElementById(id+"_attachPanel").style.display="block";\n },\n//}}}\n//{{{\n createAttachPanel:\n function(place,panel_id,params) {\n if (!panel_id || !panel_id.length) var panel_id="_attachPanel";\n // remove existing panel (if any)\n var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);\n // set styles for this panel\n setStylesheet(this.css,"attachPanel");\n // create new panel\n var title=""; if (params && params[0]) title=params.shift();\n var types=this.MIMEPrompt+this.formatListOptions(store.getTiddlerText(this.typeList)); // get MIME types\n var scripts=this.scriptPrompt+this.formatListOptions(store.getTiddlerText(this.scriptList)); // get server scripts\n panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);\n var html=this.html.replace(/%id%/g,panel_id);\n html=html.replace(/%title%/g,title);\n html=html.replace(/%disabled%/g,title.length?"disabled":"");\n html=html.replace(/%types%/g,types);\n html=html.replace(/%scripts%/g,scripts);\n panel.innerHTML=html;\n return panel;\n },\n//}}}\n//{{{\n toggleAttachPanel:\n function (e) {\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("_attachPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n },\n//}}}\n//{{{\n formatListOptions:\n function(text,getparams) {\n if (!text || !text.trim().length) return "";\n // get server script list content from tiddler\n var parts=text.split("\sn----\sn");\n var out="";\n this.scriptParams=["","",""]; // first 3 list items: blank, prompt, editlist\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var URL=lines.shift(); // 2nd line=item value\n var params=lines.join("\sn").replace(/<<<\sn/g,"").replace(/\sn<<</g,""); // extra lines=script params inside blockquotes\n this.scriptParams.push(params?params:"");\n out +='<option value="%1">%0</option>'.format([label,URL]);\n }\n return out;\n },\n//}}}\n// // interface definition\n//{{{\n css:\n ".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em; }\s\n .attachPanel form { display:inline;border:0;padding:0;margin:0; }\s\n .attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\s\n .attachPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n .attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\s\n .attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\s\n .attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\s\n .attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; -moz-border-radius:5px; }\s\n .attachPanel .chk { width:auto;border:0; }\s\n .attachPanel .btn { width:auto; }\s\n .attachPanel .btn2 { width:49%; }\s\n ",\n//}}}\n//{{{\n html:\n '<form>\s\n attach from source file <input type="file" name="source" size=56 onChange="config.macros.attach.onChangeSource(this)">\s\n <div class="box">\s\n <table><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n embed data <input type=checkbox class=chk name="useData"\s\n onclick="if (!this.form.MIMEType.value.length)\s\n this.form.MIMEType.selectedIndex=this.checked?1:0; ">&nbsp;\s\n </td><td>\s\n <select size=1 name="MIMEType" \s\n onchange="this.title=this.value; if (this.value==\s'editlist\s')\s\n { this.selectedIndex=this.form.useData.checked?1:0; story.displayTiddler(null,config.macros.attach.typeList,2); return; }">\s\n <option value=""></option>\s\n %types%\s\n </select>\s\n </td></tr><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n local link <input type=checkbox class=chk name="useLocal"\s\n onclick="this.form.local.value=this.form.local.defaultValue=this.checked?config.macros.attach.localPrompt:\s'\s';">&nbsp;\s\n </td><td>\s\n <input type=text name="local" size=15 autocomplete=off value=""\s\n onchange="this.form.useLocal.checked=this.value.length" \s\n onkeyup="this.form.useLocal.checked=this.value.length" \s\n onfocus="if (!this.valuelength) this.value=config.macros.attach.localPrompt; this.select()">\s\n </td></tr><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n remote link <input type=checkbox class=chk name="useURL"\s\n onclick="this.form.URL.value=this.form.URL.defaultValue=this.checked?config.macros.attach.URLPrompt:\s'\s';\s\n config.macros.attach.toggleUploadControls(\s'%id%\s',this.checked);">&nbsp;\s\n </td><td>\s\n <input type=text name="URL" size=15 autocomplete=off value=""\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\s\n onchange="this.form.useURL.checked=this.value.length;\s\n config.macros.attach.toggleUploadControls(\s'%id%\s',this.value.length);"\s\n onkeyup="this.form.useURL.checked=this.value.length;\s\n config.macros.attach.toggleUploadControls(\s'%id%\s',this.value.length);">\s\n </td></tr><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n <div id="%id%_upcheck" style="display:none">\s\n upload file <input type=checkbox class=chk name="upload"\s\n onclick="this.form.uploadScript.selectedIndex=this.checked?1:0;\s\n this.form.uploadScript.title=\s'\s';\s\n this.form.uploadTarget.disabled=!this.checked;\s\n this.form.uploadTarget.value=this.form.uploadTarget.defaultValue=this.checked?config.macros.attach.targetPrompt:\s'\s';\s">&nbsp;\s\n </div>\s\n </td><td>\s\n <div id="%id%_uplist" style="display:none">\s\n <select size=1 name="uploadScript"\s\n onchange="this.title=this.value; if (this.value==\s'editlist\s')\s\n { this.selectedIndex=this.form.upload.checked?1:0; story.displayTiddler(null,config.macros.attach.scriptList,2); return; }\s\n this.form.upload.checked=this.value.length;\s\n if (!this.form.uploadTarget.value.length && this.value.length)\s\n this.form.uploadTarget.value=this.form.uploadTarget.defaultValue=config.macros.attach.targetPrompt;\s\n this.form.uploadTarget.disabled=!this.value.length;">\s\n <option value=""></option>\s\n %scripts%\s\n </select>\s\n </div>\s\n </td></tr><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n <div id="%id%_saveas" style="display:none">save as&nbsp;</div>\s\n </td><td>\s\n <input type=text name="uploadTarget" id="%id%_uptarget" size=15 autocomplete=off value="" disabled\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.targetPrompt; this.select()" style="display:none">\s\n </td></tr></table>\s\n </div>\s\n <table><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n attach as&nbsp;\s\n </td><td colspan=2>\s\n <input type=text name="tiddlertitle" size=15 autocomplete=off value="%title%"\s\n onkeyup="if (!this.value.length) { this.value=config.macros.attach.titlePrompt; this.select(); }"\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt; this.select()" %disabled%>\s\n </td></tr><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n description&nbsp;\s\n </td><td colspan=2>\s\n <input type=text name="notes" size=15 autocomplete=off>\s\n </td></tr><tr><td style="text-align:right;width:1%;white-space:nowrap">\s\n add tags&nbsp;\s\n </td><td>\s\n <input type=text name="tags" size=15 autocomplete=off value="" onfocus="this.select()">\s\n </td><td style="width:40%;text-align:right">\s\n <input type=button class=btn2 value="attach"\s\n onclick="config.macros.attach.onClickAttach(this)"><!--\s\n --><input type=button class=btn2 value="close"\s\n onclick="var panel=document.getElementById(\s'%id%\s'); if (panel) panel.parentNode.removeChild(panel);">\s\n </td></tr></table>\s\n </form>',\n//}}}\n// // control processing\n//{{{\n onChangeSource:\n function(here) {\n var form=here.form;\n var list=form.MIMEType;\n var theFilename = form.source.value;\n var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();\n for (var i=0; i<list.options.length; i++)\n if (list.options[i].value.indexOf(theExtension)!=-1) {\n list.selectedIndex = i;\n form.useData.checked = true;\n form.useLocal.checked = true;\n form.local.value = theFilename;\n break;\n }\n theFilename=theFilename.replace(/\s\s/g,"/"); // fixup: change \s to /\n if (!form.tiddlertitle.disabled)\n form.tiddlertitle.value=theFilename.substr(theFilename.lastIndexOf('/')+1); // get tiddlername from filename\n },\n//}}}\n//{{{\n toggleUploadControls:\n function(id,show) {\n if (config.macros.attach.hideUpload) return;\n document.getElementById(id+'_upcheck').style.display\n =document.getElementById(id+'_uplist').style.display\n =document.getElementById(id+'_saveas').style.display\n =document.getElementById(id+'_uptarget').style.display\n =show?'block':'none';\n },\n//}}}\n//{{{\n onClickAttach:\n function (here) {\n clearMessage();\n // get input values\n var form=here.form;\n var theDate=(new Date()).formatString(config.macros.timeline.dateFormat);\n var theSource = form.source.value!=form.source.defaultValue?form.source.value:"";\n var theTitle=form.tiddlertitle.value;\n var theLocal = form.local.value!=form.local.defaultValue?form.local.value:"";\n var theURL = form.URL.value!=form.URL.defaultValue?form.URL.value:"";\n var theNotes = form.notes.value;\n var theTags = "attachment excludeMissing "+form.tags.value;\n var useData=form.useData.checked;\n var useLocal=form.useLocal.checked;\n var useURL=form.useURL.checked;\n var upload=form.upload.checked;\n var theMIMEType = form.MIMEType.value.length?form.MIMEType.options[form.MIMEType.selectedIndex].text:"";\n // validate checkboxes and get filename\n if (useData||upload) {\n if (theSource.length) { if (!theLocation) var theLocation=theSource; }\n else { alert(this.sourceErr); form.source.focus(); return false; }\n }\n if (useLocal) {\n if (theLocal.length) { if (!theLocation) var theLocation = theLocal; }\n else { alert(this.localErr); form.local.focus(); return false; }\n }\n if (useURL) {\n if (theURL.length) { if (!theLocation) var theLocation = theURL; }\n else { alert(this.URLErr); form.URL.focus(); return false; }\n }\n if (!(useData||useLocal||useURL))\n { form.useData.focus(); alert(this.storageErr); return false; }\n if (!theLocation)\n { form.source.focus(); alert(this.sourceErr); return false; }\n if (!theTitle || !theTitle.trim().length || theTitle==this.titlePrompt)\n { form.tiddlertitle.focus(); alert(this.tiddlerErr); return false; }\n if (upload) {\n var theScript = form.uploadScript.value!=form.uploadScript.defaultValue?form.uploadScript.value:"";\n if (!theScript.length) { alert(this.scriptErr); form.uploadScript.focus(); return false; }\n var theServer = form.uploadScript.options[form.uploadScript.selectedIndex].text;\n var theParams = this.scriptParams[form.uploadScript.selectedIndex];\n var theTarget = form.uploadTarget.value!=form.uploadTarget.defaultValue?form.uploadTarget.value:"";\n if (!theTarget.length) { alert(this.targetErr); form.uploadTarget.focus(); return false; }\n }\n // if not already selected, determine MIME type based on filename extension (if any)\n if (!theMIMEType.length && theLocation.lastIndexOf('.')!=-1) {\n var theExt = theLocation.substr(theLocation.lastIndexOf('.')).toLowerCase();\n var theList=form.MIMEType;\n for (var i=0; i<theList.options.length; i++)\n if (theList.options[i].value.indexOf(theExt)!=-1)\n { var theMIMEType=theList.options[i].text; theList.selectedIndex=i; break; }\n }\n // encode the data\n if (useData) {\n if (!theMIMEType.length) {\n alert(this.MIMEErr);\n form.MIMEType.selectedIndex=1; form.MIMEType.focus();\n return false;\n }\n var theData = this.readFile(theSource); if (!theData) { alert(this.notSupportedErr); return false; }\n displayMessage('encoding '+theSource);\n var theEncoded = this.encodeBase64(theData);\n displayMessage('file size='+theData.length+' bytes, encoded size='+theEncoded.length+' bytes');\n }\n // upload the file\n if (upload) var uploadresult=this.uploadFile(theTitle,theSource,theMIMEType,theServer,theScript,theParams,theTarget);\n // generate tiddler and refresh\n var theText = "";\n theText +=theSource.length?this.sourceReport.format([theSource]):this.nosourceReport;\n theText +=this.dateReport.format([theDate,config.options.txtUserName]);\n theText +=theNotes.length?this.notesReport.format([theNotes]):"";\n theText +=useData?this.dataReport.format([theTitle,theMIMEType,theData.length,theEncoded.length]):this.nodataReport;\n theText +=useLocal?this.localReport.format([theLocal,'file:///'+theLocal.replace(/\s\s/g,"/")]):this.nolocalReport;\n theText +=useURL?this.URLReport.format([theURL]):this.noURLReport;\n theText +=(theMIMEType.substr(0,5)=="image")?this.imageReport.format([theTitle]):"";\n theText +=upload?uploadresult:"";\n theText +=useData?this.dataBlock.format([theMIMEType,theEncoded]):"";\n store.saveTiddler(theTitle,theTitle,theText,config.options.txtUserName,new Date(),theTags);\n document.getElementById("attachPanel").style.display="none";\n story.displayTiddler(null,theTitle);\n story.refreshTiddler(theTitle,null,true);\n displayMessage('attached "'+theTitle+'"');\n return true;\n },\n//}}}\n// // base64 conversion\n//{{{\n encodeBase64:\n function (theData) {\n if (!theData) return null;\n // encode as base64\n var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";\n var out = ""; //This is the output\n var chr1, chr2, chr3 = ""; //These are the 3 bytes to be encoded\n var enc1, enc2, enc3, enc4 = ""; //These are the 4 encoded bytes\n for (var count=0,i=0; i<theData.length; )\n {\n chr1 = theData.charCodeAt(i++); //Grab the first byte\n chr2 = theData.charCodeAt(i++); //Grab the second byte\n chr3 = theData.charCodeAt(i++); //Grab the third byte\n enc1 = chr1 >> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n if (isNaN(chr2))\n enc3 = enc4 = 64;\n else if (isNaN(chr3))\n enc4 = 64;\n out += keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);\n chr1 = chr2 = chr3 = "";\n enc1 = enc2 = enc3 = enc4 = "";\n count+=4; if (count>60) { out+='\sn'; count=0; } // add line break every 60 chars for readability\n }\n return out;\n },\n//}}}\n// // I/O functions\n//{{{\n readFile:\n function(filePath) {\n if(!window.Components) { return(null); }\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);\n file.initWithPath(filePath);\n if (!file.exists()) { alert("File not found: "+filePath); return(null); }\n var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);\n inputStream.init(file, 0x01, 00004, null);\n var bInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);\n bInputStream.setInputStream(inputStream);\n return(bInputStream.readBytes(inputStream.available()));\n }\n catch(e) { alert("An error occured while attempting to attach\sn"+filePath+"\sn\sn" + e); }\n return(null);\n },\n//}}}\n//{{{\n writeFile:\n function(filepath,data) {\n // TBD: decode base64 and write data to specified local path/filename\n return(false);\n },\n//}}}\n//{{{\n uploadFile:\n function(title,source,MIMEType,server,URL,scriptparams,target) {\n displayMessage("begin upload: \s""+title+"\s"");\n if (URL==undefined || !URL.length)\n return this.uploadReport.format([server,URL,target,"error: missing script URL"]);\n var x; // XML object\n try {x = new XMLHttpRequest()}\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")}\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")}\n catch (e) { return this.uploadReport.format([server,URL,target,"error: could not create XMLHttpRequest object"]); }\n }\n }\n var starttime=new Date();\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n var endtime=new Date();\n var elapsed=(endtime-starttime+1)/1000;\n displayMessage("end upload: \s""+title+"\s" ("+elapsed+" seconds)");\n var response="\sn''"+endtime.formatString("DD MMM YYYY 0hh:0mm:0ss")+"'' - upload ended (elapsed="+elapsed+" seconds).\sn";\n; response+="status code="+x.status+"\snserver response:\sn{{{\sn"+x.responseText+"\sn}}}\sn";\n var tiddler=store.getTiddler(title);\n if (tiddler) {\n var marker="/%RESULT%/"; var pos=tiddler.text.indexOf(marker);\n if (pos!=-1) {\n tiddler.set(null,tiddler.text.substr(0,pos)+response+tiddler.text.substr(pos+marker.length));\n story.displayTiddler(null,title); story.refreshTiddler(title,null,true); store.setDirty(true);\n } \n }\n }\n }\n if ((document.location.protocol=="file:") && (typeof(netscape)!="undefined")) { // UniversalBrowserRead only works from a local file context\n try { netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead')}\n catch (e) { displayMessage(e.description?e.description:e.toString()); }\n }\n try {\n var data=this.readFile(source);\n if (!data) return this.uploadReport.format([server,URL,target,"could not read local source file"]);\n scriptparams=scriptparams.replace(/%TARGET%/g,target).replace(/%TYPE%/g,MIMEType).replace(/%SIZE%/g,data.length);\n if (scriptparams.indexOf("\sn")==-1) { // single-line params=GET\n x.open("GET",URL,true);\n scriptparams=scriptparams.replace(/%DATA%/g,encodeURIComponent(data));\n x.setRequestHeader('Content-type','application/x-www-form-urlencoded');\n }\n else { // multi-line params=POST\n x.open("POST",URL,true);\n var boundary="----------AttachFilePluginDataBoundary----------";\n scriptparams="\sn"+scriptparams.replace(/%BOUNDARY%/g,boundary).replace(/%DATA%/g,data)+"\sn";\n x.setRequestHeader('Content-Length',scriptparams.length);\n x.setRequestHeader('Content-Type','multipart/form-data; boundary='+boundary);\n }\n x.send(scriptparams);\n // DEBUG alert("params\sn-----\sn"+scriptparams+"\sn-----\sn"); // wffl DEBUG\n }\n catch (e) { displayMessage(e.description?e.description:e.toString()); }\n var response="''"+starttime.formatString("DD MMM YYYY 0hh:0mm:0ss")+"'' - upload started...";\n return this.uploadReport.format([server,URL,target,response]);\n }\n};\n//}}}\n\n/***\n!!!!!Formatters\n|NOTE: These functions are also defined separately in a small, "run-time library" plugin: AttachFilePluginFormatters, which provides "stand-alone" processing for //rendering// attachment tiddlers, but does not include the AttachTiddlers control panel and supporting functions. To reduce your document size, you can include AttachFilePluginFormatters ''instead of'' AttachFilePlugin when distributing documents that contain attachments, as long you don't intend to create any new attachment tiddlers to your document.|\n\n''Extends wikify() formatters to process attachment tiddler references''\n* embedded images: {{{[img[tooltip|image]]}}}\n* linked embedded images: {{{[img[tooltip|image][link]]}}}\n* external/"pretty" links: {{{[[label|link]]}}}\n\n***/\n//{{{\nif (config.macros.attach==undefined) config.macros.attach= { };\n//}}}\n//{{{\nif (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {\n var tiddler = store.getTiddler(title);\n if (tiddler==undefined || tiddler.tags==undefined) return false;\n return (tiddler.tags.find("attachment")!=null);\n}\n//}}}\n//{{{\nif (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {\n var text = store.getTiddlerText(title);\n var result=""; var pos=0; var endpos=0;\n\n var startmarker="---BEGIN_DATA---\sn";\n var endmarker="\sn---END_DATA---";\n if (!config.browser.isIE && (pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1) {\n var out="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\sn/g,''); // strip embedded newlines\n return out;\n }\n if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1) // fallback to local link\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos)); \n if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1) // fallback to remote URL\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n\n // fallback for backward-compatibility:\n // before 3.2.0 encoded datablock was located between ----'s instead of using embedded 'keyword markers' in the tiddler content\n var data=text.split('\sn----\sn');\n if (!config.browser.isIE && data[1] && data[1].length) // NOTE: IE does not support the "data:" URI scheme\n return "data:"+data[1].replace(/\s\sn/g,'');\n\n return "";\n}\n//}}}\n//{{{\nif (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {\n if (this.initialized) return;\n // find the formatter for "image" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source);\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link\n {\n var e = w.output;\n if(lookaheadMatch[5])\n {\n if(store.tiddlerExists(lookaheadMatch[5]))\n // ELS: ADDED\n if (config.macros.attach.isAttachment(lookaheadMatch[5]))\n {\n e = createExternalLink(w.output,lookaheadMatch[5]);\n e.href=config.macros.attach.getAttachment(lookaheadMatch[5]);\n e.title = config.macros.attach.linkTooltip + lookaheadMatch[5];\n }\n else\n // ELS: END\n e = createTiddlyLink(w.output,lookaheadMatch[5],false);\n else\n e = createExternalLink(w.output,lookaheadMatch[5]);\n }\n var img = createTiddlyElement(e,"img");\n if(lookaheadMatch[1])\n img.align = "left";\n else if(lookaheadMatch[2])\n img.align = "right";\n if(lookaheadMatch[3])\n img.title = lookaheadMatch[3];\n img.src = lookaheadMatch[4];\n // ELS: ADDED\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);\n // ELS: END\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n//}}}\n//{{{\n // find the formatter for "prettyLink" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[2])\n { // Simple bracketted link\n var link = createTiddlyLink(w.output,lookaheadMatch[1],false);\n w.outputText(link,w.nextMatch,w.nextMatch + lookaheadMatch[1].length);\n w.nextMatch += lookaheadMatch[1].length + 2;\n }\n else if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[3])\n { // Pretty bracketted link\n var e;\n if(store.tiddlerExists(lookaheadMatch[4]) || store.isShadowTiddler(lookaheadMatch[4]))\n // ELS: ADDED\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n {\n e = createExternalLink(w.output,lookaheadMatch[4]);\n e.href=config.macros.attach.getAttachment(lookaheadMatch[4]);\n e.title = config.macros.attach.linkTooltip + lookaheadMatch[4];\n }\n else\n // ELS: END\n e = createTiddlyLink(w.output,lookaheadMatch[4],false);\n else\n e = createExternalLink(w.output,lookaheadMatch[4]);\n w.outputText(e,w.nextMatch,w.nextMatch + lookaheadMatch[1].length);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n this.initialized=true;\n}\n//}}}\n//{{{\nconfig.macros.attach.init_formatters(); // load time init\n//}}}\n//{{{\nif (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {\n TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;\n TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {\n return config.macros.attach.isAttachment(title)?\n config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText(title,defaultText,depth);\n }\n}\n//}}}
/***\n''AttachFilePluginFormatters for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#AttachFilePluginFormatters\nsee also: http://www.TiddlyTools.com/#AttachFilePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nYou can include this small //''run time library''// in your documents to render ''attachment tiddlers'' created by the AttachFilePlugin. Attachment tiddlers are tagged with<<tag attachment>>and contain binary file content (e.g., jpg, gif, pdf, mp3, etc.) that can be stored directly as base64 text-encoded data or loaded from external files stored on a local filesystem or remote web server.\n\nThis plugin extends the behavior of the following TiddlyWiki core "wikify()" formatters:\n* embedded images: {{{[img[tooltip|image]]}}}\n* linked embedded images: {{{[img[tooltip|image][link]]}}}\n* external/"pretty" links: {{{[[label|link]]}}}\n\n''Please refer to AttachFilePlugin (source: http://www.TiddlyTools.com/#AttachFilePlugin) for additional information.''\n!!!!!Revision History\n<<<\n''2006.07.24 [3.4.3.0]'' sync with AttachFilePlugin v3.4.3\n''2006.07.13 [3.4.2.0]'' sync with AttachFilePlugin v3.4.2\n''2006.06.15 [3.4.1.0]'' sync with AttachFilePlugin v3.4.1\n''2006.05.20 [3.4.0.0]'' sync with AttachFilePlugin v3.4.0\n''2006.05.13 [3.2.0.0]'' created from AttachFilePlugin v3.2.0\n<<<\n!!!!!Code\n***/\n//{{{\nif (config.macros.attach==undefined) config.macros.attach= { };\n//}}}\n//{{{\nif (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {\n var tiddler = store.getTiddler(title);\n if (tiddler==undefined || tiddler.tags==undefined) return false;\n return (tiddler.tags.find("attachment")!=null);\n}\n//}}}\n//{{{\nif (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {\n var text = store.getTiddlerText(title);\n var result=""; var pos=0; var endpos=0;\n\n var startmarker="---BEGIN_DATA---\sn";\n var endmarker="\sn---END_DATA---";\n if (!config.browser.isIE && (pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1) {\n var out="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\sn/g,''); // strip embedded newlines\n return out;\n }\n if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1) // fallback to local link\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos)); \n if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1) // fallback to remote URL\n return text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n\n // fallback for backward-compatibility:\n // before 3.2.0 encoded datablock was located between ----'s instead of using embedded 'keyword markers' in the tiddler content\n var data=text.split('\sn----\sn');\n if (!config.browser.isIE && data[1] && data[1].length) // NOTE: IE does not support the "data:" URI scheme\n return "data:"+data[1].replace(/\s\sn/g,'');\n\n return "";\n}\n//}}}\n//{{{\nif (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {\n if (this.initialized) return;\n // find the formatter for "image" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source);\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link\n {\n var e = w.output;\n if(lookaheadMatch[5])\n {\n if(store.tiddlerExists(lookaheadMatch[5]))\n // ELS: ADDED\n if (config.macros.attach.isAttachment(lookaheadMatch[5]))\n {\n e = createExternalLink(w.output,lookaheadMatch[5]);\n e.href=config.macros.attach.getAttachment(lookaheadMatch[5]);\n e.title = config.macros.attach.linkTooltip + lookaheadMatch[5];\n }\n else\n // ELS: END\n e = createTiddlyLink(w.output,lookaheadMatch[5],false);\n else\n e = createExternalLink(w.output,lookaheadMatch[5]);\n }\n var img = createTiddlyElement(e,"img");\n if(lookaheadMatch[1])\n img.align = "left";\n else if(lookaheadMatch[2])\n img.align = "right";\n if(lookaheadMatch[3])\n img.title = lookaheadMatch[3];\n img.src = lookaheadMatch[4];\n // ELS: ADDED\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);\n // ELS: END\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n//}}}\n//{{{\n // find the formatter for "prettyLink" and replace the handler\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[2])\n { // Simple bracketted link\n var link = createTiddlyLink(w.output,lookaheadMatch[1],false);\n w.outputText(link,w.nextMatch,w.nextMatch + lookaheadMatch[1].length);\n w.nextMatch += lookaheadMatch[1].length + 2;\n }\n else if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[3])\n { // Pretty bracketted link\n var e;\n if(store.tiddlerExists(lookaheadMatch[4]) || store.isShadowTiddler(lookaheadMatch[4]))\n // ELS: ADDED\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n {\n e = createExternalLink(w.output,lookaheadMatch[4]);\n e.href=config.macros.attach.getAttachment(lookaheadMatch[4]);\n e.title = config.macros.attach.linkTooltip + lookaheadMatch[4];\n }\n else\n // ELS: END\n e = createTiddlyLink(w.output,lookaheadMatch[4],false);\n else\n e = createExternalLink(w.output,lookaheadMatch[4]);\n w.outputText(e,w.nextMatch,w.nextMatch + lookaheadMatch[1].length);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n this.initialized=true;\n}\n//}}}\n//{{{\nconfig.macros.attach.init_formatters(); // load time init\n//}}}\n//{{{\nif (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {\n TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;\n TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {\n return config.macros.attach.isAttachment(title)?\n config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText(title,defaultText,depth);\n }\n}\n//}}}
| source file|{{{...\simages\smeow.gif}}}|\n| attached on|15 May 2006 by ELSDesignStudios|\n| embedded data|[[meow.gif|AttachFileSample]] - {{{type=image/gif, size=3399 bytes, encoded=4602 bytes}}}|\n| local link|/%LOCAL_LINK%/[[images/meow.gif|images/meow.gif]]|\n| remote link|/%REMOTE_LINK%/[[http://www.TiddlyTools.com/images/meow.gif|http://www.TiddlyTools.com/images/meow.gif]]|\nimage\n<<<\nusage: {{{[img[tooltip|AttachFileSample]] or [img[tooltip|AttachFileSample][link]]}}})\n[img[tooltip|AttachFileSample]]\n<<<\n\n/% DO NOT EDIT BELOW THIS POINT\n---BEGIN_DATA---\nimage/gif;base64,\nR0lGODlhOABQAPcAAAAACAAAEAAICAgICAgLDBAQCAQQGRAIEBgICBAQEBAQGBAY\nFBoOEhwUFCEYEBgYGA4cIBkgGyEcHCEhISkYGCkcHCEpHCklIRAgMRkmNSElKSEp\nNikeKykpKSExQiE5QjEhJTEpITEpKSkpMSkxISk1KTExITExKSktNTEpMTEpOTEx\nMSk5MSkxOSkxQik5PTkrKTkxMTE8KTFCMTExOTExQjE5PTFCPTk3MzlCMTkxQjk5\nQkI0MzlGPUg9M01JNi88TTlEUkI8REJCSkZDRFBDQkY/UFA/TjNMUkNOS1JKSkpW\nRj1KWEpKWj9OXEVZZlhMRlVLVVpSUlReUFdSYFVhX1JSa1VfbmBbU11ia2dcV3Fj\nXVpldWVkb2tnb3tnbGZ1ZHV6aWVwe3d5c2N4iXN3gntzgHeBiYd2dYWHeoh/jIKL\nkJWEfZmUh5CNlJ+VkICPn46XpZiSo5WfoJycnKaemaGcqKWlpZWnraWtqa2qoq2l\nrZavvKW4xK2lta2ws/8A/7WcjLWllLWlpbWlrb2tnMatnLWtpbWtrb2trbWttb2t\ntbWtvbW1pca1pbW1ra21va21xrW1tbW1vbW1xrW9tb21rb21tb21vb21xr29rb29\ntca9sca1vc69rda9ra29wa3GxrW9vbW9xq29zrHGyrPB0rXG1r29vb29xr29zr3G\nvb3Gxr3Gzr3G1sa9vcbGtc7GtdbGtcbGvc7GvdbGvd7Gvca9xsa9zsbGxsbGzsbG\n1s7DyNbGxtbGzs7G1rjQ2MbO0sbO3sbW1s7Owc7OzsbW3sbe3s7O1s7W0tbQx+HU\nzNDQ29bW1tvb1ufa1sPW6dDW4dbW3trY4sni7dbk797e3tbx9N7n3ufe3t7e597n\n597i7+fe597s9N73++fn3ufn5+fn7+fv5+fv7+/e5+/r4vfr4ufn9+fv9+fv/+/n\n7+/v8/Pz7/fv9+/v/+f3++f//+/39+/3/+//9+////f37/f39/f3//f/9/f////3\n7//39//3////9////yH5BAEAAIAALAAAAAA4AFAAQAj+AAEJHEiwoMGDCBMqXIiw\niA8tXbxIgXHhgY+FICSIiCFFihIeXRgm9OKlDJMqYs506UIDRIUKD7w8kLCiAw0q\n0ao8WCFhwgQqDx7E+EJHm0gpUaI0ibKDBo0dXeakazEkxYUOGjRMSQOmQw874eR9\nIHNPXrFba5Y8CLNDyYULGlZQRVjtzJCmTnew2AGp2j19gAGTC6ctnLvDZfWR07Aj\nCJAd4fTduxctFapbiDKTQ7gjSZcsT6PQqLmCxhA78v4GnuxOHuGzeei8kVLkh5I1\nb9y80XPp0q1s+lK7E3eQjSIvbqJAEiPGjR0/c9REqyavtTx9rVtn09asmJsvbMb+\nuLlcrFn3YsqsiRM33M3CDlkUsWMnT978cM206Y/WjH+187cEGOArqKCiCCJ00DEH\nHXXkIdJBEgQVlEsS1iThAwlg+EAXcNgBySiQQILKJWOM8YYy2Tyo4oqA5HELMtxx\nVwyLNA5UxAUxxPBWjTjGIIIWNSKUhhddUFFFU0O89BZjQ9DQwYUPVKABCEJg8cYZ\nK5aRxRNM0JDCCimkQMUONXUAwlVOKbGDGHhAMEczgemjTV2jXeCTBqZFoZASVDDR\nxGildTbHX3zUgJeTZ0Cimj5kBLHDEEM0IU59cd6TDmHm7WFQNHDAwcVoT5m2Qg2t\nAJPYau6wY01/2ohTjDb+Z91hhiK3FMiILnkcWIw1iLlz0BuPquHEFaDWtEMVclyX\nWpz1pUNONdKkkkoWyEGSqyKXvYJeNtmEo6pRCEkyaX3ykMPOYOWSw41+2rDTGjnd\nNoMMMsXoUkw05SFzXnlnFaiIikpOIIEUbrzaSit+RPFWByK4ocoordzC74iKKHLG\nFmm4kQciQSIkgQQIIEAAAQ+Q/IDIIieQAAFROPcHI9heUodh2ujT8c0CzcEdt8Ph\n7DONGgwxxs+A7BADEUT4SOMEMWyBBRYiEA2ID16oYYYZDsXwQGNOMHGFFUz4ucMF\nND2qRBdmeDEE0Uq0IccWSuDQwdwXXrBCkxVFKOH+VVB8UceMNHohxhVNipDCEBqk\noIGUTu70AA4P3PUEYG6cEQXiM0lwwRBryKNiF1dcwYQQDK+wQxZijGYmnk+tsEIV\nGrgTZ6VniMHUCHZ3EAWQCWlRxe+X47BCy8UEc08GcmfVwVUxLDHFECPoE01TTWhj\nTRQimBBDEW64QUYTZczBhBcJCTFEFKODSkMUZcAJWDWMjDJHGW4089df3DiRBRDg\nwzE7YPLgji5uIQmEzIMaeHgU+nbwqCaEaFEAXI82rqOav8gDLgOzjj5c9YpbXEIR\n2bjHLQ5yBjdw4QxjGs0OOvA6MQSjGrNLjX2akQ1U0KEMXlACDYh0uS3M4Q3+CeoA\nHbKBmHuE4yBJ6EEXUveomiBuCKhwA3AqOJmypIMb+ILEH1ChhTXoIUEbqwMiXsEL\nZThjOOEgB8cO4gYqKOEMDNxhFKjQBFmFw4IAZM25uJOKMWyhi35gxFk6WAxnqOcw\n5wKcQdAgJz84shrVcIMfRpEOSMqjGtGoTnVSJY78dIcRf2ADFPwgsbM0Q2LmaRVm\nGNKGYmzSPvYxFzsqOZ12dSsbACrlq85Sq1sQ6EBrfBAReHI1baTjUuGIhjZ0UZkC\n3cI89CqPeQrkBzq4IQ1nWMOCCsijoPhgBUKoQstokJUJQOkBSlADJVqRimKgghEw\ne4MW0KCxZvisIif+QwCUMnShkD2ABmaQAyQoMYoCXYINdCgGcKRmEAkRQAErI4DK\ngiIHP/wBEoy4hDvN0wxfMXRFo7CXNYh4j492TBG7VJVJV1oQKDBUCzi6WZQuUAai\n+UAEPvDRBWikEaTxIGo/EwIP/igFH0hARZoTwRC+8AUtFEFqPlCCFryghZtSRE8H\n6cIOHnABH0iBWl4wwxGgupIiKUEIPqjAqKhihSY4igYjMGcHUrCDKIS1hFKTAlVF\nAwIq1W19NMCnhCRQgRBAAQ28SIPP1nCGNBTDaXfZQQoq8LGgYAVSILjQBC6wAyEQ\nAQ11SFGNuvC7P+2ACXO4i+kipNYHdIBMppn+hxteRyYqCEwCOJDCHDyqIixoQQxu\nleyXojA3rFxgBK57ixcmcNozAOYeeAjCGWZiN7hM4AmjUFEVmpCFJrjuSxEhE1ZA\nYLq7KQFS0RjU/+5xhjI0YQcauEBesKoQM2QBUp113dzm4CjFZaVM8RWCGwA4u3sA\nowmq1cAE8GQF+iJECXNkwg6E11kmuCEdGSATCLISlyqAwXkQSI0TuACHdBTjDh0A\ngwmw0EAyiWElCilCEvDrlKfsoAzC0Ecc9uI6DXDVxxPwwgjuAQc8NSEa3UiDMngh\nu3v8oXZ3QIYX/KCQIdCxKYGiQhei8dw5tHEIXqjCHGAImHR8QAhAuEL+FsrwP8E0\nQxdwVogC71JjIXShFdcJDH6sUQxFQJAccHCvE87Qh0WVJRrhCJCBFEKNK0yYgZ3N\nwgrcAIl0zK414qAPAPPsXQvBSR7TrNiBJKGPNyAkGsbgA1NcxwLXuQEPwrA0s9wR\nDms8N1XuOOYQJLCF/ESDPwOsVR7glCoSliEOZWCgapNwJDm0AoKSqc49FEGFMtyh\nVqhIWArWoAgF5WEPLmqDfGTXM4M8oQxXSF2kxpSFHbTADX/wS6XIBatmSKILQzAc\npMIkhTSo4Q1pGGM2NqmYg1xhd2sYTQqcdAEqJMENmSywJtnBnVsoopomagMQGVSH\nQVziFc1AETn+qmNPg1CBCkFwQxC+RKa71bUMsnvuZDRZrmog45138HKu6FCxzGhr\nVdkQRzhEexAiZRMFe2nSClB3B21AsIrycNav34lDN9wiDwW6TBmdEQ720NoaCTmD\nGqgghnbvQA7ppt8twnKq+rwLktHIgxbaAIU1+AEVxSgGL3hRSF5tkFt3QEgsdOyG\nO1zUDWVgxK/1lQ53jbwsnNzOKf2giDdAgQ54zzu/aLgePi9kMqZIRzBGMYpfV6Px\nlaxGu7BjH3FkwxqrwvYYftDO7jxTl2dBRBsYcongkKtcs4w63AszmGaIA1ZnyTtH\nzaN5iQVIEXpwj0iw4Abr1OdcFKcPu/T+I/lc8rJftapYbOrAItNhQRHyyLS5CMOf\nfb0qGvqqV949WDE63MEN2qRDbGgUg+WtQARbdnr/cUq6wAg5NwfK1H7TdAl+kAd5\n4AYYswYJ8gpBQllcNTdj4AWMEAxyAAE+JiFKIB6jcAvBUC8jAjNugAUmQgfBVCNB\nAVsLVwVZwAQPYE5Q8hZ/MAqM0AonqAiDoAXioQdEFyTnVIRBoTIJoAAg0AVyYAeR\nACIjgghh8AaoMFI+gyEhgwAJoE9QQgBaqAAvWAaBdBmXcQd1ACdl8VE6kk8ZsoVJ\nCFEJMGl2MAdzADOv8AYdpQ+8wFIDUTIj44VBAQgeQlC1ogvNgAouykAHFMiHCkEJ\nqtAK0rQqjKgipWcNvyE7k6gip8QOXTeEmcgQbAAI3VByNBIQAAA7\n---END_DATA---\n%/
| source file|{{{...images\smeow2.jpg}}}|\n| attached on|15 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|/%LOCAL_LINK%/[[images/meow2.jpg|images/meow2.jpg]]|\n| remote link|/%REMOTE_LINK%/[[http://www.TiddlyTools.com/images/meow2.jpg|http://www.TiddlyTools.com/images/meow2.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|AttachFileSample2]] or [img[tooltip|AttachFileSample2][link]]}}})\n[img[tooltip|AttachFileSample2]]\n<<<\n
test store.php\nhttp://www.tiddlytools.com/store.php\n<<<\n--%BOUNDARY%\nContent-disposition: form-data;name="UploadPlugin";\n\nbackupDir=;user=;password=;uploaddir=upload;\n--%BOUNDARY%\nContent-disposition: form-data;name="userfile";filename="%TARGET%"\nContent-Type: %TYPE%\nContent-Length: %SIZE%\n\n%DATA%\n--%BOUNDARY%--\n<<<\n----\npublish for public web access\nhttp://www.tiddlytools.com/response.txt\n<<<\n?file=%TARGET%&data=%DATA%\n<<<\n----\npublish for password-protected web access\nhttp://www.tiddlytools.com/response.txt\n<<<\n?file=%TARGET%&data=%DATA%\n<<<\n----\nsend to WebTPS report server (encrypted)\nhttps://www.WebTPS.com/reports/upload.asp\n<<<\n?workgroup=Y2K&key=3141592653589&file=%TARGET%\n<<<\n----\nsend to my Flickr account\nhttp://www.flickr.com/\n<<<\n\n<<<
/***\n''Auto Tagger Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#AutoTaggerPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAutomatically tag tiddlers with their original creation date and author and optionally scan the tiddler content for any tags that are embedded as text. Makes cross-referencing your tiddlers a snap!\n\n!!!!!Usage\n<<<\nWhen ~AutoTagger is present, it automatically ''generates 'creation date' and 'creator' tag values'' for all newly created tiddlers, so that this information is retained even after a tiddler has been updated many times. In addition, if you enter ''//auto//'' as a tiddler tag value, ~AutoTagger ''scans the tiddler content'' (including title) for all existing tags, and ''automatically adds any embedded tags that it finds''.\n\nAfter they have been added to the tiddler, the new tags are treated just as if you had entered them by hand and can be edited to make any changes you want. Of course, as long as the "auto" tag is still present on a tiddler, ~AutoTagger will re-scan that tiddler's content each time it is edited. If you DO edit the generated tags, you can remove the "auto" tag from the tiddler to prevent it from being re-scanned when you press 'done' to finish editing.\n\n//Note: the special-purpose ''"systemConfig" tag is not added automatically, even if matched in the tiddler content'', since this tag should be added manually to ensure it is always used appropriately.//\n\n//Note: if you have set the "auto" tag on a tiddler, and then add several tags to your document, those tags will ''not'' be automatically added to the tiddler until you actually edit that tiddler and press 'done' to trigger an AutoTagger scan.//\n<<<\n!!!!!Configuration\n<<<\nThe ~AutoTagger plugin comes with a ''self-contained control panel''. Use these controls to enable or disable automatic 'creation date' or 'creator' tagging, modify the default date formatting, or redefine the special 'scan trigger' tag value (so you can use "auto" as a normal tag value in your document).\n\n<<option chkAutoTagAuthor>> add 'created by' tag //(when a tiddler is first created)//\n<<option chkAutoTagDate>> add 'creation date' tag, using date format: <<option txtAutoTagFormat>>\n<<option chkAutoTagEditor>> add 'edited by' tag //(when a tiddler is updated)//\nscan tiddler content for new tags when tagged with: <<option txtAutoTagTrigger>>\n----\n//date formatting syntax://\n^^//''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero//^^\n^^//''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero//^^\n^^//''YYYY'' - full year, ''YY'' - two digit year//^^\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''AutoTaggerPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.06.15 [1.3.2]'' hijack TiddlyWiki.prototype.saveTiddler instead of store.saveTiddler. Permits other plugins to also hijack the function (thanks to Simon Baird for finding this!)\n''2006.05.31 [1.3.1]'' Re-assemble tags into a space-separated string (use encodeTiddlyLink to add {{{[[...]]}}} as needed) before passing it on to core (or other hijacked function)\n''2005.10.09 [1.3.0]'' Added 'edited by' tagging. Combined documentation and code into a single tiddler\n''2005.08.16 [1.2.0]'' Added optional scanning for tags in tiddler content (based on suggestion from Jacques Turbé)\n''2005.08.15 [1.1.0]'' Added 'created by' tag generation (based on suggestion from Elise Springer). Renamed from DateTag to AutoTagger\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.autoTagger = {major: 1, minor: 3, revision: 2, date: new Date(2006,6,14)};\n\nif (config.options.chkAutoTagDate==undefined)\n config.options.chkAutoTagDate=false;\nif (config.options.chkAutoTagEditor==undefined)\n config.options.chkAutoTagEditor=false;\nif (config.options.chkAutoTagAuthor==undefined)\n config.options.chkAutoTagAuthor=false;\nif (config.options.txtAutoTagTrigger==undefined)\n config.options.txtAutoTagTrigger="auto";\nif (config.options.txtAutoTagFormat==undefined)\n config.options.txtAutoTagFormat="YYYY.0MM.0DD";\n\n// hijack saveTiddler()\nTiddlyWiki.prototype.coreSaveTiddler=TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler=function(title,newTitle,newBody,modifier,modified,tags)\n{\n // get the tags as passed from the tiddler editor\n var newTags = [];\n if (tags) newTags = (typeof tags == "string") ? tags.readBracketedList() : tags;\n\n // if saving a new tiddler, add 'creation date' tag\n if (config.options.chkAutoTagDate && (store.getTiddler(title)==undefined))\n newTags.pushUnique(new Date().formatString(config.options.txtAutoTagFormat));\n // if saving a new tiddler, add 'created by' tag\n if (config.options.chkAutoTagAuthor && (store.getTiddler(title)==undefined))\n newTags.pushUnique(config.options.txtUserName);\n // if saving an existing tiddler, add 'edited by' tag\n if (config.options.chkAutoTagEditor && (store.getTiddler(title)))\n newTags.pushUnique(config.options.txtUserName);\n\n // if tagged for scanning, find tags embedded in text of tiddler title/body\n var allTags = store.getTags();\n if ((config.options.txtAutoTagTrigger!="") && (newTags.find(config.options.txtAutoTagTrigger)!=null))\n for (var t=0; t<allTags.length; t++)\n {\n // note: don't automatically tag a tiddler with 'systemConfig' or 'systemTiddler'\n if ((allTags[t][0]=='systemConfig') || (allTags[t][0]=='systemTiddler'))\n continue;\n if ((newBody.indexOf(allTags[t][0])!=-1) || (newTitle.indexOf(allTags[t][0])!=-1))\n newTags.pushUnique(allTags[t][0]);\n }\n\n // encode tags with [[...]] (as needed)\n for (var t=0; t<newTags.length; t++) newTags[t]=String.encodeTiddlyLink(newTags[t]);\n\n // reassemble tags into a string (for other plugins that require a string) and pass it all on\n return this.coreSaveTiddler(title,newTitle,newBody,modifier,modified,newTags.join(" "));\n}\n//}}}
[[StyleSheetAdjustments]]\n[[BrightText]]\n/* ==== blackout ==== */\n/*{{{*/\nbody\n { background-color:#000; }\n.menubox\n { background-color:#111; }\n.viewer\n { background-color:#111; border: 1px solid #999; -moz-border-radius:1em; padding:1em; }\n.header\n { background-image: none; background-color:transparent; color:#ccf; border:0; }\n.floatingPanel, .attachPanel, #importPanel, #exportPanel,\n { background: #eee; background-image: url('[[TexturesParchmentGray]]');}\n.floatingPanel a, .attachPanel a, #messageArea a, #importPanel a, #exportPanel a, #sidebarTabs .tabContents a,\n.floatingPanel .button, .attachPanel .button, #messageArea .button, #importPanel .button, #exportPanel .button, #sidebarTabs .tabContents .button,\n.floatingPanel .tiddlyLinkExisting, .attachPanel .tiddlyLinkExisting, #messageArea .tiddlyLinkExisting, #importPanel .tiddlyLinkExisting, #exportPanel .tiddlyLinkExisting, #sidebarTabs .tabContents .tiddlyLinkExisting\n { color:#009; }\n.siteMenu .floatingPanel, #messageArea \n { background: #eee; }\n.tiddlyCard { background:#ffd; }\n\n.viewer h1,.viewer h2,.viewer h3,.viewer h4,.viewer h5 { background: #666; color:#fff; }\n#sidebarTabs .tabContents\n { background-color:#111; color:#fff; }\n#sidebarTabs .tabContents a, #sidebarTabs .tabContents .button, #sidebarTabs .tabContents .tiddlyLinkExisting\n { color:#99f; }\n/*}}}*/
<html><form>\n<input type="hidden" name="cardtype" value="BookmarkForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card id" name="cardID" value="card/bookmark ID"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:79%" title="title" name="title" value="title"><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="url" name="url" value="location (url)"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="summary"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">description/notes</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="tags">\n</form></html>\n----\n/%title%//%title%/\n/%url%//%url%/\nsummary: /%summary%//%summary%/ +++[more...]>/%notes%//%notes%/===\n
/***\n|''Name:''|BreadcrumbsPlugin|\n|''Description:''||\n|''Version:''|1.4.0|\n|''Date:''|Aug 02, 2006|\n|''Source:''|http://sourceforge.net/project/showfiles.php?group_id=150646|\n|''Author:''|Alan Hecht (with 2.0 update from 'jack' and revisions by Bram Chen)|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.5+; InternetExplorer 6.0|\n\n!Revision History:\n__TiddlyTools variant:__\n1.4.0.1(TT) 2006.08.04 - change spaces to tabs\n1.4.0.0(TT) 2006.08.04 - modified from 1.4.0 distro:\n<<<\nin refreshCrumbs(), set {{{display:none/block}}} instead of {{{visibility:hidden/visible}}}\nin restartHome(), check for valid crumbArea before setting style\ngeneral code cleanup/reformat using tabs to indent\n<<<\n|''Version''|''Date''|''Note''|\n|1.4.0|Aug 02, 2006|Fixed bug, the redefined onClickTiddlerLink_orig_breadCrumbs works incorrectly on IE|\n|1.3.0|Jul 20, 2006|Runs compatibly with TW 2.1.0 (rev #403+)|\n|1.2.0|Feb 07, 2006|change global array breadCrumbs to config.breadCrumbs by Eric's suggestion|\n|1.1.0|Feb 04, 2006|JSLint checked|\n|1.0.0|Feb 01, 2006|TW2 ready and code Cleaned-up|\n\n!Code section:\n***/\n//{{{\nversion.extensions.breadCrumbs = {major: 1, minor: 4, revision: 0, date: new Date("Aug 02, 2006")};\nconfig.breadCrumbs = [];\n\nwindow.onClickTiddlerLink_orig_breadCrumbs = window.onClickTiddlerLink;\nwindow.onClickTiddlerLink = function(e){\n if (!e) var e = window.event;\n window.onClickTiddlerLink_orig_breadCrumbs(e);\n addCrumb(e);\n return false;\n}\n\nfunction addCrumb(e){\n if (!e) var e = window.event;\n var thisCrumb = "[[" + resolveTarget(e).getAttribute("tiddlyLink") + "]]";\n var ind = config.breadCrumbs.find(thisCrumb);\n if(ind === null)\n config.breadCrumbs.push(thisCrumb);\n else\n config.breadCrumbs.length = ind++;\n refreshCrumbs();\n return false;\n}\n\nfunction refreshCrumbs(){\n var crumbArea = document.getElementById("breadCrumbs");\n if (!crumbArea) {\n var crumbArea = document.createElement("div");\n crumbArea.id = "breadCrumbs";\n crumbArea.style.display= "none"; // ELS changed from: crumbArea.style.visibility= "hidden";\n var targetArea = document.getElementById("tiddlerDisplay");\n targetArea.parentNode.insertBefore(crumbArea,targetArea);\n }\n crumbArea.style.display = "block"; // ELS changed from: crumbArea.style.visibility = "visible";\n removeChildren(crumbArea);\n createTiddlyButton(crumbArea,"Home",null,restartHome);\n wikify(" | " + config.breadCrumbs.join(' > '),crumbArea) // ELS: changed || to |\n}\n\nfunction restartHome(){\n story.closeAllTiddlers();\n restart();\n config.breadCrumbs = [];\n var crumbArea = document.getElementById("breadCrumbs");\n if (crumbArea) // ELS: added check to make sure crumbArea exists\n crumbArea.style.display = "none"; // ELS changed from: crumbArea.style.visibility = "hidden";\n}\n//}}}
/* background images */\n/* colors and borders */\na { color:#ccf; }\na:hover { color:#fff; }\n\n#breadCrumbs { color:#ccc; }\n#breadCrumbs a { color:#ccf; }\n#titleLine { color: #fff; }\n#titleLine a { color: #009900; }\n.siteMenu { color: #fff; border:0; margin-bottom:.5em }\n.siteMenu a, .siteMenu .button, .siteMenu .tiddlyLink { color: #ccf; }\n.storyMenu { color: #fff; border:0; margin-bottom:.5em }\n.storyMenu a, .storyMenu .button, .storyMenu .tiddlyLink { color: #ccf; }\n/*\n#mainMenu { color: #fff; }\n#mainMenu .tiddlyLink { color: #def; }\n#mainMenu .tiddlyLink:hover { color: #fff; }\n#mainMenu .externalLink { color: #def; }\n#mainMenu .externalLink:hover { color: #fff; }\n#mainMenu .button, #mainMenu A { color: #def; }\n#mainMenu .button:hover, #mainMenu A:hover { color: #fff; }\n*/\n#messageArea { color: #006; }\n#messageArea a:link, #messageArea a:visited { color: #006; }\n#messageArea a:hover { color: #f00; }\n#messageArea a:active { color: #006; }\n#popup { color: #000; }\n#popup a { color: #006; }\n#popup a:hover { color: #006; }\n#popup hr { color: #666; }\n.tabContents { color: #000; }\n.tiddler .button { color: #ccf; }\n.tiddler .button:hover { color: #fff; }\n.tiddler .button:active { color: #fff; }\n.title { color: #def; }\n.toolbar { color: #aaa; }\n.footer { color: #888; }\n.selectedTiddler .footer { color: #ddd; }\n.viewer { color: #fff; }\n.viewer a:link, .viewer a:visited { color: #ccf; }\n.viewer a:hover { color: #fff; }\n.viewer .button { color: #def; }\n.viewer .button:hover { color: #fff; }\n.viewer th { color: #fff; }\n.viewer td { color: #fff; }\n.viewer code { color: #ccc; }\n.viewer pre { color: #000; }\n.viewer hr { color: #666; }\n.viewer .highlight, .viewer .marked { color: #fff; }\n.viewer .tabSelected { background-color: #014; color:#fff; border-color:#999; border-width:2px; padding-bottom:2px !important; }\n.viewer .tabUnselected { background-color: #236; color:#999; border-color:#666}\n.viewer .tabContents { background-color: #014; color:#fff; border-color:#999; border-width:2px }\n.tagging a, .tagged a, .tagging .button, .tagged .button { color: #009; }\n.highlight, .marked { color: #fff; }\n.editor { color: #402C74; }\n.editorFooter { color: #aaa; }\n.editorFooter A { color: #930; }\n.editorFooter A:hover { color: #cf6; }\n.editorFooter A:active { color: #fff; }\n#licensePanel A { color: #66f; }\n#licensePanel A:hover { color: #fff; }\n#licensePanel A:active { color: #fff; }\n.errorNoSuchMacro { color: #ff0; }\n.zoomer { color: #fff; }\n\n.floatingPanel .button,\n.floatingPanel a:link,\n.floatingPanel a:visited,\n.viewer .floatingPanel .button,\n.viewer .floatingPanel a:link,\n.viewer .floatingPanel a:visited {\n color: #009 !important;\n}\n.floatingPanel a:hover,\n.viewer .floatingPanel a:hover {\n color: #fff !important;\n}\n/***\n----\n***/\n/*{{{*/\n.tiddlyCard\n { color:#000 !important; }\n.tiddlyCard a, .tiddlyCard .button, .tiddlyCard .tiddlyLinkExisting, .tiddlyCard .tiddlyLinkNonExisting\n { color:#009 !important; }\n.attachPanel a, #importPanel a, #exportpanel a,\n.attachPanel .button, #importPanel .button, #exportpanel .button,\n.attachPanel .tiddlyLinkExisting, #importPanel .tiddlyLinkExisting, #exportpanel .tiddlyLinkExisting,\n.attachPanel .tiddlyLinkNonExisting, #importPanel .tiddlyLinkNonExisting, #exportpanel .tiddlyLinkNonExisting,\n.tab .button, .tab A,\n.tab .tiddlyLinkExisting, .tab .tiddlyLinkNonExisting\n { color:#009 !important; }\n#sidebarOptions, #sidebarOptions .sliderPanel\n { color: #fff; }\n#sidebarOptions .button, #sidebarOptions A,\n#sidebarOptions .tiddlyLinkExisting, #sidebarOptions .tiddlyLinkNonExisting,\n#sidebarOptions .sliderPanel .button, #sidebarOptions .sliderPanel A,\n#sidebarOptions .sliderPanel .tiddlyLinkExisting, #sidebarOptions .sliderPanel .tiddlyLinkNonExisting\n { color: #def; }\n#sidebarTabs, #sidebarTabs .sliderPanel, #sidebarTabs .tabContents\n { color: #fff; }\n#sidebarTabs .tabContents *[class="TOCList"] /* MOZ ONLY */\n { color:#fff !important; }\n#sidebarTabs .button, /* #sidebarTabs A, */\n#sidebarTabs .tiddlyLinkExisting, #sidebarTabs .tiddlyLinkNonExisting\n { color: #def; }\n.menubox\n { color:#fff; }\n.menubox a, .menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting\n { color:#99f !important; }\n.groupbox\n { color:#000; }\n.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting\n { color:#009 !important; }\n/*}}}*/
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDAlbumForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="card/CDDB id"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="artist/group"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="release date"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="CD title" name="title" value="CD title"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="sample recording (url)"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="cover image" name="cover" value="cover image (url - GIF/JPG)"><!--\n--><input type="button" value="view" style="width:20%" onclick="window.open(this.form.cover.value,'_blank')"><br><!--\n-->Buy this CD online:<br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="purchase online (url)" name="buy" value="location (url)"><br><!--\n--><div style="width:100%;text-align:center"><!--\n-->Genre: <input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental"> experimental <!--\n--><input type="checkbox" name="original"> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="summary"><br><!--\n--><textarea rows="4" onfocus="this.select()" style="width:100%" title="tracks/liner notes" name="notes">tracks/liner notes</textarea><br><!--\n--><textarea rows="4" onfocus="this.select()" style="width:100%" title="credits/copyrights" name="credits">credits/copyrights</textarea><br><!--\n--><textarea rows="4" onfocus="this.select()" style="width:100%" title="artist/group biography" name="about">artist/group biography</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDAlbumCard">\n</form></html>\n----\n/%cover="[<img[%0]]"%//%cover%/\n''{{medium{__/%title%//%title%/__}}}''\n{{small{Artist/group: /%artist%//%artist%/\n+++[background info...]>/%about%//%about%/===\n\nGenre: /%rock%/rock/%rock%/ /%blues%/blues/%blues%/ /%jazz%/jazz/%jazz%/ /%funk%/funk/%funk%/ /%classical%/classical/%classical%/ /%experimental%/experimental/%experimental%/ /%original%/original/%original%/\n}}}\nSummary: /%summary%//%summary%/\n<html><div style="clear:both"></div></html>liner notes:\n<<<\n/%notes%//%notes%/\n<<<\n''Buy this CD online at: /%buy%//%buy%/''\nCredits:{{groupbox{@@display:block;font-size:90%;line-height:120%;/%credits%//%credits%/@@}}}
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="card/CDDB id"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="artist/group"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="release date"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="track title"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="#"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="CD title"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="sample recording (url)"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental"> experimental <!--\n--><input type="checkbox" name="original"> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="summary"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="instruments"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">notes</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%//%CDtitle%/\nTrack #/%track number%//%track number%/: /%title%//%title%/\nListen: /%url%//%url%/\n----\nNotes:\n<<<\n/%notes%//%notes%/\n<<<\n^^Instruments: /%instruments%//%instruments%/^^
/%CSS syntax attribute reference chart%/\n{{menubox{{{small{\n~~Source: Paul Petterson~~\n|>|>| !Selectors |\n| ''Selector'' | ''Sample'' | ''Description'' |\n| tag | H1 { color: blue ; } |Selects all of the specified HTML tags |\n| class | .myClass { color: blue; } |Selects all HTML tags with the attribute class="myClass" specified |\n| ID | #tag56 { color: blue; } |Selects the single HTML tag with the attibute ID="tag56" specified |\n| Grouping | H1, H2, H3 { color: blue ; } | selects all specified selectors (tags, class, or ID can be specified) |\n| Contextual | H1 B { color: red; } |selects all 'B' tags in H1. Context selectors can be tag, class, or ID selectors |\n\n|>|>|>| !Units |\n| ''Type'' | ''Unit'' | ''Description'' |\n| Length | mm, cm, in |millimeters, centimeters, inches |\n|~| pt, pc |point size, pica |\n|~| em, ex |relative to the point size of the font, relative to x-height of the font |\n|~| px |pixel (device dependent) |\n| Percentage | % |calculated as a percentage of their default size used in context |\n| Keywords | .. | ... |\n| Color | <name> |Color names ex: green see: ColorNames |\n|~| rgb() |specify number or percengate rgb(100%, 0, 100%) |\n|~| <hex value> |specify hex RGB number of color ex: #00FF00 see: ColorChart |\n\n|>|>|>| !Font Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| font-family |[font name or type] | font-family: Verdana, Arial; | Y |\n| font-style |normal, italic | font-style:italic; | Y |\n| font-variant |normal, small-cap | font-variant:small-caps; | Y |\n| font-weight |normal, bold | font-weight:bold; | Y |\n| font-size |[ xx-large, x-large, large, medium, small, x-small, xx-small ], [ larger, smaller ], \s\spercentage'\s\s, //length// | font-size:12pt; | Y |\n| font |[//font-style// / //font-variant// / //font-weight//] ? //font-size// [//line-height//] ? //font-family// | font: bold 12pt Arial; | Y |\n\n|>|>|>| !Color and Background Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| color |//color // | color: red | Y |\n| background-color |//color//, transparent | background-color: yellow | N* |\n| background-image |//url//, none | background-image: url(house.jpg)| N* |\n| background-repeat |repeat, repeat-x, repeat-y, no-repeat | background-repeat: no-repeat | N* |\n| background-attachment |scroll, fixed | background-attachment: fixed | N* |\n| background-position |[ //position// , //length// ], {1,2}, [ top, center, bottom ] -or- [ left, center, right ] | background-position: top center | N* |\n| background |transparent, //color// -or- //url// -or- repeat -or- scroll -or- //position// | background: silver url(house.jpg) repeat-y | N* |\n|>|>|>| !*Starting in CSS2, these properties are inherited. |\n\n|>|>|>| !Text Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| letter-spacing |normal, //length// | letter-spacing:5pt | Y |\n| text-decoration |none, underline, overline, line-through | text-decoration:underline | N |\n| vertical-align |sub, super, | vertical-align:sub | N |\n| text-transform |capitalize, uppercase, lowercase, none | text-transform:lowercase | N |\n| text-align |left, right, center, justify | text-align:center | N |\n| text-indent |//length//, //percentage// | text-indent:25px | N |\n| line-height |normal, //number//, //length//, //percentage// | line-height:15pt | N |\n\n\n''The //CSS Box//''\n<html>\n<div style="color:black;background-color:#FFFFCC;padding:1em;border:thin solid black;text-align:center;width=30%">margin\n<div style="color:white;background-color:black;padding:1em;border:thin solid black;text-align:center;width=100%">border\n<div style="color:black;background-color:#FFCC99;padding:1em;border:thin solid black;text-align:center;width=100%">padding\n<div style="color:black;background-color:white;border:thin solid black;text-align:center;width=100%">content<br/>\n<div style="float:left">&lt;-</div><div style="float:right">-&gt;</div>CSS 'width'\n</div>\n</div>\n</div>\n</div>\n</html>\n\n\n|>|>|>| !Box Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| margin-top |//length//, //percentage//, auto | margin-top:5px | N |\n| margin-right |//length//, //percentage//, auto | margin-right:5px | N |\n| margin-bottom |//length//, //percentage//, auto | margin-bottom:1em | N |\n| margin-left |//length//, //percentage//, auto | margin-left:5pt | N |\n| margin |//length//, //percentage//, auto {1,4}| margin: 10px 5px 10px 5px | N |\n| padding-top |//length//, //percentage// | padding-top:10%| N |\n| padding-right |//length//, //percentage// | padding-right:15px | N |\n| padding-bottom |//length//, //percentage// | padding-bottom:1.2em | N |\n| padding-left |//length//, //percentage// | padding-left:10pt; } | N |\n| padding |//length//, //percentage// {1,4}| padding: 10px 10px 10px 15px | N |\n| border-top-width |thin, medium, thick, //length// | border-top-width:thin | N |\n| border-right-width |thin, medium, thick, //length// | border-right-width:medium | N |\n| border-bottom-width |thin, medium, thick, //length// | border-bottom-width:thick | N |\n| border-left-width |thin, medium, thick, //length// | border-left-width:15px | N |\n| border-width |thin, medium, thick, //length// {1,4}| border-width: 3px 5px 3px 5px | N |\n| border-top-color |//color // | border-top-color:navajowhite | N |\n| border-right-color |//color// | border-right-color:whitesmoke | N |\n| border-bottom-color |//color// | border-bottom-color:black | N |\n| border-left-color |//color// | border-left-color:#C0C0C0 | N |\n| border-color |//color// {1,4} | border-color: green red white blue; } | N |\n| border-top-style |none, solid, double, groove, ridge, inset, outset | border-top-style:solid | N |\n| border-right-style |none, solid, double, groove, ridge, inset, outset | border-right-style:double | N |\n| border-bottom-style |none, solid, double, groove, ridge, inset, outset | border-bottom-style:groove | N |\n| border-left-style |none, solid, double, groove, ridge, inset, outset | border-left-style:none | N |\n| border-style |none, solid, double, groove, ridge, inset, outset | border-style:ridge; }| N |\n| border-top |//border-width//, //border-style//, //border-color// | border-top: medium outset red | N |\n| border-right |//border-width//, //border-style//, //border-color// | border-right: thick inset maroon | N |\n| border-bottom |//border-width//, //border-style//, //border-color// | border-bottom: 10px ridge gray | N |\n| border-left |//border-width//, //border-style//, //border-color// | border-left: 1px groove red | N |\n| border |//border-width//, //border-style//, //border-color// | border: thin solid blue | N |\n| float |none, left, right | float:none | N |\n| clear |none, left, right, both | clear:left | N |\n\n|>|>|>| !Classification Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| display |none, block, inline, list-item | display:none | N |\n| list-style-type |disk, circle, square, decimal, lower-roman, upper-roman, lower-alpha, upper-alpha, none | list-style-type:upper-alpha | Y |\n| list-style-image |//url//, none | list-style-image:url(icFile.gif) | Y |\n| list-style-position |inside, outside | list-style-position:inside | Y |\n| list-style |//keyword// -or- //position// -or- //url// | list-style: square outside url(icFolder.gif) | Y |\n\n|>|>|>| !Positioning Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Applies Too'' | ''Inherited?'' |\n| clip |//shape//, auto | clip:rect(0px 200px 200px 0px) | all element | N |\n| height |//length//, auto | height:200px | DIV, SPAN and replaced element | N |\n| left |//length//, //percentage//, auto | left:0px | absolutely and relatively positioned element | N |\n| overflow |visible, hidden, scroll, auto | overflow:scroll | all element | N |\n| position |absolute, relative, static | position:absolute | all element | N |\n| top |//length//, //percentage//, auto | top:0px | absolutely and relatively positioned element | N |\n| visibility |visible, hidden, inherit | visibility:visible | all element | N |\n| width |//length//, //percentage//, auto | width:80%| DIV, SPAN and replaced element | N |\n| z-index |auto, //integer// | z-index:-1| absolutely and relatively positioned element | N |\n\n|>|>|>| !Printing Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| page-break-before |auto, always -or- left, right | page-break-before:alway | N |\n| page-break-after |auto, always -or- left, right | page-break-before:auto | N |\n\n|>|>|>| !Pseudo Classes |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| cursor |auto, crosshair, default, hand, move, e-resize, ne-resize, nw-resize, n-resize, se-resize, sw-resize, s-resize, w-resize, text, wait, help | { cursor:hand; } | Y |\n| active, hover, link, visited | n/a | a:hover { color:red; } | Y |\n| first-letter, first-line |any font manipulating declaration | p:first-letter{ float:left;color:blue } | N |\n}}}}}}
/***\n''Name:'' Calendar plugin\n''Author:'' SteveRumsby\n\n// // updated by Jeremy Sheeley to add cacheing for reminders\n// // see http://www.geocities.com/allredfaq/reminderMacros.html\n\n''Configuration:''\n\n|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|\n|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|\n\n''Syntax:'' \n|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|\n|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|\n|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|\n|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|\n|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|\n|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|\n\n***/\n// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.\n\n// // ''Changes by ELS 2005.10.30:''\n// // config.macros.calendar.handler()\n// // ^^use "tbody" element for IE compatibility^^\n// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^\n// // createCalendarDays()\n// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^\n// // calendar stylesheet definition\n// // ^^use .calendar class-specific selectors, add text centering and margin settings^^\n\n//{{{\nconfig.macros.calendar = {};\n\nconfig.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\nconfig.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];\n\nconfig.macros.calendar.weekendbg = "#c0c0c0";\nconfig.macros.calendar.monthbg = "#e0e0e0";\nconfig.macros.calendar.holidaybg = "#ffc0c0";\n\n//}}}\n// //''Code section:''\n// (you should not need to alter anything below here)//\n//{{{\nif(config.options.txtCalFirstDay == undefined)\n config.options.txtCalFirstDay = 0;\nif(config.options.txtCalStartOfWeekend == undefined)\n config.options.txtCalStartOfWeekend = 5;\n\nconfig.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>> \n\nversion.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};\nconfig.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconfig.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead\n//}}}\n\n// //Is the given date a holiday?\n//{{{\nfunction calendarIsHoliday(date)\n{\n var longHoliday = date.formatString("0DD/0MM/YYYY");\n var shortHoliday = date.formatString("0DD/0MM");\n\n for(var i = 0; i < config.macros.calendar.holidays.length; i++) {\n if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {\n return true;\n }\n }\n return false;\n}\n//}}}\n\n// //The main entry point - the macro handler.\n// //Decide what sort of calendar we are creating (month or year, and which month or year)\n// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.\n// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//\n// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//\n// ELS 2006.05.29: add journalDateFmt handling//\n//{{{\nconfig.macros.calendar.handler = function(place,macroName,params)\n{\n var calendar = createTiddlyElement(place, "table", null, "calendar", null);\n var tbody = createTiddlyElement(calendar, "tbody", null, null, null);\n var today = new Date();\n var year = today.getYear();\n if (year<1900) year+=1900;\n \n // get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)\n var text = store.getTiddlerText("SideBarOptions");\n this.journalDateFmt = "DD-MMM-YYYY";\n var re = new RegExp("<<(?:newJournal)([^>]*)>>","mg"); var fm = re.exec(text);\n if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }\n\n if (params[0] == "thismonth")\n {\n cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, today.getMonth());\n } \n else if (params[0] == "lastmonth") {\n var month = today.getMonth()-1; if (month==-1) { month=11; year--; }\n cacheReminders(new Date(year, month, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, month);\n }\n else if (params[0] == "nextmonth") {\n var month = today.getMonth()+1; if (month>11) { month=0; year++; }\n cacheReminders(new Date(year, month, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, month);\n }\n else {\n if (params[0]) year = params[0];\n if(params[1])\n {\n cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, params[1]-1);\n }\n else\n {\n cacheReminders(new Date(year, 0, 1, 0, 0), 366);\n createCalendarYear(tbody, year);\n }\n }\n window.reminderCacheForCalendar = null;\n}\n//}}}\n//{{{\n//This global variable is used to store reminders that have been cached\n//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.\nwindow.reminderCacheForCalendar = null;\n//}}}\n//{{{\nfunction cacheReminders(date, leadtime)\n{\n if (window.findTiddlersWithReminders == null)\n return;\n window.reminderCacheForCalendar = {};\n var leadtimeHash = [];\n leadtimeHash [0] = 0;\n leadtimeHash [1] = leadtime;\n var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);\n for(var i = 0; i < t.length; i++) {\n //just tag it in the cache, so that when we're drawing days, we can bold this one.\n window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"]; \n }\n}\n//}}}\n//{{{\nfunction createCalendarOneMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarYear(calendar, year)\n{\n var row;\n row = createTiddlyElement(calendar, "tr", null, null, null);\n var back = createTiddlyElement(row, "td", null, null, null);\n var backHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year-1);\n };\n createTiddlyButton(back, "<", "Previous year", backHandler);\n back.align = "center";\n\n var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);\n yearHeader.align = "center";\n yearHeader.setAttribute("colSpan", 19);\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n var fwdHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year+1);\n };\n createTiddlyButton(fwd, ">", "Next year", fwdHandler);\n fwd.align = "center";\n\n createCalendarMonthRow(calendar, year, 0);\n createCalendarMonthRow(calendar, year, 3);\n createCalendarMonthRow(calendar, year, 6);\n createCalendarMonthRow(calendar, year, 9);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthRow(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDayHeader(row, 3);\n createCalendarDayRows(cal, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthHeader(cal, row, name, nav, year, mon)\n{\n var month;\n if(nav) {\n var back = createTiddlyElement(row, "td", null, null, null);\n back.align = "center";\n back.style.background = config.macros.calendar.monthbg;\n\n/*\n back.setAttribute("colSpan", 2);\n\n var backYearHandler = function() {\n var newyear = year-1;\n removeChildren(cal);\n cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, mon);\n };\n createTiddlyButton(back, "<<", "Previous year", backYearHandler);\n*/\n var backMonHandler = function() {\n var newyear = year;\n var newmon = mon-1;\n if(newmon == -1) { newmon = 11; newyear = newyear-1;}\n removeChildren(cal);\n cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(back, "<", "Previous month", backMonHandler);\n\n\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n// month.setAttribute("colSpan", 3);\n month.setAttribute("colSpan", 5);\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n fwd.align = "center";\n fwd.style.background = config.macros.calendar.monthbg; \n\n// fwd.setAttribute("colSpan", 2);\n var fwdMonHandler = function() {\n var newyear = year;\n var newmon = mon+1;\n if(newmon == 12) { newmon = 0; newyear = newyear+1;}\n removeChildren(cal);\n cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);\n/*\n var fwdYear = createTiddlyElement(row, "td", null, null, null);\n var fwdYearHandler = function() {\n var newyear = year+1;\n removeChildren(cal);\n cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, mon);\n };\n createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);\n*/\n } else {\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n month.setAttribute("colSpan", 7);\n }\n month.align = "center";\n month.style.background = config.macros.calendar.monthbg;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayHeader(row, num)\n{\n var cell;\n for(var i = 0; i < num; i++) {\n for(var j = 0; j < 7; j++) {\n var d = j + (config.options.txtCalFirstDay - 0);\n if(d > 6) d = d - 7;\n cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);\n\n if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))\n cell.style.background = config.macros.calendar.weekendbg;\n }\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDays(row, col, first, max, year, mon)\n{\n var i;\n for(i = 0; i < col; i++) {\n createTiddlyElement(row, "td", null, null, null);\n }\n var day = first;\n for(i = col; i < 7; i++) {\n var d = i + (config.options.txtCalFirstDay - 0);\n if(d > 6) d = d - 7;\n var daycell = createTiddlyElement(row, "td", null, null, null);\n var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);\n\n if(day > 0 && day <= max) {\n var celldate = new Date(year, mon, day);\n // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup\n if (window.showDate) {\n showDate(daycell,celldate,"popup","DD",config.macros.calendar.journalDateFmt,true, isaWeekend); // ELS 5/29/06 - use journalDateFmt \n } else {\n if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;\n var title = celldate.formatString(config.macros.calendar.tiddlerformat);\n if(calendarIsHoliday(celldate)) {\n daycell.style.background = config.macros.calendar.holidaybg;\n }\n if(window.findTiddlersWithReminders == null) {\n var link = createTiddlyLink(daycell, title, false);\n link.appendChild(document.createTextNode(day));\n } else {\n var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);\n }\n }\n }\n day++;\n }\n}\n//}}}\n\n// //We've clicked on a day in a calendar - create a suitable pop-up of options.\n// //The pop-up should contain:\n// // * a link to create a new entry for that date\n// // * a link to create a new reminder for that date\n// // * an <hr>\n// // * the list of reminders for that date\n//{{{\nfunction onClickCalendarDate(e)\n{\n var button = this;\n var date = button.getAttribute("title");\n var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));\n\n date = dat.formatString(config.macros.calendar.tiddlerformat);\n var popup = createTiddlerPopup(this);\n popup.appendChild(document.createTextNode(date));\n var newReminder = function() {\n var t = store.getTiddlers(date);\n displayTiddler(null, date, 2, null, null, false, false);\n if(t) {\n document.getElementById("editorBody" + date).value += "\sn<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n } else {\n document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n }\n };\n var link = createTiddlyButton(popup, "New reminder", null, newReminder); \n popup.appendChild(document.createElement("hr"));\n\n var t = findTiddlersWithReminders(dat, [0,14], null, 1);\n for(var i = 0; i < t.length; i++) {\n link = createTiddlyLink(popup, t[i].tiddler, false);\n link.appendChild(document.createTextNode(t[i].tiddler));\n }\n}\n//}}}\n\n//{{{\nfunction calendarMaxDays(year, mon)\n{\n var max = config.macros.calendar.monthdays[mon];\n if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {\n max++;\n }\n return max;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRows(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first1 < 0) first1 = first1 + 7;\n var day1 = -first1 + 1;\n var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first2 < 0) first2 = first2 + 7;\n var day2 = -first2 + 1;\n var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first3 < 0) first3 = first3 + 7;\n var day3 = -first3 + 1;\n\n var max1 = calendarMaxDays(year, mon);\n var max2 = calendarMaxDays(year, mon+1);\n var max3 = calendarMaxDays(year, mon+2);\n\n while(day1 <= max1 || day2 <= max2 || day3 <= max3) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;\n createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRowsSingle(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first1 < 0) first1 = first1+ 7;\n var day1 = -first1 + 1;\n var max1 = calendarMaxDays(year, mon);\n\n while(day1 <= max1) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n }\n}\n//}}}\n\n// //ELS 2005.10.30: added styles\n//{{{\nsetStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");\n//}}}\n
// // override cookie settings for CalendarPlugin:\n//{{{\nconfig.options.txtCalFirstDay=6;\nconfig.options.txtCalStartOfWeekend=5;\n//}}}
/***\n''CheckboxPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#CheckboxPlugin \nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAdd checkboxes to your tiddler content. Checkbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title|tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title|tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" 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 {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title|tag)] or [x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") 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 {{{(title|)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" 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 //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it. //''NOTE: beginning with version 2.1.2 of this plugin, the "|" separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when ":" is used within tiddler titles or tag names.''//\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou 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'.\n\nThe 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).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Configuration\n<<<\nNormally, 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.\n*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)\n*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")\n*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")\nYou 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):\n{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}\n\nYou 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:\n{{{[_{this.refresh.container=false}]}}}\n<<<\n!!!!!Examples\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\n>checked and unchecked static default values\n>[X] label\n>[_] label\n//{{{\n[_=demo] label\n//}}}\n>document-based value (id='demo', no cookie)\n>[_=demo] label\n//{{{\n[_=chkDemo] label\n//}}}\n>cookie-based value (id='chkDemo')\n>[_=chkDemo] label\n//{{{\n[_(CheckboxPlugin|demotag)]\n[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]\n//}}}\n>tag-based value (TogglyTagging)\n>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)\n>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)\n>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\n>custom init and onClick functions\n>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.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)\n2006.03.11 - 2.1.2 added "|" as delimiter to tag-based storage syntax (e.g. "tiddler|tag") to avoid parsing ambiguity when tiddler titles or tag names contain ":". Using ":" as a delimiter is still supported but is deprecated in favor of the new "|" usage. Based on a problem reported by JeffMason.\n2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags\n2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.\n2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}\n2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n2006.01.04 - 2.0.0 update for ~TW2.0\n2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing {{{[X]}}} in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n2005.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\n2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.\n2005.12.08 - 0.9.2 clean up lookahead pattern\n2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n2005.12.07 - 0.9.0 initial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.checkbox = { refresh: { tagged:true, tagging:true, container:true } };\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n c.container=story.findContainingTiddler(w.output); if (c.container) c.container=c.container.id.substr(7); // tiddler containing checkbox\n c.refresh = { };\n c.refresh.container=config.checkbox.refresh.container;\n c.refresh.tagged=config.checkbox.refresh.tagged;\n c.refresh.tagging=config.checkbox.refresh.tagging;\n w.output.appendChild(c);\n // set default state\n c.checked=(checked.toUpperCase()=="X");\n // get/set state by ID\n if (id) {\n c.id=id.substr(1); // trim off leading "="\n if (config.options[c.id]!=undefined)\n c.checked=config.options[c.id];\n else\n config.options[c.id]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=c.container;\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (this.id)\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }\n if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=story.findContainingTiddler(this); if (t) {\n var t=store.getTiddler(t.id.substr(7));\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n }\n }\n // refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)\n if (!this.init && this.refresh.container && this.container!=this.tiddler)\n story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox\n return true;\n}\n//}}}
5 things to do every day:\n[x(questions)] Ask questions\n[x(answers)] Seek answers\n[x(fun)] Have fun\n[x(difference)] Make a difference\n[x(smile)] Smile\n\n<script label="reset checklist">\n var t=store.getTiddler(story.findContainingTiddler(place).id.substr(7));\n if (t && t.tags) {\n var newTags=[];\n for (var i=0; i<t.tags.length; i++) {\n switch (t.tags[i]) {\n case "questions":\n case "answers":\n case "fun":\n case "difference":\n case "smile":\n break;\n default:\n newTags.push(t.tags[i]);\n }\n }\n store.saveTiddler(t.title,null,null,null,null,newTags);\n story.refreshTiddler(t.title,null,true); // force\n }\n return false;\n</script>
<script label="close">\n var panel=place;\n while (panel && panel.className!='sliderPanel' && panel.className!='floatingPanel')\n { panel=panel.parentNode; }\n if (!panel) { alert('not in a slider'); return false; }\n panel.style.display='none';\n var cookie=panel.button.sliderCookie;\n if (cookie && cookie.length) {\n config.options[cookie]=false;\n if (config.options[cookie]!=panel.button.defOpen)\n saveOptionCookie(cookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n</script><script>\n place.lastChild.style.fontWeight="normal";\n if (story.findContainingTiddler(place))\n place.lastChild.className="toolbar button";\n else {\n var s=place.lastChild.style\n s.fontSize="90%"; s.float="right";\n }\n</script>
/***\n!! CollapseTiddlersPlugin\n^^Author: Bradley Meck^^\n^^Source: http://gensoft.revhost.net/Collapse.html^^\n\n|ELS 2/24/2006: added fallback to "CollapsedTemplate if "WebCollapsedTemplate" is not found |\n|ELS 2/6/2006: added check for 'readOnly' flag to use alternative "WebCollapsedTemplate" |\n\n***/\n\nconfig.commands.collapseTiddler = {\ntext: "fold",\ntooltip: "Collapse this tiddler",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nif(e.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nif(e.getAttribute("template") != t ){\ne.setAttribute("oldTemplate",e.getAttribute("template"));\nstory.displayTiddler(null,title,t);\n}\n}\n}\n}\n\nconfig.commands.expandTiddler = {\ntext: "unfold",\ntooltip: "Expand this tiddler",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nstory.displayTiddler(null,title,e.getAttribute("oldTemplate"));\n}\n}\n\nconfig.macros.collapseAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"Collapse All","",function(){\nstory.forEachTiddler(function(title,tiddler){\nif(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE])\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nstory.displayTiddler(null,title,t);\n})})\n}\n}\n\nconfig.macros.expandAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"Expand All","",function(){\nstory.forEachTiddler(function(title,tiddler){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nif(tiddler.getAttribute("template") == t) story.displayTiddler(null,title,tiddler.getAttribute("oldTemplate"));\n})})\n}\n}\n\nconfig.commands.collapseOthers = {\ntext: "focus",\ntooltip: "Expand this tiddler and collapse all others",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nstory.forEachTiddler(function(title,tiddler){\nif(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nif (e==tiddler) t=e.getAttribute("oldTemplate");\n//////////\n// ELS 2006.02.22 - removed this line. if t==null, then the *current* view template, not the default "ViewTemplate", will be used.\n// if (!t||!t.length) t=!readOnly?"ViewTemplate":"WebViewTemplate";\n//////////\nstory.displayTiddler(null,title,t);\n}\n})\n}\n}
<div class='toolbar' macro='toolbar expandTiddler collapseOthers -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div><span macro='tiddler DoubleClickForFocus'></span>
/%RGB hexadecimal 216-color "Web safe" palette %/\n~~Source: Paul Petterson~~\n{{menubox{{{small{\n|bgcolor(#FFFFFF):FFF FFF |bgcolor(#CCCCCC):CCC CCC |bgcolor(#999999):999 999 |bgcolor(#666666):@@color(white):666 666@@ |bgcolor(#333333):@@color(white):333 333@@ |bgcolor(#000000):@@color(white):000 000@@ |bgcolor(#FFCC00):FFC C00 |bgcolor(#FF9900):~FF9 900 |bgcolor(#FF6600):@@color(white):~FF6 600@@ |bgcolor(#FF3300):@@color(white):~FF3 300@@ |>|>|>|>|>| |\n|bgcolor(#99CC00):99C C00 |>|>|>| |bgcolor(#CC9900):~CC9 900 |bgcolor(#FFCC33):FFC C33 |bgcolor(#FFCC66):FFC C66 |bgcolor(#FF9966):~FF9 966 |bgcolor(#FF6633):@@color(white):~FF6 633@@ |bgcolor(#CC3300):@@color(white):~CC3 300@@ |>|>|>| |bgcolor(#CC0033):@@color(white):~CC0 033@@ |\n|bgcolor(#CCFF00):CCF F00 |bgcolor(#CCFF33):CCF F33 |bgcolor(#333300):@@color(white):333 300@@ |bgcolor(#666600):@@color(white):666 600@@ |bgcolor(#999900):999 900 |bgcolor(#CCCC00):CCC C00 |bgcolor(#FFFF00):FFF F00 |bgcolor(#CC9933):~CC9 933 |bgcolor(#CC6633):@@color(white):~CC6 633@@ |bgcolor(#330000):@@color(white):330 000@@ |bgcolor(#660000):@@color(white):660 000@@ |bgcolor(#990000):@@color(white):990 000@@ |bgcolor(#CC0000):@@color(white):~CC0 000@@ |bgcolor(#FF0000):@@color(white):~FF0 000@@ |bgcolor(#FF3366):@@color(white):~FF3 366@@ |bgcolor(#FF0033):@@color(white):~FF0 033@@ |\n|bgcolor(#99FF00):99F F00 |bgcolor(#CCFF66):CCF F66 |bgcolor(#99CC33):99C C33 |bgcolor(#666633):@@color(white):666 633@@ |bgcolor(#999933):999 933 |bgcolor(#CCCC33):CCC C33 |bgcolor(#FFFF33):FFF F33 |bgcolor(#996600):@@color(white):996 600@@ |bgcolor(#993300):@@color(white):993 300@@ |bgcolor(#663333):@@color(white):663 333@@ |bgcolor(#993333):@@color(white):993 333@@ |bgcolor(#CC3333):@@color(white):~CC3 333@@ |bgcolor(#FF3333):@@color(white):~FF3 333@@ |bgcolor(#CC3366):@@color(white):~CC3 366@@ |bgcolor(#FF6699):@@color(white):~FF6 699@@ |bgcolor(#FF0066):@@color(white):~FF0 066@@ |\n|bgcolor(#66FF00):66F F00 |bgcolor(#99FF66):99F F66 |bgcolor(#66CC33):66C C33 |bgcolor(#669900):669 900 |bgcolor(#999966):999 966 |bgcolor(#CCCC66):CCC C66 |bgcolor(#FFFF66):FFF F66 |bgcolor(#996633):@@color(white):996 633@@ |bgcolor(#663300):@@color(white):663 300@@ |bgcolor(#996666):@@color(white):996 666@@ |bgcolor(#CC6666):@@color(white):~CC6 666@@ |bgcolor(#FF6666):@@color(white):~FF6 666@@ |bgcolor(#990033):@@color(white):990 033@@ |bgcolor(#CC3399):@@color(white):~CC3 399@@ |bgcolor(#FF66CC):@@color(white):~FF6 6CC@@ |bgcolor(#FF0099):@@color(white):~FF0 099@@ |\n|bgcolor(#33FF00):33F F00 |bgcolor(#66FF33):66F F33 |bgcolor(#339900):339 900 |bgcolor(#66CC00):66C C00 |bgcolor(#99FF33):99F F33 |bgcolor(#CCCC99):CCC C99 |bgcolor(#FFFF99):FFF F99 |bgcolor(#CC9966):~CC9 966 |bgcolor(#CC6600):@@color(white):~CC6 600@@ |bgcolor(#CC9999):~CC9 999 |bgcolor(#FF9999):~FF9 999 |bgcolor(#FF3399):@@color(white):~FF3 399@@ |bgcolor(#CC0066):@@color(white):~CC0 066@@ |bgcolor(#990066):@@color(white):990 066@@ |bgcolor(#FF33CC):@@color(white):~FF3 3CC@@ |bgcolor(#FF00CC):@@color(white):~FF0 0CC@@ |\n|bgcolor(#00CC00):00C C00 |bgcolor(#33CC00):33C C00 |bgcolor(#336600):@@color(white):336 600@@ |bgcolor(#669933):669 933 |bgcolor(#99CC66):99C C66 |bgcolor(#CCFF99):CCF F99 |bgcolor(#FFFFCC):FFF FCC |bgcolor(#FFCC99):FFC C99 |bgcolor(#FF9933):~FF9 933 |bgcolor(#FFCCCC):FFC CCC |bgcolor(#FF99CC):~FF9 9CC |bgcolor(#CC6699):@@color(white):~CC6 699@@ |bgcolor(#993366):@@color(white):993 366@@ |bgcolor(#660033):@@color(white):660 033@@ |bgcolor(#CC0099):@@color(white):~CC0 099@@ |bgcolor(#330033):@@color(white):330 033@@ |\n|bgcolor(#33CC33):33C C33 |bgcolor(#66CC66):66C C66 |bgcolor(#00FF00):00F F00 |bgcolor(#33FF33):33F F33 |bgcolor(#66FF66):66F F66 |bgcolor(#99FF99):99F F99 |bgcolor(#CCFFCC):CCF FCC |>|>| |bgcolor(#CC99CC):~CC9 9CC |bgcolor(#996699):@@color(white):996 699@@ |bgcolor(#993399):@@color(white):993 399@@ |bgcolor(#990099):@@color(white):990 099@@ |bgcolor(#663366):@@color(white):663 366@@ |bgcolor(#660066):@@color(white):660 066@@ |\n|bgcolor(#006600):@@color(white):006 600@@ |bgcolor(#336633):@@color(white):336 633@@ |bgcolor(#009900):009 900 |bgcolor(#339933):339 933 |bgcolor(#669966):669 966 |bgcolor(#99CC99):99C C99 |>|>| |bgcolor(#FFCCFF):FFC CFF |bgcolor(#FF99FF):~FF9 9FF |bgcolor(#FF66FF):@@color(white):~FF6 6FF@@ |bgcolor(#FF33FF):@@color(white):~FF3 3FF@@ |bgcolor(#FF00FF):@@color(white):~FF0 0FF@@ |bgcolor(#CC66CC):@@color(white):~CC6 6CC@@ |bgcolor(#CC33CC):@@color(white):~CC3 3CC@@ |\n|bgcolor(#003300):@@color(white):003 300@@ |bgcolor(#00CC33):00C C33 |bgcolor(#006633):@@color(white):006 633@@ |bgcolor(#339966):339 966 |bgcolor(#66CC99):66C C99 |bgcolor(#99FFCC):99F FCC |bgcolor(#CCFFFF):CCF FFF |bgcolor(#3399FF):339 9FF |bgcolor(#99CCFF):99C CFF |bgcolor(#CCCCFF):CCC CFF |bgcolor(#CC99FF):~CC9 9FF |bgcolor(#9966CC):@@color(white):996 6CC@@ |bgcolor(#663399):@@color(white):663 399@@ |bgcolor(#330066):@@color(white):330 066@@ |bgcolor(#9900CC):@@color(white):990 0CC@@ |bgcolor(#CC00CC):@@color(white):~CC0 0CC@@ |\n|bgcolor(#00FF33):00F F33 |bgcolor(#33FF66):33F F66 |bgcolor(#009933):009 933 |bgcolor(#00CC66):00C C66 |bgcolor(#33FF99):33F F99 |bgcolor(#99FFFF):99F FFF |bgcolor(#99CCCC):99C CCC |bgcolor(#0066CC):@@color(white):006 6CC@@ |bgcolor(#6699CC):669 9CC |bgcolor(#9999FF):999 9FF |bgcolor(#9999CC):999 9CC |bgcolor(#9933FF):@@color(white):993 3FF@@ |bgcolor(#6600CC):@@color(white):660 0CC@@ |bgcolor(#660099):@@color(white):660 099@@ |bgcolor(#CC33FF):@@color(white):~CC3 3FF@@ |bgcolor(#CC00FF):@@color(white):~CC0 0FF@@ |\n|bgcolor(#00FF66):00F F66 |bgcolor(#66FF99):66F F99 |bgcolor(#33CC66):33C C66 |bgcolor(#009966):009 966 |bgcolor(#66FFFF):66F FFF |bgcolor(#66CCCC):66C CCC |bgcolor(#669999):669 999 |bgcolor(#003366):@@color(white):003 366@@ |bgcolor(#336699):@@color(white):336 699@@ |bgcolor(#6666FF):@@color(white):666 6FF@@ |bgcolor(#6666CC):@@color(white):666 6CC@@ |bgcolor(#666699):@@color(white):666 699@@ |bgcolor(#330099):@@color(white):330 099@@ |bgcolor(#9933CC):@@color(white):993 3CC@@ |bgcolor(#CC66FF):@@color(white):~CC6 6FF@@ |bgcolor(#9900FF):@@color(white):990 0FF@@ |\n|bgcolor(#00FF99):00F F99 |bgcolor(#66FFCC):66F FCC |bgcolor(#33CC99):33C C99 |bgcolor(#33FFFF):33F FFF |bgcolor(#33CCCC):33C CCC |bgcolor(#339999):339 999 |bgcolor(#336666):@@color(white):336 666@@ |bgcolor(#006699):@@color(white):006 699@@ |bgcolor(#003399):@@color(white):003 399@@ |bgcolor(#3333FF):@@color(white):333 3FF@@ |bgcolor(#3333CC):@@color(white):333 3CC@@ |bgcolor(#333399):@@color(white):333 399@@ |bgcolor(#333366):@@color(white):333 366@@ |bgcolor(#6633CC):@@color(white):663 3CC@@ |bgcolor(#9966FF):@@color(white):996 6FF@@ |bgcolor(#6600FF):@@color(white):660 0FF@@ |\n|bgcolor(#00FFCC):00F FCC |bgcolor(#33FFCC):33F FCC |bgcolor(#00FFFF):00F FFF |bgcolor(#00CCCC):00C CCC |bgcolor(#009999):009 999 |bgcolor(#006666):@@color(white):006 666@@ |bgcolor(#003333):@@color(white):003 333@@ |bgcolor(#3399CC):339 9CC |bgcolor(#3366CC):@@color(white):336 6CC@@ |bgcolor(#0000FF):@@color(white):000 0FF@@ |bgcolor(#0000CC):@@color(white):000 0CC@@ |bgcolor(#000099):@@color(white):000 099@@ |bgcolor(#000066):@@color(white):000 066@@ |bgcolor(#000033):@@color(white):000 033@@ |bgcolor(#6633FF):@@color(white):663 3FF@@ |bgcolor(#3300FF):@@color(white):330 0FF@@ |\n|bgcolor(#00CC99):00C C99 |>|>|>| |bgcolor(#0099CC):009 9CC |bgcolor(#33CCFF):33C CFF |bgcolor(#66CCFF):66C CFF |bgcolor(#6699FF):669 9FF |bgcolor(#3366FF):@@color(white):336 6FF@@ |bgcolor(#0033CC):@@color(white):003 3CC@@ |>|>|>| |bgcolor(#3300CC):@@color(white):330 0CC@@ |\n|>|>|>|>|>| |bgcolor(#00CCFF):00C CFF |bgcolor(#0099FF):009 9FF |bgcolor(#0066FF):@@color(white):006 6FF@@ |bgcolor(#0033FF):@@color(white):003 3FF@@ |>|>|>|>|>| |\n|borderless|k\n}}}}}}
!!!!!comment from ELSDesignStudios on Saturday, August 05, 2006 11:15:16 AM\n<<<\nEnter your comment text here\n<<<\n!!!!!comment from ELSDesignStudios on Saturday, August 05, 2006 11:15:26 AM\n<<<\nanother comment\n<<<\n!!!!!comment from matts on Sön 20 Aug 23:08:42 2006\n<<<\na test\n<<<\n/%comment%/\n+++[add a comment...]>\n <html><textarea id="comment" rows="10" style="width:100%"></textarea>\n <input type="button" value="submit comment" onclick="addTiddlerComment(this.previousSibling.previousSibling);"></html><script>\n place.lastChild.firstChild.value="Enter your comment text here";</script>\n===\n<script>\nwindow.addTiddlerComment = function(place) {\n if (!window.story) window.story=window; if (!store.getTiddler) store.getTiddler=function(title) {return this.tiddlers[title]}\n var title = story.findContainingTiddler(place).id.substr(7);\n var tiddler=store.getTiddler(title);\n var pos=tiddler.text.indexOf("/%"+place.id+"%/");\n if (pos==-1) pos=tiddler.text.length;\n var txt="!!!!!comment from "+config.options.txtUserName+" on "+(new Date()).toLocaleString()+"\sn<<<\sn"+place.value+'\sn<<<\sn';\n tiddler.set(null,tiddler.text.substr(0,pos)+txt+tiddler.text.substr(pos));\n story.refreshTiddler(title,1,true);\n store.setDirty(true);\n}\n</script>
// // add TiddlyTools 'brand' to shadow SiteTitle (default for TiddlyTools starter documents)\n//{{{\nconfig.shadowTiddlers.SiteTitle += " {{medium{with [[TiddlyTools |http://www.TiddlyTools.com]] extensions}}}\sn";\n//}}}\n\n// // add shadows for common TiddlyTools default tiddlers used in starter documents\n//{{{\nconfig.shadowTiddlers.Welcome = "[[Welcome]]";\nconfig.shadowTiddlers.About = "[[About]]";\nconfig.shadowTiddlers.Download = "[[Download]]";\nconfig.shadowTiddlers.Contact = "[[Contact]]";\n//}}}\n\n// // add param handler for "hide:elementID"\n//{{{\nif (config.paramifiers)\n config.paramifiers.hide = { onstart: function(id) { var e=document.getElementById(id); if (e) e.style.display="none"; } };\n//}}}\n\n// // add param handler for "show:elementID"\n//{{{\nif (config.paramifiers)\n config.paramifiers.show = { onstart: function(id) { var e=document.getElementById(id); if (e) e.style.display="block"; } };\n//}}}\n\n// // add param handler for "group:tiddlerName"\n//{{{\nif (config.paramifiers)\n config.paramifiers.group = { onstart: function(id) { story.displayTiddlers(null,store.getTiddlerText(id,"").readBracketedList()) } };\n//}}}\n\n// // force no animation\n//{{{\nconfig.options.chkAnimate=false;\n//}}}
<html><hide linebreaks>\n<form method=post target=email action="http://www.elsdesign.com/cgi-bin/mailtext.cgi" style="display:inline">\n<input type=hidden name=to value="tiddlytools@elsdesign.com">\n<input type=hidden name=subject value="TiddlyTools feedback">\n<input type=hidden name=prefix value="#IP">\n<input type=hidden name=url value="javascript:window.close();">\n<input type=text name=from style="width:49%" value="your name" onfocus="this.select()"><!--\n--><input type=text name=reply style="width:49%" value="your email address" onfocus="this.select()"><br>\n<font size=-2>Your message:</font><br>\n<textarea rows=7 cols=50 name=text style="width:98%" onfocus="this.select()"></textarea><br>\n<font size=-2>Enter your information, then press </font><input type=submit value="send"></form></html>\n----\n@@display:block;font-size:7pt;line-height:110%;Note: If you are reporting a problem with a TiddlyTools plugin, please provide a ''full, verifiable URL'' for your document, along with an accurate, helpful ''summary description'' of the problem. ''Step-by-step procedures for reproducing the problem'' are essential to finding the cause and determining a fix (if any). However, don't assume that your particular computing environment can be readily replicated... you may be asked to ''actively participate'' in the debugging process by providing detailed diagnostic information (error messages, screen snapshots, etc) as well ''testing any potential fixes prior to their release'' to the general public.@@<<tiddler HideTiddlerTags>>
/***\nCopyTiddlerPlugin\nAuthor: TimMorgan\nSource: http://ziddlywiki.org/#CopyTiddlerPlugin\n\nadds a "copy" option to duplicate a tiddler\n***/\n//{{{\nconfig.shadowTiddlers.EditTemplate = "<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler copyTiddler deleteTiddler'></div>\sn<div class='title' macro='view title'></div>\sn<div class='editor' macro='edit title'></div>\sn<div class='editor' macro='edit text'></div>\sn<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>";\n\nconfig.commands.copyTiddler = {\n text: 'copy',\n hideReadOnly: true,\n tooltip: 'Make a copy of this tiddler',\n handler: function(event,src,title) {\n story.displayTiddler(null,title,DEFAULT_VIEW_TEMPLATE);\n var tiddler = store.fetchTiddler(title);\n var newTitle = 'Copy of ' + title;\n var newTiddler = store.createTiddler(newTitle);\n newTiddler.text = tiddler.text;\n newTiddler.tags = tiddler.tags;\n story.displayTiddler(null,newTitle,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(newTitle,"title");\n return false;\n }\n};\n//}}}
// // THIS IS A TEMPORARY HACK. When a slider is opened/closed with animation enabled, the opacity/alphafilter styles are incrementally adjusted to create a "fade-in/fade-out" effect. However, this effect seems to render incredibly slowly on FireFox, and even slower when the background image is a complex JPG photo image, making animation impractical to use.\n\n// // This TEMPORARY HACK disables the opacity/alphafilter handling, while leaving the 'incremental height' animation intact. The resulting increase in performance makes it possible to leave the animation enabled so that you can benefit from the visual cues it provides.\n\n//{{{\nSlider.prototype.tick = function()\n{\n this.progress += this.step;\n if(this.progress < 0 || this.progress > 1)\n {\n this.stop();\n return false;\n }\n else\n {\n var f = Animator.slowInSlowOut(this.progress);\n var h = this.realHeight * f;\n this.element.style.height = h + "px";\n// this.element.style.opacity = f;\n// this.element.style.filter = "alpha(opacity:" + f * 100 +")";\n return true;\n }\n}\n//}}}\n
/***\n''Date Plugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#DatePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n^^last update: <<date tiddler "DDD, MMM DDth, YYYY hh:0mm:0ss">>^^\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nYou can ''specify a date using a combination of year, month, and day number values or mathematical expressions (such as "Y+1" or "D+30")'', and then just display it as formatted date text, or create a ''link to a 'dated tiddler''' for quick blogging, or create a ''popup menu'' containing the dated tiddler link plus links to ''tiddlers that were changed'' as well as any ''scheduled reminders'' for that date.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.date = {major: 2, minor: 2, revision: 1, date: new Date(2006,5,9)};\n//}}}\n\n//{{{\nconfig.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\nconfig.macros.date.handler = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format) format=config.macros.date.format;\n if (!linkformat) linkformat=config.macros.date.linkformat;\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n link.date = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n link.style.fontStyle="normal";\n }\n\n // format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date))\n { link.style.fontStyle="normal"; link.style.fontWeight="bold"; }\n if (hasReminders(date))\n { link.style.textDecoration="underline"; }\n if(isToday(date))\n { link.style.border="1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )\n { place.style.background = config.macros.date.weekendbg; }\n if(isHoliday(date)&&(config.macros.date.holidaybg!=""))\n { place.style.background = config.macros.date.holidaybg; }\n if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))\n { place.style.background = config.macros.date.modifiedsbg; }\n if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))\n { place.style.background = config.macros.date.linkedbg; }\n if (hasReminders(date)&&(config.macros.date.remindersbg!=""))\n { place.style.background = config.macros.date.remindersbg; }\n if(isToday(date)&&(config.macros.date.todaybg!=""))\n { place.style.background = config.macros.date.todaybg; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return (config.macros.date.weekend[date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i < config.macros.date.holidays.length; i++) {\n var holiday=config.macros.date.holidays[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = createTiddlerPopup(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))\n createTiddlyLink(popup,this.date.formatString(this.linkformat),true);\n else\n createTiddlyText(popup,this.date.formatString(this.linkformat));\n addModifiedsToPopup(popup,this.date,this.format);\n addRemindersToPopup(popup,this.date,this.linkformat);\n }\n scrollToTiddlerPopup(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changes:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!config.macros.date.reminders)\n config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return (config.macros.date.reminders[date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
// // date plugin calendar colors\n//{{{\nconfig.macros.date.holidays=[ "01/01", "07/04", "07/24", "11/24" ]; // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\nconfig.macros.date.weekend=[ 1,0,0,0,0,0,1 ]; // day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6\nconfig.macros.date.format="YYYY.0MM.0DD"; // default date display format\nconfig.macros.date.linkformat="YYYY.0MM.0DD"; // 'dated tiddler' link format\nconfig.macros.date.weekendbg="#c0c0c0";\nconfig.macros.date.holidaybg="#ffaace";\nconfig.macros.date.modifiedsbg="#bbeeff";\nconfig.macros.date.linkedbg="#babb1e";\nconfig.macros.date.remindersbg="#c0ffee";\n//}}}\n
Welcome
/***\n''DeliciousPlayTaggerPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#DeliciousPlayTaggerPlugin\nadapted from original source: http://del.icio.us/js/playtagger\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\n!!!!!Usage\n\nThis plugin defines an object class "Delicious.Mp3", which defines methods for adding the del.icio.us "play tagger" to any mp3 URLs embedded in tiddler content. Simply place {{{<<deliciousPlayTagger>>}}} into the tiddler content ''following any links to mp3 URLs'', and they will be 'del.icio.us'ly tagged to be played with the flash player.\n\n!!!!!Example\nMy favorite [[Friday Night Music|http://www.FridayNightMusic.com]] "Free Jazz" improv compositions:\nhttp://www.elsdesign.com/fnm/audio/030502-5.mp3 ("In The Shadows")\nhttp://www.elsdesign.com/fnm/audio/001103-4.mp3 ("The Sky's The Limit")\nhttp://www.elsdesign.com/fnm/audio/020830-6.mp3 ("Good Morning, Elijah")\n\n<<deliciousPlayTagger>>\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DeliciousPlayTaggerPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for this plugin^^\n<<<\n!!!!!Revision History\n<<<\n''2006.02.21 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\nadapted from original source code located at: http://del.icio.us/js/playtagger\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.deliciousPlayTagger= {major: 1, minor: 0, revision: 0, date: new Date(2006,2,21)};\n\nconfig.macros.deliciousPlayTagger = { };\nconfig.macros.deliciousPlayTagger.handler = function(place,macroName,params) { Delicious.Mp3.go(place); }\n\nif(typeof(Delicious) == 'undefined') Delicious = {}\nDelicious.Mp3 = {\n playimg: null,\n player: null,\n go: function(place) { // ELS 2006.02.21: added 'place' param\n if (!place) var place=document;\n var all = place.getElementsByTagName('a')\n for (var i = 0, o; o = all[i]; i++) {\n if(o.href.match(/\s.mp3$/i)) {\n var img = document.createElement('img')\n img.src = 'http://del.icio.us/static/img/mp3/play.gif'; img.title = 'listen'\n img.height = img.width = 12\n img.style.marginRight = '0.5em'\n img.style.cursor = 'pointer'\n img.onclick = Delicious.Mp3.makeToggle(img, o.href)\n o.parentNode.insertBefore(img, o)\n }}},\n toggle: function(img, url) {\n if (Delicious.Mp3.playimg == img) Delicious.Mp3.destroy()\n else {\n if (Delicious.Mp3.playimg) Delicious.Mp3.destroy()\n var a = img.nextSibling, c=''\n if (document.defaultView && document.defaultView.getComputedStyle) c = document.defaultView.getComputedStyle(a,null).getPropertyValue('color')\n else if (a.currentStyle) c = a.currentStyle['color']\n c = c.replace(/^rgb|[ ()]/g, '')\n var hex = c.match(/^#?([a-f0-9]{6})$/), hexSm = c.match(/^#?([a-f0-9]{3})$/), rgb = c.match(/^([0-9]+),([0-9]+),([0-9]+)$/)\n if (rgb) { var c16 = "0123456789abcdef", c=''; for(var i=1,d;d=rgb[i];i++) { var j=d%16; c=c+c16.charAt((d-j)/16)+c16.charAt(j) } }\n else if (hex) c = hex[1]\n else if (hexSm) c = hexSm[1].charAt(0) + hexSm[1].charAt(0) + hexSm[1].charAt(1) + hexSm[1].charAt(1) + hexSm[1].charAt(2) + hexSm[1].charAt(2)\n else c = "000000"\n img.src = 'http://del.icio.us/static/img/mp3/stop.gif'; Delicious.Mp3.playimg = img;\n Delicious.Mp3.player = document.createElement('span')\n Delicious.Mp3.player.innerHTML = '<object style="vertical-align:bottom;margin-right:0.2em" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' +\n 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"' +\n 'width="100" height="14" id="player" align="middle">' +\n '<param name="wmode" value="transparent" />' +\n '<param name="allowScriptAccess" value="sameDomain" />' +\n '<param name="flashVars" value="theLink='+url+'&amp;fontColor='+c+'" />' +\n '<param name="movie" value="http://del.icio.us/static/swf/playtagger.swf" /><param name="quality" value="high" />' +\n '<embed style="vertical-align:bottom;margin-right:0.2em" src="http://del.icio.us/static/swf/playtagger.swf" flashVars="theLink='+url+'&amp;fontColor='+c+'"'+\n 'quality="high" wmode="transparent" width="100" height="14" name="player"' +\n 'align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"' +\n ' pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>'\n img.parentNode.insertBefore(Delicious.Mp3.player, img.nextSibling)\n }},\n destroy: function() {\n Delicious.Mp3.playimg.src = 'http://del.icio.us/static/img/mp3/play.gif'; Delicious.Mp3.playimg = null\n Delicious.Mp3.player.removeChild(Delicious.Mp3.player.firstChild); Delicious.Mp3.player.parentNode.removeChild(Delicious.Mp3.player); Delicious.Mp3.player = null\n },\n makeToggle: function(img, url) { return function(){ Delicious.Mp3.toggle(img, url) }}\n}\n\n//}}}
/***\n''DisableWikiLinksPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#DisableWikiLinksPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nThis 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 {{{[[...]]}}}. Note: WikiWords contained in default ''shadow'' tiddlers will still be automatically linked. 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 AdvancedOptions or SideBarTabs)\n\n!!!!!Configuration\n<<<\nSelf-contained control panel:\n<<option chkDisableWikiLinks>> Disable automatic WikiWord tiddler links\n<<option chkDontDisableShadowWikiLinks>> ... except in shadow tiddler content\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DisableWikiLinksPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.05.24 [1.1.0]'' added option to NOT bypass automatic wikiword links when displaying default shadow content (default is to auto-link shadow content)\n''2006.02.05 [1.0.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2005.12.09 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.disableWikiLinks= {major: 1, minor: 1, revision: 0, date: new Date(2006,5,24)};\n\nif (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks= false;\nif (config.options.chkDontDisableShadowWikiLinks==undefined) config.options.chkDontDisableShadowWikiLinks=true;\n\n// find the formatter for wikiLink and replace handler with 'pass-thru' rendering\ninitDisableWikiLinksFormatter();\nfunction initDisableWikiLinksFormatter() {\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);\n config.formatters[i].coreHandler=config.formatters[i].handler;\n config.formatters[i].handler=function(w) {\n // if not enabled, just do standard WikiWord link formatting\n var skipShadow=(config.options.chkDontDisableShadowWikiLinks && w.tiddler && store.isShadowTiddler(w.tiddler.title) && !store.tiddlerExists(w.tiddler.title));\n if (!config.options.chkDisableWikiLinks || skipShadow) return this.coreHandler(w);\n // supress any leading "~" (if present)\n var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;\n w.outputText(w.output,w.matchStart+skip,w.nextMatch)\n }\n}\n//}}}\n
<script label="display all tiddlers">\n var tiddlers=store.getTiddlers('title');\n var titles=[];\n for (var t=0;t<tiddlers.length; t++)\n titles.push(tiddlers[t].title);\n story.closeAllTiddlers();\n story.displayTiddlers(null,titles);\n return false;\n</script>
!!!!Simple reminders that fire on the same month/day of every year.\n*<<reminder month:1 day:1 title:"New Year's Day" >>\n*<<reminder month:2 day:2 title:"Groundhog Day" >>\n\n!!!!Offset reminders\nThese are all holidays that are specified as the Nth DAYOFWEEK in Month.\n*President's Day is the third Monday of February \n**<<reminder month:2 day:15 offsetdayofweek:1 title:"President's Day">>\n*Mother's Day is the second Sunday of May\n**<<reminder month:5 day:8 offsetdayofweek:0 title:"Mother's Day">>\n\n*Memorial Day is the last Monday of May (note that offsetdayofweek is a negative number, meaning match backwards)\n**<<reminder month:5 day:31 offsetdayofweek:-1 title:"Memorial Day">>\n\n!!!Ignore these\nThese are just here to fill in the common US holidays\n*<<reminder month:2 day:14 title:"Valentine's Day" >>\n*<<reminder month:4 day:1 title:"April Fool's Day" >>\n*<<reminder month:4 day:15 title:"Tax day">>\n*<<reminder month:4 day:22 title:"Earth Day">>\n*<<reminder month:6 day:14 title:"Flag Day" >>\n*Father's Day is the third Sunday of June \n**<<reminder month:6 day:15 offsetdayofweek:0 title:"Father's Day">>\n*<<reminder month:7 day:4 title:"Independence Day" >>\n*Labor Day is the first Monday of September\n**<<reminder month:9 day:1 offsetdayofweek:1 title:"Labor Day">>\n*Columbus Day is the second Monday of October\n**<<reminder month:10 day:8 offsetdayofweek:1 title:"Columbus Day">>\n*<<reminder month:10 day:31 title:"Halloween" >>\n*<<reminder month:11 day:11 title:"Veteran's Day" >>\n*Thanksgiving(US) is the third Thursday of November\n**<<reminder month:11 day:24 offsetdayofweek:4 title:"Thanksgiving (US)">>\n*<<reminder month:12 day:25 title:"Christmas Day" >>
<script>\n if (!story.findContainingTiddler(place)) return;\n var t=story.findContainingTiddler(place); // get the tiddler element\n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"viewer")) t.ondblclick=null; // disable double-click\n</script>
<script>\n var t=story.findContainingTiddler(place); // get the tiddler element\n if (!t) return;\n // if CollapseTiddlerPlugin is installed, double-click on title to 'focus' a tiddler\n if (config.commands.collapseOthers.handler!=undefined)\n t.ondblclick=function(){config.commands.collapseOthers.handler(null,place,t.id.substr(7));}\n</script>
{{small{To download this document, ''//right-click//'' on any of the following links and then select ''//Save link as...//'' from the popup menu:\n\n''http://www.TiddlyTools.com/index.html'':\n>This document. Includes all content (plugins, scripts, stylesheets, templates, etc.) except for background images and embedded graphics.\n''http://www.TiddlyTools.com/new.html'':\n>A 'starter' document containing a subset of ~TiddlyTools enhanced menus/features, without any of the other ~TiddlyTools content. After downloading, the GettingStarted tiddler helps you configure ~TiddlyTools extended options as well as providing automated "one-click" importing of selected ~TiddlyTools plugin/script "packages" directly from http://www.TiddlyTools.com/\n''http://www.TiddlyTools.com/images.zip'':\n>Background images for stylesheets [unzip into 'images' subdirectory]. //note: some images may be copyrighted. ''"limited personal use" of these images is allowed, but re-distribution or commercial use of specific images is prohibited without prior written permission from the rights holder.''//\n''http://www.TiddlyTools.com/TW.html'':\n>A copy of the ~TiddlyWiki v<<version>> standard distribution used to build this release of TiddlyTools.\n''http://www.TiddlyTools.com/TW+ImportExport.html'':\n>An empty copy of ~TiddlyWiki v<<version>> with [[ImportTiddlersPlugin]] and [[ExportTiddlersPlugin]] pre-installed so you can easily install/archive plugins and other tiddler content from other TiddlyWiki documents.\n}}}
[[ELS Design Studios|http://www.elsdesign.com]] was formally established in 1995, and specializes in ''interaction design'', ''visual design'', and ''information architecture'' to produce interactive systems and information-rich presentations for businesses, organizations, and individuals. Our user-centric design approach, handcrafted production, and personalized service enable us to create ''powerful, effective interactive experiences'' for your application end-users and web site visitors.\n\n@@display:block;text-align:center;font-size:18pt;color:#0c0;font-family:"trebuchet ms";//Your web site or application can be more\nintuitive, expressive, functional... effective!//@@\n''We work closely //with// you to focus your imagination'' and identify well-defined, practical design goals for your project. Through a collaborative process, we help you to refine your message and set the right tone and personality for your site to match your creative and/or business sensibilities and ''ensure that your style, strategy, message and vision comes through'' in the final result.\n\nAt ELS Design Studios, our approach emphasizes the quality of the visitor experience by providing effective, robust, well-tested functionality, to deliver presentations that communicate effectively and help people to achieve their goals. We draw upon years of experience producing commercial software products to guide the planning, design, and development processes.\n\nThroughout the various stages of design and implementation, we provide guidance and recommendations for your decision-making processes, while insulating you from the arcane technological details that can divert your attention from achieving your project goals. We take the time to explain things clearly, so you can make informed decisions that will lead a highly-effective web site that is uniquely suited to your specific purposes.\n\n----\n@@font-size:12pt;Whether your site is presenting your personal creativity or furthering your business objectives, ''our role is to help you to realize YOUR vision'' for YOUR web site or application interface.@@\n----\n\n@@display:block;font-size:8pt;line-height:110%;The founder and principal designer, Eric L. Shulman, brings a wealth of direct, intensive experience in developing complex interactive systems. His designs emphasize both ease-of-use and rich functionality to deliver 'best-of-breed' user experiences. His professional and academic qualifications include an interdisciplinary degree in "Interactive Systems Design" from [[Carnegie-Mellon University|http://www.cmu.edu]] (1985), as well as many years of user interface and software design work on significant commercial products.\n\nAt [[Lotus Development Corporation|http://www.lotus.com]], he was directly involved in the innovation of new graphical interface techniques for "1-2-3", their flagship spreadsheet product. He has also been a Senior Research Engineer with [[OpenData, Inc.|http://www.opendata.com]], and as well as a key contributor in the Product Design Group at [[Clarify, Inc.|http://www.clarify.com]], where he developed comprehensive interface design standards for their suite of Customer Relationship Management (CRM) applications, and provided cross-team guidance and consultation for their marketing, engineering, quality assurance, and documentation organizations.@@\n
[[StyleSheetAdjustments]]\n[[BrightText]]\n/* ==== Edge of Night ==== */\n/*{{{*/\nbody\n { background-image: url('[[Edge of Night Background]]'); background-color:#113; }\n.menubox\n { background-image: none; background-color: #002; }\n#mainMenu .menubox\n { background-image: url('[[Edge of Night Background]]'); }\n.viewer\n { background-image: url('[[TexturesMarbleBlack]]'); background-color:#111; border: 1px solid #999; -moz-border-radius:1em; padding:1em; }\n.header\n { background-image: none; background-color:transparent; color:#ccf; border:0; }\n#siteSubtitle\n { color:#0c0; }\n.floatingPanel, .attachPanel, #importPanel, #exportPanel, .tiddlyCard\n { background: #eee; background-image: url('[[TexturesParchmentGray]]');}\n.floatingPanel a, .attachPanel a, #importPanel a, #exportPanel a, \n.floatingPanel .button, .attachPanel .button, #importPanel .button, #exportPanel .button,\n.floatingPanel .tiddlyLinkExisting, .attachPanel .tiddlyLinkExisting, #importPanel .tiddlyLinkExisting, #exportPanel .tiddlyLinkExisting,\n { color:#009; }\n.siteMenu .floatingPanel, #messageArea \n { background: #eef; }\n.tiddlyCard\n { background: #eee; }\n.groupbox { background:#ddf; }\n\n.viewer h1,.viewer h2,.viewer h3,.viewer h4,.viewer h5 { background: #666; color:#fff; }\n\n#sidebarTabs .tabContents \n { background-image:none; background-color:#113; color:#fff; }\n#sidebarTabs .tabContents a, #sidebarTabs .tabContents .button, #sidebarTabs .tabContents .tiddlyLinkExisting\n { color:#99f; }\n/*}}}*/
| source file|{{{...images\ssunset.jpg}}}|\n| attached on|20 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/sunset.jpg|images/sunset.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|Edge of Night Background]] or [img[tooltip|Edge of Night Background][link]]}}}\n[img[tooltip|Edge of Night Background]]\n<<<\n
/***\n!!!Usage:\nembed an 'edit' link in tiddler content to invoke edit on any specified tiddler title\n{{{<<editTiddler TiddlerName>>}}}\n!!!Created:\n2006.04.28 ELS\n!!!Code:\n***/\n//{{{\nconfig.macros.editTiddler={\n handler: function(place,macroName,params) {\n createTiddlyButton(place,"edit","edit tiddler: "+params[0],this.onclick).which=params[0];\n },\n onclick: function(e) {\n story.displayTiddler(null,this.which,DEFAULT_EDIT_TEMPLATE);\n }\n}\n//}}}
/% usage:\n <<tiddler ExpandSlidersScript with: elementID expandlabel collapselabel>>\n\n%/<script label="collapse">\n // if 'in a tiddler', expand all sliders... otherwise, expand based on passed in element ID\n var here=story.findContainingTiddler(place);\n if (!here) {\n if ("$1"=="$"+"1") { alert("ExpandSlidersScript: not in a tiddler, please use 'with: elementID' syntax"); return; }\n var here=document.getElementById("$1");\n if (!here) { alert("ExpandSlidersScript: unknown elementID: '$1'"); return; }\n }\n var expandlabel="expand"; if ("$2"!="$"+"2") var expandlabel="$2";\n var collapselabel="collapse"; if ("$3"!="$"+"3") var collapselabel="$3";\n var elems=here.getElementsByTagName("*");\n var state=(place.innerHTML.toLowerCase().indexOf("expand")!=-1)?"none":"block";\n for (var e=0; e<elems.length; e++) {\n var p=elems[e].sliderPanel;\n if (p && p.className=="sliderPanel") {\n if (p.style.display==state) window.onClickNestedSlider({target:elems[e]});\n }\n }\n place.innerHTML=state=="none"?collapselabel:expandlabel;\n return false;\n</script><script>\n place.lastChild.className="button";\n var collapselabel="collapse"; if ("$3"!="$"+"3") var collapselabel="$3";\n place.lastChild.innerHTML=collapselabel;\n</script>
<<exportTiddlers inline>>
/***\n''Export Tiddlers Plugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ExportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful 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.)\n\nExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...). An interactive control panel lets you specify a destination, and then select which tiddlers to export. A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded. ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''\n\n!!!!!Inline interface (live)\n<<<\n<<exportTiddlers inline>>\n<<<\n!!!!!Usage\n<<<\nOptional "special tiddlers" used by this plugin:\n* SiteUrl^^\nURL for official server-published version of document being viewed (used in XML export)\ndefault: //none//^^\n* SiteHost^^\nhost name/address for remote server (e.g., "www.server.com" or "192.168.1.27")\ndefault: //none//^^\n* SitePost^^\nremote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")\ndefault: //none//^^\n* SiteParams^^\narguments (if any) for server-side receiving script\ndefault: //none//^^\n* SiteNotify^^\naddresses (if any) for sending automatic server-side email notices\ndefault: //none//^^\n* SiteID^^\nusername or other authorization identifier for login-controlled access to remote server\ndefault: current TiddlyWiki username (e.g., "YourName")^^\n* SiteDate^^\nstored date/time stamp for most recent published version of document\ndefault: current document.modified value (i.e., the 'file date')^^\n<<<\n!!!!!Example\n<<<\n<<exportTiddlers>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<exportTiddlers>>}}} macro^^\n<<<\n!!!!!Revision History\n<<<\n''2006.05.11 [2.2.2]''\nin createExportPanel, removed call to addNotification() to no longer auto-refresh the list every time a tiddler is changed. Instead, call refreshExportList(0) only when the panel is first rendered and each time it is made visible. Prevents unneeded feedback messages from being displayed and increases overall document performance, since the listbox is no longer being updated each time a tiddler is saved.\n''2006.05.02 [2.2.1]''\nUse displayMessage() to show number of selected tiddlers instead of updating listbox 'header' item after each selection. Prevents awkward 'scroll-to-top' behavior that made multi-select via ctrl-click nearly impossible. Reported by Paul Reiber.\n''2006.04.29 [2.2.0]''\nNew features: "Notes" are free-form text that is inserted in the header of a TWDIV export file. When exporting to a server, the "notify" checkbox indicates that server-side script processing should send an email message when the export file is stored on the server. Comma-separated addresses may be typed in, or pre-defined in the SiteNotify tiddler.\n''2006.03.29 [2.1.3]''\nadded calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.\n''2006.02.12 [2.1.2]''\nadded var to unintended global 'tags' in matchTags(). Avoids FF1501 bug when filtering by tags. (based on report by TedPavlic)\n''2006.02.04 [2.1.1]''\nadded var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.02.02 [2.1.0]''\nAdded support for output of complete TiddlyWiki documents. Let's you use ExportTiddlers to generate 'starter' documents from selected tiddlers.\n''2006.01.21 [2.0.1]''\nDefer initial panel creation and only register a notification function when panel first is created\nin saveChanges 'hijack', create panel as needed. Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.24 [0.9.5]''\nMinor adjustments to CSS to force correct link colors regardless of TW stylesheet selection\n''2005.12.16 [0.9.4]''\nDynamically create/remove exportPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.\n''2005.11.15 [0.9.2]''\nadded non-Ajax post function to bypass javascript security restrictions on cross-domain I/O. Moved AJAX functions to separate tiddler (no longer needed here). Generalized HTTP server to support UnaWiki servers\n''2005.11.08 [0.9.1]''\nmoved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time. This allows exportPanel to be placed within the same containing element as the "export tiddlers" button, so that relative positioning can be achieved.\n''2005.10.28 [0.9.0]''\nadded 'select opened tiddlers' feature\nBased on a suggestion by Geoff Slocock\n''2005.10.24 [0.8.3]''\nCorrected hijack of 'save changes' when using http:\n''2005.10.18 [0.8.2]''\nadded AJAX functions\n''2005.10.18 [0.8.1]''\nCorrected timezone handling when filtering for date ranges.\nImproved error checking/reporting for invalid filter values and filters that don't match any tiddlers.\nExporting localfile-to-localfile is working for IE and FF\nExporting server-to-localfile works in IE (after ActiveX warnings), but has security issues in FF\nCross-domain exporting (localfile/server-to-server) is under development\nCookies to remember filter settings - coming soon\nMore style tweaks, minor text changes and some assorted layout cleanup.\n''2005.10.17 [0.8.0]''\nFirst pre-release.\n''2005.10.16 [0.7.0]''\nfilter by tags\n''2005.10.15 [0.6.0]''\nfilter by title/text\n''2005.10.14 [0.5.0]''\nexport to local file (DIV or XML)\n''2005.10.14 [0.4.0]''\nfilter by start/end date\n''2005.10.13 [0.3.0]''\npanel interaction\n''2005.10.11 [0.2.0]''\npanel layout\n''2005.10.10 [0.1.0]''\ncode framework\n''2005.10.09 [0.0.0]''\ndevelopment started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // +++[version]\n//{{{\nversion.extensions.exportTiddlers = {major: 2, minor: 2, revision: 2, date: new Date(2006,5,2)};\n//}}}\n// //===\n\n// // +++[macro handler]\n//{{{\nconfig.macros.exportTiddlers = {\n label: "export tiddlers",\n prompt: "Copy selected tiddlers to an export document",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields\n};\n\nconfig.macros.exportTiddlers.handler = function(place,macroName,params) {\n if (params[0]!="inline")\n { createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }\n var panel=createExportPanel(place);\n panel.style.position="static";\n panel.style.display="block";\n}\n\nfunction createExportPanel(place) {\n var panel=document.getElementById("exportPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");\n panel=createTiddlyElement(place,"span","exportPanel",null,null)\n panel.innerHTML=config.macros.exportTiddlers.html;\n exportShowPanel(document.location.protocol);\n exportInitFilter();\n refreshExportList(0);\n return panel;\n}\n\nfunction onClickExportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createExportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n if (panel.style.display!="none") refreshExportList(0); // update list when panel is made visible\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n// //===\n\n// // +++[Hijack saveChanges] diverts 'notFileUrlError' to display export control panel instead\n//{{{\nwindow.coreSaveChanges=window.saveChanges;\nwindow.saveChanges = function()\n{\n if (document.location.protocol=="file:") { coreSaveChanges(); return; }\n var e = window.event;\n var parent=e?resolveTarget(e).parentNode:document.body;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent) panel=createExportPanel(parent);\n exportShowPanel(document.location.protocol);\n if (parent==document.body) { panel.style.left="30%"; panel.style.top="30%"; }\n panel.style.display = "block" ;\n}\n//}}}\n// //===\n\n// // +++[IE needs explicit scoping] for functions called by browser events\n//{{{\nwindow.onClickExportMenu=onClickExportMenu;\nwindow.onClickExportButton=onClickExportButton;\nwindow.exportShowPanel=exportShowPanel;\nwindow.exportShowFilterFields=exportShowFilterFields;\nwindow.refreshExportList=refreshExportList;\n//}}}\n// //===\n\n// // +++[CSS] for floating export control panel\n//{{{\nconfig.macros.exportTiddlers.css = '\s\n#exportPanel {\s\n display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\s\n#exportPanel textarea { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\s\n#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\s\n#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#exportPanel .rad { width:auto;border:0 }\s\n#exportPanel .chk { width:auto;border:0 }\s\n#exportPanel .btn { width:auto; }\s\n#exportPanel .btn1 { width:98%; }\s\n#exportPanel .btn2 { width:48%; }\s\n#exportPanel .btn3 { width:32%; }\s\n#exportPanel .btn4 { width:24%; }\s\n#exportPanel .btn5 { width:19%; }\s\n';\n//}}}\n// //===\n\n// // +++[HTML] for export control panel interface\n//{{{\nconfig.macros.exportTiddlers.html = '\s\n<!-- output target and format -->\s\n<table cellpadding="0" cellspacing="0"><tr><td width=50%>\s\n export to\s\n <select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\s\n <option value="file:" SELECTED>this computer</option>\s\n <option value="http:">web server (http)</option>\s\n <option value="https:">secure web server (https)</option>\s\n <option value="ftp:">file server (ftp)</option>\s\n </select>\s\n</td><td width=50%>\s\n output format\s\n <select id="exportFormat" size=1>\s\n <option value="DIV">TiddlyWiki export file</option>\s\n <option value="TW">TiddlyWiki document</option>\s\n <option value="XML">RSS feed (XML)</option>\s\n </select>\s\n</td></tr></table>\s\n\s\n<!-- export to local file -->\s\n<div id="exportLocalPanel" style="margin-top:5px;">\s\nlocal path/filename<br>\s\n<input type="file" id="exportFilename" size=57 style="width:100%"><br>\s\n</div><!--panel-->\s\n\s\n<!-- export to http server -->\s\n<div id="exportHTTPPanel" style="display:none;margin-top:5px;">\s\n<table><tr><td align=left>\s\n server location, script, and parameters<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="exportNotify"\s\n onClick="document.getElementById(\s'exportSetNotifyPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> notify\s\n</td></tr></table>\s\n<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\s\n<div id="exportSetNotifyPanel" style="display:none">\s\n send email notices to<br>\s\n <input type="text" id="exportNotifyTo" onfocus="this.select()"><br>\s\n</div>\s\n</div><!--panel-->\s\n\s\n<!-- export to ftp server -->\s\n<div id="exportFTPPanel" style="display:none;margin-top:5px;">\s\n<table cellpadding="0" cellspacing="0" width="32%"><tr valign="top"><td>\s\n host server<br>\s\n <input type="text" id="exportFTPHost" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n username<br>\s\n <input type="text" id="exportFTPID" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n password<br>\s\n <input type="password" id="exportFTPPW" onfocus="this.select()"><br>\s\n</td></tr></table>\s\nFTP path/filename<br>\s\n<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- notes -->\s\nnotes<br>\s\n<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \s\n\s\n<!-- list of tiddlers -->\s\n<table><tr align="left"><td>\s\n select:\s\n <a href="JavaScript:;" id="exportSelectAll"\s\n onclick="onClickExportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n &nbsp;opened&nbsp;</a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportListSmaller"\s\n onclick="onClickExportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n</td></tr></table>\s\n<select id="exportList" multiple size="10" style="margin-bottom:5px;"\s\n onchange="refreshExportList(this.selectedIndex)">\s\n</select><br>\s\n</div><!--box-->\s\n\s\n<!-- selection filter -->\s\n<div id="exportFilterPanel" style="display:none">\s\n<table><tr align="left"><td>\s\n selection filter\s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportHideFilter"\s\n onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\s\n</td></tr></table>\s\n<div class="box">\s\n<input type="checkbox" class="chk" id="exportFilterStart" value="1"\s\n onclick="exportShowFilterFields(this)"> starting date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportStartDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterStartBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\s\n onclick="exportShowFilterFields(this)"> ending date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportEndDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterEndBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id=exportFilterTags value="1"\s\n onclick="exportShowFilterFields(this)"> match tags<br>\s\n<input type="text" id="exportTags" onfocus="this.select()">\s\n<input type="checkbox" class="chk" id=exportFilterText value="1"\s\n onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\s\n<input type="text" id="exportText" onfocus="this.select()">\s\n</div> <!--box-->\s\n</div> <!--panel-->\s\n\s\n<!-- action buttons -->\s\n<div style="text-align:center">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportFilter" value="apply filter">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportStart" value="export tiddlers">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportClose" value="close">\s\n</div><!--center-->\s\n';\n//}}}\n// //===\n\n// // +++[initialize interface]>\n// // +++[exportShowPanel(which)]\n//{{{\nfunction exportShowPanel(which) {\n var index=0; var panel='exportLocalPanel';\n switch (which) {\n case 'file:':\n case undefined:\n index=0; panel='exportLocalPanel'; break;\n case 'http:':\n index=1; panel='exportHTTPPanel'; break;\n case 'https:':\n index=2; panel='exportHTTPPanel'; break;\n case 'ftp:':\n index=3; panel='exportFTPPanel'; break;\n default:\n alert("Sorry, export to "+which+" is not yet available");\n break;\n }\n exportInitPanel(which);\n document.getElementById('exportTo').selectedIndex=index;\n document.getElementById('exportLocalPanel').style.display='none';\n document.getElementById('exportHTTPPanel').style.display='none';\n document.getElementById('exportFTPPanel').style.display='none';\n document.getElementById(panel).style.display='block';\n}\n//}}}\n// //===\n\n// // +++[exportInitPanel(which)]\n//{{{\nfunction exportInitPanel(which) {\n switch (which) {\n case "file:": // LOCAL EXPORT PANEL: file/path:\n // ** no init - security issues in IE **\n break;\n case "http:": // WEB EXPORT PANEL\n case "https:": // SECURE WEB EXPORT PANEL\n // url\n if (store.tiddlerExists("unawiki_download")) {\n var theURL=store.getTiddlerText("unawiki_download");\n theURL=theURL.replace(/\s[\s[download\s|/,'').replace(/\s]\s]/,'');\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n }\n // server script/params\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n // get POST\n var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";\n var thePost=store.getTiddlerText(title);\n if (!thePost || !thePost.length) thePost="/"+title;\n // get PARAMS\n var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";\n var theParams=store.getTiddlerText(title);\n if (!theParams|| !theParams.length) theParams=title;\n var serverURL = which+"//"+theHost+thePost+"?"+theParams;\n document.getElementById("exportHTTPServerURL").value=serverURL;\n // get NOTIFY\n var theAddresses=store.getTiddlerText("SiteNotify");\n if (!theAddresses|| !theAddresses.length) theAddresses="SiteNotify";\n document.getElementById("exportNotifyTo").value=theAddresses;\n break;\n case "ftp:": // FTP EXPORT PANEL\n // host\n var siteHost=store.getTiddlerText("SiteHost");\n if (!siteHost || !siteHost.length) siteHost=document.location.host;\n if (!siteHost || !siteHost.length) siteHost="SiteHost";\n document.getElementById("exportFTPHost").value=siteHost;\n // username\n var siteID=store.getTiddlerText("SiteID");\n if (!siteID || !siteID.length) siteID=config.options.txtUserName;\n document.getElementById("exportFTPID").value=siteID;\n // password\n document.getElementById("exportFTPPW").value="";\n // file/path\n document.getElementById("exportFTPFilename").value="";\n break;\n }\n}\n//}}}\n// //===\n\n// // +++[exportInitFilter()]\n//{{{\nfunction exportInitFilter() {\n // start date\n document.getElementById("exportFilterStart").checked=false;\n document.getElementById("exportStartDate").value="";\n // end date\n document.getElementById("exportFilterEnd").checked=false;\n document.getElementById("exportEndDate").value="";\n // tags\n document.getElementById("exportFilterTags").checked=false;\n document.getElementById("exportTags").value="";\n // text\n document.getElementById("exportFilterText").checked=false;\n document.getElementById("exportText").value="";\n // show/hide filter input fields\n exportShowFilterFields();\n}\n//}}}\n// //===\n\n// // +++[exportShowFilterFields(which)]\n//{{{\nfunction exportShowFilterFields(which) {\n var show;\n\n show=document.getElementById('exportFilterStart').checked;\n document.getElementById('exportFilterStartBy').style.display=show?"block":"none";\n document.getElementById('exportStartDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterStartBy').value;\n document.getElementById('exportStartDate').value\n =getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterStartBy') && (val=='other'))\n document.getElementById('exportStartDate').focus();\n\n show=document.getElementById('exportFilterEnd').checked;\n document.getElementById('exportFilterEndBy').style.display=show?"block":"none";\n document.getElementById('exportEndDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterEndBy').value;\n document.getElementById('exportEndDate').value\n =getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterEndBy') && (val=='other'))\n document.getElementById('exportEndDate').focus();\n\n show=document.getElementById('exportFilterTags').checked;\n document.getElementById('exportTags').style.display=show?"block":"none";\n\n show=document.getElementById('exportFilterText').checked;\n document.getElementById('exportText').style.display=show?"block":"none";\n}\n//}}}\n// //===\n// //===\n\n// // +++[onClickExportButton(which): control interactions]\n//{{{\nfunction onClickExportButton(which)\n{\n // DEBUG alert(which.id);\n var theList=document.getElementById('exportList'); if (!theList) return;\n var count = 0;\n var total = store.getTiddlers('title').length;\n switch (which.id)\n {\n case 'exportFilter':\n count=filterExportList();\n var panel=document.getElementById('exportFilterPanel');\n if (count==-1) { panel.style.display='block'; break; }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));\n if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }\n break;\n case 'exportStart':\n exportTiddlers();\n break;\n case 'exportHideFilter':\n case 'exportToggleFilter':\n var panel=document.getElementById('exportFilterPanel')\n panel.style.display=(panel.style.display=='block')?'none':'block';\n break;\n case 'exportSelectChanges':\n var lastmod=new Date(document.lastModified);\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;\n theList.options[t].selected=(tiddler.modified>lastmod);\n count += (tiddler.modified>lastmod)?1:0;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no unsaved changes");\n break;\n case 'exportSelectAll':\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count += 1;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,count));\n break;\n case 'exportSelectOpened':\n for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;\n var tiddlerDisplay = document.getElementById("tiddlerDisplay");\n for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {\n var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);\n for (var i = 0; i < theList.options.length; i++) {\n if (theList.options[i].value!=tiddler) continue;\n theList.options[i].selected=true; count++; break;\n }\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no tiddlers currently opened");\n break;\n case 'exportListSmaller': // decrease current listbox size\n var min=5;\n theList.size-=(theList.size>min)?1:0;\n break;\n case 'exportListLarger': // increase current listbox size\n var max=(theList.options.length>25)?theList.options.length:25;\n theList.size+=(theList.size<max)?1:0;\n break;\n case 'exportClose':\n document.getElementById('exportPanel').style.display='none';\n break;\n }\n}\n//}}}\n// //===\n\n// // +++[list display]\n//{{{\nfunction formatExportMessage(count,total)\n{\n var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";\n txt += (count==0)?"none":(count==total)?"all":count;\n txt += " selected for export";\n return txt;\n}\n\nfunction refreshExportList(selectedIndex)\n{\n var theList = document.getElementById("exportList");\n var sort;\n if (!theList) return;\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) sort='modified';\n if (selectedIndex==1) sort='title';\n if (selectedIndex==2) sort='modified';\n if (selectedIndex==3) sort='modifier';\n\n // get the alphasorted list of tiddlers\n var tiddlers = store.getTiddlers('title');\n // unselect headings and count number of tiddlers actually selected\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n if (theList.options[i].value=="") theList.options[i].selected=false;\n count+=theList.options[i].selected?1:0;\n }\n // disable "export" button if no tiddlers selected\n document.getElementById("exportStart").disabled=(count==0);\n // update listbox heading to show selection count\n if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }\n\n // if a [command] item, reload list... otherwise, no further refresh needed\n if (selectedIndex>3) return;\n\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=\n new Option(tiddlers.length+" tiddlers in document", "",false,false);\n theList.options[i++]=\n new Option(((sort=="title" )?">":indent)+' [by title]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);\n // output the tiddler list\n switch(sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modifier":\n case "modified":\n var tiddlers = store.getTiddlers(sort);\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();\n if (sort=="modifier") theSection=tiddler.modifier;\n if (theSection != lastSection)\n {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n}\n//}}}\n// //===\n\n// // +++[list filtering]\n//{{{\nfunction getFilterDate(val,id)\n{\n var result=0;\n switch (val) {\n case 'site':\n var timestamp=store.getTiddlerText("SiteDate");\n if (!timestamp) timestamp=document.lastModified;\n result=new Date(timestamp);\n break;\n case 'file':\n result=new Date(document.lastModified);\n break;\n case 'other':\n result=new Date(document.getElementById(id).value);\n break;\n default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31\n var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;\n var oneday=86400000;\n if (id=='exportStartDate')\n result=new Date((Math.floor(now/oneday)-val)*oneday+tz);\n else\n result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);\n break;\n }\n // DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\snnow="+now);\n return result;\n}\n\nfunction filterExportList()\n{\n var theList = document.getElementById("exportList"); if (!theList) return -1;\n\n var filterStart=document.getElementById("exportFilterStart").checked;\n var val=document.getElementById("exportFilterStartBy").value;\n var startDate=getFilterDate(val,'exportStartDate');\n\n var filterEnd=document.getElementById("exportFilterEnd").checked;\n var val=document.getElementById("exportFilterEndBy").value;\n var endDate=getFilterDate(val,'exportEndDate');\n\n var filterTags=document.getElementById("exportFilterTags").checked;\n var tags=document.getElementById("exportTags").value;\n\n var filterText=document.getElementById("exportFilterText").checked;\n var text=document.getElementById("exportText").value;\n\n if (!(filterStart||filterEnd||filterTags||filterText)) {\n alert("Please set the selection filter");\n document.getElementById('exportFilterPanel').style.display="block";\n return -1;\n }\n if (filterStart&&filterEnd&&(startDate>endDate)) {\n var msg="starting date/time:\sn"\n msg+=startDate.toLocaleString()+"\sn";\n msg+="is later than ending date/time:\sn"\n msg+=endDate.toLocaleString()\n alert(msg);\n return -1;\n }\n\n // scan list and select tiddlers that match all applicable criteria\n var total=0;\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-tiddler list items (section headings)\n var opt=theList.options[i]; if (opt.value=="") continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; \n var sel=true;\n if ( (filterStart && tiddler.modified<startDate)\n || (filterEnd && tiddler.modified>endDate)\n || (filterTags && !matchTags(tiddler,tags))\n || (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))\n sel=false;\n opt.selected=sel;\n count+=sel?1:0;\n total++;\n }\n return count;\n}\n//}}}\n\n//{{{\nfunction matchTags(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }\n return false;\n}\n//}}}\n// //===\n\n// // +++[output data formatting]>\n// // +++[exportHeader(format)]\n//{{{\nfunction exportHeader(format)\n{\n switch (format) {\n case "TW": return exportTWHeader();\n case "DIV": return exportDIVHeader();\n case "XML": return exportXMLHeader();\n }\n}\n//}}}\n// //===\n\n// // +++[exportFooter(format)]\n//{{{\nfunction exportFooter(format)\n{\n switch (format) {\n case "TW": return exportDIVFooter();\n case "DIV": return exportDIVFooter();\n case "XML": return exportXMLFooter();\n }\n}\n//}}}\n// //===\n\n// // +++[exportTWHeader()]\n//{{{\nfunction exportTWHeader()\n{\n // Get the URL of the document\n var originalPath = document.location.href;\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n { alert(config.messages.notFileUrlError); return; }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n // Load the original file\n var original = loadFile(localPath);\n if(original == null)\n { alert(config.messages.cantSaveError); return; }\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n { alert(config.messages.invalidFileError.format([localPath])); return; }\n return original.substr(0,posOpeningDiv+startSaveArea.length)\n}\n//}}}\n// //===\n\n// // +++[exportDIVHeader()]\n//{{{\nfunction exportDIVHeader()\n{\n var out=[];\n var now = new Date();\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<html><body>");\n out.push("<style type=\s"text/css\s">");\n out.push("#storeArea {display:block;margin:1em;}");\n out.push("#storeArea div");\n out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");\n out.push("#javascriptWarning");\n out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");\n out.push("</style>");\n out.push("<div id=\s"javascriptWarning\s">");\n out.push("TiddlyWiki export file<br>");\n out.push("Source: <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");\n out.push("Title: <b>"+title+"</b><br>");\n out.push("Subtitle: <b>"+subtitle+"</b><br>");\n out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");\n out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");\n out.push("Notes:<hr><pre>"+document.getElementById("exportNotes").value.replace(regexpNewLine,"<br>")+"</pre>");\n out.push("</div>");\n out.push("<div id=\s"storeArea\s">");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportDIVFooter()]\n//{{{\nfunction exportDIVFooter()\n{\n var out=[];\n out.push("</div></body></html>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportXMLHeader()]\n//{{{\nfunction exportXMLHeader()\n{\n var out=[];\n var now = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<" + "?xml version=\s"1.0\s"?" + ">");\n out.push("<rss version=\s"2.0\s">");\n out.push("<channel>");\n out.push("<title>" + title + "</title>");\n if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");\n out.push("<description>" + subtitle + "</description>");\n out.push("<language>en-us</language>");\n out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");\n out.push("<pubDate>" + now.toGMTString() + "</pubDate>");\n out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");\n out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportXMLFooter()]\n//{{{\nfunction exportXMLFooter()\n{\n var out=[];\n out.push("</channel></rss>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportData()]\n//{{{\nfunction exportData(theList,theFormat)\n{\n // scan export listbox and collect DIVs or XML for selected tiddler content\n var out=[];\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-selected items and section headings\n var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; \n if (theFormat=="TW") out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));\n if (theFormat=="DIV") out.push(convertUnicodeToUTF8(thisTiddler.title+"\sn"+thisTiddler.saveToDiv()));\n if (theFormat=="XML") out.push(convertUnicodeToUTF8(thisTiddler.saveToRss()));\n }\n return out;\n}\n//}}}\n// //===\n// //===\n\n// // +++[exportTiddlers(): output selected data to local or server]\n//{{{\nfunction exportTiddlers()\n{\n var theList = document.getElementById("exportList"); if (!theList) return;\n\n // get the export settings\n var theProtocol = document.getElementById("exportTo").value;\n var theFormat = document.getElementById("exportFormat").value;\n\n // assemble output: header + tiddlers + footer\n var theData=exportData(theList,theFormat);\n var count=theData.length;\n var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\sn");\n var msg="";\n switch (theProtocol) {\n case "file:":\n var theTarget = document.getElementById("exportFilename").value.trim();\n if (!theTarget.length) msg = "A local path/filename is required\sn";\n if (!msg && saveFile(theTarget,txt))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "http:":\n case "https:":\n var theTarget = document.getElementById("exportHTTPServerURL").value.trim();\n if (!theTarget.length) msg = "A server URL is required\sn";\n if (document.getElementById('exportNotify').checked)\n theTarget+="&notify="+encodeURIComponent(document.getElementById('exportNotifyTo').value);\n if (document.getElementById('exportNotes').value.trim().length)\n theTarget+="&notes="+encodeURIComponent(document.getElementById('exportNotes').value);\n if (!msg && exportPost(theTarget+encodeURIComponent(txt)))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "ftp:":\n default:\n msg="Sorry, export to "+theLocation+" is not yet available";\n break;\n }\n clearMessage(); displayMessage(msg,theTarget);\n}\n//}}}\n// //===\n\n// // +++[exportPost(url): cross-domain post] uses hidden iframe to submit url and capture responses\n//{{{\nfunction exportPost(url)\n{\n var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="exportFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.location.replace(url);\n return true;\n}\n//}}}\n// //===\n
/%TiddlyWiki documents don't pass W3C HTML validation%/\n{{menubox{{{small{\n__TiddlyWiki documents don't pass W3C HTML validation__\n\nWhen your browser requests a page from a webserver (or file system if "file://..." is used), the source HTML delivered back to your browser is a simple block of //human-readable text//. The browser then parses the HTML syntax in this text and uses it like a recipe to generate the DOM (Document Object Model) *data* elements that correspond to the HTML syntax and then uses the DOM elements to actually render the visible portion of the web page on your screen.\n\nHowever, unlike a typical web page which just contains 'static HTML' stored as text, most of the ''content in a ~TiddlyWiki document is kept as tiddler //data// in a hidden "store area"'' which has to be processed by the ~TiddlyWiki core programming before it can be rendered by the browser.\n\n''~TiddlyWiki does NOT generate HTML'' from this tiddler data. Instead, it bypasses the browser's normal HTML parser and, using it's own "wikify()" parser, converts tiddler source content directly into the DOM data elements that the browser uses to render the page.\n\nAs a result of this processing, most HTML validators aren't very useful or informative for analyzing ~TiddlyWiki documents, since they typically only examine the statically-defined source content of the document, without actually running any javascript processing. Since ~TiddlyWiki doesn't contain much actual HTML in its source file, there's simply not much for an HTML validator to sink it's teeth into.\n}}}}}}
__''Configure this [[TiddlyTools|http://www.TiddlyTools.com/]] 'starter' document:''__\nThese settings allow you to quickly configure various optional features, behaviors, and appearance of your document. Once you have set these options, you can apply further customizations by directly editing the relevant configuration tiddlers or by creating/importing tiddlers containing additional plugins, scripts, styles, templates, etc.\n++++!!!{{big{[1: username]}}}>\nYour current username is: <<option txtUserName>><script>\n place.lastChild.style.fontSize="8pt"; place.lastChild.style.width="20em";\n</script>\n* ''Your username is stored in your web browser as a //private// cookie'', and can only be accessed by this document. Note: all locally-stored TiddlyWiki documents (i.e., ''file:...'') are considered part of the same domain, and share a single set of cookie values.\n* ''Your username is recorded as the last modifier ("author") of any tiddlers you have changed'', and can be shown alongside the tiddler title and creation/modification dates that appear above each displayed tiddler.\n* To reduce 'information clutter', ''~TiddlyTools does //not// automatically display the modifier information.'' You can enable this feature by editing the ~TiddlyTools ViewTemplate to remove the ~HTML-style comments that surround the modifier display syntax:\n{{{\n<!--<span macro='view modifier link'></span>, -->\n}}}\n===\n+++!!!{{big{[2: menus]}}}>\nBy default, ''new ~TiddlyTools 'starter' documents include a complete set of ~TiddlyTools enhanced menus'', along with the necessary plugins/scripts/styles to support those features. These enhancements provide a wide range of extended editing and authoring features for you to use, "right out of the box". ''If you do not want or need all of these features, you can quickly select and install a simplified set of menu definitions'' from the choices below:\n\nselect a menu level:<<br>>{{medium{<<tiddler SwitchMenus>>}}}\n* ''Full'' - (default) includes all ~TiddlyTools enhanced menu features\n* ''Lite'' - minus: attach, export, single-page/open at top (options), calendar, listbox tab (contents), installed plugins summary (main menu), all extras (except for ~TagCloud).\n* ''Mini'' - same as ~TiddlyTools Lite menus, minus: download, contact, recent changes, tiddler groups, yesterday/today/tommorrow (recent), upload/save to web, toggle titles/menubar, create xml/rss file (saving), all extras (including ~TagCloud)\nWarning - Changing menus levels will overwrite the content of the following 'menu definition' tiddlers:\n>MainMenu, SideBarOptions, SideBarTabs, StoryMenu, SiteMenu, SiteMenuGoto, SiteMenuFile, SiteMenuOptions, SiteMenuExtras\nYou can edit these tiddlers at any time and customize them to suit your needs; however, ''any customizations or changes that have been made to these tiddlers will be discarded whenever you select a TiddlyTools menu level.''\n>hint:After you have selected an appropriate menu level, you can reduce your document size by removing the sets of tiddlers that define the different menu alternatives (i.e., all tiddlers tagged with <<tag full>>/<<tag lite>>/<<tag mini>>). This also 'locks in' your current menu level, so that you cannot switch menu levels for this document again. Of course, you can always edit the currently installed menu definition tiddlers in the normal ~TiddlyWiki manner, allowing you to make any modifications to the menus that you wish by using copy/paste, ImportTiddlersPlugin or simply typing additions and corrections directly into the tiddler content.\n===\n+++!!!{{big{[3: packages]}}}><<tiddler ImportPackages>>===\n+++!!!{{big{[4: configuration]}}}>\nSome tiddlers define settings or functions that control various ~TiddlyWiki behaviors. You can customize some of these core and plugin configuration options by editing the following tiddlers:\n* TiddlerGroupsList\n* AttachFileServerScripts\n* CalendarPluginConfig\n* DatePluginConfig\n* ConfigTweaks\n===\n+++!!!{{big{[5: content]}}}>\nTo begin entering and formatting your content, you'll probably want to create/modify the following tiddlers:\n* DefaultTiddlers\n* SiteTitle\n* SiteSubtitle\n* [[Welcome]]\n* [[About]]\n* [[Download]]\n* [[Contact]]\n* LegalStatements\n===
/***\n''GotoPlugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#GotoPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\n''View a tiddler by typing its title and pressing //enter//.'' Input just enough to uniquely match a single tiddler title and ''press //enter// to auto-complete the title for you!!'' If multiple titles match your input, a list is displayed. You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press //escape// to close the listbox to resume typing. When the listbox is ''//not//'' being displayed, press //escape// to clear the current text input and start over.\n\nNote: ''At any time, you can move the focus directly to the text input field by using the ~ALT-G keyboard shortcut.''\n!!!!!Example\n<<<\nsyntax: {{{<<goto quiet inputstyle liststyle>>}}}\nAll parameters are optional.\n* ''quiet'' prevents //automatic// display of the list as each character is typed. To view the list when ''quiet'', use //down// or //enter//.\n* ''inputstyle'' and ''liststyle'' are CSS declarations that modify the default input and listbox styles. Note: styles containing spaces must be surrounded by ({{{"..."}}} or {{{'...'}}}) or ({{{[[...]]}}}).\n{{{<<goto>>}}}\n<<goto>>\n{{{<<goto quiet>>}}}\n<<goto quiet>>\n{{{<<goto width:20em width:20em>>}}}\n<<goto width:20em width:20em>>\n<<<\n!!!!!Configuration\n<<<\nThe following ~TiddlyWiki search options (see AdvancedOptions) are applied when matching tiddler titles:\n><<option chkRegExpSearch>> use regular expressions (text patterns)\n><<option chkCaseSensitiveSearch>> use case sensitive matching\nYou can also create a tiddler tagged with <<tag systemConfig>> to control listing of tiddlers/shadows/tags, as well as the maximum height of the listbox. //The default values are shown below://\n//{{{\nconfig.macros.goto.includeTiddlers=true;\nconfig.macros.goto.includeShadows=true;\nconfig.macros.goto.includeTags=true;\nconfig.macros.goto.listMaxSize=10;\n//}}}\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''GotoPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revisions\n<<<\n''2006.05.10 [1.1.2]'' when filling listbox, set selection to 'heading' item... auto-select first tiddler title when down/enter moves focus into listbox\n''2006.05.08 [1.1.1]'' added accesskey ("G") to input field html (also set when field gets focus). Also, inputKeyHandler() skips non-printing/non-editing keys. \n''2006.05.08 [1.1.0]'' added heading to listbox for better feedback (also avoids problems with 1-line droplist)\n''2006.05.07 [1.0.0]'' list matches against tiddlers/shadows/tags. input field auto-completion... 1st enter=complete matching input (or show list)... 2nd enter=view tiddler. optional "quiet" param controls when listbox appears.\n''2006.05.06 [0.5.0]'' added handling for enter (13), escape(27), and down(40) keys. Change 'ondblclick' to 'onclick' for list handler to view tiddlers (suggested by Florian Cauvin - prevents unintended trigger of tiddler editor). shadow titles inserted into list instead of appended to the end.\n''2006.05.05 [0.0.0]'' started\n<<<\n!!!!!Credits\n>This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n!!!!!Code\n***/\n//{{{\nversion.extensions.goto= {major: 1, minor: 1, revision: 2, date: new Date(2006,5,10)};\nconfig.macros.goto= { \n handler:\n function(place,macroName,params) {\n var quiet=(params[0] && params[0]=="quiet"); if (quiet) params.shift();\n var instyle=params.shift(); if (!instyle) instyle="";\n var liststyle=params.shift(); if (!liststyle) liststyle="";\n createTiddlyElement(place,"span").innerHTML\n =this.html.replace(/%quiet%/,quiet).replace(/%instyle%/,instyle).replace(/%liststyle%/,liststyle);\n },\n\n html:\n '<form onsubmit="return false" style="display:inline;margin:0;padding:0">\s\n <input name=goto type=text autocomplete="off" accesskey="G" style="%instyle%"\s\n title="enter a tiddler title"\s\n onfocus="this.setAttribute(\s'accessKey\s',\s'G\s'); this.select();"\s\n onkeyup="return config.macros.goto.inputKeyHandler(event,this,this.form.list,%quiet%);">\s\n <select name=list style="%liststyle%;display:none;position:absolute"\s\n onchange="if (!this.selectedIndex) this.selectedIndex=1;"\s\n onblur="this.style.display=\s'none\s';"\s\n onkeyup="return config.macros.goto.selectKeyHandler(event,this,this.form.goto);"\s\n onclick="return config.macros.goto.openItem(this.value,this.form.goto,this);">\s\n </select>\s\n </form>',\n \n getItems:\n function() {\n var items=[];\n var tiddlers=store.reverseLookup("tags","excludeSearch",false,"title");\n if (this.includeTiddlers) for(var t=0; t<tiddlers.length; t++) items.push(tiddlers[t].title);\n if (this.includeShadows) for (var t in config.shadowTiddlers) items.pushUnique(t);\n if (this.includeTags) { var tags=store.getTags(); for(var t=0; t<tags.length; t++) items.pushUnique(tags[t][0]); }\n return items;\n },\n includeTiddlers: true, includeShadows: true, includeTags: true,\n\n getItemSuffix:\n function(t) {\n if (store.tiddlerExists(t)) return ""; // tiddler\n if (store.isShadowTiddler(t)) return " (shadow)"; // shadow\n return " (tag)"; // tag \n },\n\n openItem:\n function(title,here,list) {\n if (!title.length) return; here.value=title; list.style.display='none'; story.displayTiddler(null,title); return false;\n },\n\n inputKeyHandler:\n function(event,here,list,quiet) {\n var key=event.keyCode;\n // non-printing chars... bubble up, except: backspace=8, enter=13, escape=27, space=32, down=40, delete=46\n if (key<48) switch(key) { case 8: case 13: case 27: case 32: case 40: case 46: break; default: return true; }\n // escape... hide list (2nd esc=reset input)\n if (key==27) { if (list.style.display=="none") here.value=here.defaultValue; else list.style.display="none"; return false; }\n // blank input... if down/enter... fall through (list all)... else, hide list\n if (!here.value.length && !(key==40 || key==13)) { list.style.display="none"; return false; }\n // find matching items...\n var pattern=config.options.chkRegExpSearch?here.value:here.value.escapeRegExp();\n var re=new RegExp(pattern,config.options.chkCaseSensitiveSearch?"mg":"img");\n var found = []; var items=this.getItems(); for(var t=0; t<items.length; t++) if(items[t].search(re)!=-1) found.push(items[t]);\n // matched one item... enter... not *exact* match... autocomplete input field\n if (found.length==1 && quiet && key==13 && here.value!=found[0]) { list.style.display="none"; here.value=found[0]; return false; }\n // no match/exact match... enter... create/show it\n if (found.length<2 && key==13) return this.openItem(found.length?found[0]:here.value,here,list);\n // quiet/no match... hide list...\n list.style.display=(!quiet && found.length)?"block":"none";\n // no matches... key bubbles up\n if (!found.length) return true;\n // down/enter... show/move to list...\n if (key==40 || key==13) { list.style.display="block"; list.focus(); }\n // list is showing... fill list...\n if (list.style.display!="none") {\n while (list.length > 0) list.options[0]=null; // clear list...\n found.sort();\n list.options[0]=new Option(found.length==1?this.listMatchMsg:this.listHeading.format([found.length]),"",false,false);\n for (var t=0; t<found.length; t++) // fill list...\n list.options[t+1]=new Option(found[t]+this.getItemSuffix(found[t]),found[t],false,false);\n list.size=(found.length<this.listMaxSize?found.length:this.listMaxSize)+1; // resize list...\n list.selectedIndex=(key==40 || key==13)?1:0;\n }\n return true; // key bubbles up\n },\n listMaxSize: 10,\n listHeading: 'Found %0 matching titles:',\n listMatchMsg: 'Press enter to open tiddler...',\n\n selectKeyHandler:\n function(event,list,editfield) {\n if (event.keyCode==27) // escape... hide list, move to edit field\n { editfield.focus(); list.style.display="none"; return false; }\n if (event.keyCode==13 && list.value.length) // enter... view selected item\n { this.openItem(list.value,editfield,list); return false; }\n return true;\n }\n}\n//}}}
Welcome\n----\nHola\n----\nHala\n----\nShalom\n----\nNi hao\n----\nKumusta\n----\n'Allo\n----\nG'day\n----\nHoi\n----\nBon giorno\n----\nHi\n----\nHej\n----\nOl&aacute;\n----\nSalut\n----\nHello\n----\nHoi\n----\nOi\n----\nHoi\n----\nAloha\n----\nBonjour\n----\nGuten Tag\n----\nShalom\n----\nNamaste\n----\nCiao
/***\n''HTML Formatting Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#HTMLFormattingPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nThe shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.\n\nWhen HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML. However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain. This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.\n!!!!!Usage\n<<<\nThe ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.\n\nWhen a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags. This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content. Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.\n<<<\n!!!!!Line breaks\n<<<\nOne major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.\n\nEven though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.\n\nIf removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead. Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.\n\nNote: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.\n<<<\n!!!!!How it works\n<<<\nThe TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block. Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it. Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html. It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.\n\nHowever, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.\n\nSimilarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward. Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(\n\nAs a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).\n\nAfter the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements. The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node. At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for HTMLFormatting handling^^\n<<<\n!!!!!Revision History\n<<<\n''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children. (thanks to "ayj" for bug report)\n''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content. This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)\n''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements\n''2005.11.06 [2.0.1]'' code cleanup\n''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code\n''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler\n''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers\n''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling\n''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 3, date: new Date(2006,5,28)};\n\n// find the formatter for HTML and replace the handler\ninitHTMLFormatter();\nfunction initHTMLFormatter()\n{\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n var html=lookaheadMatch[1];\n // optionally suppress wiki-style literal handling of newlines\n // strip any carriage returns added by Internet Explorer's textarea edit field\n // encode newlines as \sn so Internet Explorer's HTML parser won't eat them\n // encode macro brackets (<< and >>) so HTML parser won't eat them\n if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(regexpNewLine,' ');\n html=html.replace(regexpCarriageReturn,'');\n html=html.replace(regexpNewLine,'\s\sn');\n html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');\n // create span to hold HTML\n // parse HTML and normalize the results\n // walk node tree and call wikify() on each text node\n var e = createTiddlyElement(w.output,"span");\n e.innerHTML=html;\n e.normalize(); \n wikifyTextNodes(e);\n // advance to next parse position\n w.nextMatch=lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n}\n\n// wikify text nodes remaining after HTML content is processed (pre-order recursion)\nfunction wikifyTextNodes(theNode)\n{\n // textarea node doesn't get wikified, just decoded... \n if (theNode.nodeName.toLowerCase()=='textarea')\n theNode.value=theNode.value.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(regexpBackSlashEn,'\sn');\n else for (var i=0;i<theNode.childNodes.length;i++) {\n var theChild=theNode.childNodes.item(i);\n if (theChild.nodeName.toLowerCase()=='option') continue;\n if (theChild.nodeName.toLowerCase()=='select') continue;\n wikifyTextNodes(theChild);\n if (theChild.nodeName=='#text') {\n var txt=theChild.nodeValue;\n // decode macro brackets and newlines\n txt=txt.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(regexpBackSlashEn,'\sn');\n // replace text node with wikified() span\n var newNode=createTiddlyElement(null,"span");\n theNode.replaceChild(newNode,theChild);\n wikify(txt,newNode);\n }\n }\n}\n//}}}\n
<script>\n var s=place.parentNode.style;\n s.backgroundImage="none";\n s.backgroundColor="transparent"\n s.borderColor="transparent";\n s.borderWidth=0;\n s.margin=0;\n s.padding=0;\n</script>
<script>\n // get the tiddler element\n var t=story.findContainingTiddler(place);\n if (t && t.id!="tiddlerHideTiddlerSubtitle") \n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"subtitle"))\n t.childNodes[i].style.display="none";\n</script>
<script>\n var t=story.findContainingTiddler(place);\n if (t && t.id!="tiddlerHideTiddlerTags")\n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"tagging")||hasClass(t.childNodes[i],"tagged"))\n t.childNodes[i].style.display="none";\n</script>
<script>\n // get the tiddler element\n var t=story.findContainingTiddler(place);\n if (t && t.id!="tiddlerHideTiddlerTitle") \n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"title")||hasClass(t.childNodes[i],"subtitle"))\n t.childNodes[i].style.display="none";\n</script>
<script>\n var t=story.findContainingTiddler(place);\n if (t && t.id!="tiddlerHideTiddlerToolbar")\n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"toolbar"))\n t.childNodes[i].style.display="none";\n</script>
/%Javascript cross-domain data access security issues%/\n{{menubox{{{small{\n__Javascript cross-domain data access security issues__\n\nCertain JavaScript features require expanded "cross-domain" privileges, normally restricted for use with ''signed'' scripts. You can set your browser to allow or disallow a signed script based on the digital sigature of the originator (or ''principal'') of the signed script. However, for an //''unsigned''// script to use expanded privileges, a ''codebase principal'', derived from the origin of the script rather than from verifying a digital signature of a certificate, must be used.\n>''Codebase principals are disabled by default; to enable them in FireFox, go to "about:config" in your browser, and set {{{signed.applets.codebase_principal_support}}} to {{{true}}} (//note: other browsers' settings may vary... if applicable, try adding //{{{user_pref("signed.applets.codebase_principal_support", true);}}}// to your browser's "preferences" file//).''\nWhen an unsigned script requests expanded privileges with codebase principals enabled, a dialog box advises that the script has not been digitally signed, and asks for permission to grant privileges based on the URL (the 'codebase principal') rather than signed/verified author information.\n<<<\n| Privilege |Description |\n| UniversalBrowserRead|Allows reading of privileged data from the browser. This allows the script to pass the same origin check for any document.|\n| UniversalBrowserWrite|Allows modification of privileged data in a browser. This allows the script to pass the same origin check for any document.|\n| UniversalBrowserAccess|Allows both reading and modification of privileged data from the browser. This allows the script to pass the same origin check for any document.|\n| UniversalFileRead|Allows a script to read any files stored on hard disks or other storage media connected to your computer.|\n| UniversalPreferencesRead|Allows the script to read preferences using the navigator.preference method.|\n| UniversalPreferencesWrite|Allows the script to set preferences using the navigator.preference method.|\n| UniversalSendMail|Allows the program to send mail in the user's name.|\n<<<\nThe following features require expanded privileges:\n* Setting a file upload widget requires UniversalFileRead.\n* Submitting a form to a mailto: or news: URL requires UniversalSendMail.\n* Using an about: URL other than about:blank requires UniversalBrowserRead.\n* event object: Setting any property requires UniversalBrowserWrite.\n* DragDrop event: Getting the value of the data property requires UniversalBrowserRead.\n* history object: Getting the value of any property requires UniversalBrowserRead.\n* navigator object:\n** Getting the value of a preference using the preference method requires UniversalPreferencesRead.\n** Setting the value of a preference using the preference method requires UniversalPreferencesWrite.\n* window object: Allow of the following operations require UniversalBrowserWrite.\n** Adding or removing the directory bar, location bar, menu bar, personal bar, scroll bar, status bar, or toolbar.\n** Using the methods in the following table under the indicated circumstances\n<<<\n| enableExternalCapture|To capture events in pages loaded from different servers. Follow this method with captureEvents.|\n| close|To unconditionally close a browser window.|\n| moveBy|To move a window off the screen.|\n| moveTo|To move a window off the screen.|\n| open|To create a window smaller than 100 x 100 pixels or larger than the screen can accommodate by using innerWidth, innerHeight, outerWidth, and outerHeight.<<br>>To place a window off screen by using screenX and screenY.<<br>>To create a window without a titlebar by using titlebar.<<br>>To use alwaysRaised, alwaysLowered, or z-lock for any setting.<<br>>|\n| resizeTo|To resize a window smaller than 100 x 100 pixels or larger than the screen can accommodate.|\n| resizeBy|To resize a window smaller than 100 x 100 pixels or larger than the screen can accommodate.|\n<<<\n**Setting the properties in the following table under the indicated circumstances:\n<<<\n| innerWidth|To set the inner width of a window to a size smaller than 100 x 100 or larger than the screen can accommodate.|\n| innerHeight|To set the inner height of a window to a size smaller than 100 x 100 or larger than the screen can accommodate.|\n<<<\n}}}}}}
/%Display a tiddler in a floating, moveable, sizeable panel%/\n{{menubox{{{small{\n__Display a tiddler in a floating, moveable, sizeable panel__\n\nUsing a combination of NestedSlidersPlugin and MoveablePanelPlugin, you can quickly turn any tiddler into a floating panel that can be moved/sized/folded/maximized in response to simple mouse actions (drag, shift-drag, double-click) and/or menu commands.\n\n!!!!! example\n{{{\nsyntax:\n+++^width^[label]\n <<moveablePanel>>TiddlerTitle\n----\n <<tiddler TiddlerTitle>>\n===\n}}}\n+++^30em^[click here to see SiteSubtitle in a floating panel]\n <<moveablePanel>>SiteSubtitle\n----\n This is the site subtitle:\n\n <<tiddler SiteSubtitle>>\n===\n{{{\n+++^30em^[click here to see SiteSubtitle in a floating panel]\n <<moveablePanel>>SiteSubtitle\n----\n This is the site subtitle:\n\n <<tiddler SiteSubtitle>>\n===\n}}}\n*the {{{^width^}}} portion of the slider syntax declares the start of a "floating slider" panel, where //width// is any valid CSS measurement (e.g., "30em", "200px", "60%", "3in", etc.). Use ^auto^, {{{^^}}}, or just {{{^}}} to allow the panel to resize as needed to fit the contents.\n>{{fine{hint: if you use 'auto' sizing, the panel width can change unexpectedly due to the 'float:right' properties of the moveable panel dynamic menus. To bypass this behavior, always specify a fixed panel size when including the {{{<<moveablePanel>>}}} macro}}}\n*The {{{<<moveablePanel>>}}} macro adds move/size functions (mouse actions and menus) to the floating slider panel, and should be the first item in the slider panel contents, immediately following the "start slider" syntax.\n>{{fine{hint: you can follow the {{{<<moveablePanel>>}}} macro with some "title text" for the panel and then a horizontal line (----) to create a "titlebar" appearance for the panel. When appropriate, this panel "title" should include a link to the tiddler containing the source for the panel content, so that the reader can easily view that content using a standard tiddler display.}}}\n*Use the {{{<<tiddler TiddlerName>>}}} macro to insert contents from another tiddler. You can put //any// tiddler content you want inside a floating panel: e.g. ''add formatting or other content //surrounding// the included tiddler'', or just ''enter content directly, without including another tiddler'' at all...\n}}}}}}
/%Override cookie-based option settings with 'hard-coded' values%/\n{{menubox{{{small{\n__Override cookie-based option settings with 'hard-coded' values__\n\nYou can override //any// cookie-based config.option.* setting by ''hard-coding'' the desired value into a systemConfig tiddler (i.e., a plugin).\n\nFor example, suppose you prefer to set EnableAnimations to false by default, so that the first time your readers visit your document, they won't have to disable it themselves... all you need to do is to create a tiddler containing the following line of javascript:\n{{{\nconfig.options.chkAnimate=false;\n}}}\nthen, tag that tiddler with<<tag systemConfig>>to make it a plugin... the javascript it contains will be invoked //after// you save and reload the document. At "load-time", option values are initialized in this order:\n<<<\n# hard-coded values in the TiddlyWiki core code.\n# values from cookies (read from the browser)\n# values set by plugins\n<<<\nBecause plugins are executed last, any values they set supercede the values loaded from the browser's cookies or set by the core code.\n>{{fine{note: plugins are executed in //alphanumeric// order (based on tiddler title). Most of the time this does not cause any problems. However, if a plugin references an option value during it's load-time initialization, you will need to make sure that the tiddler containing the overridden cookie values is executed //first// by giving it a tiddler title that is sorted ahead of the dependent plugin's title.}}}\nexample: ConfigTweaks\n}}}}}}
/%Reposition slider panels within a tiddler%/\n{{menubox{{{small{\n__Reposition slider panels within a tiddler__\n\nWhen you select a slider button, everything following that slider button is 'pushed down' the page so that the corresponding slider panel can be displayed. However, when several slider buttons are on the same line (e.g. to create a horizontal 'menubar'), opening one of these sliders 'splits' the menubar, so that any menu items following the open slider are pushed down below that slider.\n\nTo preserve the single-row layout of slider buttons, you can use InlineJavascriptPlugin to ''set a specific element ID within each slider panel'', and then ''move the identified elements by directly DOM manipulation'' so that all panels //follow// the slider buttons, instead of being placed //in-between// them.\n!!!!! example\nwithout stacking:\n+++[label1]\n stuff1\n=== +++[label2]\n stuff2\n=== +++[label3]\n stuff3\n=== +++[label4]\n stuff4\n===\n{{{\n+++[label1]\n stuff1\n=== +++[label2]\n stuff2\n=== +++[label3]\n stuff3\n=== +++[label4]\n stuff4\n===\n}}}\n----\nwith stacking:\n+++[label1]\n stuff1\n===<script>place.lastChild.id="panel1"</script> +++[label2]\n stuff2\n===<script>place.lastChild.id="panel2"</script> +++[label3]\n stuff3\n===<script>place.lastChild.id="panel3"</script> +++[label4]\n stuff4\n===<script>place.lastChild.id="panel4"</script><script>\n place.insertBefore(document.getElementById("panel1"),null);\n place.insertBefore(document.getElementById("panel2"),null);\n place.insertBefore(document.getElementById("panel3"),null);\n place.insertBefore(document.getElementById("panel4"),null);\n</script>\n{{{\n+++[label1]\n stuff1\n===<script>place.lastChild.id="panel1"</script> +++[label2]\n stuff2\n===<script>place.lastChild.id="panel2"</script> +++[label3]\n stuff3\n===<script>place.lastChild.id="panel3"</script> +++[label4]\n stuff4\n===<script>place.lastChild.id="panel4"</script><script>\n place.insertBefore(document.getElementById("panel1"),null);\n place.insertBefore(document.getElementById("panel2"),null);\n place.insertBefore(document.getElementById("panel3"),null);\n place.insertBefore(document.getElementById("panel4"),null);\n</script>\n}}}\n}}}}}}
You can import pre-bundled tiddler "packages" directly from http://www.TiddlyTools.com/\n\nPackages combine of one or more tiddlers containing plugins, macros, wiki-formatted content, stylesheets, templates, etc. to install a set of related features and functions. Each tiddler in a package is tagged with the same tag name to make it easy to quickly identify and import all of the desired tiddlers in the set.\n\nPlease select packages to import:\n+++{{medium{[TexturesPackage]}}}>\nStylesheet and background image attachments for the "Textures" theme:\n>stucco, black marble, gray parchment\nImport these tiddlers and then select [[Textures]] from the //options>themes// section in the right menu or sidebar.\n~~''source:'' http://www.TiddlyTools.com/#tag:TexturesPackage~~\n +++{{big{[begin installation...]}}}...\n {{{<<loadTiddlers "tag:TexturesPackage" "http://www.TiddlyTools.com/">>}}}\n <<loadTiddlers "tag:TexturesPackage" "http://www.TiddlyTools.com/">>\n ===\n===\n\n+++{{medium{[WoodshopPackage]}}}>\nStylesheet and background image attachments for the "Woodshop" theme:\n>Various light and dark natural woods, plus parchment and canvas\nImport these tiddlers and then select [[Woodshop]] from the //options>themes// section in the right menu or sidebar.\n~~''source:'' http://www.TiddlyTools.com/#tag:WoodshopPackage~~\n +++{{big{[begin installation...]}}}...\n {{{<<loadTiddlers "tag:WoodshopPackage" "http://www.TiddlyTools.com/">>}}}\n <<loadTiddlers "tag:WoodshopPackage" "http://www.TiddlyTools.com/">>\n ===\n===\n\n+++{{medium{[MediaPackage]}}}>\n~MediaPackage combines several audio/video plugin tools to provide easy inclusion of streaming media in your document. PlayerPlugin lets you embed a Windows, Real, ~QuickTime or Flash player in a tiddler and matches known file extensions and/or specialized streaming-media transfer protocols (such as RTSP:) to automatically switch to the correct player type. DeliciousPlayTaggerPlugin adds a very compact streaming-mp3 player control preceding any .mp3 file links contained in tiddler content. MediaCenter combines ~PlayerPlugin and InlineJavascriptPlugin to provide a unified media viewing experience. You can define and select online media 'favorites' from a droplist or use media URLs from other sources (copy/paste).\n\nImport these tiddlers and then save-and-reload your document for the plugins to take effect.\n~~''source:'' http://www.TiddlyTools.com/#tag:MediaPackage~~\n +++{{big{[begin installation...]}}}...\n {{{<<loadTiddlers "tag:MediaPackage" "http://www.TiddlyTools.com/">>}}}\n <<loadTiddlers "tag:MediaPackage" "http://www.TiddlyTools.com/">>\n ===\n===\n\n+++{{medium{[TidIDEPackage]}}}>\nA full-featured tiddler editor plus key-by-key ''LIVE PREVIEW''!! Also provides diagnostic tools to help you debug your TiddlyWiki problems by letting you view current TiddlyWiki internal option values, messages, shadows, stylesheets, notify and macro functions or display the internal DOM (Document Object Model) tree structure for any specific part of the TiddlyWiki document.\n\nImport these tiddlers and then save-and-reload your document for the plugins to take effect.\n~~''source:'' http://www.TiddlyTools.com/#tag:TidIDEPackage~~\n +++{{big{[begin installation...]}}}...\n {{{<<loadTiddlers "tag:TidIDEPackage" "http://www.TiddlyTools.com/">>}}}\n <<loadTiddlers "tag:TidIDEPackage" "http://www.TiddlyTools.com/">>\n ===\n===\n\n+++{{medium{[TiddlyCardsPackage]}}}>\nTiddlyCards are like 3x5 cards with fill-in forms. TiddlyCards can display and store most of the usual HTML field control types, including: text fields, textareas (multi-line), listboxes / dropdown lists, checkboxes, and radio buttons. Each card is stored in a tiddler tagged with<<tag TiddlyCard>>, and contains two parts: an HTML form that contains the saved data values for that card, followed by an optional section of TiddlyWiki-formatted content for ''read-only'' display of card data values embedded within normal tiddler content. You can define and use multiple card types within the same document. When a card tiddler has been tagged with<<tag TiddlyCardsForm>>, it will be recognized as a ''"tear-off" form'' that can be used to create new cards. The values stored in this form definition are used as the default values when creating new cards of that type. \n\nImport these tiddlers and then save-and-reload your document for the plugins to take effect.\n~~''source:'' http://www.TiddlyTools.com/#tag:TiddlyCardsPackage~~\n +++{{big{[begin installation...]}}}...\n {{{<<loadTiddlers tag:TiddlyCardsPackage http://www.TiddlyTools.com/>>}}}\n <<loadTiddlers tag:TiddlyCardsPackage http://www.TiddlyTools.com/>>\n ===\n===
<<importTiddlers inline>>
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x, 2.0 and 2.1beta''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ImportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen 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. This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. It can also be very useful 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.)\n\n!!!!!Interactive interface\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n<<importTiddlers inline>>\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //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.//\n\nSelect 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 ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' 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 ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' 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:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers 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 "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen 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: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. 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 ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////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.//\n\n''Import Report History''\n\nWhen 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.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf 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.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!non-interactive 'load tiddlers' macro\n<<<\nUseful for automated installation/update of plugins and other tiddler content.\n\n{{{<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>}}}\n<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>\n\nSyntax:\n{{{<<loadTiddlers label:text prompt:text filter source quiet confirm>>}}}\n\n''label:text'' and ''prompt:text''\n>defines link text and tooltip (prompt) that can be clicked to trigger the load tiddler processing. If a label is NOT provided, then no link is created and loadTiddlers() is executed whenever the containing tiddler is rendered.\n''filter'' (optional) determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"tiddler:~TiddlerName"'' retrieves only the specific tiddler named in the parameter.\n>''"tag:text"'' retrieves only the tiddlers tagged with the indicated text.\n''source'' (required) is the location of the imported document. It can be either a local document path/filename in whatever format your system requires, or a remote web location (starting with "http://" or "https://")\n>use the keyword ''ask'' to prompt for a source location whenever the macro is invoked\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"confirm"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n//wffl store.addNotification(null,refreshImportList); // \n\n''2006.08.16 [3.0.6]'' Use higher-level store.saveTiddler() instead of store.addTiddler() to avoid conflicts with ZW and other adaptations that hijack low-level tiddler handling. Also, in CreateImportPanel(), no longer register notify to "refresh listbox after every tiddler change" (left over from old 'auto-filtered' list handling). Thanks to Bob McElrath for report/solution.\n''2006.07.29 [3.0.5]'' added noChangeMsg to loadTiddlers processing. if not 'quiet' mode, reports skipped tiddlers.\n''2006.04.18 [3.0.4]'' in loadTiddlers.handler, fixed parsing of "prompt:" param. Also, corrected parameters mismatch in loadTiddlers() callback function definition (order of params was wrong, resulting in filters NOT being applied)\n''2006.04.12 [3.0.3]'' moved many display messages to macro properties for easier L10N translations via 'lingo' definitions.\n''2006.04.12 [3.0.2]'' additional refactoring of 'core candidate' code. Proposed API now defines "loadRemoteFile()" for XMLHttpRequest processing with built in fallback for handling local filesystem access, and readTiddlersFromHTML() to process the resulting source HTML content.\n''2006.04.04 [3.0.1]'' in refreshImportList(), when using [by tags], tiddlers without tags are now included in a new "untagged" psuedo-tag list section\n''2006.04.04 [3.0.0]'' Separate non-interactive {{{<<importTiddlers...>>}}} macro functionality for incorporation into TW2.1 core and renamed as {{{<<loadTiddlers>>}}} macro. New parameters for loadTiddlers: ''label:text'' and ''prompt:text'' for link creation, ''ask'' for filename/URL, ''tag:text'' for filtering, "confirm" for accept/reject of individual inbound tiddlers. Also, ImportedTiddlers report generator output has been simplified and "importReplace/importPublic" tags and associated "force" param (which were rarely, if ever, used) has been dropped.\n''2006.03.30 [2.9.1]'' when extracting store area from remote URL, look for "</body>" instead of "</body>\sn</html>" so it will match even if the "\sn" is absent from the source.\n''2006.03.30 [2.9.0]'' added optional 'force' macro param. When present, autoImportTiddlers() bypasses the checks for importPublic and importReplace. Based on a request from Tom Otvos.\n''2006.03.28 [2.8.1]'' in loadImportFile(), added checks to see if 'netscape' and 'x.overrideMimeType()' are defined (IE does *not* define these values, so we bypass this code)\nAlso, when extracting store area from remote URL, explicitly look for "</body>\sn</html>" to exclude any extra content that may have been added to the end of the file by hosting environments such as GeoCities. Thanks to Tom Otvos for finding these bugs and suggesting some fixes.\n''2006.02.21 [2.8.0]'' added support for "tiddler:TiddlerName" filtering parameter in auto-import processing\n''2006.02.21 [2.7.1]'' Clean up layout problems with IE. (Use tables for alignment instead of SPANs styled with float:left and float:right)\n''2006.02.21 [2.7.0]'' Added "local file" and "web server" radio buttons for selecting dynamic import source controls in ImportPanel. Default file control is replaced with URL text input field when "web server" is selected. Default remote document URL is defined in SiteURL tiddler. Also, added option for prepending SiteProxy URL as prefix to remote URL to mask cross-domain document access (requires compatible server-side script)\n''2006.02.17 [2.6.0]'' Removed "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]'' added checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]'' FF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]'' corrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]'' moved globals from window.* to config.macros.importTiddlers.* to avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2006.01.18 [2.5.0]'' added checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]'' added "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]'' Added support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]'' Added "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]'' Strip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]'' Reorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]'' Added "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]'' When a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]'' IMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]'' When refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]'' When "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]'' Update for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]'' tweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]'' Dynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]'' fixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]'' added 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]'' only load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]'' fixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]'' combined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]'' moved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // ''MACRO DEFINITION''\n//{{{\n// Version\nversion.extensions.importTiddlers = {major: 3, minor: 0, revision: 6, date: new Date(2006,8,16)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n foundMsg: "Found %0 tiddlers in %1",\n countMsg: "%0 tiddlers selected for import",\n importedMsg: "Imported %0 of %1 tiddlers from %2",\n src: "", // path/filename or URL of document to import (retrieved from SiteUrl tiddler)\n proxy: "", // URL for remote proxy script (retrieved from SiteProxy tiddler)\n useProxy: false, // use specific proxy script in front of remote URL\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n if (!config.macros.loadTiddlers.handler)\n { alert("importTiddlers error: this plugin requires LoadTiddlersPlugin or TiddlyWiki 2.1+"); return; }\n if (!params[0]) // LINK TO FLOATING PANEL\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n else if (params[0]=="inline") {// // INLINE TIDDLER CONTENT\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n }\n else config.macros.loadTiddlers.handler(place,macroName,params); // FALLBACK: PASS TO LOADTIDDLERS\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n refreshImportList();\n var siteURL=store.getTiddlerText("SiteUrl"); if (!siteURL) siteURL="";\n document.getElementById("importSourceURL").value=siteURL;\n config.macros.importTiddlers.src=siteURL;\n var siteProxy=store.getTiddlerText("SiteProxy"); if (!siteProxy) siteProxy="SiteProxy";\n document.getElementById("importSiteProxy").value=siteProxy;\n config.macros.importTiddlers.proxy=siteProxy;\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#importPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px;}\s\n#importPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#importPanel .rad { width:auto; }\s\n#importPanel .chk { width:auto; margin:1px;border:0; }\s\n#importPanel .btn { width:auto; }\s\n#importPanel .btn1 { width:98%; }\s\n#importPanel .btn2 { width:48%; }\s\n#importPanel .btn3 { width:32%; }\s\n#importPanel .btn4 { width:24%; }\s\n#importPanel .btn5 { width:19%; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importCollisionPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML \n//{{{\nconfig.macros.importTiddlers.html = '\s\n<!-- source and report -->\s\n<table><tr><td align=left>\s\n import from\s\n <input type="radio" class="rad" name="importFrom" value="file" CHECKED\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=!this.checked?\s'block\s':\s'none\s'"> local file\s\n <input type="radio" class="rad" name="importFrom" value="http"\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=!this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> web server\s\n</td><td align=right>\s\n <input type=checkbox class="chk" id="chkImportReport" checked\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;"> create a report\s\n</td></tr></table>\s\n<!-- import from local file -->\s\n<div id="importLocalPanel" style="display:block;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\nlocal document path/filename:<br>\s\n<input type="file" id="fileImportSource" size=57 style="width:100%"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<!-- import from http server -->\s\n<div id="importHTTPPanel" style="display:none;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\n<table><tr><td align=left>\s\n remote document URL:<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="importUseProxy"\s\n onClick="config.macros.importTiddlers.useProxy=this.checked;\s\n document.getElementById(\s'importSiteProxy\s').style.display=this.checked?\s'block\s':\s'none\s'"> use a proxy script\s\n</td></tr></table>\s\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\s\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\s\n onChange="config.macros.importTiddlers.proxy=this.value;">\s\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<table><tr><td align=left>\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align=right>\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</td></tr></table>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox class="chk" id="chkAddTags" checked\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox class="chk" id="chkKeepTags" checked\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags<br>\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importCollisionPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theCollisionPanel = document.getElementById('importCollisionPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadRemoteFile(config.macros.importTiddlers.src, function(src,txt) {\n var tiddlers = readTiddlersFromHTML(txt);\n var count=tiddlers?tiddlers.length:0;\n displayMessage(config.macros.importTiddlers.foundMsg.format([count,src]));\n config.macros.importTiddlers.inbound=tiddlers;\n window.refreshImportList(0);\n });\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: ';\n theText +='[['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var inbound = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(inbound.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (inbound.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (inbound.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (inbound.status.substr(0,7)!="replace") && (inbound.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=inbound.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n inbound.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n inbound.status=(inbound.status=="")?'added':inbound.status;\n // do the import!\n // OLD: store.addTiddler(in); store.setDirty(true);\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the collision panel and set the title edit field\n document.getElementById('importCollisionPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the collision panel will still be open... close it now.\n var panel=document.getElementById('importCollisionPanel'); if (panel) panel.style.display='none';\n\n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n // gather the statistics\n var count=0;\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].status && tiddlers[t].status.trim().length && tiddlers[t].status.substr(0,7)!="skipped") count++;\n\n // generate a report\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName\n newText +=" imported "+count+" tiddler"+(count==1?"":"s")+" from\sn[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n // OLD: store.addTiddler(theReport);\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n\n // reset status flags\n for (var t=0; t<config.macros.importTiddlers.inbound.length; t++) config.macros.importTiddlers.inbound[t].status="";\n\n // refresh display if tiddlers have been loaded\n if (count) { store.setDirty(true); store.notifyAll(); }\n\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(config.macros.importTiddlers.importedMsg.format([count,tiddlers.length,config.macros.importTiddlers.src]));\n}\n//}}}\n\n/***\n!!!!!TW 2.1beta Core Code Candidate\n//The following section is a preliminary 'code candidate' for incorporation of non-interactive 'load tiddlers' functionality into TW2.1beta. //\n***/\n//{{{\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.loadTiddlers = {\n label: "",\n prompt: "add/update tiddlers from '%0'",\n askMsg: "Please enter a local path/filename or a remote URL",\n openMsg: "Opening %0",\n openErrMsg: "Could not open %0 - error=%1",\n readMsg: "Read %0 bytes from %1",\n foundMsg: "Found %0 tiddlers in %1",\n nochangeMsg: "'%0' is up-to-date... skipped.",\n loadedMsg: "Loaded %0 of %1 tiddlers from %2"\n};\n\nconfig.macros.loadTiddlers.handler = function(place,macroName,params) {\n var label=(params[0] && params[0].substr(0,6)=='label:')?params.shift().substr(6):this.label;\n var prompt=(params[0] && params[0].substr(0,7)=='prompt:')?params.shift().substr(7):this.prompt;\n var filter="updates";\n if (params[0] && (params[0]=='all' || params[0]=='new' || params[0]=='changes' || params[0]=='updates'\n || params[0].substr(0,8)=='tiddler:' || params[0].substr(0,4)=='tag:'))\n filter=params.shift();\n var src=params.shift(); if (!src || !src.length) return; // filename is required\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="confirm"); if (ask) params.shift();\n var force=(params[0]=="force"); if (force) params.shift();\n if (label.trim().length) {\n // link triggers load tiddlers from another file/URL and then applies filtering rules to add/replace tiddlers in the store\n createTiddlyButton(place,label.format([src]),prompt.format([src]), function() {\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n loadRemoteFile(src,loadTiddlers,quiet,ask,filter,force);\n })\n }\n else {\n // load tiddlers from another file/URL and then apply filtering rules to add/replace tiddlers in the store\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n loadRemoteFile(src,loadTiddlers,quiet,ask,filter,force);\n }\n}\n\nfunction loadTiddlers(src,html,quiet,ask,filter,force)\n{\n var tiddlers = readTiddlersFromHTML(html);\n var count=tiddlers?tiddlers.length:0;\n if (!quiet) displayMessage(config.macros.loadTiddlers.foundMsg.format([count,src]));\n var count=0;\n if (tiddlers) for (var t=0;t<tiddlers.length;t++) {\n var inbound = tiddlers[t];\n var theExisting = store.getTiddler(inbound.title);\n if (inbound.title=='ImportedTiddlers')\n continue; // skip "ImportedTiddlers" history from the other document...\n\n // apply the all/new/changes/updates filter (if any)\n if (filter && filter!="all") {\n if ((filter=="new") && theExisting) // skip existing tiddlers\n continue;\n if ((filter=="changes") && !theExisting) // skip new tiddlers\n continue;\n if ((filter.substr(0,4)=="tag:") && inbound.tags.find(filter.substr(4))==null) // must match specific tag value\n continue;\n if ((filter.substr(0,8)=="tiddler:") && inbound.title!=filter.substr(8)) // must match specific tiddler name\n continue;\n if (!force && store.tiddlerExists(inbound.title) && ((theExisting.modified.getTime()-inbound.modified.getTime())>=0))\n { if (!quiet) displayMessage(config.macros.loadTiddlers.nochangeMsg.format([inbound.title])); continue; }\n }\n // get confirmation if required\n if (ask && !confirm((theExisting?"Update":"Add")+" tiddler '"+inbound.title+"'\snfrom "+src))\n { tiddlers[t].status="skipped - cancelled by user"; continue; }\n // DO IT!\n // OLD: store.addTiddler(in);\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value\n tiddlers[t].status=theExisting?"updated":"added"\n count++;\n }\n if (count) {\n // refresh display\n store.setDirty(true);\n store.notifyAll();\n // generate a report\n if (config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName+" loaded "+count+" tiddlers from\sn[["+src+"|"+src+"]]:\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n // OLD: store.addTiddler(theReport);\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n }\n // always show final message when tiddlers were actually loaded\n if (!quiet||count) displayMessage(config.macros.loadTiddlers.loadedMsg.format([count,tiddlers.length,src]));\n}\n\nfunction loadRemoteFile(src,callback,quiet,ask,filter,force) {\n if (src==undefined || !src.length) return null; // filename is required\n if (!quiet) clearMessage();\n if (!quiet) displayMessage(config.macros.loadTiddlers.openMsg.format([src]));\n if (src.substr(0,4)!="http" && src.substr(0,4)!="file") { // if not a URL, fallback to read from local filesystem\n var txt=loadFile(src);\n if ((txt==null)||(txt==false)) // file didn't load\n { if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"])); }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([txt.length,src]));\n if (callback) callback(src,convertUTF8ToUnicode(txt),quiet,ask,filter,force);\n }\n }\n else {\n var x; // get an request object\n try {x = new XMLHttpRequest()} // moz\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")} // IE 6\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")} // IE 5\n catch (e) { return }\n }\n }\n // setup callback function to handle server response(s)\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status==0 || x.status == 200) {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([x.responseText.length,src]));\n if (callback) callback(src,x.responseText,quiet,ask,filter,force);\n }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,x.status]));\n }\n }\n }\n // get privileges to read another document's DOM via http:// or file:// (moz-only)\n if (typeof(netscape)!="undefined") {\n try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); }\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n // send the HTTP request\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",src,true);\n if (x.overrideMimeType) x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"]));\n displayMessage(e.description?e.description:e.toString());\n }\n }\n }\n}\n\nfunction readTiddlersFromHTML(html)\n{\n // extract store area from html \n var start=html.indexOf('<div id="storeArea">');\n var end=html.indexOf('</body>',start);\n var sa="<html><body>"+html.substring(start,end)+"</body></html>";\n\n // load html into iframe document\n var f=document.getElementById("loaderFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="loaderFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.open(); d.writeln(sa); d.close();\n\n // read tiddler DIVs from storeArea DOM element \n var sa = d.getElementById("storeArea");\n if (!sa) return null;\n sa.normalize();\n var nodes = sa.childNodes;\n if (!nodes || !nodes.length) return null;\n var tiddlers = [];\n for(var t = 0; t < nodes.length; t++) {\n var title = null;\n if(nodes[t].getAttribute)\n title = nodes[t].getAttribute("tiddler");\n if(!title && nodes[t].id && (nodes[t].id.substr(0,5) == "store"))\n title = nodes[t].id.substr(5);\n if(title && title != "")\n tiddlers.push((new Tiddler()).loadFromDiv(nodes[t],title));\n }\n return tiddlers;\n}\n//}}}
/***\n''InlineJavascriptPlugin for ~TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#InlineJavascriptPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nInsert Javascript executable code directly into your tiddler content. Lets you ''call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a label="..." parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://www.TiddlyTools.com/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly\n''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]'' added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 5, revision: 1, date: new Date(2006,6,1)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[4]) { // there is script code\n if (lookaheadMatch[3]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[4]+"};_out(this);"\n link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[4]+"};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n
[img[els/banner.gif]] [img[els/i4logo.gif]]\n''Intuitive'' \sIn*tu"i*tive\s (//adj.//)\n>1. Seeing clearly; as, an intuitive view; intuitive vision.\n>2. Knowing, or perceiving, by intuition;\n>3. Capable of knowing without deduction or reasoning.\n''Interfaces'' \sIn`ter"faces\s (//noun//)\n>1. Devices and/or processes for controlling and monitoring inter-operability between complex physical systems and mechanisms\n>2. Visual, syntactic and semantic conventions and procedures for the representation and exchange of information and/or commands for controlling software applications and digital presentations.\n''Intelligent'' \sIn*tel"li*gent\s (//adj.//)\n>1. Possessing sound knowledge\n>2. Exercising or showing good judgment\n>3. Endowed with the capacity to reason\n''Interactions'' \sIn`ter*ac"tions\s (//noun//)\n>1. Mutual or reciprocal actions or influence\n>2. Sequences of events, actions, and conditional responses, combined to achieve specific goals or purposes\n
[>img[Creative Commons Attribution-ShareAlike 2.5 License|images/somerights20.png][http://creativecommons.org/licenses/by-sa/2.5/]]''Copyrights:''\n<<<\nThis work is based upon TiddlyWiki <<version>>, written by Jeremy Ruston, &copy; Osmosoft Limited, which has been distributed under a BSD open source license.\n\nThis work may contain portions of copyrighted materials from other sources. In accordance with "fair use" principles (see [[United States Copyright Law, Title 17, Section 107|http://www.copyright.gov/title17/92chap1.html#107]]), such materials have been reproduced without profit for purposes of criticism, comment, news reporting, instruction, scholarship, and/or research.\n\nModifications and additions to this work, including (but not limited to) original programmatic components ("plugins", "macros", "scripts", "stylesheets") have been created by ELS Design Studios. You are permitted to use, copy, and/or modify these components, subject to the terms and conditions of the [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] as well as all other terms and conditions specifically included within the body of this work.\n\nAny modifications and/or additions that you make to a licensed component must be clearly identified as a derivative work that is easily distinguished from the original version, and must retain appropriate licensing information and references (i.e., ~URLs) to the official distribution source for the unaltered component.\n\nAll other original content, including (but not limited to) writings, images, sound recordings, and videos, are the property of __Eric L. Shulman__ and/or __ELS Design Studios__, or are used under license or agreement with third parties and, except as required for normative operation and viewing of this work, may not be stored, displayed or re-transmitted in any form, nor used for any commercial purposes, without the specific prior permission of the respective rights holders.\n<<<\n''Trademarks/servicemarks:''\n<<<\n"ELS Design Studios", "~TiddlyTools", "~TiddlyStudios", "~TiddlyTech", "~TiddlyLabs", "Small Tools for Big Ideas!", "Intuitive Interfaces for Intelligent Interactions" and the "i4" logo (in graphical //and// text forms) are trademarks or servicemarks of ELS Design Studios and may not be used without permission.\n<<<\n''Limits on Liability:''\n<<<\nAll materials are presented on an "as-is" basis and are subject to change without notice. The author of this document makes no claims regarding the suitability or reliability of the information presented, and assumes no liability for any damages that may occur as a result of its use.\n<<<\n''Privacy Notice: ''\n<<<\nThis site limits the collection and use of non-public, personal customer information to that which is needed to offer products and services, and to file reports or financial statements as required by law. This site has physical, electronic and procedural safeguards to maintain the protections of private information, and does not provide, sell or otherwise disclose such information to non-affiliated third parties.\n<<<\n{{center{^^//please review these statements periodically, as they are subject to change without notice//^^}}}
[[StyleSheetAdjustments]]\n[[BrightText]]\n/* ==== Let's Get Tanked! ==== */\n/*{{{*/\nbody\n { background-image: url('[[Let's Get Tanked! Background]]'); background-color:#113; }\n/* DISABLE "opacity/alphafilter" - slows FireFox to a crawl!!!\n.menubox\n { background-image: none; background-color: #003; opacity:.80; filter:alpha(opacity=80); }\n.viewer\n { background-image: none; X_background-color: #003; X_opacity:.80; X_filter:alpha(opacity=80);\n border:2px solid; -moz-border-radius:1em; padding:1em }\n*/\n.menubox\n { background: #003; border:1px solid; -moz-border-radius:1em; padding:1em }\n.viewer\n { background: none; border:1px solid; -moz-border-radius:1em; padding:1em }\n.header\n { background-image: none; background-color:transparent; color:#ccf; border:0; }\n.floatingPanel, .attachPanel, #importPanel, #exportPanel,\n { background: #eef; }\n.floatingPanel a, .attachPanel a, #importPanel a, #exportPanel a, #sidebarTabs .tabContents a,\n.floatingPanel .button, .attachPanel .button, #importPanel .button, #exportPanel .button, #sidebarTabs .tabContents .button,\n.floatingPanel .tiddlyLinkExisting, .attachPanel .tiddlyLinkExisting, #importPanel .tiddlyLinkExisting, #exportPanel .tiddlyLinkExisting, #sidebarTabs .tabContents .tiddlyLinkExisting\n { color:#009; }\n.siteMenu .floatingPanel, #messageArea \n { background: #eef; }\n.tiddlyCard { background:#ffd; }\n.viewer h1,.viewer h2,.viewer h3,.viewer h4,.viewer h5 { background: #666; color:#fff; }\n#sidebarTabs .tabContents\n { background-color:#003; }\n#sidebarTabs .tabContents a, #sidebarTabs .tabContents .button, #sidebarTabs .tabContents .tiddlyLinkExisting\n { color:#99f; }\n/*}}}*/
| source file|{{{...images\sfish.jpg}}}|\n| attached on|20 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/fish.jpg|images/fish.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|Let's Get Tanked! Background]] or [img[tooltip|Let's Get Tanked! Background][link]]}}}\n[img[tooltip|Let's Get Tanked! Background]]\n<<<\n
<html><form action="javascript:displayMessage('perform action')" onsubmit="displayMessage('onsubmit: validate input...')">\nPlease enter information about this <!--doctype-->document<!--doctype-->:<br><!--\n--><input type="hidden" name="cardtype" value="LibraryReferenceForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/document id" name="cardID" value="card/document ID"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:15%" title="version" name="ver" value="version"><!--\n--><input type="text" onfocus="this.select()" style="width:15%" title="document date" name="date" value="date"><!--\n--><input type="text" onfocus="this.select()" style="width:48%" title="author/contact" name="author" value="author/contact"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="document title" name="title" value="title"><!--\n--><select name="doctype" size=1 style="width:20%" title="document type"><!--\n--> <option value="document" selected>document type...</option><!--\n--> <option value="proposal">proposal</option><!--\n--> <option value="specification">specification</option><!--\n--> <option value="white paper">white paper</option><!--\n--> <option value="project schedule">project schedule</option><!--\n--> <option value="technical reference">tech reference</option><!--\n--> <option value="user guide">user guide</option><!--\n--></select><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="document location (url)" name="url" value="location (url)"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="dnd"> do not distribute <!--\n--><input type="checkbox" name="rfc"> review for comment <!--\n--><input type="radio" name="status" value="outline">outline <!--\n--><input type="radio" name="status" value="draft">draft <!--\n--><input type="radio" name="status" value="final">final <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="summary"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">notes</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="tags">\n</form></html>\n----\n__/%title%//%title%/__\nby: /%author%//%author%/\nlocation: /%url%//%url%/\ntype/status: /%doctype%//%doctype%/ - /%status%//%status%/\nversion: /%ver%//%ver%/ (/%date%//%date%/) - /%dnd%/''pre-release... please do not distribute this document''/%dnd%//%dnd=false%/''It's OK to share this document''/%dnd=false%/\nsummary:\n>/%summary%//%summary%/\nnotes:\n>/%notes%//%notes%/\ntags: /%tags%//%tags%/
''other sites:''\n<<tiddler SliderFrame\n with: "TiddlyWiki.com" http://www.tiddlywiki.com 100% 500 Links_twcom>>/%\n%/ <<tiddler SliderFrame\n with: "TiddlyWiki.org" http://www.tiddlywiki.org 100% 500 Links_tworg>>/%\n%/ <<tiddler SliderFrame\n with: "TiddlySpot.com" http://www.tiddlyspot.com 100% 500 Links_tspot>>/%\n%/ <<tiddler SliderFrame\n with: "Google groups" http://groups.google.com/group/TiddlyWiki 100% 500 Links_groups>>/%\n%/ <<tiddler SliderFrame\n with: "del.icio.us tags" http://del.icio.us/tag/tiddlywiki 100% 500 Links_delicious>>/%\n%/ <<tiddler SliderFrame\n with: "Frappr map" http://www.frappr.com/TiddlyWiki 100% 500 Links_frappr>>/%\n%/<script>\n place.insertBefore(document.getElementById("Links_twcom"),null);\n place.insertBefore(document.getElementById("Links_tworg"),null);\n place.insertBefore(document.getElementById("Links_tspot"),null);\n place.insertBefore(document.getElementById("Links_groups"),null);\n place.insertBefore(document.getElementById("Links_delicious"),null);\n place.insertBefore(document.getElementById("Links_frappr"),null);\n</script>
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Candlelight"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Candlelight"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="1"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value=" http://cdbaby.com/mp3lofi/vlhohenstein-01.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value=""><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Rhythmic Strings, 12-string guitar, cello, oboe, flute, marc tree"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">The flame dances upon its wick. It jumps around by the slightest of breeze, very playful in nature. It is the light in the darkness. It is the central focal point of meditation. It is the light of hope for a brighter future.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/1 /%track number%/: /%title%/Candlelight /%title%/\nListen: /%url%/ http://cdbaby.com/mp3lofi/vlhohenstein-01.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/The flame dances upon its wick. It jumps around by the slightest of breeze, very playful in nature. It is the light in the darkness. It is the central focal point of meditation. It is the light of hope for a brighter future./%notes%/\n<<<\n^^Instruments: /%instruments%/Rhythmic Strings, 12-string guitar, cello, oboe, flute, marc tree /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:ColdFusion"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Cold Fusion"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="7"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-07.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Cello, synthesized voice, bells, oboe, bassoon, marc tree"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">Energy drawn from sub-atomic powerhouses. Fire, but without heat or light.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/7 /%track number%/: /%title%/Cold Fusion /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-07.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/Energy drawn from sub-atomic powerhouses. Fire, but without heat or light./%notes%/\n<<<\n^^Instruments: /%instruments%/Cello, synthesized voice, bells, oboe, bassoon, marc tree /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Embers"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Embers"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="8"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-08.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Bassoon, shakuhachi, cello"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">The fading of fire’s last light. It is the warm glow that dances in and through the remains of logs that once were burning intensely.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/8 /%track number%/: /%title%/Embers /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-08.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/The fading of fire’s last light. It is the warm glow that dances in and through the remains of logs that once were burning intensely./%notes%/\n<<<\n^^Instruments: /%instruments%/Bassoon, shakuhachi, cello /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Flare"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Flare"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="6"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-06.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Electric guitar, pizzicato strings, gong, marc tree, djembe"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">Solar prominences burst forth into the darkness. Energy long simmering in star fire erupts to punctuate the quiet solitude and briefly illuminate the vastness.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/6 /%track number%/: /%title%/Flare /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-06.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/Solar prominences burst forth into the darkness. Energy long simmering in star fire erupts to punctuate the quiet solitude and briefly illuminate the vastness./%notes%/\n<<<\n^^Instruments: /%instruments%/Electric guitar, pizzicato strings, gong, marc tree, djembe /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Fuego"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Fuego"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="5"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-05.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Marimba, bells, violin, whistle, marc tree"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">A warm tropical island in the South Pacific Ocean, with a gentle breeze blowing, where one can enjoy the festive atmosphere and the warmth of the fiery red sunset.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/5 /%track number%/: /%title%/Fuego /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-05.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/A warm tropical island in the South Pacific Ocean, with a gentle breeze blowing, where one can enjoy the festive atmosphere and the warmth of the fiery red sunset./%notes%/\n<<<\n^^Instruments: /%instruments%/Marimba, bells, violin, whistle, marc tree /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Hearth"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Hearth"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="3"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-03.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Bass strings, cello, electric guitar, oboe, soprano voice, whistle, bass voice, bells"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">The warmth created around the fireplace on a cold winter’s night. It is the company of friends and family. It is the satisfied enjoyment of an after dinner drink and desert</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/3 /%track number%/: /%title%/Hearth /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-03.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/The warmth created around the fireplace on a cold winter’s night. It is the company of friends and family. It is the satisfied enjoyment of an after dinner drink and desert/%notes%/\n<<<\n^^Instruments: /%instruments%/Bass strings, cello, electric guitar, oboe, soprano voice, whistle, bass voice, bells /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Kindling"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Kindling"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="2"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-02.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Rhythmic Strings, Low Shakuhachi, High Shakuhachi, bass voice, bass strings, drums"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">Gather the twigs and branches from the forest to start a fire. Once gathered and assembled the match is lit and the fire begins. Small sparks flying off and soon catching the main logs of the fire to create the warmth.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/2 /%track number%/: /%title%/Kindling /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-02.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/Gather the twigs and branches from the forest to start a fire. Once gathered and assembled the match is lit and the fire begins. Small sparks flying off and soon catching the main logs of the fire to create the warmth./%notes%/\n<<<\n^^Instruments: /%instruments%/Rhythmic Strings, Low Shakuhachi, High Shakuhachi, bass voice, bass strings, drums /%instruments%/^^
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDTrackForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="MFSB4:Magma"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:50%" title="track title" name="title" value="Magma"><!--\n--><input type="text" onfocus="this.select()" style="width:5%" title="track number" name="track number" value="4"><!--\n--><input type="text" onfocus="this.select()" style="width:44%" title="CD title" name="CDtitle" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-04.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="instruments" name="instruments" value="Clarinet, bells, synthesized voice, bass strings"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">Deep magma rises slowly beneath the mountain. Heat and pressure turn solid stone to flowing, glowing liquid fire.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDTrackCard">\n</form></html>\n----\n/%CDtitle%/Music for Sentient Beings - Volume IV /%CDtitle%/\nTrack #/%track number%/4 /%track number%/: /%title%/Magma /%title%/\nListen: /%url%/http://cdbaby.com/mp3lofi/vlhohenstein-04.m3u /%url%/\n----\nNotes:\n<<<\n/%notes%/Deep magma rises slowly beneath the mountain. Heat and pressure turn solid stone to flowing, glowing liquid fire./%notes%/\n<<<\n^^Instruments: /%instruments%/Clarinet, bells, synthesized voice, bass strings /%instruments%/^^
/%\n\nTIDDLER CONTENTS COPIED FROM: MainMenuFull\n\n%/{{menubox{{{fine{{{big{\n<script label="welcome">story.closeTiddler('Welcome');story.displayTiddler(null,'Welcome',1);return false;</script>\n[[about|About]]\n[[download|Download]]\n[[contact|Contact]]\n}}}{{normal{@@display:block;/%\n\nRECENT CHANGES: %/\n{{nowrap{+++(changes)[changes|recently changed tiddlers]...{{borderleft{\n {{fine{//@@color:#999;as of <<date filedate "MMM DDth, YYYY 0hh:0mm:0ss">>@@//}}}\n {{small{<<tiddler ShowRecentChanges>>}}}}}}===\n}}}/%\n\nPLUGINS, STYLES, SCRIPTS, TEMPLATES, ATTACHMENTS: %/\n{{nowrap{+++(plugins)[plugins|installed plugins, scripts, macros, styles, templates, etc.]...{{borderleft{\n {{small{<<tiddler ShowComponents>>}}}}}}===\n}}}/%\n\nLEGAL STUFF: %/\n{{nowrap{[[legal|LegalStatements]]<script>\n place.lastChild.className="button";\n</script>}}}/%\n\nEXTRAS: %/\n\n@@}}}{{big{<script label="extras...">\n story.closeTiddler('SiteMenuExtras');story.displayTiddler(null,'SiteMenuExtras',1);return false;\n</script>}}}}}}}}}
{{menubox{{{fine{{{big{\n<script label="welcome">story.closeTiddler('Welcome');story.displayTiddler(null,'Welcome',1);return false;</script>\n[[about|About]]\n[[download|Download]]\n[[contact|Contact]]\n}}}{{normal{@@display:block;/%\n\nRECENT CHANGES: %/\n{{nowrap{+++(changes)[changes|recently changed tiddlers]...{{borderleft{\n {{fine{//@@color:#999;as of <<date filedate "MMM DDth, YYYY 0hh:0mm:0ss">>@@//}}}\n {{small{<<tiddler ShowRecentChanges>>}}}}}}===\n}}}/%\n\nPLUGINS, STYLES, SCRIPTS, TEMPLATES, ATTACHMENTS: %/\n{{nowrap{+++(plugins)[plugins|installed plugins, scripts, macros, styles, templates, etc.]...{{borderleft{\n {{small{<<tiddler ShowComponents>>}}}}}}===\n}}}/%\n\nLEGAL STUFF: %/\n{{nowrap{[[legal|LegalStatements]]<script>\n place.lastChild.className="button";\n</script>}}}/%\n\nEXTRAS: %/\n\n@@}}}{{big{<script label="extras...">\n story.closeTiddler('SiteMenuExtras');story.displayTiddler(null,'SiteMenuExtras',1);return false;\n</script>}}}}}}}}}
{{menubox{{{fine{{{big{\n<script label="welcome">story.closeTiddler('Welcome');story.displayTiddler(null,'Welcome',1);return false;</script>\n[[about|About]]\n[[download|Download]]\n[[contact|Contact]]\n}}}{{normal{@@display:block;/%\n\nRECENT CHANGES: %/\n{{nowrap{+++(changes)[changes|recently changed tiddlers]...{{borderleft{\n {{fine{//@@color:#999;as of <<date filedate "MMM DDth, YYYY 0hh:0mm:0ss">>@@//}}}\n {{small{<<tiddler ShowRecentChanges>>}}}}}}===\n}}}/%\n\nLEGAL STUFF: %/\n{{nowrap{[[legal|LegalStatements]]<script>\n place.lastChild.className="button";\n</script>}}}/%\n\nEXTRAS: %/\n\n@@}}}{{big{<script label="extras...">\n story.closeTiddler('SiteMenuExtras');story.displayTiddler(null,'SiteMenuExtras',1);return false;\n</script>}}}}}}}}}
{{menubox{{{fine{{{big{\n<script label="welcome">story.closeTiddler('Welcome');story.displayTiddler(null,'Welcome',1);return false;</script>\n[[about|About]]\n}}}{{normal{@@display:block;/%\n\nLEGAL STUFF: %/\n{{nowrap{[[legal|LegalStatements]]<script>\n place.lastChild.className="button";\n</script>}}}/%\n\nEXTRAS: %/\n\n@@}}}{{big{<script label="extras...">\n story.closeTiddler('SiteMenuExtras');story.displayTiddler(null,'SiteMenuExtras',1);return false;\n</script>}}}}}}}}}
<html><form id="playerform_$1" style="margin:0;padding:0"\n onsubmit="document.getElementById('player_$1').style.display=document.getElementById('mediacenter_resize_$1').style.display='inline'; config.macros.player.loadURL(null,'player_$1',null,this.url.value,this.w.value,this.h.value,this.ctrls.checked);this.done.disabled=false;return false;"><!--\n--><nobr><select size="1" style="font-size:8pt;width:33%"\n onchange="this.form.url.value=this.value; document.getElementById('mediacenter_resize_$1').style.display='inline'; config.macros.player.loadURL(null,'player_$1', null, this.form.url.value, this.form.w.value, this.form.h.value, this.form.ctrls.checked); this.form.done.disabled=false">\n<option value="">favorites...</option>\n\n<!-- BEGIN FAVORITES -->\n<option value="http://www.nccbuscc.org/cchd/povertyusa/tour.swf">&nbsp; "PovertyUSA" - WATCH THIS!</option>\n<option value="http://wolfram.org/media/jack_20050310_cleaned.mov">&nbsp; Jack W counts (1yr old)</option>\n<option value="http://www.kulakswoodshed.com/high.asx">&nbsp; Kulak's Woodshed: Live/Recorded acoustic music</option>\n<!-- insertion marker - do not remove this comment -->\n<option value="">webcams...</option>\n<option value="http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx">&nbsp; Times Square</option>\n<option value="http://www.mbayaq.org/media/STRM/mba_mbay.asx">&nbsp; Monterey Bay</option>\n<option value="http://www.mbayaq.org/media/strm/mba_shark.asx">&nbsp; Monterey Aquarium - Sharks</option>\n<option value="http://www.aroundtownnc.com/wvx/beachcam.wvx">&nbsp; Wrightsville Beach, North Carolina</option>\n<option value="http://www.terena.nl/~dick/cam2.asx">&nbsp; Koningsplein, Amsterdam</option>\n<option value="http://195.6.173.164/liensmedias/webcam.asx">&nbsp; Corsica</option>\n<option value="">news...</option>\n<option value="http://www.bbc.co.uk/newsa/n5ctrl/tvseq/n24/nb/rm/video/heads_nb.ram">&nbsp; BBC News24 - Live</option>\n<option value="http://www.bbc.co.uk/london/realmedia/news/tvnews.ram">&nbsp; BBC News - London Summary</option>\n<option value="http://www.bbc.co.uk/newsa/n5ctrl/summaries/entertain/bb_liquid_news.ram">&nbsp; BBC Entertainment News</option>\n<option value="http://www.bloomberg.com/streams/video/LiveBTV200.ram">&nbsp; Bloomberg Business News</option>\n<option value="">movies (AmericaFree.TV)...</option>\n<option value="http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov">&nbsp; Classic Comedy</option>\n<option value="http://www.americafree.tv/unicast_mov/AmericaFreeTVClassics.mov">&nbsp; Classic Movies</option>\n<option value="http://www.americafree.tv/unicast_mov/AmericaFreeTVDimensionB.mov">&nbsp; "B" Movies</option>\n<option value="">science/education...</option>\n<option value="http://www.scctv.net/annenberg_broadband.asx">&nbsp; PBS: Annenberg/CPB</option>\n<option value="http://science.ksc.nasa.gov/video/nasatv/nasatv.asx">&nbsp; NASA TV</option>\n<option value="">government...</option>\n<option value="http://play.rbn.com/play.asx?url=cspan/cspan/wmlive/cspan1v.asf&proto=mms?mswmext=.asx">&nbsp; C-SPAN 1</option>\n<option value="http://play.rbn.com/play.asx?url=cspan/cspan/wmlive/cspan2v.asf&proto=mms?mswmext=.asx">&nbsp; C-SPAN 2</option>\n<option value="http://play.rbn.com/play.asx?url=cspan/cspan/wmlive/cspan3v.asf&proto=mms?mswmext=.asx">&nbsp; C-SPAN 3</option>\n<option value="">games...</option>\n<option value="http://www.planetdan.net/pics/misc/georgerag.swf">&nbsp; Rag Doll</option>\n<option value="http://www.80smusiclyrics.com/games/asteroids/asteroids.swf">&nbsp; Asteroids</option>\n<option value="http://www.80smusiclyrics.com/games/pacman/pacman.swf">&nbsp; PacMan</option>\n<option value="http://www.aftergames.com/games/pp_tetris.swf">&nbsp; Tetris</option>\n<option value="http://www.80smusiclyrics.com/games/simon/simon.swf">&nbsp; Simon</option>\n<option value="http://www.aftergames.com/games/pp_breakout.swf">&nbsp; Breakout</option>\n<!-- END FAVORITES -->\n\n</select><!--\n--><input type="button" value="add" title="add URL to the MediaCenter favorites" style="font-size:8pt;width:5%"\n onclick="window.mediaCenterAdd(this.form.url);"><!--\n--><input type="button" value="del" title="remove URL from the MediaCenter favorites" style="font-size:8pt;width:5%"\n onclick="window.mediaCenterDelete(this.form.url);"><!--\n--><input type="text" name="url" size="60" value="" style="font-size:8pt;width:40%"\n onfocus="this.select()"><!--\n--><input type="submit" value="go" title="view URL in embedded player" style="font-size:8pt;width:4%"><!--\n--><input type="button" value="open" title="view URL in a separate player" style="font-size:8pt;width:6%"\n onclick="if(this.form.url.value.length)window.open(this.form.url.value)"><!--\n--><input type="button" value="done" name="done" disabled title="disconnect from URL" style="font-size:8pt;width:6%"\n onclick="config.macros.player.loadURL(null,'player_$1',null,null,this.form.w.value,'0px');document.getElementById('player_$1').style.display=document.getElementById('mediacenter_resize_$1').style.display='none';this.disabled=true; "><!--\n--><center><<player "id=player_$1" "" 100% 0>></center><span id="mediacenter_resize_$1" style="margin-top:2px;display:none;"><div style="float:right;font-size:8pt"><!--\n--> size: <input type="text" name="w" size="3" value="" style="font-size:8pt;"\n onfocus="this.select()"><!--\n-->x<input type="text" name="h" size="3" value="" style="font-size:8pt;"\n onfocus="this.select()"><!--\n--> <input type="submit" value="set" style="font-size:8pt;width:5%"\n onclick="if(!this.form.w.value.trim().length)this.form.w.value=config.options.txtPlayerDefaultWidth; if(!this.form.h.value.trim().length)this.form.h.value=config.options.txtPlayerDefaultHeight;"><!--\n--><input type="submit" value="reset" style="font-size:8pt;width:5%"\n onclick="this.form.w.value=config.options.txtPlayerDefaultWidth; this.form.h.value=config.options.txtPlayerDefaultHeight; this.form.ctrls.checked=true"><!--\n--><input type="button" value="fit" title="resize player to fit containing window" style="font-size:8pt;width:5%"\n onclick="window.mediaCenterFitSize(this)"><!--\n--></div><!--\n--> <input type="checkbox" name="ctrls" CHECKED \n onclick="config.macros.player.loadURL(null,'player_$1', null, this.form.url.value, this.form.w.value, this.form.h.value, this.checked)">show controls</span><!--\n--></nobr></form></html><script>\n\ndocument.getElementById("playerform_$1").w.value=config.options.txtPlayerDefaultWidth;\ndocument.getElementById("playerform_$1").h.value=config.options.txtPlayerDefaultHeight;\ndocument.getElementById("player_$1").style.display='none';\n\nwindow.mediaCenterFitSize = function(place) {\n var trim=89; // fudge factor to account for the other controls + padding + borders. ADJUST THIS VALUE TO FIT LAYOUT\n var t=story.findContainingTiddler(place); if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;\n var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:\n var h=t.offsetHeight-trim; // workaround: get containing panel/tiddler height and subtract "trim" height\n config.macros.player.loadURL(null,'player_$1',null,place.form.url.value,w,h,place.form.ctrls.checked); // reload player with new size\n place.form.w.value=w; place.form.h.value=h; // update width/height input fields\n}\n\nwindow.mediaCenterAdd = function(place) {\n if (!place.value.length) return;\n var tiddler = store.getTiddler("MediaCenter");\n var pos=tiddler.text.indexOf("<!-- insertion marker");\n if (pos==-1) pos=tiddler.text.length;\n var description=prompt("Please enter a description for\sn"+place.value);\n if (!description || !description.length) return;\n var txt='<option value="'+place.value+'">&nbsp; '+description+'</option>\sn';\n tiddler.set(null,tiddler.text.substr(0,pos)+txt+tiddler.text.substr(pos));\n story.refreshTiddler("MediaCenter",1,true);\n store.setDirty(true);\n}\nwindow.mediaCenterDelete = function(place) {\n if (!confirm("Are you sure you want to remove this favorite?\sn\sn"+place.value)) return;\n var tiddler = store.getTiddler("MediaCenter");\n var optRegExp=new RegExp('<option value="'+place.value+'">&nbsp; .*</option>\s\s\sn',"i");\n tiddler.set(null,tiddler.text.replace(optRegExp,""));\n story.refreshTiddler("MediaCenter",1,true);\n store.setDirty(true);\n}\n</script>
<html><form target="browser_$1" style="margin:0;padding:0"\n onsubmit="this.action=this.url.value; this.form.done.disabled=false" style="margin:0;padding:0"><!--\n--><input type="button" value="<" title="back" style="font-size:8pt;width:3%"\n onclick="try{window.frames['browser_$1'].history.go(-1)}catch(e){window.history.go(-1)}" ><!--\n--><input type="button" value=">" title="forward" style="font-size:8pt;width:3%"\n onclick="try{window.frames['browser_$1'].history.go(+1)}catch(e){window.history.go(+1)}"><!--\n--><input type="button" value="+" title="refresh"style="font-size:8pt;width:3%"\n onclick="window.frames['browser_$1'].location.reload()"><!--\n--><input type="button" value="x" title="stop"style="font-size:8pt;width:3%"\n onclick="window.stop()"><!--\n--><select name="bookmarks" size="1" style="font-size:8pt;width:21%"\n onchange="var f=document.getElementById('browser_$1'); if (!this.value.length) return window.miniBrowserResetSize(); else window.miniBrowserSetSize(this.form); this.form.url.value=this.value; this.form.action=this.value; this.form.submit(); this.form.done.disabled=false">\n<option value="">bookmarks...</option>\n\n\n<!-- DO NOT EDIT ABOVE THIS LINE --><!-- MARKER -->\n<option value=""><!--blank line--></option>\n<option value="">TiddlySites:</option>\n<option value="http://www.TiddlyWiki.com" title="current official release">&nbsp; TiddlyWiki.com</option>\n<option value="http://www.TiddlyWiki.com/dev/" title="current release notes">&nbsp; TiddlyWiki.com/dev</option>\n<option value="http://www.TiddlyWiki.com/beta/" title="beta pre-prelease">&nbsp; TiddlyWiki.com/beta</option>\n<option value="http://www.TiddlyWiki.org" title="new development/wiki/source control">&nbsp; TiddlyWiki.org</option>\n<option value="http://www.TiddlyTools.com" title="plugins, scripts, templates, etc.">&nbsp; TiddlyTools</option>\n<option value="http://www.TiddlySpot.com" title="instant TiddlyWiki hosting!!">&nbsp; TiddlySpot</option>\n<option value="http://groups.google.com/group/TiddlyWiki/" title="discussion/help">&nbsp; Google Groups</option>\n<option value="http://del.icio.us/tag/tiddlywiki" title="find popular TiddlyWiki sites">&nbsp; del.icio.us</option>\n<option value="http://www.frappr.com/TiddlyWiki" title="add YOUR pin to the TiddlyWiki world-wide user map!">&nbsp; Frappr</option>\n<option value=""><!--blank line--></option>\n<option value="">General:</option>\n<option value="http://www.cnn.com">&nbsp; News - CNN</option>\n<option value="http://news.bbc.co.uk">&nbsp; News - BBC</option>\n<option value="http://www.unitedmedia.com/comics/">&nbsp; Comics</option>\n<option value="http://tv.yahoo.com/grid?.intl=us&zip=94086&.done=&lineup=us_CA04614">&nbsp; Television</option>\n<option value="http://www.wunderground.com/US/CA/Sunnyvale.html">&nbsp; Weather</option>\n<option value="http://quake.wr.usgs.gov/recenteqs/latest.htm">&nbsp; Earthquakes</option>\n<option value="http://maps.google.com">&nbsp; Maps</option>\n<!-- DO NOT EDIT BELOW THIS LINE -->\n\n\n</select><!--\n--><input type="button" value="add" title="add this URL to the MiniBrowser bookmarks" style="font-size:8pt;width:5%"\n onclick="window.miniBrowserAddBookmark(this.form.url);"><!--\n--><input type="button" value="del" title="remove this URL from the MiniBrowser bookmarks" style="font-size:8pt;width:5%"\n onclick="window.miniBrowserDeleteBookmark(this.form.url);"><!--\n--><input type="text" name="url" size="60" value="" style="font-size:8pt;width:40%"\n onfocus="this.select();" onkeyup="var k=event.keyCode; if (k==13|k==10) this.form.go.click();"><!--\n--><input type="button" name="go" value="go" title="view this URL" style="font-size:8pt;width:4%"\n onclick="if(!this.form.url.value.length) return; window.miniBrowserSetSize(this.form); this.form.action=this.form.url.value; this.form.submit(); this.form.done.disabled=false"><!--\n--><input type="button" value="open" title="open this URL in a separate window" style="font-size:8pt;width:6%"\n onclick="if(this.form.url.value.length) window.open(this.form.url.value)"><!--\n--><input type="button" value="done" name="done" title="stop viewing this URL" disabled style="font-size:8pt;width:6%"\n onclick="this.form.url.value=''; this.form.bookmarks.selectedIndex=0; window.miniBrowserResetSize(); this.disabled=true;">\n<iframe name="browser_$1" id="browser_$1" style="width:100%;height:1em;display:none;background:#fff;border:1px solid"></iframe><div id="browser_resize_$1" style="text-align:center;marginTop:2px;display:none;font-size:8pt"><!--\n--> size: <input type="text" name="w" size="3" value="100%" style="font-size:8pt;"\n onfocus="this.select()"><!--\n-->x<input type="text" name="h" size="3" value="400" style="font-size:8pt;"\n onfocus="this.select()"><!--\n--> <input type="button" value="set" style="font-size:8pt;"\n onclick="var w=this.form.w.value.trim(); if (!w||!w.length) w='100%'; var h=this.form.h.value.trim(); if (!h||!h.length) h='400'; if (!w.replace(/[0-9]*/,'').length) w+='px'; if (!h.replace(/[0-9]*/,'').length) h+='px'; var f=document.getElementById('browser_$1'); f.style.width=w; f.style.height=h;"><!--\n--><input type="button" value="reset" style="font-size:8pt;"\n onclick="var w='100%'; var h='400'; var f=document.getElementById('browser_$1'); f.style.width=w; f.style.height=h+'px'; this.form.w.value=w; this.form.h.value=h;"><!--\n--><input type="button" value="fit" title="resize to fit containing window" style="font-size:8pt;"\n onclick="window.miniBrowserFitSize(this)"><!--\n--></div></form></html><script>\n\nwindow.miniBrowserSetSize = function(form) {\n var f=document.getElementById('browser_$1');\n var w=form.w.value.trim(); if (!w||!w.length) w='100%'; if (!w.replace(/[0-9]*/,'').length) w+='px'; \n var h=form.h.value.trim(); if (!h||!h.length) h='400'; if (!h.replace(/[0-9]*/,'').length) h+='px';\n f.style.width=w; f.style.height=h; f.style.display="block";\n document.getElementById('browser_resize_$1').style.display="block";\n return false;\n}\n\nwindow.miniBrowserResetSize = function() {\n var f=document.getElementById('browser_$1');\n if (f.src.length) f.src="";\n f.style.width='100%'; f.style.height='1em'; f.style.display="none";\n document.getElementById('browser_resize_$1').style.display="none";\n return false;\n}\nwindow.miniBrowserFitSize = function(place) {\n var trim=88; // fudge factor for controls + padding + borders. ADJUST TO FIT LAYOUT\n var t=story.findContainingTiddler(place);\n if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;\n var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:\n var h=(t.offsetHeight-trim); // workaround: get containing panel/tiddler height and subtract "trim" height\n place.form.w.value=w; place.form.h.value=h; // update width/height input fields\n var f=document.getElementById('browser_$1');\n f.style.width=w; f.style.height=h+"px";\n}\n\nwindow.miniBrowserAddBookmark = function(place) {\n if (!place.value.length) return;\n var tiddler = store.getTiddler("MiniBrowser");\n var mark="<!-- MARKER -->"\n var pos=tiddler.text.indexOf(mark);\n if (pos==-1) { alert("Cannot add bookmark: <!-- MARKER --> not found"); return; }\n var description=prompt("Please enter a description for\sn"+place.value);\n if (!description || !description.length) return;\n var txt='\sn<option value="'+place.value+'">&nbsp; '+description+'</option>';\n tiddler.set(null,tiddler.text.substr(0,pos+mark.length)+txt+tiddler.text.substr(pos+mark.length));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MiniBrowser",1,true);\n store.setDirty(true);\n}\n\nwindow.miniBrowserDeleteBookmark = function(place) {\n if (!place.value||!place.value.length) return;\n if (!confirm("Are you sure you want to remove this MiniBrowser bookmark?\sn\sn"+place.value)) return;\n var tiddler = store.getTiddler("MiniBrowser");\n var optRegExp=new RegExp('<option value="'+place.value+'">&nbsp; .*</option>\s\s\sn',"i");\n tiddler.set(null,tiddler.text.replace(optRegExp,""));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MiniBrowser",1,true);\n store.setDirty(true);\n}\n\n</script><<tiddler HideTiddlerTags>>
/***\n''MoveablePanelPlugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#MoveablePanelPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAdd move, size, max/restore mouse event handling and fold/unfold, hover/scroll, and close/dock toolbar command items to any floating panel or tiddler. (see NestedSlidersPlugin for floating panel syntax/usage).\n\n!!!!!Usage\n<<<\nsyntax: {{{<<moveablePanel>>}}}\n\nexample: //using NestedSlidersPlugin 'floating panel' syntax//\n//{{{\n+++^30em^[panel]<<moveablePanel>>this is a headline for the panel\n----\n this is a moveable floating panel\n with a few lines of text\n as an example for you to try...\n //note: this line is really long so you can see what happens to word wrapping when you re-size this panel//\n===\n//}}}\nTry it: +++^30em^[panel]<<moveablePanel>>this is a headline for the panel\n----\n this is a moveable floating panel\n with a few lines of text\n as an example for you to try...\n //note: this line is really long so you can see what happens to word wrapping when you re-size this panel//\n===\n\n\nWhen the mouse is just inside the edges of the tiddler/panel, the cursor will change to a "crossed-arrows" symbol, indicating that the panel is "moveable". Grab (click-hold) the panel anywhere in the edge area and then drag the mouse to reposition the panel.\n\nTo resize the panel, hold the ''shift'' key and then grab the panel: the cursor will change to a "double-arrow" symbol. Drag a side edge of the panel to stretch horizontally or vertically, or drag a corner of the panel to stretch in both dimensions at once.\n\nDouble-clicking anywhere in the edge area of a panel will 'maximize' it to fit the current browser window.\n\nWhen the mouse is anywhere over a panel (not just near the edge), a 'toolbar menu' appears in the ''upper right corner'', with the following command items:\n*fold/unfold: ''fold'' temporarily reduces the panel height to show just one line of text. ''unfold'' restores the panel height.\n*hover/scroll: when you scroll the browser window, the moveable panels scroll with it. ''hover'' lets you keep a panel in view, while the rest of the page content moves in the window. ''scroll'' restores the default scrolling behavior for the panel. //Note: Due to browser limitations, this feature is not currently available when using Internet Explorer (v6 or lower)... sorry.//\n*close: ''close'' hides a panel from the page display. If you have moved/resized a panel, closing it restores its default position and size.\n*dock: unlike a floating panel, a moveable //tiddler// does not "float" on the page until it has actually been moved from its default position. When moving a tiddler, the ''close'' command is replaced with ''dock'', which restores the tiddler to its default //non-floating// location on the page.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''MoveablePanelPlugin'' (tagged with <<tag systemConfig>>)\nNote: for compatibility, please also install the current version of ''NestedSlidersPlugin''.\n<<<\n!!!!!Revision History\n<<<\n''2006.05.25 [1.3.3]'' in closePanel(), use p.button.onclick() so that normal processing (updating slider button tooltip, access key, etc.) is performed\n''2006.05.11 [1.3.2]'' doc update\n''2006.05.11 [1.3.1]'' re-define all functions within moveablePanel object (eliminate global window.* function definitions (and some "leaky closures" in IE)\n''2006.05.11 [1.3.0]'' converted from inline javascript to true plugin\n''2006.05.09 [1.2.3]'' in closePanel(), set focus to sliderpanel button (if any)\n''2006.05.02 [1.2.2]'' in MoveOrSizePanel(), calculate adjustments for top and left when inside nested floating panels\n''2006.04.06 [1.2.1]'' in getPanel(), allow redefinition or bypass of "moveable" tag (changed from hard-coded "tearoff")\n''2006.03.29 [1.2.0]'' in getPanel(), require "tearoff" tag to enable floating tiddlers\n''2006.03.13 [1.1.0]'' added handling for floating tiddlers and conditional menu display\n''2006.03.06 [1.0.2]'' set move or resize cursor during mousetracking\n''2006.03.05 [1.0.1]'' use "window" vs "document.body" so mousetracking in FF doesn't drop the panel when moving too quickly\n''2006.03.04 [1.0.0]'' Initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.moveablePanel= {major: 1, minor: 3, revision: 3, date: new Date(2006,5,25)};\n//}}}\n//{{{\nconfig.macros.moveablePanel= { \n handler:\n function(place,macroName,params) {\n var p=this.getPanel(place); if (!p) return;\n\n // remember original panel event handlers, size, location, border\n if (!p.saved) p.saved= {\n mouseover: p.onmouseover,\n mouseout: p.onmouseout,\n dblclick: p.ondblclick,\n top: p.style.top,\n left: p.style.left,\n width: p.style.width,\n height: p.style.height,\n position: p.style.position,\n border: p.style.border\n };\n\n // create control menu items\n var menupos=p.className=="floatingPanel"?"float:right;":"position:absolute;right:2em;top:3em;";\n var menustyle=p.className!="floatingPanel"?'style="border:1px solid #666;background:#ccc;color:#000;padding:0px .5em;"':"";\n var html='<div style="font-size:7pt;display:none;'+menupos+'">&nbsp;';\n if (p.className=="floatingPanel")\n html+='<a href="javascript:;" title="reduce panel size" '+menustyle\n +' onclick="return config.macros.moveablePanel.foldPanel(this,event)">fold</a>&nbsp; ';\n if (!config.browser.isIE)\n html+='<a href="javascript:;" title="keep panel in view when scrolling"'+menustyle\n +' onclick="return config.macros.moveablePanel.hoverPanel(this,event)">hover</a>&nbsp; ';\n if (p.className=="floatingPanel")\n html+='<a href="javascript:;" title="close panel and reset to default size and position"'+menustyle\n +' onclick="return config.macros.moveablePanel.closePanel(this,event)">close</a>';\n else\n html+='<a href="javascript:;" title="reset panel to default size and position"'+menustyle\n +' onclick="return config.macros.moveablePanel.closePanel(this,event)">dock</a>';\n html+='</div>';\n p.menudiv=createTiddlyElement(place,"span");\n p.menudiv.innerHTML=html;\n\n // init mouse handling and tooltip\n p.title="drag edge to move, shift key=stretch, double-click=max/restore";\n p.onmouseover=function(event) {\n if (this.className=="floatingPanel"||this.style.position=="absolute"||this.style.position=="fixed") {\n if (this.className!="floatingPanel") this.style.border="1px dotted #999"; // border around tiddler\n this.menudiv.firstChild.style.display="inline";\n }\n if (this.saved.mouseover) return this.saved.mouseover(event);\n };\n p.onmouseout=function(event) {\n this.menudiv.firstChild.style.display="none";\n if (this.className!="floatingPanel") this.style.border=this.saved.border;\n if (this.saved.mouseout) return this.saved.mouseout(event);\n };\n p.ondblclick=function(event) {\n if (!config.macros.moveablePanel.maximizePanel(this,event)) return false; // processed\n return this.saved.dblclick?this.saved.dblclick(event):true;\n };\n p.onmousemove=function(event) { return config.macros.moveablePanel.setCursorPanel(this,event); };\n p.onmousedown=function(event) { return config.macros.moveablePanel.moveOrSizePanel(this,event); };\n },\n\n getPanel:\n function(place) {\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode; if (p) return p; // floatingPanel\n p=story.findContainingTiddler(place); if (!p || !store.getTiddler(p.getAttribute("tiddler"))) return null; // not in a tiddler\n\n // moveable **tiddlers** in IE have LOTS of problems... DISABLED FOR NOW... but floating panels still work in IE\n if (config.browser.isIE) return null;\n\n // tiddlers tagged (e.g. with "moveable") to allow movement? use null or "" to bypass tag check\n var tag="moveable"; if (!tag || !tag.trim().length) return p;\n return (store.getTiddler(p.getAttribute("tiddler")).tags.find(tag)!=null)?p:null; // tiddler is tagged for moving\n },\n\n processed:\n function(event) {\n event.cancelBubble=true; if (event.stopPropagation) event.stopPropagation(); return false;\n },\n\n getClientWidth:\n function() {\n if(document.width!=undefined) return document.width;\n if(document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth;\n if(document.body && document.body.clientWidth) return document.body.clientWidth;\n if(window.innerWidth!=undefined) return window.innerWidth;\n return 100; // should never get here\n },\n\n closePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (p.hover) this.hoverPanel(p.hoverButton,event); \n if (p.folded) this.foldPanel(p.foldButton,event); \n p.maxed=false; \n p.style.top=p.saved.top;\n p.style.left=p.saved.left;\n p.style.width=p.saved.width;\n p.style.height=p.saved.height;\n p.style.position=p.saved.position;\n if (p.button) { p.button.focus(); onClickNestedSlider({target:p.button}); } // click on slider "button" (if any) to close the panel\n return this.processed(event);\n },\n\n foldPanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (!p.foldButton) p.foldButton=place;\n if (p.folded) {\n p.style.height=p.folded_savedheight;\n p.style.overflow=p.folded_savedoverflow;\n } else {\n p.folded_savedheight=p.style.height; p.style.height="1em"; \n p.folded_savedoverflow=p.style.overflow; p.style.overflow="hidden";\n }\n p.folded=!p.folded;\n place.innerHTML=p.folded?"unfold":"fold";\n place.title=p.folded?"restore panel size":"reduce panel size";\n return this.processed(event);\n },\n\n hoverPanel:\n function(place,event) {\n if (config.browser.isIE) { return this.processed(event); } // 'fixed' position is not handled properly by IE :-(\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (!p.hoverButton) p.hoverButton=place;\n if (p.hover)\n p.style.position=p.hover_savedposition;\n else\n { p.hover_savedposition=p.style.position; p.style.position="fixed"; }\n p.hover=!p.hover;\n place.innerHTML=p.hover?"scroll":"hover";\n place.title=p.hover?"make panel move with page when scrolling":"keep panel in view when scrolling page";\n return this.processed(event);\n },\n\n maximizePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight))\n return true; // not near an edge... let double click bubble through\n if (p.folded) this.foldPanel(p.foldButton,event); // unfold panel first (if needed)\n if (p.maxed) {\n p.style.top=p.max_savedtop;\n p.style.left=p.max_savedleft;\n p.style.width=p.max_savedwidth;\n p.style.height=p.max_savedheight;\n p.style.position=p.max_savedposition;\n } else {\n p.max_savedwidth=p.style.width;\n p.max_savedheight=p.style.height;\n p.max_savedtop=p.style.top;\n p.max_savedleft=p.style.left;\n p.max_savedposition=p.style.position;\n // IE gets the percentage stretch wrong if floating panel is inside a table\n p.style.width=config.browser.isIE?(getClientWidth()*0.95+"px"):"95%";\n p.style.height="95%";\n p.style.top=p.style.left='1em';\n p.style.position="absolute";\n }\n p.maxed=!p.maxed;\n return this.processed(event);\n },\n\n setCursorPanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight))\n { p.style.cursor="auto"; if (!p.savedtitle) p.savedtitle=p.title; p.title=""; }\n else {\n p.style.cursor=!event.shiftKey?"move":((isTop?'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');\n if (p.savedtitle) p.title=p.savedtitle;\n }\n return true; // let mouseover event bubble through\n },\n\n moveOrSizePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight)) return true; // not near an edge... let mousedown bubble through\n \n // when resizing, change cursor to show directional (NSEW) "drag arrows"\n var sizing=event.shiftKey; // remember this for use during mousemove tracking\n if (sizing) p.style.cursor=((isTop?'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');\n \n var adjustLeft=0; var adjustTop=0;\n var pp=p.parentNode; while (pp && pp.className!="floatingPanel") pp=pp.parentNode;\n if (pp) { adjustLeft=findPosX(pp); adjustTop=findPosY(pp); }\n \n // start tracking mousemove events\n config.macros.moveablePanel.activepanel=p;\n var target=p; // if 'capture' handling not supported, track within panel only\n if (document.body.setCapture) { document.body.setCapture(); var target=document.body; } // IE\n if (window.captureEvents) { window.captureEvents(Event.MouseMove|Event.MouseUp,true); var target=window; } // moz\n if (target.onmousemove!=undefined) target.saved_mousemove=target.onmousemove;\n target.onmousemove=function(e){\n if (!e) var e=window.event;\n var p=config.macros.moveablePanel.activepanel;\n if (!p) { this.onmousemove=this.saved_mousemove?this.saved_mousemove:null; return; }\n \n // PROBLEM: p.offsetWidth and p.offsetHeight do not seem to account for padding or borders\n // WORKAROUND: subtract padding and border (in px) when calculating new panel width and height\n // TBD: get these values from p.style... convert to px as needed.\n var paddingWidth=10.6667; var paddingHeight=10.6667;\n var borderWidth=1; var borderHeight=1;\n var adjustWidth=-(paddingWidth*2+borderWidth*2);\n var adjustHeight=-(paddingHeight*2+borderHeight*2);\n \n if (p.style.position!="absolute") { // convert relative DIV to movable absolute DIV\n p.style.position="absolute";\n p.style.left=left+"px"; p.style.top=top+"px";\n p.style.width=(width+adjustWidth)+"px"; p.style.top=(height+adjustHeight)+"px";\n }\n var newX=!config.browser.isIE?e.pageX:e.clientX;\n var newY=!config.browser.isIE?e.pageY:e.clientY;\n if (sizing) { // resize panel\n // don't let panel get smaller than edge "grab" zones\n var minWidth=edgeWidth*2-adjustWidth;\n var minHeight=edgeHeight*2-adjustHeight;\n p.maxed=false; // make sure panel is not maximized\n if (p.folded) this.foldPanel(p.foldButton,e); // make sure panel is unfolded\n if (isBottom) var newHeight=height+newY-y+1;\n if (isTop) var newHeight=height-newY+y+1;\n if (isLeft) var newWidth=width-newX+x+1;\n if (isRight) var newWidth=width+newX-x+1;\n if (isLeft||isRight) p.style.width=(newWidth>minWidth?newWidth:minWidth)+adjustWidth+"px";\n if (isLeft) p.style.left=left-adjustLeft+newX-x+1+"px";\n if (isTop||isBottom) p.style.height=(newHeight>minHeight?newHeight:minHeight)+adjustHeight+"px";\n if (isTop) p.style.top=top-adjustTop+newY-y+1+"px";\n } else { // move panel\n p.style.top=top-adjustTop+newY-y+1+"px";\n p.style.left=left-adjustLeft+newX-x+1+"px";\n }\n var status=sizing?("size: "+p.style.width+","+p.style.height):("pos: "+p.style.left+","+p.style.top);\n window.status=status.replace(/(\s.[0-9]+)|px/g,""); // remove decimals and "px"\n return config.macros.moveablePanel.processed(e);\n };\n \n // stop tracking mousemove events\n if (target.onmouseup!=undefined) target.saved_mouseup=target.onmouseup;\n target.onmouseup=function(e){\n if (!e) var e=window.event;\n if (this.releaseCapture) this.releaseCapture(); // IE\n if (this.releaseEvents) this.releaseEvents(Event.MouseMove|Event.MouseUp); // moz\n this.onmousemove=this.saved_mousemove?this.saved_mousemove:null;\n this.onmouseup=this.saved_mouseup?this.saved_mouseup:null;\n config.macros.moveablePanel.activepanel=null;\n window.status="";\n return config.macros.moveablePanel.processed(e);\n };\n return this.processed(event); // mousedown handled\n }\n};\n//}}}
<html><form>\nPlease enter information about a CD in your collection:<br><!--\n--><input type="hidden" name="cardtype" value="CDAlbumForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/CDDB id" name="cardID" value="Music for Sentient Beings - Volume IV"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:59%" title="artist/group" name="artist" value="vlh - Vernon L Hohenstein"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="2005"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="CD title" name="title" value="Music for Sentient Beings - Volume IV"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="sample recording (url)" name="url" value="http://cdbaby.com/mp3lofi/vlhohenstein-01.m3u"><!--\n--><input type="button" value="play sample" style="width:20%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="cover image" name="cover" value="http://cdbaby.name/v/l/vlhohenstein.jpg"><!--\n--><input type="button" value="view" style="width:20%" onclick="window.open(this.form.cover.value,'_blank')"><br><!--\n-->Buy this CD online:<br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="purchase online (url)" name="buy" value="http://www.cdbaby.com/cd/vlhohenstein"><br><!--\n--><div style="width:100%;text-align:center"><!--\n-->Genre: <input type="checkbox" name="rock"> rock <!--\n--><input type="checkbox" name="blues"> blues<!--\n--><input type="checkbox" name="jazz"> jazz <!--\n--><input type="checkbox" name="funk"> funk <!--\n--><input type="checkbox" name="classical"> classical <!--\n--><input type="checkbox" name="experimental" checked> experimental <!--\n--><input type="checkbox" name="original" checked> original <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="Ambient electronic, light, building from quiet to energetic and back again"><br><!--\n--><textarea rows="4" onfocus="this.select()" style="width:100%" title="tracks/liner notes" name="notes">This is the fourth CD in the //&quot;Music for Sentient Beings&quot;// series. Following upon the first three volumes: //&quot;Life&quot;//, //&quot;Air&quot;// and //&quot;Space&quot;//, this release: //&quot;Fire&quot;//, presents a rich tapestry of both warmth and energy in each piece.\n\n#1: [[MFSB4:Candlelight]] (7:50)\n#2: [[MFSB4:Kindling]] (8:17)\n#3: [[MFSB4:Hearth]] (7:14)\n#4: [[MFSB4:Magma]] (8:35)\n#5: [[MFSB4:Fuego]] (7:40)\n#6: [[MFSB4:Flare]] (6:46)\n#7: [[MFSB4:ColdFusion]] (7:57)\n#8: [[MFSB4:Embers]] (7:52)</textarea><br><!--\n--><textarea rows="4" onfocus="this.select()" style="width:100%" title="credits/copyrights" name="credits">Drum sequencing on &quot;Kindling&quot; by Eric Shulman. Recorded at The Nano Studio, Sunnyvale, California USA. Sound Engineering by Eric Shulman. Cover Photo: Yosemite National Park (c) 2002. All songs performed and composed by Vernon L Hohenstein (c) 2005. Produced by Eric Shulman. ''Made in U.S.A - all right reserved''</textarea><br><!--\n--><textarea rows="4" onfocus="this.select()" style="width:100%" title="artist/group biography" name="about">Vernon L. Hohenstein began studying piano at age 7. During his youth, he regularly performed chorale music for Lutheran religious services for churches in Arizona and California. As Vernon's musical sensibilities evolved, he began to develop his own unique improvisational style.\n\nHis interest in &quot;the power of music to heal&quot; was sparked by private studies on Native American Shamanism under the guidance of MariEllen O'Hara, who gained her knowledge from renowned Native American author and teacher Jamie Sams. Vernon's core musical philosophy and intuition have combined his Christian upbringing and the sacred spiritual traditions of the Lakota Sioux to create powerful and engaging musical explorations.\n\nVernon has worked with Lucia Cappacione, a nationally-known leader in the field of Art Therapy and has performed for her therapeutic workshops in Santa Barbara, California. Vernon has also produced numerous free-form spontaneous compositions under the auspices of the Friday Night Music improvisational 'art jazz' group based in the San Francisco Bay Area.\n\nVernon is currently a member of the jazz group Eddie Gale and The Inner Peace Orchestra.\n\nHe has performed with such notable musicians as: Trumpeter Eddie Gale, Percussionists Muruga Booker and Jim Greiner, Guitarist James Gurley, Violist Mimi Dye, as well as many others.\n\nMusic for Sentient Beings Volume IV is the first CD of the series to be put on CDBaby.com. The theme of this album is about the forms of ambient fire and the warmth and creative energy it brings. I composed these songs to allow the listener to journey within their own minds to a warm, comforting, quiet place. It is music for your own Inner Sanctuary and Sacred Space. Thanks for listening. Enjoy!</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="CDAlbumCard">\n</form></html>\n----\n/%cover="[<img[cover]]"%/[<img[http://cdbaby.name/v/l/vlhohenstein.jpg]] /%cover%/\n''{{medium{__/%title%/Music for Sentient Beings - Volume IV /%title%/__}}}''\n{{small{Artist/group: /%artist%/vlh - Vernon L Hohenstein /%artist%/\n+++[background info...]>/%about%/Vernon L. Hohenstein began studying piano at age 7. During his youth, he regularly performed chorale music for Lutheran religious services for churches in Arizona and California. As Vernon's musical sensibilities evolved, he began to develop his own unique improvisational style.<<br>><<br>>His interest in &quot;the power of music to heal&quot; was sparked by private studies on Native American Shamanism under the guidance of MariEllen O'Hara, who gained her knowledge from renowned Native American author and teacher Jamie Sams. Vernon's core musical philosophy and intuition have combined his Christian upbringing and the sacred spiritual traditions of the Lakota Sioux to create powerful and engaging musical explorations.<<br>><<br>>Vernon has worked with Lucia Cappacione, a nationally-known leader in the field of Art Therapy and has performed for her therapeutic workshops in Santa Barbara, California. Vernon has also produced numerous free-form spontaneous compositions under the auspices of the Friday Night Music improvisational 'art jazz' group based in the San Francisco Bay Area.<<br>><<br>>Vernon is currently a member of the jazz group Eddie Gale and The Inner Peace Orchestra.<<br>><<br>>He has performed with such notable musicians as: Trumpeter Eddie Gale, Percussionists Muruga Booker and Jim Greiner, Guitarist James Gurley, Violist Mimi Dye, as well as many others.<<br>><<br>>Music for Sentient Beings Volume IV is the first CD of the series to be put on CDBaby.com. The theme of this album is about the forms of ambient fire and the warmth and creative energy it brings. I composed these songs to allow the listener to journey within their own minds to a warm, comforting, quiet place. It is music for your own Inner Sanctuary and Sacred Space. Thanks for listening. Enjoy!/%about%/===\n\nGenre: /%rock%//%rock%//%rock%/ /%blues%//%blues%//%blues%/ /%jazz%//%jazz%//%jazz%/ /%funk%//%funk%//%funk%/ /%classical%//%classical%//%classical%/ /%experimental%/experimental/%experimental%/ /%original%/original/%original%/\n}}}\nSummary: /%summary%/Ambient electronic, light, building from quiet to energetic and back again /%summary%/\n<html><div style="clear:both"></div></html>liner notes:\n<<<\n/%notes%/This is the fourth CD in the //&quot;Music for Sentient Beings&quot;// series. Following upon the first three volumes: //&quot;Life&quot;//, //&quot;Air&quot;// and //&quot;Space&quot;//, this release: //&quot;Fire&quot;//, presents a rich tapestry of both warmth and energy in each piece.<<br>><<br>>#1: [[MFSB4:Candlelight]] (7:50)<<br>>#2: [[MFSB4:Kindling]] (8:17)<<br>>#3: [[MFSB4:Hearth]] (7:14)<<br>>#4: [[MFSB4:Magma]] (8:35)<<br>>#5: [[MFSB4:Fuego]] (7:40)<<br>>#6: [[MFSB4:Flare]] (6:46)<<br>>#7: [[MFSB4:ColdFusion]] (7:57)<<br>>#8: [[MFSB4:Embers]] (7:52)/%notes%/\n<<<\n''Buy this CD online at: /%buy%/http://www.cdbaby.com/cd/vlhohenstein /%buy%/''\nCredits:{{groupbox{@@display:block;font-size:90%;line-height:120%;/%credits%/Drum sequencing on &quot;Kindling&quot; by Eric Shulman. Recorded at The Nano Studio, Sunnyvale, California USA. Sound Engineering by Eric Shulman. Cover Photo: Yosemite National Park (c) 2002. All songs performed and composed by Vernon L Hohenstein (c) 2005. Produced by Eric Shulman. ''Made in U.S.A - all right reserved''/%credits%/@@}}}
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou 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.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*mouse auto rollover\n*custom class/label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{^width^}}} (or just {{{^}}})^^\nmakes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)^^\n* {{{*}}}^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{{{class{[label=key|tooltip]}}}}}}^^\nuses custom label/tooltip/accesskey. {{{{{class{...}}}}}}, {{{=key}}} and {{{|tooltip}}} are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n===\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}\n''2006.07.25 - 1.9.3'' 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.\n''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"\n''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value\n''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label\n''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element\n''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position\n''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n''2006.02.15 - 1.7.6'' 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)\n''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2006.01.18 - 1.7.4'' 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.\n''2006.01.16 - 1.7.3'' 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.\n''2006.01.16 - 1.7.2'' 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 "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// 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.\n''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state\n''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\nformatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin\nmore documentation\n''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\ncode cleanup, added documentation\n''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\nchanged name to EasySlidersPlugin\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 2, minor: 0, revision: 0, date: new Date(2006,7,28)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(?:\s\s{\s\s{([\s\sw]+[\s\ss\s\sw]*)\s\s{)?(\s\s[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n // defopen=lookaheadMatch[1]\n // cookiename=lookaheadMatch[2]\n // header=lookaheadMatch[3]\n // panelwidth=lookaheadMatch[4]\n // rollover=lookaheadMatch[5]\n // class=lookaheadMatch[6]\n // label=lookaheadMatch[7]\n // blockquote=lookaheadMatch[8]\n // deferred=lookaheadMatch[9]\n\n lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey\n var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // parse custom label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n title = lookaheadMatch[7].trim().slice(1,-1);\n var pos=title.indexOf("|");\n if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }\n if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }\n if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);\n\n // set extra button attributes\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):""; // save requested panel size\n btn.sliderPanel=panel;\n panel.style.display = show;\n panel.style.width=panel.defaultPanelWidth;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[9]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[8]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[8]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n // reset to default width (might have been changed via plugin code)\n theSlider.style.width=theSlider.defaultPanelWidth;\n // align slider/floater position with target button\n if (!isOpen) adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n // if showing panel, set focus to first 'focus-able' element in panel\n if (theSlider.style.display!="none") {\n var ctrls=theSlider.getElementsByTagName("*");\n for (var c=0; c<ctrls.length; c++) {\n var t=ctrls[c].tagName.toLowerCase();\n if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length) {\n config.options[this.sliderCookie]=!isOpen;\n if (config.options[this.sliderCookie]!=this.defOpen)\n saveOptionCookie(this.sliderCookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = this.sliderCookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (place.style.position!="relative") {\n var left=findPosX(btn);\n var top=findPosY(btn)+btn.offsetHeight;\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;\n if (p) { left-=findPosX(p); top-=findPosY(p); }\n }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}
{{borderleft{\n{{fine{__select a document type__}}}\n<<newDocument "label:TiddlyWiki blank" ask NOTIDDLER>>\n&nbsp; <<newDocument "label:with Import/Export" ask importexport>>\n<<newDocument "label:TiddlyTools starter" ask includeNew>>\n&nbsp; <<newDocument "label:with Themes" ask includeNew WoodshopPackage TexturesPackage>>\n&nbsp; <<newDocument "label:with MediaCenter" ask includeNew MediaPackage>>\n&nbsp; <<newDocument "label:with TidIDE" ask includeNew TidIDEPackage>>\n&nbsp; <<newDocument "label:with TiddlyCards" ask includeNew TiddlyCardsPackage>>\n{{bordertop{\n@@display:block;<<newDocument "label:custom..." ask ask>> //(match tags)//@@}}}}}}
/***\n''NewDocumentPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#NewDocumentPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly create new TiddlyWiki documents from your existing document, with just one click! Use the {{{<<newDocument>>}}} macro to place a "new document" link into your sidebar/mainmenu/any tiddler (wherever you like). Select this command to automatically create a "new.html" document containing a specific set of tagged tiddlers. Optional parameters let you specify an alternate path/filename for the new file, or different tags to match. You can also indicate "ask" for either parameter, which will trigger a prompt for input when the command is selected.\n\n!!!!!Usage\n<<<\n{{{<<newDocument label:text filename tag tag tag...>>}}}\n{{{<<newDocument label:text filename all>>}}}\n{{{<<newDocument label:text filename snap>>}}}\n where:\n* ''label:text'' defines //optional// alternative link text (replaces default "new document" display)\n* ''filename'' is any local path-and-filename. If no parameters are provided, the default is to create the file "new.html" in the current directory. If a filename is provided without a path (i.e., there is no "/" in the input), then the current directory is also assumed. Otherwise, this parameter is expected to contain the complete path and filename needed to write the file to your local hard disk. If ''ask'' is used in place of the filename parameter then, when the command link is selected, a message box will be automatically displayed so you can select/enter the path and filename.\n* ''tag tag tag...'' is a list of one or more space-separated tags (use quotes or {{{[[]]}}} around tags that contain spaces). The new document will include all tiddlers that match at least one of the tags in the list. The default is to include tiddlers tagged with <<tag includeNew>>. The special value ''all'' may be used to match every tiddler (even those without tags). If ''ask'' is used in place of the tags then, when the command link is selected, a message box will be automatically displayed so you can enter the desired tags at that time.\n* When the keyword ''snap'' is used in place of tags to match, the plugin generates a file containing the //rendered// CSS-and-HTML for all tiddlers currently displayed in the document.\n\nNote: as of version 1.4.0 of this plugin, support for selecting tiddlers by using tag *expressions* has been replaced with simpler, more efficient "containsAny()" logic. To create new ~TiddlyWiki documents that contain only those tiddlers selected with advanced AND/OR/NOT Boolean expressions, you can use the filtering features provided by the ExportTiddlersPlugin (see www.TiddlyTools.com/#ExportTiddlersPlugin).\n<<<\n!!!!!Examples:\n<<<\n{{{<<newDocument>>}}}\nequivalent to {{{<<newDocument new.htm includeNew systemTiddlers>>}}}\ncreates default "new.html" containing tiddlers tagged with either<<tag includeNew>>or<<tag systemTiddlers>>\ntry it: <<newDocument>>\n\n{{{<<newDocument empty.html systemTiddlers>>}}}\ncreates "empty.html" containing only tiddlers tagged with<<tag systemTiddlers>>\n//(reproduces old-style (pre 2.0.2) empty file)//\ntry it: <<newDocument empty.html systemTiddlers>>\n\n{{{<<newDocument "label:create Import/Export starter" ask importexport>>}}}\nsave importexport tiddlers to a new file, prompts for path/file\ntry it: <<newDocument "label:create Import/Export starter" ask importexport>>\n\n{{{<<newDocument ask ask>>}}}\nprompts for path/file, prompts for tags to match\ntry it: <<newDocument ask ask>>\n\n{{{<<newDocument ask all>>}}}\nsave all current TiddlyWiki contents to a new file, prompts for path/file\ntry it: <<newDocument ask all>>\n\n{{{<<newDocument ask snap>>}}}\ngenerates snapshot of currently displayed document, prompts for path/file\ntry it: <<newDocument ask snap>>\n\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''NewDocumentPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.08.03 [1.4.3]'' in promptForFilename(), for IE (WinXP only), added handling for UserAccounts.CommonDialog\n''2006.07.29 [1.4.2]'' in onClickNewDocument(), okmsg display is now linked to newly created file\n''2006.07.24 [1.4.1]'' in promptForFilename(), check for nsIFilePicker.returnCancel to allow nsIFilePicker.returnOK **OR** nsIFilePicker.returnReplace to be processed.\n''2006.05.23 [1.4.0]'' due to very poor performance, support for tag *expressions* has been removed, in favor of a simpler "containsAny()" scan for tags.\n''2006.04.09 [1.3.6]'' in onClickNewDocument, added call to convertUnicodeToUTF8() to better handle international characters.\n''2006.03.15 [1.3.5]'' added nsIFilePicker() handler for selecting filename in moz-based browsers. IE and other non-moz browsers still use simple prompt() dialog\n''2006.03.15 [1.3.0]'' added "label:text" param for custom link text. added special "all" filter parameter for "save as..." handling (writes all tiddlers to output file)\n''2006.03.09 [1.2.0]'' added special "snap" filter parameter to generate and write "snapshot" files containing static HTML+CSS for currently rendered document.\n''2006.02.24 [1.1.2]'' Fix incompatiblity with TW 2.0.5 by removing custom definition of getLocalPath() (which is now part of TW core)\n''2006.02.03 [1.1.1]'' concatentate 'extra' params so that tag expressions don't have to be quoted. moved all text to 'formatted' string definitions for easier translation.\n''2006.02.03 [1.1.0]'' added support for tag EXPRESSIONS. plus improved documentation and code cleanup\n''2006.02.03 [1.0.0]'' Created.\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.newDocument = {major: 1, minor: 4, revision: 3, date: new Date(2006,8,3)};\n\nconfig.macros.newDocument = {\n newlabel: "new document",\n newprompt: "Create a new TiddlyWiki 'starter' document",\n newdefault: "new.html",\n allparam: "all",\n saveaslabel: "save as...",\n saveasprompt: "Save current TiddlyWiki to a different file",\n snapparam: "snap",\n snaplabel: "create a snapshot",\n snapprompt: "Create a 'snapshot' of the current TiddlyWiki display",\n snapdefault: "snapshot.html",\n askparam: "ask",\n labelparam: "label:",\n fileprompt: "Please enter a filename",\n filter: "includeNew",\n filterprompt: "Match one or more tags:\sn(space-separated, use [[...]] around tags containing spaces)",\n filtererrmsg: "Error in tag filter '%0'",\n snapmsg: "Document snapshot written to %1",\n okmsg: "%0 tiddlers written to %1",\n failmsg: "An error occurred while creating %0"\n};\n\nconfig.macros.newDocument.handler = function(place,macroName,params) {\n\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n\n if (params[0] && params[0].substr(0,config.macros.newDocument.labelparam.length)==config.macros.newDocument.labelparam)\n var label=params.shift().substr(config.macros.newDocument.labelparam.length)\n var filename=params.shift(); if (!filename) filename=config.macros.newDocument.newdefault;\n if (params[0]==config.macros.newDocument.snapparam) {\n if (!label) var label=config.macros.newDocument.snaplabel;\n var prompt=config.macros.newDocument.snapprompt;\n var defaultfile=config.macros.newDocument.snapdefault;\n }\n if (params[0]==config.macros.newDocument.allparam) {\n if (!label) var label=config.macros.newDocument.saveaslabel;\n var prompt=config.macros.newDocument.saveasprompt;\n var defaultfile=getLocalPath(document.location.href);\n var slashpos=defaultfile.lastIndexOf("/"); if (slashpos==-1) slashpos=defaultfile.lastIndexOf("\s\s");\n if (slashpos!=-1) defaultfile=defaultfile.substr(slashpos+1); // get filename only\n }\n if (!prompt) var prompt=config.macros.newDocument.newprompt;\n if (!label) var label=config.macros.newDocument.newlabel;\n if (!defaultfile) var defaultfile=config.macros.newDocument.newdefault;\n\n var btn=createTiddlyButton(place,label,prompt,onClickNewDocument);\n btn.path=path;\n btn.file=filename;\n btn.defaultfile=defaultfile;\n btn.filter=params.length?params:[config.macros.newDocument.filter]; \n}\n\n// IE needs explicit global scoping for functions called by browser events\nwindow.onClickNewDocument=function(e)\n{\n if (!e) var e = window.event; var btn=resolveTarget(e);\n\n // assemble document content, write file, report result\n var okmsg=config.macros.newDocument.okmsg;\n var failmsg=config.macros.newDocument.failmsg;\n var count=0;\n var out="";\n if (btn.filter[0]==config.macros.newDocument.snapparam) { // HTML+CSS snapshot\n var styles=document.getElementsByTagName("style");\n out+="<html>\sn<head>\sn<style>\sn";\n for(var i=0; i < styles.length; i++)\n out +="/* stylesheet from tiddler:"+styles[i].getAttribute("id")+" */\sn"+styles[i].innerHTML+"\sn\sn";\n out+="</style>\sn</head>\sn<body>\sn\sn"+document.getElementById("contentWrapper").innerHTML+"\sn\sn</body>\sn</html>";\n okmsg=config.macros.newDocument.snapmsg;\n } else { // TW starter document\n // get the TiddlyWiki core code source\n var sourcefile=getLocalPath(document.location.href);\n var source=loadFile(sourcefile);\n if(source==null) { alert(config.messages.cantSaveError); return null; }\n var posOpeningDiv=source.indexOf(startSaveArea);\n var posClosingDiv=source.lastIndexOf(endSaveArea);\n if((posOpeningDiv==-1)||(posClosingDiv==-1)) { alert(config.messages.invalidFileError.format([sourcefile])); return; }\n // get the matching tiddler divs\n var match=btn.filter;\n if (match[0]==config.macros.newDocument.askparam) {\n var newfilt=prompt(config.macros.newDocument.filterprompt,config.macros.newDocument.filter);\n if (!newfilt) return; // cancelled by user\n match=newfilt.readMacroParams();\n }\n var storeAreaDivs=[];\n var tiddlers=store.getTiddlers('title');\n for (var i=0; i<tiddlers.length; i++)\n if (match[0]==config.macros.newDocument.allparam || (tiddlers[i].tags && tiddlers[i].tags.containsAny(match)) )\n storeAreaDivs.push(tiddlers[i].saveToDiv());\n out+=source.substr(0,posOpeningDiv+startSaveArea.length);\n out+=convertUnicodeToUTF8(storeAreaDivs.join("\sn"))+"\sn\st\st";\n out+=source.substr(posClosingDiv);\n count=storeAreaDivs.length;\n }\n // get output path/filename\n var filename=btn.file;\n if (filename==config.macros.newDocument.askparam)\n filename=promptForFilename(config.macros.newDocument.fileprompt,btn.path,btn.defaultfile);\n if (!filename) return; // cancelled by user\n // if specified file does not include a path, assemble fully qualified path and filename\n var slashpos=filename.lastIndexOf("/"); if (slashpos==-1) slashpos=filename.lastIndexOf("\s\s");\n if (slashpos==-1) filename=btn.path+filename;\n var ok=saveFile(filename,out);\n var msg=ok?okmsg.format([count,filename]):failmsg.format([filename]);\n var link=ok?"file:///"+filename.replace(regexpBackSlash,'/'):""; // change local path to link text\n clearMessage(); displayMessage(msg,link);\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n}\n//}}}\n\n//{{{\nfunction promptForFilename(msg,path,file)\n{\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeSave);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XP only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE\n }\n return result;\n}\n//}}}
''news/announcements:''\n<script>\n var tiddlers=store.getTiddlers("modified","excludeLists");\n var out="";\n for (var i=tiddlers.length-1; i>=0; i--) if (tiddlers[i].tags.contains("news"))\n out+="@@display:block;<<tiddler %0>>@@".format([tiddlers[i].title]);\n return out;\n</script>
/%Episode VI: The Return of The Sidebars!%/\n{{menubox{{{small{\n__July 19th, 2006: "Episode VI: The Return of The Sidebars!"__\n\n~TiddlyTools' "low-profile" SiteMenu menubar has been re-arranged for quicker access to common items. Although all of the previous functions are still available, their locations on the screen and in the menus may have changed. Don't worry, though... they are probably ''easier to find'' than they were before... \n\nFamiliar functions, such as [[goto|SiteMenuGoto]] and [[search|SiteMenuSearch]] have been improved, and new functions such as [[changes|ShowRecentChanges]] and [[plugins|ShowComponents]] offer dynamically-generated tiddlers that lets you easily review the current document contents to ''find out what new/updated plugins, scripts, and styles are available for you to add to your own TiddlyWiki documents!''\n\nIn addition to the new menubar, ''the left sidebar (MainMenu) and right sidebar (SideBarOptions) have also been completely re-vamped to provide the same features and functions as the low-profile menubar''. Although the sidebars offer convenient access to tiddler links and ~TiddlyWiki commands, the 'traditional' ~TiddlyWiki 3-column layout also takes up valuable space that could be used to show tiddler content. This is particularly noticeable when using ~TiddlyWiki on a device with a small screen, such as a palmtop, tablet, and other sub-notebook portable. \n\n''To save screen space, you can show/hide the sidebars'' using links that appear at the top of the tiddler display area (the center 'story' column):\n><<tiddler ToggleLeftSidebar>> | <<tiddler ToggleRightSidebar>>\nWhen the sidebars //are// being displayed, you can enable "fixed" positioning by using a checkbox located in the [[options|SiteMenuOptions]] panel:\n><<tiddler ToggleScrollingSidebars>> \nWith fixed positioning, ''no matter how far down the page you are currently viewing, the sidebars will always remain on screen'' (i.e., "hover in place"). This lets you retain access to the sidebar functions even when you are scrolling through a very long page of tiddlers. \n\nnote:{{fine{The [[options|SiteMenuOptions]] panel also lets you show/hide the "site titles" display (SiteTitle and SiteSubtitle) to save even more screen space. When you ''hide the page titles //and// remove __both__ sidebars, the maximum screen space will be available to display tiddler content'' while preserving complete access to all TiddlyTools content and command functions through the low-profile menubar.\n}}}}}}
/%\nSwitchTiddlers: insert a link that closes the current tiddler and opens another one in its place\nNOTE: 'instant macro' - uses InlineJavascriptPlugin and TiddlerWithParamsPlugin\nsyntax is: <<tiddler SwitchTiddlers with: NewTiddlerTitle linktext>>\n%/<script label="$2">\n var tiddler=story.findContainingTiddler(place);\n story.displayTiddler(tiddler,"$1");\n story.closeTiddler(tiddler.id.substr(7)); // close self\n return false;\n</script>
<script show>\n var limit=5; // SET NUMBER OF TIDDLERS TO OPEN\n var field="modified"; var dir=-1; // +1==ascending, -1==descending\n var tiddlers=store.getTiddlers(field,"excludeLists");\n tiddlers.sort(function(a,b){if(a[field]==b[field])return(0);else return(a[field]<b[field])?-dir:dir;});\n for (var i=limit-1; i>=0; i--) story.displayTiddler(null,tiddlers[i].title);\n</script>
/%\n\nUsage: <<tiddler OpenTiddlers with: "label with space" "tiddler tiddler [[tiddler with spaces]] tiddler..." template>>\n\n%/<script label="$1"> var tidlist="$2"; if ("$3"!="$"+"3") var template="$3";\n story.displayTiddlers(story.findContainingTiddler(place),tidlist.readBracketedList(),template);\n</script>
<div class='header'>\n<span id='siteTitle' class='siteTitle' refresh='content' tiddler='SiteTitle'></span>\n<span id='siteSubtitle' class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div id='siteMenu' class='siteMenu' refresh='content' tiddler='SiteMenu'></div>\n<div id='breadCrumbs' class='breadCrumbs'></div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='storyMenu' class='storyMenu' refresh='content' force='true' tiddler='StoryMenu'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<span style='display:none' macro='tiddler SiteStartup'></span>
[[StyleSheetAdjustments]]\n/* ==== Plain ==== */\n.menubox { background-color:#fff; }\n
/***\n''PlayerPlugin for TiddlyWiki version 1.2.x and 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#PlayerPlugin \nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\nstatus: ''BETA''\n\nEmbed a media player in a tiddler. \n\n!!!!!Usage\n<<<\n{{{<<player [type] [URL] [width] [height] [hidecontrols]>>}}}\n\nwhere ''type'' is optional, and is one of the following: ''windows'', ''realone'', ''quicktime'', or ''flash''. If the media type is not specified, the plugin automatically renders Windows, Real, QuickTime or Flash player by matching known file extensions and/or specialized streaming-media transfer protocols (such as RTSP:). For unrecognized media types, the plugin assumes WindowsMedia (the player with the most users... *sigh*)\n<<<\n!!!!!Configuration\n<<<\nDefault player size:\nwidth: <<option txtPlayerDefaultWidth>> height: <<option txtPlayerDefaultHeight>>\n<<<\n!!!!!Examples\n<<<\n+++[Windows Media]...\nTimes Square Live Webcam\n{{{<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>}}}\n<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>\n===\n+++[RealOne]...\nBBC London: Live and Recorded news\n{{{<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>}}}\n<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>\n===\n+++[Quicktime]...\nAmerica Free TV: Classic Comedy\n{{{<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>}}}\n<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>\n===\n+++[Flash]...\nAsteroids arcade game\n{{{<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>}}}\n<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>\nGoogle Video\n{{{<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774 400 326>>}}}\n<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774 400 326>>\nYouTube Video\n{{{<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>}}}\n<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>\n===\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''PlayerPlugin '' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for macro handling^^\n<<<\n!!!!!Revision History\n<<<\n''2006.02.26 [0.7.0]''\nmajor re-write. handles default params better. create/recreate player objects via loadURL() API for use with interactive forms and scripts.\n''2006.01.27 [0.6.0]''\nadded support for 'extra' macro params to pass through to object parameters\n''2006.01.19 [0.5.0]''\nInitial ALPHA release\n''2005.12.23 [0.0.0]''\nStarted\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n\n// // macro definition\n\n//{{{\nversion.extensions.player = {major: 0, minor: 8, revision: 0, date: new Date(2006,3,7)};\n\nconfig.macros.player = {};\nconfig.macros.player.html = {};\nconfig.macros.player.handler= function(place,macroName,params) {\n var id=null;\n if (params[0].substr(0,3)=="id=") id=params.shift().substr(3);\n var type="";\n if ((params[0]=="windows")||(params[0]=="realone")||(params[0]=="quicktime")||(params[0]=="flash")) type=params.shift();\n var url=params.shift(); if (!url || !url.trim().length) url="";\n var width=params.shift();\n var height=params.shift();\n var show=(params.shift()=='hidecontrols')?"0":"1"; \n var extras=""; while (params[0]!=undefined) extras+="<param name='"+params.shift()+"' value='"+params.shift()+"'> ";\n this.loadURL(place,id,type,url,width,height,show,extras);\n}\n\nif (config.options.txtPlayerDefaultWidth==undefined) config.options.txtPlayerDefaultWidth="100%";\nif (config.options.txtPlayerDefaultHeight==undefined) config.options.txtPlayerDefaultHeight="480"; // can't use "100%"... player height doesn't stretch right :-(\n\nconfig.macros.player.loadURL=function(place,id,type,url,width,height,show,extras) {\n\n if (id==undefined) id="tiddlyPlayer";\n if (!width) var width=config.options.txtPlayerDefaultWidth;\n if (!height) var height=config.options.txtPlayerDefaultHeight;\n if (url && (!type || !type.length)) {\n if ((url.indexOf('mms')!=-1)||(url.indexOf('.asx')!=-1)||(url.indexOf('.wvx')!=-1)||(url.indexOf('.wmv')!=-1)||(url.indexOf('.mp3')!=-1))\n var type="windows";\n else if ((url.indexOf('rtsp')!=-1)||(url.indexOf('.ram')!=-1)||(url.indexOf('.rpm')!=-1)||(url.indexOf('.rm' )!=-1)||(url.indexOf('.ra' )!=-1))\n var type="realone";\n else if ((url.indexOf('.mov')!=-1)||(url.indexOf('.qt' )!=-1))\n var type="quicktime";\n else if ((url.indexOf('.swf')!=-1)||(url.indexOf('.flv')!=-1))\n var type="flash";\n }\n if (!type) var type="none";\n if (!url) var url="";\n if (show===undefined) var show=true;\n if (!extras) var extras="";\n if (type=="none" && url.trim().length) url="<br>unrecognized media type:<br>"+url;\n if (type=="realone") height-=show?60:0; // leave room for controls\n if (type=="windows") show=show?"1":"0"; // player-specific param value\n if (type=="realone") show=show?"block":"none";\n if (type=="quicktime") show=show?"true":"false";\n\n // create containing div for player HTML\n // and add or replace player in TW DOM structure\n var newplayer = document.createElement("div");\n newplayer.playerType=type;\n newplayer.setAttribute("id",id+"_div");\n var existing = document.getElementById(id+"_div");\n if (existing && !place) place=existing.parentNode;\n if (!existing)\n place.appendChild(newplayer);\n else {\n if (place==existing.parentNode) place.replaceChild(newplayer,existing)\n else { existing.parentNode.removeChild(existing); place.appendChild(newplayer); }\n }\n\n var html=config.macros.player.html[type];\n html=html.replace(/%i%/mg,id);\n html=html.replace(/%w%/mg,width);\n html=html.replace(/%h%/mg,height);\n html=html.replace(/%u%/mg,url);\n html=html.replace(/%s%/mg,show);\n html=html.replace(/%x%/mg,extras);\n newplayer.innerHTML=html;\n}\n//}}}\n\n// // Player-specific API functions: isReady(id), isPlaying(id), toggleControls(id), showControls(id,flag)\n\n//{{{\n// status values:\n// Windows: 0=Undefined, 1=Stopped, 2=Paused, 3=Playing, 4=ScanForward, 5=ScanReverse\n// 6=Buffering, 7=Waiting, 8=MediaEnded, 9=Transitioning, 10=Ready, 11=Reconnecting\n// RealOne: 0=Stopped, 1=Contacting, 2=Buffering, 3=Playing, 4=Paused, 5=Seeking\n// QuickTime: 'Waiting', 'Loading', 'Playable', 'Complete', 'Error:###'\n// Flash: 0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete\nconfig.macros.player.isReady=function(id)\n{\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') return !((p.playState==0)||(p.playState==7)||(p.playState==9)||(p.playState==11));\n if (d.playerType=='realone') return (p.GetPlayState()>1);\n if (d.playerType=='quicktime') return !((p.getPluginStatus()=='Waiting')||(p.getPluginStatus()=='Loading'));\n if (d.playerType=='flash') return (p.ReadyState>2);\n return true;\n}\nconfig.macros.player.isPlaying=function(id)\n{\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') return (p.playState==3);\n if (d.playerType=='realone') return (p.GetPlayState()==3);\n if (d.playerType=='quicktime') return (p.getPluginStatus()=='Complete');\n if (d.playerType=='flash') return (p.ReadyState<4);\n return false;\n}\nconfig.macros.player.showControls=function(id,flag) {\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') { p.ShowControls=flag; p.ShowStatusBar=flag; }\n if (d.playerType=='realone') { alert('show/hide controls not available'); }\n if (d.playerType=='quicktime') // if player not ready, retry in one second\n { if (this.isReady(id)) p.setControllerVisible(flag); else setTimeout('config.macros.player.showControls("'+id+'",'+flag+')',1000); }\n if (d.playerType=='flash') { alert('show/hide controls not available'); }\n}\nconfig.macros.player.toggleControls=function(id) {\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') var flag=!p.ShowControls;\n if (d.playerType=='realone') var flag=true; // TBD\n if (d.playerType=='quicktime') var flag=!p.getControllerVisible();\n if (d.playerType=='flash') var flag=true; // TBD\n this.showControls(id,flag);\n}\nconfig.macros.player.fullScreen=function(id) {\n var d=document.getElementById(id+"_div"); if (!d) return false;\n var p=document.getElementById(id); if (!p) return false;\n if (d.playerType=='windows') p.DisplaySize=3;\n if (d.playerType=='realone') p.SetFullScreen();\n if (d.playerType=='quicktime') { alert('full screen not available'); }\n if (d.playerType=='flash') { alert('full screen not available'); }\n}\n//}}}\n\n// // Player HTML\n\n//{{{\n// placeholder (no player)\nconfig.macros.player.html.none=' \s\n <table id="%i%" width="%w%" height="%h%" style="background-color:#111;border:0;margin:0;padding:0;"> \s\n <tr style="background-color:#111;border:0;margin:0;padding:0;"> \s\n <td width="%w%" height="%h%" style="background-color:#111;color:#ccc;border:0;margin:0;padding:0;text-align:center;"> \s\n &nbsp; \s\n %u% \s\n &nbsp; \s\n </td></tr></table>';\n//}}}\n\n//{{{\n// Windows Media Player\n// v7.1 ID: classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6\n// v9 ID: classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95\nconfig.macros.player.html.windows=' \s\n <object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \s\n classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" \s\n codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" \s\n align="baseline" border="0" \s\n standby="Loading Microsoft Windows Media Player components..." \s\n type="application/x-oleobject"> \s\n <param name="FileName" value="%u%"> <param name="ShowControls" value="%s%"> \s\n <param name="ShowPositionControls" value="1"> <param name="ShowAudioControls" value="1"> \s\n <param name="ShowTracker" value="1"> <param name="ShowDisplay" value="0"> \s\n <param name="ShowStatusBar" value="1"> <param name="AutoSize" value="1"> \s\n <param name="ShowGotoBar" value="0"> <param name="ShowCaptioning" value="0"> \s\n <param name="AutoStart" value="1"> <param name="AnimationAtStart" value="1"> \s\n <param name="TransparentAtStart" value="0"> <param name="AllowScan" value="1"> \s\n <param name="EnableContextMenu" value="1"> <param name="ClickToPlay" value="1"> \s\n <param name="InvokeURLs" value="1"> <param name="DefaultFrame" value="datawindow"> \s\n %x% \s\n <embed src="%u%" style="margin:0;padding:0;" \s\n align="baseline" border="0" width="%w%" height="%h%" \s\n type="application/x-mplayer2" \s\n pluginspage="http://www.microsoft.com/windows/windowsmedia/download/default.asp" \s\n name="%i%" showcontrols="%s%" showpositioncontrols="1" \s\n showaudiocontrols="1" showtracker="1" showdisplay="0" \s\n showstatusbar="%s%" autosize="1" showgotobar="0" showcaptioning="0" \s\n autostart="1" autorewind="0" animationatstart="1" transparentatstart="0" \s\n allowscan="1" enablecontextmenu="1" clicktoplay="0" invokeurls="1" \s\n defaultframe="datawindow"> \s\n </embed> \s\n </object>';\n//}}}\n\n//{{{\n// RealNetworks' RealOne Player\nconfig.macros.player.html.realone=' \s\n <table width="%w%" style="border:0;margin:0;padding:0;"><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \s\n <object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \s\n CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \s\n <PARAM NAME="CONSOLE" VALUE="player"> \s\n <PARAM NAME="CONTROLS" VALUE="ImageWindow"> \s\n <PARAM NAME="AUTOSTART" Value="true"> \s\n <PARAM NAME="MAINTAINASPECT" Value="true"> \s\n <PARAM NAME="NOLOGO" Value="true"> \s\n <PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \s\n <PARAM NAME="SRC" VALUE="%u%"> \s\n %x% \s\n <EMBED width="%w%" height="%h%" controls="ImageWindow" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;" \s\n name="%i%" \s\n src="%u%" \s\n console=player \s\n maintainaspect=true \s\n nologo=true \s\n backgroundcolor=#333333 \s\n autostart=true> \s\n </OBJECT> \s\n </td></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \s\n <object id="%i%_controls" width="%w%" height="60" style="margin:0;padding:0;display:%s%" \s\n CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \s\n <PARAM NAME="CONSOLE" VALUE="player"> \s\n <PARAM NAME="CONTROLS" VALUE="All"> \s\n <PARAM NAME="NOJAVA" Value="true"> \s\n <PARAM NAME="MAINTAINASPECT" Value="true"> \s\n <PARAM NAME="NOLOGO" Value="true"> \s\n <PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \s\n <PARAM NAME="SRC" VALUE="%u%"> \s\n %x% \s\n <EMBED WIDTH="%w%" HEIGHT="60" NOJAVA="true" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;display:%s%" \s\n controls="All" \s\n name="%i%_controls" \s\n src="%u%" \s\n console=player \s\n maintainaspect=true \s\n nologo=true \s\n backgroundcolor=#333333> \s\n </OBJECT> \s\n </td></tr></table>';\n//}}}\n\n//{{{\n// QuickTime Player\nconfig.macros.player.html.quicktime=' \s\n <OBJECT ID="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \s\n CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" \s\n CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"> \s\n <PARAM name="SRC" VALUE="%u%"> \s\n <PARAM name="AUTOPLAY" VALUE="true"> \s\n <PARAM name="CONTROLLER" VALUE="%s%"> \s\n <PARAM name="BGCOLOR" VALUE="#333333"> \s\n <PARAM name="SCALE" VALUE="aspect"> \s\n <PARAM name="SAVEEMBEDTAGS" VALUE="true"> \s\n %x% \s\n <EMBED name="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \s\n SRC="%u%" \s\n AUTOPLAY="true" \s\n SCALE="aspect" \s\n CONTROLLER="%s%" \s\n BGCOLOR="#333333" \s\n EnableJavaSript="true" \s\n PLUGINSPAGE="http://www.apple.com/quicktime/download/"> \s\n </EMBED> \s\n </OBJECT>';\n//}}}\n\n//{{{\n// Flash Player\nconfig.macros.player.html.flash='\s\n <object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \s\n classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" \s\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"> \s\n <param name="movie" value="%u%"> \s\n <param name="quality" value="high"> \s\n <param name="SCALE" value="exactfit"> \s\n <param name="bgcolor" value="333333"> \s\n %x% \s\n <embed name="%i%" src="%u%" style="margin:0;padding:0;" \s\n height="%h%" width="%w%" quality="high" \s\n pluginspage="http://www.macromedia.com/go/getflashplayer" \s\n type="application/x-shockwave-flash" scale="exactfit"> \s\n </embed> \s\n </object>';\n//}}}
<html><form>\nPlease enter information about a TiddlyWiki plugin/accessory:<br><!--\n--><input type="hidden" name="cardtype" value="PluginDirectoryForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/document id" name="cardID" value="card/document ID"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:38%" title="tiddler name" name="tiddler" value="tiddler name"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="version" name="ver" value="version"><!--\n--><input type="text" onfocus="this.select()" style="width:20%" title="release date" name="date" value="release date"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="title" name="title" value="title"><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="source location (url)" name="url" value="source location (url)"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="plugin"> plugin/macro <!--\n--><input type="checkbox" name="script"> script <!--\n--><input type="checkbox" name="stylesheet"> stylesheet <!--\n--><input type="checkbox" name="template"> template <!--\n--><input type="checkbox" name="site"> hosted site<!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="summary"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="author/contact" name="author" value="author/contact"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="license" name="license" value="license"><br><!--\n--><textarea rows="10" onfocus="this.select()" style="width:100%" title="description/notes" name="notes">description, installation notes, etc.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="PluginDirectoryCard">\n</form></html>
/%\n\nusage: <<tiddler QuickView with: tag prompt>>\n\n%/{{smallform{<script>\n var tiddlers=store.getTiddlers("modified","excludeLists");\n var out='<html><select size=1 style="width:93.5%" ';\n out+=' onchange="var target=this.parentNode.nextSibling; removeChildren(target); wikify(\s'<\s'+\s'<tiddler [[\s'+this.value+\s']]>\s'+\s'>\s',target); target.style.display=this.value.length?\s'block\s':\s'none\s'; this.nextSibling.disabled=!this.value.length;">';\n out+='<option value="">$2</option>'\n for (var i=tiddlers.length-1; i>=0; i--) {\n if (!tiddlers[i].tags.contains("$1")) continue;\n var t=tiddlers[i].text; var pos=t.indexOf('\sn');\n var title=t.substr(0,pos).replace(/\s/\s%/,'').replace(/\s%\s//,'');\n var date=tiddlers[i].modified.formatString("0MM/0DD/YYYY 0hh:0mm");\n out+='<option value="'+tiddlers[i].title+'">'+date+' - '+title+'</option>\sn';\n }\n out+='</select>';\n out+='<input type="button" name="done" value="done" disabled title="hide article display" style="width:6%" ';\n out+=' onclick="removeChildren(this.parentNode.nextSibling); this.parentNode.nextSibling.style.display=\s'none\s'; this.previousSibling.selectedIndex=0; this.disabled=true;">';\n out+='</html>';\n out+='@@display:none;white-space:normal;@@';\n return out;\n</script>}}}
In theory, there is no difference between theory and practice. But, in practice, there is.\n----\nSometimes when reading Goethe I have the paralyzing suspicion that he is trying to be funny.\n----\nBefore I got married I had six theories about bringing up children; now I have six children and no theories.\n----\nA witty saying proves nothing.\n----\nThe problem with some people is that when they aren't drunk, they're sober.\n----\nThe great thing about television is that if something important happens anywhere in the world, day or night, you can always change the channel.\n----\nDon't be so humble - you are not that great.\n----\nThe combination "ough" can be pronounced in nine different ways. The following sentence contains them all: "A rough-coated, dough-faced, thoughtful ploughman strode through the streets of Scarborough; after falling into a slough, he coughed and hiccoughed." \n----\nIf you lived here, you'd be home by now...\n----\nI love my dust. It shows I had something better to do.\n----\nTime flies like an arrow... Fruit flies like a banana [Groucho Marx]\n----\nIf you don't know where you're going, you'll probably end up somewhere else.\n----\nWeebles wobble... but they don't fall down!\n----\nIt's all very simple... or else it's all very complex... or perhaps it's neither... or both.\n----\nAccepting reality is the first step to insanity\n----\nOops! Sorry. My karma ran over your dogma.\n----\nIf it looks like a duck, walks like a duck and sounds like a duck, it's probably something else.\n----\nSome times you feel like a nut, some times you bolt.\n----\nSantaclaustrophobia... The feeling that Christmas is closing in all around you.\n----\nDon't touch that! You don't know where it's been...\n----\nWhy is abbreviation such a long word?\n----\nLife's a trip, not a destination. So watch out for the cows.\n----\nDiplomacy is the art of saying 'Nice doggie!'... until you can find a rock.\n----\nScientists working on cloning technology have done what the american educational system has been doing for years - producing identical sheep.\n----\nUmm... What's another word for thesaurus?\n----\nGive me ambiguity or give me something else\n----\nDon't anthropomorphize your computer, it doesn't like it.\n----\nNinth Law of Cartoon Physics: Everything falls faster than an anvil.\n----\nNew clinical studies show there aren't any answers. So just enjoy the questions...\n----\nOh yeah? Far out!\n----\nBoycott Shampoo - Demand the REAL poo!\n----\nOn Blintze! On Bagel! On Spaetzle! On Strudel! On Matzo! On Latke! On Kuchen! On Kugel!... Merry Chanukah!\n----\nRemember: Don't sweat the petty things... and don't pet the sweaty things.\n----\nSign in lunch room: Shoes are required to eat in the cafeteria... socks can eat anywhere they want.\n----\nDon't be irreplaceable, if you can't be replaced, you can't be promoted.\n----\n5 out of 4 people have problems with fractions...\n----\nOsborne's Law of Mathematics: Variables won't; constants aren't.\n----\nAlways remember you're unique, just like everyone else.\n----\nSomething to ponder: What was the best thing *before* sliced bread? Hmmm...\n----\nPhysics Joke #27: Two hydrogen atoms bump into each other while walking down the street: 'Are you alright?'... 'No, I lost an electron!'... 'Are you sure?'... 'Yeah, I'm Positive!'\n----\nThe one thing I can't stand is intolerant people!\n----\nOld programmers never die. . . they just can't C as well.\n----\nWorld Shortest 'Bar' joke: --- A guy walks into a bar... OUCH! he says...\n----\nWho are you going to believe, me or your own eyes? \n----\nNever judge a man 'til you have walked a mile in his shoes, because by then, he's a mile away, you've got his shoes, and you can say whatever the hell you want to.\n----\nThe problem with troubleshooting is that real trouble shoots back.\n----\nHow much wood would a woochuck chuck if a woodchuck could chuck wood?\n----\nThese are the roots of rhythm: boom, de boom, de-boom, ding-dong, ooh! [Leila ~Gallagher-Breen]\n----\nThese are the roots of music: boom-chicky-chicky boom, meow, meow, baddom, baddom, ding-aling-a-long, chicky-boom! [Leila ~Gallagher-Breen]\n----\nClassified ad (in Physics Quarterly): Got Mole problems? Call Avagadro Exterminators: 602-1023\n----\nHe who laughs last thinks slowest\n----\nWould a fly without wings be called a walk?\n----\nThe winner of the World's Worst Analogy contest: 'The little boat glided across the water in exactly the way a bowling ball wouldn't.'\n----\nFrom the 'say what?!?' files: We are ready for any unforeseen event that may or may not occur. [Dan Quayle 9/22/90]\n----\nI believe you should live each day as if it is your last, which is why I don't have any clean laundry because, come on, who wants to wash clothes on the last day of their life? [Jack Handy]\n----\nPRINTER - A device consisting of three main parts: the case, the jammed paper tray, and the blinking red light.\n----\nDilbert's Laws of Work: The more crap you put up with, the more crap you are going to get.\n----\nQ: Why'd the electron cross the road? A: 'Cause he was already on the other side...\n----\nWhen the going gets tough, remember STRESSED spelled backwards is DESSERTS.\n----\nFoobar... baz. Mumble: frotz, gronk, snork. Snerfle? Natter and gromish!\n----\nPentiums melt in your PC, not in your hand.\n----\neveryone is cute... even me. But in purple... I'm STUNNING!! [Londo Mollari] \n----\nI always wanted to be somebody, but I should have been more specific. [Lily Tomlin] \n----\nIt's OK to change horses in mid-stream, especially if the first horse can't swim! [Laura Shulman] \n----\nWork is the curse of the drinking classes. [Oscar Wilde] \n----\nWe have only two things to worry about: That things will never get back to normal, and that they already have.\n----\nIntelligence is a funny thing: those who don't have it think they do, and those who do are smart enough to know better.\n----\nLife is hard, Love is strange. Nothing lasts, people change. Dream of a long and wonderful future, but live now.\n----\n'Can you prove any of the stuff you believe in?', my friend asked. When I said that's not how belief works, he nodded and said that's what he thought but he was just checking to make sure he hadn't missed a key point.\n----\nLife ... It's a good place to be!\n----\nDo not follow where the path may lead. Go, instead, where there is no path, and leave a trail.\n----\nHistory is made at night... character is what you are in the dark. [Dr. Emilio Lizardo, aka Lord John Worfin] \n----\nYou can't always get what you want... but if you try sometimes, you just may find, that you get what you need. [The Rolling Stones] \n----\nThe only man who behaved sensibly was my tailor; he took my measurement anew every time he saw me, while all the rest went on with their old measurements and expected them to fit me. [George Bernard Shaw] \n----\nIn matters of style, swim with the current: in matters of principle, stand like a rock. [Thomas Jefferson] \n----\nGreat things are not done by impulse, but by a series of small things brought together. [Vincent van Gogh] \n----\n'I think there is a world market for maybe five computers.' [Thomas Watson, chairman of IBM, 1943] \n----\nWe have to live today by what truth we can get today, and be ready tomorrow to call it falsehood. [William James] \n----\nThere are two ways of spreading light: to be the candle or the mirror that reflects it. [Edith Wharton] \n----\nTalent develops in tranquility, character in the full current of human life. [Johann Wolfgang von Goethe (1749-1832)] \n----\nOur firmest convictions are apt to be the most suspect; they mark our limitations and our bounds. Life is a petty thing unless it is moved by the indomitable urge to extend its boundaries. [Jose Ortega y Gasset] \n----\nIt takes courage to grow up and turn out to be who you really are. [e e cummings (1894-1962)] \n----\nIf we knew what it was we were doing, it would not be called research, would it? [Albert Einstein] \n----\nTo invent, you need a good imagination and a pile of junk. [Thomas Edison] \n----\nDare to be naive. [R. Buckminster Fuller] \n----\nQuiet minds cannot be perplexed or frightened, but go on in fortune or misfortune at their own private pace, like a clock during a thunderstorm. [Robert Louis Stevenson] \n----\nIn the struggle between yourself and the world, second the world. [Franz Kafka] \n----\nEvery man's condition is a solution in hieroglyph to those inquiries he would put. He acts it as life before he apprehends it as truth. [Ralph Waldo Emerson] \n----\nOne can remain alive...if one is unafraid of change, insatiable in intellectual curiosity, interested in big things, and happy in small ways. [Edith Wharton] \n----\na rock is like space because it doesnt move; and space is like a rock because it is empty. words are buddhas. [Jack Kerouac] \n----\nThe whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. [Bertrand Russell] \n----\nDoubt is not a pleasant state of mind, but certainty is absurd. [Voltaire] \n----\nEducation is not the filling of a pail, but the lighting of a fire. [William Butler Yeats] \n----\nIf you take yourself too seriously, no one else will take you seriously enough... [Eric Shulman] \n----\nThere are only four questions of value in life... What is sacred? Of what is the spirit made? What is worth living for, and what is worth dying for? The answer to each is the same: only love. [Don Juan ~DeMarco] \n----\nIf you are a dreamer, come in. If you are a dreamer, a wisher, a liar, a hope-er, a pray-er, a magic bean buyer... If you're a pretender, come sit by my fire... For we have some flax-golden tales to spin. Come in! Come in! [Shel Silverstein] \n----\nO money, money, money, I'm not necessarily one of those who think thee holy, But I often stop to wonder how thou canst go out so fast when thou comest in so slowly. [Ogden Nash] \n----\nThere is no progress without struggle. [Frederick Douglass] \n----\nBefore you can do something, you must become something. [Goethe] \n----\nThe man who follows the crowd will usually get no further than the crowd. The man who walks alone is likely to find himself in places no one has ever been. [Alan ~Ashley-Pit] \n----\nWeep not for the dead for they are but empty cages from which the bird has flown. [Tibetan Book of The Dead] \n----\nI wish it would dawn upon engineers that, in order to be an engineer, it is not enough to be an engineer. [Jose Ortega y Gasset] \n----\nEvery exit is an entry somewhere. [Tom Stoppard] \n----\nWherever we are, it is but a stage on the way to somewhere else, and whatever we do, however well we do it, it is only a preparation to do something else that shall be different. [Robert Louis Stevenson] \n----\nWe judge ourselves by what we feel capable of doing, while others judge us by what we have already done. [Henry Wadsworth Longfellow] \n----\nAll our words are but crumbs that fall down from the feast of the mind. [Kahlil Gibran, "Sand and Foam"] \n----\nIt's a lot harder to find joy than it is to find bread. Feed your soul first, then go shopping. [Eric Shulman] \n----\nWhy do you hasten to remove anything which hurts your eye, while if something affects your soul you postpone the cure until next year? [Horace] \n----\nNot to know is bad. Not to want to know is worse. Not to hope is unthinkable. Not to care is unforgivable. [Nigerian folk saying] \n----\nOnly half of writing is saying what you mean. The other half is preventing people from reading what they expected you to mean. [James Richardson, 'Ploughshares'] \n----\nThere are no shortcuts to anyplace worth going. [Beverly Sills] \n----\nSomewhere, something incredible is waiting to be known. [Carl Sagan] \n----\nCourage is the price that Life extracts for granting peace. [Amelia Earhart] \n----\nGreat things are not done by impulse, but by a series of small things brought together. [Vincent van Gogh] \n----\nChoose a job you love, and you will never have to work a day in your life. [Confucius] \n----\nThere is only one success - to be able to spend your life in your own way. [Christopher Morley] \n----\nWe choose our joys and sorrows long before we experience them. [Kahlil Gibran] \n----\nIt is all a frame of mind, this enjoyment of living. [Lin Yutang] \n----\nWork for something because it is good, not just because it stands a chance to succeed. [Vaclav Havel] \n----\nThe easiest way to get what you want is to help others get what they want. [Deepak Chopra] \n----\nAll generalizations are false, including this one. [Bucky Radfish]\n----\nIn science, 'fact' can only mean 'confirmed to such a degree that it would be perverse to withhold provisional assent.' I suppose that apples might start to rise tomorrow, but the possibility does not merit equal time in physics classrooms. [Stephen Jay Gould (1941 - 2002)]\n----\nTwenty years from now, you will be more disappointed by the things you didn't do, than by the ones you did. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore, dream... [Mark Twain]\n----\nTo live only for some future goal is shallow. It's the sides of the mountain that sustain life, not the top. [Robert M. Pirsig]\n----\nNothing is so contagious as enthusiasm; it moves stones, it charms brutes. Enthusiasm is the genius of sincerity, and truth accomplishes no victories without it. [Edward G. E. ~Bulwer-Lytton (1803 - 1873)]\n----\nThe past is but the beginning of a beginning, and all that is and has been is but the twilight of the dawn. [Herbert George Wells]\n----\nWe grow great by dreams. All big men are dreamers. They see things in the soft haze of a spring day or in the red fire of a long winter's evening. Some of us let these great dreams die, but others nourish and protect them; nurse them through bad days till they bring them to the sunshine and light, which comes always to those who sincerely hope that their dreams will come true. [Woodrow Wilson]\n----\nBe brave enough to live life creatively. The creative is the place where no one else has ever been. You have to leave the city of your comfort and go into the wilderness of your intuition. You can't get there by bus, only by hard work and risk and by not quite knowing what you're doing. What you'll discover will be wonderful. What you'll discover will be yourself. [Alan Alda]\n----\nIf we had no winter, the spring would not be so pleasant; if we did not sometimes taste of adversity, prosperity would not be so welcome.\n----\nSolitude, if rightly used, becomes not only a privilege but a necessity. Only a superficial soul fears to fraternize with itself.\n----\nOne of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important.\n----\nHope is like a road in the country: there was never a road, but when many people walk on it, the road comes into existence.\n----\nYou can only find truth with logic if you have already found truth without it.\n----\nLove is always bestowed as a gift - freely, willingly and without expectation. We don't love to be loved; we love to love.\n----\nAlways listen to experts. They'll tell you what can't be done, and why. Then do it.\n----\nDistance between two hearts is not an obstacle; rather a great reminder of just how strong true love can be.\n----\nNot everything that can be counted counts, and not everything that counts can be counted.\n----\nLife's challenges are not supposed to paralyze you, they're supposed to help you discover who you are.\n----\nNothing splendid has ever been achieved except by those who dared believe that something inside them was superior to circumstances.\n----\nWhether you think that you can, or that you can't, you are usually right.\n----\nThe only time you run out of chances is when you stop taking them.\n----\nKnowledge speaks, but wisdom listens.\n----\nToo often we give our children answers to remember rather than problems to solve.\n----\nBooks are the shoes with which we tread the footsteps of great minds. A book may lie dormant for fifty years or for two thousand years in a forgotten corner of a library, only to reveal, upon being opened, the marvels or the abysses that it contains, or the line that seems to have been written for me alone. In this respect the writer is not different from any other human being: whatever we say or do can have far-reaching consequences.\n----\nA people that values its privileges above its principles soon loses both.\n----\nTreat everyone with politeness, even those who are rude to you. Not because they are nice, but because you are.\n----\nThe ultimate measure of a man is not where he stands in moments of comfort and convenience, but where he stands in times of challenge and controversy. What lies behind us and what lies before us, are only small matters compared to what lies within us. \n----\nBeing in charge of your own reality is a little tougher; it takes a lot of thinking and brutal honesty. [Phil Glatz]\n----\nThere are always going to be amazingly creative people doing wonderful things. [Phil Glatz]\n----\nThe trick is to rise above the symptoms of being aware, and actually BE aware. [Phil Glatz]\n----\nA revolution is coming - a revolution which will be peaceful if we are wise enough; compassionate if we care enough; successful if we are fortunate enough - but a revolution which is coming whether we will it or not. We can affect its character, we cannot alter its inevitability. [John F. Kennedy]\n----\nOn two occasions I have been asked (by members of Parliament!), 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. [Charles Babbage]\n----\nIn your presence even my shadow acquires the sensation of touch.
/***\n''QuoteOfTheDayPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#QuoteOfTheDayPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nDisplay a randomly selected "quote of the day"\n\n!!!!!Usage\n<<<\n{{{<<QOTD //tiddlername//>>}}}\nPut your quotations into a tiddler (called //tiddlername//). Separate each quote by a horizontal rule (use "----" on a line by itself). Each time the macro is rendered it will display a different quotation, selected at random from the specified tiddler.\n<<<\n!!!!!Example\n<<<\n{{{<<QOTD Quotations>>}}}\n<<QOTD Quotations>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''QuoteOfTheDayPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for QuoteOfTheDay handling^^\n<<<\n!!!!!Revision History\n<<<\n''2005.10.21 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nBased on a suggestion by M.Russula\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.QOTD = {major: 1, minor: 0, revision: 0, date: new Date(2005,10,21)};\nconfig.macros.QOTD = {};\nconfig.macros.QOTD.handler= function(place,macroName,params) {\n var txt=store.getTiddlerText(params[0]); if (!txt) return;\n var quotes=txt.split("\sn----\sn");\n // then, get a random index number between 0 and N-1 and wikify that text\n wikify(quotes[Math.floor(Math.random()*quotes.length)],place);\n}\n//}}}
//{{{\n\n// adapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable\n// changes by ELS:\n// * hijack refreshTiddler() instead of overridding createTiddler()\n// * find title element by className instead of elementID\n// * set cursor style via code instead of stylesheet\n// * set tooltip help text\n// * set tiddler "position:relative" when starting drag event, restore saved value when drag ends\n\n// * update 2006.08.07: use getElementsByTagName("*") to find title element, even when it is 'buried' deep in tiddler DOM elements (due to custom template usage)\n\nStory.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,unused1,unused2,unused3,unused4,unused5)\n{\n this.rearrangeTiddlersHijack_refreshTiddler(title,template,unused1,unused2,unused3,unused4,unused5);\n var theTiddler = document.getElementById(this.idPrefix + title); if (!theTiddler) return;\n var theHandle;\n var children=theTiddler.getElementsByTagName("*");\n for (var i=0; i<children.length; i++) if (hasClass(children[i],"title")) { theHandle=children[i]; break; }\n if (!theHandle) return theTiddler;\n\n Drag.init(theHandle, theTiddler, 0, 0, null, null);\n theHandle.style.cursor="move";\n theHandle.title="drag title to re-arrange tiddlers"\n theTiddler.onDrag = function(x,y,myElem) {\n if (this.style.position!="relative")\n { this.savedstyle=this.style.position; this.style.position="relative"; }\n y = myElem.offsetTop;\n var next = myElem.nextSibling;\n var prev = myElem.previousSibling;\n if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);\n myElem.style["top"] = -next.offsetHeight/2+"px";\n }\n if (prev && y < prev.offsetTop + prev.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n prev.parentNode.insertBefore(myElem, prev);\n myElem.style["top"] = prev.offsetHeight/2+"px";\n }\n };\n theTiddler.onDragEnd = function(x,y,myElem) {\n myElem.style["top"] = "0px";\n if (this.savedstyle!=undefined)\n this.style.position=this.savedstyle;\n }\n return theTiddler;\n}\n\n/**************************************************\n * dom-drag.js\n * 09.25.2001\n * www.youngpup.net\n **************************************************\n * 10.28.2001 - fixed minor bug where events\n * sometimes fired off the handle, not the root.\n **************************************************/\n\nvar Drag = {\n obj:null,\n\n init:\n function(o, oRoot, minX, maxX, minY, maxY) {\n o.onmousedown = Drag.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";\n if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";\n o.minX = typeof minX != 'undefined' ? minX : null;\n o.minY = typeof minY != 'undefined' ? minY : null;\n o.maxX = typeof maxX != 'undefined' ? maxX : null;\n o.maxY = typeof maxY != 'undefined' ? maxY : null;\n o.root.onDragStart = new Function();\n o.root.onDragEnd = new Function();\n o.root.onDrag = new Function();\n },\n\n start:\n function(e) {\n var o = Drag.obj = this;\n e = Drag.fixE(e);\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n o.root.onDragStart(x, y, Drag.obj.root);\n o.lastMouseX = e.clientX;\n o.lastMouseY = e.clientY;\n if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;\n if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;\n if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;\n if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;\n document.onmousemove = Drag.drag;\n document.onmouseup = Drag.end;\n Drag.obj.root.style["z-index"] = "10";\n return false;\n },\n\n drag:\n function(e) {\n e = Drag.fixE(e);\n var o = Drag.obj;\n var ey = e.clientY;\n var ex = e.clientX;\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n var nx, ny;\n if (o.minX != null) ex = Math.max(ex, o.minMouseX);\n if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);\n if (o.minY != null) ey = Math.max(ey, o.minMouseY);\n if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);\n nx = x + (ex - o.lastMouseX);\n ny = y + (ey - o.lastMouseY);\n Drag.obj.root.style["left"] = nx + "px";\n Drag.obj.root.style["top"] = ny + "px";\n Drag.obj.lastMouseX = ex;\n Drag.obj.lastMouseY = ey;\n Drag.obj.root.onDrag(nx, ny, Drag.obj.root);\n return false;\n },\n\n end:\n function() {\n document.onmousemove = null;\n document.onmouseup = null;\n Drag.obj.root.style["z-index"] = "0";\n Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);\n Drag.obj = null;\n },\n\n fixE:\n function(e) {\n if (typeof e == 'undefined') e = window.event;\n if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;\n if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;\n return e;\n }\n};\n//}}}\n
<script label="refresh">\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),null,true);\n</script>
/***\n|''Name:''|ReminderPlugin|\n|''Version:''|2.3.8 (Mar 9, 2006)|\n|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|\n|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|\n|''TiddlyWiki:''|2.0+|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n\n!Description\nThis plugin provides macros for tagging a date with a reminder. Use the {{{reminder}}} macro to do this. The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.\n\n!Installation\n* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag. The tag is important because it tells TW that this is executable code.\n* Double click this tiddler, and copy all the text from the tiddler's body.\n* Paste the text into the body of the new tiddler in your TW.\n* Save and reload your TW.\n* You can copy some examples into your TW as well. See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n!Syntax:\n|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|\n\n!Revision history\n* v2.3.8 (Mar 9, 2006)\n**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1\n**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format\n* v2.3.6 (Mar 1, 2006)\n**Bug fix: Reminders for today weren't being matched sometimes.\n**Feature: Solidified integration with DatePlugin and CalendarPlugin\n**Feature: Recurring reminders will now return multiple hits in showReminders and the calendar.\n**Feature: Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.\n* v2.3.5 (Feb 8, 2006)\n**Bug fix: Sped up reminders lots. Added a caching mechanism for reminders that have already been matched.\n* v2.3.4 (Feb 7, 2006)\n**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins \nto crash Firefox. Thanks to http://www.jslint.com\n* v2.3.3 (Feb 2, 2006)\n**Feature: newReminder now has drop down lists instead of text boxes.\n**Bug fix: A trailing space in a title would trigger an infinite loop.\n**Bug fix: using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"\n* v2.3.2 (Jan 21, 2006)\n**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.\n** Bug fix: offsetday was not working sometimes\n** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch. I've reverted back to searching through all tiddlers\n* v2.3.1 (Jan 7, 2006)\n**Feature: 2.0 compatibility\n**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.\n* v2.3.0 (Jan 3, 2006)\n** Bug Fix: Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.\n** Bug Fix: Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// ReminderPlugin\n//============================================================================\n//============================================================================\n\nversion.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};\n\n//============================================================================\n// Configuration\n// Modify this section to change the defaults for \n// leadtime and display strings\n//============================================================================\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["newReminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\nconfig.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY";\nconfig.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER";\nconfig.macros.reminders["defaultAnniversaryMessage"] = "(DIFF)";\nconfig.macros.reminders["untitledReminder"] = "Untitled Reminder";\nconfig.macros.reminders["noReminderFound"] = "Couldn't find a match for TITLE in the next LEADTIMEUPPER days."\nconfig.macros.reminders["todayString"] = "Today";\nconfig.macros.reminders["tomorrowString"] = "Tomorrow";\nconfig.macros.reminders["ndaysString"] = "DIFF days";\nconfig.macros.reminders["emtpyShowRemindersString"] = "There are no upcoming events";\n\n\n//============================================================================\n// Code\n// You should not need to edit anything \n// below this. Make sure to edit this tiddler and copy \n// the code from the text box, to make sure that \n// tiddler rendering doesn't interfere with the copy \n// and paste.\n//============================================================================\n\n// This line is to preserve 1.2 compatibility\n if (!story) var story=window; \n//this object will hold the cache of reminders, so that we don't\n//recompute the same reminder over again.\nvar reminderCache = {};\n\nconfig.macros.showReminders.handler = function showReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n if (arr.length == 0)\n {\n mess += config.macros.reminders.emtpyShowRemindersString; \n }\n for (var j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n {\n arr[j]["params"]["format"] = paramHash["format"];\n }\n else\n {\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n }\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n};\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (var j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);\n }\n};\n\nconfig.macros.reminder.handler = function reminder(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n {\n return;\n }\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n {\n leadTime = config.macros.reminders["defaultLeadTime"]; \n }\n var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);\n var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(place).id.substr(7);\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);\n wikify(mess, elem, null, null);\n }\n else\n {\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );\n }\n};\n\nconfig.macros.newReminder.handler = function newReminder(place,macroName,params)\n{\n var today=new Date().getMidnight();\n var formstring = '<html><form>Year: <select name="year"><option value="">Every year</option>';\n for (var i = 0; i < 5; i++)\n {\n formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';\n }\n formstring += '</select>&nbsp;&nbsp;Month:<select name="month"><option value="">Every month</option>';\n for (i = 0; i < 12; i++)\n {\n formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';\n }\n formstring += '</select>&nbsp;&nbsp;Day:<select name="day"><option value="">Every day</option>';\n for (i = 1; i < 32; i++)\n {\n formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';\n }\n\nformstring += '</select>&nbsp;&nbsp;Reminder Title:<input type="text" size="40" name="title" value="please enter a title" onfocus="this.select();"><input type="button" value="ok" onclick="addReminderToTiddler(this.form)"></form></html>';\n\n var panel = config.macros.slider.createSlider(place,null,"New Reminder","Open a form to add a new reminder to this tiddler");\n wikify(formstring ,panel,null,store.getTiddler(params[1]));\n};\n\n// onclick: process input and insert reminder at 'marker'\nwindow.addReminderToTiddler = function(form) {\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(form).id.substr(7);\n var tiddler=store.getTiddler(title);\n var txt='\sn<<reminder ';\n if (form.year.value != "")\n txt += 'year:'+form.year.value + ' ';\n if (form.month.value != "")\n txt += 'month:'+form.month.value + ' ';\n if (form.day.value != "")\n txt += 'day:'+form.day.value + ' ';\n txt += 'title:"'+form.title.value+'" ';\n txt +='>>';\n tiddler.set(null,tiddler.text + txt);\n window.story.refreshTiddler(title,1,true);\n store.setDirty(true);\n};\n\nfunction hasTag(tiddlerTags, tagFilters)\n{\n //Make sure we respond well to empty tiddlerTaglists or tagFilterlists\n if (tagFilters.length==0 || tiddlerTags.length==0)\n {\n return true;\n }\n\n var bHasTag = false;\n \n /*bNoPos says: "'till now there has been no check using a positive filter"\n Imagine a filterlist consisting of 1 negative filter:\n If the filter isn't matched, we want hasTag to be true.\n Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)\n \n If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false\n Thus: hasTag returns true.\n \n If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which\n means bHasTag must be true for hasTag to return true*/\n var bNoPos=true;\n \nfor (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!') \n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n //If at any time a negative filter is matched, we return false\n return false;\n }\n }\n else \n {\n if (bNoPos)\n {\n //We encountered the first positive filter\n bNoPos=false;\n }\n if (tiddlerTags[t2] == tagFilters[t3])\n {\n //A positive filter is matched. As long as no negative filter is matched, hasTag will return true\n bHasTag=true;\n }\n }\n }\n }\n return (bNoPos || bHasTag);\n};\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nwindow.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)\n{\n//function(searchRegExp,sortField,excludeTag)\n// var macroPattern = "<<([^>\s\s]+)(?:\s\s*)([^>]*)>>";\n var macroPattern = "<<(reminder)(.*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var matches = store.search(macroRegExp,"title","");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n {\n tagsArray = tags.split(" ");\n }\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n {\n continue;\n }\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n \n var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};\n var dateHash = getParamsForReminder(params);\n if (limit != null || dateHash["leadtime"] == null)\n {\n if (leadtime == null)\n dateHash["leadtime"] = leadtime;\n else\n {\n dateHash["leadtime"] = [];\n dateHash["leadtime"][0] = leadtime[0];\n dateHash["leadtime"][1] = leadtime[1];\n }\n }\n if (dateHash["leadtime"] == null)\n dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; \n var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);\n var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);\n var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n while (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);\n hash["params"] = cloneParams(dateHash);\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n if (dateHash["recurdays"] != null || (dateHash["year"] == null))\n {\n leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);\n matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n }\n else matchedDate = null;\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n {\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });\n }\n return arr;\n};\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\n window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n {\n reminderTitle = config.macros.reminders["untitledReminder"];\n }\n if (params["firstyear"] != null)\n {\n anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n }\n var mess = "";\n var diffString = "";\n if (diff == 0)\n {\n diffString = config.macros.reminders["todayString"];\n }\n else if (diff == 1)\n {\n diffString = config.macros.reminders["tomorrowString"];\n }\n else\n {\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n }\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n {\n format = params["format"];\n }\n mess = format;\n//HACK! -- Avoid replacing DD in TIDDLER with the date\n mess = mess.replace(/TIDDLER/g, "TIDELER");\n mess = matchedDate.formatStringDateOnly(mess);\n mess = mess.replace(/TIDELER/g, "TIDDLER");\n if (tiddlerTitle != null)\n {\n mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);\n mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");\n }\n \n mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD MMM DD, YYYY")).replace("ANNIVERSARY", anniversaryString);\n return mess;\n};\n\n// Parse out the macro parameters into a hashtable. This\n// handles the arguments for reminder, showReminders and \n// displayTiddlersWithReminders.\nwindow.getParamsForReminder = function getParamsForReminder(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n var split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (var i=2; i < split.length; i++)\n {\n value += ":" + split[i];\n }\n if (type == "nolinks" || type == "limit" || type == "hidden")\n {\n num = 1;\n }\n else if (type == "leadtime")\n {\n var leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0], 10);\n leads[1] = parseInt(leads[1], 10);\n num = leads;\n }\n else if (type == "offsetdayofweek")\n {\n if (value.substr(0,1) == "-")\n {\n dateHash["negativeOffsetDayOfWeek"] = 1;\n value = value.substr(1);\n }\n num = parseInt(value, 10);\n }\n else if (type != "title" && type != "tag" && type != "format")\n {\n num = parseInt(value, 10);\n }\n else\n {\n title = value;\n t++;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)\n {\n title += " " + params[t++];\n }\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n {\n title = title.substr(1, title.length - 2);\n t--;\n }\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n {\n dateHash["day"] = dateHash["date"];\n }\n return dateHash;\n};\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nwindow.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)\n{\n if (baseDate == null)\n {\n baseDate = new Date().getMidnight();\n }\n var hashKey = baseDate.convertToYYYYMMDDHHMM();\n for (var k in dateHash)\n {\n hashKey += "," + k + "|" + dateHash[k];\n }\n hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();\n hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();\n if (reminderCache[hashKey] == null)\n {\n //If we don't find a match in this run, then we will\n //cache that the reminder can't be matched.\n reminderCache[hashKey] = false;\n }\n else if (reminderCache[hashKey] == false)\n {\n //We've already tried this date and failed\n return null;\n }\n else\n {\n return reminderCache[hashKey];\n }\n \n var bOffsetSpecified = dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null || \n dateHash["recurdays"] != null;\n \n // If we are matching the base date for a dayofweek offset, look for the base date a \n //little further back.\n var tmp1leadTimeLowerBound = leadTimeLowerBound; \n if ( dateHash["offsetdayofweek"] != null)\n {\n tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6); \n }\n var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null)\n {\n var tmpdateHash = cloneParams(dateHash);\n tmpdateHash["year"] = dateHash["offsetyear"];\n tmpdateHash["month"] = dateHash["offsetmonth"];\n tmpdateHash["day"] = dateHash["offsetday"];\n tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];\n var tmpleadTimeLowerBound = leadTimeLowerBound;\n var tmpleadTimeUpperBound = leadTimeUpperBound;\n if (tmpdateHash["offsetdayofweek"] != null)\n {\n if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)\n {\n tmpleadTimeLowerBound = matchedDate.addDays(-6);\n tmpleadTimeUpperBound = matchedDate;\n\n }\n else\n {\n tmpleadTimeLowerBound = matchedDate;\n tmpleadTimeUpperBound = matchedDate.addDays(6);\n }\n\n }\n newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n {\n return null;\n }\n }\n if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n reminderCache[hashKey] = newMatchedDate;\n return newMatchedDate;\n }\n }\n return null;\n};\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)\n{\n\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n {\n return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);\n }\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);\n if (tmpDate.getTime() < leadTimeLowerBound.getTime())\n {\n tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);\n }\n if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n return tmpDate;\n }\n else\n {\n return null;\n }\n }\n\n var newDate = leadTimeLowerBound; \n while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);\n if (tmp != null)\n return tmp;\n newDate = newDate.addDays(1);\n }\n};\n\nfunction testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)\n{\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedYear)\n {\n bMatchedYear = (dateHash["year"] == testMe.getFullYear());\n }\n if (bSpecifiedMonth)\n {\n bMatchedMonth = ((dateHash["month"] - 1) == testMe.getMonth() );\n }\n if (bSpecifiedDay)\n {\n bMatchedDay = (dateHash["day"] == testMe.getDate());\n }\n if (bSpecifiedDayOfWeek)\n {\n bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());\n }\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n {\n return testMe;\n }\n};\n\n//Returns true if the date is in between two given dates\nDate.prototype.isBetween = function isBetween(lowerBound, upperBound)\n{\n return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());\n}\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function getMidnight()\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);\n};\n// Add the specified number of days to a date.\nDate.prototype.addDays = function addDays(numberOfDays)\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);\n};\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)\n{\n//I have to do it this way, because this way ignores daylight savings\n var tmpDate = this.addDays(0);\n if (this.getTime() > otherDate.getTime())\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(-1);\n }\n return i;\n }\n else\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(1);\n }\n return i * -1;\n }\n return 0;\n};\nfunction cloneParams(what) {\n var tmp = {};\n for (var i in what) {\n tmp[i] = what[i];\n }\n return tmp;\n}\n// Substitute date components into a string\nDate.prototype.formatStringDateOnly = function formatStringDateOnly(template)\n{\n template = template.replace("YYYY",this.getFullYear());\n template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);\n template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));\n template = template.replace("MM",this.getMonth()+1);\n template = template.replace("DDD",config.messages.dates.days[this.getDay()]);\n template = template.replace("0DD",String.zeroPad(this.getDate(),2));\n template = template.replace("DD",this.getDate());\n return template;\n};\n\n//}}}
/%\nusage:\n <<tiddler ReplaceTiddlerTitle with: "new title text">>\n\n%/<script>\n // get the tiddler element\n var t=story.findContainingTiddler(place);\n if (t && t.id!="tiddlerReplaceTiddlerTitle") \n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"title"))\n { removeChildren(t.childNodes[i]); wikify("$1",t.childNodes[i]); }\n</script>
<html><form>\n<input type="hidden" name="cardtype" value="BookmarkForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card id" name="cardID" value="SampleBookmarkCard"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:79%" title="title" name="title" value="TiddlyTools: Small Tools for Big Ideas"><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="url" name="url" value="http://www.TiddlyTools.com/"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="This site!"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">TiddlyTools presents Technologies, Techniques, Tricks, Tips, Tweaks and Tutorials for TiddlyWiki readers, authors and developers, using a combination of plugins, macros, scripts, templates, and stylesheets from ELS Design Studios (and other sources) to customize the default features and functions provided by the TiddlyWiki standard distribution.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="tags">\n</form></html>\n----\n/%title%/TiddlyTools: Small Tools for Big Ideas /%title%/\n/%url%/http://www.TiddlyTools.com/ /%url%/\nsummary: /%summary%/This site! /%summary%/ +++[more...]>/%notes%/TiddlyTools presents Technologies, Techniques, Tricks, Tips, Tweaks and Tutorials for TiddlyWiki readers, authors and developers, using a combination of plugins, macros, scripts, templates, and stylesheets from ELS Design Studios (and other sources) to customize the default features and functions provided by the TiddlyWiki standard distribution./%notes%/===\n
<html><form>\n<input type="hidden" name="cardtype" value="TiddlyCardsDefaultForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card id" name="cardID" value="SampleDefaultCard"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:79%" title="title" name="title" value="This is a sample card using the default &quot;simple note&quot; form"><br><!--\n--><textarea rows="10" onfocus="this.select()" style="width:100%" title="notes" name="notes">This is where you type in your notes.\n\nWhen shown using TiddlyCards' read-only &quot;view&quot; mode, this form is disabled. To edit this card, please switch to TiddlyCards' &quot;edit&quot; mode.</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="sample">\n</form></html>
<html><form action="javascript:displayMessage('perform action')" onsubmit="displayMessage('onsubmit: validate input...')">\nPlease enter information about this <!--doctype-->technical reference<!--doctype-->:<br><!--\n--><input type="hidden" name="cardtype" value="LibraryReferenceForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card/document id" name="cardID" value="SampleReferenceCard"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:15%" title="version" name="ver" value="0.9.5"><!--\n--><input type="text" onfocus="this.select()" style="width:15%" title="document date" name="date" value="July 3, 2006"><!--\n--><input type="text" onfocus="this.select()" style="width:48%" title="author/contact" name="author" value="Eric Shulman, ELS Design Studios"><br><!--\n--><input type="text" onfocus="this.select()" style="width:80%" title="document title" name="title" value="TiddlyCards: A Structured Micro-Content &quot;Form Manager&quot; for TiddlyWiki"><!--\n--><select name="doctype" size=1 style="width:20%" title="document type"><!--\n--> <option value="document" >document type...</option><!--\n--> <option value="proposal">proposal</option><!--\n--> <option value="specification">specification</option><!--\n--> <option value="white paper">white paper</option><!--\n--> <option value="project schedule">project schedule</option><!--\n--> <option value="technical reference" selected>tech reference</option><!--\n--> <option value="user guide">user guide</option><!--\n--></select><br><!--\n--><input type="text" onfocus="this.select()" style="width:90%" title="document location (url)" name="url" value="http://www.TiddlyTools.com/#TiddlyCardsHelp"><!--\n--><input type="button" value="view" style="width:10%" onclick="window.open(this.form.url.value,'_blank')"><br><!--\n--><div style="width:100%;text-align:center"><!--\n--><input type="checkbox" name="dnd" checked> do not distribute <!--\n--><input type="checkbox" name="rfc"> review for comment <!--\n--><input type="radio" name="status" value="outline">outline <!--\n--><input type="radio" name="status" checked value="draft">draft <!--\n--><input type="radio" name="status" value="final">final <!--\n--></div><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="summary" name="summary" value="TiddlyCards are like 3x5 cards with fill-in forms... You can define custom HTML forms to create your own card types!"><br><!--\n--><textarea rows="7" onfocus="this.select()" style="width:100%" title="notes" name="notes">This is a sample card using the LibraryReferenceForm card type. When you switch between TiddlyCards' ''view'' and ''edit'' modes, the card data is displayed as either:\n* read-only TiddlyWiki-formatted content (view)\n* an HTML form definition (edit)</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="sample">\n</form></html>\n----\n__/%title%/TiddlyCards: A Structured Micro-Content &quot;Form Manager&quot; for TiddlyWiki /%title%/__\nby: /%author%/Eric Shulman, ELS Design Studios /%author%/\nlocation: /%url%/http://www.TiddlyTools.com/#TiddlyCardsHelp /%url%/\ntype/status: /%doctype%/technical reference/%doctype%/ - /%status%/draft/%status%/\nversion: /%ver%/0.9.5 /%ver%/ (/%date%/July 3, 2006 /%date%/) - /%dnd%/''pre-release... please do not distribute this document''/%dnd%//%dnd=false%//%''It's OK to share this document''%//%dnd=false%/\nsummary:\n>/%summary%/TiddlyCards are like 3x5 cards with fill-in forms... You can define custom HTML forms to create your own card types! /%summary%/\nnotes:\n>/%notes%/This is a sample card using the LibraryReferenceForm card type. When you switch between TiddlyCards' ''view'' and ''edit'' modes, the card data is displayed as either:<<br>>* read-only TiddlyWiki-formatted content (view)<<br>>* an HTML form definition (edit)/%notes%/\ntags: /%tags%/sample /%tags%/
/%\n\nUsage: <<tiddler ScrollBox with: TiddlerName height>>\n\n%/@@display:block;height:$2;overflow:auto;<<tiddler $1>>@@@@display:block;text-align:right;^^scroll for more...^^@@
/***\n''SearchOptionsPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#SearchOptionsPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nThe 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.\n\n!!!!!Usage\n<<<\nThis plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags. It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers. You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.\n<<<\n!!!!!Configuration\n<<<\nIn additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:\n<<option chkSearchTitles>> Search tiddler titles\n<<option chkSearchText>> Search tiddler text\n<<option chkSearchTags>> Search in tiddler tags\n<<option chkSearchShadows>> Search shadow tiddlers\n<<option chkSearchTitlesFirst>> Show title matches first\n<<option chkSearchList>> Show list of matching tiddlers\n<<option chkSearchIncremental>> Incremental searching\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SearchOptionsPlugin handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior. However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}}, {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}} (with suitable prompt text) to your customized tiddler.\n<<<\n!!!!!Revision History\n<<<\n''2006.04.06 [2.3.0]'' added support for "search in shadow tiddlers". Default is *not* to search in the shadows (i.e.standard TW behavior). Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.\n''2006.02.03 [2.2.1]'' rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes. note that core no longer permits "blank=all" searches, so neither does this plugin. To search for all, use "." with text patterns enabled.\n''2006.02.02 [2.2.0]'' in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars. Prevents searching on shorter text when shortened by rapid backspaces (<500msec)\n''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching\nalso, blank search text now presents "No search text. Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.\n''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank\n''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.\n''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)\ndefine results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title\n''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.\n''2006.01.17 [2.1.4]'' Use regExp.search() instead of regExp.test() to scan for matches. Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.\n''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output\n''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers. This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.\n''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()\n''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.\n''2005.12.30 [2.0.0]'' Upgraded to TW2.0\nwhen rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.\n''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags\n''2005.12.21 [1.3.7]'' use \s\s to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link. Also, added access key: "O", to trigger "open all" link.\nBased on a suggestion by UdoBorkowski.\n''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon\n''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.\n''2005.12.17 [1.3.4]'' use {/%%/{/%%/{ and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered \nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches\nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.\nBased on a suggestion by UdoBorkowski.\n''2005.12.10 [1.3.1]'' added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.\n''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).\nadded handling for Enter key so it can be used to start a search.\nBased on a suggestion by LyallPearce\n''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin\n''2005.11.25 [1.2.0]'' added chkSearchList option\nBased on a suggestion by RodneyGomes\n''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.\nBased on a suggestion by ChristianHauck\n''2005.10.18 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nBased on a suggestion by LyallPearce.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SearchTitleOrText = {major: 2, minor: 3, revision: 0, date: new Date(2006,4,6)};\n//}}}\n\n//{{{\nif (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;\nif (config.options.chkSearchText==undefined) config.options.chkSearchText=true;\nif (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;\nif (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;\nif (config.options.chkSearchList==undefined) config.options.chkSearchList=false;\nif (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;\nif (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitles>> Search in tiddler titles";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchText>> Search in tiddler text";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTags>> Search in tiddler tags";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchShadows>> Search in shadow tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitlesFirst>> Search results show title matches first";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchList>> Search results show list of matching tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchIncremental>> Incremental searching";\n//}}}\n\n//{{{\nif (config.macros.search.reportTitle==undefined)\n config.macros.search.reportTitle="SearchResults";\n//}}}\n\n//{{{\nconfig.macros.search.handler = function(place,macroName,params)\n{\n var lastSearchText = "";\n var searchTimeout = null;\n var doSearch = function(txt)\n {\n if (txt.value.length>0)\n {\n story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);\n lastSearchText = txt.value;\n }\n };\n var clickHandler = function(e)\n {\n doSearch(this.nextSibling);\n return false;\n };\n var keyHandler = function(e)\n {\n if (!e) var e = window.event;\n switch(e.keyCode)\n {\n case 13: // ELS: handle enter key\n doSearch(this);\n break;\n case 27:\n this.value = "";\n clearMessage();\n break;\n }\n if (config.options.chkSearchIncremental)\n {\n if(this.value.length > 2)\n {\n if(this.value != lastSearchText)\n {\n if(searchTimeout) clearTimeout(searchTimeout);\n var txt = this;\n searchTimeout = setTimeout(function() {doSearch(txt);},500);\n }\n }\n else\n if(searchTimeout) clearTimeout(searchTimeout);\n }\n };\n var focusHandler = function(e)\n {\n this.select();\n };\n var btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);\n var txt = createTiddlyElement(place,"input",null,null,null);\n if(params[0])\n txt.value = params[0];\n txt.onkeyup = keyHandler;\n txt.onfocus = focusHandler;\n txt.setAttribute("size",this.sizeTextbox);\n txt.setAttribute("accessKey",this.accessKey);\n txt.setAttribute("autocomplete","off");\n if(config.browser.isSafari)\n {\n txt.setAttribute("type","search");\n txt.setAttribute("results","5");\n }\n else\n txt.setAttribute("type","text");\n}\n//}}}\n\n//{{{\nStory.prototype.search = function(text,useCaseSensitive,useRegExp)\n{\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack,"title","excludeSearch");\n var q = useRegExp ? "/" : "'";\n clearMessage();\n if (!matches.length) {\n if (config.options.chkSearchList) discardSearchResults();\n displayMessage(config.macros.search.failureMsg.format([q+text+q]));\n } else {\n if (config.options.chkSearchList) \n reportSearchResults(text,matches);\n else {\n var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);\n this.closeAllTiddlers(); story.displayTiddlers(null,titles);\n displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));\n }\n }\n highlightHack = null;\n}\n//}}}\n\n//{{{\nTiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)\n{\n var candidates = this.reverseLookup("tags",excludeTag,false,sortField);\n\n // scan for matching titles\n var title_results = [];\n if (config.options.chkSearchTitles) {\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].title.search(searchRegExp)!=-1)\n title_results.push(candidates[t]);\n if (config.options.chkSearchShadows)\n for (var t in config.shadowTiddlers)\n if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))\n title_results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));\n }\n\n // scan for matching text\n var text_results = [];\n if (config.options.chkSearchText) {\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].text.search(searchRegExp)!=-1)\n text_results.push(candidates[t]);\n if (config.options.chkSearchShadows)\n for (var t in config.shadowTiddlers)\n if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))\n text_results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));\n }\n\n // scan for matching tags\n var tag_results = [];\n if (config.options.chkSearchTags)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].tags.join(" ").search(searchRegExp)!=-1)\n tag_results.push(candidates[t]);\n\n // merge the results, eliminating redundant matches\n var results = [];\n for(var t=0; t<title_results.length; t++) results.pushUnique(title_results[t]);\n for(var t=0; t<text_results.length; t++) results.pushUnique(text_results[t]);\n for(var t=0; t<tag_results.length; t++) results.pushUnique(tag_results[t]);\n\n // if not 'titles first', re-sort results to so titles, text and tag matches are mixed together\n if(!sortField) sortField = "title";\n var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }\n if (!config.options.chkSearchTitlesFirst) results.sort(bySortField);\n return results;\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nif (!window.reportSearchResults) window.reportSearchResults=function(text,matches)\n{\n var title=config.macros.search.reportTitle\n var q = config.options.chkRegExpSearch ? "/" : "'";\n var body="\sn";\n\n // summary: nn tiddlers found matching '...', options used\n body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\sn";\n body+="^^//searched in:// ";\n body+=(config.options.chkSearchTitles?"''titles'' ":"");\n body+=(config.options.chkSearchText?"''text'' ":"");\n body+=(config.options.chkSearchTags?"''tags'' ":"");\n body+=(config.options.chkSearchShadows?"''shadows'' ":"");\n if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {\n body+=" //with options:// ";\n body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");\n body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");\n }\n body+="^^";\n\n // numbered list of links to matching tiddlers\n body+="\sn<<<";\n for(var t=0;t<matches.length;t++) body+="\sn# [["+matches[t].title+"]]";\n body+="\sn<<<\sn";\n\n // open all matches button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.displayTiddlers(null,["\n for(var t=0;t<matches.length;t++)\n body+="'"+matches[t].title.replace(/\s'/mg,"\s\s'")+"'"+((t<matches.length-1)?", ":"");\n body+="],1);\s" ";\n body+="accesskey=\s"O\s" ";\n body+="value=\s"open all matching tiddlers\s"></html> ";\n\n // discard search results button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"');\s" ";\n body+="value=\s"discard "+title+"\s"></html>";\n\n // search again\n body+="\sn\sn----\sn";\n body+="<<search \s""+text+"\s">> ";\n body+="<<option chkSearchTitles>>titles ";\n body+="<<option chkSearchText>>text ";\n body+="<<option chkSearchTags>>tags";\n body+="<<option chkSearchShadows>>shadows";\n body+="<<option chkCaseSensitiveSearch>>case-sensitive ";\n body+="<<option chkRegExpSearch>>text patterns";\n\n // create/update the tiddler\n var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();\n tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");\n store.addTiddler(tiddler); story.closeTiddler(title);\n\n // use alternate "search again" label in <<search>> macro\n var oldprompt=config.macros.search.label;\n config.macros.search.label="search again";\n\n // render tiddler\n story.displayTiddler(null,title,1); // force refresh\n\n // restore standard search label\n config.macros.search.label=oldprompt;\n\n}\n\nif (!window.discardSearchResults) window.discardSearchResults=function()\n{\n // remove the tiddler\n story.closeTiddler(config.macros.search.reportTitle);\n store.deleteTiddler(config.macros.search.reportTitle);\n}\n//}}}\n\n\n
/***\n''Select Stylesheet Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#SelectStylesheetPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nSelect alternative TiddlyWiki CSS stylesheet 'themes' from a list of tiddlers tagged with "stylesheets".\n\n!!!!!Usage\n<<<\nThis plugin defines a macro that creates a stylesheet link or selection listbox/droplist that can be added to the content of any tiddler (such as the OptionsPanel or MainMenu tiddlers).\n\nFirst, create (or import) a custom style sheet tiddler (i.e, a tiddler containing CSS definitions) and tag it with <<tag stylesheets>> so it can be included in the selection list. Then, add the {{{<<selectStylesheet>>}}} macro to the desired tiddler to display the stylesheet list. (note: to create a link to apply a specific stylesheet, include the stylesheet tiddlername as a parameter. See below for more details).\n\nSelect your desired stylesheet from the droplist:\n** ''[system]'' uses the built-in CSS definitions\n** ''[default]'' uses "StyleSheet" tiddler (if present)\n** //tiddlername// uses any named stylesheet\nThe currently selected stylesheet is indicated by a '>' symbol.\n\n//Note: If a selected stylesheet tiddler no longer exists (i.e, the tiddler was deleted or renamed after it had been selected for use), the [default] CSS tiddler ("StyleSheet") will be used as a fallback. If this tiddler does not exist either, then the built-in CSS definitions are used.//\n<<<\n!!!!!Parameters\n<<<\nThe selectStylesheet macro accepts parameters to control various features and functions. //Note: while each parameter is optional and may be omitted from the macro, the parameters (when present) must appear in the order shown below.//\n* ''size:nnn''\nDetermines the number of lines to display in the stylesheet list. If this parameter is omitted or "size:1" is specified, a single-line droplist is created. When a size > 1 is provided, a standard, fixed-size scrollable listbox is created. You can use "size:0" or "size:auto" to display a varible-height listbox that automatically adjusts to fit the current list contents without scrolling.\n* ''width:nnn[cm|px|em|%]''\nControls the width of the stylesheet list. Overrides the built-in CSS width declaration (=100%). Use standard CSS width units (cm=centimeters, px=pixels, em=M-space, %=proportional to containing area). You can also use a ".selectStylesheet" custom CSS class definition to override the built-in CSS declarations for the stylesheet list.\n* ''label:text'' and ''prompt:text''\nwhen used in conjunction with a specific named stylesheet to create a stylesheet link (see //tiddlername// param, below), these two parameters define the link text the 'tooltip' text that appears near the mouse pointer when placed over the link, respectively.\n* ''//tiddlername//''\nIf you include a stylesheet //tiddlername// parameter in the macro (e.g., {{{<<selectStylesheet [[Woodshop]]>>}}} then a link will be created instead of a listbox/droplist. Selecting this link applies the specified stylesheet. You may use the special keywords ''[system]'' to use the built-in CSS definitions, or ''[none]'' to bypass all stylesheet tiddlers (sometimes useful during CSS debugging).\n\n<<<\n!!!!!Nested Stylesheets\n<<<\nThe CSS definitions for TiddlyWiki are fairly substantial, and stylesheet tiddlers can include hundreds of lines of CSS statements. Often, these stylesheets will use the exact same CSS for the bulk of their definitions plus several changes or additions to create a difference in appearance. This results in lots of duplicated CSS definitions that can become difficult to keep 'in sync' with each other.\n\nTo make this problem much easier to manage, you can move the common CSS definitions into separate stylesheet tiddlers. Then, embed {{{[[tiddlertitle]]}}} references in the original stylesheet tiddlers to re-combine the CSS definitions into a single stylesheet 'theme' to be applied.\n\nWith some clever division of CSS into separate tiddlers, you can quite easily construct dozens of stylesheet combinations. You can also mark the common CSS tiddlers with tags and use them as overlay stylesheets so you can mix-and-match their styles to create even more 'on-the-fly' stylesheet combinations.\n\nNote: Normally, when rendering tiddler content for display, the {{{[[tiddlertitle]]}}} syntax means "insert a link to this tiddler". However, when applying stylesheets, this syntax means "insert the content of this tiddler"\n<<<\n!!!!!Changing templates or invoking custom javascript from a stylesheet\n<<<\nIn addition to CSS definitions, some TiddlyWiki look-and-feel designs also make adjustments to the TiddlyWiki document structure so that certain document features can be moved, hidden, or otherwise redefined. The default set of templates that control the document structure are called PageTemplate, ViewTemplate, and EditTemplate. To select an alternative set of templates, you can include the special psuedo-macro ''{{{<<template prefix>>}}}'' in your stylesheet. This adds the indicated prefix to the standard template names, and automatically switches to using those templates whenever the stylesheet is selected and applied.\n\nWhenever a document is being viewed in read-only mode (i.e., via http: protocol), an implied template prefix of "Web" is also used, and is inserted between any custom template prefix and the standard template name. For example, ''{{{<<template Custom>>}}}'' will use {{{CustomWebViewTemplate}}} when the document is in read-only mode. You can specify an alternative for this implied prefix by including a second prefix parameter in the pseudo-macro. For example, ''{{{<<template Custom ReadOnly>>}}}'' will use {{{CustomReadOnlyViewTemplate}}}. Note: if a template tiddler with the indicated combination of custom and read-only prefixes is not available, a suitable fallback template is chosen, first by omitting the custom prefix, then by omitting the read-only prefix, and finally by omitting both, and reverting to the appropriate default template.\n\nIn addition to selecting alternative templates, a stylesheet can also include the psuedo-macro ''{{{<<init tiddlertitle>>}}}'' to execute custom javascript that can access TiddlyWiki internal data and 'core' functions or perform direct manipulation of the currently-rendered DOM elements of the document. First, place the desired javascript code into one or more tiddlers (note: //although these tiddlers will contain javascript, ''do NOT tag them as 'systemConfig', since this will cause the javascript to be executed every time TW starts'', rather than only when a specific stylesheet has been selected//). Then, add the ''{{{<<init tiddlertitle>>}}}'' pseudo-macro to your stylesheet so the javascript will be executed when that specific stylesheet is selected and applied.\n\nOf course, when another stylesheet is subsequently selected, other custom javascript functions may be needed to reset whatever TW internal data changes or DOM manipulations were performed by any {{{<<init>>}}} scripts. You can define tiddlers containing these ''reset'' scripts by embedding ''{{{<<reset tiddlertitle>>}}}'' in your stylesheet definition. Unlike {{{<<init>>}}} scripts, any tiddlers declared in this way will NOT be executed when the stylesheet is applied, but will be remembered and automatically executed before applying another stylesheet.\n\nNote: These special-purpose psuedo-macros are only executed when the stylesheet containing them is actually in use. When these macros are rendered as part of the tiddler content (such as when //viewing// a stylesheet definition), the macros simply report their values without performing any actions.\n<<<\n!!!!!Examples\n<<<\nsingle auto-sized listbox\n{{{<<selectStylesheet size:auto width:60%>>}}}\n<<selectStylesheet size:auto width:60%>>\n\ndroplist for stylesheets\n{{{<<selectStylesheet size:1 width:30%>>}}}\n<<selectStylesheet size:1 width:30%>>\n\ninline links to set specific stylesheets\n{{{<<selectStylesheet Woodshop>> or <<selectStylesheet [[Edge of Night]]>> or <<selectStylesheet [default]>> or <<selectStylesheet [none]>> or <<selectStylesheet label:TiddlyWiki "prompt:The standard TW stylesheet" [system]>>\n}}}\n<<selectStylesheet Woodshop>> or <<selectStylesheet [[Edge of Night]]>> or <<selectStylesheet [default]>> or <<selectStylesheet [none]>> or <<selectStylesheet label:TiddlyWiki "prompt:The standard TW stylesheet" [system]>>\n\nstylesheet definitions (tagged with "stylesheets"):\n<<tag stylesheets>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SelectStylesheetPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SelectStylesheethandling^^\n\ncreate/edit ''OptionsPanel'':\nAdd "{{{<<selectStylesheet [size:nnn|auto] [width:nnn[cm|px|em|%]>>}}}" macro.\n<<<\n!!!!!Revision History\n<<<\n''2006.06.28 [4.2.6]'' added 'nocookie' param to set(), so "style:xyz" param can **temporarily** override stylesheet (by NOT overwriting the cookie value)\n''2006.05.18 [4.2.5]'' revert to 'onchange' handling, BUT... don't *reload* the list contents each time selection changes (just move the ">" indicator to the current item instead), AND... track onkeydown/up to avoid FF crash due to excess calls to set() when scrolling a listbox by holding down arrow keys.\n''2006.05.15 [4.2.4]'' switch from 'onchange' listbox handling to 'onclick' and 'onkeyup'. Avoids FF **CRASH** due to stylesheets being excessively refreshed *during* onchange due to keyboard event handling.\n''2006.04.21 [4.2.3]'' recognize "stylesheet" tag when building list of available stylesheets (in addition to plural, "stylesheets")\n''2006.04.05 [4.2.2]'' in applyStylesheet(), reverted change from 4.2.0: *don't* apply "StyleSheetColors" and "StyleSheetLayout" along with selected stylesheet, so custom stylesheet can completely bypass the default formatting. To include default formatting in a stylesheet, embed "[[StyleSheetColors]] [[StyleSheetLayout]]" \n''2006.03.30 [4.2.1]'' in applyStylesheet(), change calls from "window.eval()" to just "eval()" to avoid FF1501 'global variable crash' problem \n''2006.03.30 [4.2.0]'' remove [none] choice from listbox. Added handling for <<selectStylesheet sheetname>> to create a link that applies the specified sheet instead of presenting a listbox of available sheets. added "style:" paramifier. Apply "StyleSheetColors" and "StyleSheetLayout" along with selected stylesheet (i.e., overlay selected sheet on top of shadow styles instead of replacing default shadow styles). Based on suggestions from Clint Checketts.\n''2006.03.09 [4.1.4]'' in refreshSelectStylesheet(), make sure that tiddler named in stylesheet cookie value still exists before attempting to select it in the listbox.\n''2006.02.25 [4.1.3]'' Problem: the ">" indicator was not always being refreshed, due to event "timing" issues. refreshSelectStylesheet() deferred for 10msec so it will execute *after* onChangeSelectStylesheet event processing has completed.\n''2006.02.24 [4.1.2]'' Problem: {{{<<template>>}}} macro was not being processed in IE.\nCause: regexp processing creates browser-internal "private globals" used to keep track of the regexp parser's state, including the current 'scan' position within the source string. This lets you use search() and exec() inside loops to scan for successive pattern matches. In applyStyleSheet(), "theCSS.search(templateRegExp)" was called before "theCSS.exec(templateRegExp)". As a result, the regexp parser had already matched the {{{<<template>>}}} macro embedded in the CSS and thus did not actually process the macro and switch the templates.\nFix: use {{{indexOf("<<template")}}} instead of search(templateRegExp) to check for presence of template switching macro in CSS.\n''2006.02.23 [4.1.1]'' performance fixes: in switchTemplates(), added default init of 'altTemplate' value to prevent unneeded triggering of refreshPageTemplate() during TW load-time when using standard templates. Saves LOTS of startup time and avoids the dreaded "script is running slowly" FireFox warnings.\nAlso, the forEachTiddler() call to force a "refresh all tiddlers" (needed when view/edit templates are changed) was moved from applyPageTemplate() and is now called directly from switchTemplates(). This eliminates redundant re-rendering of tiddlers while the page template is being refreshed.\n''2006.02.21 [4.1.0]'' added {{{<<template>>}}} pseudo-macro with new switchTemplate() function. Allows stylsheets to switch page/view/edit templates by adding a prefix to standard template names. Detects readOnly mode and automatically adds "Web" to template name (e.g. "MyWebViewTemplate"). Defines "Web" shadow templates and "viewSource" toolbar command.\n''2006.02.21 [4.0.3]'' added real macro handlers for psuedo-macros "init", "reset" so they will display in the stylesheet tiddler without appearing as an error.\n''2006.01.20 [4.0.2]'' add 'var' to unintended global variable declarations and wrapped notification hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2006.01.20 [4.0.1]'' Added optional "init" keyword for {{{<<init tiddlertitle>>}}} psuedo-macro syntax (note: previous {{{<<tiddlertitle>>}}} syntax still permitted)\nRevised documentation to better describe use of init/reset for custom code invokation.\n''2005.11.05 [4.0.0]'' Entire plugin simplified in response to new "shadow stylesheet" architecture introduced in TW1.2.37. Concept of separate overlays has been removed. Stylesheet themes are assembled using [[tiddler]] 'nesting' syntax, and tagged as 'stylesheet'. A single listbox/droplist is provided to select themes.\n''2005.10.25 [3.1.0]'' added support for embedding {{{<<reset tiddlertitle>>}}} companion code (to declare 'DOM cleanup' routines invoked when a stylesheet is UNloaded)\n//Based on a request from ClintChecketts//\n''2005.10.09 [3.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [3.0.0]'' Another major re-write. Replaced separate "selectOverlays" macro definition with 'overlays' parameter on 'selectStylesheet' macro. Added support for embedding {{{<<tiddlertitle>>}}} companion code. applyStylesheets() completely re-designed to address quirks with loading and combining multiple stylesheets using browser-specific native handling, as well as add support for executing companion code. Stylesheets+overlays+code are now handled in a platform-neutral manner that avoids differences between browser implementations and uses much less overhead in the DOM.\n''2005.08.07 [2.0.0]'' Major re-write to not use static ID values for listbox controls, so that multiple macro instances can exist without corrupting each other or the DOM. Moved HTML and CSS definitions into plugin code instead of using separate tiddlers. Added new features: support for multiple groups of overlay stylesheets with collapsible tree display. Added size and width params for listbox display.\n''2005.07.27 [1.0.3]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.25 [1.0.2]'' correct 'fallback' handling in selectStyleSheet()\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]. Thanks to David Jaquith for testing and bug reports and SteveRumsby for feature suggestions.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.selectStylesheet = {major: 4, minor: 2, revision: 6, date: new Date(2006,6,28)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.refreshSelectStylesheet=refreshSelectStylesheet;\nwindow.applyStylesheets=applyStylesheets;\n\nif (!config.options.txtStyleSheet) config.options.txtStyleSheet="StyleSheet";\n//}}}\n\n//{{{\n// define macro rendering handler\nconfig.macros.selectStylesheet = { };\nconfig.macros.selectStylesheet.reset = [];\nconfig.macros.selectStylesheet.handler = function(place,macroName,params) {\n setStylesheet(".selectStylesheet {width:100%;font-size:8pt;margin:0em}","selectStylesheetPlugin");\n var autosize=1;\n if (params[0] && (params[0]=="size:auto"))\n { autosize=0; params.shift(); }\n if (params[0] && (params[0].substr(0,5)=="size:"))\n autosize=(params.shift()).substr(5);\n if (params[0] && (params[0].substr(0,6)=="width:"))\n var width=(params.shift()).substr(6);\n if (params[0] && (params[0].substr(0,6)=="label:"))\n var label=(params.shift()).substr(6);\n if (params[0] && (params[0].substr(0,7)=="prompt:"))\n var prompt=(params.shift()).substr(7);\n if (params[0] && params[0].trim().length) // create a link that sets a specific stylesheet\n createTiddlyButton(place,label?label:params[0],prompt?prompt:params[0], function(){config.macros.selectStylesheet.set(params[0]); return false;});\n else { // create a select list of available stylesheets\n var theList=createTiddlyElement(place,"select",null,"selectStylesheet",null);\n theList.onkeydown=function() // track keystrokes for listbox only\n { if (this.size>1 && !this.keydown) { this.keydown=true; this.previousIndex=this.selectedIndex; } return true; };\n theList.onkeyup=function()\n { if (this.keydown) { this.keydown=false; if (this.selectedIndex!=this.previousIndex) config.macros.selectStylesheet.set(this.value); } return true; };\n theList.onchange=function()\n { if (!this.keydown) config.macros.selectStylesheet.set(this.value); return true; };\n theList.size=1;\n theList.autosize=autosize;\n if (width) theList.style.width=width;\n store.addNotification(null,refreshSelectStylesheet);\n refreshSelectStylesheet();\n }\n}\nconfig.macros.selectStylesheet.set = function(theSheet,nocookie) {\n if (!theSheet || !theSheet.trim().length) return;\n var allStyleLists=getElementsByClass("selectStylesheet");\n for (var k=0; k<allStyleLists.length; k++) {\n var theList=allStyleLists[k];\n for (var t=0; t<theList.options.length; t++) {\n if (theList.options[t].text.substr(0,1)==">")\n theList.options[t].text=String.fromCharCode(160)+String.fromCharCode(160)+theList.options[t].text.substr(1);\n if ((theList.options[t].value==theSheet) || (theSheet=="[default]" && theList.options[t].value=="StyleSheet"))\n { theList.options[t].text=">"+theList.options[t].text.substr(2); theList.selectedIndex=t; }\n }\n }\n config.options.txtStyleSheet=theSheet;\n if (!nocookie) saveOptionCookie("txtStyleSheet");\n applyStylesheets();\n return;\n}\nif (config.paramifiers) config.paramifiers.style = { onstart: function(theSheet) { config.macros.selectStylesheet.set(theSheet,true); } };\n\n// set to TRUE to enable debugging status messages when stylesheets are applied\nconfig.macros.selectStylesheet.verbose = false;\n\n// hijack existing notifications for refreshStyles() handler\ninitSelectStylesheetNotification();\nfunction initSelectStylesheetNotification() {\n for (var i=0; i<store.namedNotifications.length; i++)\n if (store.namedNotifications[i].notify==window.refreshStyles)\n store.namedNotifications[i].notify=applyStylesheets;\n}\n\n// hijack refreshStyles() handler\nwindow.refreshStyles=applyStylesheets;\n\nfunction getElementsByClass(classname)\n{\n var arr=new Array();\n var count=0;\n var all=document.all? document.all : document.getElementsByTagName("*");\n for (var i=0; i<all.length; i++)\n if (all[i].className==classname)\n arr[count++]=all[i];\n return arr;\n}\n\nfunction refreshSelectStylesheet()\n{\n var indent = String.fromCharCode(160)+String.fromCharCode(160)+String.fromCharCode(160);\n // for all instances of the selectStylesheet control\n var allStyleLists=getElementsByClass("selectStylesheet");\n for (var k=0; k<allStyleLists.length; k++) {\n var theList=allStyleLists[k];\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n theList.selectedIndex=-1;\n // fill the stylesheet list\n var count=0;\n // prompt text\n theList.options[count++] = new Option("select a stylesheet:","",false,false);\n// DISABLED // option: none (built-in hard-coded CSS only)\n// DISABLED theList.options[count++] = new Option(indent+"[none]","[none]",false,false);\n // option: default (built-in plus shadow stylesheets)\n theList.options[count++] = new Option(indent+"[system]","[system]",false,false);\n // option: StyleSheet tiddler, if present\n if (store.getTiddler("StyleSheet")!=undefined)\n theList.options[count++] = new Option(indent+"[default]","StyleSheet",false,false);\n // options: CSS tiddlers tagged with "stylesheets" or "stylesheet"\n var theSheets=store.getTaggedTiddlers("stylesheets").concat(store.getTaggedTiddlers("stylesheet"));\n for (var i=0; i<theSheets.length; i++) {\n var theTitle=theSheets[i].title;\n if (theTitle=="StyleSheet") continue;\n theList.options[count++] = new Option(indent+theTitle,theTitle,false,false);\n }\n // make sure the requested stylesheet exists, fallback if not...\n var theSheet=config.options.txtStyleSheet;\n if (theSheet!="[none]" && theSheet!="[system]" && !store.getTiddler(theSheet)) theSheet="StyleSheet";\n if (!store.getTiddler(theSheet)) theSheet="[system]";\n // set the listbox selection to current stylesheet\n theList.selectedIndex=0; // default to first item\n for (var t=0; t<theList.options.length; t++) \n if (theList.options[t].value==theSheet)\n { theList.selectedIndex=t; break; }\n theList.options[t].text=">"+theList.options[t].text.substr(2);\n // autosize as appropriate\n theList.size=(theList.autosize<1)?theList.options.length:theList.autosize;\n } // end of "for all instances"\n}\n//}}}\n\n//{{{\nconfig.macros.selectStylesheet.templates = { };\nfunction switchTemplates(which,readOnlyPrefix)\n{\n // remember original templates (init only)\n if (!config.macros.selectStylesheet.templates.originalpage)\n config.macros.selectStylesheet.templates.originalpage = "PageTemplate";\n if (!config.macros.selectStylesheet.templates.originalview)\n config.macros.selectStylesheet.templates.originalview = config.tiddlerTemplates[1];\n if (!config.macros.selectStylesheet.templates.originaledit)\n config.macros.selectStylesheet.templates.originaledit = config.tiddlerTemplates[2];\n if (!config.macros.selectStylesheet.altTemplate)\n config.macros.selectStylesheet.altTemplate="";\n\n // define shorthand variables just for code readability \n var page=config.macros.selectStylesheet.templates.originalpage;\n var view=config.macros.selectStylesheet.templates.originalview;\n var edit=config.macros.selectStylesheet.templates.originaledit;\n\n // get 'readOnly' mode... set by TW core, but not until after the plugin is loaded, so we need to do this here as well...\n var loc = document.location.href;\n if (readOnly==undefined)\n var readOnly = (loc.substr(0,4) == "http" || loc.substr(0,3) == "ftp") ? config.options.chkHttpReadOnly : false;\n\n // get prefix defaults\n if (!which) var which="";\n if (!readOnlyPrefix) var readOnlyPrefix = "Web";\n if (!readOnly) readOnlyPrefix="";\n var alt = which+readOnlyPrefix;\n\n var msg="current template prefix: '%0', requested template prefix '%1'";\n if (config.macros.selectStylesheet.verbose) alert(msg.format([config.macros.selectStylesheet.altTemplate,alt]));\n\n // only switch if really changing templates\n if (alt == config.macros.selectStylesheet.altTemplate) return;\n\n // remember which templates are being used\n config.macros.selectStylesheet.altTemplate = alt;\n\n // set page template, with fallbacks for missing combinations\n var pageTemplate=alt+page;\n if (!store.getTiddlerText(pageTemplate)) pageTemplate=which+page;\n if (!store.getTiddlerText(pageTemplate)) pageTemplate=readOnlyPrefix+page;\n if (!store.getTiddlerText(pageTemplate)) pageTemplate=page;\n config.macros.selectStylesheet.templates.currentpage = pageTemplate;\n\n // set view template, with fallbacks for missing combinations\n var viewTemplate=alt+view;\n if (!store.getTiddlerText(viewTemplate)) viewTemplate=which+view;\n if (!store.getTiddlerText(viewTemplate)) viewTemplate=readOnlyPrefix+view;\n if (!store.getTiddlerText(viewTemplate)) viewTemplate=view;\n config.tiddlerTemplates[1] = config.macros.selectStylesheet.templates.currentview = viewTemplate;\n\n // set edit template, with fallbacks for missing combinations\n var editTemplate=alt+edit;\n if (!store.getTiddlerText(editTemplate)) editTemplate=which+edit;\n if (!store.getTiddlerText(editTemplate)) editTemplate=readOnlyPrefix+edit;\n if (!store.getTiddlerText(editTemplate)) editTemplate=edit;\n config.tiddlerTemplates[2] = config.macros.selectStylesheet.templates.currentedit = editTemplate;\n\n var msg="switching to templates: %0, %1, %2";\n if (config.macros.selectStylesheet.verbose) alert(msg.format([pageTemplate,viewTemplate,editTemplate]));\n\n // apply page template\n window.applyPageTemplate();\n // apply view/edit templates\n story.forEachTiddler(function(title,element) { this.refreshTiddler(title,null,true);});\n\n}\n// Hijack the applyPageTemplate so the alternate page template (if any) will refresh correctly\nconfig.macros.selectStylesheet.coreApplyPageTemplate = window.applyPageTemplate;\nwindow.applyPageTemplate = function(template)\n{\n var cw=document.getElementById("contentWrapper");\n cw.style.display="none";\n config.macros.selectStylesheet.coreApplyPageTemplate(config.macros.selectStylesheet.templates.currentpage);\n cw.style.display="block";\n}\n//}}}\n\n//{{{\nfunction applyStylesheets()\n{\n // define pattern to match executable <<tiddlername>> references embedded in CSS text\n var setTiddlerRegExp = new RegExp("(?:<<(?:init )([^>]+)>>)","mg");\n var resetTiddlerRegExp = new RegExp("(?:<<reset ([^>]+)>>)","mg");\n var templateRegExp = new RegExp("(?:<<template ([^\ss>]+)( [^>]+)?>>)","mg");\n\n // make sure the requested stylesheet exists, fallback if not...\n var theSheet=config.options.txtStyleSheet;\n switch (theSheet) {\n case "[none]":\n case "[system]":\n break;\n default:\n if (!store.getTiddler(theSheet)) theSheet="StyleSheet";\n if (!store.getTiddler(theSheet)) theSheet="[system]";\n break;\n }\n\n // When store.NotifyAll() is invoked, it can trigger multiple calls to applyStylesheets(),\n // even though only one is needed to set the styles and render things properly. The extra calls\n // add unnecessary processing overhead by performing multiple re-rendering of entire TW display,\n // often resulting in "slow script" warnings. To avoid this, we can track the last stylesheet that\n // was applied and only apply the current requested sheet if it is really a different sheet, OR\n // if the TW contents have actually changed (which might include changes to the current stylesheet)\n if (theSheet==config.macros.selectStylesheet.current && !store.dirty) return;\n config.macros.selectStylesheet.current=theSheet;\n\n // get the primary stylesheet CSS\n var msg="stylesheet: '%0'";\n if (config.macros.selectStylesheet.verbose) alert(msg.format([theSheet]));\n var theCSS = (theSheet.substr(0,1)=='[')?"":store.getRecursiveTiddlerText(theSheet,"");\n if (theSheet.substr(0,1)!='[') store.addNotification(theSheet,refreshStyles);\n\n // if <<template>> reference is not specified, reset to standard template\n if (theCSS.indexOf("<<template")==-1) switchTemplates();\n\n // execute any embedded <<template>> references\n do {\n var match = templateRegExp.exec(theCSS);\n if(match && match[1]) switchTemplates(match[1],match[2]);\n } while(match);\n // filter out embedded <<template>> references\n theCSS = theCSS.replace(templateRegExp,"");\n\n // execute any saved stylesheet 'reset' code tiddlers\n while (config.macros.selectStylesheet.reset.length) {\n var tiddler=config.macros.selectStylesheet.reset.shift();\n var msg="stylesheet reset macro: '%0'";\n if (config.macros.selectStylesheet.verbose) alert(msg.format([tiddler]));\n var msg="error in '%0': %1";\n try { eval(store.getTiddlerText(tiddler)); }\n catch(e) { displayMessage(msg.format([tiddler,e.toString()])); }\n }\n\n // save embedded <<reset tiddlername>> references\n do {\n var match = resetTiddlerRegExp.exec(theCSS);\n if(match && match[1])\n config.macros.selectStylesheet.reset.push(match[1]);\n } while(match);\n // filter out embedded <<reset tiddlername>> references\n theCSS = theCSS.replace(resetTiddlerRegExp,"");\n\n // execute any embedded <<init tiddlername>> references\n do {\n var match = setTiddlerRegExp.exec(theCSS);\n if(match && match[1]) {\n var msg="stylesheet macro: '%0'";\n if (config.macros.selectStylesheet.verbose) alert(msg.format([match[1]]));\n var msg="error in '%0': %1";\n try { eval(store.getTiddlerText(match[1])); }\n catch(e) { displayMessage(msg.format([match[1],e.toString()])); }\n }\n } while(match);\n // filter out embedded <<set tiddlername>> references\n theCSS = theCSS.replace(setTiddlerRegExp,"");\n\n // finally, apply the styles\n switch (theSheet) {\n case "[none]": // no styles\n setStylesheet("","StyleSheetColors");\n setStylesheet("","StyleSheetLayout");\n setStylesheet("","StyleSheet");\n break;\n case "[system]": // default styles only\n setStylesheet(store.getTiddlerText("StyleSheetColors"),"StyleSheetColors");\n setStylesheet(store.getTiddlerText("StyleSheetLayout"),"StyleSheetLayout");\n setStylesheet("","StyleSheet");\n break;\n default: // alternative stylesheet *replaces* default styles\n setStylesheet("/* overridden by [["+theSheet+"]] */","StyleSheetColors");\n setStylesheet("/* overridden by [["+theSheet+"]] */","StyleSheetLayout");\n setStylesheet(theCSS,"StyleSheet");\n break;\n }\n}\n\nconfig.macros.init = { };\nconfig.macros.init.handler = function(place,macroName,params)\n { var out="init: [[%0]]"; wikify(out.format(params),place); }\nconfig.macros.reset = { };\nconfig.macros.reset.handler = function(place,macroName,params)\n { var out="reset: [[%0]]"; wikify(out.format(params),place); }\nconfig.macros.template = { };\nconfig.macros.template.handler = function(place,macroName,params)\n { var out="use template prefix: ''%0 %1''"; wikify(out.format(params),place); }\n\n//}}}
<script label="username">\n var msg="Please enter a new username";\n var who=config.options.txtUserName;\n var who=prompt(msg,who);\n if (!who||!who.trim().length) return;\n config.options.txtUserName=who;\n saveOptionCookie("txtUserName");\n var tid=story.findContainingTiddler(place);\n if (tid) story.refreshTiddler(tid.getAttribute("tiddler"),null,true); // sync containing tiddler\n var nodes = document.getElementsByTagName("input");\n for(var t=0; t<nodes.length; t++) // sync any input fields that show username\n if(nodes[t].getAttribute("option")=="txtUserName") nodes[t].value=who;\n</script><script>\n var who=config.options.txtUserName;\n if (who=="YourName") \n { displayMessage("Please set your username"); setTimeout("clearMessage()",10000); }\n place.lastChild.title="click to change your username";\n place.lastChild.innerHTML=who;\n</script>
<script>\n\n var sliderWidth="18em"; // ADJUST AS DESIRED\n\n var here=story.findContainingTiddler(place);\n var tiddlers=store.getTiddlers("title","excludeLists");\n var basics=""; var editing=""; var authoring=""; var addons="";\n var others=""; var inlines=""; var attachments=""; var styles="";\n for (var i=0; i<tiddlers.length; i++) {\n if (tiddlers[i].tags.contains("systemConfig")) {\n if (tiddlers[i].tags.contains("basic")) basics+="[[%0]]\sn".format([tiddlers[i].title])\n else if (tiddlers[i].tags.contains("editing")) editing+="[[%0]]\sn".format([tiddlers[i].title])\n else if (tiddlers[i].tags.contains("authoring")) authoring+="[[%0]]\sn".format([tiddlers[i].title])\n else if (tiddlers[i].tags.contains("addon")) addons+="[[%0]]\sn".format([tiddlers[i].title])\n else others+="[[%0]]\sn".format([tiddlers[i].title])\n }\n if (tiddlers[i].tags.contains("inline")) inlines+="[[%0]]\sn".format([tiddlers[i].title])\n if (tiddlers[i].tags.containsAny(["stylesheets","template","css"])) styles+="[[%0]]\sn".format([tiddlers[i].title])\n if (tiddlers[i].tags.contains("attachment")) attachments+="[[%0]]\sn".format([tiddlers[i].title])\n }\n var pre="@@display:block;+++";\n var box="{{groupbox{@@display:block;width:"+sliderWidth+";";\n box+="{{floatright{<<tiddler CloseSlider>>}}}"; // add 'close' link\n var post="@@}}}===@@";\n var out="";\n if (basics.length) out+=pre+"[essentials]"+box+basics+post;\n if (editing.length) out+=pre+"[editing tools]"+box+editing+post;\n if (authoring.length) out+=pre+"[content extensions]"+box+authoring+post;\n if (addons.length) out+=pre+"[addon features]"+box+addons+post;\n if (others.length) out+=pre+"[other plugins]"+box+others+post;\n if (inlines.length) out+=pre+"[inline scripts]"+box+inlines+post;\n if (styles.length) out+=pre+"[themes/templates]"+box+styles+post;\n if (attachments.length) out+=pre+"[attachments]"+box+attachments+post;\n return out;\n</script>
{{smallform{<html><form style="display:inline;margin:0;padding:0"><select style="width:99%" name="list"\n onchange="this.form.val.value=this.value.length?config.options[this.value]:'';"><!--\n--></select>\n<input type="text" style="width:98%;margin:0;" name="val" title="enter an option value">\n<input type="button" style="width:33%;margin:0;" value="get" title="refresh list"\n onclick="window.setCookieEditorList(this.form.list);"><!--\n--><input type="button" style="width:33%;margin:0;" value="set" title="save cookie value"\n onclick="var opt=this.form.list.value; var v=this.form.val.value; config.options[opt]=opt.substr(0,3)=='txt'?v:(v.toLowerCase()=='true'); saveOptionCookie(opt);window.setCookieEditorList(this.form.list);"><!--\n--><input type="button" style="width:33%;margin:0;" value="del" title="remove cookie"\n onclick="var ex=new Date(); ex.setTime(ex.getTime()-1000); document.cookie=this.form.list.value+'=novalue; path=/; expires='+ex.toGMTString(); window.setCookieEditorList(this.form.list);"></form></html><script>\n window.setCookieEditorList = function(list) {\n var cookies = { };\n if (document.cookie != "") {\n var p = document.cookie.split("; ");\n for (var i=0; i < p.length; i++) {\n var pos=p[i].indexOf("=");\n if (pos==-1) cookies[p[i]]="";\n else cookies[p[i].substr(0,pos)]=unescape(p[i].slice(pos+1));\n }\n }\n var opt=new Array(); for (var i in config.options) if (cookies[i]) opt.push(i); opt.sort();\n var sel=list.selectedIndex;\n while (list.options.length > 1) { list.options[1]=null; } // clear list (except for header item)\n list.options[0]=new Option("There are "+opt.length+" cookies...","",false,false);\n if (!opt.length) { list.form.val.value=""; return; } // no cookies\n var c=1;\n for(var i=0; i<opt.length; i++) {\n var txt="";\n if (opt[i].substr(0,3)=="chk")\n txt+="["+(config.options[opt[i]]?"x":"_")+"] ";\n txt+=opt[i];\n list.options[c++]=new Option(txt,opt[i],false,false);\n }\n list.selectedIndex=sel>0?sel:0;\n list.form.val.value=sel>0?config.options[list.options[sel].value]:"";\n }\n window.setCookieEditorList(place.lastChild.firstChild.list); \n</script>}}}
<script>\n var tiddlers=store.getTiddlers("modified","excludeLists");\n var out="";\n var limit=15; // set to tiddlers.length to list *all* tiddlers\n for (var i=tiddlers.length-1; i>=tiddlers.length-limit; i--)\n out+="<<tiddler ShowTiddlerClip with: [["+tiddlers[i].title+"]]>>";\nalert(out);\n return out;\n</script>
<script>\n var tid="$1"; // replaced by "TiddlerWithParams" macro\n var clipsize=500; // # of chars to display from each tiddler\n var tiddler=store.getTiddler(tid); if (!tiddler) return "";\n var title=tiddler.title;\n var author=tiddler.modifier\n var size=tiddler.text.length;\n var mod=tiddler.modified.formatString("0MM/0DD/YY 0hh:0mm");\n var clip=tiddler.text.substr(0,clipsize);\n var edit='onclick="story.displayTiddler(null,\s''+title+'\s',2);return false;">'+(readOnly?'view':'edit')+' source...';\n var out="";\n out+='@@display:block;+++['+title+']{{groupbox{@@display:block;overflow:hidden;width:50em;';\n out+='{{floatright{<<tiddler CloseSlider>>}}}[['+title+']] ('+size+' bytes) | '+'<html><a href="javascript:;" '+edit+'</a></html>\sn';\n out+='^^modified on '+mod+' by '+author+'^^\sn';\n out+='//{{fine{'+clipsize+' character source excerpt:}}}//\sn----\sn{{{\sn'+clip+'\sn}}}\sn';\n out+='@@}}}===@@';\n return out;\n</script>
@@display:block;''This document was last updated on <<date filedate "DDD, MMM DDth YYYY at hh:0mm:0ss">>''\n<script>\n var tiddlers=store.getTiddlers("modified","excludeLists");\n var plugins=0;\n var last=tiddlers[tiddlers.length-1];\n for (var i=0; i<tiddlers.length; i++) {\n if (!oldest || tiddlers[i].created<oldest)\n { var oldest=tiddlers[i].created; var oldtid=tiddlers[i]; }\n if (!newest || tiddlers[i].created>newest)\n { var newest=tiddlers[i].created; var newtid=tiddlers[i]; }\n if (!smallest || tiddlers[i].text.length<smallest)\n { var smallest=tiddlers[i].text.length; var smalltid=tiddlers[i]; }\n if (!largest || tiddlers[i].text.length>largest)\n { var largest=tiddlers[i].text.length; var largetid=tiddlers[i]; }\n }\n var out="";\n out+="There are "+tiddlers.length+" tiddlers\sn";\n out+="last change: [["+last.title+"]]";\n out+=" {{fine{(updated "+last.modified.formatString("MMM DDth YYYY, 0hh:0mm")+")}}}\sn";\n out+="newest: [["+newtid.title+"]]";\n out+=" {{fine{(created "+newtid.created.formatString("MMM DDth YYYY, 0hh:0mm")+")}}}\sn";\n out+="oldest: [["+oldtid.title+"]]";\n out+=" {{fine{(created "+oldtid.created.formatString("MMM DDth YYYY, 0hh:0mm")+")}}}\sn"\n out+="smallest: [["+smalltid.title+"]]";\n out+=" {{fine{("+smalltid.text.length+" bytes)}}}\sn"\n out+="largest: [["+largetid.title+"]]";\n out+=" {{fine{("+largetid.text.length+" bytes)}}}\sn"\n return(out);\n</script>@@
{{smallform{<script>\n // track date/time of last file save\n if (config.options.lastSaved==undefined)\n config.options.lastSaved=new Date(document.lastModified);\n\n // hijack store.setDirty() function (force display update after saving the file)\n if (TiddlyWiki.prototype.showUnsavedHijack_setDirty==undefined) {\n TiddlyWiki.prototype.showUnsavedHijack_setDirty=TiddlyWiki.prototype.setDirty;\n TiddlyWiki.prototype.setDirty = function(flag) {\n var refresh=this.isDirty() && !flag; // 'dirty' to 'clean', force a refresh...\n this.showUnsavedHijack_setDirty(flag); // but change the flag first.\n if (refresh) {\n config.options.lastSaved=new Date(); // remember save time\n refreshDisplay(); // finally, update the display\n }\n }\n }\n\n // get the unsaved tiddlers sorted by date - INCLUDE ALL TIDDLERS (even hidden ones!!)\n var tiddlers=store.getTiddlers("modified");\n // If no tiddlers have changed, DO NOTHING.\n if (tiddlers[tiddlers.length-1].modified<=config.options.lastSaved) return;\n var count=0; var list="";\n var item='<option value="%0">%1 - %0</option>';\n for (var i=tiddlers.length-1; i>=0; i--) {\n if (tiddlers[i].modified<=config.options.lastSaved) break;\n list+=item.format([tiddlers[i].title,\n tiddlers[i].modified.formatString('YYYY.0MM.0DD 0hh:0mm:0ss')]);\n count++;\n }\n // display the dropdown list wrapped in a slider\n var out='';\n var label='There %0 %1 unsaved tiddler%2...'.format([count==1?'is':'are',count,count==1?'':'s'])\n out+='+++(unsaved)['+label+'|show/hide a list of changed tiddlers]...';\n out+='<html><form style="display:inline">';\n out+='<select size="1" name="list" title="select a tiddler to view" ';\n out+=' onchange="var v=this.value; if (!v.length) return;';\n out+=' story.displayTiddler(null,v);';\n out+=' window.scrollTo(0,ensureVisible(document.getElementById(story.idPrefix+v)));">';\n out+=list;\n out+='</select>';\n out+='<input type="button" value="goto"';\n out+=' onclick="var v=this.form.list.value; if (!v.length) return; story.displayTiddler(null,v);';\n out+=' var t=document.getElementById(story.idPrefix+v); if (t) window.scrollTo(0,ensureVisible(t));">';\n out+='<input type="button" value="revert" title="import the last saved version of this tiddler"';\n out+=' onclick="var v=this.form.list.value; if (!v.length) return;';\n out+=' var t=\s'<\s'+\s'<loadTiddlers [[tiddler:\s'+v+\s']] \s'+document.location.href+\s' confirm force>\s'+\s'>\s';';\n out+=' var e=document.getElementById(\s'executeRevert\s'); if (e) e.parentNode.removeChild(e);';\n out+=' e=document.createElement(\s'span\s'); e.id=\s'executeRevert\s'; wikify(t,e);">';\n out+='</form></html>';\n out+='<'+'script>place.lastChild.style.fontWeight="normal"</'+'script>';\n out+='===';\n return out;\n</script>}}}
/%\n\nTIDDLER CONTENTS COPIED FROM: SideBarOptionsFull\n\n%/{{fine{{{floatright{<<tiddler ExpandSlidersScript with: "sidebar" "expand sidebar" "collapse sidebar">>}}}}}}++++(goto)[goto]...{{borderleft{\n <<tiddler SiteMenuGoto>>}}}===\n++++(search)[search]...{{borderleft{\n <<tiddler SiteMenuSearch>>}}}===\n{{floatright{<<tiddler ToggleReadOnly>>}}}+++(file)[file]...{{borderleft{\n <<tiddler SiteMenuFile>>}}}===\n+++(edit)[edit]...{{borderleft{\n <<tiddler SiteMenuEdit>>}}}===\n+++(view)[view]...{{borderleft{\n <<tiddler SiteMenuView>>}}}===\n+++(options)[options]...{{borderleft{\n <<tiddler SiteMenuOptions>>}}}===\n+++(calendar)[calendar]...{{borderleft{\n {{groupbox{{{small{<<calendar thismonth>><script>\n place.lastChild.style.width="100%";\n </script>}}}}}}}}}===
{{fine{{{floatright{<<tiddler ExpandSlidersScript with: "sidebar" "expand sidebar" "collapse sidebar">>}}}}}}++++(goto)[goto]...{{borderleft{\n <<tiddler SiteMenuGoto>>}}}===\n++++(search)[search]...{{borderleft{\n <<tiddler SiteMenuSearch>>}}}===\n{{floatright{<<tiddler ToggleReadOnly>>}}}+++(file)[file]...{{borderleft{\n <<tiddler SiteMenuFile>>}}}===\n+++(edit)[edit]...{{borderleft{\n <<tiddler SiteMenuEdit>>}}}===\n+++(view)[view]...{{borderleft{\n <<tiddler SiteMenuView>>}}}===\n+++(options)[options]...{{borderleft{\n <<tiddler SiteMenuOptions>>}}}===\n+++(calendar)[calendar]...{{borderleft{\n {{groupbox{{{small{<<calendar thismonth>><script>\n place.lastChild.style.width="100%";\n </script>}}}}}}}}}===
{{fine{{{floatright{<<tiddler ExpandSlidersScript with: "sidebar" "expand sidebar" "collapse sidebar">>}}}}}}++++(goto)[goto]...{{borderleft{\n <<tiddler SiteMenuGoto>>}}}===\n++++(search)[search]...{{borderleft{\n <<tiddler SiteMenuSearch>>}}}===\n{{floatright{<<tiddler ToggleReadOnly>>}}}+++(file)[file]...{{borderleft{\n <<tiddler SiteMenuFile>>}}}===\n+++(edit)[edit]...{{borderleft{\n <<tiddler SiteMenuEdit>>}}}===\n+++(view)[view]...{{borderleft{\n <<tiddler SiteMenuView>>}}}===\n+++(options)[options]...{{borderleft{\n <<tiddler SiteMenuOptions>>}}}===
{{fine{{{floatright{<<tiddler ExpandSlidersScript with: "sidebar" "expand sidebar" "collapse sidebar">>}}}}}}++++(goto)[goto]...{{borderleft{\n <<tiddler SiteMenuGoto>>}}}===\n++++(search)[search]...{{borderleft{\n <<tiddler SiteMenuSearch>>}}}===\n{{floatright{<<tiddler ToggleReadOnly>>}}}+++(file)[file]...{{borderleft{\n <<tiddler SiteMenuFile>>}}}===\n+++(edit)[edit]...{{borderleft{\n <<tiddler SiteMenuEdit>>}}}===\n+++(view)[view]...{{borderleft{\n <<tiddler SiteMenuView>>}}}===\n+++(options)[options]...{{borderleft{\n <<tiddler SiteMenuOptions>>}}}===
/%\n\nTIDDLER CONTENTS COPIED FROM: SideBarTabsFull\n\n%/+++(contents)[contents]...\n <<tabs txtMainTab Listbox 'TableOfContentsPlugin enhanced listbox' SideBarTabsListbox Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>===\n<script>var s=place.lastChild.button.style; s.marginLeft=".3em"; s.display="block"; s.padding=".2em";</script>
+++(contents)[contents]...\n <<tabs txtMainTab Listbox 'TableOfContentsPlugin enhanced listbox' SideBarTabsListbox Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>===\n<script>var s=place.lastChild.button.style; s.marginLeft=".3em"; s.display="block"; s.padding=".2em";</script>
<<tableOfContents "label:select a tiddler" date:YYYY.0MM.0DD width:100% padding:0 margin:0>><script>place.id="TOCListbox";place.lastChild.lastChild.style.color="#000";</script>
+++(contents)[contents]...\n <<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>===\n<script>var s=place.lastChild.button.style; s.marginLeft=".3em"; s.display="block"; s.padding=".2em";</script>
+++(contents)[contents]...\n <<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>===\n<script>var s=place.lastChild.button.style; s.marginLeft=".3em"; s.display="block"; s.padding=".2em";</script>
/***\n''Single Page Mode Plugin for TiddlyWiki version 2.0 or above''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#SinglePageModePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nNormally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.\n\n!!!!!Usage\n<<<\nSinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.\n\nEven when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.\n<<<\n!!!!!Configuration\n<<<\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:\n\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SinglePageMode handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''\n<<<\n!!!!!Revision History\n<<<\n''2006.07.04 [2.2.1]'' in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.\n''2006.06.01 [2.2.0]'' added chkTopOfPageMode (TPM) handling\n''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers\n''2005.12.27 [2.0.0]'' Update for TW2.0\n''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts\n''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them\n''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.\n''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nSupport for BACK/FORWARD buttons adapted from code developed by Clint Checketts\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageMode= {major: 2, minor: 2, revision: 1, date: new Date(2006,7,3)};\n\nif (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSinglePageMode>> Display one tiddler at a time";\n\nif (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";\n\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash)\n return;\n var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));\n tiddlerName=tiddlerName.replace(/\s[\s[/,"").replace(/\s]\s]/,""); // strip any [[ ]] bracketing\n if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);\n}\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (config.options.chkSinglePageMode) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n story.closeAllTiddlers();\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }\n this.SPM_coreDisplayTiddler(srcElement,title,template,animate,slowly)\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)\n{\n // suspend single-page mode when displaying multiple tiddlers\n var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;\n var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;\n this.SPM_coreDisplayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly);\n config.options.chkSinglePageMode=saveSPM; config.options.chkTopOfPageMode=saveTPM;\n}\n//}}}
/%\n\nTIDDLER CONTENTS COPIED FROM: SiteMenuFull\n\n%/{{floatright{{{nowrap{+++^18em^[goto]...{{wrap{\n <<moveablePanel>>goto tiddler\n----\n <<tiddler SiteMenuGoto>>}}}===\n +++^18em^[search]...{{wrap{\n <<moveablePanel>>search\n----\n <<tiddler SiteMenuSearch>>}}}===\n | +++^18em^[file]...{{wrap{\n <<moveablePanel>>file: <<tiddler ToggleReadOnly>>\n----\n <<tiddler SiteMenuFile>>}}}===\n +++^16em^[edit]...{{wrap{\n <<moveablePanel>>edit\n----\n <<tiddler SiteMenuEdit>>}}}===\n +++^16em^[view]...{{wrap{\n <<moveablePanel>>view\n----\n <<tiddler SiteMenuView>>}}}===\n +++^18em^[options]...{{wrap{\n <<moveablePanel>>options\n----\n <<tiddler SiteMenuOptions>>}}}===\n | +++^18em^[calendar]...{{wrap{\n <<moveablePanel>>calendar\n----\n {{small{<<calendar thismonth>><script>place.lastChild.style.width="100%";</script>}}}===\n +++^18em^[contents]...{{wrap{\n <<moveablePanel>>contents\n----\n <<tabs txtMainTab Listbox 'TableOfContentsPlugin enhanced listbox' SideBarTabsListbox Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>}}}===\n}}}}}}{{nowrap{<script label="welcome">\n story.closeTiddler('Welcome');\n story.displayTiddler(null,'Welcome',1);\n return false;\n</script> +++^60%^[about]...{{wrap{\n <<moveablePanel>>About\n----\n <<tiddler About>>}}}===\n +++^60%^[download]...{{wrap{\n <<moveablePanel>>Download\n----\n <<tiddler Download>>}}}===\n +++^60%^[contact]...{{wrap{\n <<moveablePanel>>Contact\n----\n <<tiddler Contact>>}}}===\n | +++^52em^[changes|recently changed tiddlers]...{{wrap{\n <<moveablePanel>>[[changes|ShowRecentChanges]] /%\n %/{{fine{//@@color:#999;as of <<date filedate "MMM DDth, YYYY 0hh:0mm:0ss">>@@//}}}\n----\n <<tiddler ShowRecentChanges>>}}}===\n +++^25em^[plugins|installed plugins, scripts, macros, stylesheets, templates, etc.]...{{wrap{\n <<moveablePanel>>ShowComponents\n----\n <<tiddler ShowComponents>>}}}===\n +++^60%^[(c)|copyright, licensing and other legal notices]...{{wrap{\n <<moveablePanel>>LegalStatements\n----\n <<tiddler ScrollBox with: LegalStatements 30em>>}}}===<script>\n place.lastChild.button.innerHTML="&copy;"; // set here since can't use HTML in slider label definition\n </script> | +++[extras...]{{wrap{<<tiddler SiteMenuExtras>>}}}===}}}
<<newTiddler>><script>\n if (!readOnly) return "<<br>>"\n</script><<newJournal 'DD MMM YYYY'>><script>\n if (!readOnly) return "<<br>>"\n</script><script>\n if (readOnly) return "@@font-size:7pt;read-only: no functions available@@"\n</script>
/%\n\nTIDDLER CONTENTS COPIED FROM: SiteMenuExtrasFull\n\n%/{{medium{+++^60%^[TagCloud|view all tags in this document]...\n <<moveablePanel>>~TagCloud\n----\n {{wrap{<<tagCloud demotag excludeMissing excludeLists excludeSearch>>}}}===\n &nbsp; +++^70%^[MiniBrowser|surf to other web site from inside TiddlyWiki]...\n <<moveablePanel>>MiniBrowser\n----\n <<tiddler MiniBrowser with: menubar>>===\n &nbsp; +++^640px^[MediaCenter|combined media player for windows, real, quicktime, and flash]...\n <<moveablePanel>>MediaCenter\n----\n <<tiddler MediaCenter with: menubar>>===\n &nbsp; +++^70%^[TidIDE|TiddlyWiki Integrated Development Environment]...\n <<moveablePanel>><<tidIDE TidIDETools TidIDETrac system edit>>===\n &nbsp; +++[TiddlyCards]...\n {{normal{<<tiddler TiddlyCardsMenu>>}}}===\n}}}<<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerTags>><<tiddler DoubleClickDisable>><script>\n var here=story.findContainingTiddler(place);\n if (here && here.getAttribute("tiddler")=="SiteMenuExtras")\n return '<<tiddler ReplaceTiddlerTitle with: "extras...">>';\n</script>
{{medium{+++^60%^[TagCloud|view all tags in this document]...\n <<moveablePanel>>~TagCloud\n----\n {{wrap{<<tagCloud demotag excludeMissing excludeLists excludeSearch>>}}}===\n &nbsp; +++^70%^[MiniBrowser|surf to other web site from inside TiddlyWiki]...\n <<moveablePanel>>MiniBrowser\n----\n <<tiddler MiniBrowser with: menubar>>===\n &nbsp; +++^640px^[MediaCenter|combined media player for windows, real, quicktime, and flash]...\n <<moveablePanel>>MediaCenter\n----\n <<tiddler MediaCenter with: menubar>>===\n &nbsp; +++^70%^[TidIDE|TiddlyWiki Integrated Development Environment]...\n <<moveablePanel>><<tidIDE TidIDETools TidIDETrac system edit>>===\n &nbsp; +++[TiddlyCards]...\n {{normal{<<tiddler TiddlyCardsMenu>>}}}===\n}}}<<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerTags>><<tiddler DoubleClickDisable>><script>\n var here=story.findContainingTiddler(place);\n if (here && here.getAttribute("tiddler")=="SiteMenuExtras")\n return '<<tiddler ReplaceTiddlerTitle with: "extras...">>';\n</script>
{{medium{+++^60%^[TagCloud|view all tags in this document]...\n <<moveablePanel>>~TagCloud\n----\n {{wrap{<<tagCloud demotag excludeMissing excludeLists excludeSearch>>}}}===\n}}}<<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerTags>><<tiddler DoubleClickDisable>><script>\n var here=story.findContainingTiddler(place);\n if (here && here.getAttribute("tiddler")=="SiteMenuExtras")\n return '<<tiddler ReplaceTiddlerTitle with: "extras...">>';\n</script>
/% note: only modify the lines in between BEGIN EDIT and END EDIT\n\nBEGIN EDIT %/\n<script label="replace this with your extra menu commands...">story.displayTiddler(null,"SiteMenuExtras",2);</script>\n/% END EDIT\n\n%/<<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerTags>><<tiddler DoubleClickDisable>><script>\n var here=story.findContainingTiddler(place);\n if (here && here.getAttribute("tiddler")=="SiteMenuExtras")\n return '<<tiddler ReplaceTiddlerTitle with: "extras...">>';\n</script>
/%\n\nTIDDLER CONTENTS COPIED FROM: SiteMenuFileFull\n\n%/@@display:block;{{borderbottom{\n<<saveChanges>>}}}@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n<<newDocument ask all>>}}}@@@@display:block;<<upload>> //(password req'd)//@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n[[download from web|Download]]}}}@@@@display:block;<<attach>>@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;<<importTiddlers>>@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n<<exportTiddlers>>}}}@@+++(newdocument)[new document...]...<<tiddler NewDocumentList>>===
@@display:block;{{borderbottom{\n<<saveChanges>>}}}@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n<<newDocument ask all>>}}}@@@@display:block;<<upload>> //(password req'd)//@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n[[download from web|Download]]}}}@@@@display:block;<<attach>>@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;<<importTiddlers>>@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n<<exportTiddlers>>}}}@@+++(newdocument)[new document...]...<<tiddler NewDocumentList>>===
@@display:block;{{borderbottom{\n<<saveChanges>>}}}@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n<<newDocument ask all>>}}}@@@@display:block;<<upload>> //(password req'd)//@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n[[download from web|Download]]}}}@@@@display:block;{{borderbottom{\n<<importTiddlers>>}}}@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>+++(newdocument)[new document...]...<<tiddler NewDocumentList>>===
@@display:block;{{borderbottom{\n<<saveChanges>>}}}@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>@@display:block;{{borderbottom{\n<<newDocument ask all>>}}}@@@@display:block;{{borderbottom{\n<<importTiddlers>>}}}@@<script>\n if(readOnly)place.lastChild.style.display="none";\n</script>+++(newdocument)[new document...]...<<tiddler NewDocumentList>>===
{{floatright{{{nowrap{+++^18em^[goto]...{{wrap{\n <<moveablePanel>>goto tiddler\n----\n <<tiddler SiteMenuGoto>>}}}===\n +++^18em^[search]...{{wrap{\n <<moveablePanel>>search\n----\n <<tiddler SiteMenuSearch>>}}}===\n | +++^18em^[file]...{{wrap{\n <<moveablePanel>>file: <<tiddler ToggleReadOnly>>\n----\n <<tiddler SiteMenuFile>>}}}===\n +++^16em^[edit]...{{wrap{\n <<moveablePanel>>edit\n----\n <<tiddler SiteMenuEdit>>}}}===\n +++^16em^[view]...{{wrap{\n <<moveablePanel>>view\n----\n <<tiddler SiteMenuView>>}}}===\n +++^18em^[options]...{{wrap{\n <<moveablePanel>>options\n----\n <<tiddler SiteMenuOptions>>}}}===\n | +++^18em^[calendar]...{{wrap{\n <<moveablePanel>>calendar\n----\n {{small{<<calendar thismonth>><script>place.lastChild.style.width="100%";</script>}}}===\n +++^18em^[contents]...{{wrap{\n <<moveablePanel>>contents\n----\n <<tabs txtMainTab Listbox 'TableOfContentsPlugin enhanced listbox' SideBarTabsListbox Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>}}}===\n}}}}}}{{nowrap{<script label="welcome">\n story.closeTiddler('Welcome');\n story.displayTiddler(null,'Welcome',1);\n return false;\n</script> +++^60%^[about]...{{wrap{\n <<moveablePanel>>About\n----\n <<tiddler About>>}}}===\n +++^60%^[download]...{{wrap{\n <<moveablePanel>>Download\n----\n <<tiddler Download>>}}}===\n +++^60%^[contact]...{{wrap{\n <<moveablePanel>>Contact\n----\n <<tiddler Contact>>}}}===\n | +++^52em^[changes|recently changed tiddlers]...{{wrap{\n <<moveablePanel>>[[changes|ShowRecentChanges]] /%\n %/{{fine{//@@color:#999;as of <<date filedate "MMM DDth, YYYY 0hh:0mm:0ss">>@@//}}}\n----\n <<tiddler ShowRecentChanges>>}}}===\n +++^25em^[plugins|installed plugins, scripts, macros, stylesheets, templates, etc.]...{{wrap{\n <<moveablePanel>>ShowComponents\n----\n <<tiddler ShowComponents>>}}}===\n +++^60%^[(c)|copyright, licensing and other legal notices]...{{wrap{\n <<moveablePanel>>LegalStatements\n----\n <<tiddler ScrollBox with: LegalStatements 30em>>}}}===<script>\n place.lastChild.button.innerHTML="&copy;"; // set here since can't use HTML in slider label definition\n </script> | +++[extras...]{{wrap{<<tiddler SiteMenuExtras>>}}}===}}}
/%\n\nTIDDLER CONTENTS COPIED FROM: SiteMenuGotoFull\n\n%/{{right{{{floatleft{tiddler}}}+++(groups)[groups]...\n {{left{<<tiddlerGroups>>}}}===<script>\n place.lastChild.id="SiteMenuGoto_groups"\n </script> | +++(recent)[recent]...\n {{center{{{small{<<date popup Y M D-1 "yesterday" "DDD MMM DDth YYYY">>/%\n %/ <<date popup today "today" "DDD MMM DDth YYYY">>/%\n %/ <<date popup Y M D+1 "tomorrow" "DDD MMM DDth YYYY">>}}}}}}===<script>\n place.lastChild.id="SiteMenuGoto_recent"\n </script>}}}<<goto width:98.5%;margin:0;font-size:8pt; width:85%;font-size:8pt;>><script>\n place.insertBefore(document.getElementById("SiteMenuGoto_groups"),null);\n place.insertBefore(document.getElementById("SiteMenuGoto_recent"),null);\n</script>
{{right{{{floatleft{tiddler}}}+++(groups)[groups]...\n {{left{<<tiddlerGroups>>}}}===<script>\n place.lastChild.id="SiteMenuGoto_groups"\n </script> | +++(recent)[recent]...\n {{center{{{small{<<date popup Y M D-1 "yesterday" "DDD MMM DDth YYYY">>/%\n %/ <<date popup today "today" "DDD MMM DDth YYYY">>/%\n %/ <<date popup Y M D+1 "tomorrow" "DDD MMM DDth YYYY">>}}}}}}===<script>\n place.lastChild.id="SiteMenuGoto_recent"\n </script>}}}<<goto width:98.5%;margin:0;font-size:8pt; width:85%;font-size:8pt;>><script>\n place.insertBefore(document.getElementById("SiteMenuGoto_groups"),null);\n place.insertBefore(document.getElementById("SiteMenuGoto_recent"),null);\n</script>
{{right{{{floatleft{tiddler}}}+++(groups)[groups]...\n {{left{<<tiddlerGroups>>}}}===<script>\n place.lastChild.id="SiteMenuGoto_groups"\n </script>}}}<<goto width:98.5%;margin:0;font-size:8pt; width:85%;font-size:8pt;>><script>\n place.insertBefore(document.getElementById("SiteMenuGoto_groups"),null);\n</script>
tiddler\n<<goto width:98.5%;margin:0;font-size:8pt; width:85%;font-size:8pt;>>
{{floatright{{{nowrap{+++^18em^[goto]...{{wrap{\n <<moveablePanel>>goto tiddler\n----\n <<tiddler SiteMenuGoto>>}}}===\n +++^18em^[search]...{{wrap{\n <<moveablePanel>>search\n----\n <<tiddler SiteMenuSearch>>}}}===\n | +++^18em^[file]...{{wrap{\n <<moveablePanel>>file: <<tiddler ToggleReadOnly>>\n----\n <<tiddler SiteMenuFile>>}}}===\n +++^16em^[edit]...{{wrap{\n <<moveablePanel>>edit\n----\n <<tiddler SiteMenuEdit>>}}}===\n +++^16em^[view]...{{wrap{\n <<moveablePanel>>view\n----\n <<tiddler SiteMenuView>>}}}===\n +++^18em^[options]...{{wrap{\n <<moveablePanel>>options\n----\n <<tiddler SiteMenuOptions>>}}}===\n | +++^18em^[contents]...{{wrap{\n <<moveablePanel>>contents\n----\n <<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>}}}===\n}}}}}}{{nowrap{<script label="welcome">\n story.closeTiddler('Welcome');\n story.displayTiddler(null,'Welcome',1);\n return false;\n</script> +++^60%^[about]...{{wrap{\n <<moveablePanel>>About\n----\n <<tiddler About>>}}}===\n +++^60%^[download]...{{wrap{\n <<moveablePanel>>Download\n----\n <<tiddler Download>>}}}===\n +++^60%^[contact]...{{wrap{\n <<moveablePanel>>Contact\n----\n <<tiddler Contact>>}}}===\n | +++^52em^[changes|recently changed tiddlers]...{{wrap{\n <<moveablePanel>>[[changes|ShowRecentChanges]] /%\n %/{{fine{//@@color:#999;as of <<date filedate "MMM DDth, YYYY 0hh:0mm:0ss">>@@//}}}\n----\n <<tiddler ShowRecentChanges>>}}}===\n +++^60%^[(c)|copyright, licensing and other legal notices]...{{wrap{\n <<moveablePanel>>[[legal|LegalStatements]]\n----\n <<tiddler ScrollBox with: LegalStatements 30em>>}}}===<script>\n place.lastChild.button.innerHTML="&copy;"; // set here since can't use HTML in slider label definition\n </script> | +++[extras...]{{wrap{<<tiddler SiteMenuExtras>>}}}===}}}
{{floatright{{{nowrap{+++^18em^[goto]...{{wrap{\n <<moveablePanel>>goto tiddler\n----\n <<tiddler SiteMenuGoto>>}}}===\n +++^18em^[search]...{{wrap{\n <<moveablePanel>>search\n----\n <<tiddler SiteMenuSearch>>}}}===\n | +++^18em^[file]...{{wrap{\n <<moveablePanel>>file: <<tiddler ToggleReadOnly>>\n----\n <<tiddler SiteMenuFile>>}}}===\n +++^16em^[edit]...{{wrap{\n <<moveablePanel>>edit\n----\n <<tiddler SiteMenuEdit>>}}}===\n +++^16em^[view]...{{wrap{\n <<moveablePanel>>view\n----\n <<tiddler SiteMenuView>>}}}===\n +++^18em^[options]...{{wrap{\n <<moveablePanel>>options\n----\n <<tiddler SiteMenuOptions>>}}}===\n | +++^18em^[contents]...{{wrap{\n <<moveablePanel>>contents\n----\n <<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>}}}===\n}}}}}}{{nowrap{<script label="welcome">\n story.closeTiddler('Welcome');\n story.displayTiddler(null,'Welcome',1);\n return false;\n</script> +++^60%^[about]...{{wrap{\n <<moveablePanel>>About\n----\n <<tiddler About>>}}}===\n +++^60%^[(c)|copyright, licensing and other legal notices]...{{wrap{\n <<moveablePanel>>LegalStatements\n----\n <<tiddler ScrollBox with: LegalStatements 30em>>}}}===<script>\n place.lastChild.button.innerHTML="&copy;"; // set here since can't use HTML in slider label definition\n </script> | +++[extras...]{{wrap{<<tiddler SiteMenuExtras>>}}}===}}}
/%\n\nTIDDLER CONTENTS COPIED FROM: SiteMenuOptionsFull\n\n%/@@display:block;++++(themes)[themes]\n <<selectStylesheet size:1 width:100%>>===\n@@@@display:block;+++(displayoptions)[display]\n {{borderleft{\n <<tiddler ToggleSiteTitles>>\n <<tiddler ToggleSiteMenu>>\n <<tiddler ToggleScrollingSidebars>>\n <<tiddler ToggleTopButton>>\n <<option chkSinglePageMode>> one tiddler at a time\n <<option chkTopOfPageMode>> open at top of page\n <<option chkAnimate>> enable animation}}}===\n@@@@display:block;+++(saving)[saving]\n {{borderleft{\n <<option chkAutoSave>> auto save\n <<option chkSaveBackups>> create backup file\n <<option chkGenerateAnRssFeed>> create .xml file}}}===\n@@@@display:block;+++(upload)[upload]\n {{borderleft{\n <<tiddler SiteMenuOptionsUpload>>}}}===\n@@@@display:block;+++[username]\n <<option txtUserName>><script>\n place.lastChild.setAttribute("autocomplete","off");\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";\n </script>===\n@@@@display:block;+++(cookies)[cookies]\n <<tiddler ShowCookies>>===\n@@[[AdvancedOptions]]<script>\n place.lastChild.style.fontStyle="normal";\n place.lastChild.style.fontWeight="normal";\n place.lastChild.innerHTML="advanced options...";\n</script>
@@display:block;++++(themes)[themes]\n <<selectStylesheet size:1 width:100%>>===\n@@@@display:block;+++(displayoptions)[display]\n {{borderleft{\n <<tiddler ToggleSiteTitles>>\n <<tiddler ToggleSiteMenu>>\n <<tiddler ToggleScrollingSidebars>>\n <<tiddler ToggleTopButton>>\n <<option chkSinglePageMode>> one tiddler at a time\n <<option chkTopOfPageMode>> open at top of page\n <<option chkAnimate>> enable animation}}}===\n@@@@display:block;+++(saving)[saving]\n {{borderleft{\n <<option chkAutoSave>> auto save\n <<option chkSaveBackups>> create backup file\n <<option chkGenerateAnRssFeed>> create .xml file}}}===\n@@@@display:block;+++(upload)[upload]\n {{borderleft{\n <<tiddler SiteMenuOptionsUpload>>}}}===\n@@@@display:block;+++[username]\n <<option txtUserName>><script>\n place.lastChild.setAttribute("autocomplete","off");\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";\n </script>===\n@@@@display:block;+++(cookies)[cookies]\n <<tiddler ShowCookies>>===\n@@[[AdvancedOptions]]<script>\n place.lastChild.style.fontStyle="normal";\n place.lastChild.style.fontWeight="normal";\n place.lastChild.innerHTML="advanced options...";\n</script>
@@display:block;++++(themes)[themes]\n <<selectStylesheet size:1 width:100%>>===\n@@@@display:block;+++(displayoptions)[display]\n {{borderleft{\n <<tiddler ToggleSiteTitles>>\n <<tiddler ToggleSiteMenu>>\n <<tiddler ToggleScrollingSidebars>>\n <<tiddler ToggleTopButton>>\n <<option chkAnimate>> enable animation}}}===\n@@@@display:block;+++(saving)[saving]\n {{borderleft{\n <<option chkAutoSave>> auto save\n <<option chkSaveBackups>> create backup file}}}===\n@@@@display:block;+++(upload)[upload]\n {{borderleft {\n <<tiddler SiteMenuOptionsUpload>>}}}===\n@@@@display:block;+++[username]\n <<option txtUserName>><script>\n place.lastChild.setAttribute("autocomplete","off");\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";\n </script>===\n@@[[AdvancedOptions]]<script>\n place.lastChild.style.fontStyle="normal";\n place.lastChild.style.fontWeight="normal";\n place.lastChild.innerHTML="advanced options...";\n</script>
@@display:block;++++(themes)[themes]\n <<selectStylesheet size:1 width:100%>>===\n@@@@display:block;+++(displayoptions)[display]\n {{borderleft{\n <<tiddler ToggleScrollingSidebars>>\n <<tiddler ToggleTopButton>>\n <<option chkAnimate>> enable animation}}}===\n@@@@display:block;+++(saving)[saving]\n {{borderleft{\n <<option chkAutoSave>> auto save\n <<option chkSaveBackups>> create backup file}}}===\n@@@@display:block;+++[username]\n <<option txtUserName>><script>\n place.lastChild.setAttribute("autocomplete","off");\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";\n </script>===\n@@[[AdvancedOptions]]<script>\n place.lastChild.style.fontStyle="normal";\n place.lastChild.style.fontWeight="normal";\n place.lastChild.innerHTML="advanced options...";\n</script>
@@display:block;+++[script URL]...\n<<option txtUploadStoreUrl>><script>\n place.lastChild.title="URL for server-side upload processing";\n place.lastChild.setAttribute("autocomplete","off")\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";s.margin="0";\n</script>===\n@@@@display:block;+++[target path]...\n<<option txtUploadDir>><script>\n place.lastChild.title="target path (blank=same as script URL)";\n place.lastChild.setAttribute("autocomplete","off")\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";s.margin="0";\n</script>===\n@@@@display:block;+++[target filename]...\n<<option txtUploadFilename>><script>\n place.lastChild.title="target filename (blank=use current filename)";\n place.lastChild.setAttribute("autocomplete","off")\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";s.margin="0";\n</script>===\n@@@@display:block;+++[backup path]...\n<<option txtUploadBackupDir>><script>\n place.lastChild.title="backup path (blank=same as path)";\n place.lastChild.setAttribute("autocomplete","off")\n var s=place.lastChild.style;s.width="98%";s.fontSize="8pt";s.margin="0";\n</script>===@@
{{floatright{+++[options|advanced search options]\n {{borderbottom{\n @@display:block;<<option chkSearchTitles>> titles <<option chkSearchText>> text <<option chkSearchTags>> tags@@}}}<<option chkSearchTitlesFirst>> show titles first\n <<option chkSearchList>> list in SearchResults\n <<option chkRegExpSearch>> text patterns\n <<option chkCaseSensitiveSearch>> case sensitive\n <<option chkSearchIncremental>> key-by-key search\n <<option chkSearchShadows>> search in shadows<script>\n place.style.padding=".5em";\n </script><script>\n place.id="sidebarSearchOptions" // so we can move this panel\n config.macros.search.label="find tiddlers";\n </script>===}}}<<search>><script>\n var s=place.lastChild.style;s.fontSize="8pt";s.width="98.5%"; // adjust search control style\n place.appendChild(document.getElementById("sidebarSearchOptions")); // move panel here\n</script>
{{borderbottom{\n@@display:block;<script label="refresh display">\n refreshDisplay()\n</script><script>\n place.lastChild.style.fontWeight="normal"\n place.lastChild.title="refresh current page display WITHOUT reloading page contents"\n</script>@@}}}<<permaview>>\n{{borderbottom{\n@@display:block;<<newDocument "label:snapshot" ask snap>>@@}}}<<closeAll>>\n
http://www.TiddlyTools.com/proxy.php?url=
This tiddler is included in the PageTemplate as a ''hidden SPAN''. You can use it include macros or inline scripts that are automatically invoked whenever the document is loaded.\n\n!!!!!initialize left/right sidebar displays\n<<<\nThe ToggleLeftSidebar and ToggleRightSidebar inline scripts set the visibility (//display:none// or //display:block//) of the MainMenu ('left sidebar', DOM ID=//mainMenu//) and SideBarOptions ('right sidebar', DOM ID=//sidebar//) displays. They also adjust the margins of the center column ('story', DOM ID=//displayArea//) accordingly, so that it uses the available space without overlapping the sidebars. The ToggleScrollingSidebars inline script sets 'position:fixed' for the sidebars, so that they remain fixed in place (aka, "hover") when the rest of the page content is scrolled.\n|{{{<<tiddler ToggleLeftSidebar>>}}} |<<tiddler ToggleLeftSidebar>> |\n|{{{<<tiddler ToggleRightSidebar>>}}} |<<tiddler ToggleRightSidebar>> |\n|{{{<<tiddler ToggleScrollingSidebars>>}}} |<<tiddler ToggleScrollingSidebars>> |\n<<<\n!!!!!initialize header display\n<<<\nThe ToggleSiteTitles inline script sets the visibility (//display:none// or //display:block//) of the SiteTitle/SiteSubtitle display area ('page titles', DOM ID=//header//)\n|{{{<<tiddler ToggleSiteTitles>>}}} |<<tiddler ToggleSiteTitles>> |\n<<<\n!!!!!"scroll to top" button\n<<<\nThe ToggleTopButton script creates a link that 'hovers' in the lower right corner of your browser window and, when clicked, causes the page to return to the top (assuming it has been scrolled down...). The script also provides an interface so you can enable/disable this feature:\n|{{{<<tiddler ToggleTopButton>>}}} |<<tiddler ToggleTopButton>> |\n<<<\n!!!!!toggle low-profile SiteMenu\n<<<\nThe ToggleSiteMenu inline script sets the visibility (//display:none// or //display:block//) of the SiteMenu display area ('menubar', DOM ID=//siteMenu//).\n|{{{<<tiddler ToggleSiteMenu>>}}} |<<tiddler ToggleSiteMenu>> |\n<<<\n
{{right{[>img[i4logo|els/i4logo.gif][IntuitiveInterfaces]] {{nowrap{@@font-size:18pt;font-family:"Trebuchet MS";[[ELS Design Studios|ELSDesignStudios]] @@\n@@font-size:8pt;font-family:"Trebuchet MS";Intuitive Interfaces for Intelligent Interactions&trade;@@&nbsp;}}}}}}
{{floatleft{@@font-size:28pt;[[TiddlyTools|http://www.TiddlyTools.com/]]@@ @@font-size:8pt;"Small Tools for Big Ideas!"@@}}}
http://www.TiddlyTools.com/
/%\n\nusage: <<tiddler SliderFrame with: label url width height panelid>>\n\n%/+++[$1]...{{menubox{{{toolbar{<script label="back">\n window.history.go(-1);\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="go back one page";\n</script><script label="forward">\n window.history.go(+1);\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="go forward one page";\n</script><script label="reload">\n var f=place.parentNode.nextSibling.nextSibling.nextSibling.firstChild;\n f.src="$2";\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="reload $2";\n</script><script label="width">\n var f=place.parentNode.nextSibling.nextSibling.nextSibling.firstChild;\n var w=prompt("Enter a new frame width (use CSS dimensions: ### plus 'px', 'em', 'cm', 'in', or '%')","$3");\n if (!w||!w.length) return; if (!w.replace(/[0-9]*/,'').length) w+="px";\n f.style.width=w;\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="set frame width (use CSS dimensions: ### plus 'px', 'em', 'cm', 'in', or '%')";\n</script><script label="height">\n var f=place.parentNode.nextSibling.nextSibling.nextSibling.firstChild;\n var h=prompt("Enter a new frame height (use CSS dimensions: ### plus 'px', 'em', 'cm', 'in')","$4");\n if (!h||!h.length) return; if (!h.replace(/[0-9]*/,'').length) h+="px";\n f.style.height=h;\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="set frame height (use CSS dimensions: ### plus 'px', 'em', 'cm', 'in')";\n</script>/%<script label="new window">\n window.open("$2")\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="open $2 in a new tab/window";\n</script>%/<script label="close">\n var button=place.parentNode.parentNode.parentNode.button; \n window.onClickNestedSlider({target:button});\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title="close slider";\n</script>}}}{{small{$2}}}\n<html><iframe src="$2" width="$3" height="$4" width="100%" style="background:#fff;margin-top:2px"></iframe></html>}}}===\n<script>\n if ("$5"!="$"+"5") place.lastChild.id="$5";\n place.lastChild.style.clear="both";\n place.lastChild.button.style.whiteSpace="nowrap";\n// place.lastChild.button.style.fontWeight="bold";\n</script>
/%\n\nTIDDLER CONTENTS COPIED FROM: StoryMenu\n\n%/{{center{{{fine{{{floatleft{<<tiddler ToggleLeftSidebar>>}}}{{floatright{<<tiddler ToggleRightSidebar>>}}}<<tiddler ShowUnsavedChanges>>\n}}}}}}
[[StyleSheetAdjustments]]\n[[Edge of Night]]
/***\nThe following CSS declarations extend/enhance the TiddlyWiki default shadowed stylesheets.\n\nThese 'style tweaks' can be easily included in other stylesheet tiddler so they can share a baseline look-and-feel that can then be customized to create a wide variety of 'flavors'.\n\n!TW defaults /%==================================================%/\nSelectStylesheetPlugin intentionally does NOT include the TW default shadow style tiddlers, so that it becomes possible to ''completely bypass the default styles'' instead of needing to override each style explicitly. However, to //overlay// these shadow styles, so that the customized CSS adds to those styles rather than //replacing// them, we include them here:\n***/\n/*{{{*/\n[[StyleSheetLayout]]\n[[StyleSheetColors]]\n[[StyleSheetPrint]]\n/*}}}*/\n\n/***\n!body /%==================================================%/\nIE needs explicit "position:static" declaration (fixes 'partial background display bug')\n***/\n/*{{{*/\nbody\n { font-family: Verdana,Arial,Helvetica; position:static; }\n/*}}}*/\n\n/***\n!common colors /%==================================================%/\n***/\n/*{{{*/\n/* these seem to have been omitted from the core defaults for link styles */\na { color:#014; }\na:hover { color:#f00; }\n/*}}}*/\n\n/***\n!header and titles /%==================================================%/\nIE needs explicit "position:static" declaration (fixes 'background display hides text bug')\n***/\n/*{{{*/\n.header\n { background:transparent; padding:.2em; border-bottom:1px solid; position:static }\n.headerShadow, .headerForeground\n { padding:.5em; }\n.header a, .header .button, .header .tiddlyLinkExisting, .header .tiddlyLinkNonExisting\n { font-weight: normal; font-style: normal; }\n.header .externalLink,\n.siteSubtitle a, .siteSubtitle .button, .siteSubtitle .tiddlyLinkExisting, .siteSubtitle .tiddlyLinkNonExisting\n { font-style:italic; text-decoration:none; }\n/*}}}*/\n\n/***\n!siteMenu /%==================================================%/\n***/\n/*{{{*/\n.siteMenu\n { background:transparent; padding:.2em 1em .2em 1em; }\n.siteMenu a, .siteMenu .button, .siteMenu .tiddlyLinkExisting, .siteMenu .tiddlyLinkNonExisting\n { font-weight: normal; font-style: normal; }\n/*}}}*/\n\n/***\n!storyMenu /%==================================================%/\n***/\n/*{{{*/\n.storyMenu\n { display:block; margin:.2em 0em .5em 0em; }\n.storyMenu a, .storyMenu .button, .storyMenu .tiddlyLinkExisting, .storyMenu .tiddlyLinkNonExisting\n { font-weight: normal; font-style: normal; text-decoration:none; }\n/*}}}*/\n\n/***\n!displayArea /%==================================================%/\n***/\n/*{{{*/\n#displayArea\n { margin-top:0em; }\n/*}}}*/\n\n\n/***\n!popups /%==================================================%/\nwhite-space:nowrap prevents items from wrapping if popup is near right edge of window\nz-index:1000 makes sure popup is above EVERYTHING else\n***/\n/*{{{*/\n.popup\n { white-space: nowrap; z-index:1000; color: #000; background: #ffe; border: 1px solid #000;\n -moz-border-radius-topright: 5px; -moz-border-radius-bottomleft: 5px; -moz-border-radius-bottomright: 5px; }\n.popup a, .popup .button, .popup .tiddlyLinkExisting, .popup .tiddlyLinkNonExisting\n { font-weight: normal; font-style: normal; }\n.popup hr\n { color: #000; background: #ddd; border: 0; }\n.popup li.disabled\n { color: #999; }\n.popup li a, .popup li a:visited\n { color: #300; }\n.popup li a:hover\n { background: #006; color: #fff;}\n/*}}}*/\n\n/***\n!messageArea /%==================================================%/\n***/\n/*{{{*/\n#messageArea\n { font-size:90%; -moz-border-radius:1em; background:#eee; }\n/*}}}*/\n\n/***\n!main menu (left sidebar) /%==================================================%/\n***/\n/*{{{*/\n#mainMenu\n { width:9em; text-align:left; margin:0; margin-top:.5em; margin-left:1em; padding:0; }\n*[id="mainMenu"] /* moz browsers only */\n { width:auto !important; } \n/*}}}*/\n\n/***\n!sidebar (right sidebar) /%==================================================%/\n***/\n/*{{{*/\n#sidebar\n { width:18em;}\n#sidebar .attachPanel, #sidebar #importPanel, #sidebar #exportPanel\n { right:115%; top:3em; text-align:left; }\n#sidebarTabs .tab\n { font-size:90%; -moz-border-radius-topleft:.5em; -moz-border-radius-topright:.5em; }\n#sidebarTabs .tabContents\n { background:transparent; border:1px solid #999; padding:.5em; height:auto; overflow:auto; width:92.5%; }\n#sidebarTabs .tabContents .tabContents\n { background:transparent; border:1px solid #999; padding:.5em; height:auto; }\n#sidebarTabs .tabContents *[class="TOCList"] /* MOZ ONLY */\n { background-color: transparent; border-color:transparent !important; }\n#sidebarOptions .sliderPanel\n { margin:0; padding:0; font-size:1em; background:transparent; }\n#sidebarOptions .sliderPanel a\n { font-weight:normal; }\n#sidebarOptions .sliderPanel blockquote\n { margin:0;padding:0;margin-left:1em; border-left:1px dotted; padding-left:1em }\n#sidebarOptions input[type="text"]\n { font-size:8pt; }\n}\n*/\n/*}}}*/\n\n/***\n!tabs /%==================================================%/\n***/\n/*{{{*/\n.tabset\n { padding: 0.2em 0 0 0; }\n.tab\n { padding:0 1px 0 1px; }\n.tabSelected\n { border: 1px solid; border-bottom: 0px !important; margin-bottom:-2px !important; }\n.tabUnselected\n { border: 1px solid #999; }\n.tabContents\n { border: 1px solid; -moz-border-radius:1em; padding: 1em; }\n/*}}}*/\n\n/***\n!tiddler display elements /%==================================================%/\n***/\n/*{{{*/\n.tiddler\n { padding: 0 1em 1em 1em; }\n.button, .button:hover, .button:active,\n.viewer .button, .viewer .button:hover, .viewer .button:active\n { background:transparent; border:0; }\n.toolbar\n { float:right; display:inline; padding-bottom:0; }\n.toolbar .button\n { border:1px solid transparent; background:transparent; margin:1px 1px; padding:0px .5em; -moz-border-radius:.5em; }\n.toolbar .button:hover\n { border:1px solid #69c; background:#006; color:#fff; }\n.tagging, .tagged\n { -moz-border-radius:1em; }\n.subtitle\n { font-size:90%; }\n.editor input, .editor textarea\n { font-size: 8pt;}\n.title\n { font-size: 12pt; }\n.viewer\n { font-size: 9pt; padding: 0.7em; text-align:justify; }\n.viewer pre, .viewer code, .viewer blockquote\n { font-size:8pt; text-align:left; }\n.viewer hr {\n margin: 1px; padding:1px;\n border:0;\n border-top: solid 1px #666;\n color: #666;\n}\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 1em;\n margin-left: 1em;\n border-left: 1px dotted;\n}\n\ninput[type="Checkbox"] { margin-top:2px;margin-bottom:2px; }\n/*}}}*/\n\n/***\n!floating panels /%==================================================%/\n***/\n/*{{{*/\n.floatingPanel\n { padding:1em; margin:0em; border:1px solid; -moz-border-radius:1em; font-size:8pt; text-align:left; }\n.floatingPanel hr\n { margin:2px 0 1px 0; padding:0; }\n/*}}}*/\n\n/***\n!breadcrumbs /%==================================================%/\n***/\n/*{{{*/\n/* smaller size for bread crumbs (see BreadcrumbsPlugin) */\n#breadCrumbs\n { display:none; margin:0 1em; font-size:7pt; } /* display:block is set by plugin when crumbs are in use */\n/*}}}*/\n\n/***\n!formatting shortcuts /%==================================================%/\n***/\n/*{{{*/\n\n/* text alignments */\n.left\n { display:block;text-align:left; }\n.floatleft\n { float:left; }\n.right \n { display:block;text-align:right; }\n.floatright\n { float:right; }\n.center\n { display:block;text-align:center; }\n.wrap\n { white-space:normal }\n.nowrap\n { white-space:nowrap }\n\n/* font sizes */\n.big\n { font-size:14pt;line-height:120% }\n.medium\n { font-size:12pt;line-height:120% }\n.normal\n { font-size:9pt;line-height:120% }\n.small\n { font-size:8pt;line-height:120% }\n.fine\n { font-size:7pt;line-height:120% }\n.tiny\n { font-size:6pt;line-height:120% }\n\n/* borderless tables */\n.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody\n { border:0 !important; margin:0 !important; padding:0 !important; }\n\n/* grouped content */\n.outline\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; }\n.menubox\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:#fff; color:#000; }\n.menubox a, .menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting\n { color:#009 !important; }\n.groupbox\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:#ffe; color:#000; }\n.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting\n { color:#009 !important; }\n.indent\n { margin:0;padding:0;border:0;margin-left:.5em; }\n.borderleft\n { margin:0;padding:0;border:0;margin-left:1em; border-left:1px dotted; padding-left:.5em; }\n.borderright\n { margin:0;padding:0;border:0;margin-right:1em; border-right:1px dotted; padding-right:.5em; }\n.borderbottom\n { margin:0;padding:0;border:0;border-bottom:1px dotted; padding-bottom:1px; }\n.bordertop\n { margin:0;padding:0;border:0;border-top:1px dotted; padding-top:1px; }\n\n/* compact form */\n.smallform\n { white-space:nowrap; }\n.smallform input, .smallform textarea, .smallform button, .smallform checkbox, .smallform radio, .smallform select\n { font-size:8pt; }\n/*}}}*/
<script label="full">\n window.switchMenus("Full",place,"TiddlyTools Full menus have been installed");\n</script> | <script label="lite">\n window.switchMenus("Lite",place,"TiddlyTools Lite menus have been installed");\n</script> | <script label="mini">\n window.switchMenus("Mini",place,"TiddlyTools Mini menus have been installed");\n</script><script>\n window.switchMenus = function(which,place,msg) {\n function rewriteMenu(which,id) {\n var tid=id+which;\n var text=store.getTiddlerText(tid);\n if (!text) return; // source tiddler does not exist for this ID\n var msg="/%\sn\snTIDDLER CONTENTS COPIED FROM: "+tid+"\sn\sn%/";\n if (store.tiddlerExists(id)) {\n displayMessage("replacing "+id);\n store.addTiddler(store.fetchTiddler(id).set(null,msg+text));\n store.notify(id,true);\n }\n }\n clearMessage(); \n rewriteMenu(which,"StoryMenu");\n rewriteMenu(which,"SiteMenuExtras");\n rewriteMenu(which,"SiteMenuGoto");\n rewriteMenu(which,"SiteMenuFile");\n rewriteMenu(which,"SiteMenuOptions");\n rewriteMenu(which,"SideBarTabs");\n rewriteMenu(which,"SideBarOptions");\n rewriteMenu(which,"MainMenu");\n rewriteMenu(which,"SiteMenu");\n store.setDirty(true);\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),null,true);\n displayMessage(msg);\n }\n</script>
/***\n''Table of Contents Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#TableOfContentsPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen there are many tiddlers in a document, the standard 'tabbed list of tiddlers' in the right-hand sidebar can become very long, occupying a lot of page space and requiring a lot scrolling in order to locate and select a tiddler.\n\nThe TableOfContentsPlugin addresses this problem by replacing the standard tabbed list display with a single listbox/droplist control that uses a very small amount of page space, regardless of the number of tiddlers in the document.\n\n!!!!!Usage\n<<<\nTo view a tiddler, simply select (or double-click) its title from the listbox and it will automatically be displayed on the page. The listbox also includes special 'command' items that determine the order and type of tiddlers that are shown in the list:\n\n''[by title]'' displays all tiddlers in the document.\n''[by date/author/tags]'' displays indented sections, sorted accordingly, with headings (indicated by a '+') that can be expanded, one at a time, to view the list of tiddlers in that section.\n''[missing]'' displays tiddlers that have been referenced within the document but do not yet exist.\n''[orphans]'' displays tiddlers that do exist in the document but have not been referenced by a link from anywhere else within the document.\n''[system]'' displays special tiddlers that are used by TiddlyWiki to configure built-in features and add-on macros/extensions. The list includes all tiddlers tagged with <<tag systemTiddlers>> ("templates") or <<tag systemConfig>> (plug-in extensions), plus any 'shadow tiddlers' (built-in default systemTiddlers) that have not been over-ridden by custom tiddler definitions.\n\nThe current list ''display setting is indicated by an arrow (">")'' symbol to the left of command item. Selecting a command item causes the listbox to be reloaded with the appropriate contents and sort order.\n\nWhen you are viewing a list of tiddlers by date/author/tags, ''shift-clicking'' on a section heading or command item causes the listbox display to ''toggle between "show-one-section-at-a-time" and "expand-all-sections"'' display options, allowing you to quickly see all tiddler titles at once without having to view individual indented sections one at a time.\n\nThe ''size of the listbox can be adjusted'' so you can view more (or less) tiddler titles at one time. Select ''[-]'' to reduce the size by one line, ''[+]'' to increase the size by one line, or ''[=]'' to autosize the list to fit the current contents (toggles on/off). //Note: If the listbox is reduced to a single line, it displayed as a droplist instead of a fixed-sized listbox.// You can ''show/hide the entire listbox'' by selecting the "contents" label that appears above the listbox.\n<<<\n!!!!!Control Panel\n<<<\nBy default, tiddlers tagged with <<tag excludeLists>>, are omitted from the TableOfContents so that 'system' tiddlers (e.g. MainMenu, SiteTitle, StyleSheet, etc.) can be hidden, reducing "information overload" and making it easier to select relevant tiddlers when reading your document. However, when //editing// your document, including these hidden tiddlers in the list can be more helpful, so that changes to the menus, titles, styles, etc. can be more quickly accomplished.\n----\n''To include hidden tiddlers in the TableOfContents display, select the following option:''\n<<option chkTOCIncludeHidden>> include hidden tiddlers in TableOfContents(ignores <<tag excludeLists>> tag)\n^^note: this setting is ignored when ''<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP'' is enabled^^\n<<<\n!!!!!Parameters\n<<<\nThe macro accepts optional parameters to control various features and functions:\n* ''label:text''\nReplace the default text ("contents") that appears above the TableOfContents listbox. //Note: to include spaces in the label text, you must enclose the entire parameter in quotes// (e.g., {{{"label:my list of tiddlers"}}})\n* ''sort:fieldtype''\nSets the initial display order for items in the listbox. 'fieldtype' is one of the following pre-defined keywords: ''title'', ''modified'' //(date)//, ''modifier'' //(author)//, ''tags'', ''missing'', ''orphans'', or ''system''\n* ''date:format''\nControls the formatting of dates in TableOfContents display. 'format' is a text-substitution template containing one or more of the following special notations.\n** DDD - day of week in full (eg, "Monday")\n** DD - day of month, 0DD - adds leading zero\n** MMM - month in full (eg, "July")\n** MM - month number, 0MM - adds leading zero\n** YYYY - full year, YY - two digit year\n** hh - hours\n** mm - minutes\n** ss - seconds\n//Note: to include spaces in the formatting template, you must enclose the entire parameter in quotes// (e.g., {{{"date:DDD, DD/MM/YY"}}})\n* ''size:nnn''\nSets the initial number of lines to display in the listbox. If this parameter is omitted or "size:1" is specified, a single-line droplist is created. When a size > 1 is provided, a standard, fixed-size scrollable listbox is created. You can use "size:0" or "size:auto" to display a varible-height listbox that automatically adjusts to fit the current list contents without scrolling.\n* ''width:nnn[cm|px|em|%]''\nSets the width of the listbox control. Overrides the built-in CSS width declaration (=100%). Use standard CSS width units (cm=centimeters, px=pixels, em=M-space, %=proportional to containing area). You can also use a ".TOCList" custom CSS class definition to override the built-in CSS declarations for the listbox.\n* ''hidelist''\nHides the listbox when the TableOfContents is first displayed. Initially, only the listbox label and size controls will appear. Clicking on the listbox label text will alternately show/hide the listbox display. //Note: this setting does not affect the content of the listbox, only whether or not it is initially visible.//\n* ''prompt''\nSets the non-selectable prompt text that is displayed as the first line of the listbox //(note: this feature is not supported by the listbox control on all browsers)//. Let's you include a short text message (such as "select a tiddler"), even when displaying a compact single-line droplist.\n* ''padding:nnn[cm|px|em|%]''\nOverrides default listbox control padding. Sets the CSS padding style.\n* ''margin:nnn[cm|px|em|%]''\nOverrides default listbox control spacing. Sets the CSS margin style.\n* ''inline''\nNormally, the TableOfContents plugin is contained inside a {{{<div>}}} element. This setting causes the plugin to use a {{{<span>}}} instead, allowing for more flexible 'inline' placement when embedded within other content.\n<<<\n!!!!!Examples\n<<<\n<<tableOfContents "label:all tiddlers" sort:title width:40% size:1>>\n<<tableOfContents "label:by date" sort:modified size:1 width:40%>>\n<<tableOfContents "label:tagged tiddlers" sort:tags size:1 width:40%>>\n<<tableOfContents "label:system tiddlers" sort:system size:1 width:40%>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TableOfContentsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for TableOfContents handling^^\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<tableOfContents>>}}} macro^^\n\n<<<\n!!!!!Revision History\n<<<\n''2006.05.21 [2.2.7]'' added onkeyup handling for enter key (=view selected tiddler, equivalent to double-click)\n''2006.02.14 [2.2.6]'' FF1501 fix: add 'var r' and 'var k' to unintended global variable declarations in refreshTOCList() and getTOCListFromButton(). Thanks for report from AndreasHoefler.\n''2006.02.04 [2.2.5]'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2005.12.21 [2.2.2]'' in onClickTOCList() and onDblClickTOCList(), prevent mouse events from 'bubbling' up to other handlers\n''2005.10.30 [2.2.1]'' in refreshTOCList(), fixed calculation of "showHidden" to check for 'readOnly' (i.e., "via HTTP") flag. Based on a report from LyallPearce\n''2005.10.30 [2.2.0]'' hide tiddlers tagged with 'excludeLists' (with option to override, i.e., "include hidden tiddlers")\n''2005.10.09 [2.1.0]'' combined documentation and code in a single tiddler\nadded click toggle for expand-all vs. show-one-branch\n''2005.08.07 [2.0.0]'' major re-write to not use static ID values for listbox controls, so that multiple macro instances can exist without corrupting each other or the DOM. Moved HTML and CSS definitions into plugin code instead of using separate tiddlers. Added macro parameters for label, sort, date, size, width, hidelist and showtabs\n''2005.08.03 [1.0.3]'' added "showtabs" optional parameter\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet(). Added show/hide toggle (click on 'contents' link)\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.tableOfContents = {major: 2, minor: 2, revision: 7, date: new Date(2006,5,21)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\n// define defaults for cookie-based option values\nif (config.options.txtTOCSortBy==undefined) config.options.txtTOCSortBy="modified";\nif (config.options.txtTOCListSize==undefined) config.options.txtTOCListSize=19;\nif (config.options.chkTOCShow==undefined) config.options.chkTOCShow=true;\nif (config.options.chkTOCIncludeHidden==undefined) config.options.chkTOCIncludeHidden=false;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTOCIncludeHidden>> include hidden tiddlers in TableOfContents";\n\n// define macro "tableOfContents" to render controls\nconfig.macros.tableOfContents = { label: "contents" };\nconfig.macros.tableOfContents.cmdMax=7;\n\nconfig.macros.tableOfContents.css = '\s\n.TOC { padding:0.5em 1em 0.5em 1em; }\s\n.TOC a { padding:0em 0.25em 0em 0.25em; color:inherit; }\s\n.TOCList { width: 100%; font-size:8pt; margin:0em; }\s\n';\n\nconfig.macros.tableOfContents.html = '\s\n<div style="text-align:right">\s\n <span style="float:left">\s\n <a href="JavaScript:;" id="TOCMenu" style="padding: 0em;"\s\n onclick="onClickTOCMenu(this)" title="show/hide table of contents">%label%</a>\s\n </span>\s\n <a href="JavaScript:;" id="TOCSmaller" style="display:inline"\s\n onclick="resizeTOC(this)" title="reduce list size">&#150;</a>\s\n <a href="JavaScript:;" id="TOCLarger"style="display:inline"\s\n onclick="resizeTOC(this)" title="increase list size">+</a>\s\n <a href="JavaScript:;" id="TOCMaximize"style="display:inline"\s\n onclick="resizeTOC(this)" title="maximize/restore list size">=</a>\s\n</div>\s\n';\n\nconfig.macros.tableOfContents.handler = function(place,macroName,params) { \n var parsedParams = new Array();\n parsedParams['label']=this.label;\n parsedParams['inline']=false;\n while (params.length>0) {\n if (params[0]=="label:none")\n parsedParams['label']="";\n else if (params[0].substr(0,6)=="label:")\n parsedParams['label']=params[0].substr(6);\n if (params[0].substr(0,7)=="prompt:")\n parsedParams['prompt']=params[0].substr(7);\n if (params[0].substr(0,8)=="padding:")\n parsedParams['padding']=params[0].substr(8);\n if (params[0].substr(0,7)=="margin:")\n parsedParams['margin']=params[0].substr(7);\n if (params[0].substr(0,5)=="sort:")\n parsedParams['sortby']=params[0].substr(5);\n if (params[0].substr(0,5)=="date:")\n parsedParams['date']=params[0].substr(5);\n if ((params[0]=="size:auto")||(params[0]=="size:0"))\n parsedParams['autosize']=true;\n else if (params[0] && (params[0].substr(0,5)=="size:"))\n parsedParams['requestedSize']=params[0].substr(5);\n if (params[0].substr(0,6)=="width:")\n parsedParams['width']=params[0].substr(6);\n if (params[0]=="hidelist")\n parsedParams['hidelist']=true;\n if (params[0]=="inline")\n parsedParams['inline']=true;\n params.shift(); \n }\n setStylesheet(config.macros.tableOfContents.css,"tableOfContents");\n var newTOC=createTiddlyElement(place,parsedParams['inline']?"span":"div",null,"TOC",null)\n if (parsedParams['margin']) { newTOC.style.margin=parsedParams['margin']; }\n if (parsedParams['padding']) { newTOC.style.padding=parsedParams['padding']; }\n if (parsedParams['label']!="") newTOC.innerHTML=config.macros.tableOfContents.html.replace(/%label%/,parsedParams['label']);\n var newTOCList=createTOCList(newTOC,parsedParams)\n refreshTOCList(newTOCList);\n store.addNotification(null,reloadTOCLists); // reload listbox after every tiddler change\n}\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onChangeTOCList=onChangeTOCList;\nwindow.onClickTOCList=onClickTOCList;\nwindow.onDblClickTOCList=onDblClickTOCList;\nwindow.reloadTOCLists=reloadTOCLists;\nwindow.refreshTOCList=refreshTOCList;\nwindow.onClickTOCMenu=onClickTOCMenu;\nwindow.resizeTOC=resizeTOC;\n \nfunction createTOCList(place,params)\n{\n var theList = createTiddlyElement(place,"select",null,"TOCList",params['prompt'])\n theList.onchange=onChangeTOCList;\n theList.onclick=onClickTOCList;\n theList.ondblclick=onDblClickTOCList;\n theList.onkeyup=onKeyUpTOCList;\n theList.style.display=config.options.chkTOCShow ? "block" : "none" ;\n theList.sortBy=config.options.txtTOCSortBy;\n theList.dateFormat="DD MMM YYYY";\n theList.requestedSize=config.options.txtTOCListSize;\n theList.expandall=false;\n if (params['sortby'])\n { theList.sortBy=params['sortby']; theList.noSortCookie=true; }\n if (params['date'])\n { theList.dateFormat=params['date']; }\n if (params['autosize'])\n { theList.autosize=true; theList.noSizeCookie=true; }\n if (params['requestedSize'])\n { theList.requestedSize=params['requestedSize']; theList.noSizeCookie=true; }\n if (params['width'])\n { theList.style.width=params['width']; }\n if (params['hidelist'])\n { theList.style.display ="none" ; theList.noShowCookie=true; }\n if (params['expandall'])\n { theList.expandall=true; }\n return theList;\n}\n\nfunction onChangeTOCList()\n{\n var thisTiddler=this.options[this.selectedIndex].value;\n if ((this.size==1)&&(thisTiddler!='')) story.displayTiddler(null,thisTiddler,1);\n refreshTOCList(this);\n return false;\n}\n\nfunction onClickTOCList(e)\n{\n\n if (!e) var e = window.event;\n if (this.size==1)\n return; // don't toggle display for droplist\n if (e.shiftKey)\n { this.expandall=!this.expandall; refreshTOCList(this);}\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();\n return true;\n}\n\nfunction onDblClickTOCList(e)\n{\n if (!e) var e = window.event;\n var thisTiddler=this.options[this.selectedIndex].value;\n if (thisTiddler!='') story.displayTiddler(null,thisTiddler,1);\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nfunction onKeyUpTOCList(e)\n{\n if (!e) var e = window.event;\n if (e.keyCode!=13) return true;\n var thisTiddler=this.options[this.selectedIndex].value;\n if (thisTiddler!='') story.displayTiddler(null,thisTiddler,1);\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nfunction reloadTOCLists()\n{\n var all=document.all? document.all : document.getElementsByTagName("*");\n for (var i=0; i<all.length; i++)\n if (all[i].className=="TOCList")\n { all[i].selectedIndex=-1; refreshTOCList(all[i]); }\n}\n\nfunction refreshTOCList(theList)\n{\n // DEBUG var starttime=new Date();\n var selectedIndex = theList.selectedIndex;\n if (selectedIndex==-1) selectedIndex=0;\n var sortBy = theList.sortBy;\n var showHidden = config.options.chkTOCIncludeHidden\n && !(config.options.chkHttpReadOnly && readOnly);\n\n if (selectedIndex==0) sortBy=theList.sortBy; // "nnn tiddlers" heading\n if (selectedIndex==1) sortBy='title';\n if (selectedIndex==2) sortBy='modified';\n if (selectedIndex==3) sortBy='modifier';\n if (selectedIndex==4) sortBy='tags';\n if (selectedIndex==5) sortBy='missing';\n if (selectedIndex==6) sortBy='orphans';\n if (selectedIndex==7) sortBy='system';\n if (selectedIndex>config.macros.tableOfContents.cmdMax)\n {\n if (theList.options[theList.selectedIndex].value=='')\n expandTOC(theList);\n return;\n }\n theList.sortBy = sortBy;\n if (!theList.noSortCookie)\n { config.options.txtTOCSortBy=sortBy; saveOptionCookie("txtTOCSortBy"); }\n\n // get the list of tiddlers and filter out 'hidden' tiddlers (i.e., tagged with "excludeLists")\n var tiddlers = [];\n switch (sortBy) {\n case "missing":\n tiddlers = store.getMissingLinks();\n break;\n case "tags":\n tiddlers = store.getTags();\n break;\n case "orphans":\n var titles = store.getOrphans();\n for (var t = 0; t < titles.length; t++)\n if (showHidden || store.getTiddler(titles[t]).tags.find("excludeLists")==null)\n tiddlers.push(titles[t]);\n break;\n case "system":\n var temp = store.getTaggedTiddlers("systemTiddlers");\n for (var t = 0; t < temp.length; t++)\n if (showHidden || temp[t].tags.find("excludeLists")==null)\n tiddlers.pushUnique(temp[t].title,true);\n var temp = store.getTaggedTiddlers("systemConfig");\n for (var t = 0; t < temp.length; t++)\n if (showHidden || temp[t].tags.find("excludeLists")==null)\n tiddlers.pushUnique(temp[t].title,true);\n for (var t in config.shadowTiddlers) tiddlers.pushUnique(t,true);\n tiddlers.sort();\n break;\n default:\n var temp = store.getTiddlers(sortBy);\n for (var t = 0; t < temp.length; t++)\n if (showHidden || temp[t].tags.find("excludeLists")==null)\n tiddlers.push(temp[t]);\n }\n\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n theList.saved=null;\n\n // add heading and control items to list\n var i=0;\n var theHeading=tiddlers.length+' tiddlers:';\n if (sortBy=='missing') theHeading=tiddlers.length+' missing tiddlers:';\n if (sortBy=='orphans') theHeading=tiddlers.length+' orphaned tiddlers:';\n if (sortBy=='tags') theHeading=tiddlers.length+' tags:';\n if (sortBy=='system') theHeading=tiddlers.length+' system tiddlers:';\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var sel=">";\n theList.options[i++]=new Option(theHeading,'',false,false);\n theList.options[i++]=new Option(((sortBy=="title")?sel:indent)+' [by title]','',false,false);\n theList.options[i++]=new Option(((sortBy=="modified")?sel:indent)+' [by date]','',false,false);\n theList.options[i++]=new Option(((sortBy=="modifier")?sel:indent)+' [by author]','',false,false);\n theList.options[i++]=new Option(((sortBy=="tags")?sel:indent)+' [by tags]','',false,false);\n theList.options[i++]=new Option(((sortBy=="missing")?sel:indent)+' [missing]','',false,false);\n theList.options[i++]=new Option(((sortBy=="orphans")?sel:indent)+' [orphans]','',false,false);\n theList.options[i++]=new Option(((sortBy=="system")?sel:indent)+' [system]','',false,false);\n // output the tiddler list\n switch(sortBy)\n {\n case "title":\n for (var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n // continue with same logic as for 'modifier'...\n case "modifier":\n var lastSection = "";\n for (var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sortBy=="modified") theSection = tiddler.modified.formatString(theList.dateFormat);\n if (sortBy=="modifier") theSection = tiddler.modifier;\n if (theSection != lastSection)\n {\n theList.options[i++] = new Option('+ '+theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n expandTOC(theList);\n break;\n case "tags":\n // tagged tiddlers, by tag\n var tagcount=0;\n var lastTag = null;\n for (var t = 0; t < tiddlers.length; t++) // actually a list of tags, not tiddlers...\n {\n var theTag = tiddlers[t][0];\n var tagged = new Array();\n var temp = store.getTaggedTiddlers(theTag);\n for(var r=0; r<temp.length; r++)\n if (showHidden || temp[r].tags.find("excludeLists")==null)\n tagged.push(temp[r]);\n if (tagged.length)\n {\n tagcount++;\n theList.options[i++]= new\n Option('+ '+theTag+" ("+tagged.length+")","",false,false);\n for(var r=0; r<tagged.length; r++)\n theList.options[i++] = new\n Option(indent+indent+tagged[r].title,tagged[r].title,false,false);\n }\n }\n // count untagged tiddlers\n var temp = store.getTiddlers("title");\n var c=0; for (var r=0; r<temp.length;r++) if (!temp[r].tags.length) c++;\n // create 'pseudo-tag' listing untagged tiddlers (if any)\n if (c>0)\n {\n theList.options[i++] = new Option("+ untagged ("+c+")","",false,false);\n for (var r=0; r<temp.length;r++) if (!temp[r].tags.length)\n theList.options[i++] = new\n Option(indent+indent+temp[r].title,temp[r].title,false,false);\n }\n theList.options[0].text=tagcount+' tags:';\n expandTOC(theList);\n break;\n case "missing":\n case "orphans":\n case "system":\n for (var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t],tiddlers[t],false,false);\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n // DEBUG var endtime=new Date();\n // DEBUG alert("refreshTOC() elapsed time: "+(endtime-starttime)+" msec");\n}\n\n// show/hide branch of TOCList based on current selection\nfunction expandTOC(theList)\n{\n var selectedIndex = theList.selectedIndex;\n if (selectedIndex==-1) selectedIndex=0;\n var sortBy = theList.sortBy;\n\n // don't collapse/expand list for alpha-sorted "flatlist" TOC contents\n if ((sortBy=="title")||(sortBy=="missing")||(sortBy=="orphans")||(sortBy=="system"))\n return;\n // or list control items\n if ((selectedIndex>0)&&(selectedIndex<=config.macros.tableOfContents.cmdMax))\n return;\n\n var theText = theList.options[selectedIndex].text;\n var theValue = theList.options[selectedIndex].value;\n // save fully expanded list contents (if not already saved)\n if (!theList.saved)\n {\n theList.saved = new Array();\n for (var i=0; i < theList.length; i++)\n {\n opt = theList.options[i];\n theList.saved[i] = new Option(opt.text, opt.value, opt.defaultSelected, opt.selected);\n }\n }\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n\n // put back all items \n if (theList.expandall)\n {\n var i=0;\n for (var t=0; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n if (opt.text==theText) selectedIndex=i-1;\n }\n theList.selectedIndex = selectedIndex;\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n return;\n }\n\n // put back heading items until item text matches current selected heading\n var i=0;\n for (var t=0; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n if (opt.value=='')\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n if (opt.text==theText)\n break;\n }\n selectedIndex=i-1; // this is the NEW index of the current selected heading\n // put back items with value!='' until value==''\n for ( t++; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n if (opt.value!='')\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n if (opt.value=='')\n break;\n }\n // put back remaining items with value==''\n for ( ; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n if (opt.value=='')\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n }\n theList.selectedIndex = selectedIndex;\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n}\n\n// these functions process clicks on the 'control links' that are displayed above the listbox\nfunction getTOCListFromButton(which)\n{\n var theList = null;\n switch (which.id)\n {\n case 'TOCMenu':\n var theSiblings = which.parentNode.parentNode.parentNode.childNodes;\n var thePlace=which.parentNode.parentNode.parentNode.parentNode.parentNode.id;\n break;\n case 'TOCSmaller':\n case 'TOCLarger':\n case 'TOCMaximize':\n var theSiblings = which.parentNode.parentNode.childNodes;\n var thePlace=which.parentNode.parentNode.parentNode.parentNode.id;\n break;\n }\n for (var k=0; k<theSiblings.length; k++)\n if (theSiblings[k].className=="TOCList") { theList=theSiblings[k]; break; }\n // DEBUG if (theList) alert('found '+theList.className+' for '+which.id+' button in '+thePlace);\n return theList;\n}\n\nfunction onClickTOCMenu(which)\n{\n var theList=getTOCListFromButton(which);\n if (!theList) return;\n var opening = theList.style.display=="none";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theList,opening,false,"none"));\n else\n theList.style.display = opening ? "block" : "none" ;\n if (!theList.noShowCookie)\n { config.options.chkTOCShow = opening; saveOptionCookie("chkTOCShow"); }\n return(false);\n}\n\nfunction resizeTOC(which)\n{\n var theList=getTOCListFromButton(which);\n if (!theList) return;\n\n var size = theList.size;\n if (theList.style.display=="none") // make sure list is visible\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theList,true,false,"none"));\n else\n theList.style.display = "block" ;\n switch (which.id)\n {\n case 'TOCSmaller': // decrease current listbox size\n if (theList.autosize) { theList.autosize=false; size=config.options.txtTOCListSize; }\n if (size==1) break;\n size -= 1; // shrink by one line\n theList.requestedSize = theList.size = size;\n break;\n case 'TOCLarger': // increase current listbox size\n if (theList.autosize) { theList.autosize=false; size=config.options.txtTOCListSize; }\n if (size>=theList.options.length) break;\n size += 1; // grow by one line\n theList.requestedSize = theList.size = size;\n break;\n case 'TOCMaximize': // toggle autosize\n theList.autosize = (theList.size!=theList.options.length);\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n break;\n }\n if (!theList.noSizeCookie && !theList.autosize)\n { config.options.txtTOCListSize=size; saveOptionCookie("txtTOCListSize"); }\n}\n//}}}\n
/***\n''Plugin:'' Tag Cloud Macro\n''Author:'' Clint Checketts\n''Source URL:''\n\n!Usage\n<<tagCloud>>\n\n!Code\n***/\n//{{{\nversion.extensions.tagCloud = {major: 1, minor: 0 , revision: 0, date: new Date(2006,2,04)};\n//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman\n\nconfig.macros.tagCloud = {\n noTags: "No tag cloud created because there are no tags.",\n tooltip: "%1 tiddlers tagged with '%0'"\n};\n\nconfig.macros.tagCloud.handler = function(place,macroName,params) {\n \nvar tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);\n\nvar tags = store.getTags();\nfor (var t=0; t<tags.length; t++) {\n for (var p=0;p<params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = "";\n}\n\n if(tags.length == 0) \n createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);\n //Findout the maximum number of tags\n var mostTags = 0;\n for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n if (tags[t][1] > mostTags) mostTags = tags[t][1];\n }\n //divide the mostTags into 4 segments for the 4 different tagCloud sizes\n var tagSegment = mostTags / 4;\n\n for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n var tagCloudElement = createTiddlyElement(tagCloudWrapper,"span",null,null,null);\n tagCloudWrapper.appendChild(document.createTextNode(" "));\n var theTag = createTiddlyButton(tagCloudElement,tags[t][0],this.tooltip.format(tags[t]),onClickTag,"tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1));\n theTag.setAttribute("tag",tags[t][0]);\n }\n\n};\n\nsetStylesheet(".tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}","tagCloudsStyles");\n//}}}
!!!SAMPLE: sliderframe\n<<tiddler SliderFrame with: TiddlyWiki http://www.tiddlywiki.com 500>>\n\n!!!SAMPLE: open tiddlers: folded/unfolded\nopen tiddlers: <<tiddler OpenTiddlers with: "unfolded" "About Contact LegalStatements">> <<tiddler OpenTiddlers with: "folded" "About Contact LegalStatements" CollapsedTemplate>>\n\n!!!SAMPLE: remote click a slider button\n+++[label]...\n slider contents\n goes here\n===<script>place.lastChild.button.id="slider_button_id"</script>\n\n<script label="toggle slider panel">\n var e=document.getElementById("slider_button_id");\n if (e && e.sliderPanel) window.onClickNestedSlider({target:e});\n</script>\n\n!!!EXPERIMENT: fold tiddlers instead of closing them.\n{{{\n<script show>\n if (story.neverClose_coreClose==undefined) {\n story.neverClose_coreClose=story.closeTiddler;\n story.closeTiddler=function(t,a,s) {\n var tid=store.getTiddler(t);\n if (tid && tid.tags && !tid.tags.contains("neverclose")) return this.neverClose_coreClose(t,a,s);\n if (config.commands.collapseTiddler!=undefined)\n config.commands.collapseTiddler.handler(null,document.getElementById(story.idPrefix+t),t);\n }\n }\n</script>\n}}}\n\n!!!EXPERIMENT: style viewers\n<script>\nvar elems=document.getElementsByTagName("*");\nvar out='<html><form>';\nout+='<select size=1 name=elems style="width:100%" ';\nout+=' onchange="this.form.css.value=this.form.obj.value=\s'\s'; if (!this.value.length) return;';\nout+=' var e=document.getElementById(this.value);';\nout+=' this.form.css.value=\s'#%0 { %1 }\s'.format([this.value,e.style.cssText]);';\nout+=' this.form.obj.value=config.macros.tidIDE.showObject(e.style)">';\nout+='<option value=\s'\s'>select an element ID...</option>';\nfor (var i=0;i<elems.length;i++) { if (elems[i].id.length) out+='<option value="%0">ID: %0</option>'.format([elems[i].id]); }\nout+='</select><br>';\nout+='<textarea name=css rows=15 style="width:100%;height:15em"';\nout+=' onkeyup="if (event.ctrlKey && event.keyCode==13) this.form.go.click()"></textarea><br>';\nout+='<center><input type=button name=go value="apply styles" onclick="setStylesheet(this.form.css.value,\s'testStyles\s')"></center>';\nout+='<textarea name=obj rows=15 style="display:none;width:100%;height:15em"></textarea>';\nout+='</form></html>';\nreturn out;\n</script>
/***\n''TextAreaPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#TextAreaPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nThis plugin 'hijacks' the TW core function, ''Story.prototype.focusTiddler()'', so it can add special 'keyDown' handlers to adjust several behaviors associated with the textarea control used in the tiddler editor. Specifically, it:\n* Option to set cursor at top of edit field instead of auto-selecting contents\s\n* Option to disable use of the ESC key to cancel editing\n* Adds text search INSIDE of edit fields.^^\nUse ~CTRL-F for "Find" (prompts for search text), and ~CTRL-G for "Find Next" (uses previous search text)^^\n* Enables TAB characters to be entered into field content^^\n(instead of moving to next field)^^\n\n!!!!!Configuration\n<<<\n<<option chkDisableEscapeKey>> don't cancel editor when ''escape'' key is pressed\n<<option chkTextAreaExtensions>> add control-f (find), control-g (find again) and allow TABs as input in textarea\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''TextAreaPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.08.01 [1.1.2]'' improved processed() utility function to handle IE5 and IE6, as well as calling preventDefault() for moz browsers. Thanks to Bradley Meck for research and code examples.\n''2006.07.09 [1.1.1]'' removed chkDisableAutoSelect\n''2006.02.14 [1.1.0]'' added option for chkDisableEscapeKey (default is standard action)\n''2006.01.22 [1.0.1]'' only add extra key processing for TEXTAREA elements (not other edit fields).\nadded option to enable/disable textarea keydown extensions (default is "standard keys" only)\n''2006.01.22 [1.0.0]'' Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.textAreaPlugin= {major: 1, minor: 1, revision: 2, date: new Date(2006,8,1)};\n//}}}\n\n//{{{\nif (!config.options.chkTextAreaExtensions) config.options.chkTextAreaExtensions=false; // default to standard action\nif (!config.options.chkDisableEscapeKey) config.options.chkDisableEscapeKey=false; // default to standard action\n\n// Focus a specified tiddler. Attempts to focus the specified field, otherwise the first edit field it finds\nStory.prototype.focusTiddler = function(title,field)\n{\n var tiddler = document.getElementById(this.idPrefix + title);\n if(tiddler != null)\n {\n var children = tiddler.getElementsByTagName("*")\n var e = null;\n for (var t=0; t<children.length; t++)\n {\n var c = children[t];\n if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea")\n {\n if(!e)\n e = c;\n if(c.getAttribute("edit") == field)\n e = c;\n }\n }\n if(e)\n {\n e.focus();\n e.select(); // select entire contents\n if (config.options.chkTextAreaExtensions) // TWEAK: add TAB and "find" key handlers\n addKeyDownHandlers(e);\n }\n }\n\n tiddler.onkeypress = function(e) {\n if (!e) var e = window.event;\n clearMessage();\n var consume = false;\n switch(e.keyCode)\n {\n case 13: // Ctrl-Enter\n case 10: // Ctrl-Enter on IE PC\n case 77: // Ctrl-Enter is "M" on some platforms\n if(e.ctrlKey)\n {\n story.blurTiddler(this.title);\n config.macros.toolbar.invokeCommand(this,"defaultCommand",e);\n consume = true;\n }\n break;\n case 27: // Escape\n if (config.options.chkDisableEscapeKey) break; // ignore ESCAPE if option is set\n story.blurTiddler(this.title);\n config.macros.toolbar.invokeCommand(this,"cancelCommand",e);\n consume = true;\n break;\n }\n e.cancelBubble = consume;\n if(consume)\n if (e.stopPropagation) e.stopPropagation();\n return(!consume);\n };\n}\n//}}}\n\n//{{{\nfunction addKeyDownHandlers(e)\n{\n // exit if not textarea or element doesn't allow selections\n if (e.tagName.toLowerCase()!="textarea" || !e.setSelectionRange) return;\n\n // utility function: exits keydown handler and prevents browser from processing the keystroke\n var processed=function(ev) {\n ev.cancelBubble=true; // IE4+\n try{event.keyCode=0;}catch(e){}; // IE5\n if (window.event) ev.returnValue=false; // IE6\n if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror\n if (ev.stopPropagation) ev.stopPropagation(); // all\n return false;\n }\n\n // capture keydown in edit field\n e.onkeydown=function(ev) { if (!ev) var ev=window.event;\n var key=ev.keyCode;\n if (!key) {\n var char=event.which?event.which:event.charCode;\n if (char==102) key=70;\n if (char==103) key=71;\n }\n\n // process TAB\n if (!ev.shiftKey && key==9) { \n // replace current selection with a TAB character\n var start=e.selectionStart; var end=e.selectionEnd;\n e.value=e.value.substr(0,start)+String.fromCharCode(9)+e.value.substr(end);\n // update insertion point, scroll it into view\n e.setSelectionRange(start+1,start+1);\n var linecount=e.value.split('\sn').length;\n var thisline=e.value.substr(0,e.selectionStart).split('\sn').length-1;\n e.scrollTop=Math.floor((thisline-e.rows/2)*e.scrollHeight/linecount);\n return processed(ev);\n }\n\n // process CTRL-F (find matching text) or CTRL-G (find next match)\n if (ev.ctrlKey && (key==70||key==71)) {\n // if ctrl-f or no previous search, prompt for search text (default to previous text or current selection)... if no search text, exit\n if (key==70||!e.find||!e.find.length)\n { var f=prompt("find:",e.find?e.find:e.value.substring(e.selectionStart,e.selectionEnd)); e.focus(); e.find=f?f:e.find; }\n if (!e.find||!e.find.length) return processed(ev);\n // do case-insensitive match with 'wraparound'... if not found, alert and exit \n var newstart=e.value.toLowerCase().indexOf(e.find.toLowerCase(),e.selectionStart+1);\n if (newstart==-1) newstart=e.value.toLowerCase().indexOf(e.find.toLowerCase());\n if (newstart==-1) { alert("'"+e.find+"' not found"); e.focus(); return processed(ev); }\n // set new selection, scroll it into view, and report line position in status bar\n e.setSelectionRange(newstart,newstart+e.find.length);\n var linecount=e.value.split('\sn').length;\n var thisline=e.value.substr(0,e.selectionStart).split('\sn').length;\n e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);\n window.status="line: "+thisline+"/"+linecount;\n return processed(ev);\n }\n }\n}\n//}}}
[[StyleSheetAdjustments]]\n/* ==== Textures ==== */\n/*{{{*/\nbody\n { background-image: url('[[TexturesStucco]]'); background-color:#eee; }\n.tagging, .tagged\n { background-color: transparent; border: 1px solid #ccc; }\n.selected .tagging, .selected .tagged\n { background-image: url('[[TexturesParchment]]'); background-color:#edb; border: 1px solid #999; }\n.menubox\n { background-image: url('[[TexturesParchmentGray]]'); background-color:#fff; }\n.viewer\n { background-image: url('[[TexturesParchmentGray]]'); background-color:#fff; border: 1px solid #999; -moz-border-radius:1em; padding:1em; }\n.groupbox\n { background-image: url('[[TexturesParchment]]'); background-color:#ffe; }\n.header\n { background-image: url('[[TexturesMarbleBlack]]'); background-color:#111; border-bottom:5px solid #090; color:#0c0 !important; }\n.header a\n { color: #6f6; }\n.floatingPanel, #messageArea, .attachPanel, #importPanel, #exportPanel, #sidebarTabs .tabContents \n { background: #eee; background-image: url('[[TexturesParchmentGray]]');}\n.tiddlyCard { background:#ffd; }\n\n.viewer h1,.viewer h2,.viewer h3,.viewer h4,.viewer h5 { background: #666; color:#fff; }\n#sidebarTabs .tabContents\n { background-image: url('[[TexturesParchmentGray]]'); background-color:#fff; }\n\n/*}}}*/
| source file|{{{...images\smarble_black.jpg}}}|\n| attached on|14 July 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/marble_black.jpg|images/marble_black.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|TexturesMarbleBlack]] or [img[tooltip|TexturesMarbleBlack][link]]}}}\n[img[tooltip|TexturesMarbleBlack]]\n<<<\n
| source file|{{{...images\sparchment.jpg}}}|\n| attached on|14 July 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/parchment.jpg|images/parchment.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|TexturesParchment]] or [img[tooltip|TexturesParchment][link]]}}}\n[img[tooltip|TexturesParchment]]\n<<<\n
| source file|{{{...images\sparchment_gray.jpg}}}|\n| attached on|14 July 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/parchment_gray.jpg|images/parchment_gray.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|TexturesParchmentGray]] or [img[tooltip|TexturesParchmentGray][link]]}}}\n[img[tooltip|TexturesParchmentGray]]\n<<<\n
| source file|{{{D:\shtml\stiddlytools\simages\sstucco.gif}}}|\n| attached on|14 July 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/stucco.gif|images/stucco.gif]]|\nimage\n<<<\nusage: {{{[img[tooltip|TexturesStucco]] or [img[tooltip|TexturesStucco][link]]}}}\n[img[tooltip|TexturesStucco]]\n<<<\n
+++^70%^[TidIDE|TiddlyWiki Integrated Development Environment]...\n {{small{<<moveablePanel>><<tidIDE TidIDETools TidIDETrac system edit:here>>}}}===\n<script>var here=story.findContainingTiddler(place); if (here) place.lastChild.previousSibling.innerHTML=here.id.substr(7);</script>
<div class='toolbar' macro='toolbar -cancelTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='viewer' macro='tidIDE system +edit:here'></div>
/***\n''TidIDEPlugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#TidIDEPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\n~TidIDE (//prounounced "Tie Dyed"//) - ''Tid''dlyWiki ''I''ntegrated ''D''evelopment ''E''nvironment - tools for ~TiddlyWiki authors and editors. Includes full-featured tiddler editor with previewer, system configuration/display, and extensibility via custom tiddlers.\n!!!!!Configuration\n<<<\nAutomatically freeze preview updates when a tiddler takes more than <<option txtTidIDEAutoFreeze>> milliseconds to render.\n<<<\n!!!!!Usage/Example\n<<<\n{{{<<tidIDE id:example [[custom tools|TidIDETools]] system +edit:GettingStarted>>}}}\n<<tidIDE id:example [[custom tools|TidIDETools]] system +edit:GettingStarted>>\n!!!!!parameters:\n* ''id'' - assign a unique ID to this instance of TidIDE. (default id=current tiddler title or "" if not in a tiddler)\n* ''system'' includes a pre-defined "system information" panel\n* ''edit'' includes a pre-defined tiddler editor/previewer.\n**''edit:here'' automatically sets the editor to show the current tiddler contents (if in a tiddler)\n**''edit:{{{tiddlertitle}}}'' automatically sets the editor to show the specified tiddler contents\n* use ''{{{[[label|tiddlertitle]]}}}'' to include 'custom panels' (and corresponding labelled checkboxes to toggle their display)\n* all parameters are optional. The default panel is "edit:here".\n* panel parameters preceded by a "+" are displayed by default. If only one panel specified in the parameters, it is automatically displayed, even if the "+" is omitted.\n!!!!!using the editor\nThe editor includes a droplist of all tiddlers in the document, sorted alpha-numerically by tiddler title. Shadow tiddlers that have not been customized are added to the end of this list and marked with "(shadow)". Next to the droplist are several buttons:\n* ''view'' opens the tiddler in the normal ~TiddlyWiki display area\n* ''add'' prompts for a new tiddler title and begins a new editing session\n* ''remove'' deletes an existing tiddler (note: shadow tiddlers cannot be removed)\n* ''save'' saves changes to the tiddler currently being edited\n* ''save as'' saves changes using a new tiddler title\nIf a tiddlername was not specified in the macro, select a tiddler from the droplist (or press ''add'') to begin editing. Once a tiddler has been loaded into the editor, you can change it's content, enter or select tags.\n\nNormally, when you save changes to a tiddler, the created/modified dates and tiddler author are automatically updated. However, it is sometimes useful to make small changes to a tiddler without automatically updating the date/author information. Select the ''minor edits'' checkbox to prevent those values from being //automatically// changed. In addition, this enables the date/author edit fields which allows you to //manually// 'back date' a tiddler or change the author to another name. When the tiddler is saved, the date/author values shown in the edit fields will be used.\n!!!!!using the previewer\nThe ''preview'' checkbox adds a display area that shows you what your tiddler changes will look like, //before// committing to those changes.\n\nBy default, this preview display is automatically rendered each time a key is typed into the tiddler content edit field. As soon as changes are entered, they will be instantly visible within the preview display. Unfortunately, the partial tiddler source definitions that occur //during// editing may somtimes cause rendering problems, and some exceptionally complex tiddlers make take an unusually long amount of time to completely render their content. In such cases, key-by-key display updates are undesirable or impractical.\n\nWhen ''preview'' is selected, you can also select ''freeze'' to suspend automatic key-by-key preview display updates. The preview display will not be re-rendered again until you press the ''refresh'' button, or clear the 'freeze' checkbox, or switch to editing a different tiddler. The editor automatically freezes the preview display whenever the //rendering time// exceeds a pre-determined time limit (see configuration section), specified in milliseconds. Note: the ''actual elapsed time'' used to process and render any given tiddler is reported in the browser's status bar area whenever that tiddler is previewed.\n\nThe previewer also can display a ''DOM viewer'' and an ''HTML viewer'' that are also updated with each keystroke. These text-based displays can be helpful while attempting to correct or enhance the formatting of tiddler content, especially when complex combinations of wiki-syntax produce unexpected or undesired results.\n!!!!!system information and TW option settings\nYou can use the ''system information'' panel to view a variety of system internal data and functions, and view/modify ''all'' of ~TiddlyWiki's internal config.option.* settings. NOTE: Non-default config.options are stored in cookies and are retrieved whenever the TW document is loaded into a browser; however, ''core TW functions and custom-defined plugins can explicitly ignore or reset any locally-stored cookie values and use their own, internally-defined values'' instead. As a result, changes to these may be completely ignored, or may only have an effect during the current TW document "session" (i.e., until the TW document is reloaded), even though a persistent cookie value has been saved.\n!!!!! ~DOMViewer macro\nsyntax: {{{<<DOMViewer rows:nn indent:xxxx inline path elementID|tiddlertitle>>}}}\n\nWhenever TiddlyWiki renders a given tiddler, it creates a 'tree' of DOM (Document Object Model) elements that represent the information that is displayed by the browser. You can use the ''DOMViewer'' macro to examine the internal DOM elements that are produced by TiddlyWiki's formatter (the 'wikifier'), or elements directly produced by embedded macros that create custom formatted output. This can be particularly helpful when trying to fine tune the layout and appearance of your tiddler content.\n\nDOMViewer creates a textarea control and reports the DOM tree for the current 'insertion point' where the DOMViewer macro is being placed. ''inline'' flag uses TiddlyWiki rendering instead of textarea control. ''path'' shows the relative location of each child element in the DOM tree, using subscript notation, ''[elementID or tiddlertitle]'' displays DOM elements starting from the node with the specified ID. If that ID is not found in the DOM tree, the macro attempts to open a tiddler with that title and then displays the "tiddler"+title DOM elements that were rendered.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TidIDEPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for macro handling^^\n<<<\n!!!!!Revision History\n<<<\n''2006.08.15 [1.5.6]'' in handler(), supress header/selectors if only one panel to display. Also, init system_panel as needed.\n''2006.08.04 [1.5.5]'' in handler(), fix construction of tiddler list to permit use of apostrophes (') in tiddler names.\n''2006.05.22 [1.5.4]'' in setsys(), remove "(cookie)" prefix from selected item text when setting cookie name (was preventing saving of cookie values)\n''2006.05.17 [1.5.3]'' in setsys(), call saveOptionsCookie(). Also, set tiddler editor textarea height (%maxrows%) using config.options.txtMaxEditRows\n''2006.04.30 [1.5.2]'' documentation update\n''2006.04.30 [1.5.1]'' in save(), when performing "save as" behavior, set current tiddler title (f.current) to new title\n''2006.04.24 [1.5.0]'' added macro parameters to dynamically configure and assemble HTML for IDE panels. Supports multiple custom panels loaded from tiddlers and {{{[[label|tiddlername]]}}}\n''2006.04.24 [1.4.6]'' layout adjustments: move system panel above editor panel and move config setting controls to top of system panel\n''2006.04.23 [1.4.5]'' fix HTML so that click on "readonly" checkbox won't change "minor edits" option value.\n''2006.04.23 [1.4.4]'' in render(), strip carriage returns (\sr) that are added by IE's textarea control. Fixes errors in wikify() of 'block-mode' syntax. Also, defer rendering HTML and DOM preview displays until those options are checked and still more code cleanup\n''2006.04.23 [1.4.3]'' init "minor edits" checkbox state from config.options.chkForceMinorEdits value\n''2006.04.23 [1.4.2]'' added "TidIDE v#.#.#: " title in front of subsystem checkboxes.\n''2006.04.23 [1.4.1]'' added 'readonly' checkbox and handling to editor.\n''2006.04.23 [1.4.0]'' implemented 'minor edits' logic, including use of TW AdvancedOptions setting. Replaced separate MDY date input fields with date/time text input fields (using formatted date input).\n''2006.04.22 [1.3.2]'' Layout changes: Added editor/system/tools "subsystem" checkboxes at top of panel. Added automatic read-only notice. Moved tools_panel to bottom. Added 'minor edits' checkbox (handler not yet implemented).\n''2006.04.22 [1.3.1]'' assorted code cleanup and optimizations\n''2006.04.22 [1.3.0]'' added "tools" section via custom-defined TidIDETools tiddler content\n''2006.04.22 [1.2.2]'' corrected 'wrap' and 'white-space' CSS for system viewer textarea control so that IE preserves newlines.\n''2006.04.22 [1.2.1]'' added checkbox indicators in options droplist. Allows easy preview of boolean state value for chk* options.\n''2006.04.22 [1.2.0]'' added options droplist to "system" display and supporting setsys() function to update internal config.options.* values\nlayout adjustments: consolidate some buttons, general tweaks for spacing, sizes, etc.\n''2006.04.21 [1.1.1]'' migrated remaining functionality from ToolkitPlugin (now obsolete).\n''2006.04.21 [1.1.0]'' added "system" display and supporting functions\n''2006.04.21 [1.0.1]'' added formatHTML() for better HTML display in preview\n''2006.04.20 [1.0.0] 4:20:00pm'' official release... renamed from ~TiddlerEditorPlugin to TidIDEPlugin. (pronounced "Tie Dyed"... dude!)\n''2006.04.20 [0.9.9]'' added "run" button to dynamically load systemConfig plugins (with warning/confirmation)\n''2006.04.20 [0.9.8]'' layout adjustments for narrow displays\n''2006.04.20 [0.9.7]'' added HTML viewer to preview display\n''2006.04.20 [0.9.6]'' added DOM viewer to preview display\n''2006.04.19 [0.9.5]'' improved save() handler so saving 'unnamed' edit does fallback to 'save as' prompt for tiddler name\n''2006.04.19 [0.9.4]'' added 'preview status' display field and refresh button. Currently shows preview rendering time and autofreeze notice, if any.\n''2006.04.19 [0.9.3]'' correct IE object error by explicitly using "window." scope when referencing addKeyDownHandlers() function definition\n''2006.04.18 [0.9.2]'' if TextAreaPlugin is installed, call addKeyDownHandlers() for extended ctrl-F/G and TAB keystrokes in textarea\n''2006.04.18 [0.9.1]'' "save as" now presents an "overwriteWarning" message box instead of always rejecting existing tiddler titles\n''2006.04.18 [0.9.0]'' added "save as". Use TW standard text for new tiddler title and default text\n''2006.04.18 [0.8.5]'' added "display:inline" to input elements to prevent unwanted line breaks between controls when macro is used in EditTemplate definitions\n''2006.04.18 [0.8.4]'' added cookie for 'auto-freeze' time limit. Also, added more documentation.\n''2006.04.17 [0.8.3]'' added timing wrapper around preview wikify(). Automatically freeze preview display if tiddler rendering exceeds time limit\n''2006.04.17 [0.8.2]'' more code cleanup for better 'dirty' flag handling\n''2006.04.17 [0.8.1]'' show/hide freeze checkbox when toggling preview display. Also, code cleanup for better 'multiple instance' definition\n''2006.04.17 [0.8.0]'' added "freeze" checkbox to toggle 'live update' of preview display. Also, layout/CSS adjustments for better appearance in IE\n''2006.04.16 [0.7.1]'' correct month number offset (was 0-11 instead of 1-12)\n''2006.04.16 [0.7.0]'' added support for 'dirty' flag, read-only mode and improved alert/confirm/prompt handling\n''2006.04.16 [0.6.0]'' created "add/remove" functions. Added handling to trigger autoSave() if option is set.\n''2006.04.15 [0.5.1]'' move 'save' logic to separate function, and added handling to create a 'real' tiddler when saving a shadow\n''2006.04.15 [0.5.0]'' Initial ALPHA release. Converted from TiddlerTweaker inline script.\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n// // version info\n//{{{\nversion.extensions.tidIDE = {major: 1, minor: 5, revision: 5, date: new Date(2006,8,4)};\n//}}}\n\n// // macro definition\n//{{{\nconfig.macros.tidIDE = {\n versionMsg: "TidIDE v%0.%1.%2: ",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss",\n titleMsg: "Please enter a new tiddler title",\n isShadowMsg: "'%0' is a shadow tiddler and cannot be removed.",\n renderMsg: "rendering preview...",\n timeoutMsg: " (> %0ms)",\n freezeMsg: " - preview is frozen. Press [refresh] to re-display.",\n evalMsg: "Warning!!\sn\snThis action will process '%0' as a systemConfig (plugin) tiddler, and may produce unexpected results!\sn\snAre you sure you want to proceed?",\n toolsDef: "<html><a href='javascript:config.macros.tidIDE.set(\s"%0\s",\s"%1\s");'>edit %1...</a></html>",\n editorLabel: "tiddler editor",\n systemLabel: "system information"\n};\nconfig.macros.tidIDE.handler= function(place,macroName,params) {\n var here=story.findContainingTiddler(place);\n var selectors="";\n var panels="";\n var showsys=false;\n var title="";\n var id=""; if (here) id=here.id.substr(7);\n var p=params.shift();\n if (!p) p="edit:here"; // default to editor if no params\n var panelcount=0;\n while (p) {\n var defOpen=(p.substr(0,1)=="+"); if (defOpen) p=p.substr(1);\n if (p.substr(0,3)=="id:")\n { id=p.substr(3); }\n else if (p.substr(0,4)=="edit") {\n panelcount++;\n defOpen=defOpen || (!params[0] && panelcount==1); // if only one panel to show, default to open\n var toolname=this.editorLabel;\n if (p.indexOf('|')!=-1) toolname=p.substr(0,p.indexOf('|'));\n selectors+=this.html.editorchk.replace(/%toolname%/mg,toolname);\n selectors=selectors.replace(/%showpanel%/mg,defOpen?"CHECKED":"");\n panels+=this.html.editorpanel;\n // editor panel setup...\n panels=panels.replace(/%showpanel%/mg,defOpen?"block":"none");\n panels=panels.replace(/%maxrows%/mg,config.options.txtMaxEditRows);\n panels=panels.replace(/%disabled%/mg,readOnly?"DISABLED":"");\n panels=panels.replace(/%readonlychk%/mg,readOnly?"CHECKED":"");\n panels=panels.replace(/%minoredits%/mg,config.options.chkForceMinorUpdate&&!readOnly?"":"DISABLED");\n panels=panels.replace(/%minorchk%/mg,config.options.chkForceMinorUpdate?"CHECKED":"");\n var tiddlers=store.getTiddlers("title"); var tiddlerlist=""; \n for (var t=0; t<tiddlers.length; t++)\n tiddlerlist+='<option value="'+tiddlers[t].title+'">'+tiddlers[t].title+'</option>';\n for (var t in config.shadowTiddlers)\n if (!store.tiddlerExists(t)) tiddlerlist+="<option value='"+t+"'>"+t+" (shadow)</option>";\n panels=panels.replace(/%tiddlerlist%/mg,tiddlerlist);\n var tags = store.getTags(); var taglist="";\n for (var t=0; t<tags.length; t++)\n taglist+="<option value='"+tags[t][0]+"'>"+tags[t][0]+"</option>";\n panels=panels.replace(/%taglist%/mg,taglist);\n if (p.substr(0,5)=="edit:") { \n title=p.substr(5); \n if (here && title=="here") title=here.id.substr(7);\n if (!store.tiddlerExists(title)&&!store.isShadowTiddler(title)) title="";\n }\n }\n else if (p=="system") {\n panelcount++;\n defOpen=defOpen || (!params[0] && panelcount==1); // if only one panel to show, default to open\n var toolname=this.systemLabel;\n showsys=defOpen;\n if (p.indexOf('|')!=-1) toolname=p.substr(0,p.indexOf('|'));\n selectors+=this.html.systemchk.replace(/%toolname%/mg,toolname);\n selectors=selectors.replace(/%showpanel%/mg,defOpen?"CHECKED":"");\n panels+=this.html.systempanel;\n panels=panels.replace(/%showpanel%/mg,defOpen?"block":"none");\n }\n else {\n panelcount++;\n defOpen=defOpen || (!params[0] && panelcount==1); // if only one panel to show, default to open\n var toolid=toolname=p;\n if (p.indexOf('|')!=-1)\n { toolname=p.substr(0,p.indexOf('|')); toolid=p.substr(p.indexOf('|')+1); }\n selectors+=this.html.toolschk.replace(/%toolid%/mg,toolid).replace(/%toolname%/mg,toolname);\n selectors=selectors.replace(/%showpanel%/mg,defOpen?"CHECKED":"");\n panels=panels.replace(/%showpanel%/mg,defOpen?"block":"none");\n panels+=this.html.toolspanel.replace(/%toolid%/mg,toolid);\n }\n p=params.shift(); // next param\n }\n var html=this.html.framework;\n if (panelcount<2)\n html=html.replace(/%version%/mg,'').replace(/%selector%/mg,''); // omit header/selectors if just one panel to display\n else {\n html=html.replace(/%version%/mg,\n this.versionMsg.format([version.extensions.tidIDE.major,version.extensions.tidIDE.minor,version.extensions.tidIDE.revision]));\n html=html.replace(/%selector%/mg,selectors+"<hr style='margin:0;padding:0'>");\n }\n html=html.replace(/%panels%/mg,panels);\n html=html.replace(/%id%/mg,id);\n var newIDE=createTiddlyElement(place,"span");\n newIDE.innerHTML=html;\n if (title.length) this.set(id,title); // pre-load tiddler editor (if needed)\n if (showsys) config.macros.tidIDE.getsys(id); // pre-load system information (if needed)\n // see [[TextAreaPlugin]] for extended ctrl-F/G (search/search again) and TAB handler definitions\n if (window.addKeyDownHandlers!=undefined) { \n var elems=newIDE.getElementsByTagName("textarea");\n for (var i=0;i<elems.length;i++) window.addKeyDownHandlers(elems[i]);\n }\n}\n//}}}\n\n// // CUSTOM PANEL FUNCTIONS \n//{{{\nconfig.macros.tidIDE.loadPanel=function(id,toolid) {\n var place=document.getElementById(id+"_"+toolid+"_panel"); if (!place) return;\n var t=store.getTiddler(toolid);\n place.innerHTML=""; \n if (t) wikify(t.text,place); else place.innerHTML=this.toolsDef.format([id,toolid]);\n}\n//}}}\n\n// // EDITOR PANEL FUNCTIONS\n//{{{\nconfig.macros.tidIDE.set=function(id,title) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var p=document.getElementById(id+"_preview");\n if (f.dirty && !confirm(config.commands.cancelTiddler.warning.format([f.current]))) return;\n // reset to form defaults\n f.dirty=false;\n f.current="";\n f.created.value=f.created.defaultValue;\n f.modified.value=f.modified.defaultValue;\n f.author.value=f.author.defaultValue;\n f.content.value=f.content.defaultValue;\n f.tags.value=f.tags.defaultValue;\n f.size.value=f.size.defaultValue;\n f.freeze.checked=false;\n f.domview.value="";\n f.htmlview.value="";\n f.status.value="";\n p.innerHTML="";\n if (!title.length) return;\n f.current=title;\n // values for new/shadow tiddlers\n var cdate=new Date();\n var mdate=new Date();\n var modifier=config.options.txtUserName;\n var text=config.views.editor.defaultText.format([title]);\n var tags="";\n // adjust values for shadow tiddlers\n if (store.isShadowTiddler(title))\n { modifier=config.views.wikified.shadowModifier; text=store.getTiddlerText(title) }\n // get values for specified tiddler (if it exists)\n var t=store.getTiddler(title);\n if (t) { var cdate=t.created; var mdate=t.modified; var modifier=t.modifier; var text=t.text; var tags=t.getTags(); }\n if (!t && !store.isShadowTiddler(title)) f.tiddlers.options[f.tiddlers.options.length]=new Option(title,title,false,true); // add item to list\n f.tiddlers.value=title; // select current title (just in case it wasn't already selected)\n f.created.value=cdate.formatString(this.datetimefmt);\n f.modified.value=mdate.formatString(this.datetimefmt);\n f.author.value=modifier;\n f.content.value=text;\n f.tags.value=tags;\n f.minoredits.checked=config.options.chkForceMinorUpdate&&!readOnly;\n f.size.value=f.content.value.length+" bytes";\n if (f.preview.checked) { p.style.display="block"; this.render(id); }\n}\n\nconfig.macros.tidIDE.add=function(id) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var p=document.getElementById(id+"_preview");\n if (f.dirty && !confirm(config.commands.cancelTiddler.warning.format([f.current]))) return;\n var title=prompt(this.titleMsg,config.macros.newTiddler.title);\n while (title && store.tiddlerExists(title) && !confirm(config.messages.overwriteWarning.format([title])))\n title=prompt(this.titleMsg,config.macros.newTiddler.title);\n if (!title || !title.trim().length) return; // cancelled by user\n f.dirty=false; // suppress unneeded confirmation message\n this.set(id,title);\n}\n\nconfig.macros.tidIDE.remove=function(id) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var p=document.getElementById(id+"_preview");\n if (!f.current.length) return;\n if (!store.tiddlerExists(f.current) && store.isShadowTiddler(f.current)) { alert(this.isShadowMsg.format([f.current])); return; }\n if (config.options.chkConfirmDelete && !confirm(config.commands.deleteTiddler.warning.format([f.current]))) return;\n if (store.tiddlerExists(f.current)) {\n story.closeTiddler(f.current);\n store.removeTiddler(f.current);\n store.setDirty(true);\n if(config.options.chkAutoSave) saveChanges();\n }\n f.tiddlers.options[f.tiddlers.selectedIndex]=null; // remove item from list\n f.dirty=false; // suppress unneeded confirmation message\n this.set(id,""); // clear form controls\n}\n\nconfig.macros.tidIDE.save=function(id,saveAs) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var title=f.current;\n if (!title || !title.trim().length || saveAs) { // get a new title\n title=prompt(this.titleMsg,config.macros.newTiddler.title);\n while (title && store.tiddlerExists(title) && !confirm(config.messages.overwriteWarning.format([title])))\n title=prompt(this.titleMsg,config.macros.newTiddler.title);\n if (!title || !title.trim().length) return; // cancelled by user\n f.tiddlers.options[f.tiddlers.options.length]=new Option(title,title,false,true); // add item to list\n f.current=title;\n }\n var author=config.options.txtUserName;\n var mdate=new Date();\n var content=f.content.value;\n var tags=f.tags.value;\n var tiddler=store.saveTiddler(title,title,content,author,mdate,tags);\n if (f.minoredits.checked) {\n var author=f.author.value;\n var mdate=new Date(f.modified.value);\n var cdate=new Date(f.created.value);\n tiddler.assign(null,null,author,mdate,null,cdate);\n }\n store.setDirty(true);\n if(config.options.chkAutoSave) saveChanges();\n story.refreshTiddler(title,null,true);\n f.dirty=false;\n}\n//}}}\n\n// // EDITOR PANEL: PREVIEW FUNCTIONS\n//{{{\nif (config.options.txtTidIDEAutoFreeze==undefined)\n config.options.txtTidIDEAutoFreeze=250; // limit (in milliseconds) for auto-freezing preview display\n\nconfig.macros.tidIDE.render=function(id) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var p=document.getElementById(id+"_preview");\n var d=document.getElementById(id+"_domview");\n var h=document.getElementById(id+"_htmlview");\n p.innerHTML="";\n f.status.value=this.renderMsg;\n var start=new Date();\n wikify(f.content.value.replace(regexpCarriageReturn,''),p);\n var end=new Date();\n this.renderDOM(id);\n this.renderHTML(id);\n f.status.value=f.current+": "+(end-start+1)+"ms";\n // automatically suspend preview updates for slow rendering tiddlers\n if (end-start+1>config.options.txtTidIDEAutoFreeze) {\n f.freeze.checked=true;\n f.status.value+=this.timeoutMsg.format([config.options.txtTidIDEAutoFreeze]);\n }\n if (f.freeze.checked) f.status.value+=this.freezeMsg;\n}\n\nconfig.macros.tidIDE.renderDOM=function(id) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var p=document.getElementById(id+"_preview");\n var d=document.getElementById(id+"_domview");\n var h=document.getElementById(id+"_htmlview");\n p.style.height=(f.dom.checked||f.html.checked)?"10em":"25em";\n if (f.dom.checked) d.value=this.getNodeTree(p,"| ");\n d.style.display=f.dom.checked?"inline":"none";\n d.style.width=f.html.checked?"49.5%":"100%";\n h.style.width=f.dom.checked?"49.5%":"100%";\n}\n\nconfig.macros.tidIDE.renderHTML=function(id) {\n var place=document.getElementById(id+"_editorpanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n var p=document.getElementById(id+"_preview");\n var d=document.getElementById(id+"_domview");\n var h=document.getElementById(id+"_htmlview");\n p.style.height=(f.dom.checked||f.html.checked)?"10em":"25em";\n if (f.html.checked) h.value=this.formatHTML(p.innerHTML);\n h.style.display=f.html.checked?"inline":"none";\n d.style.width=f.html.checked?"49.5%":"100%";\n h.style.width=f.dom.checked?"49.5%":"100%";\n}\n\nconfig.macros.tidIDE.formatHTML=function(txt) {\n if (config.browser.isIE) return txt; // BYPASS - 4/24/2006 due to IE hang problem. Will fix later...\n var out="";\n var indent="";\n var level=0;\n for (var i=0;i<txt.length;i++) {\n var c=txt.substr(i,1);\n if (c=="<") {\n if (txt.substr(i+1,1)=="/") indent=indent.substr(0,indent.length-2);\n out+="\sn"+indent;\n if (txt.substr(i+1,1)!="/" && txt.substr(i+1,3)!="br>" && txt.substr(i+1,2)!="p>" && txt.substr(i+1,3)!="hr>") indent+=" ";\n }\n out+=c;\n if (c=="\sn")\n out+=indent;\n if (c==">" && txt.substr(i+1,1)!="<")\n out+="\sn"+indent;\n }\n return out;\n}\n\nconfig.macros.tidIDE.getNodeTree=function(theNode,theIndent,showPath,inline,thePrefix,thePath)\n{\n if (!theNode) return "";\n if (!thePrefix) thePrefix="";\n if (!thePath) thePath="";\n var mquote='"'+(inline?"{{{":"");\n var endmquote=(inline?"}}}":"")+'"';\n // generate output for this node\n var out = thePrefix;\n if (showPath && thePath.length)\n out += (inline?"//":"")+thePath.substr(1)+":"+(inline?"//":"")+"\sr\sn"+thePrefix;\n if (theNode.className=="DOMViewer")\n return out+'[DOMViewer]\sr\sn'; // avoid self-referential recursion\n out += (inline?"''":"")+theNode.nodeName.toUpperCase()+(inline?"''":"");\n if (theNode.nodeName=="#text")\n out += ' '+mquote+theNode.nodeValue.replace(/\sn/g,'\s\sn')+endmquote;\n if (theNode.className)\n out += ' class='+mquote+theNode.className+endmquote;\n if (theNode.type)\n out += ' type='+mquote+theNode.type+endmquote;\n if (theNode.id)\n out += ' id='+mquote+theNode.id+endmquote;\n if (theNode.name)\n out += " "+theNode.name+(theNode.value?"="+mquote+theNode.value+endmquote:"");\n if (theNode.href)\n out += ' href='+mquote+theNode.href+endmquote;\n if (theNode.src)\n out += ' src='+mquote+theNode.src+endmquote;\n if (theNode.attributes && theNode.getAttribute("tiddlyLink")!=undefined)\n out += ' tiddler='+mquote+theNode.getAttribute("tiddlyLink")+endmquote;\n out += "\sr\sn";\n // recursively generate output for child nodes\n thePath=thePath+"."+theNode.nodeName.toLowerCase();\n thePrefix=theIndent+thePrefix;\n for (var i=0;i<theNode.childNodes.length;i++)\n {\n var thisChild=theNode.childNodes.item(i);\n var theNum=(inline?"~~":"(")+(i+1)+(inline?"~~":")");\n out += this.getNodeTree(thisChild,theIndent,showPath,inline,thePrefix,thePath+theNum);\n }\n return out;\n}\n//}}}\n\n// // DOMViewer macro\n//{{{\nversion.extensions.DOMViewer = version.extensions.tidIDE;\nconfig.macros.DOMViewer = { };\nconfig.macros.DOMViewer.handler = function(place,macroName,params) {\n // set default params\n var inline=false;\n var theRows=15;\n var theIndent="| ";\n var showPath=false;\n var theTarget=place;\n // unpack options parameters\n if (params[0]=='inline') { inline=true; theIndent=">"; params.shift(); } \n if (params[0]&&(params[0].substr(0,7)=="indent:")) { theIndent=params[0].substr(7); params.shift(); } \n if (params[0]&&(params[0].substr(0,5)=="rows:")) { theRows=params[0].substr(5); params.shift(); } \n if (params[0]=='path') { showPath=true; params.shift(); } \n if (params[0]) {\n theTarget=document.getElementById(params[0]);\n if (!theTarget)\n if (store.getTiddler(params[0])!=undefined) {\n theTarget=document.getElementById("tiddler"+params[0]);\n if (!theTarget && confirm("DOMViewer asks:\sn\snIs it OK to open tiddler '"+params[0]+"' now?")) { \n story.displayTiddler(null,params[0],1,null,null,false);\n theTarget=document.getElementById("tiddler"+params[0]);\n }\n }\n params.shift();\n }\n // generate and display DOM tree\n if (inline) {\n var out=config.macros.tidIDE.getNodeTree(theTarget,theIndent,showPath,inline);\n wikify(out,place);\n }\n else {\n var out=config.macros.tidIDE.getNodeTree(theTarget,theIndent,showPath,inline);\n var css=".DOMViewer{width:100%;font-size:8pt;color:inherit;background:transparent;border:0px;}";\n setStylesheet(css,"DOMViewerPlugin");\n var theTextArea=createTiddlyElement(place,"textarea",null,"DOMViewer",out);\n theTextArea.rows=theRows;\n theTextArea.cols=60;\n theTextArea.wrap="off";\n theTextArea.theTarget=theTarget;\n theTextArea.theIndent=theIndent;\n theTextArea.showPath=showPath;\n }\n}\n//}}}\n\n// // SYSTEM PANEL FUNCTIONS\n//{{{\nconfig.macros.tidIDE.showObject=function(o) { // generate formatted output for displaying object references\n var t="";\n for (var p in o) {\n if (typeof o[p]=="function") {\n t+="- - - - - - - - - - "+p+" - - - - - - - - - -\sn";\n t+=o[p].toString();\n t+="\sn- - - - - - - - - - END: "+p+" - - - - - - - - - -\sn";\n }\n else\n t+='['+typeof o[p]+'] '+p+": "+o[p]+"\sn";\n }\n return t;\n}\n\nconfig.macros.tidIDE.getsys=function(id) {\n var place=document.getElementById(id+"_systempanel"); if (!place) return;\n\n var f=document.getElementById(id+"_form");\n f.sysview.value="";\n // OPTIONS\n while (f.sys_opts.options.length > 1) { f.sys_opts.options[1]=null; } // clear list\n f.config_view.value=""; // clear edit field\n var cookies = { };\n if (document.cookie != "") {\n var p = document.cookie.split("; ");\n for (var i=0; i < p.length; i++) {\n var pos=p[i].indexOf("=");\n if (pos==-1)\n cookies[p[i]]="";\n else\n cookies[p[i].substr(0,pos)]=unescape(p[i].slice(pos+1));\n }\n }\n var c=1;\n var opt=new Array(); for (var i in config.options) opt.push(i); opt.sort();\n for(var i=0; i<opt.length; i++) {\n if ((opt[i].substr(0,3)=="txt")||(opt[i].substr(0,3)=="chk")) {\n var txt = (opt[i].substr(0,3)=="chk"?("["+(config.options[opt[i]]?"x":"_")+"] "):"")+opt[i]+(cookies[opt[i]]?" (cookie)":"");\n var val = config.options[opt[i]];\n f.sys_opts.options[c++]=new Option(txt,val,false,false);\n }\n }\n // STYLESHEETS\n while (f.sys_styles.options.length > 1) { f.sys_styles.options[1]=null; } // clear list\n var c=1;\n var styles=document.getElementsByTagName("style");\n for(var i=0; i < styles.length; i++) {\n var id=styles[i].getAttribute("id"); if (!id) id="(default)";\n var txt=id;\n var val="/* stylesheet:"+txt+" */\sn"+styles[i].innerHTML;\n f.sys_styles.options[c++]=new Option(txt,val,false,false);\n }\n // SHADOWS\n while (f.sys_shadows.options.length > 1) { f.sys_shadows.options[1]=null; } // clear list\n var c=1;\n for(var s in config.shadowTiddlers) f.sys_shadows.options[c++]=new Option(s,config.shadowTiddlers[s],false,false);\n // NOTIFICATIONS\n while (f.sys_notify.options.length > 1) { f.sys_notify.options[1]=null; } // clear list\n var c=1;\n for (var i=0; i<store.namedNotifications.length; i++) {\n var n = store.namedNotifications[i];\n var fn = n.notify.toString();\n fn = fn.substring(fn.indexOf("function ")+9,fn.indexOf("{")-1);\n var txt=(n.name?n.name:"any change")+"="+fn;\n var val="/* notify: "+txt+" */\sn"+n.notify.toString();\n f.sys_notify.options[c++]=new Option(txt,val,false,false);\n }\n // MACROS\n while (f.sys_macros.options.length > 1) { f.sys_macros.options[1]=null; } // clear list\n var c=1;\n var macros=new Array(); for (var m in config.macros) macros.push(m); macros.sort();\n for(var i=0; i < macros.length; i++)\n f.sys_macros.options[c++]=new Option(macros[i],this.showObject(config.macros[macros[i]]),false,false);\n // TOOLBAR COMMANDS\n while (f.sys_commands.options.length > 1) { f.sys_commands.options[1]=null; } // clear list\n var c=1;\n for(var cmd in config.commands)\n f.sys_commands.options[c++]=new Option(cmd,this.showObject(config.commands[cmd]),false,false);\n // FORMATTERS\n while (f.sys_formatters.options.length > 1) { f.sys_formatters.options[1]=null; } // clear list\n var c=1;\n for(var i=0; i < config.formatters.length; i++)\n f.sys_formatters.options[c++]=new Option(config.formatters[i].name,this.showObject(config.formatters[i]),false,false);\n // PARAMIFIERS\n while (f.sys_params.options.length > 1) { f.sys_params.options[1]=null; } // clear list\n var c=1;\n for(var param in config.paramifiers)\n f.sys_params.options[c++]=new Option(param,this.showObject(config.paramifiers[param]),false,false);\n // GLOBALS\n //global variables and functions (excluding most DOM and ~TiddyWiki core definitions)://\n var DOM0_globals = {\n addEventListener: 1, alert: 1, atob: 1, back: 1, blur: 1, btoa: 1, captureEvents: 1, clearInterval: 1,\n clearTimeout: 1, close: 1, closed: 1, Components: 1, confirm: 1, content: 1, controllers: 1, crypto: 1,\n defaultStatus: 1, defaultStatus: 1, directories: 1, disableExternalCapture: 1, dispatchEvent: 1, document: 1,\n dump: 1, enableExternalCapture: 1, escape: 1, find: 1, focus: 1, forward: 1, frameElement: 1, frames: 1,\n fullScreen: 1, getAttention: 1, getComputedStyle: 1, getSelection: 1, history: 1, home: 1, innerHeight: 1,\n innerWidth: 1, length: 1, location: 1, locationbar: 1, menubar: 1, moveBy: 1, moveTo: 1, name: 1,\n navigator: 1, open: 1, openDialog: 1, opener: 1, outerHeight: 1, outerWidth: 1, pageXOffset: 1,\n pageYOffset: 1, parent: 1, personalbar: 1, pkcs11: 1, print: 1, prompt: 1, prompter: 1, releaseEvents: 1,\n removeEventListener: 1, resizeBy: 1, resizeTo: 1, routeEvent: 1, screen: 1, screenX: 1, screenY: 1,\n scroll: 1, scrollbars: 1, scrollBy: 1, scrollByLines: 1, scrollByPages: 1, scrollMaxX: 1, scrollMaxY: 1,\n scrollTo: 1, scrollX: 1, scrollY: 1, self: 1, setInterval: 1, setResizable: 1, setTimeout: 1, sidebar: 1,\n sizeToContent: 1, status: 1, statusbar: 1, stop: 1, toolbar: 1, top: 1, unescape: 1, updateCommands: 1,\n window: 1, getInterface: 1\n };\n var tw_globals = {\n version: 1, config: 1, DEFAULT_VIEW_TEMPLATE: 1, DEFAULT_EDIT_TEMPLATE: 1, store: 1, story: 1,\n Formatter: 1, anim: 1, readOnly: 1, highlightHack: 1, main: 1, restart: 1, saveTest: 1, loadSystemConfig: 1,\n processConfig: 1, invokeMacro: 1, Formatter: 1, wikify: 1, wikifyPlain: 1, highlightify: 1, Wikifier: 1, \n Tiddler: 1, regexpBackSlashEn: 1, regexpBackSlash: 1, regexpBackSlashEss: 1, regexpNewLine: 1, \n regexpCarriageReturn: 1, TiddlyWiki: 1, displayTiddlers: 1, displayTiddler: 1, Story: 1, displayMessage: 1,\n clearMessage: 1, refreshElements: 1, applyHtmlMacros: 1, refreshPageTemplate: 1, applyPageTemplate: 1,\n refreshDisplay: 1, refreshPageTitle: 1, refreshStyles: 1, loadOptionsCookie: 1, saveOptionCookie: 1,\n saveUsingSafari: 1, startSaveArea: 1, endSaveArea: 1, checkUnsavedChanges: 1, saveChanges: 1,\n getBackupPath: 1, generateRss: 1, allTiddlersAsHtml: 1,\n convertUTF8ToUnicode: 1, manualConvertUTF8ToUnicode: 1, mozConvertUTF8ToUnicode: 1,\n convertUnicodeToUTF8: 1, manualConvertUnicodeToUTF8: 1, mozConvertUnicodeToUTF8: 1,\n saveFile: 1, loadFile: 1, ieSaveFile: 1, ieLoadFile: 1, mozillaSaveFile: 1, mozillaLoadFile: 1,\n operaUrlToFilename: 1, operaSaveFile: 1, operaLoadFile: 1, safariFilenameToUrl: 1, safariLoadFile: 1,\n safariSaveFile: 1, detectPlugin: 1, createTiddlyButton: 1, createTiddlyLink: 1, refreshTiddlyLink: 1,\n createExternalLink: 1, onClickTiddlerLink: 1, createTagButton: 1, onClickTag: 1, onClickTagOpenAll: 1,\n createTiddlyError: 1, Animator: 1, Zoomer: 1, Cascade: 1, Scroller: 1, Slider: 1, Popup: 1,\n createTiddlerPopup: 1, scrollToTiddlerPopup: 1, hideTiddlerPopup: 1, RGB: 1, drawGradient: 1,\n createTiddlyText: 1, createTiddlyElement: 1, addEvent: 1, removeEvent: 1, addClass: 1,\n removeClass: 1, hasClass: 1, resolveTarget: 1, getPlainText: 1, ensureVisible: 1, \n findWindowWidth: 1, findWindowHeight: 1, findScrollX: 1, findScrollY: 1, findPosX: 1, findPosY: 1,\n insertSpacer: 1, removeChildren: 1, setStylesheet: 1,\n Packages: 1, sun: 1, java: 1, netscape: 1, XPCNativeWrapper: 1, GeckoActiveXObject: 1\n };\n while (f.sys_globals.options.length > 1) { f.sys_globals.options[1]=null; } // clear list\n if (config.browser.isIE) return; // BYPASS - 8/16/2006 // DON'T LIST GLOBALS IN IE... throws object error - WFFL\n var c=1;\n for (var v in window) if (!(DOM0_globals[v] || tw_globals[v])) {\n var t=window[v];\n if ((typeof window[v])=='object') {\n var t='';\n for (var p in window[v]) {\n t+=((typeof window[v][p])!='function')?('['+typeof window[v][p]+'] '+p):p;\n t+=((typeof window[v][p])!='function')?('='+window[v][p]):'';\n t+='\sn';\n }\n }\n f.sys_globals.options[c++]=new Option(((typeof window[v])!='function')?('['+typeof window[v]+'] '+v):v,t,false,false);\n }\n}\n\nconfig.macros.tidIDE.setsys=function(id) {\n var place=document.getElementById(id+"_systempanel"); if (!place) return;\n var f=document.getElementById(id+"_form");\n if (f.sys_opts.selectedIndex==0) return; // heading - do nothing\n var name=f.sys_opts.options[f.sys_opts.selectedIndex].text.replace(/\s[[Xx_]\s] /,'').replace(/ \s(cookie\s)/,'')\n var value=f.config_view.value;\n config.options[name]=value;\n saveOptionCookie(name);\n f.sys_opts.options[f.sys_opts.selectedIndex].value=value;\n return;\n}\n//}}}\n\n// // HTML DEFINITIONS\n//{{{\nconfig.macros.tidIDE.html = { };\nconfig.macros.tidIDE.html.framework = " \s\n <html><form id='%id%_form' style='display:inline;margin:0;padding:0;'> \s\n %version% %selector% %panels% \s\n </form></html> \s\n";\n//}}}\n//{{{\nconfig.macros.tidIDE.html.editorchk = " \s\n <input type=checkbox name=editor style='display:inline;width:auto;margin:1px;' title='add/delete/modify tiddlers' %showpanel% \s\n onclick='document.getElementById(\s"%id%_editorpanel\s").style.display=this.checked?\s"block\s":\s"none\s"; \s\n if (this.checked) config.macros.tidIDE.render(\s"%id%\s");'>%toolname% \s\n";\nconfig.macros.tidIDE.html.systemchk = " \s\n <input type=checkbox name=system style='display:inline;width:auto;margin:1px;' title='view TiddlyWiki system internals and configurable options' %showpanel% \s\n onclick='document.getElementById(\s"%id%_systempanel\s").style.display=this.checked?\s"block\s":\s"none\s"; \s\n if (this.checked) config.macros.tidIDE.getsys(\s"%id%\s");'>%toolname% \s\n";\nconfig.macros.tidIDE.html.toolschk = " \s\n <input type=checkbox name=tools style='display:inline;width:auto;margin:1px;' title='' %showpanel% \s\n onclick='document.getElementById(\s"%id%_%toolid%_panel\s").style.display=this.checked?\s"block\s":\s"none\s"; \s\n if (this.checked) config.macros.tidIDE.loadPanel(\s"%id%\s",\s"%toolid%\s");'>%toolname% \s\n";\n//}}}\n//{{{\nconfig.macros.tidIDE.html.toolspanel = " \s\n <div id='%id%_%toolid%_panel' style='display:%showpanel%;margin:0;margin-top:0.5em'> \s\n </div> \s\n";\n//}}}\n//{{{\nconfig.macros.tidIDE.html.systempanel = " \s\n <div id='%id%_systempanel' style='display:%showpanel%;margin:0;margin-top:0.5em;white-space:nowrap'> \s\n <!-- configurable options --> \s\n <table style='width:100%;border:0;padding:0;margin:0'><tr style='border:0;padding:0;margin:0'> \s\n <td style='width:30%;border:0;padding:0;margin:0'> \s\n <select size=1 name='sys_opts' style='width:100%;font-size:8pt' \s\n onchange='this.form.config_view.value=this.value'> \s\n <option value=\s"\s">config.options.*</option> \s\n </select> \s\n </td><td style='width:50%;border:0;padding:0;margin:0;'> \s\n <input type=text name='config_view' size=60 style='width:99%;font-size:8pt' value=''> \s\n </td><td style='width:20%;white-space:nowrap;border:0;padding:0;margin:0;'> \s\n <input type=button style='width:50%;' value='set option' title='save this TiddlyWiki option value' \s\n onclick='config.macros.tidIDE.setsys(\s"%id%\s");config.macros.tidIDE.getsys(\s"%id%\s");'><!-- \s\n --><input type=button style='width:50%;' value='refresh' title='retrieve current options and system values' \s\n onclick='this.form.sysview.style.display=\s"none\s"; config.macros.tidIDE.getsys(\s"%id%\s");'> \s\n </td></tr><tr style='border:0;padding:0;margin:0'><td colspan=3 \s\n style='white-space:nowrap;width:100%;border:0;padding:0;margin:0'> \s\n <!-- system objects --> \s\n <select size=1 name='sys_styles' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">stylesheets...</option> \s\n </select><select size=1 name='sys_shadows' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">shadows...</option> \s\n </select><select size=1 name='sys_notify' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">notifications...</option> \s\n </select><select size=1 name='sys_globals' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">globals...</option> \s\n </select><br><select size=1 name='sys_macros' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">macros...</option> \s\n </select><select size=1 name='sys_commands' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">toolbars...</option> \s\n </select><select size=1 name='sys_formatters' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">wikifiers...</option> \s\n </select><select size=1 name='sys_params' style='width:25%;font-size:8pt' \s\n onchange='this.form.sysview.style.display=\s"block\s"; this.form.%id%_sysview.value=this.value'> \s\n <option value=\s"\s">paramifiers...</option> \s\n </select> \s\n <!-- system value display area --> \s\n <span style='white-space:normal;'><textarea id='%id%_sysview' name=sysview cols=60 rows=12 \s\n onfocus='this.select()' style='width:99.5%;height:16em;font-size:8pt;display:none'></textarea></span> \s\n </td></tr></table> \s\n </div> \s\n";\n//}}}\n//{{{\nconfig.macros.tidIDE.html.editorpanel = " \s\n <div id='%id%_editorpanel' style='display:%showpanel%;margin:0;margin-top:0.5em'> \s\n <!-- tiddler editor list and buttons --> \s\n <select size=1 name=tiddlers style='display:inline;width:55%' \s\n onchange='config.macros.tidIDE.set(\s"%id%\s",this.value); this.value=this.form.current;'> \s\n <option value=''>select a tiddler...</option> \s\n %tiddlerlist% \s\n </select><!-- \s\n --><input name=view type=button style='display:inline;width:9%' value='view' title='open this tiddler for regular viewing' \s\n onclick='if (!this.form.current.length) return; story.displayTiddler(null,this.form.current)'><!-- \s\n --><input name=add type=button style='display:inline;width:9%' value='add' title='create a new tiddler' \s\n onclick='config.macros.tidIDE.add(\s"%id%\s")' %disabled%><!-- \s\n --><input name=remove type=button style='display:inline;width:9%' value='remove' title='delete this tiddler' \s\n onclick='config.macros.tidIDE.remove(\s"%id%\s")' %disabled%><!-- \s\n --><input name=save type=button style='display:inline;width:9%' value='save' title='save changes to this tiddler' \s\n onclick='config.macros.tidIDE.save(\s"%id%\s")' %disabled%><!-- \s\n --><input name=saveas type=button style='display:inline;width:9%' value='save as' title='save changes to a new tiddler' \s\n onclick='config.macros.tidIDE.save(\s"%id%\s",true)' %disabled%> \s\n <!-- tiddler content edit --> \s\n <div><textarea id='%id%_content' name=content cols=60 rows=%maxrows% style='width:100%;font-size:8pt;font-family:verdana,arial,helvetica' \s\n onkeyup='var f=this.form; f.dirty=true; f.size.value=this.value.length+\s" bytes\s"; \s\n var p=document.getElementById(\s"%id%_preview\s"); \s\n if (f.preview.checked && !f.freeze.checked) { config.macros.tidIDE.render(\s"%id%\s"); }'></textarea></div> \s\n <!-- tag edit and droplist --> \s\n <table width='100%' style='border:0;padding:0;margin:0'><tr style='border:0;padding:0;margin:0'> \s\n <td style='border:0;padding:0;margin:0'> \s\n <input type=text name=tags size=60 style='width:100%;font-size:8pt' value='' \s\n onchange='this.form.dirty=true' %disabled%> \s\n </td><td width='1' style='border:0;padding:0;margin:0;'> \s\n <select size=1 name=taglist style='font-size:8pt' \s\n onchange='this.form.dirty=true; this.form.tags.value+=\s" \s"+this.value' %disabled%> \s\n <option value=''>select tags...</option> \s\n %taglist% \s\n </select> \s\n </td></tr></table> \s\n <!-- created/modified dates, author, current tiddler size --> \s\n <div style='float:right;'> \s\n created <input type=text name=created size=18 style='display:inline;font-size:8pt;text-align:center;padding:0;' value='' \s\n onchange='this.form.dirty=true' %minoredits%> \s\n modified <input type=text name=modified size=18 style='display:inline;font-size:8pt;text-align:center;padding:0;' value='' \s\n onchange='this.form.dirty=true;' %minoredits%> \s\n by <input type=text name=author size=15 style='display:inline;font-size:8pt;padding:0;' value='' \s\n onfocus='this.select()' onchange='this.form.dirty=true' %minoredits%> \s\n <input type=text name=size size=10 style='display:inline;font-size:8pt;text-align:center;padding:0;' value='' \s\n onfocus='this.blur()' onkeydown='return false' DISABLED> \s\n </div> \s\n <!-- toggles: preview, read-only, minor edit --> \s\n <span style='white-space:nowrap'> \s\n <input type=checkbox name=preview style='display:inline;width:auto;margin:1px;' title='display tiddler changes BEFORE you save them' \s\n onclick='document.getElementById(\s"%id%_previewpanel\s").style.display=this.checked?\s"block\s":\s"none\s"; \s\n if (this.checked) config.macros.tidIDE.render(\s"%id%\s");'>preview \s\n <input type=checkbox name=readonly style='display:inline;width:auto;margin:1px;' %readonlychk% \s\n title='do not allow tiddler changes to be saved' \s\n onclick='readOnly=config.options.chkHttpReadOnly=this.checked;saveOptionCookie(\s"chkHttpReadOnly\s"); \s\n var f=this.form; f.minoredits.disabled=f.tags.disabled=f.taglist.disabled=this.checked; \s\n f.add.disabled=f.remove.disabled=f.save.disabled=f.saveas.disabled=this.checked; \s\n f.created.disabled=f.modified.disabled=f.author.disabled=this.checked||!f.minoredits.checked;'>readonly \s\n <input type=checkbox name=minoredits style='display:inline;width:auto;margin:1px;' %disabled% %minorchk% \s\n title='check: save datestamps/author as entered, uncheck: auto-update modified/author' \s\n onclick='this.form.created.disabled=this.form.modified.disabled=this.form.author.disabled=!this.checked; \s\n config.options.chkForceMinorUpdate=this.checked;saveOptionCookie(\s"chkForceMinorUpdate\s");'>minor edits \s\n </span> \s\n <!-- tiddler preview display --> \s\n <div id='%id%_previewpanel' style='display:none;white-space:nowrap'> \s\n <div id='%id%_preview' class='viewer' style='margin:0;margin-top:.5em;height:25em;overflow:auto;white-space:normal'> \s\n &nbsp; \s\n </div> \s\n <!-- DOM and HTML viewers --> \s\n <textarea id='%id%_domview' name=domview cols=60 rows=12 wrap=off \s\n onfocus='this.select()' style='display:none;width:100%;height:16em;font-size:8pt'></textarea><!-- \s\n --><textarea id='%id%_htmlview' name=htmlview cols=60 rows=12 wrap=off \s\n onfocus='this.select()' style='display:none;width:100%;height:16em;font-size:8pt'></textarea> \s\n <!-- status line, preview option checkboxes, run/refresh buttons --> \s\n <table width='100%' style='border:0;padding:0;margin:0'><tr style='border:0;padding:0;margin:0'> \s\n <td style='border:0;padding:0;margin:0'> \s\n <input type=text '%id%_status' name=status style='padding:0;width:100%;font-size:8pt;'> \s\n </td><td style='width:1%;border:0;padding:0;margin:0;text-align:right;white-space:nowrap'> \s\n <input type=checkbox name=dom style='display:inline;width:auto;margin:1px;' title='show Document Object Model (DOM) information' \s\n onclick='config.macros.tidIDE.renderDOM(\s"%id%\s");'>DOM \s\n <input type=checkbox name=html style='display:inline;width:auto;margin:1px;' title='show rendered HTML' \s\n onclick='config.macros.tidIDE.renderHTML(\s"%id%\s");'>HTML \s\n <input type=checkbox name=freeze style='display:inline;width:auto;margin:1px;' title='do not update preview display as changes are made' \s\n onclick='var p=document.getElementById(\s"%id%_preview\s"); \s\n if (this.checked) this.form.status.value+=config.macros.tidIDE.freezeMsg; \s\n else config.macros.tidIDE.render(\s"%id%\s");'>freeze \s\n <input type=button style='display:inline;width:auto;' value='run' title='evaluate this tiddler as a javascript \s"systemConfig\s" plugin' \s\n onclick='if (!confirm(config.macros.tidIDE.evalMsg.format([this.form.current]))) return false; \s\n var err=processConfig(this.form.content.value); \s\n if(err)displayMessage(config.messages.customConfigError.format([err,this.form.current]));'><!-- \s\n --><input type=button style='display:inline;width:auto;' value='refresh' title='update preview display' \s\n onclick='config.macros.tidIDE.render(\s"%id%\s")'> \s\n </td></tr></table> \s\n </div> \s\n </div> \s\n";\n//}}}
/* use default stylesheet with TidIDE templates */\n[[StyleSheet]]\n<<template TidIDE>>
<<importTiddlers>> - <<exportTiddlers>> - <<attach>> | +++^[changes]...\n <<moveablePanel>><<tiddler DocumentChanges>>===\n - +++^[plugins]...\n <<moveablePanel>><<tiddler DocumentPlugins>>===\n - +++^18em^[calendar]...\n <<moveablePanel>>calendar\n @@font-size:10pt;<<calendar thismonth>><script>place.lastChild.style.width="100%";</script>\n @@[[view entire year...|DocumentCalendarYear]]===\n - +++^[tagcloud]...\n <<moveablePanel>>tagcloud\n <<tiddler TagCloud>>===\n - +++^[style tester]...<script>place.style.width="35em"</script><<moveablePanel>>enter CSS styles:\n <html><form><textarea name="ta" style="width:100%;height:10em" onkeyup="if (event.ctrlKey && event.keyCode==13) this.form.go.click()"></textarea><input type=button name=go value="apply styles" onclick="setStylesheet(this.form.ta.value,'testStyles')"></form></html>===\n | <script label="customize...">\n var here=story.findContainingTiddler(place); var id=here?here.id.substr(7):"";\n config.macros.tidIDE.set(id,"TidIDETools");\n return false;\n </script>
<html><form target="_blank" style="display:inline;text-align:left;margin:0;padding:0"><!--\n--><span style="float:right"> &nbsp; <input type="text" name=ticket value="" onfocus="this.select()" style="font-size:8pt;width:4em;text-align:center"><!--\n--><input type="button" value="get ticket" style="font-size:8pt;"\n onclick="var t=this.form.ticket; if (t.value==t.defaultValue) {alert('please enter a ticket number.'); t.focus(); return; } window.frames['tracframe'].location='http://trac.tiddlywiki.org/tiddlywiki/ticket/'+t.value;"><!--\n--> &nbsp; <input type="text" name=search value="" onfocus="this.select()" style="font-size:8pt;width:10em;"><!--\n--><input type="button" value="search" style="font-size:8pt;"\n onclick="window.frames['tracframe'].location='http://trac.tiddlywiki.org/tiddlywiki/search?ticket=on&changeset=on&wiki=on&q='+this.form.search.value;"></span><!--\n--><input type="button" value="<" title="back" style="font-size:8pt;width:2em"\n onclick="try{window.frames['tracframe'].history.go(-1)}catch(e){window.history.go(-1)}" ><!--\n--><input type="button" value=">" title="forward" style="font-size:8pt;width:2em"\n onclick="try{window.frames['tracframe'].history.go(+1)}catch(e){window.history.go(+1)}"><!--\n--><input type="button" value="+" title="refresh"style="font-size:8pt;width:2em"\n onclick="window.frames['tracframe'].location.reload()"><!--\n--><input type="button" value="x" title="stop"style="font-size:8pt;width:2em"\n onclick="window.stop()"><!--\n--></form><form target="tracframe" style="display:inline;text-align:left;margin:0;padding:0" action="http://trac.tiddlywiki.org/tiddlywiki/report/1"><!--\n--> show by <select size="1" name=sort style="font-size:8pt;"><!--\n--> <option value="ticket">ticket # <option value="summary">summary <option value="component">component <!--\n--> <option value="version">version <option value="milestone">milestone <option value="type">type<!--\n--> <option value="owner">owner <option value="created" SELECTED>create date<!--\n--></select><select size="1" name=asc style="font-size:8pt;"><!--\n--> <option value="1">ascending<!--\n--> <option value="0" SELECTED>descending<!--\n--></select><!--\n--><input type="submit" value="get report" title="get report using current settings" style="font-size:8pt;"><!--\n--><input type="button" value="..." title="open in a separate window" style="font-size:8pt;"\n onclick="window.open('http://trac.tiddlywiki.org/tiddlywiki/report/1?sort='+this.form.sort.value+'&asc='+this.form.asc.value)"><!--\n--></form>\n<iframe name="tracframe" src="" style="background:#eee;width:100%;height:30em;"></iframe><!--\n--></html><<tiddler HideTiddlerTags>>
<!--{{{-->\n<div class='toolbar' macro='toolbar collapseTiddler collapseOthers -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<span class='title' macro='view title'></span> <span class='subtitle' macro='tiddler ShowTiddlerDates'></span>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n<!--}}}-->
default tiddlers\n+DefaultTiddlers\n----\ndocument info\nSiteTitle Welcome About Download Contact SiteSubtitle ELSDesignStudios\n----\nTiddlyTools menu definitions\nSwitchMenus MainMenu MainMenuFull MainMenuMini MainMenuLite SideBarOptions SideBarOptionsFull SideBarOptionsLite SideBarOptionsMini SideBarTabs SideBarTabsFull SideBarTabsLite SideBarTabsMini StoryMenu SiteMenu SiteMenuFull SiteMenuLite SiteMenuMini SiteMenuGoto SiteMenuSearch SiteMenuFile SiteMenuEdit SiteMenuView SiteMenuOptions SiteMenuOptionsUpload SiteMenuExtras
/***\n''TiddlerGroupsPlugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#TiddlerGroupsPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly view a set of tiddlers by selecting a "tiddler group" from a droplist control. Groups are defined in TiddlerGroupsList. Each group definition is separated by a "----" (horizontal rule), and consists of two lines of text: a description (for display in the droplist) and a space-separated list of tiddler titles (use {{{[[...]]}}} around titles containing spaces). When a tiddler title is preceded by a "+" (e.g., "+DefaultTiddlers"), it is replaced with a list of tiddlers that are ''//linked//'' from that tiddler.\n\nThe droplist shows all tiddler groups that are currently defined in the TiddlerGroupsList, followed by several viewing options:\n* ''fold grouped tiddlers'' - if a CollapsedTemplate tiddler is defined in the document, you can automatically fold the tiddlers as they are displayed to make it easier to locate desired content without excessive scrolling. This is especially useful if the group contains many tiddlers or tiddlers with lengthy content.\n* ''close other tiddlers'' - reduce information clutter by ensuring that only the tiddlers from the selected group are displayed.\n* ''open new window'' - view the grouped tiddlers in a separate copy of the current document (not including unsaved tiddler changes)\nThe droplist also includes commands to quickly ''add a group'' to the list (using the currently displayed tiddlers), or ''edit the list'' so you can manually add/remove/re-order the group definitions. Note: these commands are automatically hidden when TW is operating in 'readOnly' mode (i.e., when viewed via http:)\n!!!!!Example\n<<<\nsyntax: {{{<<tiddlerGroups>>}}}\n<<tiddlerGroups>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TiddlerGroupsPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revisions\n<<<\n''2006.07.18 [1.0.0]'' fixed expansion of "+TiddlerName" references\n''2006.06.11 [0.9.5]'' cleanup options handling. added 'close others' option. added 'open new window' option. use cookies for tracking options\n''2006.06.09 [0.8.1]'' added 'fold group when viewed' toggle option\n''2006.06.09 [0.7.0]'' added notification for auto-refresh when list definitions are changed\n''2006.06.08 [0.5.0]'' converted to plugin/macro\n''2006.06.02 [0.0.0]'' started (as inline javascript)\n<<<\n!!!!!Credits\n>This feature was developed by EricShulman from [[ELS Design Studios|http://www.elsdesign.com]]\n!!!!!Code\n***/\n//{{{\nversion.extensions.tiddlerGroups= {major: 1, minor: 0, revision: 0, date: new Date(2006,7,18)};\nif (config.options.chkGroupFold==undefined) config.options.chkGroupFold=false;\nif (config.options.chkGroupClose==undefined) config.options.chkGroupClose=true;\nif (config.options.chkGroupOpen==undefined) config.options.chkGroupOpen=false;\nconfig.macros.tiddlerGroups= { \n\n groupsList: "TiddlerGroupsList",\n indent: "\sxa0\sxa0\sxa0\sxa0",\n selectprompt: "select a group to view",\n optionsprompt: "viewing options",\n foldcmd: "[%0] fold group",\n closecmd: "[%0] close others",\n opencmd: "[%0] new window",\n addcmd: "add a group...",\n addprompt: "Please enter a group name for these tiddlers:\sn%0",\n editcmd: "edit the list...",\n\n handler:\n function(place,macroName,params) {\n var s=createTiddlyElement(place,"select",null,"tiddlerGroupsList"); s.size=1; s.onchange=this.onchange;\n setStylesheet(".tiddlerGroupsList { width:100%; font-size:8pt; }", "tiddlerGroupsListStyles");\n store.addNotification(this.groupsList,this.refresh); this.refresh();\n },\n\n refresh:\n function() { // called directly, AND triggered by notification events\n var indent=config.macros.tiddlerGroups.indent;\n var all=document.all? document.all : document.getElementsByTagName("select");\n for (var i=0; i<all.length; i++) {\n if (all[i].className!="tiddlerGroupsList") continue;\n var here=all[i];\n while (here.length) here.options[0]=null; // remove current list items\n here.options[here.length]=new Option(config.macros.tiddlerGroups.selectprompt,"",true,true);\n var list=store.getTiddlerText(config.macros.tiddlerGroups.groupsList);\n if (list && list.trim().length) {\n var parts=list.split("\sn----\sn");\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n here.options[here.length]=new Option(indent+label,value,false,false);\n }\n }\n here.options[here.length]=new Option(config.macros.tiddlerGroups.optionsprompt,"",false,false);\n if (!config.options.chkGroupOpen) {\n if (store.tiddlerExists("CollapsedTemplate")) {\n var msg=config.macros.tiddlerGroups.foldcmd.format([config.options.chkGroupFold?"x":"\sxa0\sxa0"]);\n here.options[here.length]=new Option(indent+msg,"_fold",false,false);\n }\n var msg=config.macros.tiddlerGroups.closecmd.format([config.options.chkGroupClose?"x":"\sxa0\sxa0"]);\n here.options[here.length]=new Option(indent+msg,"_close",false,false);\n }\n var msg=config.macros.tiddlerGroups.opencmd.format([config.options.chkGroupOpen?"x":"\sxa0\sxa0"]);\n here.options[here.length]=new Option(indent+msg,"_open",false,false);\n if (!readOnly) {\n here.options[here.length]=new Option(config.macros.tiddlerGroups.addcmd,"_add",false,false);\n here.options[here.length]=new Option(config.macros.tiddlerGroups.editcmd,"_edit",false,false);\n }\n }\n },\n\n onchange:\n function() { // this == droplist control\n var v=this.value; if (!v.length) return;\n switch (v) {\n case '_fold':\n config.options.chkGroupFold=!config.options.chkGroupFold;\n saveOptionCookie('chkGroupFold'); config.macros.tiddlerGroups.refresh();\n break;\n case '_close':\n config.options.chkGroupClose=!config.options.chkGroupClose;\n saveOptionCookie('chkGroupClose'); config.macros.tiddlerGroups.refresh();\n break;\n case '_open':\n config.options.chkGroupOpen=!config.options.chkGroupOpen;\n saveOptionCookie('chkGroupOpen'); config.macros.tiddlerGroups.refresh();\n break;\n case '_add':\n var list=[]; story.forEachTiddler(function(title,element){list.push(String.encodeTiddlyLink(title))}); list=list.join(" ");\n var d=prompt(config.macros.tiddlerGroups.addprompt.format([list.readBracketedList().join(', ')]),'');\n if (!d || !d.trim().length) return;\n var t=store.getTiddler(config.macros.tiddlerGroups.groupsList); t.set(null,t.text+"\sn----\sn"+d+"\sn"+list);\n store.setDirty(true); story.refreshTiddler(config.macros.tiddlerGroups.groupsList,null,true);\n config.macros.tiddlerGroups.refresh(); this.value=list; // reload list and select newly added item\n break;\n case '_edit':\n story.displayTiddler(null,config.macros.tiddlerGroups.groupsList,2);\n break;\n default:\n var list=v.readBracketedList();\n var expandedlist=[];\n for (var i=0; i<list.length; i++)\n if (list[i].substr(0,1)!='+') expandedlist.push(list[i]);\n else {\n var sublist=store.getTiddlerText(list[i].substr(1)).readBracketedList();\n for (var j=0; j<sublist.length; j++) expandedlist.push(sublist[j]);\n }\n if (config.options.chkGroupOpen) {\n for (var i=0; i<expandedlist.length; i++)\n list[i]=String.encodeTiddlyLink(expandedlist[i]);\n expandedlist=expandedlist.join(" ");\n var url=document.location.protocol+"//"+document.location.host+document.location.pathname+"#";\n url+=encodeURIComponent(list);\n window.open(url,"_blank");\n break;\n }\n if (config.options.chkGroupClose) story.closeAllTiddlers();\n var template=(config.options.chkGroupFold && store.tiddlerExists("CollapsedTemplate"))?"CollapsedTemplate":null;\n story.displayTiddlers(null,expandedlist,template);\n break;\n }\n }\n}\n//}}}
/***\n|''Name:''|TiddlerWithParamsPlugin|\n|''Version:''|1.0.1 (2006-03-22)|\n|''Source:''|http://tiddlywiki.abego-software.de/#TiddlerWithParamsPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n!Description\n\nThe TiddlerWithParamsPlugin extends the build-in {{{<<tiddler...>>}}} macro. It replaces placeholders ($1, $2, ...) in the given tiddler by values passed with the macro. Then it inserts the (replaced) text, just like the original {{{<<tiddler...>>}}} macro.\n\n''Syntax:'' \n|>|{{{<<}}}''tiddler '' //tiddlerName// [//className//] [''asText''] [''with:'' //arguments// ] [''prefix:'' //prefixString//] {{{>>}}}|\n|//tiddlerName//|The name of the tiddler to be included. The tiddler may contain placeholders ($1, $2, ... $9) that will be replaced with the values passed with the macro|\n|//className//|The (CSS) class to be used around the embedded tiddler|\n|''asText''|When defined the (replaced) content of the tiddler is inserted as pure text, i.e. it is not "wikified".|\n|//arguments//|up to 9 arguments may be passed to the macro, used as the values for the placeholders $1, $2, ... $9 in the referenced template|\n|//prefixString//|By default the placeholders $1, $2, $3,..., $9 are used. But you may change the "prefix" before the placeholder number ("$") to some other text through the "prefix:" option. This may be necessary when you are using the $n in the tiddler you are referencing (e.g. when you are using regular expressions).|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. ~~|\n\n!Example\n\nThe following ''//ProjectTemplate//'' tiddler defines an "Overview" page for a project, that gives access to various "sub-tiddlers" used in the project, that follow a static naming schema (e.g. all Notes for any project are stored in a tiddler called "//projectName// Notes"). $1 holds the name of the Project (e.g. "ForEachTiddler"), $2 holds the type of the published component (e.g. "Plugin", "Macro", "Function").\n{{{\n![[$1Project]] Overview\n* [[$1$2]]\n* [[ToDo|$1 ToDos]]\n* [[Notes|$1 Notes]]\n* [[Examples|$1Examples]]\n* [[Tests|$1 Tests]]\n* [[Open Bugs/CRs|$1 Open Bugs and ChangeRequests]]\n}}}\n\nThis template is now used in the ''//ForEachTiddlerProject//'' tiddler:\n{{{\n<<tiddler ProjectTemplate with: ForEachTiddler Plugin>>\n}}}\n\nThis results in the following tiddler text for the ''//ForEachTiddlerProject//'' tiddler:\n{{{\n![[ForEachTiddlerProject]] Overview\n* [[ForEachTiddlerPlugin]]\n* [[ToDo|ForEachTiddler ToDos]]\n* [[Notes|ForEachTiddler Notes]]\n* [[Examples|ForEachTiddlerExamples]]\n* [[Tests|ForEachTiddler Tests]]\n* [[Open Bugs/CRs|ForEachTiddler Open Bugs and ChangeRequests]]\n}}}\n\n!Revision history\n* v1.0.0 (2006-01-20)\n** initial version\n* v1.0.1 (2006-03-22)\n** Added 'asText' option\n** Support Safari (Thanks to Elise Springer for reporting the problem)\n!Code\n***/\n//{{{\n//============================================================================\n// TiddlerWithParamsPlugin\n//============================================================================\n\n// Ensure that the Plugin is only installed once.\n//\nif (!version.extensions.TiddlerWithParamsPlugin) {\n\nversion.extensions.TiddlerWithParamsPlugin = {\n major: 1, minor: 0, revision: 1, \n date: new Date(2006,3,22), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#TiddlerWithParamsPlugin"\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nvar indexInArray = function(array, item) {\n for (var i = 0; i < array.length; i++) {\n if (array[i] == item) {\n return i;\n }\n }\n return -1;\n}\n\nvar myEscapeRegExp = function(s)\n{\n // The original escapeRegExp function does not work with Safari (2.0.3) \n // since the $& is not implemented.\nvar t = s.replace(/\s\s/g, "\s\s\s\s");\n t = t.replace(/\s^/g, "\s\s^");\n t = t.replace(/\s$/g, "\s\s$");\n t = t.replace(/\s*/g, "\s\s*");\n t = t.replace(/\s+/g, "\s\s+");\n t = t.replace(/\s?/g, "\s\s?");\n t = t.replace(/\s(/g, "\s\s(");\n t = t.replace(/\s)/g, "\s\s)");\n t = t.replace(/\s=/g, "\s\s=");\n t = t.replace(/\s!/g, "\s\s!");\n t = t.replace(/\s|/g, "\s\s|");\n t = t.replace(/\s,/g, "\s\s,");\n t = t.replace(/\s{/g, "\s\s{");\n t = t.replace(/\s}/g, "\s\s}");\n t = t.replace(/\s[/g, "\s\s[");\n t = t.replace(/\s]/g, "\s\s]");\n t = t.replace(/\s./g, "\s\s.");\n\n return t;\n}\n\n// ---------------------------------------------------------------------------\n// The (hijacked) tiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n \n var className = null;\n var argsStart = -1;\n var doWikify = true;\n\n var iParams = 1;\n if (params[iParams] != "asText" && params[iParams] != "with:") {\n className = params[iParams++];\n }\n if (params[iParams] == "asText") {\n iParams++;\n doWikify = false;\n }\n if (params[iParams] == "with:") {\n iParams++;\n argsStart = iParams;\n }\n \n var wrapper = createTiddlyElement(place,"span",null,className ? className : null,null);\n var text = store.getTiddlerText(params[0]);\n if(text) {\n // Check for recursion\n var tiddlerName = params[0];\n var stack = config.macros.tiddler.tiddlerStack;\n if (stack.find(tiddlerName) !== null) return;\n\n if (argsStart >= 0) {\n // The params between the "with:" and the "prefix:" (or the end) are the arguments,\n // The param behind the "prefix:" is the prefix before the placeholder numbers.\n var argsEnd = params.length;\n var prefix = "$";\n var prefixIndex = indexInArray(params, "prefix:");\n if (prefixIndex >= argsStart) {\n argsEnd = prefixIndex;\n if (prefixIndex < (params.length-1)) {\n prefix = params[prefixIndex+1];\n }\n }\n // to avoid any "special RE chars" problems with the prefix string escape all chars.\n prefix = myEscapeRegExp(prefix);\n \n var args = params.slice(argsStart, argsEnd);\n var n = Math.min(args.length, 9);\n for (var i = 0; i < n; i++) {\n var value = args[i];\n \n var placeholderRE = new RegExp(prefix+(i+1),"mg");\n text = text.replace(placeholderRE, value);\n }\n }\n stack.push(tiddlerName);\n try {\n if (doWikify) {\n wikify(text,wrapper,null,store.getTiddler(params[0]));\n } else {\n wrapper.appendChild(document.createTextNode(text));\n }\n } finally { \n stack.pop();\n }\n }\n}\nconfig.macros.tiddler.tiddlerStack = [];\n\n// End of "install only once"\n}\n\n//============================================================================\n// End of TiddlerWithParamsPlugin\n//============================================================================\n//}}}\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
<<tiddler ReplaceTiddlerTitle with: "create a new card...">><<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerBackground>><<tiddler HideTiddlerTags>><<tiddler DoubleClickDisable>><<tiddlyCard add shownew>>
<html><form>\n<input type="hidden" name="cardtype" value="TiddlyCardsDefaultForm"><!-- source form (required)\n--><input type="text" onfocus="this.select()" style="width:20%" title="card id" name="cardID" value="card/document ID"><!-- tiddler name (required)\n--><input type="text" onfocus="this.select()" style="width:79%" title="title" name="title" value="title"><br><!--\n--><textarea rows="10" onfocus="this.select()" style="width:100%" title="notes" name="notes">notes</textarea><br><!--\n--><input type="text" onfocus="this.select()" style="width:100%" title="tags" name="tags" value="tags">\n</form></html>
TiddlyCards are like 3x5 cards with fill-in forms.\n\nEach card is stored in a tiddler tagged with<<tag TiddlyCard>>that contains two parts separated by "----":\n* the first part is an HTML form that defines the layout, text prompts, controls, event handlers and, most importantly, the saved data values for that card. TiddlyCards can display and store most of the usual HTML field control types, including: text fields, textareas (multi-line), listboxes / dropdown lists, checkboxes, and radio buttons.\n* the second part of a card, following the "----", is optional. When present, it contains TiddlyWiki-formatted content for ''read-only'' display of card data values embedded within normal tiddler content, using whatever presentation style you want.\n\nYou can define and use multiple card types within the same document. When a card tiddler has been tagged with<<tag TiddlyCardsForm>>, it will be recognized as a ''"tear-off" form'' that can be used to create new cards. The values stored in this form definition are used as the default values when creating new cards of that type. \n\nWhen you select the ''add a card...'' (or "create a new card...") command from the menu, a blank form is presented, using the current card type. You can the card type by selecting from a droplist of available card types that is shown in the bottom left corner of each card.\n\nWhen you are viewing the card type you want, you can enter new data values into the form fields and press the ''create'' button. Each new ~TiddlyCard you create is just a copy of the original card type definition with the data you entered filled in as new "default" values for each field.\n \nThe TiddlyCards standard distribution bundle comes with a few 'starter' types, including:\n* "TiddlyCardsDefaultForm"<<br>>a simple note-taking form.\n* "LibraryReferenceForm"<<br>>a "document librarian" to track the URLs and descriptive information for a collection of documents that have been published to a server for remote access over the net. //Note: this form provides examples of TiddlyCards-compliant syntax for all types of field controls and embedded field values.//\n* "AddressBookLongForm" and "AddressBookShortForm"<<br>>an interchangable pair of card types for tracking an "Address Book" of contact information.\n* "BookmarkForm"<<br>>a simple URL bookmark with summary and notes.\n* "CDCollectionForm"<<br>>quickly build a catalog of your favorite CD and DVD titles.\n\nWhile TiddlyCards form definitions can be copied/pasted from outside sources (such as other sites or site-generating tools, e.g., ~FrontPage, ~DreamWeaver, ~GoLive, etc.), the form HTML must follow certain key syntax rules in order for TiddlyCards to recognize and modify the field control names/values it contains.\n\nThe following table summarizes the various HTML field syntax //patterns// that must be matched to set/get each type of field control.\n\n|field type | matching HTML |\n|text |{{{name="..." value="..."> }}} |\n|checkbox|{{{type="checkbox" ... name="...">}}} |\n|radio |{{{type="radio" ... name="..." value="...">}}} |\n|textarea |{{{<textarea name="..." ...>...</textarea>}}} |\n|select |{{{<select name="..." ...><option value="..."><option value="...">...</select>}}} |\n^^//[ed. note: this reference table needs some more work//^^\n\nThe easiest way to create a new card type is to copy an existing definition (such as TiddlyCardsDefaultForm), and then edit the copy, using its current content as examples of 'well-formed' TiddlyCards-compliant HTML. Simply cut/copy/paste to alter the form field definitions to suit your purposes, while carefully maintaining the essential syntax needed by TiddlyCards.\n\n!!!!!Card Styles\nTiddlyCards automatically defines two CSS style classes for use when displaying card tiddlers:\n* ''tiddlyCard'' - defines the style of the element that contains the card content. This class is used to set border, background, default font size, etc.\n* ''tiddlyCardForm'' - defines the styles that are applied to HTML forms displayed by TiddlyCards. This class is used to set the font size for various form controls.\n----\n<script>return "{{{"+config.macros.tiddlyCard.cardStyles+"}}}"</script>\n----\n!!!!!Macro Syntax\n<<tiddler TiddlyCardsSampleMacros>>\n\n!!!!!More help coming soon:\n* Edit vs. View\n**wiki-formatted syntax with 'comment markers'\n* Converting data between card types\n** matching field names/types\n** using hidden fields to preserve data (short vs. long form)\n* getValue(id,fieldname) API for accessing card data via javascript\n* TiddlyCardsManager User's Guide:\n** Filtering\n*** show all cards\n*** match any tags\n*** match all tags\n*** text search\n*** pattern search\n** Display Options\n*** sort order\n*** date format\n*** default tagging\n*** form definitions\n*** display settings:\n**** sliding/floating panel width\n**** inline/sliding/floating panels\n**** show numbers/card ID/dates/types\n\n-e\nEric Shulman\nTiddlyTools
<script>\n var t=story.findContainingTiddler(place); if(!t) return;\n for (var i=0; i<t.childNodes.length; i++) {\n if (hasClass(t.childNodes[i],"tagging")||hasClass(t.childNodes[i],"tagged")) t.childNodes[i].style.display="none"; // hide tagging/tagged\n if (hasClass(t.childNodes[i],"viewer")) t.ondblclick=null; // disable double-click\n }\n config.macros.tiddlyCard.setOption(place,'shownew',false); // don't show automatically new card tiddlers when they are created\n</script>/%\n\n*** TOTAL CARD COUNT\n%/@@white-space:nowrap;text-align:left;<script>\n var c=config.macros.tiddlyCard.count(false); // get total card count\n var out='There '+(c==1?'is':'are')+' '+(c==0?'no':c)+' card'+(c==1?'':'s')+' in the catalog';\n place.card_count=c; // remember this for later\n return out;\n</script>@@/%\n\n*** VIEW/EDIT\n%/ &nbsp; <script label="view">\n if (!config.macros.tiddlyCard.getOption('viewmode')) config.macros.tiddlyCard.setOption(place,'viewmode',true); return false;\n</script><script>\n var viewmode=config.macros.tiddlyCard.getOption('viewmode');\n if (readOnly&&!viewmode) config.macros.tiddlyCard.setOption(place,'viewmode',true); // IMMEDIATE REFRESH\n place.lastChild.className="button";\n place.lastChild.title='disable card editing functions';\n place.lastChild.innerHTML=viewmode?"[view]":"view";\n</script><script label="edit">\n config.macros.tiddlyCard.setOption(place,'viewmode',!config.macros.tiddlyCard.getOption('viewmode')); return false;\n</script><script>\n var viewmode=config.macros.tiddlyCard.getOption('viewmode');\n if (readOnly) place.lastChild.onclick=function(e){alert('To edit cards, please download this document to your computer or disable "HideEditingFeatures when viewed over HTTP" (see TiddlyWiki AdvancedOptions)')};\n place.lastChild.className="button";\n place.lastChild.title=(viewmode?'enable':'disable')+' card editing functions';\n place.lastChild.innerHTML=viewmode?"edit":"[edit]";\n</script>/%\n\n*** FILTER PANEL\n%/+++(TiddlyCardShowFilter)[filter|search for cards based on tags, text, or text patterns]\n{{tiddlyCardsForm{<html><form style='display:inline'\n onsubmit="config.macros.tiddlyCard.refresh(this); return false"><!--\n--><select name='matchmode' style="width:20%" title='' \n onchange="if (!this.value.length) return; config.macros.tiddlyCard.setOption(this,'matchmode',this.value);">\n <option value='none'>show all cards</option>\n <option value='any'>match any tags</option>\n <option value='all'>match all tags</option>\n <option value='text'>text search</option>\n <option value='pattern'>pattern search</option><!--\n--></select><!--\n--><input type='text' name='filter' style='width:39%' title='enter search text/pattern OR a list of tags (space-separated)' value='' \n onfocus="this.select()" \n onchange="config.macros.tiddlyCard.setOption(this,'filter',this.value)"><!--\n--><select name='taglist' style="width:25%" title='select tiddler tags'\n onchange="this.form.filter.value+=' '+String.encodeTiddlyLink(this.value); config.macros.tiddlyCard.setOption(this,'filter',this.form.filter.value); this.selectedIndex=0;"><!--\n--></select><!--\n--><input type='button' style="width:15%" title='refresh the catalog display' value='refresh list'\n onclick="config.macros.tiddlyCard.refresh(this)"> <!--\n--></form></html><script>\n var f=place.lastChild.firstChild;\n f.matchmode.value=config.macros.tiddlyCard.getOption('matchmode');\n f.filter.disabled=(f.matchmode.value=='none');\n f.filter.value=f.filter.disabled?'':config.macros.tiddlyCard.getOption('filter');\n f.taglist.disabled=!(f.matchmode.value=='all'||f.matchmode.value=='any');\n f.taglist.options[0]=new Option(f.taglist.disabled?'':'select tags...','',false,false);\n var tags=store.getTags(); for (var i=0; i<tags.length; i++)\n f.taglist.options[f.taglist.length]=new Option(tags[i][0],tags[i][0],false,false);\n</script>}}}<script>\n place.id='TiddlyCards_filterPanel';\n var width=config.macros.tiddlyCard.getOption('sliderwidth');\n if (!width.length || width=="auto") width="45em"; // DON'T ALLOW AUTO STRETCH\n place.defaultPanelWidth=place.style.width=width;\n</script>===/%\n\n*** EXPAND/COLLAPSE\n%/<script label="expand">\n config.macros.tiddlyCard.setOption(place,'expand',!config.macros.tiddlyCard.getOption('expand')); return false;\n</script><script>\n var expand=config.macros.tiddlyCard.getOption('expand');\n place.lastChild.className="button";\n place.lastChild.title=(expand?'hide':'show')+' all card details';\n place.lastChild.innerHTML=expand?"collapse":"expand";\n if (config.macros.tiddlyCard.getOption('panelmode')=='inline') place.lastChild.style.display="none";\n</script>/%\n\n*** OPTIONS\n%/+++^30em^[options|Configure TiddlyCards]\n<script>\n if (config.macros.moveablePanel!=undefined) return '<<moveablePanel>>'\n</script>~TiddlyCards options\n@@font-size:8pt;{{tiddlyCardsForm{<html><form style='display:inline' \n onsubmit="return false"><!--\n\n*** GROUPBOX\n--><div style='text-align:center;border:1px solid #999;color:#000;background:#fff;padding:.3em .5em;-moz-border-radius:.5em;'><!--\n\n*** SHOW ID/NUMBERS/DATES/TYPES\n--><div style='border-bottom:1px dotted;margin-bottom:2px;'><!--\n-->headings: <!--\n--><input type='checkbox' name='shownumber' \n onclick="config.macros.tiddlyCard.setOption(this,'shownumber',this.checked);">numbered <!--\n--><input type='checkbox' name='showID' \n onclick="config.macros.tiddlyCard.setOption(this,'showID',this.checked);">card ID <!--\n--><input type='checkbox' name='showdate' \n onclick="config.macros.tiddlyCard.setOption(this,'showdate',this.checked);">date <!--\n--><input type='checkbox' name='showtype' \n onclick="config.macros.tiddlyCard.setOption(this,'showtype',this.checked);">type<!--\n--></div><!--\n\n*** INLINE/FLOAT/SLIDE\n--><div style='display:block;float:left;text-align:left;padding-right:1em;border-right:1px dotted'><!--\n--><input type='radio' name='panelmode' value='inline'\n onclick="config.macros.tiddlyCard.setOption(this,'panelmode',this.value);">inline panels<br><!--\n--><input type='radio' name='panelmode' value='slide'\n onclick="config.macros.tiddlyCard.setOption(this,'panelmode',this.value);">sliding panels<br><!--\n--><input type='radio' name='panelmode' value='float' \n onclick="config.macros.tiddlyCard.setOption(this,'panelmode',this.value);">floating panels<br><!--\n--></div><!--\n\n*** PANEL WIDTHS AND STYLE CLASS\n--><div style='display:block;text-align:right;padding-bottom:.25em;'><!--\n-->card style class <input type='text' style='width:6em' name='cardclass' value='' title='CSS class name'\n onchange="config.macros.tiddlyCard.setOption(this,'cardclass',this.value);"><br><!--\n-->sliding panel width <input type='text' style='width:6em' name='sliderwidth' value='70%' title='CSS width (%,px,em,cm,in)'\n onchange="config.macros.tiddlyCard.setOption(this,'sliderwidth',this.value);"><br><!--\n-->floating panel width <input type='text' style='width:6em' name='width' value='70%' title='CSS width (%,px,em,cm,in)'\n onchange="config.macros.tiddlyCard.setOption(this,'width',this.value);"><br><!--\n--></div><!--\n\n--></div><!--\n*** END GROUPBOX\n\n*** SORT ORDER\n-->sort cards by<br><!--\n--><select name='sortby' style='width:50%' title='select a card property'\n onchange="if (!this.value.length) return; config.macros.tiddlyCard.setOption(this,'sortby',this.value)">\n <option value='title'>card ID</option>\n <option value='created'>date/time created</option>\n <option value='modified'>date/time modified</option>\n <option value='modifier'>username</option><!--\n--></select><select name='sortdir' style='width:50%' title=''\n onchange="if (!this.value.length) return; config.macros.tiddlyCard.setOption(this,'sortdir',this.value)">\n <option value='1'>ascending</option>\n <option value='-1'>descending</option><!--\n--></select><br><!--\n\n*** STORAGE METHOD\n--><div style='display:block;float:right;width:50%'>data storage method<br><!--\n--><select style='width:100%' name='storeformat'\n onchange="config.macros.tiddlyCard.setOption(this,'storeformat',this.value);">\n <option value='forms'>HTML forms</option>\n <option value='embeddedfields'>TiddlyWiki Embedded Fields</option>\n <option value='dataplugin'>DataTiddlerPlugin</option><!--\n--></select></div><!--\n\n*** DATE FORMAT\n--><div style='display:block;float:left;width:48.5%'>date display format<br><!--\n--><input type='text' style='width:100%' name='dateformat' value='DDD, MMM DDth, 0hh:0mm:0ss'\n onchange="config.macros.tiddlyCard.setOption(this,'dateformat',this.value);"><!--\n--></div><!--\n\n*** DEFAULT TAGS\n--><div style="display:block;clear:both;">tag new cards with<br><!--\n--><input type='text' style='width:99%' name='deftags' value='excludeLists excludeMissing'\n onchange="config.macros.tiddlyCard.setOption(this,'deftags',this.value);"></div><!--\n\n*** OPTIONS BUTTONS\n--><div style='text-align:center;margin-top:.5em'><!--\n--><input type='button' style='width:25%' value='refresh list'\n onclick="config.macros.tiddlyCard.refresh(this)"> <!--\n--><input type='button' style='width:25%' value='use defaults'\n onclick="config.macros.tiddlyCard.initoptions(true); config.macros.tiddlyCard.refresh(this)"><!--\n--></div><!--\n\n--></form></html><script>\n var f=place.lastChild.firstChild;\n f.sortby.value=config.macros.tiddlyCard.getOption('sortby')\n f.sortdir.value=config.macros.tiddlyCard.getOption('sortdir');\n f.panelmode[0].checked=config.macros.tiddlyCard.getOption('panelmode')=="inline";\n f.panelmode[1].checked=config.macros.tiddlyCard.getOption('panelmode')=="slide";\n f.panelmode[2].checked=config.macros.tiddlyCard.getOption('panelmode')=="float";\n f.cardclass.value=config.macros.tiddlyCard.getOption('cardclass');\n f.width.value=config.macros.tiddlyCard.getOption('width');\n f.sliderwidth.value=config.macros.tiddlyCard.getOption('sliderwidth');\n f.showID.checked=config.macros.tiddlyCard.getOption('showID');\n f.shownumber.checked=config.macros.tiddlyCard.getOption('shownumber');\n f.showtype.checked=config.macros.tiddlyCard.getOption('showtype');\n f.showdate.checked=config.macros.tiddlyCard.getOption('showdate');\n f.dateformat.value=config.macros.tiddlyCard.getOption('dateformat');\n f.deftags.value=config.macros.tiddlyCard.getOption('deftags');\n f.storeformat.value=config.macros.tiddlyCard.getOption('storeformat');\n</script>}}}@@<script>\n place.id='TiddlyCards_optionsPanel';\n</script>===/%\n\n*** HELP\n%/+++^70%^[help]\n<script>\n if (config.macros.moveablePanel!=undefined) return '<<moveablePanel>>'\n</script>TiddlyCardsHelp\n @@display:block;white-space:normal;height:25em;border:1px solid;background:#ffe;padding:0.5em;overflow:auto;/%\n %/<<tiddler TiddlyCardsHelp>>/%\n %/@@@@display:block;text-align:right;/%\n %/^^scroll for more...^^@@/%\n%/<script>\n place.id='TiddlyCards_helpPanel';\n</script>===/%\n\n*** EDITOR PANEL\n%/@@display:none;<script>\n place.id='TiddlyCards_editorPanel';\n place.style.display=config.macros.tiddlyCard.getOption('viewmode')?"none":"block";\n</script><html><hr></html>/%\n\n*** ADD CARD\n%/+++^[add a card...|add a card to the catalog]\n<script>\n if (config.macros.moveablePanel!=undefined && config.macros.tiddlyCard.getOption('panelmode')=='float') return '<<moveablePanel>>'\n</script>Add a new card to the catalog\n----\n<script>\n place.id='TiddlyCards_addPanel';\n place.button.id='TiddlyCards_addButton';\n var float=config.macros.tiddlyCard.getOption('panelmode')=='float';\n place.className=float?'floatingPanel':'sliderPanel';\n var width=!float?config.macros.tiddlyCard.getOption('sliderwidth'):config.macros.tiddlyCard.getOption('width');\n place.defaultPanelWidth=place.style.width=width;\n if (!float) { var s=place.style; s.margin='1em';s.borderLeft='1px solid';s.paddingLeft='1em'; }\n return config.macros.tiddlyCard.getblankform(config.macros.tiddlyCard.getOption('currform'),place.button.id);\n</script>===/%\n\n*** DELETE ALL CARDS\n%/<script label="delete all cards...">\n if (!confirm("Are you sure you want to remove all TiddlyCards from this document?")) return false;\n var tiddlers=store.getTiddlers('title');\n var count=0;\n for (var i=0; i<tiddlers.length; i++) if (tiddlers[i].tags.find('TiddlyCard')!=null)\n { story.closeTiddler(tiddlers[i].title); store.deleteTiddler(tiddlers[i].title); store.setDirty(true); count++; }\n if (!count) return false;\n config.macros.tiddlyCard.refresh(place);\n clearMessage(); displayMessage("All TiddlyCards have been removed");\n return false;\n</script><script>\n place.lastChild.className="button";\n place.lastChild.title='remove ALL TiddlyCard data from this document';\n</script>/%\n\n*** CARD TYPE DEFINITIONS\n%/+++(TiddlyCardShowFormDefinitions)[card types...|view/edit TiddlyCards form type definitions]\n{{tiddlyCardsForm{<html><form style='display:inline' onsubmit='return false'><!--\n--><select name='cardforms' style='width:55%' title='select a card type'></select><!--\n--><input type='button' style='width:15%' value='set' title='set this type as the default for creating new cards'\n onclick="var val=this.form.cardforms.value; if (!val.length) { alert('Please select a card type'); return; } config.macros.tiddlyCard.setOption(this,'currform',val);"><!--\n--><input type='button' style='width:15%' value='edit' title='modify this form definition'\n onclick="var val=this.form.cardforms.value; if (!val.length) { alert('Please select a card type'); return; } story.displayTiddler(null,val,2);"><!--\n--><input type='button' style='width:15%' value='copy' title='duplicate this form definition'\n onclick="var val=this.form.cardforms.value; if (!val.length) { alert('Please select a card type'); return; } alert('copy form: not yet available...');"><!--\n--></form></html><script>\n var f=place.lastChild.firstChild;\n var currform=config.macros.tiddlyCard.getOption('currform');\n f.cardforms.options[f.cardforms.length]=new Option("select a form definition...","",false,false);\n var tiddlers=store.getTiddlers('title');\n for (var i=0; i<tiddlers.length; i++) if (tiddlers[i].tags.find('TiddlyCardsForm')!=null)\n f.cardforms.options[f.cardforms.length]=new Option(tiddlers[i].title+(currform==tiddlers[i].title?' (default)':''),tiddlers[i].title,false,false);\n f.cardforms.value=currform;\n</script>}}}<script>\n place.id='TiddlyCards_formsPanel';\n var width=config.macros.tiddlyCard.getOption('sliderwidth');\n if (!width.length || width=="auto") width="45em"; // DON'T ALLOW AUTO STRETCH\n place.defaultPanelWidth=place.style.width=width;\n place.style.marginBottom='.3em'; // adjust margins\n</script>===/%\n\n*** MOVE EDITOR PANELS\n%/\n<script>\n if (config.macros.tiddlyCard.getOption('panelmode')!='float')\n place.insertBefore(document.getElementById('TiddlyCards_addPanel'),null); // move 'add' panel here\n place.insertBefore(document.getElementById('TiddlyCards_formsPanel'),null); // move 'forms' panel here\n</script>@@<html><hr></html>/%\n\n*** MOVE FILTER PANEL, DISPLAY FILTER SUMMARY\n%/<script>\n place.insertBefore(document.getElementById('TiddlyCards_filterPanel'),null); // move filter panel here\n document.getElementById('TiddlyCards_filterPanel').style.marginBottom='.3em'; // adjust margins\n var c=config.macros.tiddlyCard.count(true); // get matching card count\n var filt=config.macros.tiddlyCard.getOption('filter').trim();\n var mode=config.macros.tiddlyCard.getOption('matchmode');\n var msgs = { all: "tagged with", any: "tagged with", text: "containing", pattern: "matching", none: '' }\n var filtlist=filt.readBracketedList();\n if (mode=="any" && filtlist.length==1) mode="all"; // just one tag...\n if (mode=="all") filt=filtlist.join('" __and__ "');\n if (mode=="any") filt=filtlist.join('" __or__ "');\n var msg= '@@font-size:90%;filter: There %0 %1 card%2 __%3__ "%4"@@\sn'.format([c==1?'is':'are', c==0?'no':c, c==1?'':'s', msgs[mode], filt]);\n return (mode!='none'&&filt.length?msg:'')\n</script>/%\n\n*** CARD LIST\n%/<script>\n var field=config.macros.tiddlyCard.getOption('sortby');\n var dir=config.macros.tiddlyCard.getOption('sortdir');\n var tiddlers=store.getTiddlers(field);\n tiddlers.sort(function(a,b){if(a[field]==b[field])return(0);else return(a[field]<b[field])?-dir:dir;});\n var shownumber=config.macros.tiddlyCard.getOption('shownumber');\n var spacer=config.macros.tiddlyCard.getOption('panelmode')=='inline'?'<<br>>':'';\n var out=''; var filter=config.macros.tiddlyCard.getOption('filter');\n for (var i=0; i<tiddlers.length; i++)\n if (tiddlers[i].tags.find('TiddlyCard')!=null && config.macros.tiddlyCard.match(tiddlers[i],filter))\n out+=(shownumber?'# ':'')+config.macros.tiddlyCard.render(tiddlers[i])+spacer+'\sn';\n return out;\n</script>/%\n\n*** VERSION NOTICE\n%/@@display:block;color:#999;~~//~TiddlyCards Manager v0.9.5 ALPHA pre-release - do not distribute - subject to change without notice//~~@@
+++^30em^[card catalog]...\n <<moveablePanel>>card catalog: [[add card|TiddlyCardsAddACard]]<script>\n place.lastChild.className="button"; if (readOnly) place.lastChild.style.display="none";\n</script> &nbsp; <script label="refresh list">\n config.refreshers.content(document.getElementById("siteMenu"));\n window.setTimeout("var e=document.getElementById('SiteMenuExtras_TiddlyCards_catalog'); e.onclick({target:e});",1);\n return false;\n </script>\n----\n {{small{<<tiddlyCard list>>}}}===\n<script>\n place.lastChild.button.id='SiteMenuExtras_TiddlyCards_catalog';\n</script> &nbsp; [[card manager|TiddlyCardsManager]]<script>\n place.lastChild.className="button";\n</script> &nbsp; +++^70%^[help]\n <<moveablePanel>>TiddlyCardsHelp\n @@display:block;white-space:normal;height:25em;border:1px solid;background:#ffe;padding:0.5em;overflow:auto;/%\n %/<<tiddler TiddlyCardsHelp>>/%\n %/@@@@display:block;text-align:right;/%\n %/^^scroll for more...^^@@/%\n %/===\n<script>\n place.style.marginLeft="1em";\n</script>
/***\n''TiddlyCardsPlugin for TiddlyWiki 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsources: http://www.TiddlyTools.com/#TiddlyCardsPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\nstatus: ''BETA/pre-release'' - subject to change without notice\nsee also:\n<<<\nrequired:\n*http://www.TiddlyTools.com/#InlineJavascriptPlugin\n*http://www.TiddlyTools.com/#NestedSlidersPlugin\nrecommended:\n*http://www.TiddlyTools.com/#TiddlyCardsDefaultForm (default card type)\n*http://www.TiddlyTools.com/#TiddlyCardsManager (admin interface)\noptional:\n*http://www.TiddlyTools.com/#MoveablePanelPlugin (resize/reposition floating panels)\n*http://www.TiddlyTools.com/#HTMLFormattingPlugin (mix wiki formatting inside HTML forms)\n*http://www.TiddlyTools.com/#TiddlyCardsHelp (documentation)\n*http://www.TiddlyTools.com/#TiddlyCardsSampleScript (inline script example)\n<<<\n!!!!!Configuration\n<<<\n<<option chkTiddlyCards_usecardtemplates>> view/edit card using TiddlyCards templates\n<<<\n!!!!!Usage\n<<<\n<<tiddler TiddlyCardsHelp>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TiddlyCardsPlugin'' (tagged with <<tag systemConfig>>)\n''TiddlyCards'' (admin tools - uses InlineJavascriptPlugin)\n<<<\n!!!!!Revision History\n<<<\n''2006.07.24 [0.9.8]'' in setField_Text(), added support for {{{/%fieldname="formatstring"%/}}} syntax (e.g.: {{{/%foo="[img[%0]]"%//%foo%/}}}, where %0 is the value of the text field.\n''2006.07.10 [0.9.7]'' added template rendering for stand-alone tiddlycards\n''2006.07.03 [0.9.6]'' added {{{<<tiddlyCard...>>}}} macro for embedding cards in other tiddlers, rewrote render() for new display options\n''2006.06.30 [0.9.5]'' completed re-write as plugin code. Added readOnly handling. Lots of fixes and new features.\n''2006.06.28 [0.9.1]'' begin migration to plugin code\n''2006.06.26 [0.9.0]'' major code re-write. New features: view vs. edit, embedded value rendering, getValue() API\n''2006.06.22 [0.8.7]'' improved handling for hidden fields to allow "round-trip" conversions between short- and long- versions of forms\n''2006.06.22 [0.8.5]'' added handling for radio buttons and select lists. Added tiddlcards_reopen() to redisplay card panel after converting\n''2006.06.21 [0.8.0]'' added setOption()/getOption() functions for handling cookie-based options \n''2006.06.20 [0.7.0]'' changed window.* to config.* to avoid unneeded global scoping of functions and variables\n''2006.06.20 [0.6.5]'' renamed to "TiddlyCards". Restructured menus/tools/options. Added more features.\n''2006.06.20 [0.6.0]'' alpha update\n''2006.06.19 [0.5.5]'' alpha update\n''2006.06.18 [0.5.0]'' initial alpha pre-release\n''2006.06.14 [0.0.0]'' started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.tiddlyCards= {major: 0, minor: 9, revision: 8, date: new Date(2006,7,24)};\n\nconfig.macros.tiddlyCard= { \n\n // CSS ==================\n cardStyles: "\s\n .tiddlyCard { display:block;clear:both;border:1px solid;padding:1em;-moz-border-radius:1em }\s\n .tiddlyCardsForm { white-space:nowrap; }\s\n .tiddlyCardsForm input, .tiddlyCardsForm textarea, .tiddlyCardsForm button, \s\n .tiddlyCardsForm checkbox, .tiddlyCardsForm radio, .tiddlyCardsForm select { font-size:8pt; }\s\n ",\n\n // TEMPLATES ==================\n viewTemplate: "\s\n <div class='toolbar' macro='toolbar collapseTiddler collapseOthers closeTiddler closeOthers +editTiddler permalink references jump'></div>\s\n <span class='title' macro='view title'></span> \s\n <span class='subtitle'><span macro='view modifier link'></span>, \s\n <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</span>\s\n <div class='viewer' macro='tiddlyCard \s"\s" view inline hideID hidedate hidetype'></div>",\n\n editTemplate: "\s\n <div class='toolbar' macro='toolbar -cancelTiddler'></div>\s\n <div class='title' macro='view title'></div>\s\n <div class='viewer' macro='tiddlyCard \s"\s" edit inline hideID hidedate hidetype shownew'></div>",\n collapsedTemplate: "\s\n <div class='toolbar' macro='toolbar expandTiddler collapseOthers -closeTiddler closeOthers +editTiddler permalink references jump'></div>\s\n <div class='title' macro='view title' ondblclick='if (config.commands.collapseOthers.handler!=undefined) \s\n config.commands.collapseOthers.handler(null,place,story.findContainingTiddler(this).getAttribute(\s"tiddler\s"));}'></div>",\n\n // MESSAGES ===================\n cardNotFoundErr: "missing card: {{{%0}}}",\n selectTypeMsg: "Please select a card type",\n showDateMsg: " @@font-size:90%;was updated by ''%7'' on ''%1''@@",\n\n // MACRO ===================\n handler:\n function(place,macroName,params) {\n var add=false;\n var get=false;\n var list=false;\n var view=true;\n var expand=false;\n var panelmode="inline";\n var showID=false;\n var showdate=false;\n var showtype=false;\n var shownew=false;\n var cardclass="tiddlyCard";\n var id=params.shift(); // first param is the cardID\n var noIDNeeded=['list', 'add']; // except for list/add functions\n while (params[0]||noIDNeeded.contains(id)) {\n if (noIDNeeded.contains(id)) { var p=id; id=''; } // use id as normal param\n else var p=params.shift();\n if (p && p.substr(0,6)=="class:") { cardclass=p.substr(6); continue; }\n switch (p) {\n case 'add': add=true; break;\n case 'list': list=true; var fmt=params.shift(); var sortby=params.shift(); var sortdir=params.shift(); break;\n case 'get': get=true; var field=params.shift(); break;\n case 'view': view=true; break;\n case 'edit': view=false; break;\n case 'expand': expand=true; break;\n case 'collapse': expand=false; break;\n case 'inline': case 'slide': case 'float': panelmode=p; break;\n case 'showID': showID=true; break;\n case 'showdate': showdate=true; break;\n case 'showtype': showtype=true; break;\n case 'shownew': shownew=true; break;\n case 'hideID': showID=false; break;\n case 'hidedate': showdate=false; break;\n case 'hidetype': showtype=false; break;\n }\n }\n this.setOption(place,"shownew",shownew);\n var out="";\n if (add) out=this.getblankform(this.getOption('currform'),null,cardclass);\n else if (list) out=this.listcards(sortby,sortdir,fmt);\n else {\n if (!id || !id.length) { var here=story.findContainingTiddler(place); if (here) id=here.getAttribute("tiddler"); }\n var tiddler=store.getTiddler(id);\n if (!tiddler) { wikify(this.cardNotFoundErr.format(params),place); return; }\n if (get) out=this.getValue(tiddler.title,field);\n else out=this.render(tiddler,view,expand,panelmode,showID,showdate,showtype,cardclass)\n }\n wikify(out,place);\n },\n\n // OPTIONS ===================\n defaults: {\n chkTiddlyCards_usecardtemplates: true, // true==TiddlyCard templates, false=standard tiddler templates\n chkTiddlyCards_viewmode: true, // true==view, false==edit\n chkTiddlyCards_expand: false, // open all card sliders\n chkTiddlyCards_showID: true, // show card id\n chkTiddlyCards_showdate: false, // show mod date\n chkTiddlyCards_showtype: false, // show card type\n chkTiddlyCards_shownumber: true, // show card # in list\n chkTiddlyCards_shownew: true, // show card tiddler when newly created\n txtTiddlyCards_currform: "TiddlyCardsDefaultForm", // tiddler name\n txtTiddlyCards_panelmode: "slide", // inline, slide, float\n txtTiddlyCards_matchmode: "none", // filter: any/all tags, text/pattern search\n txtTiddlyCards_cardclass: "tiddlyCard", // custom CSS class for rendering cards\n txtTiddlyCards_filter: "", // space-separated list of tags. blank=match all\n txtTiddlyCards_sortby: "modified",\n txtTiddlyCards_sortdir: "-1", // -1==descending, +1=ascending\n txtTiddlyCards_width: "70%", // floating panel width. blank==auto\n txtTiddlyCards_sliderwidth: "auto", // slider panel width. blank==auto\n txtTiddlyCards_dateformat: "DDD, MMM DDth, 0hh:0mm:0ss",\n txtTiddlyCards_deftags: "excludeMissing",\n txtTiddlyCards_storeformat: "forms", // forms vs. TWEFs vs. DataTiddlerPlugin - TBD...\n txtTiddlyCards_autosave: false // true==write card after each onChange event - TBD...\n },\n\n initoptions: // make sure all card options are defined (set defaults as needed)... force==true: reset all options to defaults and clear cookies\n function(force) { for (var opt in this.defaults) if (force||config.options[opt]==undefined) this.resetOptionCookie(opt); },\n \n setOption: // toggle option cookies and refresh display\n function(place,which,val) {\n var cookie="chkTiddlyCards_"+which;\n if (config.options[cookie]==undefined) cookie="txtTiddlyCards_"+which;\n if (config.options[cookie]==undefined) { alert("Unknown option: "+which); return false; }\n config.options[cookie]=val;\n if (config.options[cookie]!=this.defaults[cookie]) saveOptionCookie(cookie); else this.resetOptionCookie(cookie);\n if (which=="storeformat") // TEMPORARY NOTICE\n { alert('Sorry, use of alternative storage formats is not yet available.'); place.selectedIndex=0; }\n if (which=="autosave") // TEMPORARY NOTICE\n { alert('Sorry, autosaving card changes is not yet available.'); place.checked=false; }\n if (which=="panelmode") // SIDE EFFECT\n this.resetOptionCookie("chkTiddlyCards_expand");\n if (which=="viewmode"||which=="expand"||which=="currform"||which=="matchmode") // IMMEDIATE REDISPLAY WHEN SET\n this.refresh(place);\n return false;\n },\n\n getOption: // retrieve option cookie value\n function(which) {\n var cookie="chkTiddlyCards_"+which;\n if (config.options[cookie]==undefined) cookie="txtTiddlyCards_"+which;\n if (config.options[cookie]==undefined) { alert("Unknown option: "+which); return ""; }\n return config.options[cookie];\n },\n\n resetOptionCookie: // reset internal value and remove cookie\n function (name) {\n config.options[name]=this.defaults[name];\n ex = new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = name+"=novalue; path=/; expires="+ex.toGMTString();\n },\n\n // CARD FORM DEFINITION ===================\n header: // form header\n '@@display:block;width:100%;'\n +'{{tiddlyCardsForm{<html><form %0 style="display:inline;padding:0;margin:0;white-space:nowrap" onsubmit="if (!this.action||!this.action.length) return false">'\n +'<!--\sn\snBEGIN DATA FIELDS:\sn-->',\n\n footer: // form footer (with TiddlyCard function buttons)\n '<!--\snEND DATA FIELDS\sn\sn-->'\n +'<div style="width:100%;text-align:center;margin-top:.5em;">'\n +'<span style="float:left">'\n +'<select name=currform size=1'\n +' onchange="if (!this.selectedIndex) return; if (this.value==\s'\s') { this.selectedIndex=0; return; };'\n +' config.macros.tiddlyCard.convert(this,this.value); if (this) this.selectedIndex=0">'\n +'</select>'\n +'<input type="button" value="edit type" title="modify this form definition"'\n +' onclick="var val=this.form.currform.value; if (!val.length)'\n +' { alert(config.macros.tiddlyCard.selectTypeMsg); return; } story.displayTiddler(null,val,2);">'\n +'</span>'\n +'<span style="float:right">'\n +'<input type="button" name="savebutton" value=" save " onclick="config.macros.tiddlyCard.save(this)"> '\n +'<input type="button" value="save as" onclick="config.macros.tiddlyCard.saveas(this)"> '\n +'<input type="button" value="delete" onclick="config.macros.tiddlyCard.remove(this)"> '\n +'</span>'\n +'&nbsp;<input type="checkbox" name="autosave" '\n +' onclick="config.macros.tiddlyCard.setOption(this,\s'autosave\s',this.checked);">autosave&nbsp;'\n +'</div><div style="display:block;clear:both;"></div></form></html>'\n +'<script'+'>'\n +' var f=place.lastChild.firstChild;'\n +' f.currform.options[f.currform.length]=new Option("type: "+f.cardtype.value,f.cardtype.value,false,false);'\n +' f.currform.options[f.currform.length]=new Option("convert card to:","",false,false);'\n +' var tiddlers=store.getTiddlers("title");for (var i=0; i<tiddlers.length; i++)'\n +' if (tiddlers[i].tags.find("TiddlyCardsForm")!=null)'\n +' f.currform.options[f.currform.length]=new Option("\sxa0\sxa0\sxa0"+tiddlers[i].title,tiddlers[i].title,false,false);'\n +' f.currform.selectedIndex=0;'\n +' f.autosave.checked=config.macros.tiddlyCard.getOption("autosave");'\n +'</script'+'>}}}@@',\n\n newfooter: // form footer (for creating NEW TiddlyCards)\n '<!--\snEND DATA FIELDS\sn\sn-->'\n +'<div style="width:100%;margin-top:.5em;">'\n +'<span style="float:left">'\n +' <select name=currform size=1 title="select a TiddlyCard form"' \n +' onchange="if (!this.selectedIndex || !this.value.length) return;'\n +' config.macros.tiddlyCard.setOption(this,\s'currform\s',this.value);'\n +' config.macros.tiddlyCard.reopen(\s'%0\s');">'\n +' </select>'\n +'<input type="button" value="edit type" title="modify this form definition"'\n +' onclick="var val=this.form.currform.value; if (!val.length)'\n +' { alert(config.macros.tiddlyCard.selectTypeMsg); return; } story.displayTiddler(null,val,2);">'\n +'</span>'\n +'<span style="float:right">'\n +' <input type="button" value=" create this card " onclick="config.macros.tiddlyCard.save(this)">'\n +'</span>'\n +'<div style="display:block;clear:both;"></div></form></html>'\n +'<script'+'>'\n +' var f=place.lastChild.firstChild;'\n +' f.currform.options[f.currform.length]=new Option("type: "+f.cardtype.value,f.cardtype.value,false,false);'\n +' f.currform.options[f.currform.length]=new Option("create a card using:","",false,false);'\n +' var tiddlers=store.getTiddlers("title");for (var i=0; i<tiddlers.length; i++)'\n +' if (tiddlers[i].tags.find("TiddlyCardsForm")!=null)'\n +' f.currform.options[f.currform.length]=new Option("\sxa0\sxa0\sxa0"+tiddlers[i].title,tiddlers[i].title,false,false);'\n +' f.currform.selectedIndex=0;'\n +'</script'+'>}}}@@',\n\n getblankform: // get assembled blank header+form tiddler+footer\n function(formtid,buttonID,cardclass) {\n if (cardclass==undefined) var cardclass=this.getOption('cardclass').length?this.getOption('cardclass'):'_noclassname_';\n if (!store.tiddlerExists(formtid)) formtid=this.defaults.txtTiddlyCards_currform; // FALLBACK\n var text=store.getTiddlerText(formtid); if (!text) text="";\n var body=text.split("\sn----\sn")[0];\n var re=new RegExp('<form(.*)>',"img");\n var extras=re.exec(body);\n var header=this.header.format([extras&&extras[1]?extras[1]:""]);\n body=body.replace(/<(html|form).*>\ss+/,'').replace(new RegExp("\s\ss+</(html|form).*>"),''); // remove html/form tags\n var out="{{"+cardclass+"{<script>place.style.display='block'</script>"+header+body+this.newfooter.format([buttonID])+"}}}";\n return out;\n },\n\n // DISPLAY FUNCTIONS ===================\n render: // render tiddlycard contents\n function(tiddler,view,expand,panelmode,showID,showdate,showtype,cardclass) {\n if (view==undefined) var view=this.getOption('viewmode');\n if (expand==undefined) var expand=this.getOption('expand');\n if (panelmode==undefined) var panelmode=this.getOption('panelmode');\n if (showID==undefined) var showID=this.getOption('showID');\n if (showdate==undefined) var showdate=this.getOption('showdate');\n if (showtype==undefined) var showtype=this.getOption('showtype');\n if (cardclass==undefined) var cardclass=this.getOption('cardclass').length?this.getOption('cardclass'):'_noclassname_';\n var card="";\n if (showID||showdate||showtype)\n card+="{{{%0 %1 %2}}}"+(panelmode!="inline"?"<<br>>":"");\n if (panelmode!="inline") // slider/floating panel\n card+="+++"+(expand?"+":"")+((panelmode!='float')||expand?"[%3]>...":"^%4^[%3]...%5");\n if ((panelmode!="float")||expand) // inline/slider: header goes inside card\n card+="{{%8{<script>place.style.display='block'</script>";\n if (showID||showdate||showtype||((panelmode=='float')&&!expand))\n card+="[[%6]]"+(showdate?config.macros.tiddlyCard.showDateMsg:"")+"<html><hr></html>";\n if ((panelmode=="float")&&!expand) // floating: header goes before card\n card+="{{%8{<script>place.style.display='block'</script>";\n card+="%9}}}";\n var card=card.format([\n showID?(tiddler.title+": "):"",\n showdate?tiddler.modified.formatString(this.getOption('dateformat')):"",\n showtype?" ("+this.getValue(tiddler.title,"cardtype")+")":"",\n this.getValue(tiddler.title,"title"),\n this.getOption('width'), \n config.macros.moveablePanel==undefined?"":("<<moveablePanel>>"),\n tiddler.title,\n tiddler.modifier,\n cardclass,\n this.getCard(tiddler,view)]);\n if (panelmode!='inline') {\n var buttonid="TiddlyCards_"+tiddler.title.replace(/["']/img,"_");\n card+="<script>place.style.width=config.macros.tiddlyCard.getOption('panelmode')!='float'||config.macros.tiddlyCard.getOption('expand')?";\n card+=" config.macros.tiddlyCard.getOption('sliderwidth'):config.macros.tiddlyCard.getOption('width');</script>";\n card+="===<script>place.lastChild.button.id='"+buttonid+"'</script>";\n }\n return card;\n },\n\n listcards: // list tiddlycard IDs, using specified format string\n function(sortby,sortdir,fmt) {\n var out="";\n if (!sortby||!sortby.length) var sortby="modified";\n if (!sortdir) var sortdir=-1;\n if (!fmt||!fmt.length) var fmt="[[%0]]<<br>>";\n var tiddlers=store.getTiddlers(sortby);\n tiddlers.sort(function(a,b){if(a[sortby]==b[sortby])return(0);else return(a[sortby]<b[sortby])?-sortdir:sortdir;});\n for (var i=0; i<tiddlers.length; i++) {\n if (tiddlers[i].tags.find("TiddlyCard")==null) continue;\n out+=Tiddler.unescapeLineBreaks(fmt).format([tiddlers[i].title,tiddlers[i].modified,tiddlers[i].modifier,this.getValue(tiddlers[i].title,"cardtype")]);\n }\n return out;\n },\n\n count: // count tiddlycards\n function(filter) {\n var count=0;\n var tiddlers=store.getTiddlers("title");\n for (var i=0; i<tiddlers.length; i++) {\n if (tiddlers[i].tags.find("TiddlyCard")==null) continue;\n if (filter && !this.match(tiddlers[i],this.getOption('filter'))) continue;\n count++;\n }\n return count.toString();\n },\n\n match: // test tiddler for a match\n function (tiddler,target) {\n if (!target||!target.trim().length) return true; // blank=always match\n switch (this.getOption('matchmode')) {\n case 'all':\n return tiddler.tags && tiddler.tags.containsAll(target.readBracketedList());\n case 'any':\n return tiddler.tags && tiddler.tags.containsAny(target.readBracketedList());\n case 'text':\n var re=new RegExp(target.escapeRegExp(),config.options.chkCaseSensitiveSearch?"mg":"img");\n return (tiddler.text.search(re)!=-1);\n case 'pattern':\n var re=new RegExp(target,config.options.chkCaseSensitiveSearch?"mg":"img");\n return (tiddler.text.search(re)!=-1);\n case 'none':\n default:\n return true;\n }\n },\n\n refresh: // refresh tiddler display\n function(place) {\n var here=story.findContainingTiddler(place); if (!here) return;\n story.refreshTiddler(here.getAttribute("tiddler"),null,true);\n return false;\n },\n\n reopen: // deferred click to redisplay panel after changing form type\n function(id) {\n var fn="var e=document.getElementById('"+id+"'); e.onclick({target:e});";\n window.setTimeout(fn,1);\n },\n\n // CARD TIDDLER I/O FUNCTIONS ===================\n save: // create/update form fields into a TiddlyCard-tagged tiddler\n function(here,custom,force) {\n var f=here.form; if (!f) return;\n if (!f.cardID || !f.cardID.value || !f.cardID.value.trim().length) return; else var tid=f.cardID.value.trim();\n if (force && (!custom || !custom.trim().length)) return; // can't force without providing custom form 'template'\n if (custom && custom.trim().length && !store.tiddlerExists(custom)) { alert("Cannot find form: '"+custom+"'"); return; }\n var exists=store.tiddlerExists(tid);\n if (exists && tid!=f.cardID.defaultValue && !confirm("A tiddler named '"+tid+"' already exists. Do you want to replace it?")) return;\n if (!exists && tid==f.cardID.defaultValue) { alert("Please enter a new card ID"); f.cardID.focus(); return; }\n var formtid=force||!exists?(custom?custom:this.getOption('currform')):f.cardtype.value;\n // set field values in form body\n var text=this.setCard(f,formtid);\n // add default tags plus non-blank, non-default, user-supplied tags (if any)\n var tags="TiddlyCard "+this.getOption('deftags')\n tags+=((!f.tags || !f.tags.value.trim().length || f.tags.value=="tags")?"":(" "+f.tags.value.trim()));\n // create tiddler, refresh, and report\n store.saveTiddler(tid,tid,text,config.options.txtUserName,new Date(),tags);\n store.setDirty(true); story.refreshTiddler(tid,null,true);\n store.notify(tid,true);\n var t=story.findContainingTiddler(here); if (t) story.refreshTiddler(t.getAttribute("tiddler"),null,true);\n clearMessage(); displayMessage("TiddlyCards: '"+tid+"' has been "+(exists?(force?"converted using '"+formtid+"'":"saved"):"created"));\n if (!exists && this.getOption('shownew')) story.displayTiddler(t,tid);\n },\n\n remove: // delete tiddlycard entry\n function(here) {\n var f=here.form; if (!f) return;\n if (!f.cardID || !f.cardID.value || !f.cardID.value.trim().length) return; else var tid=f.cardID.value.trim();\n var exists=store.tiddlerExists(tid); if (!exists) return;\n if (confirm(config.commands.deleteTiddler.warning.format([tid]))) {\n story.closeTiddler(tid);\n store.deleteTiddler(tid);\n store.setDirty(true);\n store.notify(tid,true);\n var t=story.findContainingTiddler(here); if (t) story.refreshTiddler(t.getAttribute("tiddler"),null,true);\n clearMessage(); displayMessage("TiddlyCards: '"+tid+"' has been deleted");\n }\n },\n\n saveas: // duplicate tiddlycard entry\n function(here) {\n var f=here.form; if (!f) return;\n if (!f.cardID || !f.cardID.value || !f.cardID.value.trim().length) return;\n var tid=f.cardID.value.trim();\n var newtid=prompt("Enter a new card ID","");\n while (newtid && store.tiddlerExists(newtid) && !confirm(config.messages.overwriteWarning.format([newtid])))\n newtid=prompt("Enter a new card ID","");\n if (!newtid || !newtid.trim().length) return; // cancelled by user\n var tiddler=store.getTiddler(tid); if (!tiddler) return;\n var text=tiddler.text; if (!text || !text.length) return;\n text=text.replace(/name="cardID" value=".*">/,'name="cardID" value="'+newtid+'">'); // change ID in form\n // create tiddler, refresh, and report\n store.saveTiddler(newtid,newtid,text,config.options.txtUserName,new Date(),tiddler.tags);\n store.setDirty(true); story.refreshTiddler(newtid,null,true);\n store.notify(tid,true);\n var t=story.findContainingTiddler(here); if (t) story.refreshTiddler(t.getAttribute("tiddler"),null,true);\n clearMessage(); displayMessage("TiddlyCards: '"+tid+"' has been copied to '"+newtid+"'");\n if (this.getOption('shownew')) story.displayTiddler(t,newtid);\n },\n\n convert: // switch form for tiddlycard entry\n function(here,newform) {\n var f=here.form; if (!f) return;\n if (!f.cardID || !f.cardID.value || !f.cardID.value.trim().length) return; else var tid=f.cardID.value.trim();\n if (!newform) var newform=f.cardtype.value; if (!newform || !newform.trim().length) return;\n var msg="Are you sure you want convert the data from: '%0'\sn";\n msg+="and store it using the TiddlyCards form: '%1'?\sn\sn";\n msg+="Note: some fields/data may be altered or discarded during form conversion";\n msg=msg.format([tid,newform])\n if (!confirm(msg)) return;\n var id="TiddlyCards_"+tid;\n this.save(here,newform,true);\n if (!this.getOption('expand')) this.reopen(id); // reopen panel after converting card\n },\n\n // WRITE CARD DATA ===================\n\n setCard: // set field values into card form fields and/or embedded text\n function(f,formtid) {\n var text=store.getTiddlerText(formtid); if (!text || !text.length) return "";\n text=text.replace(/checked>/img,">"); // remove check/dot from all checkboxes/radio buttons\n text=text.replace(/selected>/img,">"); // remove current selection(s) from all listboxes/droplists\n // insert input field values into form template\n var fields=f.getElementsByTagName("input");\n for (var i=0;i<fields.length;i++) {\n if (fields[i].name=="cardtype") continue; // card type is hidden constant "formtid", embedded in each card. Don't overwrite!\n if (fields[i].type=="text" || fields[i].type=="hidden")\n text=this.setField_Text(text,fields[i].name,fields[i].value);\n if (fields[i].type=="checkbox")\n text=this.setField_Checkbox(text,fields[i].name,fields[i].checked);\n if (fields[i].type=="radio" && fields[i].checked)\n text=this.setField_Radio(text,f[fields[i].name],fields[i],fields[i].name);\n }\n var fields=f.getElementsByTagName("textarea");\n for (var i=0;i<fields.length;i++)\n text=this.setField_Textarea(text,fields[i].name,fields[i].value);\n var fields=f.getElementsByTagName("select");\n for (var i=0;i<fields.length;i++)\n text=this.setField_Select(text,fields[i].name,fields[i].value,fields[i].options[fields[i].selectedIndex].value);\n return text;\n },\n\n setField_Text: // set text field value into card\n function(text,name,val) {\n var re=new RegExp('name="%0" value=".*">'.format([name]));\n var sub='name="%0" value="%1">'.format([name,val.htmlEncode()]);\n text=text.replace(re,sub);\n var re=new RegExp('(/%|<!--)%0(%/|-->).*(/%|<!--)%0(%/|-->)'.format([name]),"img");\n var sub='$1%0$2%1 $3%0$4'.format([name,val.htmlEncode()]);\n text=text.replace(re,sub);\n var re=new RegExp('(/%|<!--)%0="([^"]*)"(%/|-->).*(/%|<!--)%0(%/|-->)'.format([name]),"img");\n text=text.replace(re, function($0,$1,$2,$3) {\n return ($1+'%0="'+$2+'"'+$3+'%1 '+$1+'%0'+$3).format([name,$2.format([val.htmlEncode()])]);});\n return text;\n },\n\n setField_Checkbox: // set checkbox value into card\n function(text,name,checked) {\n var re=new RegExp('"checkbox" name="%0"( checked)?>'.format([name]));\n var sub='"checkbox" name="%0"%1>'.format([name,checked?" checked":""]);\n text=text.replace(re,sub);\n var pat='(/%|<!--)%0()(%/|-->)(/%|<!--)?((?:.|\s\sn)*)(%/|-->)?(/%|<!--)%0()(%/|-->)'.format([name]);\n var re=new RegExp(pat,"img");\n var sub='$1%0$2$3%1$5%2$7%0$8$9'.format([name,checked?'':'$1',checked?'':'$3']);\n text=text.replace(re,sub);\n var pat='(/%|<!--)%0(=true)(%/|-->)(/%|<!--)?((?:.|\s\sn)*)(%/|-->)?(/%|<!--)%0(=true)(%/|-->)'.format([name]);\n var re=new RegExp(pat,"img");\n var sub='$1%0$2$3%1$5%2$7%0$8$9'.format([name,checked?'':'$1',checked?'':'$3']);\n text=text.replace(re,sub);\n var pat='(/%|<!--)%0(=false)(%/|-->)(/%|<!--)?((?:.|\s\sn)*)(%/|-->)?(/%|<!--)%0(=false)(%/|-->)'.format([name]);\n var re=new RegExp(pat,"img");\n var sub='$1%0$2$3%1$5%2$7%0$8$9'.format([name,!checked?'':'$1',!checked?'':'$3']);\n return text.replace(re,sub);\n },\n\n setField_Radio: // set radio button value into card\n function(text,group,field,name) {\n // find radio button offset within group\n for (j=0; j<group.length; j++) if (group[j]==field) break;\n var pat='<input type="radio" name="%0"'.format([name]);\n var pos=-1; for ( ; j>=0; j--) pos=text.indexOf(pat,pos+1);\n text=text.substr(0,pos+pat.length)+" checked"+text.substr(pos+pat.length);\n if (field.value) {\n var pat='(/%|<!--)%0(%/|-->).*(/%|<!--)%0(%/|-->)'.format([name]);\n var re=new RegExp(pat,"img");\n var sub='$1%0$2%1$3%0$4'.format([name,field.value.htmlEncode()]);\n text=text.replace(re,sub);\n }\n return text;\n },\n\n setField_Select: // set list selection value into card\n function(text,name,val,display) {\n var pat='<select name="%0"'.format([name]);\n var startpos=text.indexOf(pat);\n if (startpos!=-1) {\n var pat='<option value="%0"'.format([val.htmlEncode()]);\n var optpos=text.indexOf(pat,startpos);\n if (optpos!=-1) text=text.substr(0,optpos+pat.length)+" selected"+text.substr(optpos+pat.length);\n }\n var pat='(/%|<!--)%0(%/|-->).*(/%|<!--)%0(%/|-->)'.format([name]);\n var re=new RegExp(pat,"img");\n var sub='$1%0$2%1$3%0$4'.format([name,display.htmlEncode()]);\n return text.replace(re,sub);\n },\n\n setField_Textarea: // set mutli-line text area value into card\n function(text,name,val) {\n val=val.htmlEncode();\n var twval=val.replace(regexpNewLine,"<<br>>");\n var pat='name="%0">'.format([name]);\n var startpos=text.indexOf(pat);\n if (startpos!=-1) {\n var endpos=text.indexOf("</textarea>",startpos+pat.length)\n if (endpos!=-1) text=text.substr(0,startpos+pat.length)+val+text.substr(endpos);\n }\n var pat='/%%0%/'.format([name]);\n var startpos=text.indexOf(pat);\n while (startpos!=-1) {\n var endpos=text.indexOf(pat,startpos+pat.length)\n if (endpos!=-1) text=text.substr(0,startpos+pat.length)+twval+text.substr(endpos);\n startpos=text.indexOf(pat,startpos+pat.length+twval.length+pat.length);\n }\n var pat='<!--%0-->'.format([name]);\n var startpos=text.indexOf(pat);\n while (startpos!=-1) {\n var endpos=text.indexOf(pat,startpos+pat.length)\n if (endpos!=-1) text=text.substr(0,startpos+pat.length)+val+text.substr(endpos);\n startpos=text.indexOf(pat,startpos+pat.length+val.length+pat.length);\n }\n return text;\n },\n\n // READ CARD DATA ===================\n\n getCard: // retrieve an HTML form with field values\n function(tiddler,view) {\n var parts=tiddler.text.split("\sn----\sn");\n if (view && parts[1]) { parts.shift(); return parts.join("\sn----\sn"); }\n text=parts[0];\n if (view || readOnly) { // view or read-only mode... set disable/readonly on form fields so values can be viewed/copied, but not altered\n text=text.replace(/<(input type="text"|textarea)/img,'<$1 readonly ');\n text=text.replace(/<(input type="(?:checkbox|radio)"|select)/img,'<$1 disabled ');\n }\n var re=new RegExp('<form(.*)>',"img");\n var extras=re.exec(text);\n var out=this.header.format([extras&&extras[1]?extras[1]:""]);\n out+=text.replace(/<(html|form).*>\ss+/,'').replace(new RegExp("\s\ss+</(html|form).*>"),''); // remove html/form tags\n out+=view||readOnly?"</form></html>}}}@@":this.footer; // view/readOnly mode omits TiddlyCard controls (bottom of form)\n return out;\n },\n\n getValue: // extract a single field value from an HTML form stored in a tiddler\n function(t,name) {\n var tiddler=store.getTiddler(t); if (!tiddler) return null; // card not found... return null\n var text=tiddler.text;\n // find name="..."\n var pos=text.indexOf('name="'+name+'"');\n if (pos==-1) { alert("cannot find field '%0' in card '%1'".format([name,t])); return false; }\n // back up to < and get tag\n var pos=text.lastIndexOf("<",pos);\n if (pos==-1) { alert("invalid syntax for field '%0' in card '%1'".format([name,t])); return false; }\n var tag=text.substring(pos+1,text.indexOf(" ",pos+1));\n if (tag=="textarea") return this.getValueTextarea(text,pos);\n if (tag=="select") return this.getValueSelect(text,pos);\n if (tag!="input") { alert("invalid tag '%0' for field '%1' in card '%2'".format([tag,name,t])); return false; }\n // find type for input tag\n var mark='type="';\n var pos=text.indexOf(mark,pos);\n if (pos==-1) { alert("cannot determine field type for '%0' in card '%1'".format([name,t])); return false; }\n var startpos=pos+mark.length;\n var endpos=text.indexOf('"',startpos);\n var type=text.substring(startpos,endpos);\n switch (type) {\n case "text":\n case "hidden":\n return this.getValue_Text(text,endpos);\n case "checkbox":\n return this.getValue_Checkbox(text,endpos);\n case "radio":\n alert("getValue() for radio buttons is not yet implemented - field '%0' in card '%1'".format([name,t]));\n return this.getValue_Radio(text,endpos);\n default:\n alert("unrecognized type '%0' for field '%1' in card '%2'".format([type,name,t]));\n return false;\n }\n return false;\n },\n\n getValue_Textarea: // extract textarea value from HTML form\n function(text,pos) {\n var startpos=text.indexOf(">",pos)+1;\n var endpos=text.indexOf("</textarea>",startpos);\n return text.substring(startpos,endpos)\n },\n\n getValue_Select: // extract listbox/droplist selection value from HTML form\n function(text,pos) {\n var startpos=text.indexOf(">",pos)+1;\n var endpos=text.indexOf("</select>",startpos);\n var section=text.substring(startpos,endpos);\n var startpos=section.indexOf("selected>");\n if (startpos==-1) return "";\n var pat='value="';\n startpos=section.lastIndexOf(pat,startpos)+pat.length;\n endpos=section.indexOf('"',startpos+1);\n return section.substring(startpos,endpos);\n },\n\n getValue_Text: // extract text field value from HTML form\n function(text,pos) {\n // find value="..."\n mark='value="';\n startpos=text.indexOf(mark,pos)\n endpos=text.indexOf('"',startpos+mark.length);\n if (startpos==endpos) return "";\n var out=text.substring(startpos+mark.length,endpos);\n return out.htmlDecode();\n },\n\n getValue_Checkbox: // extract checkbox state from HTML form\n function(text,pos) {\n // find checked>\n startpos=pos+1;\n endpos=text.indexOf('>',startpos);\n var mark='checked';\n return text.substring(startpos,endpos).indexOf('checked')!=-1;\n },\n\n getValue_Radio: // extract radio button selection value from HTML form\n function(text,pos) {\n return '';\n }\n}\nconfig.macros.tiddlyCard.initoptions(); // INVOKE LOAD-TIME INIT\nsetStylesheet(config.macros.tiddlyCard.cardStyles,"TiddlyCards");\nconfig.shadowTiddlers.TiddlyCardsViewTemplate=config.macros.tiddlyCard.viewTemplate;\nconfig.shadowTiddlers.TiddlyCardsEditTemplate=config.macros.tiddlyCard.editTemplate;\nconfig.shadowTiddlers.TiddlyCardsCollapsedTemplate=config.macros.tiddlyCard.collapsedTemplate;\nconfig.macros.tiddlyCard.coreGetTemplateForTiddler=Story.prototype.getTemplateForTiddler;\nStory.prototype.getTemplateForTiddler=function(title,template,tiddler) {\n if (tiddler.tags && tiddler.tags.contains("TiddlyCard") && config.macros.tiddlyCard.getOption("usecardtemplates"))\n template="TiddlyCards"+template;\n return config.macros.tiddlyCard.coreGetTemplateForTiddler(title,template,tiddler);\n}\n//}}}
TiddlyCards provides a helpful macro that allows you to insert card forms and static display content into your own tiddlers. The macro syntax is:\n>{{{<<tiddlyCard cardID function ...>>}}}\nwhere:\n* //cardID// - the name of a tiddler containing a card\n* //function// - a keyword indicating a specific TiddlyCards function, followed by''+++[additional options and parameters as permitted/required by that function...]\n@@font-weight:normal;~~note: all parameters are optional unless otherwise indicated~~\n__view__ - //(default)// static //read-only// rendering of card information\n__edit__ - interactive HTML form that allows you to modify the card data\n<<<\n* inline/slide/float - determines how the card display should be placed into the tiddler output:\n** inline //(default)// - the card display is added directly into the tiddler output\n** slide - the card display is shown inside a slider. The slider's 'link' text is the ''title'' field of the card. If a card does not have a ''title'' field, then ''cardID'' is used as a fallback value.\n** float - the card display is shown inside a floating panel. As with ''slide'', ''float'' uses the title field to provide the link text, falling back to the ''cardID'' when no title field is present in the card.\n*showID/hideID - display card ID (tiddler name) in text 'heading' above card display\n*showdate/hidedate - display modification date in card 'heading'\n*showtype/hidetype - display card type in 'heading'\n*class://~CSSclassname// - use alternative CSS style class around card display\n<<<\n__add__ - create a new card\n<<<\n*shownew - automatically display new cards when they are created\n<<<\n__list__ - generate a list of cards\n<<<\n* //format//<<br>>a text string enclosed in "..." Use special ''{{{%n}}}'' formatting sequences to display key card information, where ''{{{%0}}}''=card title, ''{{{%1}}}''=modified (date), ''{{{%2}}}''=modifier (username), and ''{{{%3}}}''=card type. The default format is ''{{{[[%0]]<<br>>}}}''\n* //sortby//<<br>>one of: ''title'', ''created'', ''modified'', or ''modifier''\n* //sortdir//<<br>>use +1 for ascending order, -1 for decending order\n<<<\n__get__ - retrieve a field value from a card\n<<<\n* //fieldname// (required)<<br>>the name of a form field for the indicated card. The specific fieldnames that you can use depend upon the type of card you are referencing.\n<<<\n__set__ - set a field value into a card\n<<<\n* TBD\n<<<\n@@===''\n!!!!!examples\n''{{{<<tiddlyCard SampleReferenceCard view slide>>}}}''\n<<tiddlyCard SampleReferenceCard view slide>>\n\n''{{{<<tiddlyCard SampleReferenceCard edit float showID showdate showtype>>}}}''\n<<tiddlyCard SampleReferenceCard edit float showID showdate showtype>>\n\n''{{{<<tiddlyCard SampleReferenceCard get title>>}}}''\n<<tiddlyCard SampleReferenceCard get title>>\n~~note: card values can also be accessed and displayed by directly calling the TiddlyCards plugin API using InlineJavascript:~~\n><script show>\n return config.macros.tiddlyCard.getValue("SampleReferenceCard","title");\n</script>\n\n''{{{<<tiddlyCard list "# [[%0]] was last changed on %1 by %2\sn">>}}}''\n<<tiddlyCard list "# [[%0]] was last changed on %1 by %2\sn">>
This script finds all TiddlyCards in the document and presents them in view mode, as a numbered list of cards shown in floating panels...\n<script show>\n var here=story.findContainingTiddler(place);\n var field="modified";\n var dir=-1; // +1==ascending, -1==descending\n var tiddlers=store.getTiddlers(field);\n tiddlers.sort(function(a,b){if(a[field]==b[field])return(0);else return(a[field]<b[field])?-dir:dir;});\n var out="";\n for (var i=0; i<tiddlers.length; i++) {\n if (tiddlers[i].tags.find("TiddlyCard")==null) continue;\n out+="# <<tiddlyCard %0 float view>>\sn".format([tiddlers[i].title]);\n }\n return(out);\n</script>\n
<<tiddler ExpandSlidersScript>>\n++++[add-on features]>\n+++[Table Of Contents]\nTableOfContentsPlugin\nlistbox/droplist control replaces the tabbed tiddler lists. Includes 'command' items to sort the list, and collapsible tree display when sorted by date, author, or tags. List size can be automatically adjusted to fit the current contents, or manually set to show as many (or as few) items as you prefer. Reduce the list to a single line to switch to a "droplist" style.\n~~''source:'' http://www.TiddlyTools.com/#TableOfContentsPlugin~~\n^^installed/updated on <<date tiddler:TableOfContentsPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Search Options]\nSearchOptionsPlugin\nAdds checkboxes in AdvancedOptions to let you selectively narrow the TiddlyWiki search function to just examine tiddler titles, tiddler text, or both (the default). 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 to "list matching tiddlers", which displays the results as a list of links in an auto-generated "SearchResults" tiddler, rather than rendering all matching tiddlers.\n~~''source:'' http://www.TiddlyTools.com/#SearchOptionsPlugin~~\n^^installed/updated on <<date tiddler:SearchOptionsPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Select Stylesheet]\nSelectStylesheetPlugin\nSelect alternative ~TiddlyWiki CSS stylesheet 'themes' from a list of tiddlers tagged with "stylesheets". Quickly switch to themes with colors, fonts, sizes, wallpaper, etc. that match your mood!.\n~~''source:'' http://www.TiddlyTools.com/#SelectStylesheetPlugin~~\n^^installed/updated on <<date tiddler:SelectStylesheetPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Single Page Mode]\nSinglePageModePlugin\nConfigure ~TiddlyWiki to work more like a traditional multipage wiki with only one tiddler displayed at a time. Reduces clutter and potential information overload caused when lots of tiddlers are displayed at once.\n~~''source:'' http://www.TiddlyTools.com/#SinglePageModePlugin~~\n^^installed/updated on <<date tiddler:SinglePageModePlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Disable Automatic Wiki Links]\nDisableWikiLinksPlugin\nThis 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 {{{[[}}} and {{{]]}}}\n~~''source:'' http://www.TiddlyTools.com/#DisableWikiLinksPlugin~~\n^^installed/updated on <<date tiddler:DisableWikiLinksPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Tiddler Editor Text Area Extensions]\nTextAreaPlugin\nAdds extra keyboard functions to the standard textarea control in the tiddler editor. Control-F and control-G will "Find text" and "find text aGain", respectively, allowing you to copy-find-paste-findagain-paste-etc... In addition, this plugin will accept the TAB character as input to the textarea control, rather than as a signal to move the focus to another control. This allow you to easily use tab characters for column-aligned text indentations (very useful for writing readable plugin source code)\n~~''source:'' http://www.TiddlyTools.com/#TextAreaPlugin~~\n^^installed/updated on <<date tiddler:TextAreaPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[TidIDE: TiddlyWiki Integrated Development Environment ("Tie Dyed")]\nTidIDEPlugin\nA full-featured tiddler editor plus key-by-key ''LIVE PREVIEW''!! Also provides diagnostic tools to help you debug your TiddlyWiki problems by letting you view current TiddlyWiki internal option values, messages, shadows, stylesheets, notify and macro functions or display the internal DOM (Document Object Model) tree structure for any specific part of the TiddlyWiki document.\n~~''source:'' http://www.TiddlyTools.com/#TidIDEPlugin~~\n^^installed/updated on <<date tiddler:TidIDEPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n===\n\n++++[tiddler management]>\n+++[Import Tiddlers]\nImportTiddlersPlugin\nTransfer tiddlers between ~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.\n~~''source:'' http://www.TiddlyTools.com/#ImportTiddlersPlugin~~\n^^installed/updated on <<date tiddler:ImportTiddlersPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Export Tiddlers]\nExportTiddlersPlugin\nExtract selected tiddlers from your ~TiddlyWiki documents and save them to a local file or a remote server (requires server-side scripting). Tiddler data can be output using either TiddlyWiki 'storeArea DIVs' or RSS-compatible XML (for automatic feeds). An interactive control panel lets you pick a destination and format, and then select which tiddlers to export. An optional 'selection filter' helps you pick the desired tiddlers by specifying a combination of modification date, tags, or tiddler text to be matched/excluded.\n~~''source:'' http://www.TiddlyTools.com/#ExportTiddlersPlugin~~\n^^installed/updated on <<date tiddler:ExportTiddlersPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Automatic Tagging]\nAutoTaggerPlugin\nAutomatically tag tiddlers with their original creation date and author and optionally scan the tiddler and add any tags that are embedded as text. Makes cross-referencing your tiddlers a snap!\n~~''source:'' http://www.TiddlyTools.com/#AutoTaggerPlugin~~\n^^installed/updated on <<date tiddler:AutoTaggerPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[New Document]\nNewDocumentPlugin\nQuickly create new TiddlyWiki documents from your existing document. Use the {{{<<newDocument>>}}} macro to place a "new document" link into your sidebar/mainmenu/any tiddler (wherever you like). Select this command to automatically create a "new.html" document containing all tiddlers tagged with<<tag includeNew>>or<<tag systemTiddlers>>. Optional parameters let you specify an alternate path/filename for the new file, or a different combination of tags to match (using AND, OR, NOT and parentheses to form complex matches). You can also indicate "ask" for either parameter, which will trigger a prompt for input when "new document" is selected.\n~~''source:'' http://www.TiddlyTools.com/#NewDocumentPlugin~~\n^^installed/updated on <<date tiddler:NewDocumentPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Auto Sync]\nAutoSyncPlugin\n//''EXPERIMENTAL ALPHA RELEASE''//\nLive Publishing! "Simul-cast" changes in your document by ''automatically submitting tiddler data to a web server'' whenever you complete editing of a tiddler. AutoSyncPlugin requires installation of compatible server-side scripting to transmit, receive and store the updated tiddler data on the server. The plugin can be configured for use with different server-side scripts by setting the contents of specially-named tiddlers to match your web server ([[SiteHost]]) and script location ([[SitePost]]), as well as provide any flags, keywords, etc. ([[SiteParams]]) that may be required by the server-side scripting.\n~~''source:'' http://www.TiddlyTools.com/#AutoSyncPlugin~~\n^^installed/updated on <<date tiddler:AutoSyncPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n===\n\n++++[authoring]>\n+++[Aliases]\nAliasPlugin\nCreate text-substitution macros that define abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.\n~~''source:'' http://www.TiddlyTools.com/#AliasPlugin~~\n^^installed/updated on <<date tiddler:AliasPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Date Formatting/Linking]\nDatePlugin\nDisplay formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.\n~~''source:'' http://www.TiddlyTools.com/#DatePlugin~~\n^^installed/updated on <<date tiddler:DatePlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Calendar]\nCalendarPlugin\nShow a one month/year calendar for the current date or any specified month/year. Different backgrounds and font styles indicate the current date, weekends, and holidays. When the DatePlugin is installed //(see below)//, each date is also a popup menu containing a link to a 'dated tiddler' for quickly creating/updating daily blog entries (or activity reports), as well as links for any changed tiddlers and reminders on that date. //note: the CalendarPlugin has been slightly modified so it can use the DatePlugin's {{{showDate()}}} API//\n~~''source:'' http://rumsby.org/yatwa/ //(Steve Rumsby)//~~\n^^installed/updated on <<date tiddler:CalendarPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Reminders]\nReminderMacros\nYou can set a reminder to 'fire' on a particular date (e.g. August 8th), or a more non-specific date like "every Friday". You can also use the showReminders macro to search through all of your tiddlers and list the ones that will fire within a range from the current date. The displayTiddlersWithReminders macro can be used to open any tiddlers that have reminders that will fire within a specified time span.\n~~''source:'' http://www.geocities.com/allredfaq/reminderMacros.html //(Jeremy Sheeley)//~~\n^^installed/updated on <<date tiddler:ReminderMacros "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Quote of the Day]\nQuoteOfTheDayPlugin\nAdds a macro that displays a randomly selected quote each time it is rendered. Quotes are listed in a separate tiddler, separated by horizontal rules ("----").\n~~''source:'' http://www.TiddlyTools.com/#QuoteOfTheDayPlugin~~\n^^installed/updated on <<date tiddler:QuoteOfTheDayPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[HTML Formatting]\nHTMLFormattingPlugin\nMix TiddlyWiki formatting and standard HTML tags inside tiddler content. Let's you add CGI forms, complex tables, linked images, fonts, rollovers, etc.\n~~''source:'' http://www.TiddlyTools.com/#HTMLFormattingPlugin~~\n^^installed/updated on <<date tiddler:HTMLFormattingPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[In-line Javascript]\nInlineJavascriptPlugin\nInsert Javascript directly into your tiddler content using {{{<script>}}} and {{{</script>}}} tags. Lets you call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n~~''source:'' http://www.TiddlyTools.com/#InlineJavascriptPlugin~~\n^^installed/updated on <<date tiddler:InlineJavascriptPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Nested In-line Sliders]\nNestedSlidersPlugin\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows "default to open", "custom button label/tooltip" and "automatic blockquote formatting". You can also "nest" these sliders as deep as you like, so that expandable tree-like hierarchical displays can be created.\n~~''source:'' http://www.TiddlyTools.com/#NestedSlidersPlugin~~\n^^installed/updated on <<date tiddler:NestedSlidersPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Checkboxes]\nCheckboxPlugin\nAdd checkboxes to your tiddler content. Checkbox states can be preserved in the document (by automatically modifying the tiddler content), or saved in local cookies by assigning an optional 'id' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n~~''source:'' http://www.TiddlyTools.com/#CheckboxPlugin~~\n^^installed/updated on <<date tiddler:CheckboxPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n+++[Unformatted Text]\nUnformattedTextPlugin\nAdd //extended quotes// around specific tiddler content to prevent any embedded formatting syntax from being processed by TiddlyWiki's rendering engine, so the content will appear exactly as entered into the tiddler (i.e., "raw text"), even when it contains character sequences that would normally be treated as TiddlyWiki formatting instructions.\n~~''source:'' http://www.TiddlyTools.com/#UnformattedTextPlugin~~\n^^installed/updated on <<date tiddler:UnformattedTextPlugin "DDD, MMM DDth, YYYY 0hh:0mm:0ss">>^^\n<<tiddler GroupBox>><script>place.style.marginLeft="1em"</script>===\n\n===
<script label="show/hide left sidebar">\n var show=document.getElementById('mainMenu').style.display=='none';\n if (!show) {\n document.getElementById('mainMenu').style.display='none';\n document.getElementById('displayArea').style.marginLeft='1em';\n place.innerHTML="show sidebar &gt;&gt;";\n }\n else {\n document.getElementById('mainMenu').style.display='block';\n var margin=config.options.txtDisplayAreaLeftMargin?config.options.txtDisplayAreaLeftMargin:"";\n place.innerHTML="&lt;&lt; hide sidebar";\n }\n document.getElementById('displayArea').style.marginLeft=margin;\n config.options.chkShowLeftSidebar=show;\n saveOptionCookie('chkShowLeftSidebar');\n config.refreshers.content(document.getElementById("storyMenu"));\n return false;\n</script><script>\n if (config.options.chkShowLeftSidebar==undefined)\n config.options.chkShowLeftSidebar=true;\n if (!config.options.txtDisplayAreaLeftMargin||!config.options.txtDisplayAreaLeftMargin.length)\n config.options.txtDisplayAreaLeftMargin="14em";\n var show=config.options.chkShowLeftSidebar;\n document.getElementById('mainMenu').style.display=show?"block":"none";\n document.getElementById('displayArea').style.marginLeft=show?config.options.txtDisplayAreaLeftMargin:"1em";\n place.lastChild.innerHTML=(show?"&lt;&lt; hide sidebar":"show sidebar &gt;&gt;"); // SET LINK TEXT\n place.lastChild.style.fontWeight="normal";\n</script>
<<option chkHttpReadOnly>><script>\n var chk=place.lastChild;\n chk.style.margin=chk.style.padding="0";\n chk.id="ToggleReadOnly_checkbox";\n chk.title="enable/disable TiddlyWiki editing functions";\n chk.checked=readOnly;\n chk.coreOnChange=chk.onchange;\n chk.onchange=function() {\n if (this.coreOnChange) this.coreOnChange();\n readOnly=!readOnly;\n this.checked=readOnly;\n story.forEachTiddler(function(t,e){story.refreshTiddler(t,null,true)});\n refreshDisplay();\n };\n</script><script label="read-only">\n place.previousSibling.onchange();\n</script><script>\n var s=place.lastChild.style; s.display="inline"; s.fontWeight="normal";\n</script>
<script label="show/hide right sidebar">\n var show=document.getElementById('sidebar').style.display=='none';\n if (!show) {\n document.getElementById('sidebar').style.display='none';\n document.getElementById('displayArea').style.marginRight='1em';\n place.innerHTML="&lt;&lt; show sidebar";\n }\n else {\n document.getElementById('sidebar').style.display='block';\n var margin=config.options.txtDisplayAreaRightMargin?config.options.txtDisplayAreaRightMargin:"";\n place.innerHTML="hide sidebar &gt;&gt;";\n }\n document.getElementById('displayArea').style.marginRight=margin;\n config.options.chkShowRightSidebar=show;\n saveOptionCookie('chkShowRightSidebar');\n config.refreshers.content(document.getElementById("storyMenu"));\n return false;\n</script><script>\n if (config.options.chkShowRightSidebar==undefined)\n config.options.chkShowRightSidebar=true;\n if (!config.options.txtDisplayAreaRightMargin||!config.options.txtDisplayAreaRightMargin.length)\n config.options.txtDisplayAreaRightMargin="17em";\n var show=config.options.chkShowRightSidebar;\n document.getElementById('sidebar').style.display=show?"block":"none";\n document.getElementById('displayArea').style.marginRight=show?config.options.txtDisplayAreaRightMargin:"1em";\n place.lastChild.innerHTML=(show?"hide sidebar &gt;&gt;":"&lt;&lt; show sidebar"); // SET LINK TEXT\n place.lastChild.style.fontWeight="normal";\n</script>
<script>\n if (config.options.chkScrollSidebars==undefined)\n config.options.chkScrollSidebars=true;\n if (!config.options.txtOuterTabHeight||!config.options.txtOuterTabHeight.length)\n config.options.txtOuterTabHeight="25em";\n if (!config.options.txtInnerTabHeight||!config.options.txtInnerTabHeight.length)\n config.options.txtInnerTabHeight="21em";\n\n var scroll=config.options.chkScrollSidebars||config.browser.isIE?'':'fixed'; // IE doesn't do 'fixed' position\n document.getElementById('mainMenu').style.position=scroll;\n document.getElementById('sidebar').style.position=scroll;\n\n // "short sheet" the SideBarTabs when sidebars are hovering (to hopefully fit "above the fold")\n var outer=config.options.chkScrollSidebars||config.browser.isIE?"auto":config.options.txtOuterTabHeight;\n var inner=config.options.chkScrollSidebars||config.browser.isIE?"auto":config.options.txtInnerTabHeight;\n var css='#sidebarTabs .tabContents { height:'+outer+'; overflow:auto; width:92.5%; }';\n css+='#sidebarTabs .tabContents .tabContents { height:'+inner+' !important; }';\n setStylesheet(css,'shortSidebarTabs');\n\n window.ToggleScrollingSidebars_setscroll = function() {\n if (config.browser.isIE) return; // IE doesn't support 'fixed' position\n document.getElementById('mainMenu').style.position=!config.options.chkScrollSidebars?'fixed':'';\n document.getElementById('sidebar').style.position=!config.options.chkScrollSidebars?'fixed':'';\n var outerTabHeight=config.options.txtOuterTabHeight;\n if (config.options.chkScrollSidebars) outerTabHeight="auto";\n var innerTabHeight=config.options.txtInnerTabHeight;\n if (config.options.chkScrollSidebars) innerTabHeight="auto";\n var css='#sidebarTabs .tabContents { height:'+outerTabHeight+'; overflow:auto; width:92.5%; }';\n css+='#sidebarTabs .tabContents .tabContents { height:'+innerTabHeight+' !important; }';\n setStylesheet(css,'shortSidebarTabs');\n }\n\n</script><<option chkScrollSidebars>><script>\n place.lastChild.checked=config.options.chkScrollSidebars;\n place.lastChild.onchange=function() {\n config.options.chkScrollSidebars=this.checked;\n saveOptionCookie("chkScrollSidebars");\n window.ToggleScrollingSidebars_setscroll();\n };\n</script> sidebars scroll with page
<script>\n window.toggleSiteMenu=function() {\n var m=document.getElementById('siteMenu'); \n if (!m) return true; // no sitemenu element... let event bubble through...\n var show=m.style.display=="none";\n m.style.display=show?"block":"none";\n config.options.chkHideSiteMenu=!show; saveOptionCookie('chkHideSiteMenu');\n var nodes = document.getElementsByTagName("input");\n for(var t=0; t<nodes.length; t++)\n if (nodes[t].getAttribute("option")=="chkHideSiteMenu") nodes[t].checked=show;\n var doDblclick=config.options.chkHideSiteMenu&&!config.options.chkShowRightSidebar;\n document.ondblclick=doDblclick?window.toggleSiteMenu:null;\n window.status=document.body.title=doDblclick?"double-click page background to display menubar":"";\n return false;\n };\n if (config.options.chkHideSiteMenu==undefined) config.options.chkHideSiteMenu=false;\n var m=document.getElementById('siteMenu'); \n m.style.display=config.options.chkHideSiteMenu?"none":"block";\n var doDblclick=config.options.chkHideSiteMenu&&!config.options.chkShowRightSidebar;\n document.ondblclick=doDblclick?window.toggleSiteMenu:null;\n window.status=document.body.title=doDblclick?"double-click page background to display menubar":"";\n</script><<option chkHideSiteMenu>><script>\n place.lastChild.id="ToggleSiteMenu_checkbox"\n place.lastChild.checked=!config.options.chkHideSiteMenu;\n place.lastChild.coreOnChange=place.lastChild.onchange;\n place.lastChild.onchange=function() {\n if (this.coreOnChange) this.coreOnChange();\n window.toggleSiteMenu();\n if (config.options.chkHideSiteMenu&&!config.options.chkShowRightSidebar) { \n clearMessage(); displayMessage("double-click page background to redisplay menubar")\n setTimeout("clearMessage()",3000); // EPHEMERAL "REMINDER" MESSAGE\n }\n };\n</script> show site menubar
<script>\n var c=document.getElementById('contentWrapper'); \n if (config.options.chkHideSiteTitles==undefined) config.options.chkHideSiteTitles=false;\n for (var i=0; i<c.childNodes.length; i++) if (hasClass(c.childNodes[i],"header")) var h=c.childNodes[i];\n h.style.display=config.options.chkHideSiteTitles?"none":"block";\n</script><<option chkHideSiteTitles>><script>\n place.lastChild.checked=!config.options.chkHideSiteTitles;\n place.lastChild.onchange=function() {\n var c=document.getElementById('contentWrapper'); \n for (var i=0; i<c.childNodes.length; i++) if (hasClass(c.childNodes[i],"header")) var h=c.childNodes[i];\n config.options.chkHideSiteTitles=!this.checked;\n h.style.display=config.options.chkHideSiteTitles?"none":"block";\n saveOptionCookie("chkHideSiteTitles");\n };\n</script> show site titles
<script> \n window.showTopButton=function(show) {\n // remove existing "top" button (if any)\n var e=document.getElementById("scrollToTopButton"); if (e) e.parentNode.removeChild(e);\n if (config.browser.isIE) return; // IE doesn't do FIXED... do nothing.\n if (!show) return; // hiding button... we're done.\n // create a link that scrolls to the top of page\n e=createTiddlyElement(null,"A",null,null,"top");\n e.id="scrollToTopButton";\n e.title="scroll to top of page";\n e.onclick=function(){window.scrollTo(0,0)};\n // make it hover in the bottom right corner of the window\n var s=e.style;\n s.position="fixed";\n s.zIndex="1001"; // hopefully, this will be on top of ALL other elements!\n s.bottom=".5em";\n s.right=".5em";\n s.cursor="pointer";\n s.backgroundColor="#eee";\n s.color="#009";\n s.border="1px solid";\n s.padding="0 1em";\n s.MozBorderRadius="1em";\n s.fontSize="7pt";\n document.body.insertBefore(e,null);\n }\n if (config.options.chkShowTopButton==undefined) config.options.chkShowTopButton=false;\n window.showTopButton(config.options.chkShowTopButton);\n</script><<option chkShowTopButton>><script>\n place.lastChild.onchange=function() {\n window.showTopButton(this.checked);\n config.options.chkShowTopButton=this.checked;\n saveOptionCookie("chkShowTopButton");\n };\n</script> "scroll-to-top" button
/***\nThis stylesheet hides all TiddlyWiki standard toolbars, tags, titles, headers, menus, and sidebars, so that ONLY TIDDLER CONTENT is displayed. Combined with SinglePageModePlugin, this stylesheet allows you to construct and publish your TiddlyWiki documents using a more "conventional" website appearance and interaction pattern.\n<<<\n''WARNING: After you select this stylesheet, you will most likely no longer have access to the "themes" droplist typicaly presented in the right sidebar options panel. This makes it very difficult to select a different stylesheet.''\n\nThe current stylesheet selection is stored in a cookie, called "txtStyleSheet". Each time you load the document, this stylesheet is automatically re-applied by the SelectStylesheetPlugin. You can reset your document to use the default stylesheet by using your browser's "cookie-management" functions (if available) to manually remove the "txtStyleSheet" cookie. The next time your document is loaded, it will revert to the default stylesheet, "StyleSheet" (if present), restoring the display of the familiar ~TiddlyWiki features and functions.\n\nIn order to make the "reset" process somewhat easier and less dependent on browser-specific functions, you can simply append "#TotallyTiddlers" to the end of the URL to automatically open THIS tiddler when you reload this document. Then, you can select a different stylesheet from the SelectStylesheetPlugin droplist that has been embedded here:\n|! Select a theme: <<selectStylesheet size:1>> |\nAlternatively, you can ''temporarily override the current stylesheet selection'', by appending "#style:~TiddlerName" to the URL used to load this document (where //~TiddlerName// is the name of a stylesheet tiddler). This will apply the named stylesheet ''without changing the current cookie-tracked preference''.\n\nNote: after you have regained access to the right sidebar functions, any change in selected stylesheet that you make from the normal "themes" droplist (in the side bar options panel) will update the cookie-tracked preference and will be automatically used for subsequent reloads of the document (as long as a #style:... override parameter is not supplied).\n<<<\n***/\n\n/*{{{*/\n\n\n[[StyleSheetLayout]] /* TW default shadow */\n[[StyleSheetColors]] /* TW default shadow */\n[[StyleSheetPrint]] /* TW default shadow */\n[[StyleSheetAdjustments]] /* optional: TiddlyTools adjustments to default styles */\n[[StyleSheet]] /* optional: looks nice this way! */\n\n/* hide tiddler functions, menus, and breadcrumbs */\n.tiddler .toolbar, .tiddler .tagged, .tiddler .tagging, .tiddler .title, .tiddler .subtitle, .header,\n#mainMenu, #breadCrumbs, #siteMenu, #storyMenu, #sidebar\n { display:none !important; }\n\n /* reclaim space left by sidebar and main menu*/\n#displayArea\n { margin:1em !important; }\n/*}}}*/
/***\n''UnformattedTextPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#UnformattedTextPlugin \nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAdd //extended quotes// around specific tiddler content to prevent any embedded formatting syntax from being processed by TiddlyWiki's rendering engine, so the content will appear exactly as entered into the tiddler (i.e., "raw text"), even when it contains character sequences that would normally be treated as TiddlyWiki formatting instructions.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content so that it can be excluded from the TiddlyWiki formatting rules when it is rendered.\n//{{{\n"""content goes here"""\n//}}}\nwhere:\n* {{{"""}}} //(three double-quote characters)//^^\nmarks the start and end of the unformatted content^^\n<<<\n!!!!!Examples\n<<<\nContent containing TiddlyWiki formatting syntax can be shown with the syntax unchanged:\n{{{\n"""this text is //not italic// and <<not a macro>> and [[not a link]]"""\n}}}\n"""this text is //not italic// and <<not a macro>> and [[not a link]]"""\n\nNote that, although formatting syntax contained ''within'' the quoted content does not affect the style of the output, any formatting syntax ''surrounding'' the quoted content will still be applied. For example, the following unformatted output will be underlined:\n{{{\n__"""this text is //not italic// and <<not a macro>> and [[not a link]], but it IS underlined"""__\n}}}\n__"""this text is //not italic// and <<not a macro>> and [[not a link]], but it IS underlined"""__\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''UnformattedTextPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2005.11.07 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.unformattedText = {major: 0, minor: 5, revision: 0, date: new Date(2005,11,07)};\n\nconfig.formatters.push( {\n name: "rawText",\n match: "\s\s\s"{3}",\n lookahead: "\s\s\s"{3}((?:.|\s\sn)*?)\s\s\s"{3}",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e = createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n
\n| 17/8/2006 14:47:40 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 17/8/2006 15:43:48 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup | Ok |\n| 17/8/2006 16:35:28 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 17/8/2006 19:22:5 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 18/8/2006 10:49:47 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 18/8/2006 18:25:59 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 18/8/2006 18:42:2 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 19/8/2006 12:26:21 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 20/8/2006 7:54:50 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup | Ok |\n| 20/8/2006 8:10:28 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |\n| 20/8/2006 10:13:7 | ELSDesignStudios | [[index.html|file:///D:/html/tiddlytools/index.html]] | [[store.php|http://www.TiddlyTools.com/store.php]] | | index.html | backup |
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 1, \n date: new Date(2006,3,30),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadPluginDoc'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(true); store.setDirty(false); // ELS - toggle to ensure notification event after upload\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) { }\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "\sr\sn";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data;name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir\n + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data;name=\s"userfile\s";filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n request.open("POST", storeUrl, true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n request.open("GET", document.location.toString(), true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]));\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadPluginDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadPluginDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n//}}}\n////===
/***\n|''Name:''|UploadPlugin|\n|''Type:''|Plugin|\n|''Version:''|3.3.1 (30/03/2006)|\n|''Source:''|[[TiddlyWiki.BidiX.info/#UploadPlugin|http://tiddlywiki.BidiX.info/#UploadPlugin]]|\n|''Documentation:''|[[TiddlyWiki.BidiX.info/#UploadPluginDoc|http://tiddlywiki.BidiX.info/#UploadPluginDoc]]|\n|''Author:''|BidiX[at]BidiX.info |\n|''Required:''| TW 2.0.6 or better, PHP 4.4 (perhaps less but not working on 4.1.2) |\n\n!Description\nUploadPlugin, with [[store.php]], provides @@upload@@ and @@save to web@@ functions. See HowToUpload ([[HowToUpload|http://TiddlyWiki.bidix.info/#HowToUpload]]).\nUploadPlugin uses Username and Password from UploadOptions stored in cookies to authenticate itself to [[store.php]].\nFrench translation available as a separate tiddler UploadPluginMsgFR\n\n!!UploadPlugin\n*If the TiddlyWiki is viewed from @@local disk@@ :\n**{{{<<saveChanges>>}}} \n***display as ''save to disk''\n***work as usual\n**{{{<<upload>>}}}\n***display as ''upload''\n***after saving to disk, upload in the storeUrl directory.\n*If the TiddlyWiki is viewed from @@website@@ and is @@readOnly@@ (in core TiddlyWiki since 2.0.6) :\n**{{{<<saveChanges>>}}} \n***print nothing\n***has been disabled\n**{{{<<upload>>}}}\n***display as '''save to web''\n***save in the uploadDir directory.\n*If GenerateAnRssFeed in AdvancedOptions is set :\n**generate the content of the RSSFeed \n**upload the RssFile in uploadDir directory\n**Caution : use the SiteUrl tiddler to specify the right url of the TiddlyWiki in the generated RssFile\n*DisplayMessage\n*Log upload action in UploadLog\nhint : if UploadLog is the first tiddler in the Timeline Tab, no tiddler has been updated since last upload.\n\n!![[store.php]]\n*UserVariables to set :\n//{{{\n$AUTHENTICATE_USER = true; // true | false\n$USERS = array(\n 'UserName1'=>'Password1', \n 'UserName2'=>'Password2', \n 'UserName3'=>'Password3'); // set usernames and strong passwords\n$DEBUG = false; // true | false\n//}}}\n*method GET\n**display an information page\n*method POST\n**if $~AUTHENTICATE_USER is ''true''\n***presence and value of user and password are checked with $USER and $PASSWORD \n**if toFilename already exists and backDir parameter specified\n***rename toFilename to backupDir/toFilename.AAAAMMDD.HHSS.html\n**copy temporaryUploadedFile to toFilename\n** return status\n\n!Usage : \n{{{\n<<upload>>\n uses UploadOptions saved in cookies :\n txtUploadUserName: username\n pasUploadPassword : password\n txtUploadStoreUrl : store script\n txtUploadDir : relative path for upload directory\n txtUploadFilename : upload filename\n txtUploadBackupDir : relative path for backup directory\n\n<<upload [storeUrl [toFilename [backupDir [uploadDir [username]]]]]>>\n optional positional parameters can be passed to overwrite UploadOptions in this order. \n}}}\n\nInstall the {{{<<upload ... >>}}} macro in SideBarOptions just below {{{<<saveChanges>>}}} macro.\n\n\n!User manual\nSee HowToUpload\n\n!Installation :\n*Install the UploadPlugin as usual\n*Upload the [[store.php]] file on your php aware webserver in your TiddlyWiki directory\n*Protect your server against malicious upload. Two approaches :\n**set $~AUTHENTICATE_USER to true in the [[store.php]] script\n***configure $USER and $PASSWORD in the [[store.php]] script on your webserver\n***set UploadOptions in conformity with [[store.php]]\n**Use server protection :\n***for Apache web server ([[for detail see Apache documentation|http://httpd.apache.org/docs/1.3/howto/htaccess.html]]) : \n****configure and upload the [[.htaccess]] [[.passwd]]\n***for other web servers see the appropriate documentation\n*Configure an upload button, for example in the SideBarOptions\n!Suppported Browser\n*Firefox : tested Ok\n*Internet Explorer : tested Ok\n*Safari : reported ok on OS X\n*Others : Not tested, please report status.\n\n!Revision history\n*V 3.3.1 (30/03/2006)\n**bug in backup folder when uploading rssfile fixed\n*V 3.3.0 (12/03/2006)\n**Code refactoring\n**suppress saveChanges hijacking\n*V3.2.2 (25/02/2006)\n**Use PasswordTweak 1.0.1\n**uploaddir is a relative path\n**backupdir is a relative path\n+++[previous revisions]\n*V3.2.1 (13/02/2006)\n**name and password added to open.request (Thanks to TedPavlic)\n*V3.2.0 (14/02/2006)\n**Use PassworDTweak (http://tiddlyWiki.bidix.info/#PasswordTweak) for password\n*V3.1.0 (12/02/2006)\n**UploadOptions in Cookies\n**Username and password from UploadOptions pass to store.php script for authentification check\n*V3.0.3 (03/02/2006)\n**Firefox 1.5.0.1 crashes due to global var fixed\n*V3.0.2 (25-Jan-2006)\n**HTTPS compatible\n*V3.0.1 (18-Jan-2006)\n**UTF8toUnicode conversion problem in Firefox\n*V3.0.0 (15-Jan-2006)\n**Asynchronous upload\n**Synchronous upload before unload of the page\n**All strings extracted in macro config\n**Compatibility checked with TW 2.0.2 & TW 1.2.39 for both FF 1.5 and IE 6\n*V2.0.2 (8-Jan-2006)\n**conversion of SiteTitle and SiteSubtitle in web page Title\n*V2.0.1 (8-Jan-2006)\n**Compatibilty with TiddlyWiki 2.0.1\n*V2.0.0 (3-Jan-2006)\n**Save to web\n**Compatibilty with TiddlyWiki 1.2.39 and TiddlyWiki 2.0.0 Beta 6\n*v1.1.0 (27-Dec-2005)\n**Upload RSS File\n*v1.0.3 (26-Dec-2005)\n**UploadLog tiddler\n*v1.0.2 (24-Dec-2005)\n**Optional parameter toFilename\n**Optional parameter backupDir\n*v1.0.1 (23-Dec-2005)\n**reformatting code\n* v1.0.0 (17-Dec-2005)\n** first public working version\n===\n\n
<div class='toolbar' macro='toolbar collapseTiddler collapseOthers closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<span class='title' macro='view title'></span>\n<span class='subtitle'><!--<span macro='view modifier link'></span>, --><span style='white-space:nowrap' macro='view modified date [[DDD, MMM DDth YYYY]]'></span><!-- (created <span macro='view created date [[DD MMM YYYY]]'></span>)--></span>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
{{floatright small{++++(WelcomeShowQuote)[quote|Quote-of-the-day: selected quotations and observations...]...\n----\n @@font-size:12pt;font-family:Trebuchet MS;<html><a href="javascript:;"\n onclick="story.refreshTiddler('Welcome',null,true);" title="please click to get another quote"\n style="display:block;color:inherit !important; background:inherit !important;"><<QOTD Quotations>></a></html>@@===<script>\n place.lastChild.style.marginTop=".5em";\n place.lastChild.id="Welcome_quote";\n</script>+++(WelcomeShowLinks)[links|MiniBrowser with links to popular TiddlyWiki URLs]...\n {{small{<<tiddler MiniBrowser with: Welcome>>}}}<script>\n place.style.margin=".5em 0";\n </script>===<script>\n place.lastChild.id="Welcome_links";\n</script>+++(WelcomeShowMedia)[media|MediaCenter: play WinMedia, Real, QuickTime and Flashwith videos]...\n {{small{<<tiddler MediaCenter with: Welcome>>}}}<script>\n place.style.margin=".5em 0";\n </script>===<script>\n place.lastChild.id="Welcome_media";\n</script>+++(WelcomeShowNews)[news|announcements, notices, and featured items]...\n {{small{<<tiddler QuickView with: news "news and notices...">>}}}<script>\n place.style.margin=".5em 0";\n </script>===<script>\n place.lastChild.id="Welcome_news";\n</script>+++(WelcomeShowFAQ)[FAQ|frequently asked questions and TiddlyTech "how to" articles]...\n {{small{<<tiddler QuickView with: faq "frequently asked questions / how-to articles...">>}}}<script>\n place.style.margin=".5em 0";\n </script>===<script>\n place.lastChild.id="Welcome_faq";\n</script>+++(WelcomeShowThemes)[themes|select a "look-and-feel" theme to match your mood!]...\n {{small{<<selectStylesheet size:1 width:99.5%>>}}}<script>\n place.style.margin=".5em 0";\n </script>===<script>\n place.lastChild.id="Welcome_themes";\n</script>+++(WelcomeShowSysInfo)[system|view TiddlyWiki internal system values]...\n {{smallform{@@display:block;width:99.5%;white-space:normal;<<tidIDE +system>>@@}}}<script>\n place.style.margin=".5em 0";\n </script>===<script>\n place.lastChild.id="Welcome_sys";\n</script>++++(WelcomeShowStats)[statistics|tiddler statistics: total count, oldest, newest, etc.]>...\n {{small{<<tiddler ShowTiddlerStatistics>>}}}===<script>\n place.lastChild.id="Welcome_stats";\n</script>}}}{{left{{{small{{{nowrap{+++^18em^[clock]...<<moveablePanel>>Clock\n----\n <html><embed src='clock.swf' style='margin:0;padding:0;height:90%;width:100%;'></embed></html>\n===<script>\n place.lastChild.button.innerHTML=(new Date()).formatString("It is DDD, MMM DDth, YYYY");\n place.lastChild.button.style.marginLeft=place.lastChild.button.style.paddingLeft="0";\n</script>}}}}}}}}}<script>\n place.insertBefore(document.getElementById("Welcome_quote"),null);\n place.insertBefore(document.getElementById("Welcome_links"),null);\n place.insertBefore(document.getElementById("Welcome_media"),null);\n place.insertBefore(document.getElementById("Welcome_news"),null);\n place.insertBefore(document.getElementById("Welcome_faq"),null);\n place.insertBefore(document.getElementById("Welcome_themes"),null);\n place.insertBefore(document.getElementById("Welcome_sys"),null);\n place.insertBefore(document.getElementById("Welcome_stats"),null);\n</script><<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerBackground>><<tiddler HideTiddlerTags>><<tiddler DoubleClickDisable>><<tiddler ReplaceTiddlerTitle with: "@@white-space:nowrap;font-size:8pt;\s<\s<QOTD Greetings\s>\s>, \s<\s<tiddler SetUserName\s>\s>@@">>
[[StyleSheetAdjustments]]\n/* ==== Woodshop ==== */\n/*{{{*/\nbody\n { background-image: url('[[WoodshopBackgroundMedium]]'); background-color:#db7; }\n.menubox\n { background-image: url('[[WoodshopBackgroundLight]]'); background-color:#edb; }\n.tagging, .tagged\n { background-color: transparent; border: 1px solid #ccc; }\n.selected .tagging, .selected .tagged\n { background-image: url('[[TexturesParchment]]'); background-color:#edb; border: 1px solid #999; }\n.groupbox\n { background-image: url('[[TexturesParchment]]'); background-color:#edb; }\n.viewer\n { background-image: url('[[WoodshopBackgroundLight]]'); background-color:#edb;\n border: 2px solid #999; -moz-border-radius:1em; padding:1em; }\n.header\n { background-image: url('[[WoodshopBackgroundDark]]'); background-color:#611; color:#edb; border-bottom:0px; }\n.header a\n { color: #ec7; }\n.floatingPanel, #messageArea, .attachPanel, #importPanel, #exportPanel\n { background: #edb; background-image: url('[[WoodshopBackgroundLight]]') !important;}\n#sidebarTabs .tabContents\n { background-image: url('[[WoodshopBackgroundLight]]'); background-color:#edb; }\nh1,h2,h3,h4,h5\n { background-image: url('[[WoodshopBackgroundDark]]'); background-color:#611; color:#fff;}\nh1 a, h2 a, h3 a, h4 a, h5 a\n { color: #ec7; }\n/*}}}*/\n
| source file|{{{...images\swood_dark.jpg}}}|\n| attached on|20 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/wood_dark.jpg|images/wood_dark.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|WoodshopBackgroundDark]] or [img[tooltip|WoodshopBackgroundDark][link]]}}}\n[img[tooltip|WoodshopBackgroundDark]]\n<<<\n
| source file|{{{...images\swood_light.jpg}}}|\n| attached on|20 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/wood_light.jpg|images/wood_light.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|WoodshopBackgroundLight]] or [img[tooltip|WoodshopBackgroundLight][link]]}}}\n[img[tooltip|WoodshopBackgroundLight]]\n<<<\n
| source file|{{{...images\swood.jpg}}}|\n| attached on|20 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|//none//|\n| remote link|/%REMOTE_LINK%/[[images/wood.jpg|images/wood.jpg]]|\nimage\n<<<\nusage: {{{[img[tooltip|WoodshopBackgroundMedium]] or [img[tooltip|WoodshopBackgroundMedium][link]]}}}\n[img[tooltip|WoodshopBackgroundMedium]]\n<<<\n