config.options.chkHttpReadOnly = false;\n
/***\n|''Name:''|ArchivedTimeline|\n|''Version:''|0.3.1 (Feb 04, 2006)|\n|''Source:''|https://sourceforge.net/projects/ptw/|\n|''Author:''|BramChen|\n|''Type:''|Macro|\n!Description\nTimeline archived monthly.\n!Syntax/Examples\n>{{{<<timeline [modified | created]>>}}}\n\n!Known issues/Todos\n* \n\n!Instructions\n\n!Notes\n* \n\n!Revision history\n* v0.3.1 (04 Feb 2006)\n** JSLint checked\n* v0.3.0 (Feb 04, 2006)\n** Fixed several missing variable declarations\n* v0.2.0 (Dec 26, 2005)\n** changed for the new feature of Macro timeline of TW 2.0.0 beta 6\n* v0.1.0 (Nov 3, 2005)\n** Initial release.\n\n!Code\n***/\n//{{{\nversion.extensions.archivedTimeline = {major: 0, minor: 3, revision: 1,\n date: new Date("Feb 04, 2006"),\n name: "ArchivedTimeline",\n type: "Macro",\n author: "BramChen",\n source: "http://sourceforge.net/project/showfiles.php?group_id=150646"\n};\n\nconfig.macros.archivedTimeline = {\n tooltips: "Archives sorted by ",\n msg : "The param of macro timeline should be 'created' or 'modified'",\n dateFormat: "YYYY0MM0DD"\n};\nconfig.macros.timeline = config.macros.archivedTimeline;\n\nconfig.macros.timeline.handler = function(place,macroName,params) {\n var field = params[0] ? params[0] : "modified";\n if (field != "modified" && field != "created") {\n displayMessage(config.macros.timeline.msg);\n return;\n }\n place.appendChild(document.createTextNode(this.tooltips + field));\n var tiddlers = store.reverseLookup("tags","excludeLists",false,field);\n var lastMonth = ""; var lastDay = ""; var theText = "----\sn"; var i = 0;\n var cookie; var archives;\n for (var t=tiddlers.length-1; t>=0; t--) {\n var tiddler = tiddlers[t];\n var theField = (field == "created") ? tiddler.created : tiddler.modified;\n var theMonth = theField.convertToYYYYMMDDHHMM().substr(0,6);\n var theDay = theField.convertToYYYYMMDDHHMM().substr(0,8); \n if(theMonth != lastMonth) {\n if (lastMonth === "") {\n lastMonth = theMonth;\n }\n else {\n place.appendChild(document.createElement("hr")); \n cookie = 'chktimeline'+(i++);\n archives = this.formatString(this.dateFormat, lastMonth);\n this.slider(place,cookie,theText,archives,this.tooltips + archives); \n lastMonth = theMonth; theText = "----\sn"; \n }\n }\n if(theDay != lastDay){\n theText += theField.formatString(this.dateFormat) + '\sn';\n lastDay = theDay; \n }\n theText += '* [[' + tiddler.title + ']]\sn'; \n }\n place.appendChild(document.createElement("hr"));\n cookie = 'chktimeline'+(i++);\n archives = this.formatString(this.dateFormat, lastMonth);\n this.slider(place,cookie,theText,archives,this.tooltips + archives); \n place.appendChild(document.createElement("hr"));\n};\n\nconfig.macros.timeline.onClickSlider = config.macros.slider.onClickSlider;\n\nconfig.macros.timeline.slider = function(place,cookie,text,id,tooltips)\n{\n var btn = createTiddlyButton(place,id,tooltips,this.onClickSlider); \n var panel = createTiddlyElement(place,"div",null,"timelineSliderPanel",null);\n panel.setAttribute("cookie",cookie);\n panel.style.display = config.options[cookie] ? "block" : "none";\n if(text){\n wikify(text,panel);\n }\n};\n\nconfig.macros.timeline.formatString = function(template, yyyymm)\n{\n var dateString = new Date(yyyymm.substr(0,4)+'/'+yyyymm.substr(4,2)+'/01');\n template = template.replace(/DDD|0DD|DD|hh|mm|ss/g,'');\n return dateString.formatString(template);\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|''Name:''|AttachFilePlugin|\n|''Source:''|http://www.TiddlyTools.com/#AttachFilePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\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.09.10 [3.4.4]'' update formatters for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)\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: 4, date: new Date(2006,9,10)};\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 if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.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 var link = lookaheadMatch[5];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n addClass(e,"imageLink");\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 -------------\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);\n // ELS -------------\n w.nextMatch = this.lookaheadRegExp.lastIndex;\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 if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e;\n var text = lookaheadMatch[1];\n if (lookaheadMatch[2]) // Simple bracketted link\n {\n e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n else if(lookaheadMatch[3]) // Pretty bracketted link\n {\n var link = lookaheadMatch[4];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\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|''Name:''|AttachFilePluginFormatters|\n|''Source:''|http://www.TiddlyTools.com/#AttachFilePluginFormatters|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\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.09.10 [3.4.4.0]'' sync with AttachFilePlugin v3.4.3\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 if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.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 var link = lookaheadMatch[5];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n addClass(e,"imageLink");\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 -------------\n if (config.macros.attach.isAttachment(lookaheadMatch[4]))\n img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);\n // ELS -------------\n w.nextMatch = this.lookaheadRegExp.lastIndex;\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 if (!this.lookaheadRegExp) // fixup for TW2.0.x\n this.lookaheadRegExp = new RegExp(this.lookahead,"mg");\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e;\n var text = lookaheadMatch[1];\n if (lookaheadMatch[2]) // Simple bracketted link\n {\n e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n else if(lookaheadMatch[3]) // Pretty bracketted link\n {\n var link = lookaheadMatch[4];\n // ELS -------------\n if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x\n var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);\n else\n var external=config.formatterHelpers.isExternalLink(link);\n if (external)\n {\n if (config.macros.attach.isAttachment(link))\n {\n e = createExternalLink(w.output,link);\n e.href=config.macros.attach.getAttachment(link);\n e.title = config.macros.attach.linkTooltip + link;\n }\n else\n e = createExternalLink(w.output,link);\n }\n else \n e = createTiddlyLink(w.output,link,false,null,w.isStatic);\n // ELS -------------\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\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//}}}
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|Name|AutoOpenTiddlersPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#AutoOpenTiddlersPlugin|\n|Version|0.21|\n|Requires|~TW2.x|\n!!!Description:\nOpen a user defined number of recent tiddlers automatically when the TW loads.\nYou can also specify a tag and only load tiddlers that have that tag.\nTo change the number of tiddlers automatically opened, or define a tag to use, ed the config.autoOpenTiddlers part of the code below.\n\n!!!To Do\n*add an option to exclude tiddlers with a particular tag\n\n!!!Code\n***/\n//{{{\n//edit this section to change the default settings\nconfig.autoOpenTiddlers = \n{\n count: 5, //number of tiddlers opened.\n tag: undefined //change if you want to open tiddlers with a specific tag, eg: 'DefaultTiddlers'\n}\n\n\nconfig.autoOpenTiddlers.handler = function()\n{\n if (this.tag == undefined)\n var newTiddlers = store.getTiddlers("modified");\n else\n var newTiddlers = store.getTaggedTiddlers(this.tag,"modified");\n var newTiddlers = newTiddlers.reverse();\n var max = Math.min(this.count,newTiddlers.length-1);\n for (var i=max; i>=0; i--)\n { story.displayTiddler(null,newTiddlers[i].title);} \n}\n\nwindow.old_lewcid_autoOpenTiddlers_restart = restart;\nrestart = function ()\n{\n window.old_lewcid_autoOpenTiddlers_restart();\n config.autoOpenTiddlers.handler();\n}\n//}}}
Este es mi wikiblog. De momento estoy poniéndolo guapo, vuelve en un par de días a ver como me lo monto.\n\n<html><p><strong>edito:</strong>El tema definitivo será el kubrick que ya puedes probar en el menú de la derecha, aunque incluiré a la derecha otros estilos que esten interesantes. Además tengo que añadir el plugin de weblog (a elegir entre el de checketts y el de lewcid) y el splash (a ver si evito la ventanita del firefox del código pesado). Tambien quiero cambiar el contenido del toolbar y ya veremos lo que hago con el mainmenu y el sidebar, pero mantendré el tema más o menos. Cuando haya terminado tendré mi propio wikiblog en marcha y podré empezar a postear adecuadamente.</html>\n
/***\n|Name|BigThemePack|\n|Created by|SimonBaird & SaqImtiaz|\n|Location|http://simonbaird.com/mptw/#BigThemePack|\n|Version|0.1.0|\n|Requires|SelectThemePlugin|\n!Uninstallation Notes:\n*Make sure that you set your theme as default or none, before deleting the theme pack.\n\n***/\n//{{{\nif (!config.themes) config.themes = [];\n//}}}\n/***\n!!~MonkyMind themes\nThe following themes were created by Robert Lindsay from http://www.monkymind.org/\n***/\n//{{{\n\nif (!version.extensions.BigThemePack) {\n\nversion.extensions.BigThemePack = {\n major: 0, minor: 1, revision: 0, \n type: 'theme',\n source: "http://simonbaird.com/mptw/#BigThemePack"\n};\n};\n\nconfig.shadowTiddlers.Berry2StyleSheet = "<!--- [[Berry 2|StyleSheet]] with ideas shamesslessly taken from (and suggested by) Simon Baird, Clint Checketts and Christine Hodges --->\sn\sn/*{{{*/\sn.headerForeground { display: none;}\sn#sidebar {width: 170px; background: #efefef;border-left: solid 2px #b8b9c7;border-top: solid 2px #d7d8e8;}\sn#sidebarTabs .tabContents {width: 158px; background: #eae9ee;font-weight: bold; color: #333 ;}\sn#sidebarOptions input { border: solid 2px #b8b9c7; }\sn#sidebarOptions .sliderPanel { background: #eee;}\sn#sidebarOptions a {;border: none;}\sn#sidebarOptions .sliderPanel a {border: none;color: #5c4894;}\sn#displayArea {background: #fff;margin: 1em 15.7em 0em 1em;border-left: solid 2px #b8b9c7;}\sn.viewer {line-height: 1.4em;padding-bottom: 1em;border-bottom:solid 1px #b8b9c7;}\sn.viewer th, thead td {background: #5d4b97;border: 1px solid #666;color: #fff;}\sn.title {color: #000}\snh1,h2,h3,h4,h5 {color: #fff;background: #6b69ad;}\sna{ color: #700126;}\sna:hover{ background: #6b69ad; color: #fff;font-weight: bold;}\sn.externalLink { text-decoration: underline; color: #000083;}\snbody { background: #d7d8e8;}\sn.popup { background: #6b69ad; border: 1px solid #04b;}\sn.popup li a:hover {background: #d7d8e8;color: #000;border: none;}\sn.popup li.disabled {color: #000;}\sn.button:hover {color: #fff;background: #6b69ad;\sn border: 1px solid #d7d8e8;}\sn#topMenu { background: transparent; padding: 6px;margin-left: -5px;border-bottom: solid 3px #5c4894;}\sn#topMenu .button, #topMenu .tiddlyLink, tiddlyLinkExisting, #topMenu .externalLink\sn{\sn color: #fff;\sn text-align: center;\sn font-weight: bold;\sn font-size: 1.1em;\sn text-decoration: none;\sn letter-spacing: 1.5px;\sn background: transparent;\sn border-right: solid 1px #fff;\sn padding: 5px 15px 8px 15px;\sn}\sn#topMenu a:hover {\sn color: #700126;\sn background: #d7d8e8;\sn}\sn#topMenu br {display: none; padding-right: 1em;}\sn\sn\sn/*}}}*/";\n\nconfig.shadowTiddlers.Berry2PageTemplate = "<!--- More ideas shamesslessly begged, borrowed or stolen from..... Simon Baird, Clint Checketts and Christine Hodges :)) --->\sn<!--{{{-->\sn<div class='header' macro=\s"gradient vert #5c4894 #6b69ad\s">\sn <div id='topMenu'>\sn <span refresh='content' tiddler='SiteTitle'></span><span refresh='content' tiddler='MainMenu'></span></div>\sn </div>\sn</div> \sn<div id='sidebar'>\sn <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn <div id='messageArea'></div>\sn <div id='tiddlerDisplay'></div>\sn</div>\sn<!--}}}-->\sn";\n\nconfig.themes.push("Berry2");\n\n\nconfig.shadowTiddlers.Blueberry2StyleSheet = "<!--- [[Blueberry 2|StyleSheet]] with ideas shamesslessly taken from (and suggested by) Simon Baird, Clint Checketts and Christine Hodges --->\sn\sn/*{{{*/\sn.headerForeground { display: none;}\sn#sidebar {width: 171px; background: #e7ecee;border-left: solid 2px #8895bb;border-top: solid 2px #97a8d2;}\sn#sidebarTabs .tabContents {width: 158px; background: #dce1e3;font-weight: bold; color: #333 ;}\sn#sidebarOptions input { border: solid 2px #8895bb; }\sn#sidebarOptions .sliderPanel { background: #eee;}\sn#sidebarOptions a {;border: none;}\sn#sidebarOptions .sliderPanel a {border: none;color: #00005a;}\sn#displayArea {background: #fff;margin: 1em 15.7em 0em 1em;border-left: solid 2px #8895bb;}\sn.viewer {line-height: 1.4em;padding-bottom: 1em;border-bottom:solid 1px #dedede;}\sn.viewer th, thead td {background: #00009d;border: 1px solid #666;color: #fff;}\sn.title {color: #000}\snh1,h2,h3,h4,h5 {color: #fff;background: #00009d;}\sna{ color: #00005a;}\sna:hover{ background: #00009d; color: #fff;font-weight: bold;}\sn.externalLink { text-decoration: underline; color: #000083;}\snbody { background: #97a8d2;}\sn.popup { background: #04b; border: 1px solid #04b;}\sn.popup li a:hover {background: #dedede;color: #000083;border: none;}\sn.popup li.disabled {color: #000;}\sn.button:hover {color: #fff;background: #00009d;\sn border: 1px solid #dedede;}\sn#topMenu { background: transparent; padding: 6px;margin-left: -5px;border-bottom: solid 3px #00005a}\sn#topMenu .button, #topMenu .tiddlyLink, tiddlyLinkExisting, #topMenu .externalLink\sn{\sn color: #fff;\sn text-align: center;\sn font-weight: bold;\sn font-size: 1.1em;\sn text-decoration: none;\sn letter-spacing: 1.5px;\sn background: transparent;\sn border-right: solid 1px #fff;\sn padding: 5px 15px 6px 15px;\sn}\sn#topMenu a:hover {\sn color: #fff;\sn background: #00009d;\sn border: solid 1px #db4;\sn}\sn#topMenu br {display: none; padding-right: 1em;}\sn\sn\sn/*}}}*/";\n\nconfig.shadowTiddlers.Blueberry2PageTemplate = "<!--- More ideas shamesslessly begged, borrowed or stolen from..... Simon Baird, Clint Checketts and Christine Hodges :)) --->\sn<!--{{{-->\sn<div class='header' macro=\s"gradient vert #00005a #0000ad\s">\sn <div id='topMenu'>\sn <span refresh='content' tiddler='SiteTitle'></span><span refresh='content' tiddler='MainMenu'></span></div>\sn </div>\sn</div> \sn<div id='sidebar'>\sn <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn <div id='messageArea'></div>\sn <div id='tiddlerDisplay'></div>\sn</div>\sn<!--}}}-->\sn";\n\nconfig.themes.push("Blueberry2");\n\n\nconfig.shadowTiddlers.iJobsStyleSheet = "<!--- [[iJobs 2|StyleSheet]] with ideas shamesslessly taken from (and suggested by) Simon Baird, Clint Checketts and Christine Hodges. Colours inspired by http://www.solucija.com/templates/demo/Internet_Jobs/ --->\sn/*{{{*/\sn.headerForeground { display: none;}\sn#sidebar {width: 171px; background: #808080;border-bottom: solid 1.5em #3c6491;border-top: solid 2px #fff;}\sn#sidebarTabs .tabContents {width: 158px; background: #eee;font-weight: bold; color: #333 ;}\sn.tabSelected{color: #fff;background: #963112; border: solid 1px #fff;}\sn.tabUnselected {color: #fff;background: #999;}\sn#sidebarOptions .sliderPanel { background: #eee;}\sn#sidebarOptions a {;border: none;}\sn#sidebarOptions .sliderPanel a {border: none;color: #333;background: #eee;}\sn#displayArea {background: #fff;margin: 1em 15.7em 0em 1em;border-top: solid 3px #ddd;border-bottom: solid 1.5em #3c6491;}\sn.viewer {line-height: 1.4em;padding-bottom: 1em;border-bottom:solid 1px #dedede;}\sn.viewer th, thead td {background: #963112;border: 1px solid #666;color: #fff;}\sn.title {color: #000}\snh1,h2,h3,h4,h5 {color: #fff;background: #963112;}\sna{ color:#c01903 ;}\sna:hover{ background: #c01903; color: #fff;font-weight: bold;}\sn.externalLink { text-decoration: underline; color: #c01903;}\snbody { background: #fff;}\sn.popup { background: #3c6491; border: 1px solid #3c6491;}\sn.popup li a:hover {background: #dedede;color: #963112;border: none;}\sn.popup li.disabled {color: #000;}\sn.button {color: #fff;background: #808080;border: 1px solid #fff;}\sn.button:hover {color: #fff;background: #c01903;\sn border: 1px solid #dedede;}\sn#topMenu { background: transparent;border-bottom: solid 3px #bcbcbc; padding: 5px;margin-left: -5px;}\sn#topMenu .button, #topMenu .tiddlyLink, tiddlyLinkExisting, #topMenu .externalLink\sn{\sn color: #333;\sn text-align: center;\sn font-weight: bold;\sn font-size: 1em;\sn text-decoration: none;\sn letter-spacing: 1.5px;\sn background: transparent;\sn border-right: solid 1px #fff;\sn padding: 5px 15px 8px 15px;\sn}\sn#topMenu a:hover {\sn color: #fff;\sn background: #3c6491;\sn}\sn#topMenu br {display: none; padding-right: 1em;}\sn\sn\sn/*}}}*/\sn";\n\nconfig.shadowTiddlers.iJobsPageTemplate = "<!--- More ideas shamesslessly begged, borrowed or stolen from..... Simon Baird, Clint Checketts and Christine Hodges :)) --->\sn<!--{{{-->\sn<div class='header' macro=\s"gradient vert #aaa #ccc\s">\sn <div id='topMenu'>\sn <span refresh='content' tiddler='SiteTitle'></span><span refresh='content' tiddler='MainMenu'></span></div>\sn </div>\sn</div> \sn<div id='sidebar'>\sn <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn <div id='messageArea'></div>\sn<div class='viewer' macro=\s"gradient vert #f5f5f5 #fff\s">\sn <div id='tiddlerDisplay'></div>\sn</div>\sn<!--}}}-->\sn";\n\nconfig.themes.push("iJobs");\n\n\nconfig.shadowTiddlers.NoBerry2StyleSheet = "<!--- The default TW colours with modified layout. Ideas shamesslessly taken from (and suggested by) Simon Baird, Clint Checketts and Christine Hodges --->\sn\sn/*{{{*/\sn.headerForeground { display: none;}\sn#sidebar {width: 170px; }\sn#sidebarTabs .tabContents {width: 158px; }\sn#displayArea {background: #fff;margin: 1em 15.7em 0em 1em;}\sn#topMenu { background: transparent; padding: 6px;margin-left: -5px; border-bottom: solid 3px #0457ce;}\sn#topMenu .button, #topMenu .tiddlyLink, tiddlyLinkExisting, #topMenu .externalLink\sn{\sn color: #fff;\sn text-align: center;\sn font-weight: bold;\sn font-size: 1.1em;\sn text-decoration: none;\sn letter-spacing: 1.5px;\sn background: transparent;\sn border-right: solid 1px #fff;\sn padding: 5px 15px 8px 15px;\sn}\sn#topMenu a:hover {\sn color: #fff;\sn background: #18f;\sn}\sn#topMenu br {display: none; padding-right: 1em;}\sn\sn\sn/*}}}*/";\n\nconfig.shadowTiddlers.NoBerry2PageTemplate = "<!--- More ideas shamesslessly begged, borrowed or stolen from..... Simon Baird, Clint Checketts and Christine Hodges :)) --->\sn<!--{{{-->\sn<div class='header' macro=\s"gradient vert #04b #18f\s">\sn <div id='topMenu'>\sn <span refresh='content' tiddler='SiteTitle'></span><span refresh='content' tiddler='MainMenu'></span></div>\sn </div>\sn</div> \sn<div id='sidebar'>\sn <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn <div id='messageArea'></div>\sn <div id='tiddlerDisplay'></div>\sn</div>\sn<!--}}}-->\sn";\n\nconfig.themes.push("NoBerry2");\n\n//}}}\n/***\n!!Clint's Themes\nThe themes were created by Clint Checketts from http://www.checkettsweb.com/\nThe original GTD theme was created by Nathan Bowers from http://snapgrid.com/\n***/\n//{{{\n\n\nconfig.shadowTiddlers.GTDStyleSheet = "/***\sn!Calendar CSS\sn***/\sn/*{{{*/\sn.calendar{\sn border-bottom: 1px solid #550000;\sn}\sn\sn.viewer .calendar{\sn width: 220px;\sn}\sn\sn#mainMenu .calendar{\sn font-size: 8px;\sn cursor: pointer;\sn width: 100%;\sn border: 0;\sn border-collapse: collapse;\sn}\sn\sn#mainMenu .calendar .button{\sn border: 0;\sn}\sn\sn#mainMenu .calendar td{\sn font-size: 8pt;\sn padding: 0;\sn background: #fff;\sn border: 0;\sn}\sn\sn#mainMenu .calendar a{\sn margin: 0;\sn color: #000;\sn background: transparent;\sn}\sn\sn#mainMenu .calendar a:hover{\sn color: #000;\sn background: transparent;\sn}\sn\sn#mainMenu .calendarMonthname,\sn#mainMenu .calendar .calendarMonthTitle td a{\sn color: #fff;\sn}\sn\sn#mainMenu .calendarDaysOfWeek td{\sn background: #500;\sn color: #fff;\sn}\sn\sn/*}}}*/\sn\sn/***\sn!GTD Style\sn\sn!Generic rules /%==================================================================== %/\sn***/\sn/*{{{*/\snbody {\sn background: #464646 url('http://shared.snapgrid.com/images/tiddlywiki/bodygradient.png') repeat-x top fixed;\sn color: #000;\sn font: .82em/1.25em 'Bitstream Vera Sans', Verdana, Helvetica, Arial, sans-serif;\sn/*'Lucida Sans Unicode', 'Lucida Grande','Trebuchet MS', */\sn}\sn/*}}}*/\sn/***\sn!Header rules /%====================================================================== %/\sn***/\sn/*{{{*/\sn#contentWrapper\sn{\sn margin: 0 auto;\snwidth: 59em;\snposition: relative;\sn}\sn\sn#header\sn{\sn color: #fff;\sn padding: 1.5em 1em .6em 0;\sn}\sn\sn#siteTitle {\sn\sn font-size: 2.3em;\sn margin: 0;\sn}\sn\sn#siteSubtitle {\sn font-size: 1em;\sn padding-left: .8em;;\sn}\sn\sn#titleLine{\sn background: transparent;\sn padding: 0;\sn}\sn\sn#titleLine a {\sn color: #cf6;\sn background: transparent;\sn}\sn/*}}}*/\sn\sn\sn\sn\sn\sn\sn\sn\sn\sn/***\sn!Sidebar rules /%====================================================================== %/\sn***/\sn/*{{{*/\sn#sidebar{\sn left: 0;\snwidth: 18em;\sn margin: .9em .9em 0 0;\sn color: #000;\sn background: transparent;\sn}\sn/*}}}*/\sn/***\sn!Main menu rules /%=================================================================== %/\sn***/\sn/*{{{*/\sn#mainMenu{\sn position: static;\sn width: auto;\sn\sn background: #600;\sn border-right: 3px solid #500;\snpadding: 0;\sn text-align: left;\sn font-size: 1em;\sn}\sn\sn#mainMenu h1{\sn padding: 0;\sn margin: 0;\sn font-size: 1em;\sn font-weight: normal;\sn}\sn\sn#mainMenu ul{\sn padding: 0;\sn margin: 0;\sn list-style: none;\sn}\sn\sn#mainMenu h1 a,\sn#mainMenu li a,\sn#mainMenu li a.button{\sn display: block;\sn padding: 0 5px 0 10px;\snborder: 0;\sn border-bottom: 1px solid #500;\sn border-top: 1px solid #900;\snmargin: 0;\sn}\sn\sn#mainMenu a,\sn#mainMenu a.button{\sn height: 22px;\snheight: 1.83em;\sn line-height: 22px;\sn color: #fff;\sn background: #700;\snmargin-left: 1em;\sn}\sn\sn#mainMenu a:hover,\sn#mainMenu a.button:hover {\sn background: #b00;\sn color: #fff;\sn}\sn/*}}}*/\sn/***\sn!Sidebar options rules /%============================================================ %/\sn***/\sn/*{{{*/\sn#sidebarOptions {\sn background: #eeb;\sn border-right: 3px solid #bb8;\sn color: #B4C675;\sn padding: .5em 0;\sn}\sn\sn#sidebarOptions a {\sn color: #700;\sn margin: .2em .8em;\sn padding: 0;\sn border: 0;\sn}\sn\sn#sidebarOptions a:hover, #sidebarOptions a:active {\sn color: #fff;\sn background: #700;\sn border: 0;\sn}\sn\sn#sidebarOptions input{\sn margin: 2px 10px;\sn border: 1px inset #333;\snpadding: 0;\sn}\sn\sn#sidebarOptions .sliderPanel {\sn background: #fff;\sn color: #000;\sn padding: 5px 10px;\sn font-size: .9em;\sn}\sn\sn#sidebarOptions .sliderPanel a{\sn font-weight: normal;\sn margin: 0;\sn}\sn\sn#sidebarOptions .sliderPanel a:link,#sidebarOptions .sliderPanel a:visited {\sn color: #700;\sn}\sn\sn#sidebarOptions .sliderPanel a:hover,#sidebarOptions .sliderPanel a:active {\sn color: #fff;\sn background: #700;\sn}\sn/*}}}*/\sn/***\sn!Sidebar tabs rules /%===================================================================== %/\sn***/\sn/*{{{*/\sn#sidebarTabs {\sn background: transparent;\sn border-right: 3px solid #740;\sn border-bottom: 3px solid #520;\sn border: 0;\sn padding: 0;\sn}\sn\sn#contentWrapper #sidebarTabs a,\sn#contentWrapper #displayArea .tabContents a{\sn color: #fff;\sn}\sn\sn#contentWrapper #sidebarTabs a:hover,\sn#contentWrapper #displayArea .tabContents a:hover {\sn background: #000;\sn color: #fff;\sn}\sn\sn#contentWrapper #sidebarTabs a:active,\sn#contentWrapper #displayArea .tabContents a:active{\sn color: #000;\sn}\sn\sn\sn\sn#contentWrapper .tabSelected {\sn background: #960;\sn}\sn\sn#contentWrapper .tabUnselected{\sn background: #660;\sn}\sn\sn#contentWrapper #sidebar .tabset{\sn background: #eeb;\sn border-right: 3px solid #bb8;\sn padding: 0 0 0 .75em;\sn}\sn\sn#contentWrapper .tabContents{\snfont-size: .95em;\snbackground: #960;\snborder:0;\sn border-right: 3px solid #740;\sn border-bottom: 3px solid #520;\sn padding: .75em;\sn}\sn\sn#contentWrapper .tabContents{\sn width: auto;\sn}\sn\sn#contentWrapper #sidebarTabs .tabContents .tabset,\sn#contentWrapper .tabContents .tabset{\sn border: 0;\sn padding: 0;\sn background: transparent;\sn}\sn\sn#contentWrapper .tabContents .tabSelected,\sn#contentWrapper .tabContents .tabContents {\sn background: #700;\sn border: 0;\sn}\sn\sn#contentWrapper .tabContents .tabUnselected {\sn background: #440;\sn}\sn\sn#contentWrapper .tabset a {\sn color: #fff;\sn padding: .2em .7em;\sn margin: 0 .17em 0 0;\sn height: 2em;\snposition: static;\sn}\sn\sn#contentWrapper .tabset a:hover {\sn background: #000;\sn color: #fff;\sn}\sn\sn#contentWrapper .tabset a:active {\sn color: #000;\sn}\sn\sn#contentWrapper .tabContents ul{\sn margin: 0;\sn padding: 0;\sn list-style: none;\sn}\sn\sn#contentWrapper .tabContents .tabContents ul{\sn color: #eeb;\sn}\sn\sn.tabContents ul a,\sn.tabContents ul .button{\sn color: #fff;\sn display: block;\sn padding: .1em 0 .1em .7em;\sn background: transparent;\sn border: 0;\sn}\sn\sn.tabContents ul a:hover {\sn color: #fff;\sn background: #000;\sn}\sn/*}}}*/\sn/***\sn!License panel rules /%==================================================================== %/\sn***/\sn/*{{{*/\sn#licensePanel {\sn padding: 0px 1em;\sn font-size: .9em;\sn}\sn\sn#licensePanel a {\sn color: #960;\sn display: block;\sn margin-top: .9em;\sn}\sn\sn#licensePanel a:hover {\sn color: #fff;\sn background: transparent;\sn}\sn/*}}}*/\sn/***\sn!Popup rules /%================================================================= %/\sn***/\sn/*{{{*/\sn.popup {\sn font-size: .8em;\sn padding: 0em;\sn background: #333;\sn border: 1px solid #000;\sn}\sn\sn.popup hr {\sn margin: 1px 0 0 0;\sn visibility: hidden;\sn}\sn\sn.popup li.disabled {\sn color: #666;\sn}\sn\sn.popup li a,\sn.popup li a:visited{\sn color: #000;\sn border: .1em outset #cf6;\sn background: #cf6;\sn}\sn\sn.popup li a:hover {\snborder: .1em outset #cf6;\sn background: #ef9;\sn color: #000;\sn}\sn/*}}}*/\sn/***\sn!Message area rules /%================================================================= %/\sn***/\sn/*{{{*/\sn#messageArea{\sn font-size: .9em;\sn padding: .4em;\sn background: #FFE72F;\sn border-right: .25em solid #da1;\sn border-bottom: .25em solid #a80;\sn\snposition: fixed;\sn top: 10px;\sn right: 10px;\sn color: #000;\sn}\sn\sn#contentWrapper #messageArea a{\sn color: #00e;\sn text-decoration: none;\sn}\sn\sn#contentWrapper #messageArea a:hover{\sn color: #00e;\sn text-decoration: underline;\sn background: transparent;\sn}\sn\sn#contentWrapper #messageArea .messageToolbar a.button{\sn border: 1px solid #da1;\sn}\sn\sn#contentWrapper #messageArea .messageToolbar a.button:hover{\sn color: #00e;\sn text-decoration: none;\sn border: 1px solid #000;\sn background: #fff;\sn}\sn\sn\sn\sn/*}}}*/\sn/***\sn!Tiddler display rules /%================================================================== %/\sn***/\sn/*{{{*/\sn#displayArea {\sn width: 39.75em;\sn margin: 0 0 0 17em;\sn}\sn\sn.tiddler {\sn margin: 0 0 .9em 0;\sn padding: 0 1em;\sn border-right: .25em solid #aaa;\sn border-bottom: .25em solid #555;\sn background: #fff;\sn}\sn\sn.title {\sn font-size: 1.5em;\sn font-weight: bold;\sn color: #900;\sn}\sn\sn.toolbar {\sn font-size: .8em;\sn padding: .5em 0;\sn}\sn\sn.toolbar .button{\sn padding: .1em .3em;\sn color: #000;\sn\sn border: .1em outset #cf6;\sn background: #cf6;\snmargin: .1em;\sn}\sn\sn.toolbar .button:hover {\sn background: #ef9;\sn color: #000;\sn}\sn\sn.toolbar .button:active {\sn background: #ff0;\sn}\sn\sn/*}}}*/\sn/***\sn!Viewer rules /% ------------------------------------------------------------------------------------------ %/\sn***/\sn/*{{{*/\sn.viewer {\sn line-height: 1.4em;\sn font-size: 1em;\sn}\sn\sn.viewer a:link, .viewer a:visited {\sn color: #15b;\sn}\sn\sn.viewer a:hover {\sn color: #fff;\sn background: #000;\sn}\sn\sn.viewer .button{\sn background: transparent;\sn border-top: 1px solid #eee;\sn border-left: 1px solid #eee;\sn border-bottom: 1px solid #000;\sn border-right: 1px solid #000;\sn}\sn\sn.viewer .button:hover{\sn background: #eee;\sn color: #000;\sn}\sn\sn.viewer .button:active{\sn background: #ccc;\sn border-bottom: 1px solid #eee;\sn border-right: 1px solid #eee;\sn border-top: 1px solid #111;\sn border-left: 1px solid #111;\sn}\sn\sn\sn.viewer blockquote {\sn border-left: 3px solid #777;\sn margin: .3em;\sn padding: .3em;\sn}\sn\sn.viewer pre{\sn background: #fefefe;\sn border: 1px solid #f1f1f1;\sn}\sn\sn.viewer pre, .viewer code{\sn color: #000;\sn}\sn\sn.viewer ul {\sn padding-left: 30px;\sn}\sn\sn.viewer ol {\sn padding-left: 30px;\sn}\snul{\snlist-style-type: asquare;\sn}\snol{ \sn list-style-type: decimal;\sn}\sn\snol ol{ \sn list-style-type: lower-alpha;\sn}\sn\snol ol ol{ \sn list-style-type: lower-roman;\sn}\sn\sn.viewer ul, .viewer ol, .viewer p {\sn margin: .0;\sn}\sn\sn.viewer li {\sn margin: .2em 0;\sn}\sn\snh1,h2,h3,h4,h5,h6 {\sn color: #000;\sn font-weight: bold;\sn background: #eee;\sn padding: 2px 10px;\sn margin: 5px 0;\sn}\sn\sn.viewer h1 {font-size: 1.3em;}\sn.viewer h2 {font-size: 1.2em;}\sn.viewer h3 {font-size: 1.1em;}\sn.viewer h4 {font-size: 1em;}\sn.viewer h5 { font-size: .9em;}\sn.viewer h6 { font-size: .8em;}\sn\sn.viewer table {\sn border: 2px solid #303030;\sn font-size: 11px;\sn margin: 10px 0;\sn}\sn\sn.viewer th, .viewer thead td{\sn color: #000;\sn background: #eee;\sn border: 1px solid #aaa;\sn padding: 0 3px;\sn}\sn\sn.viewer td {\sn border: 1px solid #aaa;\sn padding: 0 3px;\sn}\sn\sn.viewer caption {\sn padding: 3px;\sn}\sn\sn.viewer hr {\sn border: none;\sn border-top: dotted 1px #777;\sn height: 1px;\sn color: #777;\sn margin: 7px 0;\sn}\sn\sn.viewer\sn{\sn margin: .5em 0 0 0;\sn padding: .5em 0;\sn border-top: 1px solid #ccc;\sn}\sn\sn.highlight {\sn color: #000;\sn background: #ffe72f;\sn}\sn/*}}}*/\sn/***\sn!Editor rules /% ----------------------------------------------------------------------------------------- %/\sn***/\sn/*{{{*/\sn.editor {\sn font-size: .8em;\sn color: #402C74;\sn padding: .3em 0;\sn}\sn\sn.editor input, .editor textarea {\sn font: 1.1em/130% 'Andale Mono', 'Monaco', 'Lucida Console', 'Courier New', monospace;\sn margin: 0;\sn border: 1px inset #333;\sn padding: 2px 0;\sn}\sn\sn.editor textarea {\sn height: 42em;\sn width: 100%;\sn}\sn\sninput:focus, textarea:focus\sn{\sn background: #ffe;\sn border: 1px solid #000;\sn}\sn.footer\sn{\sn padding: .5em 0;\sn margin: .5em 0;\sn border-top: 1px solid #ddd;\sn color: #555;\sn text-align: center; \sn}\sn/*}}}*/\sn/***\sn!IE Display hacks /% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%/\sn***/\sn/*{{{*/\snbody{\sn _text-align: center;\sn}\sn\sn#contentWrapper\sn{\sn/* _width: 770px; CSS UNDERSCORE HACK FOR PROPER WIN/IE DISPLAY */\sn _text-align: left; /* CSS UNDERSCORE HACK FOR PROPER WIN/IE DISPLAY */ \sn}\sn\sn#messageArea{\sn _position: absolute;\sn}\sn/*}}}*/";\n\nconfig.shadowTiddlers.GTDPageTemplate = "<!---\sn| Name:|GTDTWPlusPageTemplate|\sn| Source:|http://www.checkettsweb.com/tw/gtd_tiddlywiki.htm#StyleSheet|\sn| Author:|ClintChecketts|\sn--->\sn<!--{{{-->\sn<div id='header'>\sn<div id='titleLine'>\sn<span id='siteTitle' refresh='content' tiddler='SiteTitle'></span>\sn<span id='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='sidebar'>\sn<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div><div id=\s"licensePanel\s">\sn<a rel=\s"license\s" href=\s"http://shared.snapgrid.com/gtd_tiddlywiki.html#RevisionHistory\s" target=\s"_new\s">GTDTW Version <span macro=\s"version\s"></span></a>\sn<a rel=\s"license\s" href=\s"http://www.tiddlywiki.com\s" target=\s"_new\s">\snTiddlyWiki is published by Jeremy Ruston at Osmosoft under a BSD open source license</a>\sn<a rel=\s"license\s" href=\s"http://snapgrid.com\s" target=\s"_new\s">GTD TiddlyWiki is a modification by Nathan Bowers at Snapgrid under the same license terms.</a>\sn<a rel=\s"license\s" href=\s"http://davidco.com\s" target=\s"_new\s">\s"Getting Things Done\s" is &#169; David Allen at Davidco. Davidco has no affiliation with TiddlyWiki or GTD TiddlyWiki.</a></div></div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn<!--}}}-->";\n\nconfig.themes.push("GTD");\n\n\nconfig.shadowTiddlers.DevFireStyleSheet = "/***\sn!Devfire\snStyle by Clint Checketts (http://www.checkettsweb.com) for TiddlyWiki 2.0\snInspired by the GLP'd Darkfire Wordpress skin.\sn\sn!Sections in this Tiddler:\sn*Generic rules\sn*Links styles\sn*Header\sn*Main menu\sn*Sidebar\sn**Sidebar options\sn**Sidebar tabs\sn*Message area\sn*Popup\sn*Tabs\sn*Tiddler display\sn**Viewer\sn**Editor\sn*Misc. rules\sn!Generic rules /% ============================================================= %/\sn***/\sn/*{{{*/\snbody {\snbackground-color: #000;\sn}\sn/*}}}*/\sn/***\sn!Link styles /% ============================================================= %/\sn***/\sn/*{{{*/\sna,\sna.button,\sn#mainMenu a.button,\sn#sidebarOptions .sliderPanel a{\sn color: #ffbf00;\sn border: 0;\sn}\sn\sna:hover,\sna.button:hover,\sn#mainMenu a.button:hover,\sn#sidebarOptions .sliderPanel a:hover\sn#sidebarOptions .sliderPanel a:active{\sn color: #ff7f00;\sn border: 0;\sn border-bottom: #ff7f00 1px dashed;\sn background: transparent;\sn text-decoration: none;\sn}\sn\sn#displayArea .button.highlight{\sn color: #ffbf00;\sn background: #4c4c4c;\sn}\sn/*}}}*/\sn/***\sn!Header styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn.header{\sn border-bottom: 2px solid #ffbf00;\sn color: #fff;\sn}\sn\sn.headerForeground a {\sn color: #fff;\sn}\sn\sn.header a:hover {\sn border-bottom: 1px dashed #fff;\sn}\sn/*}}}*/\sn/***\sn!Main menu styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#mainMenu {color: #fff;}\sn#mainMenu h1{\sn font-size: 1.1em;\sn}\sn#mainMenu li,#mainMenu ul{\sn list-style: none;\sn margin: 0;\sn padding: 0;\sn}\sn/*}}}*/\sn/***\sn!Sidebar styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#sidebar {\sn right: 0;\sn color: #fff;\sn border: 2px solid #ffbf00;\sn border-width: 0 0 2px 2px;\sn}\sn#sidebarOptions {\sn background-color: #4c4c4c;\sn padding: 0;\sn}\sn\sn#sidebarOptions a{\sn margin: 0;\sn color: #ffbf00;\sn border: 0;\sn}\sn#sidebarOptions a:hover {\sn color: #4c4c4c;\sn background-color: #ffbf00;\sn\sn}\sn\sn#sidebarOptions a:active {\sn color: #ffbf00;\sn background-color: transparent;\sn}\sn\sn#sidebarOptions .sliderPanel {\sn background-color: #333;\sn margin: 0;\sn}\sn\sn#sidebarTabs {background-color: #4c4c4c;}\sn#sidebarTabs .tabSelected {\sn padding: 3px 3px;\sn cursor: default;\sn color: #ffbf00;\sn background-color: #666;\sn}\sn#sidebarTabs .tabUnselected {\sn color: #ffbf00;\sn background-color: #5f5f5f;\sn padding: 0 4px;\sn}\sn\sn#sidebarTabs .tabUnselected:hover,\sn#sidebarTabs .tabContents {\sn background-color: #666;\sn}\sn\sn.listTitle{color: #FFF;}\sn#sidebarTabs .tabContents a{\sn color: #ffbf00;\sn}\sn\sn#sidebarTabs .tabContents a:hover{\sn color: #ff7f00;\sn background: transparent;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabSelected,\sn#sidebarTabs .txtMoreTab .tab:hover,\sn#sidebarTabs .txtMoreTab .tabContents{\sn color: #ffbf00;\sn background: #4c4c4c;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabUnselected {\sn color: #ffbf00;\sn background: #5f5f5f;\sn}\sn\sn.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}\sn.tab.tabUnselected {background-color: #666;}\sn.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}\sn.tabContents {\sn background-color: #4c4c4c;\sn border: 0;\sn}\sn.tabContents .tabContents{background: #666;}\sn.tabContents .tabSelected{background: #666;}\sn.tabContents .tabUnselected{background: #5f5f5f;}\sn.tabContents .tab:hover{background: #666;}\sn/*}}}*/\sn/***\sn!Message area styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}\sn#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}\sn#messageArea a:hover {color: #ff7f00;}\sn#messageArea a:active {color: #ff7f00;}\sn#messageArea .messageToolbar a{\sn border: 1px solid #ffbf00;\sn background: #4c4c4c;\sn}\sn/*}}}*/\sn/***\sn!Popup styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}\sn#popup a {color: #ffbf00; }\sn#popup a:hover { background: transparent; color: #ff7f00; border: 0;}\sn#popup hr {color: #ffbf00; background: #ffbf00;}\sn/*}}}*/\sn/***\sn!Tiddler Display styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn.title{color: #fff;}\snh1, h2, h3, h4, h5 {\sn color: #fff;\sn background-color: transparent;\sn border-bottom: 1px solid #333;\sn}\sn\sn.subtitle{\sn color: #666;\sn}\sn\sn.viewer {color: #fff; }\sn\sn.viewer table{background: #666; color: #fff;}\sn\sn.viewer th {background-color: #996; color: #fff;}\sn\sn.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}\sn\sn.viewer hr {color: #666;}\sn\sn.tiddler .button {color: #4c4c4c;}\sn.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}\sn.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}\sn\sn.toolbar {\sn color: #4c4c4c;\sn}\sn\sn.toolbar a.button,\sn.editorFooter a{\sn border: 0;\sn}\sn\sn.footer {\sn color: #ddd;\sn}\sn\sn.selectedTiddler .footer {\sn color: #888;\sn}\sn\sn.highlight, .marked {\sn color: #000;\sn background-color: #ffe72f;\sn}\sn.editorFooter {\sn color: #aaa;\sn}\sn\sn.tab{\sn-moz-border-radius-topleft: 3px;\sn-moz-border-radius-topright: 3px;\sn}\sn\sn.tagging,\sn.tagged{\sn background: #4c4c4c;\sn border: 1px solid #4c4c4c; \sn}\sn\sn.selected .tagging,\sn.selected .tagged{\sn background: #000;\sn border: 1px solid #ffbf00;\sn}\sn\sn.tagging .listTitle,\sn.tagged .listTitle{\sn color: #fff;\sn}\sn\sn.tagging .button,\sn.tagged .button{\sn color: #ffbf00;\sn border: 0;\sn padding: 0;\sn}\sn\sn.tagging .button:hover,\sn.tagged .button:hover{\snbackground: transparent;\sn}\sn/*}}}*//***\sn!Devfire\snStyle by Clint Checketts (http://www.checkettsweb.com) for TiddlyWiki 2.0\snInspired by the GLP'd Darkfire Wordpress skin.\sn\sn!Sections in this Tiddler:\sn*Generic rules\sn*Links styles\sn*Header\sn*Main menu\sn*Sidebar\sn**Sidebar options\sn**Sidebar tabs\sn*Message area\sn*Popup\sn*Tabs\sn*Tiddler display\sn**Viewer\sn**Editor\sn*Misc. rules\sn!Generic rules /% ============================================================= %/\sn***/\sn/*{{{*/\snbody {\snbackground-color: #000;\sn}\sn/*}}}*/\sn/***\sn!Link styles /% ============================================================= %/\sn***/\sn/*{{{*/\sna,\sna.button,\sn#mainMenu a.button,\sn#sidebarOptions .sliderPanel a{\sn color: #ffbf00;\sn border: 0;\sn}\sn\sna:hover,\sna.button:hover,\sn#mainMenu a.button:hover,\sn#sidebarOptions .sliderPanel a:hover\sn#sidebarOptions .sliderPanel a:active{\sn color: #ff7f00;\sn border: 0;\sn border-bottom: #ff7f00 1px dashed;\sn background: transparent;\sn text-decoration: none;\sn}\sn\sn#displayArea .button.highlight{\sn color: #ffbf00;\sn background: #4c4c4c;\sn}\sn/*}}}*/\sn/***\sn!Header styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn.header{\sn border-bottom: 2px solid #ffbf00;\sn color: #fff;\sn}\sn\sn.headerForeground a {\sn color: #fff;\sn}\sn\sn.header a:hover {\sn border-bottom: 1px dashed #fff;\sn}\sn/*}}}*/\sn/***\sn!Main menu styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#mainMenu {color: #fff;}\sn#mainMenu h1{\sn font-size: 1.1em;\sn}\sn#mainMenu li,#mainMenu ul{\sn list-style: none;\sn margin: 0;\sn padding: 0;\sn}\sn/*}}}*/\sn/***\sn!Sidebar styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#sidebar {\sn right: 0;\sn color: #fff;\sn border: 2px solid #ffbf00;\sn border-width: 0 0 2px 2px;\sn}\sn#sidebarOptions {\sn background-color: #4c4c4c;\sn padding: 0;\sn}\sn\sn#sidebarOptions a{\sn margin: 0;\sn color: #ffbf00;\sn border: 0;\sn}\sn#sidebarOptions a:hover {\sn color: #4c4c4c;\sn background-color: #ffbf00;\sn\sn}\sn\sn#sidebarOptions a:active {\sn color: #ffbf00;\sn background-color: transparent;\sn}\sn\sn#sidebarOptions .sliderPanel {\sn background-color: #333;\sn margin: 0;\sn}\sn\sn#sidebarTabs {background-color: #4c4c4c;}\sn#sidebarTabs .tabSelected {\sn padding: 3px 3px;\sn cursor: default;\sn color: #ffbf00;\sn background-color: #666;\sn}\sn#sidebarTabs .tabUnselected {\sn color: #ffbf00;\sn background-color: #5f5f5f;\sn padding: 0 4px;\sn}\sn\sn#sidebarTabs .tabUnselected:hover,\sn#sidebarTabs .tabContents {\sn background-color: #666;\sn}\sn\sn.listTitle{color: #FFF;}\sn#sidebarTabs .tabContents a{\sn color: #ffbf00;\sn}\sn\sn#sidebarTabs .tabContents a:hover{\sn color: #ff7f00;\sn background: transparent;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabSelected,\sn#sidebarTabs .txtMoreTab .tab:hover,\sn#sidebarTabs .txtMoreTab .tabContents{\sn color: #ffbf00;\sn background: #4c4c4c;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabUnselected {\sn color: #ffbf00;\sn background: #5f5f5f;\sn}\sn\sn.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}\sn.tab.tabUnselected {background-color: #666;}\sn.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}\sn.tabContents {\sn background-color: #4c4c4c;\sn border: 0;\sn}\sn.tabContents .tabContents{background: #666;}\sn.tabContents .tabSelected{background: #666;}\sn.tabContents .tabUnselected{background: #5f5f5f;}\sn.tabContents .tab:hover{background: #666;}\sn/*}}}*/\sn/***\sn!Message area styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}\sn#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}\sn#messageArea a:hover {color: #ff7f00;}\sn#messageArea a:active {color: #ff7f00;}\sn#messageArea .messageToolbar a{\sn border: 1px solid #ffbf00;\sn background: #4c4c4c;\sn}\sn/*}}}*/\sn/***\sn!Popup styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn#popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}\sn#popup li.disabled{color: #ffbf00;}\sn\sn#popup a {color: #ffbf00; }\sn#popup a:hover { background: transparent; color: #ff7f00; border: 0;}\sn#popup hr {color: #ffbf00; background: #ffbf00;}\sn/*}}}*/\sn/***\sn!Tiddler Display styles /% ============================================================= %/\sn***/\sn/*{{{*/\sn.title{color: #fff;}\snh1, h2, h3, h4, h5 {\sn color: #fff;\sn background-color: transparent;\sn border-bottom: 1px solid #333;\sn}\sn\sn.subtitle{\sn color: #666;\sn}\sn\sn.viewer {color: #fff; }\sn\sn.viewer table{background: #666; color: #fff;}\sn\sn.viewer th {background-color: #996; color: #fff;}\sn\sn.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00}\sn\sn.viewer hr {color: #666;}\sn\sn.tiddler .button {color: #4c4c4c;}\sn.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}\sn.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}\sn\sn.toolbar {\sn color: #4c4c4c;\sn}\sn\sn.toolbar a.button,\sn.editorFooter a{\sn border: 0;\sn}\sn\sn.footer {\sn color: #ddd;\sn}\sn\sn.selectedTiddler .footer {\sn color: #888;\sn}\sn\sn.highlight, .marked {\sn color: #000;\sn background-color: #ffe72f;\sn}\sn.editorFooter {\sn color: #aaa;\sn}\sn\sn.tab{\sn-moz-border-radius-topleft: 3px;\sn-moz-border-radius-topright: 3px;\sn}\sn\sn.tagging,\sn.tagged{\sn background: #4c4c4c;\sn border: 1px solid #4c4c4c; \sn}\sn\sn.selected .tagging,\sn.selected .tagged{\sn background: #000;\sn border: 1px solid #ffbf00;\sn}\sn\sn.tagging .listTitle,\sn.tagged .listTitle{\sn color: #fff;\sn}\sn\sn.tagging .button,\sn.tagged .button{\sn color: #ffbf00;\sn border: 0;\sn padding: 0;\sn}\sn\sn.tagging .button:hover,\sn.tagged .button:hover{\snbackground: transparent;\sn}\sn\sn.cascade {\sn background: #4c4c4c;\sn color: #ddd;\sn border: 1px solid #ffbf00;\sn}\sn/*}}}*/";\n\nconfig.shadowTiddlers.DevFirePageTemplate = "<div class='header' macro='gradient vert #390108 #900'>\sn<div class='headerShadow'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn<div class='headerForeground'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\sn<div id='sidebar'>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn</div>";\n\nconfig.themes.push("DevFire");\n\n\nconfig.shadowTiddlers.ClassicBrownStyleSheet = "[[TagglyTaggingStyles]]\sn\sn/***\sn!TiddlyWiki Classic Color Scheme\snDesigned by Jeremy Ruston\sn\snTo use this color scheme copy the [[ClassicTiddlyWiki]] contents into a tiddler and name it 'StyleSheet' also grab the [[ClassicTemplate]] and copy its contents into a tiddler named 'PageTemplate'.\sn\sn!Colors Used\sn*@@bgcolor(#630):color(#fff): #630@@\sn*@@bgcolor(#930): #930@@\sn*@@bgcolor(#996633): #963@@\sn*@@bgcolor(#c90): #c90@@\sn*@@bgcolor(#cf6): #cf6@@\sn*@@bgcolor(#cc9): #cc9@@\sn*@@bgcolor(#ba9): #ba9@@\sn*@@bgcolor(#996): #996@@\sn*@@bgcolor(#300):color(#fff): #300@@\sn*@@bgcolor(#000000):color(#fff): #000@@\sn*@@bgcolor(#666): #666@@\sn*@@bgcolor(#888): #888@@\sn*@@bgcolor(#aaa): #aaa@@\sn*@@bgcolor(#ddd): #ddd@@\sn*@@bgcolor(#eee): #eee@@\sn*@@bgcolor(#ffffff): #fff@@\sn*@@bgcolor(#f00): #f00@@\sn*@@bgcolor(#ff3): #ff3@@\sn!Generic Rules /%==============================================%/\sn***/\sn/*{{{*/\snbody {\sn background: #fff;\sn color: #000;\sn}\sn\sna{\sn color: #963;\sn}\sn\sna:hover{\sn background: #963;\sn color: #fff;\sn}\sn\sna img{\sn border: 0;\sn}\sn\snh1,h2,h3,h4,h5 {\sn background: #cc9;\sn}\sn/*}}}*/\sn/***\sn!Header /%==================================================%/\sn***/\sn/*{{{*/\sn.header{\sn background: #300;\sn}\sn\sn.titleLine {\sn color: #fff;\sn padding: 5em 0em 1em .5em;\sn}\sn\sn.titleLine a {\sn color: #cf6;\sn}\sn\sn.titleLine a:hover {\sn background: transparent;\sn}\sn/*}}}*/\sn/***\sn!Main Menu /%=================================================%/\sn***/\sn/*{{{*/\sn#mainMenu .button {\sn color: #930;\sn}\sn\sn#mainMenu .button:hover {\sn color: #cf6;\sn background: #930;\sn}\sn\sn#mainMenu li{\sn list-style: none;\sn}\sn/*}}}*/\sn/***\sn!Sidebar options /%=================================================%/\sn~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\sn***/\sn/*{{{*/\sn#sidebar {\sn background: #c90;\sn right: 0;\sn}\sn\sn#sidebarOptions a{\sn color: #930;\sn border: 0;\sn margin: 0;\sn padding: .25em .5em;\sn}\sn\sn#sidebarOptions a:hover {\sn color: #cf6;\sn background: #930;\sn}\sn\sn#sidebarOptions a:active {\sn color: #930;\sn background: #cf6;\sn}\sn\sn#sidebarOptions .sliderPanel {\sn background: #eea;\sn margin: 0;\sn}\sn\sn#sidebarOptions .sliderPanel a {\sn color: #930;\sn}\sn\sn#sidebarOptions .sliderPanel a:hover {\sn color: #cf6;\sn background: #930;\sn}\sn\sn#sidebarOptions .sliderPanel a:active {\sn color: #930;\sn background: #cf6;\sn}\sn/*}}}*/\sn/***\sn!Sidebar tabs /%=================================================%/\sn***/\sn/*{{{*/\sn.tabSelected,.tabContents {\sn background: #eea;\sn border: 0;\sn}\sn\sn.tabUnselected {\sn background: #c90;\sn}\sn\sn#sidebarTabs {\sn background: #c90;\sn}\sn\sn#sidebarTabs .tabSelected{\sn color: #cf6;\sn background: #963;\sn}\sn\sn#sidebarTabs .tabUnselected {\sn color: #cf6;\sn background: #930;\sn}\sn\sn#sidebarTabs .tabContents{\sn background: #963;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabSelected,\sn#sidebarTabs .txtMoreTab .tabSelected:hover{\sn background: #930;\sn color: #cf6;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabUnselected,\sn#sidebarTabs .txtMoreTab .tabUnselected:hover{\sn background: #300;\sn color: #cf6;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabContents {\sn background: #930;\sn}\sn\sn#sidebarTabs .tabContents a {\sn color: #cf6;\sn border: 0;\sn}\sn\sn#sidebarTabs .button.highlight,\sn#sidebarTabs .tabContents a:hover {\sn background: #cf6;\sn color: #300;\sn}\sn/*}}}*/\sn/***\sn!Message Area /%=================================================%/\sn***/\sn/*{{{*/\sn#messageArea {\sn background: #930;\sn color: #fff;\sn}\sn\sn#messageArea a:link, #messageArea a:visited {\sn color: #c90;\sn}\sn\sn#messageArea a:hover {\sn color: #963;\sn background: transparent;\sn}\sn\sn#messageArea a:active {\sn color: #fff;\sn}\sn/*}}}*/\sn/***\sn!Popup /%=================================================%/\sn***/\sn/*{{{*/\sn.popup {\sn background: #eea;\sn border: 1px solid #930;\sn}\sn\sn.popup hr {\sn color: #963;\sn background: #963;\sn border-bottom: 1px;\sn}\sn\sn.popup li.disabled {\sn color: #ba9;\sn}\sn\sn.popup li a, .popup li a:visited {\sn color: #300;\sn}\sn\sn.popup li a:hover {\sn background: #930;\sn color: #eea;\sn}\sn/*}}}*/\sn/***\sn!Tiddler Display /%=================================================%/\sn***/\sn/*{{{*/\sn.tiddler .button {\sn color: #930;\sn}\sn\sn.tiddler .button:hover {\sn color: #cf6;\sn background: #930;\sn}\sn\sn.tiddler .button:active {\sn color: #fff;\sn background: #c90;\sn}\sn\sn.shadow .title {\sn color: #888;\sn}\sn\sn.title {\sn color: #422;\sn}\sn\sn.subtitle {\sn color: #866;\sn}\sn\sn.toolbar {\sn color: #aaa;\sn}\sn\sn.toolbar a,\sn.toolbar a:hover{\sn border: 0;\sn}\sn\sn.tagging, .tagged {\sn border: 1px solid #fff;\sn background-color: #ffc;\sn}\sn\sn.selected .tagging, .selected .tagged {\sn border: 1px solid #aa6;\sn background-color: #ffc;\sn}\sn\sn.tagging .listTitle, .tagged .listTitle {\sncolor: #999999;\sn}\sn\sn.footer {\sn color: #ddd;\sn}\sn\sn.selected .footer {\sn color: #888;\sn}\sn\sn.sparkline {\sn background: #eea;\sn border: 0;\sn}\sn\sn.sparktick {\sn background: #930;\sn}\sn\sn.errorButton {\sn color: #ff0;\sn background: #f00;\sn}\sn\sn.zoomer {\sn color: #963;\sn border: 1px solid #963;\sn}\sn/*}}}*/\sn/***\sn''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\sn***/\sn/*{{{*/\sn.viewer .button {\sn background: #c90;\sn color: #300;\sn border-right: 1px solid #300;\sn border-bottom: 1px solid #300;\sn}\sn\sn.viewer .button:hover {\sn background: #eea;\sn color: #c90;\sn}\sn\sn.viewer .imageLink{\sn background: transparent;\sn}\sn\sn.viewer blockquote {\sn border-left: 3px solid #666;\sn}\sn\sn.viewer table {\sn border: 2px solid #303030;\sn}\sn\sn.viewer th, thead td {\sn background: #996;\sn border: 1px solid #606060;\sn color: #fff;\sn}\sn\sn.viewer td, .viewer tr {\sn border: 1px solid #606060;\sn}\sn\sn.viewer pre {\sn border: 1px solid #963;\sn background: #eea;\sn}\sn\sn.viewer code {\sn color: #630;\sn}\sn\sn.viewer hr {\sn border: 0;\sn border-top: dashed 1px #606060;\sn color: #666;\sn}\sn\sn.highlight, .marked {\sn background: #ff3;\sn}\sn/*}}}*/\sn/***\sn''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\sn***/\sn/*{{{*/\sn.editor input {\sn border: 1px solid #000;\sn}\sn\sn.editor textarea {\sn border: 1px solid #000;\sn width: 100%;\sn}\sn\sn.editorFooter {\sn color: #aaa;\sn}\sn\sn.editorFooter a {\sn color: #930;\sn}\sn\sn.editorFooter a:hover {\sn color: #cf6;\sn background: #930;\sn}\sn\sn.editorFooter a:active {\sn color: #fff;\sn background: #c90;\sn}\sn/*}}}*/";\n\nconfig.shadowTiddlers.ClassicBrownPageTemplate = "<div class='header'>\sn<div class='titleLine'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\sn<div id='sidebar'>\sn<div macro='gradient vert #ffffff #cc9900'>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn</div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn</div>";\n\nconfig.themes.push("ClassicBrown");\n//}}}\n/***\n!~MonkeyPirateTiddlyWiki Themes\nCreated by Simon Baird from http://simonbaird.com/mptw/\n***/\n//{{{\n\n// couple of extra bits\nconfig.shadowTiddlers.HorizontalMainMenuStyles = "/***\snTo use, add {{{[[HorizontalMainMenuStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also HorizontalMainMenu and PageTemplate.\sn***/\sn/*{{{*/\sn\sn#topMenu br {display:none; }\sn#topMenu { background: #39a; }\sn#topMenu { padding:2px; }\sn#topMenu .button, #topMenu .tiddlyLink {\sn margin-left:0.5em; margin-right:0.5em;\sn padding-left:3px; padding-right:3px;\sn color:white; font-size:115%;\sn}\sn#topMenu .button:hover, #topMenu .tiddlyLink:hover { background:#178;}\sn\sn#displayArea { margin: 1em 15.7em 0em 1em; } /* so we use the freed up space */\sn\sn/* just in case want some QuickOpenTags in your topMenu */\sn#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\sn#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\sn#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\sn\sn\sn/*}}}*/";\n\nconfig.shadowTiddlers.SideBarWhiteAndGrey = "/***\snThis CSS by DaveBirss.\sn***/\sn/*{{{*/\sn\sn.tabSelected {\sn background: #fff;\sn}\sn\sn.tabUnselected {\sn background: #eee;\sn}\sn\sn#sidebar {\sn color: #000;\sn background: transparent; \sn}\sn\sn#sidebarOptions {\sn background: #fff;\sn}\sn\sn#sidebarOptions .button {\sn color: #999;\sn}\sn\sn#sidebarOptions .button:hover {\sn color: #000;\sn background: #fff;\sn border-color:white;\sn}\sn\sn#sidebarOptions .button:active {\sn color: #000;\sn background: #fff;\sn}\sn\sn#sidebarOptions .sliderPanel {\sn background: transparent;\sn}\sn\sn#sidebarOptions .sliderPanel A {\sn color: #999;\sn}\sn\sn#sidebarOptions .sliderPanel A:hover {\sn color: #000;\sn background: #fff;\sn}\sn\sn#sidebarOptions .sliderPanel A:active {\sn color: #000;\sn background: #fff;\sn}\sn\sn.sidebarSubHeading {\sn color: #000;\sn}\sn\sn#sidebarTabs {`\sn background: #fff\sn}\sn\sn#sidebarTabs .tabSelected {\sn color: #000;\sn background: #fff;\sn border-top: solid 1px #ccc;\sn border-left: solid 1px #ccc;\sn border-right: solid 1px #ccc;\sn border-bottom: none;\sn}\sn\sn#sidebarTabs .tabUnselected {\sn color: #999;\sn background: #eee;\sn border-top: solid 1px #ccc;\sn border-left: solid 1px #ccc;\sn border-right: solid 1px #ccc;\sn border-bottom: none;\sn}\sn\sn#sidebarTabs .tabContents {\sn background: #fff;\sn}\sn\sn\sn#sidebarTabs .txtMoreTab .tabSelected {\sn background: #fff;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabUnselected {\sn background: #eee;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabContents {\sn background: #fff;\sn}\sn\sn#sidebarTabs .tabContents .tiddlyLink {\sn color: #999;\sn}\sn\sn#sidebarTabs .tabContents .tiddlyLink:hover {\sn background: #fff;\sn color: #000;\sn}\sn\sn#sidebarTabs .tabContents {\sn color: #000;\sn}\sn\sn#sidebarTabs .button {\sn color: #666;\sn}\sn\sn#sidebarTabs .tabContents .button:hover {\sn color: #000;\sn background: #fff;\sn}\sn\sn\sn/*}}}*/";\n\n\nconfig.shadowTiddlers.MPTWStyleSheet = "/***\snCosmetic fixes that probably should be included in a future TW...\sn***/\sn/*{{{*/\sn.viewer .listTitle { list-style-type:none; margin-left:-2em; }\sn.editorFooter .button { padding-top: 0px; padding-bottom:0px; }\sn/*}}}*/\sn/***\snImportant stuff. See TagglyTaggingStyles and HorizontalMainMenuStyles\sn***/\sn/*{{{*/\sn[[TagglyTaggingStyles]]\sn[[HorizontalMainMenuStyles]]\sn/*}}}*/\sn/***\snClint's fix for weird IE behaviours\sn***/\sn/*{{{*/\snbody {position:static;}\sn.tagClear{margin-top:1em;clear:both;}\sn/*}}}*/\sn/***\snJust colours, fonts, tweaks etc. See SideBarWhiteAndGrey\sn***/\sn/*{{{*/\snbody {background:#eee; /* font-size:103%; */}\sna{ color: #069; }\sna:hover{ background: #069; color: #fff; }\sn.popup { background: #178; border: 1px solid #069; }\sn.headerForeground a { color: #6fc;}\sn.headerShadow { left: 2px; top: 2px; }\sn.title { padding:0px; margin:0px; }\sn.siteSubtitle { padding:0px; margin:0px; padding-left:1.5em; }\sn.subtitle { font-size:90%; color:#ccc; padding-left:0.25em; }\snh1,h2,h3,h4,h5 { color: #000; background: transparent; }\sn.title {color:black; font-size:2em;}\sn.shadow .title {color:#999; }\sn.viewer pre { background-color:#f8f8ff; border-color:#ddf; }\sn.viewer { padding-top:0px; }\sn.editor textarea { font-family:monospace; }\sn#sidebarOptions { border:1px #ccc solid; }\sn.tiddler {\sn border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding-bottom:1em; margin-bottom:1em; \sn background:#fff; padding-right:1.5em; }\sn#messageArea { background-color:#bde; border-color:#8ab; border-width:4px; border-style:dotted; font-size:90%; }\sn#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\sn#messageArea .button:hover {background: #acd; }\sn[[SideBarWhiteAndGrey]]\sn\sn.viewer td {vertical-align:top;}\sn\sn.viewer table.noBorder {border-style:none;}\sn.viewer table.noBorder td {border-style:none;}\sn.viewer table.threeCol td {width:33%;}\sn\sn#adsense {\sn margin: 1em 15.7em 0em 1em; border:1px solid #ddd;\sn background:#f8f8f8; text-align:center;margin-bottom:1em;overflow:hidden;padding:0.5em;} \sn\sn.sliderPanel { margin-left: 2em; }\sn\sn.viewer th { background:#ddd; color:black; }\sn/*}}}*/\sn/*{{{*/\sn/* for testing clint's new formatter. eg {{red{asdfaf}}} */\sn.red { color:white; background:red; display:block; padding:1em; } \sn\sn/* FF doesn't need this. but IE seems to want to make first one white */\sn.txtMainTab .tabset { background:#eee; }\sn.txtMoreTab .tabset { background:transparent; }\sn\sn.faq ol li { padding-top:1em; font-size:120%; }\sn.faq ol ul li { padding-top:0px; font-size:100%; }\sn\sn/*}}}*/\sn";\n\nconfig.shadowTiddlers.MPTWPageTemplate = "<!---\snI've just tweaked my gradient colours and the topMenu bit. See HorizontalMainMenu.\sn--->\sn<!--{{{-->\sn<div class='header' macro='gradient vert #000 #069'>\sn<div class='headerShadow'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn<div class='headerForeground'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\sn</div>\sn<div id='sidebar'>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn</div>\sn<!--}}}-->\sn";\n\nconfig.themes.push("MPTW");\n\n\nconfig.shadowTiddlers.MPTWCurvesStyleSheet = "/*{{{*/\sn[[MPTWStyleSheet]]\sn.tiddler { -moz-border-radius: 2em;}\sn.button { -moz-border-radius: 1em;}\sn#sidebarOptions { -moz-border-radius: 0 0 1em 1em;}\sn.tab { -moz-border-radius: 1em 1em 0 0;}\sn.tabContents { -moz-border-radius: 1em 1em 0 0;}\sn/*}}}*/";\n\nconfig.shadowTiddlers.MPTWCurvesPageTemplate = config.shadowTiddlers.MPTWPageTemplate;\n\nconfig.themes.push("MPTWCurves");\n\n//}}}\n/***\n!~GTDd3\nCreated by Tomo (Tom Otvos) from http://www.dcubed.ca\n(Based on the original GTD theme by Nathan Bowers at http://snapgrid.com)\n***/\n//{{{\nconfig.shadowTiddlers.GTDd3PageTemplate = "<div class='header'>\sn<div class='headerShadow'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn<div class='headerForeground'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='mainMenu' refresh='content' tiddler='MainMenu' force='true'></div>\sn<div id='sidebar'>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn</div>";\n\nconfig.shadowTiddlers.GTDd3StyleSheet = "/***\sn!GTD specific styles\sn***/\sn\sn/*{{{*/\sn\sn/* the tagging popup really gets in the way so push it off to the side */\sn.tagging { float: right; }\sn\sn/* this unbullets actions in the actionList macro */\snul.gtdActionList { list-style-type: none; }\snli.gtdActionListProject, li.gtdActionListContext { margin-top: 1.0em; }\sn\sn.gtdCompletedActionItem { text-decoration: line-through; }\sn.gtdNextActionItem { border-bottom: 1px solid red; }\sn\sn/*}}}*/\sn\sn/***\sn!Imported 3x5 printing styles\sn//adapted from the work of Clint Checketts, http://www.checkettsweb.com/tw/gtd_tiddlywiki.htm //\sn***/\sn\sn/*{{{*/\sn\sn@media print {\sn#mainMenu, #sidebar, #messageArea {display: none !important;}\sn#displayArea {margin: 1em 1em 0em 1em;}\sn\sn\sn/* LAYOUT ELEMENTS ========================================================== */\sn*\sn{\sn margin: 0;\sn padding: 0;\sn}\sn\sn#contentWrapper\sn{\sn margin: 0;\sn width: 100%;\sn position: static;\sn}\sn\snbody {\sn background: #fff;\sn color: #000;\sn font-size: 6.2pt;\sn font-family: \s"Lucida Grande\s", \s"Bitstream Vera Sans\s", Helvetica, Verdana, Arial, sans-serif;\sn}\sn\snimg {\sn max-width: 2.2in;\sn max-height: 4.3in;\sn}\sn\sn#header, #side_container, #storeArea, #copyright, #floater, #messageArea, .save_accesskey, .site_description, #saveTest, .toolbar, .header, .footer, .tagging, .tagged\sn{\sn display: none;\sn}\sn\sn#tiddlerDisplay, #displayArea\sn{\sn display: inline;\sn}\sn\sn.tiddler {\sn margin: 0 0 2em 0;\sn border-top: 1px solid #000;\sn page-break-before: always;\sn}\sn\sn.tiddler:first-child {\sn page-break-before: ;\sn}\sn\sn.title {\sn font-size: 1.6em;\sn font-weight: bold;\sn margin-bottom: .3em;\sn padding: .2em 0;\sn border-bottom: 1px dotted #000;\sn}\sn\snp, blockquote, ul, li, ol, dt, dd, dl, table\sn{\sn margin: 0 0 .3em 0;\sn}\sn\snh1, h2, h3, h4, h5, h6\sn{\sn margin: .2em 0;\sn} \sn\snh1\sn{\sn font-size: 1.5em;\sn}\sn\snh2\sn{\sn font-size: 1.3em;\sn}\sn\snh3\sn{\sn font-size: 1.25em;\sn}\sn\snh4\sn{\sn font-size: 1.15em;\sn}\sn\snh5\sn{\sn font-size: 1.1em;\sn}\sn\snblockquote\sn{\sn margin: .6em;\sn padding-left: .6em;\sn border-left: 1px solid #ccc;\sn}\sn\snul\sn{\sn list-style-type: circle;\sn}\sn\snli\sn{\sn margin: .1em 0 .1em 2em;\sn line-height: 1.4em; \sn}\sn\sntable\sn{\sn border-collapse: collapse;\sn font-size: 1em;\sn}\sn\sntd, th\sn{\sn border: 1px solid #999;\sn padding: .2em;\sn}\sn\snhr {\sn border: none;\sn border-top: dotted 1px #777;\sn height: 1px;\sn color: #777;\sn margin: .6em 0;\sn}\sn}\sn/*}}}*/\sn\sn/***\sn!Imported styles for calendar plugin\sn***/\sn\sn/*{{{*/\sn.calendar{\sn border-bottom: 1px solid #550000;\sn}\sn\sn.viewer .calendar{\sn width: 220px;\sn}\sn\sn#mainMenu .calendar{\sn font-size: 8px;\sn cursor: pointer;\sn width: 100%;\sn border: 0;\sn border-collapse: collapse;\sn}\sn\sn#mainMenu .calendar .button{\sn border: 0;\sn}\sn\sn#mainMenu .calendar td{\sn font-size: 8pt;\sn padding: 0;\sn background: #fff;\sn border: 0;\sn}\sn\sn#mainMenu .calendar a{\sn margin: 0;\sn color: #000;\sn background: transparent;\sn}\sn\sn#mainMenu .calendar a:hover{\sn color: #000;\sn background: transparent;\sn}\sn\sn#mainMenu .calendarMonthname,\sn#mainMenu .calendar .calendarMonthTitle td a{\sn color: #fff;\sn}\sn\sn#mainMenu .calendarDaysOfWeek td{\sn background: #500;\sn color: #fff;\sn}\sn/*}}}*/\sn\sn\sn/***\sn!Layout Rules /%==============================================%/\sn***/\sn/*{{{*/\sn\snbody { position: static; }\sn\sn.headerForeground, .headerShadow {\sn padding-top: 1em;\sn}\sn\sn.tiddler {\sn margin: 0 0 0.9em 0;\sn padding-bottom: 1em;\sn}\sn\sn#mainMenu {\sn width: 16em;\sn font-size: 1em;\sn text-align: left;\sn}\sn\sn#mainMenu * {\sn font-size: 1em;\sn font-weight: normal;\sn padding: 0; margin: 0; border: 0;\sn}\sn\sn#mainMenu ul {\sn list-style: none;\sn margin-bottom: 10px;\sn}\sn\sn#mainMenu li {\sn text-indent: 1em;\sn}\sn\sn#mainMenu a.button, #mainMenu a.tiddlyLink, #mainMenu a.externalLink {\sn display: block; margin: 0;\sn}\sn\sn#displayArea {\sn margin-left: 19em;\sn}\sn\sn/*}}}*/\sn\sn/***\sn!Colors Used\sn*@@bgcolor(#8cf): #8cf - Background blue@@\sn*@@bgcolor(#18f): #18f - Top blue@@\sn*@@bgcolor(#04b): #04b - Mid blue@@\sn*@@bgcolor(#014):color(#fff): #014 - Bottom blue@@\sn*@@bgcolor(#ffc): #ffc - Bright yellow@@\sn*@@bgcolor(#fe8): #fe8 - Highlight yellow@@\sn*@@bgcolor(#db4): #db4 - Background yellow@@\sn*@@bgcolor(#841): #841 - Border yellow@@\sn*@@bgcolor(#703):color(#fff): #703 - Title red@@\sn*@@bgcolor(#866): #866 - Subtitle grey@@\sn!Generic Rules /%==============================================%/\sn***/\sn/*{{{*/\snbody {\sn background: #464646;\sn color: #000;\sn}\sn\sna{\sn color: #04b;\sn}\sn\sna:hover{\sn background: #04b;\sn color: #fff;\sn}\sn\sna img{\sn border: 0;\sn}\sn\snh1,h2,h3,h4,h5 {\sn color: #000;\sn background: #eee;\sn}\sn\sn.button {\sn color: #014;\sn border: 1px solid #fff;\sn}\sn\sn.button:hover {\sn color: #014;\sn background: #fe8;\sn border-color: #db4;\sn}\sn\sn.button:active {\sn color: #fff;\sn background: #db4;\sn border: 1px solid #841;\sn}\sn\sn/*}}}*/\sn/***\sn!Header /%==================================================%/\sn***/\sn/*{{{*/\sn.header {\sn background: #000;\sn}\sn\sn.headerShadow {\sn color: #000;\sn}\sn\sn.headerShadow a {\sn font-weight: normal;\sn color: #000;\sn}\sn\sn.headerForeground {\sn color: #cf6;\sn}\sn\sn.headerForeground a {\sn font-weight: normal;\sn color: #cf6;\sn}\sn\sn/* ??? what is up when you specify a site title colour in IE ??? */\sn/* .siteTitle { color: red; } */\sn\sn/*}}}*/\sn/***\sn!General tabs /%=================================================%/\sn***/\sn/*{{{*/\sn\sn.tabSelected {\sn color: #fff;\sn background: #960;\sn border: none;\sn}\sn\sn.tabUnselected {\sn color: #fff;\sn background: #660;\sn}\sn\sn.tabContents {\sn color: #004;\sn background: #960;\sn border: none;\sn}\sn\sn.tabContents .button, .tabContents a {\sn border: none;\sn color: #fff;\sn}\sn\sn.tabContents a:hover, .tabset a:hover {\sn background: #000;\sn}\sn\sn/* make nested tab areas look different */\sn.tabContents .tabSelected, .tabContents .tabContents {\sn background: #700;\sn color: #fff;\sn}\sn\sn.tabContents .tabContents {\sn color: #eeb;\sn}\sn\sn/*}}}*/\sn/***\sn!Main Menu /%=================================================%/\sn***/\sn/*{{{*/\sn#mainMenu {\sn background: #700;\sn color: #fff;\sn border-right: 3px solid #500;\sn}\sn\sn#mainMenu * {\sn color: #fff;\sn}\sn\sn#mainMenu a.button, #mainMenu a.tiddlyLink, #mainMenu a.externalLink {\sn border: none;\sn border-bottom: 1px solid #500;\sn border-top: 1px solid #900;\sn}\sn\sn#mainMenu a:hover,\sn#mainMenu a.button:hover {\sn background-color: #b00;\sn color: #fff;\sn}\sn\sn/*}}}*/\sn/***\sn!Sidebar options /%=================================================%/\sn~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\sn***/\sn/*{{{*/\sn#sidebar {\sn color: #000;\sn background: #eeb;\sn border-right: 3px solid #bb8;\sn border-bottom: 3px solid #520;\sn}\sn\sn#sidebarOptions input {\sn border: 1px solid #04b;\sn}\sn\sn#sidebarOptions .sliderPanel {\sn background: #fff;\sn}\sn\sn#sidebarOptions .sliderPanel a {\sn border: none;\sn color: #700;\sn}\sn\sn#sidebarOptions .sliderPanel a:hover {\sn color: #fff;\sn background: #700;\sn}\sn\sn#sidebarOptions .sliderPanel a:active {\sn color: #700;\sn background: #fff;\sn}\sn\sn#sidebarOptions a {\sn color: #700;\sn border: none;\sn}\sn\sn#sidebarOptions a:hover, #sidebarOptions a:active {\sn color: #fff;\sn background: #700;\sn}\sn\sn/*}}}*/\sn/***\sn!Message Area /%=================================================%/\sn***/\sn/*{{{*/\sn#messageArea {\sn border-right: 3px solid #da1;\sn border-bottom: 3px solid #a80;\sn background: #ffe72f;\sn color: #014;\sn}\sn\sn#messageArea .button {\sn padding: 0.2em 0.2em 0.2em 0.2em;\sn color: #014;\sn background: #fff;\sn}\sn\sn/*}}}*/\sn/***\sn!Popup /%=================================================%/\sn***/\sn/*{{{*/\sn.popup {\sn background: #333;\sn border: none;\sn}\sn\sn.popup hr {\sn color: #000;\sn}\sn\sn.popup li.disabled {\sn color: #666;\sn background: #cf6;\sn}\sn\sn.popup li a, .popup li a:visited {\sn color: #000;\sn border: 1px outset #cf6;\sn background: #cf6;\sn}\sn\sn.popup li a:hover {\sn color: #000;\sn border: 1px outset #cf6;\sn background: #ef9;\sn}\sn/*}}}*/\sn/***\sn!Tiddler Display /%=================================================%/\sn***/\sn/*{{{*/\sn.tiddler {\sn background: #fff;\sn border-right: 3px solid #aaa;\sn border-bottom: 3px solid #555;\sn}\sn\sn.tiddler .defaultCommand {\sn font-weight: bold;\sn}\sn\sn.shadow .title {\sn color: #866;\sn}\sn\sn.title {\sn color: #900;\sn}\sn\sn.subtitle {\sn color: #866;\sn}\sn\sn.toolbar {\sn color: #000;\sn}\sn\sn.toolbar .button {\sn background: #cf6;\sn border: 1px outset #cf6;\sn}\sn\sn.toolbar .button:hover {\sn background: #ef9;\sn}\sn\sn.tagging, .tagged {\sn border: 1px solid #eee;\sn background-color: #eee;\sn}\sn\sn.selected .tagging, .selected .tagged {\sn background-color: #ddd;\sn border: 1px solid #bbb;\sn}\sn\sn.tagging .listTitle, .tagged .listTitle {\sn color: #014;\sn}\sn\sn.tagging .button, .tagged .button {\sn border: none;\sn}\sn\sn.footer {\sn color: #ddd;\sn}\sn\sn.selected .footer {\sn color: #888;\sn}\sn\sn.sparkline {\sn background: #8cf;\sn border: 0;\sn}\sn\sn.sparktick {\sn background: #014;\sn}\sn\sn.errorButton {\sn color: #ff0;\sn background: #f00;\sn}\sn\sn.cascade {\sn background: #eef;\sn color: #aac;\sn border: 1px solid #aac;\sn}\sn\sn.imageLink, #displayArea .imageLink {\sn background: transparent;\sn}\sn\sn/*}}}*/\sn/***\sn''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\sn***/\sn/*{{{*/\sn\sn.viewer .listTitle {list-style-type: none; margin-left: -2em;}\sn\sn.viewer .button {\sn border: 1px solid #db4;\sn}\sn\sn.viewer blockquote {\sn border-left: 3px solid #666;\sn}\sn\sn.viewer table {\sn border: 2px solid #333;\sn}\sn\sn.viewer th, thead td {\sn background: #db4;\sn border: 1px solid #666;\sn color: #fff;\sn}\sn\sn.viewer td, .viewer tr {\sn border: 1px solid #666;\sn}\sn\sn.viewer pre {\sn border: 1px solid #fe8;\sn background: #ffc;\sn}\sn\sn.viewer code {\sn color: #703;\sn}\sn\sn.viewer hr {\sn border: 0;\sn border-top: dashed 1px #666;\sn color: #666;\sn}\sn\sn.highlight, .marked {\sn background: #fe8;\sn}\sn/*}}}*/\sn/***\sn''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\sn***/\sn/*{{{*/\sn.editor input {\sn border: 1px solid #04b;\sn}\sn\sn.editor textarea {\sn border: 1px solid #04b;\sn width: 100%;\sn}\sn\sn.editorFooter {\sn color: #aaa;\sn}\sn\sn/*}}}*/\sn/***\sn!Personal preferences\sn***/\sn\sn/*{{{*/\sn/* not required, but the menu looks a whole lot nicer flushed left */\sn#mainMenu { text-align: left; }\sn/* make input fields in viewer (options) show up in correct size */\sn.viewer input { font-size: 0.9em; }\sn/*}}}*/\sn";\n\nconfig.themes.push("GTDd3");\n\n\n//}}}\n\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)]\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 ":" 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.\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());</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.02.25 - 2.1.0\nadded configuration options to enable/disable forced refresh of tiddlers when toggling tags\n\n2006.02.23 - 2.0.4\nwhen toggling tags, force refresh of the tiddler containing the checkbox.\n\n2006.02.23 - 2.0.3\nwhen toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n\n2006.02.23 - 2.0.2\nwhen using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n"""[x([[Tiddler with spaces]]:[[tag with spaces]])]"""\n\n2006.01.10 - 2.0.1\nwhen 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.\n\n2006.01.04 - 2.0.0\nupdate for ~TW2.0\n\n2005.12.27 - 1.1.2\nFix 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()\n\n2005.12.26 - 1.1.2\nCorrected 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.\n\n2005.12.26 - 1.1.0\nRevise 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\n\n2005.12.25 - 1.0.0\nadded support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n\n2005.12.08 - 0.9.3\nsupport separate 'init' and 'onclick' function definitions.\n\n2005.12.08 - 0.9.2\nclean up lookahead pattern\n\n2005.12.07 - 0.9.1\nonly update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n\n2005.12.07 - 0.9.0\ninitial 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:0 , date: new Date(2006,2,25)};\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).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(":");\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=store.getTiddler(story.findContainingTiddler(this).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 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//}}}
/***\n|''Name:''|CloseUnsavedOnCancel|\n|''Sourse''|http://jackparke.googlepages.com/jtw.html#CloseUnsavedOnCancel|\n|''Version:''|2.0.8 (16-Apr-2006)|\n|''Author:''|SimonBaird|\n|''Adapted By:''|[[Jack]]|\n|''Type:''|Plugin|\n!Description\nWhen you click new tiddler then click cancel I think the new tiddler should close automatically. This plugin implements that behavious.\n\n!Revision History\n* 1.0.1 (11-Oct-2005) by SimonBaird\n* 2.0.8 Made 2.0.x compatible by Jack on 16-Apr-2006\n\n!Code\n***/\n//{{{\n\nif (!version.extensions.CloseUnsavedOnCancel) {\n\nversion.extensions.CloseUnsavedOnCancel = {\n major: 2, minor: 0, revision: 8, \n date: new Date(2006,4,16), \n type: 'plugin',\n source: "http://jackparke.googlepages.com/jtw.html#CloseUnsavedOnCancel"\n};\n};\n\nconfig.commands.cancelTiddler.handler = function(event,src,title) {\n if(story.hasChanges(title) && !readOnly)\n if(!confirm(this.warning.format([title])))\n return false;\n story.setDirty(title,false);\n if (!store.tiddlerExists(title) || store.fetchTiddler(title).modifier==config.views.wikified.defaultModifier) {\n story.closeTiddler(title,false);\n store.removeTiddler(title)\n } else {\n story.displayTiddler(null,title);\n }\n return false;\n}\n\n//}}}
/***\n!! CollapseTiddlersPlugin\n^^Author: Bradley Meck^^\n^^Source: http://gensoft.revhost.net/Collapse.html^^\n^^Translated by: Eddie^^\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: "colapsar",\ntooltip: "Colapsa esta entrada",\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("No se encontró '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: "expandir",\ntooltip: "Expande esta entrada",\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,"colapsar todo","",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("No se encontró 'CollapsedTemplate'"); return; }\nstory.displayTiddler(null,title,t);\n})})\n}\n}\n\nconfig.macros.expandAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"expandir","",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: "foco",\ntooltip: "Expande esta entrada y colapsa las demás",\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("No se encontró '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} \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>
[[Bienvenido]]\n[[In English]]
/***\n|''Name:''|DeliciousPlayTaggerPlugin|\n|''Source:''|http://www.TiddlyTools.com/#DeliciousPlayTaggerPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nThis plugin defines an object class "Delicious.Mp3", which adds methods for applying the del.icio.us "play tagger" to any mp3 URLs embedded in tiddler content. \n\n!!!!!Usage\n\nSimply 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\nif (!version.extensions.EddieTheme) \n {\n version.extensions.EddieTheme = {\n major: 0, minor: 3, revision: 1,\n date: new Date(2006, 5, 6), \n type: 'theme'\n };\n};\n\nif (!config.themes) config.themes = [];\n\nconfig.shadowTiddlers.EddieStyleSheet = "/***\snEste es el CSS de la página. No soy un maestro de CSS, pero esto es divertido. En un futuro quizás debería añadir un selector de estilos, pero eso implica tener un montón de entradas con estilo y no se hasta que punto eso será mantenible.\sn***/\sn/*{{{*/\snbody {background:#eee}\sn.tiddler {\sn border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding-bottom:1em; margin-bottom:1em; \sn background:#fff; padding-right:1.5em; }\sn#messageArea { background-color:#bde; border-color:#8ab; border-width:4px; border-style:dotted; font-size:90%; }\sn#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\sn#messageArea .button:hover {background: #acd;}\sn\sn#mainMenu , #sidebarOptions , .tabContents { border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding-bottom:1em; margin-bottom:1em; \sn background:#fff; padding-right:1.5em; }\sn\sn/*** que pena que no se pueda usar AttachFilePlugin aqui ***/\sn\sn.header { background-color: #39c; }\sn.viewAsJs , .viewHtml { display: inline ; } \sn.header, .tagged, .tagging, .tiddler, #mainMenu, #sidebarOptions, .tabContents { -moz-border-radius:10px; }\sn.header, .tagged, .tagging, .tiddler, #mainMenu, #sidebarOptions, .tabContents { border-radius:10px; }\sn/*}}}*/\sn";\n\nconfig.shadowTiddlers.EddiePageTemplate = "<div class='header'>\sn<div class='headerShadow'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn<div class='headerForeground'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\sn<div id='sidebar'>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn</div>";\n\nconfig.themes.push("Eddie");\n//}}}
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class="editLabel">Título</div><div class='editor' macro='edit title'></div>\n<div class="editLabel">Tags</div><div class='editor' macro='edit tags'></div>\n<div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<div class='editor' macro='edit text'></div>\n
// //''Name:'' EmailLink\n// //''Version:'' <<getversion email>> (<<getversiondate email "DD MMM YYYY">>)\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''Description:'' email lets you list a "email" address without displaying it as readable text. This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words "at" and "dot" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email.\n\n// //''Syntax:'' << {{{email yourname at yourdomain dot com "?optional parameters"}}} >>\n// //Example 1: <<email sample at nowhere dot com>> (standard)\n// //Example 2: <<email multiple dot sample at somewhere dot nowhere dot com>> (multiple dots)\n// //Example 3: <<email sample at nowhere dot com "?subject=Submission&body=Type your message here.">> (with optional parameters)\n\n// //''Directions:'' <<tiddler MacroDirections>>\n\n// //''Notes:'' You can use the optional email parameters to stipulate a subject or message body for the message. Most (not all) email clients will use this information to construct the email message.\n\n// //''Related Links:'' none\n\n// //''Revision History:''\n// // v0.1.0 (20 July 2005): initial release\n// // v0.1.1 (22 July 2005): renamed the macro from "mailto" to "email" to further thwart email harvesters.\n// // v0.1.2 (15 October 2005): added global replacement of "dots" thanks to a suggestion from Ralph Winter\n\n// //''Code section:''\n//{{{\nversion.extensions.email = {major: 0, minor: 1, revision: 2, date: new Date("Oct 15, 2005")};\nconfig.macros.email = {}\nconfig.macros.email.handler = function(place,macroName,params)\n{\nvar temp = params.join(" ");\ndata = temp.split("?");\nvar recipient = data[0];\nrecipient = recipient.replace(" at ","@").replace(" dot ",".","g");\nrecipient = recipient.replace(/\ss/g,"");\nvar optional = data[1] ? "?" + data[1] : "";\nvar theLink = createExternalLink(place,"ma"+"il"+"to:"+recipient+optional);\ntheLink.appendChild(document.createTextNode(recipient))\n}\n//}}}
/***\n<<tiddler EncryptionPluginDocumentation>>\n!Code\n***/\n//{{{\nversion.extensions.EncryptionPlugin = { major: 1, minor: 0, revision: 1, date: new Date(2006,18,3),\n source: "http://yann.perrin.googlepages.com/twkd.html#EncryptionPlugin"\n};\n//}}}\n/***\n// // Encrypt Command Definition\n***/\n//{{{\nconfig.macros.encrypt = {\n label: '§',\n tooltip: 'Encrypt this tiddler',\n getkeydialog: 'Enter encryption key',\n cryptedtag: 'crypted',\n donotcrypttag: 'EncryptionPlugin'\n};\nconfig.macros.encrypt.action = function(tiddler) {\n var key = prompt(this.getkeydialog,'');\n if (key)\n {\n tiddler.text = TEAencrypt(tiddler.text,key);\n tiddler.tags.push(this.cryptedtag);\n if (version.major < 2)\n store.tiddlers[tiddler.title] = tiddler;\n else\n store.addTiddler(tiddler);\n story.refreshTiddler(tiddler.title,1,true);\n store.notifyAll();\n }\n};\nconfig.macros.encrypt.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\nif (tiddler.tags.find(this.cryptedtag)==null && tiddler.tags.find(this.donotcrypttag)==null)\ncreateTiddlyButton(place, this.label, this.tooltip, function () {config.macros.encrypt.action(tiddler); return false;}, null, null, null);\n}\n//}}}\n// // Decrypt Command Definition\n//{{{\nconfig.macros.decrypt = {\n label: '-§-',\n tooltip: 'Decrypt this tiddler',\n cryptedtag:'crypted',\n donotdecrypttag:'EncryptionPlugin',\n getkeydialog: 'Enter encryption key'\n};\nconfig.macros.decrypt.action = function(tiddler) {\n var key = prompt(this.getkeydialog,'');\n if (key)\n {\n tiddler.text = TEAdecrypt(tiddler.text,key);\n tiddler.tags.splice(tiddler.tags.find(this.cryptedtag),1);\n if (version.major < 2)\n store.tiddlers[tiddler.title] = tiddler;\n else\n store.addTiddler(tiddler);\n story.refreshTiddler(tiddler.title,1,true);\n store.notifyAll();\n }\n};\nconfig.macros.decrypt.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\nif (tiddler.tags.find(this.cryptedtag)!=null && tiddler.tags.find(this.donotdecrypttag)==null)\ncreateTiddlyButton(place, this.label, this.tooltip, function () {config.macros.decrypt.action(tiddler); return false;}, null, null, null);\n}\n//}}}\n// //Shadow tiddlers definition\n//{{{\nconfig.shadowTiddlers.ViewTemplate="<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'><span macro='encrypt'></span><span macro='decrypt'></span></div>\sn<div class='title' macro='view title'></div>\sn<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\sn<div class='tagging' macro='tagging'></div>\sn<div class='tagged' macro='tags'></div>\sn<div class='viewer' macro='view text wikified'></div>\sn<div class='tagClear'></div>";\nconfig.shadowTiddlers.EncryptionPluginDocumentation="Documentation for this plugin is available [[here|" + version.extensions.EncryptionPlugin.source +"Documentation]]";\n//}}}
//{{{\nversion.extensions.ExtensionsPlugin = {\n major: 0, minor: 2, revision: 0,\n date: new Date(2006, 3, 3), \n type: 'macro',\n source: "http://www.math.ist.utl.pt/~psoares/addons.html#ExtensionsPlugin"\n};\n\nconfig.macros.ExtensionsPlugin = {};\n\nconfig.macros.ExtensionsPlugin.options = {\n dateFormat: "0DD/0MM/YYYY"\n}\n\nconfig.macros.ExtensionsPlugin.handler= function(place,macroName,params,wikifier,paramString,tiddler) {\n var plugin;\n var table = "|!Status|!Extension|!Type|!Version|!Date|!Source|!Docs|!Update|h\sn";\n\n if (params.length>0) {\n var tiddlers = new Array();\n for (var i=0; i<params.length; i++) {\n var temp = store.getTaggedTiddlers(params[i], "title");\n for(var j=0; j<temp.length; j++){\n if(tiddlers.indexOf(temp[j].title)==-1) tiddlers.push(temp[j].title);\n }\n }\n tiddlers.sort();\n for (var i=0; i<tiddlers.length; i++) {\n plugin = config.macros.ExtensionsPlugin.getInfo(tiddlers[i]);\n table += "| [x("+plugin.name+":systemConfig)] |[[" + plugin.name+ "]]|"+ plugin.type +"| "+ plugin.version + "|"+ plugin.date + "|" + plugin.source + "|"+ plugin.docs +"||\sn";\n }\n } else{\n for (var key in version.extensions) { \n plugin = config.macros.ExtensionsPlugin.getInfo(key);\n table += "||" + plugin.name+ "|"+ plugin.type +"| "+ plugin.version + "|"+ plugin.date + "|" + plugin.source + "|"+ plugin.docs +"||\sn";\n }\n }\n wikify(table, place);\n}\n\nconfig.macros.ExtensionsPlugin.getInfo = function(tiddler) {\n var plugin = {name: tiddler, type: '', version: '', date: '', source: '', docs: ''};\n if(version.extensions[plugin.name]){\n plugin.version = version.extensions[plugin.name].major + "." +version.extensions[plugin.name].minor + "." + version.extensions[plugin.name].revision;\n if(version.extensions[plugin.name].source){\n plugin.source="[[source|"+ version.extensions[plugin.name].source +"]]";\n }\n if(version.extensions[plugin.name].docs){\n plugin.docs="[[docs|"+ version.extensions[plugin.name].docs +"]]";\n }\n if(version.extensions[plugin.name].type){\n plugin.type=version.extensions[plugin.name].type;\n }\n if(version.extensions[plugin.name].date){\n plugin.date=version.extensions[plugin.name].date.formatString(config.macros.ExtensionsPlugin.options.dateFormat) ;\n }\n }\n return plugin;\n}\n//}}}
<html>\n<a href="http://www.flickr.com" \nstyle="text-align:center;">www.<strong \nstyle="color:#3993ff">flick<span \nstyle="color:#ff1c92">r</span></strong>.com</a><br>\n<iframe \nstyle="background-color:#ffffff; border-color:#ffffff; border:none;" width="113" \nheight="151" frameborder="0" scrolling="no" \nsrc="http://www.flickr.com/apps/badge/badge_iframe.gne?zg_bg_color=ffffff&zg_person_id=35468148136%40N01" \ntitle="Flickr Badge"></iframe>\n</html>\n\nPara que esto funcione necesito saber mi Flickr person ID, que sustituye al valor "35468148136%40N01" en el HTML. Hay un [[Flickr \nidGettr|http://eightface.com/code/idgettr/]] para averiguarlo.
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-05)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|[[ForEachTiddlerMacro]] v1.0.5|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.5\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nversion.extensions.ForEachTiddlerPlugin = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), source: "http://tiddlywiki.abego-software.de/#ForEachTiddlergPlugin"};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n 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 return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[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\n
/***\n{{fr{\n<<tiddler FrontPagePluginDocumentation_fr>>}}}{{hide{\n----\n}}}{{en{\n<<tiddler FrontPagePluginDocumentation_en>>}}}\n!Options\n<<tiddler FrontPagePluginOptions>>\n\n!Code\n***/\n// //{{en{ Version Info}}}{{fr{ Informations de version}}}\n//{{{\nversion.extensions.FrontPagePlugin = { major: 1, minor: 0, revision: 0, date: new Date(2006,19,6),\n source: "http://yann.perrin.googlepages.com/twkd.html#FrontPagePlugin"\n};\n//}}}\n// //{{en{ Default Settings}}}{{hide{ / }}}{{fr{ Paramètres par défaut}}}\n//{{{\nconfig.macros.frontPagePlugin = {\nlabel:"new frontpage",\ntooltip:"save open tiddlers as default tiddlers",\nsaveToCookieOptionLabel:"Save front page in a cookie",\nloadFromCookieOptionLabel:"Load front page from cookie",\nsaveSessionStateOptionLabel:"save last viewed tiddlers as frontpage",\nsaveToCookieMsg:"frontpage saved in a cookie",\ndefaultTiddlersUpdatedMsg:"default tiddlers updated"\n}\nif (config.options.chkSaveAsCookie==undefined) config.options.chkSaveAsCookie=true;\nif (config.options.chkLoadFrontPageFromCookie==undefined) config.options.chkLoadFrontPageFromCookie=true;\nif (config.options.chkSaveSessionState==undefined) config.options.chkSaveSessionState=true;\n\nconfig.macros.frontPagePlugin.save = function(){\n if (!config.options.chkSaveAsCookie)\n {\n if (!store.getTiddler("DefaultTiddlers")) \n {\n newTiddler= new Tiddler();\n newTiddler.set("DefaultTiddlers","",config.options.txtUserName);\n store.addTiddler(newTiddler);\n store.notifyAll();\n }\n var tiddlerList = "";\n story.forEachTiddler(function(tiddler){tiddlerList +="[["+tiddler+"]]\sn"});\n if (store.getTiddler("DefaultTiddlers").text!=tiddlerList)\n {\n displayMessage(config.macros.frontPagePlugin.defaultTiddlersUpdatedMsg);\n store.getTiddler("DefaultTiddlers").text=tiddlerList;\n store.setDirty(true);\n }\n }\n else\n {\n config.options.txtFrontPage="";\n story.forEachTiddler(function(tiddler){config.options.txtFrontPage +="[["+tiddler+"]] "});\n saveOptionCookie('txtFrontPage');\n displayMessage(config.macros.frontPagePlugin.saveToCookieMsg);\n }\n }\n\nconfig.macros.frontPagePlugin.handler = function(place){\n createTiddlyButton(place,this.label,this.tooltip,config.macros.frontPagePlugin.save);\n}\n//}}}\n////hijacking restart function to show customised frontpage\n//{{{\nwindow.frontPageRestart=window.restart;\nrestart=function() {\n if((config.options.chkLoadFrontPageFromCookie) && (config.options.txtFrontPage) && (!params))\n {\n var defaultParams = config.options.txtFrontPage.parseParams("open",null,false);\n invokeParamifier(defaultParams,"onstart");\n window.scrollTo(0,0);\n }\n frontPageRestart();\n}\n//}}}\n////hijacking confirmExit function to allow state preservation\n//{{{\nwindow.frontPageConfirmExit=window.confirmExit;\nconfirmExit=function() {\n if (config.options.chkSaveSessionState) config.macros.frontPagePlugin.save();\n return frontPageConfirmExit();\n}\n//}}}\n////Shadow Tiddlers definition\n//{{{\nconfig.shadowTiddlers.FrontPagePluginOptions="<<option chkSaveAsCookie>> " + config.macros.frontPagePlugin.saveToCookieOptionLabel + "\sn<<option chkLoadFrontPageFromCookie>> " + config.macros.frontPagePlugin.loadFromCookieOptionLabel +"\sn<<option chkSaveSessionState>> " + config.macros.frontPagePlugin.saveSessionStateOptionLabel;\nconfig.shadowTiddlers.FrontPagePluginDocumentation_en = "Documentation for this plugin is available [[here|" + version.extensions.FrontPagePlugin.source +"Documentation_en]]";\nconfig.shadowTiddlers.FrontPagePluginDocumentation_fr = "La documentation de ce plugin est disponible [[ici|" + version.extensions.FrontPagePlugin.source +"Documentation_fr]]";\n//}}}
/***\n|Name|FullScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#FullScreenPlugin|\n|Version|1.1|\n|Requires|~TW2.x|\n!Description:\nToggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.\n\n!Demo:\nClick the ↕ button in the toolbar for this tiddler. Click it again to turn off fullscreen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nEdit the ViewTemplate to add the fullscreen command to the toolbar.\n\n!History:\n*25-07-06: ver 1.1\n*20-07-06: ver 1.0\n\n!Code\n***/\n//{{{\nvar lewcidFullScreen = false;\n\nconfig.commands.fullscreen =\n{\n text:" ↕ ",\n tooltip:"Fullscreen mode"\n};\n\nconfig.commands.fullscreen.handler = function (event,src,title)\n{\n if (lewcidFullScreen == false)\n {\n lewcidFullScreen = true;\n setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");\n }\n else\n {\n lewcidFullScreen = false;\n setStylesheet(' ',"lewcidFullScreenStyle");\n }\n}\n\nconfig.macros.fullscreen={};\nconfig.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = params[0]||" ↕ ";\n var tooltip = params[1]||"Fullscreen mode";\n createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);\n}\n\nvar lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler =function(title,animate,slowly)\n{\n lewcid_fullscreen_closeTiddler.apply(this,arguments);\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n\n\nSlider.prototype.lewcidStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n{\n this.lewcidStop();\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n//}}}
/***\n|''Name:''|GenerateRssHijack|\n|''Description:''|Generate an RSSFeed with plaintext, html and TiddlyWiki content|\n|''Version:''|0.1.2|\n|''Date:''|Aug 16, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#GenerateRssHijack|\n|''Documentation:''|http://tiddlywiki.bidix.info/#GenerateRssHijackDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|none|\n|''Require:''|none|\n***/\n//{{{\nversion.extensions.GenerateRssHijack= {\n major: 0, minor: 1, revision: 1, \n date: new Date(2006,7,6),\n source: 'http://tiddlywiki.bidix.info/#GenerateRssHijack',\n documentation: 'http://tiddlywiki.bidix.info/#GenerateRssHijackDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari' \n};\n\n// Return the tiddlers as a sorted array\nTiddlyWiki.prototype.getTiddlersTaggedWith = function(field,includeTag)\n{\n var results = [];\n this.forEachTiddler(function(title,tiddler) {\n if(tiddler.tags.find(includeTag) != null)\n results.push(tiddler);\n });\n if(field)\n results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });\n return results;\n}\n\n// generate RSS file with tiddlers tagged with toRSS\nwindow.generateRss_ori = window.generateRss;\nwindow.generateRss = function ()\n{\n var s = [];\n var d = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n // Assemble the header \n s.push("<" + "?xml version=\s"1.0\s"" + " encoding='UTF-8'" + "?>");\n s.push("<rss version=\s"2.0\s" xmlns:tiddlywiki=\s"http://tiddlywiki.bidix.info/#TiddlyWikiNamespace\s" xmlns:content=\s"http://purl.org/rss/1.0/modules/content/\s">");\n s.push("<channel>");\n s.push("<title>" + wikifyPlain("SiteTitle").htmlEncode() + "</title>");\n if(u)\n s.push("<link>" + u.htmlEncode() + "</link>");\n s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");\n s.push("<language>en-us</language>");\n s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");\n s.push("<pubDate>" + d.toGMTString() + "</pubDate>");\n s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");\n s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n s.push("<generator>TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + "</generator>");\n // The body\n var tiddlers = store.getTiddlersTaggedWith("modified","toRSS");\n var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;\n for (var t=tiddlers.length-1; t>=n; t--)\n s.push(tiddlers[t].saveToRss(u));\n // And footer\n s.push("</channel>");\n s.push("</rss>");\n // Save it all\n return s.join("\sn");\n}\n\nTiddler.prototype.getAsInnerHTML = function() {\n var wrapper = createTiddlyElement(document.body,"span",null,null);\n wikify(this.text,wrapper ,null,this);\n var text = wrapper.innerHTML;\n wrapper.parentNode.removeChild(wrapper);\n //replace tddlylink with externallink\n var u = store.getTiddlerText("SiteUrl",null);\nvar pattern;\nvar substitution;\n if ((version.major = 2) && (version.minor > 0)) {\n pattern = /<a\ss+title=\s"([^"]+)\s"\ss+tiddlylink="([^"]+)"\ss+refresh="link"\ss+class=\s"([^"]+)\s"\ss+href="([^"]+)"/mg;\n substitution = "<a title=\s"$1\s" tiddlylink=\s"$2\s" refresh=\s"link\s" class=\s"$3\s" href=\s""+u+"#$2\s"";\n }\n else {\n pattern = /<a\ss+tiddlylink="([^"]+)"\ss+refresh="link"\ss+title="([^"]+)"\ss+href="([^"]+)"/mg;\n substitution = "<a tiddlylink=\s"$1\s" refresh=\s"link\s" title=\s"$2\s" href=\s""+u+"#$1\s"";\n }\n text = text.replace(pattern, substitution);\n return text;\n};\n\nTiddler.prototype.saveToRss = function(url)\n{\n var s = [];\n s.push("<item>");\n s.push("<title>" + this.title.htmlEncode() + "</title>");\n //plain text\n s.push("<description>" + this.text.replace(regexpNewLine,"<br />").htmlEncode() + "</description>");\n // html text\n s.push("<content:encoded><![CDATA[ " + this.getAsInnerHTML() +"]]></content:encoded>");\n // tiddler\n s.push("<tiddlywiki:title>" + this.title.htmlEncode() + "</tiddlywiki:title>");\n s.push("<tiddlywiki:wikitext>" + this.text.htmlEncode() + "</tiddlywiki:wikitext>");\n s.push("<tiddlywiki:modifier>" + this.modifier.htmlEncode() + "</tiddlywiki:modifier>");\n s.push("<tiddlywiki:modified>" + this.modified.convertToYYYYMMDDHHMM() + "</tiddlywiki:modified>");\n s.push("<tiddlywiki:created>" + this.created.convertToYYYYMMDDHHMM() + "</tiddlywiki:created>");\n //s.push("<tiddlywiki:links>" + this.text.htmlEncode() + "</tiddlywiki:links>");\n s.push("<tiddlywiki:tags>" + this.getTags().htmlEncode() + "</tiddlywiki:tags>");\n for(var t=0; t<this.tags.length; t++)\n s.push("<category>" + this.tags[t] + "</category>");\n s.push("<link>" + url + "#" + encodeURIComponent(String.encodeTiddlyLink(this.title)) + "</link>");\n s.push("<pubDate>" + this.modified.toGMTString() + "</pubDate>");\n s.push("</item>");\n return(s.join("\sn"));\n}\n//}}}
/***\nencontré esto en YATWA. Lo usa un montón de peña\n***/\n//{{{\nconfig.macros.getversion = {}\nconfig.macros.getversion.handler = function(place,macroName,params)\n{\nvar versionData = version.extensions[params].major + "." + version.extensions[params].minor + "." + version.extensions[params].revision;\ncreateTiddlyElement(place,"span",null,null,versionData);\n}\n\nconfig.macros.getversiondate = {}\nconfig.macros.getversiondate.handler = function(place,macroName,params)\n{\nvar versionDate = version.extensions[params[0]].date.formatString(params[1].trim());\ncreateTiddlyElement(place,"span",null,null,versionDate);\n}\n//}}}
/***\n|Name|HaloscanMacro|\n|Created by|JimSpeth|\n|Location|http://end.com/~speth/HaloscanMacro.html|\n|Version|1.1.0|\n|Requires|~TW2.x|\n\n!Description\nComment and trackback support for TiddlyWiki (via Haloscan).\n\n!History\n* 16-Feb-06, version 1.1.0, drastic changes, now uses settings from haloscan account config\n* 31-Jan-06, version 1.0.1, fixed display of counts for default tiddlers\n* 30-Jan-06, version 1.0, initial release\n\n!Examples\n|!Source|!Output|h\n|{{{<<haloscan comments>>}}}|<<haloscan comments>>|\n|{{{<<haloscan trackbacks>>}}}|<<haloscan trackbacks>>|\n\n!Installation\nRegister for a [[Haloscan|http://www.haloscan.com]] account. It's free and painless.\nInstall the HaloscanMacro in a new tiddler with a tag of systemConfig (save and reload to activate).\nIn the macro configuration code (below), change //YourName// to your Haloscan account name.\nUse the macro somewhere in a tiddler (see ViewTemplate for an example).\n\n!Settings\nYou can adjust various options for your account in the member configuration area of Haloscan's web site. The macro will use these settings when formatting the links.\n\n!Code\n***/\n//{{{\n\n/* change "YourName" to your Haloscan account name */\nconfig.macros.haloscan = {account: "deveddie", baseURL: "http://www.haloscan.com/load/"};\n\nvar haloscanLoaded = 0;\nconfig.macros.haloscan.load = function ()\n{\n if (haloscanLoaded == 1)\n return;\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var el = document.createElement('script');\n el.language = 'JavaScript'; \n el.type = 'text/javascript'; \n el.src = config.macros.haloscan.baseURL + account;\n document.documentElement.childNodes[0].appendChild(el);\n \n haloscanLoaded = 1;\n}\nconfig.macros.haloscan.load();\n\n/* this totally clobbers document.write, i hope that's ok */\nvar safeWrite = function(s)\n{\n document.written = s;\n return s;\n};\ndocument.write = safeWrite;\n\nconfig.macros.haloscan.refreshDefaultTiddlers = function ()\n{\n var start = store.getTiddlerText("DefaultTiddlers");\n if (start)\n {\n var titles = start.readBracketedList();\n for (var t=titles.length-1; t>=0; t--)\n story.refreshTiddler(titles[t], DEFAULT_VIEW_TEMPLATE, 1);\n }\n}\n\nvar haloscanRefreshed = 0;\nconfig.macros.haloscan.handler = function (place, macroName, params, wikifier, paramString, tiddler)\n{\n if (typeof HaloScan == 'undefined')\n {\n if (haloscanRefreshed == 0)\n {\n setTimeout("config.macros.haloscan.refreshDefaultTiddlers()", 1);\n haloscanRefreshed = 1;\n }\n return;\n }\n \n var id = story.findContainingTiddler(place).id.substr(7);\n var hs_search = new RegExp('\s\sW','gi');\n id = id.replace(hs_search,"_");\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var haloscanError = function (msg)\n {\n createTiddlyError(place, config.messages.macroError.format(["HaloscanMacro"]), config.messages.macroErrorDetails.format(["HaloscanMacro", msg]));\n }\n \n if (params.length == 1)\n {\n if (params[0] == "comments")\n {\n postCount(id);\n commentsLabel = document.written;\n commentsPrompt = "Comments on this tiddler";\n var commentsHandler = function(e) { HaloScan(id); return false; };\n var commentsButton = createTiddlyButton(place, commentsLabel, commentsPrompt, commentsHandler);\n }\n else if (params[0] == "trackbacks")\n {\n postCountTB(id);\n trackbacksLabel = document.written;\n trackbacksPrompt = "Trackbacks for this tiddler";\n var trackbacksHandler = function(e) { HaloScanTB(id); return false; };\n var trackbackButton = createTiddlyButton(place, trackbacksLabel, trackbacksPrompt, trackbacksHandler);\n }\n else\n haloscanError("unknown parameter: " + params[0]);\n }\n else if (params.length == 0)\n haloscanError("missing parameter");\n else\n haloscanError("bad parameter count");\n}\n\n//}}}\n
// //''Name:'' ImageLink\n// //''Version:'' <<getversion imglink>> (<<getversiondate imglink "DD MMM YYYY">>)\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''Description:'' Inserts an external image file as a hyperlink to a URL, a tiddler, or a javascript function.\n\n// //''Syntax:'' << {{{imglink imageSrc linkTo "altText" borderSize width height}}} >>\n// //Examples: \n// //<<imglink fractalveg.jpg http://www.tiddlywiki.com#EmbeddedImages "Nice broccoli!" 1 auto 41>> (webpage link, includes height) //IE will not display properly//*\n\n// //<<imglink fractalveg.jpg test.htm "Nice broccoli!" 1 85 41>> (link to local file, includes both width & height parameters)\n\n// //<<imglink fractalveg.jpg self null 1 84 41>> (image with null alt text that links to itself using 'self')\n\n// //<<imglink fractalveg.jpg null "Cool!" 4 79 38>> (image with "null" link but takes advantage of other parameters)\n\n// //<<imglink brixhamharbour.jpg HelloThere "Click to learn more!" 1>> (local image that links to a tiddler)\n\n// //<<imglink http://www.tiddlywiki.com/brixhamharbour.jpg "sampleFunction('You called a function!')" "Click to call a function!" 1>> (image from the web that calls a function)\n\n// //''Directions:'' <<tiddler MacroDirections>> Also, you do not need to copy the sampleFunction() function that appears at the bottom of the code section. It is used simply to demo this macro calling a function.\n\n// //''Notes:'' Optional border value is set at zero unless you specify another value. If you choose to set a border, you may also want to change the color for the border in the code section below or using the CustomStyleSheet. If you specify width and height, you ''must'' provide a border value (use 0 for no border) .\n// //If any of your macro parameters contain spaces, then surround the phrase in quote marks, otherwise quotes are not needed.\n// //If you use imglink to call a function (useful for adding interface buttons, etc.), the macro will first try to test whether the function exists. If you typed the name of the function incorrectly, you will receive an error when the macro runs. If the function does exist, then it is called with all the parameters you specified.\n// //*If you set an image width, some browsers (like IE) will require that you set the height value as well. For browsers that will autosize, you can replace the actual width/height value with the word {{{auto}}}.\n\n// //''Known Issues:'' This macro will not work if called from within a table.\n\n// //''Revision History:''\n// // v0.1.0 (22 July 2005): initial release\n// // v0.1.1 (22 July 2005): added support for linking to local files as well as no link at all\n// // v0.1.2 (15 August 2005): fixed an issue with self-linking images (note: the syntax for these image links changed to 'self')\n\n//{{{\n// //''Code section:''\nversion.extensions.imglink = {major: 0, minor: 1, revision: 2, date: new Date("Aug 15, 2005")};\nconfig.macros.imglink = {}\nconfig.macros.imglink.handler = function(place,macroName,params)\n{\nvar theLink = null;\nvar theAction = null;\nvar data = params;\nvar linkTo = data[1];\nvar box = createTiddlyElement(place,"span",null,"imgLinkBox",String.fromCharCode(160));\nbox.style.position = "relative";\nif(data[2] && data[2]!="null")\n box.title = data[2];\nvar theImage = document.createElement("img");\ntheImage.src = data[0];\ntheImage.className = "linkedImg";\ntheImage.style.position = "relative";\ntheImage.style.verticalAlign = "top";\ntheImage.border = data[3] ? data[3] : 0;\ntheImage.style.borderColor = "black";\nif(data[4] && data[4]!="auto")\n theImage.width = data[4];\nif(data[5] && data[5]!="auto")\n theImage.height = data[5];\n\nvar tiddlerText = store.getTiddlerText(linkTo);\nvar func = linkTo.substring(0,data[1].indexOf("("));\n// test for tiddler link\nif(tiddlerText)\n {\n theLink = document.createElement("a");\n theAction = function() {displayTiddler(this,linkTo,1,null,null,null,false,false);};\n theLink.onclick = theAction;\n theLink.href = "javascript:;";\n }\n// test for function call\nelse if(window[func] || typeof eval(func)=="function")\n {\n theLink = document.createElement("a");\n theAction = function() {eval(linkTo);};\n theLink.onclick = theAction;\n theLink.href = "javascript:;";\n }\n// test for link to image view\nelse if(linkTo == "self")\n {\n theLink = document.createElement("a");\n theLink.href = theImage.src;\n if(config.options.chkOpenInNewWindow)\n theLink.target = "_blank";\n }\n// test for no link\nelse if(linkTo == null || linkTo == "null")\n {\n theLink = document.createElement("span");\n }\nelse\n {\n theLink = document.createElement("a");\n theLink.href = data[1];\n if(config.options.chkOpenInNewWindow)\n theLink.target = "_blank";\n }\n\ntheLink.appendChild(theImage);\n//box.width=theImage.offsetWidth;\n//box.height=theImage.offsetHeight;\nbox.appendChild(theLink);\n}\n\n\n// //''The following function is not needed and is for demo purposes only''\nfunction sampleFunction(message)\n{\nalert(message);\n}\n//}}}
This is my teddlywiki. I had the rough idea of starting a blog. Then i found the [[tiddlywiki website|http://www.tiddlywiki.com]] and started my own copy. Much later I found [[tiddlyspot|http://tiddlyspot.com]] and merged my content with an online tiddlywiki\n\nI imported docens of good and useful plugins. I have written some code, too, and started a translation into spanish.\n\nI have modified some content for author adding and translation. Any comment about it can be sent to <<email dev_eddie at yahoo dot es>>. I'm especially interested in any author who wants either the full plugin or my modifications removed.\n\nI try to read the google groups and some TiddlyWikis.
/***\n|''Name:''|InlineJavascriptPlugin|\n|''Source:''|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\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
/***\n|''Name:''|~IntelliTaggerPluginES|\n|''Version:''|1.0.0 (2006-04-26)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|\n|''Source Code:''|[[IntelliTaggerPlugin SourceCode]]|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n|''Browser:''|Firefox 1.5.0.2 or better|\n\n***/\n// /%\nif(!version.extensions.IntelliTaggerPluginES){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPluginES={major:1,minor:0,revision:0,date:new Date(2006,3,26),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.isPopupOpen=function(_2){return _2&&_2.parentNode==document.body;};abego.openAsPopup=function(_3){if(_3.parentNode!=document.body){document.body.appendChild(_3);}};abego.closePopup=function(_4){if(abego.isPopupOpen(_4)){document.body.removeChild(_4);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_5,_6,_7){_5.style.left=_6+"px";_5.style.top=_7+"px";};abego.centerOnWindow=function(_8){if(_8.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _9=abego.getWindowRect();abego.moveElement(_8,_9.left+(_9.width-_8.offsetWidth)/2,_9.top+(_9.height-_8.offsetHeight)/2);};abego.isDescendantOrSelf=function(_a,e){while(e){if(_a==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_c){var _d={};for(var i=0;i<_c.length;i++){_d[_c[i]]=true;}return _d;};abego.filterStrings=function(_f,_10,_11){var _12=[];for(var i=0;i<_f.length&&(_11===undefined||_12.length<_11);i++){var s=_f[i];if(s.match(_10)){_12.push(s);}}return _12;};abego.arraysAreEqual=function(a,b){var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_19,_1a){if(!_1a){return;}var _1b=findPosX(_1a);var _1c=findPosY(_1a);var _1d=_1a.offsetHeight;var _1e=_1b;var _1f=_1c+_1d;var _20=findWindowWidth();if(_20<_19.offsetWidth){_19.style.width=(_20-100)+"px";}var _21=_19.offsetWidth;if(_1e+_21>_20){_1e=_20-_21-30;}if(_1e<0){_1e=0;}_19.style.left=_1e+"px";_19.style.top=_1f+"px";_19.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _25=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_25.push([s.toString().toLowerCase(),s]);}_25.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_25[i][1];}};abego.getTiddlerField=function(_2b,_2c,_2d){var _2e=document.getElementById(_2b.idPrefix+_2c);var e=null;if(_2e!=null){var _30=_2e.getElementsByTagName("*");for(var t=0;t<_30.length;t++){var c=_30[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2d){e=c;}}}}return e;};abego.setRange=function(_33,_34,end){if(_33.setSelectionRange){_33.setSelectionRange(_34,end);var max=0+_33.scrollHeight;var len=_33.textLength;var top=max*_34/len,bot=max*end/len;_33.scrollTop=Math.min(top,(bot+top-_33.clientHeight)/2);}else{if(_33.createTextRange!=undefined){var _39=_33.createTextRange();_39.collapse();_39.moveEnd("character",end);_39.moveStart("character",_34);_39.select();}else{_33.select();}}};abego.internal.TagManager=function(){var _3a=null;var _3b=function(){if(_3a){return;}_3a={};store.forEachTiddler(function(_3c,_3d){for(var i=0;i<_3d.tags.length;i++){var tag=_3d.tags[i];var _40=_3a[tag];if(!_40){_40=_3a[tag]={count:0,tiddlers:{}};}_40.tiddlers[_3d.title]=true;_40.count+=1;}});};var _41=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_42,_43,_44,_45,_46,_47){var _48=this.fetchTiddler(_42);var _49=_48?_48.tags:[];var _4a=(typeof _47=="string")?_47.readBracketedList():_47;_41.apply(this,arguments);if(!abego.arraysAreEqual(_49,_4a)){abego.internal.getTagManager().reset();}};var _4b=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4c){var _4d=this.fetchTiddler(_4c);var _4e=_4d&&_4d.tags.length>0;_4b.apply(this,arguments);if(_4e){abego.internal.getTagManager().reset();}};this.reset=function(){_3a=null;};this.getTiddlersWithTag=function(tag){_3b();var _50=_3a[tag];return _50?_50.tiddlers:null;};this.getAllTags=function(_51){_3b();var _52=[];for(var i in _3a){_52.push(i);}for(i=0;_51&&i<_51.length;i++){_52.pushUnique(_51[i],true);}abego.sortIgnoreCase(_52);return _52;};this.getTagInfos=function(){_3b();var _54=[];for(var _55 in _3a){_54.push([_55,_3a[_55]]);}return _54;};var _56=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3b();var _5c=this.getTagInfos();_5c.sort(_56);return _5c;};this.getPartnerRankedTags=function(_5d){var _5e={};for(var i=0;i<_5d.length;i++){var _60=this.getTiddlersWithTag(_5d[i]);for(var _61 in _60){var _62=store.getTiddler(_61);if(!(_62 instanceof Tiddler)){continue;}for(var j=0;j<_62.tags.length;j++){var tag=_62.tags[j];var c=_5e[tag];_5e[tag]=c?c+1:1;}}}var _66=abego.toSet(_5d);var _67=[];for(var n in _5e){if(!_66[n]){_67.push(n);}}_67.sort(function(a,b){var d=_5e[b]-_5e[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _67;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6c=2;var _6d=1;var _6e=30;var _6f;var _70;var _71;var _72;var _73;var _74;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _75=function(){return _70;};var _76=function(tag){return _73[tag];};var _78=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7b=function(_7c){var s=_7c.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _7f=function(_80){var s=_80.value;var len=s.length;if(len>0&&s[len-1]!=" "){_80.value+=" ";}};var _83=function(tag,_85,_86){if(_7b(_85)){_85.value=_78(_85.value);}story.setTiddlerTag(_86.title,tag,0);_7f(_85);abego.IntelliTagger.assistTagging(_85,_86);};var _87=function(n){if(_74){if(_74.length>n){return _74[n];}n-=_74.length;}return (_72&&_72.length>n)?_72[n]:null;};var _89=function(n,_8b,_8c){var _8d=_87(n);if(_8d){_83(_8d,_8b,_8c);}};var _8e=function(_8f){var pos=_8f.value.lastIndexOf(" ");var _91=(pos>=0)?_8f.value.substr(++pos,_8f.value.length):_8f.value;return new RegExp(_91.escapeRegExp(),"i");};var _92=function(_93,_94){var _95=0;for(var i=0;i<_93.length;i++){if(_94[_93[i]]){_95++;}}return _95;};var _97=function(_98,_99,_9a){var _9b=1;var c=_98[_99];for(var i=_99+1;i<_98.length;i++){if(_98[i][1].count==c){if(_98[i][0].match(_9a)){_9b++;}}else{break;}}return _9b;};var _9e=function(_9f,_a0){var _a1=abego.internal.getTagManager().getSortedTagInfos();var _a2=[];var _a3=0;for(var i=0;i<_a1.length;i++){var c=_a1[i][1].count;if(c!=_a3){if(_a0&&(_a2.length+_97(_a1,i,_9f)>_a0)){break;}_a3=c;}if(c==1){break;}var s=_a1[i][0];if(s.match(_9f)){_a2.push(s);}}return _a2;};var _a7=function(_a8,_a9){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_a9),_a8);};var _aa=function(){if(!_6f){return;}var _ab=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ab){_ab="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_6f.innerHTML=_ab;applyHtmlMacros(_6f,null);refreshElements(_6f,null);};var _ac=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_71){_71.call(this,tag,e);}return false;};var _af=function(_b0,_b1,_b2,_b3){if(!_b1){return;}var _b4=_b3?abego.toSet(_b3):{};var n=_b1.length;for(var i=0;i<n;i++){var tag=_b1[i];if(_b4[tag]){continue;}if(i>0){createTiddlyElement(_b0,"span",null,"tagSeparator"," | ");}var _b8="";var _b9=_b0;if(_b2<10){_b9=createTiddlyElement(_b0,"span",null,"numberedSuggestion");_b2++;var key=_b2<10?""+(_b2):"0";createTiddlyElement(_b9,"span",null,"suggestionNumber",key+") ");var _bb=_b2==1?"Ctrl-Space or ":"";_b8=" (Shortcut: %1Alt-%0)".format([key,_bb]);}var _bc=config.views.wikified.tag.tooltip.format([tag]);var _bd=(_76(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_b8]);var _be="%0; Shift-Click: %1".format([_bd,_bc]);var btn=createTiddlyButton(_b9,tag,_be,_ac,_76(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c0=function(){if(_6f){window.scrollTo(0,ensureVisible(_6f));}if(_75()){window.scrollTo(0,ensureVisible(_75()));}};var _c1=function(e){if(!e){var e=window.event;}if(!_6f){return;}var _c3=resolveTarget(e);if(_c3==_75()){return;}if(abego.isDescendantOrSelf(_6f,_c3)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c1);var _c4=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_c6){_c4.apply(this,arguments);var _c7=_c6.tags;if(_c7){_c6.tags=_c7.trim();}};var _c8=function(_c9){story.focusTiddler(_c9,"tags");var _ca=abego.getTiddlerField(story,_c9,"tags");if(_ca){var len=_ca.value.length;abego.setRange(_ca,len,len);window.scrollTo(0,ensureVisible(_ca));}};var _cc=config.macros.edit.handler;config.macros.edit.handler=function(_cd,_ce,_cf,_d0,_d1,_d2){_cc.apply(this,arguments);var _d3=_cf[0];if((_d2 instanceof Tiddler)&&_d3=="tags"){var _d4=_cd.lastChild;_d4.onfocus=function(e){abego.IntelliTagger.assistTagging(_d4,_d2);setTimeout(function(){_c8(_d2.title);},100);};_d4.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_89(e.keyCode==48?9:e.keyCode-49,_d4,_d2);}else{if(e.ctrlKey&&e.keyCode==32){_89(0,_d4,_d2);}}setTimeout(function(){abego.IntelliTagger.assistTagging(_d4,_d2);},100);return false;};_7f(_d4);}};var _d7=function(e){if(!e){var e=window.event;}var _d9=resolveTarget(e);var _da=_d9.getAttribute("tiddler");if(_da){story.displayTiddler(_d9,_da,"IntelliTaggerEditTagsTemplate",false);_c8(_da);}return false;};var _db=config.macros.tags.handler;config.macros.tags.handler=function(_dc,_dd,_de,_df,_e0,_e1){_db.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_e1,createTiddlyElement(_dc.lastChild,"li"));};var _e2=function(){if(_6f&&_70&&!abego.isDescendantOrSelf(document,_70)){abego.IntelliTagger.close();}};setInterval(_e2,100);abego.IntelliTagger.displayTagSuggestions=function(_e3,_e4,_e5,_e6,_e7){_72=_e3;_73=abego.toSet(_e4);_74=_e5;_70=_e6;_71=_e7;if(!_6f){_6f=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_6f.style.position="absolute";}_aa();abego.openAsPopup(_6f);if(_75()){var w=_75().offsetWidth;if(_6f.offsetWidth<w){_6f.style.width=(w-2*(_6c+_6d))+"px";}abego.moveBelowAndClip(_6f,_75());}else{abego.centerOnWindow(_6f);}_c0();};abego.IntelliTagger.assistTagging=function(_e9,_ea){var _eb=_8e(_e9);var s=_e9.value;if(_7b(_e9)){s=_78(s);}var _ed=s.readBracketedList();var _ee=_ed.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_ed),_eb,_6e):_9e(_eb,_6e);abego.IntelliTagger.displayTagSuggestions(_a7(_eb,_ed),_ed,_ee,_e9,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_83(tag,_e9,_ea);}});};abego.IntelliTagger.close=function(){abego.closePopup(_6f);_6f=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_f1,_f2,_f3,_f4,_f5,id,_f7){if(!_f3){_f3="[editar]";}if(!_f4){_f4="Editar los tags";}if(!_f5){_f5="editTags";}var _f8=createTiddlyButton(_f2,_f3,_f4,_d7,_f5,id,_f7);_f8.setAttribute("tiddler",(_f1 instanceof Tiddler)?_f1.title:String(_f1));return _f8;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_f9,_fa,_fb,_fc,_fd,_fe){var _ff=_fd.parseParams("list",null,true);var _100=_ff[0]["action"];for(var i=0;_100&&i<_100.length;i++){var _102=_100[i];var _103=config.macros.intelliTagger.subhandlers[_102];if(!_103){abego.alertAndThrow("Unsupported action '%0'".format([_102]));}_103(_f9,_fa,_fb,_fc,_fd,_fe);}},subhandlers:{showTags:function(_104,_105,_106,_107,_108,_109){_af(_104,_72,_74?_74.length:0,_74);},showFavorites:function(_10a,_10b,_10c,_10d,_10e,_10f){_af(_10a,_74,0);},closeButton:function(_110,_111,_112,_113,_114,_115){var _116=createTiddlyButton(_110,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_117){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPluginES.major,version.extensions.IntelliTaggerPluginES.minor,version.extensions.IntelliTaggerPluginES.revision]);var e=createTiddlyElement(_117,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_11a){var e=createTiddlyElement(_11a,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">&copy; 2006 <b><font color=\s"red\s">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\sn"+"!~IntelliTagger Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".intelliTaggerSuggestions {\sn"+"\stposition: absolute;\sn"+"\stwidth: 600px;\sn"+"\sn"+"\stpadding: 2px;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: #eeeeee;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .currentTag {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .suggestionNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .numberedSuggestion{\sn"+"\stwhite-space: nowrap;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter {\sn"+"\stmargin-top: 4px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+".intelliTaggerSuggestions .favorites {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .normalTags {\sn"+"\stpadding-top: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class=\s"favorites\s" macro=\s"intelliTagger action: showFavorites\s"></div>\sn"+"<div class=\s"normalTags\s" macro=\s"intelliTagger action: showTags\s"></div>\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"intelliTaggerFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\st<span macro=\s"intelliTagger action: closeButton\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s">\sn"+"\st\st<span macro=\s"intelliTagger action: version\s"></span>, <span macro=\s"intelliTagger action: copyright \s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='title' macro='view title'></div>\sn"+"<div class='tagged' macro='tags'></div>\sn"+"<div class='viewer' macro='view text wikified'></div>\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#%5B%5BBSD%20open%20source%20license%5D%5D]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/src/Plugin-IntelliTagger-src.js]]";setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"intelliTagger");}\n//%/\n
if (!config.themes) config.themes = [];\n\nconfig.shadowTiddlers.KubrickPageTemplate = "<div class='header'>\sn<div class='titleLine'>\sn<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \sn<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\sn</div>\sn</div>\sn<div id='sidebar'><div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\sn<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\sn<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\sn<div id='sidebarCopyright' refresh='content' tiddler='Copyright'></div>\sn</div>\sn<div id='displayArea'>\sn<div id='messageArea'></div>\sn<div id='tiddlerDisplay'></div>\sn</div>\sn<div id='contentFooter'><p>TiddlyWiki was created by <a href='http://tiddlywiki.com'>Jeremy Ruston</a> and TiddlyKubrick was created by <a href='http://checkettsweb.com'>Clint Checketts</a></p></div>";\n\nconfig.shadowTiddlers.KubrickStyleSheet = "/***\snStyleSheet General Rules\sn***/\sn/*{{{*/\sna,\sn.button{\sn color: #06c;\sn text-decoration: none;\sn background: transparent;\sn}\sn\sna:hover,\sn.button:hover{\sn background: transparent;\sn text-decoration: none;\sn color: #147;\sn}\sn\snbody {\sn font-size: 15px; /* Resets 1em to 10px */\sn font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;\sn background-color: #d5d6d7;\sn color: #666;\sn margin: 0 auto;\sn}\sn\sn#contentWrapper{\sn background: transparent url(\s"http://tiddlyspot.com/_ts/images/themes/kubrickbg.jpg\s") repeat-y 0px 0px;\sn border: 0;\sn margin: 0 auto;\sn width: 760px;\sn}\sn/*}}}*/\sn\sn/***\snHeader Rules\sn***/\sn/*{{{*/\sn.titleLine{\sn margin: 80px auto 0em;\sn padding: 0;\sn width: 745px;\sn text-align: center;\sn color: #fff;\sn}\sn\sn.siteTitle{\sn font-size: 30px;\sn}\sn\sn.siteTitle a, .siteSubtitle a{\sn color: #fff;\sn}\sn\sn.siteTitle a:hover, .siteSubtitle a:hover{\sn text-decoration: none;\sn font-weight: normal;\sn}\sn\sn.siteSubtitle{\sn display: block;\sn margin: 58px 0 0 0;\sn font-size: 15px;\sn}\sn\sn.header {\sn background: url(\s"http://tiddlyspot.com/_ts/images/themes/kubrickheader.jpg\s") no-repeat bottom center; \sn margin: 0;\sn padding: 1px;\sn height: 198px;\sn width: 758px;\sn\sn}\sn/*}}}*/\sn\sn/***\snFooter Styles\sn***/\sn/*{{{*/\sn#contentFooter {\sn text-align: center;\sn clear: both;\sn background: url(\s"http://tiddlyspot.com/_ts/images/themes/kubrickfooter.jpg\s") no-repeat bottom;\sn border: none;\sn padding: 2em;\sn height: 3em;\sn}\sn/*}}}*/\sn\sn/***\snSidebar styles\sn***/\sn/*{{{*/\sn#sidebar{\sn margin: 1em 2em 0 0;\sn position: static;\sn float: right;\sn}\sn\sn#sidebar a,\sn#sidebar a:hover{\sn border: 0;\sn}\sn\sn#sidebar h1{\sn font-size: 1.4em;\sn font-weight: bold;\sn margin: 0;\sn background: transparent;\sn color: #000;\sn}\sn\sn#sidebar ul{\sn padding: 0;\sn margin: 0 0 0 1em;\sn}\sn\sn#sidebar li{\sn list-style: none;\sn}\sn\sn#sidebar li:before{\sn color: #000;\sn content: \s"\ss00BB \ss0020\s";\sn}\sn\sn#sidebar, #mainMenu, #sideBarOptions{\sn width: 200px;\sn text-align: left;\sn}\sn\sn#mainMenu{\sn position: static;\sn}\sn/*}}}*/\sn\sn/***\snSidebar search styles\sn***/\sn/*{{{*/\sn#sidebarSearch{\sn margin: 20px 0 0 10px;\sn width: 155px;\sn}\sn\sn#sidebarSearch input{\sn font-size: 15px;\sn width: 120px;\sn}\sn\sn#sidebarSearch .button{\sn margin-top: 1px;\sn}\sn/*}}}*/\sn\sn/***\snSidebar option styles\sn***/\sn/*{{{*/\sn#sidebarOptions{\sn margin-left: .75em;\sn}\sn\sn#sidebarOptions h1{\sn font-size: 1.3em;\sn}\sn\sn#sidebarOptions a{\sn display: block; // was inline \sn border: 0;\sn}\sn\sn#sidebarOptions .sliderPanel{\sn background-color: transparent;\sn font-size: 1em;\sn margin: 0;\sn}\sn\sn#sidebarOptions .sliderPanel a:before,\sn#sidebarTabs li:before{\sn content: \s"\s";\sn}\sn/*}}}*/\sn/***\snSidebar tab styles\sn***/\sn/*{{{*/\sn#sidebarTabs .tab,\sn#sidebarTabs .tab:hover{\sn border: 1px solid #ccc;\sn text-decoration: none;\sn}\sn\sn#sidebarTabs .tabSelected{\sn background: #ccc;\sn color: #333;\sn}\sn\sn#sidebarTabs .tabUnselected{\sn background: #e6e6e6;\sn color: #333;\sn}\sn\sn#sidebarTabs .tabContents{\sn background: #ccc;\sn color: #333;\sn border: 1px solid #ccc;\sn width: 95%;\sn}\sn\sn#sidebarTabs .tabContents a{\sn color: #06c;\sn}\sn\sn#sidebarTabs .tabContents a:hover{\sn color: #147;\sn\sn}\sn\sn#sidebarTabs a.tabSelected:hover{\sn cursor: default;\sn}\sn\sn#sidebarTabs .txtMoreTab .tab{\sn border: 1px solid #aaa;\sn color: #333;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabSelected{\sn background: #aaa;\sn color: #333;\sn}\sn\sn#sidebarTabs .txtMoreTab .tabSelected:hover{\sn background: #aaa;\sn color: #333\sn}\sn\sn#sidebarTabs .txtMoreTab .tabUnselected{\sn background: #ccc;\sn color: #333;\sn}\sn\sn#contentWrapper #sidebar .txtMoreTab .tabUnselected:hover,#contentWrapper #displayArea .txtMoreTab .tabUnselected:hover{\sn color: #333;\sn}\sn\sn#contentWrapper .txtMoreTab .tabContents{\sn background: #aaa;\sn color: #333;\sn border: 1px solid #aaa;\sn}\sn/*}}}*/\sn/***\snMessage area styles\sn***/\sn/*{{{*/\sn#messageArea {\snbackground-color: #eee;\sn border: 1px solid #ccc;\sn color: #bbb;\sn margin: 0 1em;\sn font-size: .8em;\sn}\sn\sn#messageArea a:link{\sn color: #aaa;\sn}\sn#messageArea a:hover{\sn color: #06c;\sn}\sn\sn#messageArea .messageToolbar .button{\sn border: 1px solid #ccc;\sn color: #aaa;\sn text-decoration: none;\sn}\sn#messageArea .messageToolbar .button:hover{\sn border: 1px solid #777;\sn color: #777;\sn}\sn/*}}}*/\sn/***\snPopup styles\sn***/\sn/*{{{*/\sn#popup{\sn padding: 0;\sn background: #eee;\sn border: 1px solid #ccc;\sn color: #333;\sn}\sn\sn#popup a{\sn color: #06c;\sn font-weight: normal;\sn}\sn\sn#popup a:hover{\sn color: #fff;\sn background: #aaa;\sn text-decoration: none;\sn}\sn/*}}}*/\sn/***\snTiddler display styles\sn***/\sn/*{{{*/\sn#displayArea{\sn margin: 10px 245px 1em 30px;\sn text-align: left;\sn font-size: 15px;\sn color: #000;\sn}\sn\snh1, h2, h3, h4, h5, .title{\sn font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;\sncolor: #333;\snpadding: 0;\sn}\sn\sn.viewer h1,.viewer h2,.viewer h3,.viewer h4,.viewer h5,.viewer h6{\sn background: transparent;\sn border-bottom: 1px dotted #ccc;\sn}\sn\sn.title{\sn font-size: 20px; \sn}\sn\sn.subtitle{\sn color: #999;\sn font-size: 12px;\sn}\sn\sn.toolbar{\sn font-size: 11px;\sn}\sn\sn.toolbar a:link,.toolbar a:visited{\sn background: #e6e6e6;\sn border: 1px solid #ccc;\sn color: #aaa;\sn padding: 1px 3px;\sn margin: 0 .5em 0 0;\sn}\sn\sn.toolbar a.button:hover{\sn background: #eee;\sn border-color: #ddd;\sn color: #ccc;\sn text-decoration: none;\sn}\sn\sn.viewer a.tiddlyLinkNonExisting:link{\sn color: #b85b5a;\sn font-style: normal;\sn}\sn\sn.viewer a.tiddlyLinkNonExisting:hover{\sn text-decoration: none; \sn}\sn\sn.viewer a.tiddlyLinkExisting:link,#displayArea .viewer a.externalLink{\sn font-weight: normal;\sn color: #06c;\sn}\sn\sn.viewer a.tiddlyLinkExisting:hover,.viewer a.externalLink:hover{\sn color: #147;\sn text-decoration: none; \sn}\sn\sn.viewer {\sn font-size: 15px;\sn line-height: 160%;\sn padding-top: 0.5em;\sn}\sn\sn.viewer code {\sn font-size: 12px;\sn}\sn\sn.viewer .button{\sn \sn font-size: 15px;\sn}\sn\sn.editor {\sn font-size: 15px;\sn color: #ooo;\sn line-height: 160%;\sn}\sn\sn.editor input, .editor textarea {\sn display: block;\sn width: 100%;\sn font: inherit;\sn}\sn\sn.footer, .footer a.button,.editorFooter, .footer a.button{\sn color: #aaa;\sn}\sn\sn.selectedTiddler .footer,.selectedTiddler .footer a{\sn color: #777;\sn}\sn\sn.selectedTiddler .footer a.button,.selectedTiddler .editorFooter a.button{\sn color: #06c;\sn}\sn\sn.footer a.button:hover,.editorFooter a.button:hover{\sn color: #147;\sn background: transparent;\sn} \sn\sn.tagClear{\sn clear: none; \sn}\sn/*}}}*/";\n\nconfig.themes.push("Kubrick");
|[[In English]] |\n|[[ToDo]] |
/***\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\n*rollover\n*custom label/tooltip\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^*[label|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* {{{"^"}}} //(without the quotes)//^^\nmakes the slider 'float' on top of other content rather than shifting that content downward^^\n* {{{"*"}}} //(without the quotes)//^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{[label]}}} or {{{[label|tooltip]}}}^^\nuses custom label/tooltip. (defaults are: ">" (more) and "<" (less)^^\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, floater, rollover, label/tooltip, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^*[label|tooltip]>...\n content\n===\n}}}\n++++(testcookie)!!!^*[label|tooltip]>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...|click for information]\n put some general information here, plus a floating slider with more specific info:\n +++^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...|click for information]\n put some general information here, plus a floating slider with more specific info:\n +++^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^*[glossary definition]explaining technical terms===\n ===\n===\n----\nnested floaters\n>menu: <<tiddler NestedSlidersExample>>\n(see [[NestedSlidersExample]] for definition)\n----\n===\n+++!!!!![Installation]>\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n===\n+++!!!!![Revision History]>\n\n''2006.04.24 - 1.7.7''\nin adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position\n\n''2006.02.16 - 1.7.7''\ncorrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n\n''2006.02.15 - 1.7.6''\nin 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\n''2006.02.04 - 1.7.5''\nadd 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n\n''2006.01.18 - 1.7.4''\nonly 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\n''2006.01.16 - 1.7.3''\nadded 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\n''2006.01.16 - 1.7.2''\nadded 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\n''2006.01.14 - 1.7.1''\nadded optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n\n''2006.01.14 - 1.7.0''\nadded optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n\n''2006.01.03 - 1.6.2''\nWhen 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\n''2005.12.15 - 1.6.1''\nadded optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n\n''2005.11.25 - 1.6.0''\nadded optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n\n''2005.11.21 - 1.5.1''\nrevised 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\n''2005.11.20 - 1.5.0''\nadded (cookiename) syntax for optional tracking and restoring of slider open/close state\n\n''2005.11.11 - 1.4.0''\nadded !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n\n''2005.11.07 - 1.3.0''\nremoved alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\nformatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n\n''2005.11.05 - 1.2.1''\nchanged name to NestedSlidersPlugin\nmore documentation\n\n''2005.11.04 - 1.2.0''\nadded alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n\n''2005.11.03 - 1.1.1''\nfixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\ncode cleanup, added documentation\n\n''2005.11.03 - 1.1.0''\nchanged delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\nchanged name to EasySlidersPlugin\n\n''2005.11.03 - 1.0.0''\ninitial public release\n\n===\n+++!!!!![Credits]>\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with research, programming and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson\n===\n***/\n// //+++!!!!![Code]\n//{{{\nversion.extensions.nestedSliders = {major: 1, minor: 7, revision: 7, date: new Date(2006,2,16)};\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\ss*",\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 // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie\n var show="none"; var title=">"; var tooltip="show"; var cookie="";\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().substr(1,lookaheadMatch[2].length-2);\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 // custom label/tooltip\n if (lookaheadMatch[6]) {\n title = lookaheadMatch[6].trim().substr(1,lookaheadMatch[6].length-2);\n var pos=title.indexOf("|");\n if (pos!=-1)\n { tooltip = title.substr(pos+1,title.length); title = title.substr(0,pos); }\n else\n { tooltip += " "+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,null,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);\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\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.style.display = show;\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[8]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[7]?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[7]?"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//{{{\nfunction onClickNestedSlider(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 if (this.sliderCookie && this.sliderCookie.length)\n { config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }\n // align slider/floater position with target button\n adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\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 ///////////////////////////////////////////////////////////////////////////////\n /// EXPERIMENTAL HACK - DOESN'T WORK FOR NESTED FLOATERS\n ///////////////////////////////////////////////////////////////////////////////\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//}}}\n// //===
<div class='header' macro='gradient vert #390108 #900'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</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='tiddlerDisplay'></div>\n</div>
/***\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: ''ALPHA / EXPERIMENTAL''\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//}}}
/***\n|''Name:''|RSSReaderPlugin|\n|''Description:''|This plugin provides a RSSReader for TiddlyWiki|\n|''Version:''|0.3.0|\n|''Date:''|Aug 24, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#RSSReaderPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#RSSReaderPluginDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''Credit:''|BramChen for RssNewsMacro|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|none|\n|''Require:''|none|\n***/\n//{{{\nversion.extensions.RSSReaderPlugin = {\n major: 0, minor: 3, revision: 0,\n date: new Date("Aug 24, 2006"),\n author: "BidiX",\n credit: "BramChen for RssNewsMacro",\n source: "http://TiddlyWiki.bidix.info/#RSSReaderPlugin",\n documentation : "http://TiddlyWiki.bidix.info/#RSSReaderPluginDoc",\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari' \n};\n\nconfig.macros.rssReader = {\n dateFormat: "DDD, DD MMM YYYY",\n itemStyle: "display: block;border: 1px solid black;padding: 5px;margin: 5px;", //useed '@@'+itemStyle+itemText+'@@'\n msg:{\n permissionDenied: "Permission to read preferences was denied.",\n noRSSFeed: "No RSS Feed at this address %0",\n urlNotAccessible: " Access to %0 is not allowed"\n },\n cache: [], // url => request\n desc: "noDesc",\n // feedURL: "",\n place:"",\n handler: function(place,macroName,params,wikifier,paramString,tiddler){\n var desc = params[0];\n var feedURL = params[1];\n // var toFilter = (params[2] ? params[2] : false);\n var toFilter = false;\n var filterString;\n if (params[2] != undefined) {\n toFilter = true;\n if (params[2].match(/\sw+/))\n filterString = params[2];\n else\n filterString = tiddler.title;\n }\n var place = createTiddlyElement(place, "div", "RSSReader");\n wikify("^^<<rssFeedUpdate "+feedURL+" [[" + tiddler.title + "]]>>^^\sn",place);\n if (this.cache[feedURL]) {\n this.processResponse(this.cache[feedURL], feedURL, place, desc, toFilter, filterString);\n }\n else {\n this.asyncGet(feedURL, place, desc, toFilter, filterString);\n }\n },\n\n asyncGet: function (feedURL, place, desc, toFilter, filterString){\n var xmlhttp;\n try {xmlhttp=new XMLHttpRequest();}\n catch (e) {\n try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");}\n catch (e) {\n try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}\n catch (e) { displayMessage(e.description?e.description:e.toString());}\n }\n }\n if (!xmlhttp){\n return;\n }\n if (window.netscape){\n try {\n if (document.location.protocol.indexOf("http") == -1) {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n }\n catch (e) { displayMessage(e.description?e.description:e.toString()); }\n }\n xmlhttp.onreadystatechange=function (){\n if (xmlhttp.readyState==4) {\n if (xmlhttp.status==200 || xmlhttp.status===0) {\n config.macros.rssReader.processResponse(xmlhttp, feedURL, place, desc, toFilter, filterString);\n }\n else {\n displayMessage("Problem retrieving XML data:" + xmlhttp.statusText);\n }\n }\n };\n try {\n xmlhttp.open("GET",feedURL,true);\n if (config.browser.isIE) {\n xmlhttp.send();\n }\n else {\n xmlhttp.send(null);\n }\n }\n catch (e) {\n wikify(e.toString()+this.urlNotAccessible.format([feedURL]), place);\n }\n },\n processResponse: function(xmlhttp, feedURL, place, desc, toFilter, filterString){ \n if (window.netscape){\n try {\n if (document.location.protocol.indexOf("http") == -1) {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n }\n catch (e) { displayMessage(e.description?e.description:e.toString()); }\n }\n if (xmlhttp.responseXML){\n this.cache[feedURL] = xmlhttp;\n this.genRssNews(xmlhttp.responseXML, place, feedURL, desc, toFilter, filterString);\n }\n else {\n var dom = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml"); \n if (dom) {\n this.cache[feedURL] = xmlhttp;\n this.genRssNews(dom, place, feedURL, desc, toFilter, filterString);\n }\n else {\n wikify("<html>"+xmlhttp.responseText+"</html>", place);\n displayMessage(this.msg.noRSSFeed.format([feedURL]));\n }\n }\n },\n genRssNews: function(xml, place, feedURL, desc, toFilter, filterString){\n // Channel\n var chanelNode = xml.getElementsByTagName('channel').item(0);\n var chanelTitleElement = (chanelNode ? chanelNode.getElementsByTagName('title').item(0) : null);\n var chanelTitle = "";\n if ((chanelTitleElement) && (chanelTitleElement.firstChild)) chanelTitle = chanelTitleElement.firstChild.nodeValue;\n var chanelLinkElement = (chanelNode ? chanelNode.getElementsByTagName('link').item(0) : null);\n var chanelLink = "";\n if (chanelLinkElement) chanelLink = chanelLinkElement.firstChild.nodeValue;\n var titleTxt = "!![["+chanelTitle+"|"+chanelLink+"]]\sn";\n var title = createTiddlyElement(place,"div",null,"ChanelTitle",null);\n wikify(titleTxt,title);\n // ItemList\n var itemList = xml.getElementsByTagName('item');\n var article = createTiddlyElement(place,"ul",null,null,null);\n var lastDate;\n var re;\n if (toFilter) \n re = new RegExp(filterString.escapeRegExp());\n for (var i=0; i<itemList.length; i++){\n var titleElm = itemList[i].getElementsByTagName('title').item(0);\n var titleText = (titleElm ? titleElm.firstChild.nodeValue : '');\n if (toFilter && ! titleText.match(re)) {\n continue;\n }\n var descText = '';\n var isWikitext = false;\n var descElem = itemList[i].getElementsByTagName('wikitext').item(0);\n if (descElem){\n try{\n isWikitext = true;\n descText = "\sn"+descElem.firstChild.nodeValue;}\n catch(e){}\n }\n else {\n descElem = itemList[i].getElementsByTagName('encoded').item(0);\n if (descElem){\n try{descText = descElem.firstChild.nodeValue;}\n catch(e){}\n descText = "<html>"+descText+"</html>";\n }\n else {\n descElem = itemList[i].getElementsByTagName('description').item(0);\n if (descElem){\n try{descText = descElem.firstChild.nodeValue;}\n catch(e){}\n descText = descText.replace(/<br \s/>/g,'\sn');\n if (desc == "asHtml")\n descText = "<html>"+descText+"</html>";\n }\n }\n }\n var linkElm = itemList[i].getElementsByTagName("link").item(0);\n var linkURL = linkElm.firstChild.nodeValue;\n var pubElm = itemList[i].getElementsByTagName('pubDate').item(0);\n var pubDate;\n if (!pubElm) {\n pubElm = itemList[i].getElementsByTagName('date').item(0); // for del.icio.us\n if (pubElm) {\n pubDate = pubElm.firstChild.nodeValue;\n pubDate = this.formatDateString(this.dateFormat, pubDate);\n }\n else {\n pubDate = '0';\n }\n }\n else {\n pubDate = (pubElm ? pubElm.firstChild.nodeValue : 0);\n pubDate = this.formatString(this.dateFormat, pubDate);\n }\n titleText = titleText.replace(/\s[|\s]/g,'');\n var rssText = '** '+'[[' + titleText + '|' + linkURL + ']]' + '\sn' ;\n if ((desc != "noDesc") && descText){\n if (version.extensions.nestedSliders){\n rssText = rssText.replace(/\sn/g,' ');\n descText = '+++[...]\sn'\n +(isWikitext ? '\sn<<rssFeedImportTiddler '+ feedURL + ' [['+titleText+']]>>':'')\n +'@@'+this.itemStyle+descText+'\sn@@\sn'\n +'===';\n }\n rssText = rssText + descText + '\sn\sn';\n }\n var story;\n if ((lastDate != pubDate) && ( pubDate != '0')) {\n story = createTiddlyElement(article,"li",null,"RSSItem",pubDate);\n lastDate = pubDate;\n }\n else {\n lastDate = pubDate;\n }\n story = createTiddlyElement(article,"div",null,"RSSItem",null);\n wikify(rssText,story);\n }\n },\n formatString: function(template, theDate){\n var dateString = new Date(theDate);\n template = template.replace(/hh|mm|ss/g,'');\n return dateString.formatString(template);\n },\n formatDateString: function(template, theDate){\n var dateString = new Date(theDate.substr(0,4), theDate.substr(5,2) - 1, theDate.substr(8,2)\n /*, theDate.substr(11,2), theDate.substr(14,2), theDate.substr(17,2)*/\n );\n return dateString.formatString(template);\n }\n \n};\n//}}}\n\n//{{{\nconfig.macros.rssFeedUpdate = {\n label: "Update",\n prompt: "Clear the cache and redisplay this RssFeed",\n handler: function(place,macroName,params) {\n var feedURL = params[0];\n var tiddlerTitle = params[1];\n createTiddlyButton(place, this.label, this.prompt, \n function () {\n if (config.macros.rssReader.cache[feedURL]) {\n config.macros.rssReader.cache[feedURL] = null; \n //story.refreshTiddler(tiddlerTitle,null, true);\n }\n story.refreshTiddler(tiddlerTitle,null, true);\n return false;});\n }\n};\n//}}}\n\n//{{{\nconfig.macros.rssFeedImportTiddler = {\n label: "Import",\n prompt: "Import this tiddler in this TiddlyWiki",\n askReplaceMsg: "Tiddler already exists, replace it ?",\n handler: function(place,macroName,params) {\n var feedUrl = params[0];\n var tiddlerTitle = params[1];\n createTiddlyButton(place, this.label, this.prompt, \n function () {\n if (feedUrl && config.macros.rssReader.cache[feedUrl]) {\n var tiddler = config.macros.rssFeedImportTiddler.parseRssNews(config.macros.rssReader.cache[feedUrl].responseXML, tiddlerTitle);\n if (tiddler && (! store.getTiddler(tiddlerTitle) || confirm(config.macros.rssFeedImportTiddler.askReplaceMsg))) {\n store.addTiddler(tiddler);\n store.notify(tiddler.title, true);\n store.setDirty(true);\n }\n }\n return false;});\n },\n \n // parse a RssFeed for retrieving a Tiddler with title\n parseRssNews: function(xml, title) {\n // ItemList\n if (document.location.protocol.indexOf("http") == -1) {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n\n var itemList = xml.getElementsByTagName('item');\n for (var i=0; i<itemList.length; i++){\n\n var titleElm = itemList[i].getElementsByTagName('title').item(0);\n var titleText = titleElm.firstChild.nodeValue;\n if (titleText == title) {\n // <tiddlywiki:title>\n // titleText\n titleText = titleText.htmlDecode();\n // <tiddlywiki:wikitext>\n var elem = itemList[i].getElementsByTagName('wikitext').item(0);\n var text = elem ? elem.firstChild.nodeValue.htmlDecode() : "";\n // <tiddlywiki:modifier>\n elem = itemList[i].getElementsByTagName('modifier').item(0);\n var modifier = elem ? elem.firstChild.nodeValue : "";\n // <tiddlywiki:modified>\n elem = itemList[i].getElementsByTagName('modified').item(0);\n var modified = elem ? Date.convertFromYYYYMMDDHHMM(elem.firstChild.nodeValue) : "";\n // <tiddlywiki:created>\n elem = itemList[i].getElementsByTagName('created').item(0);\n var created = elem ? Date.convertFromYYYYMMDDHHMM(elem.firstChild.nodeValue) : "";\n // <tiddlywiki:links>\n // Links ?\n // <tiddlywiki:tags>\n elem = itemList[i].getElementsByTagName('tags').item(0);\n var tags = elem ? elem.firstChild.nodeValue.htmlDecode() : "";\n var tiddler = new Tiddler();\n tiddler.assign(titleText,text,modifier,modified,tags,created);\n return tiddler;\n }\n }\n // not found \n alert("Tiddler \s[[" + title +"]] notFound.");\n return null;\n }\n\n};\n\n//}}}\n
/***\n\n''This plugin was previously called StyleChooser.''\n\n|Name|SelectThemePlugin|\n|Created by|SimonBaird and SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#SelectThemePlugin|\n|Version|1.2.2 (28-Apr-06)|\n|Requires|~TW2.x|\n!Description\n*An alternative style switcher, can be used to switch just stylesheets and/or pagetemplates, or a combination of both (a theme)\n*You can add your own stylesheets and pagetemplates, or use a ThemePack, like BigThemePack or KubrickTheme.\n\n!Usage\n* You have to have fetch or create some styleSheets and pageTemplates to use this plugin.\n**You can either get a ThemePack like BigThemePack which automatically adds themes to ThemeSelect.\n**or create tiddlers with styleSheets and pageTemplates and tag them styleSheets and pageTemplates respectively.\n* Put {{{<<themeSelect style 'Select theme'>>}}} in your SideBarOptions. Mmm.. lovely.\n\n!Creating Theme Packs\n*You can create your own theme pack if you like. Instructions can be found [[here|CreateTheme]].\n\n!History\n* 28-Apr-06, v1.2.2, fixed bug with opening TW after deleting themepacks. (Saq)\n* 26-Apr-06, v1.2.1, more code optimization, dropdowns now updated on the fly. (Saq)\n* 25-Apr-06, v1.2.0, added 3rd party ThemePack support, and made various other improvements.(Simon & Saq)\n* 24-Apr-06, v1.1.0, added: no styles and default styles options,<<br>>support for ThemePack, support for tag variations(Saq)\n* 21-Apr-06, v1.0.0, Reworked dropdowns to include option for pagetemplates (Saq)\n* 21-Apr-06, v0.9.0, Rewrote and added Saq's lovely dropdown select (Simon)\n* 20-Apr-06, v0.0.1, Basic switcher working (Simon)\n\n!Examples\n|!Source|!Output|h\n|{{{<<themeSelect style>>}}} for a dropdown with StyleSheets|<<themeSelect style>>|\n|{{{<<themeSelect pagetemplate>>}}} for a dropdown with PageTemplates|<<themeSelect pagetemplate>>|\n|{{{<<themeSelect style customlabel>>}}} to use a customlabel|<<themeSelect style customlabel>>|\n* When applying a stylesheet or template, it also looks for a template or stylesheet respectively based on naming convention, eg MyFunkyStyleSheet and MyFunkyPageTemplate.\n\n!Notes\n* See also http://www.tiddlytools.com/#SelectStyleSheetPlugin for a more feature rich style sheet switcher\n\n! Ideas\n* do ViewTemplate also?\n* Pretty up the [x] bit\n\n!Code\n***/\n//{{{\n// for compatibility with TW <2.0.9\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item)\n {\n return this.find(item) != null;\n };\n\n// for compatibility with TW <2.0.9\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items)\n {\n for(var i=0; i<items.length; i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n//}}}\n\n//{{{\nversion.extensions.SelectTheme = { major: 1, minor: 2, revision: 2, date: new Date(2006,4,28),\n source: "http://lewcid.googlepages.com/lewcid.html#SelectThemePlugin"\n};\n\nconfig.SelectTheme = {\n things: {\n style: {\n tag: ["StyleSheets","StyleSheet","styleSheet","styleSheets","stylesheet","stylesheets"],\n theDefault: "StyleSheet",\n suffix: "StyleSheet",\n notify: refreshStyles,\n cookie: "txtStyleSheet",\n otherThing: "pagetemplate",\n label: "Elige una Hoja de Estilo: ",\n tooltip: "Elige una Hoja de Estilo",\n caseNone: { text:"Ninguno", title:"NoStyleSheet"},\n caseDefault: { text:"Normal", title:"StyleSheet" }\n\n },\n pagetemplate: {\n tag: ["PageTemplates","PageTemplate","pageTemplates","pageTemplate","pagetemplate","pagetemplates"],\n theDefault: "PageTemplate",\n suffix: "PageTemplate",\n notify: refreshPageTemplate,\n cookie: "txtPageTemplate",\n otherThing: "style",\n label: "Choose PageTemplate: ",\n tooltip: "Choose a PageTemplate",\n caseNone: { text:"None", title:"NoPageTemplate"},\n caseDefault: { text:"Default", title:"PageTemplate" }\n }\n\n },\n\n specialCases: ["caseNone","caseDefault"]\n\n};\n\nTiddlyWiki.prototype.removeNotification = function(title,fn) {\n for (var i=0;i<this.namedNotifications.length;i++)\n if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))\n this.namedNotifications.splice(i,1); // counting on it only being there once\n}\n\n\nvar things = config.SelectTheme.things;\nvar specialCases=config.SelectTheme.specialCases;\n\nfor (var t in things) {\n // make sure we have a value\n if (!config.options[things[t].cookie])\n config.options[things[t].cookie] = things[t].theDefault;\n\n // remove core notify\n store.removeNotification(things[t].theDefault,things[t].notify);\n\n // and add our one\n store.addNotification(config.options[things[t].cookie],things[t].notify);\n\n}\n\n//checks to see if a tiddler exists in store or as a shadow.\nTiddlyWiki.prototype.isTiddler= function (title)\n {return store.tiddlerExists(title) || store.isShadowTiddler(title)}\n\n//hijack core function & make sure template exists\nwindow.applyPageTemplate_themeSelect=window.applyPageTemplate;\nwindow.applyPageTemplate=function(title){\n if(!store.isTiddler(title))\n {title = things.pagetemplate.theDefault;}\n applyPageTemplate_themeSelect(title);\n }\n\nTiddlyWiki.prototype.makeActiveTheme = function(what,title,alsoCheckOtherThing) {\n\n var thing = things[what];\n if (!store.isTiddler(title))\n title = thing.theDefault;\n\n var oldTitle = config.options[thing.cookie];\n\n if (what == "style") {\n // remove old style element from DOM\n var oldStyleElement = document.getElementById(oldTitle);\n oldStyleElement.parentNode.removeChild(oldStyleElement);\n }\n\n store.removeNotification(oldTitle,thing.notify);\n store.addNotification(title,thing.notify);\n store.notify(title);\n\n config.options[thing.cookie] = title;\n saveOptionCookie(thing.cookie);\n if (alsoCheckOtherThing)\n this.makeActiveTheme(thing.otherThing,\n title.replace(new RegExp(thing.suffix+"$"),"") + things[thing.otherThing].suffix,\n false);\n};\n\n\nconfig.shadowTiddlers.NoStyleSheet = "";\nconfig.shadowTiddlers.NoPageTemplate = config.shadowTiddlers.PageTemplate;\n\n\nfunction switchTheme(e){\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLink = theTarget;\n var switchTo= theLink.getAttribute("switchTo");\n var mode = theLink.getAttribute("mode");\n if ((config.options[things[mode].cookie])!=switchTo)\n {store.makeActiveTheme(mode,switchTo,true);};\n return(false);\n}\n\n\nconfig.macros.themeSelect={};\nconfig.macros.themeSelect.dropdownchar = (document.all?"▼":"▾");\nconfig.macros.themeSelect.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n var arrow = config.macros.themeSelect.dropdownchar;\n var mode = params[0];\n var label = (params[1]?params[1]:things[mode].label) + arrow;\n var cookie = (config.options[things[mode].cookie]);\n\n var onclick = function(e)\n { if (!e) var e = window.event;\n var popup = Popup.create(this);\n\n var tagged=[];\n\n store.forEachTiddler(function(title,tiddler) {\n if ((tiddler.tags).containsAny(things[mode].tag)){\n tagged.push(tiddler.title);}\n });\n\n //integrate ThemePacks\n if (config.themes) {\n // see what themes have been loaded...\n for (var i=0;i<config.themes.length;i++) {\n // see if there is one\n var lookForThis = config.themes[i] + things[mode].suffix;\n if (store.isShadowTiddler(lookForThis)) {\n tagged.pushUnique(lookForThis);\n }\n }\n tagged = tagged.sort();\n }\n\n //this function used later to create buttons\n var createThemeButton = function(switchTo){\n var theButton = createTiddlyButton(createTiddlyElement(popup,"li"),text,null,switchTheme,useClass);\n theButton.setAttribute("switchTo",switchTo);\n theButton.setAttribute("mode",mode);};\n\n //create Buttons for None(shadow styles) & Default (StyleSheet)\n // Default button is not created if StyleSheet doesnt exist.\n for(var t=0; t<specialCases.length; t++){\n var special = specialCases[t];\n var text = things[mode][special].text;\n var useClass = "tiddlyLinkExisting"; //redundant, optimize!\n if ((things[mode][special].title==cookie)||(special=="caseNone"&&!store.isTiddler(cookie)))\n {text+= " [x]";\n useClass = "currentlySelected";}\n if (!((special=="caseDefault")&&(!store.getTiddler(things[mode][special].title))))\n createThemeButton(things[mode][special].title); }\n\n //insert horizontal rule\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n\n //create buttons for all other stylesheet tiddlers\n for(var t=0; t<tagged.length; t++)\n { var useClass = "tiddlyLinkExisting";\n var text = (tagged[t]).replace((things[mode].suffix),"");\n if (tagged[t]==(cookie) )\n {text+=" [x]"; useClass="currentlySelected";}\n if ((tagged[t]!= (things[mode].theDefault))&&tagged[t]!= (things[mode].none))\n {createThemeButton(tagged[t]);}}\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation)\n e.stopPropagation();\n return(false);\n };\n\n var createdropperButton = function(place){\n var sp = createTiddlyElement(place,"span",null,"ThemeChooserButton");\n var theDropDownBtn = createTiddlyButton(sp,label,things[mode].tooltip,onclick);\n };\n\n createdropperButton(place);\n};\n\n\nsetStylesheet(".popup li a.currentlySelected {background:#ccc;color:black;font-weight:bold;}","currentlySelectedStyle"); // could do better probably...\n\nconfig.macros.layoutChooser=config.macros.themeSelect;\n\n//shadow tiddler to hold instructions for creating ThemePacks\nconfig.shadowTiddlers.CreateTheme='See http://simonbaird.com/mptw/#CreateTheme'; \n\nconfig.macros.applyTheme = {handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var theme = params[0];\n var label = params[1]?params[1]:'Apply theme "' + theme + '"';\n var tooltip = 'Apply the "'+theme+'" theme to this TiddlyWiki';\n createTiddlyButton(place,label,tooltip,function() {\n store.makeActiveTheme("style",theme+things.style.suffix,true);\n });\n}};\n//}}}\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<upload http://eddie.tiddlyspot.com/store.cgi index.html . . eddie>><html><a href='http://eddie.tiddlyspot.com/download' class='button'>descargar</a></html><<themeSelect style 'elige el tema'>><<slider chkSliderOptionsPanel OptionsPanel 'opciones »' 'Cambiar las opciones avanzadas de TiddlyWiki'>>
cosas que preferirías no haber leído
eddie
// //''Name:'' InsertSmiley\n// //''Version:'' <<getversion smiley>> (<<getversiondate smiley "DD MMM YYYY">>)\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''Description:'' Inserts a small smiley graphic at the location of the macro and does not require any external graphics. The method used should work on most current browser platforms.\n\n// //''Syntax:'' << {{{smiley ;-)}}}>>\n// //Examples: <<smiley>> <<smiley :-(>> <<smiley ;-)>> <<smiley :-|>> <<smiley :-D>>\n\n// //''Directions:'' <<tiddler MacroDirections>>\n\n// //''Notes:'' A regular smiley <<smiley>> will be displayed if no smiley string is provided. Most smileys will work with or without the "nose" -- e.g. {{{;-)}}} is the same as {{{;)}}}\n\n// //''Revision History:''\n// // v0.1.0 (20 July 2005): initial release\n// // v0.1.1 (20 July 2005): << {{{smiley}}}>> with no parameter displays a standard smiley\n\n// //''Code section:''\n//{{{\nversion.extensions.smiley = {major: 0, minor: 1, revision: 1, date: new Date("Jul 20, 2005")};\nconfig.macros.smiley = {}\nconfig.macros.smiley.handler = function(place,macroName,params)\n{\n var palette = ["transparent","#000000","#1a1507","#352e18","#464646","#666666","#a3141e","#b06b63","#cc9900","#dd9030","#dddddd","#e89d00","#edc32a","#f3cb3c","#fdf201","#fdf526","#ff3149","#ffac00","#ffbf06","#ffc846","#ffcc66","#ffd758","#ffdd01","#ffea7b","#ffed55","#ffffff"];\n var data = params;\n var imageMap = null;\n if(!data[0] || data[0] == ":-)" || data[0] == ":)")\n imageMap = "aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyffyffuujbaadyyyeeyeetttdabppppddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwboooowwwbllbbwwwboooowbrllbacwwwbbbbbrllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa";\n else if(data[0] == ":-(" || data[0] == ":(")\n imageMap = "aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyyyyyyuujbaadyyyeeyeetttdabppppddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwoooooowwrllbbwwwwbbbbbsrllbacwwbwwwwsbllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa";\n else if(data[0] == ";-)" || data[0] == ";)")\n imageMap = "aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyxxxxxuujbaadyyyxxxeetttdabppphddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwboooowwwbllbbwwwboooowbrllbacwwwbbbbbrllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa";\n else if(data[0] == ":-|" || data[0] == ":|")\n imageMap = "aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyffyffuujbaadyyyeeyeetttdabppppddyddpmmlbbwoooooooowsrlbbwwpooooowwmrlbbwwoooooowwrllbbwwwwbbbbbsrllbacwwwwwwwsrllcaablswwwwsrrlibaaablsssrrllibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa";\n else if(data[0] == ":-D" || data[0] == ":D")\n imageMap = "aaaaabbbbbaaaaaaaabdtyyvtdbaaaaabnyxxxxxujbaaabmyyeeyeeuujbaadyyyeeyeetttdabppppyyyyypmmlbbwbbbbbbbbbbblbbwbkzzzzzzzkbwbbwbfzzzzzzzfbwbbwbkzzzzzzzkbwbacwbkzzzzzkblcaablsbkzzzkblibaaablsbbbbblibaaaaabcrrlllcbaaaaaaaabbbbbaaaaa";\n else\n createTiddlyElement(place,"span",null,"errorNoSuchMacro","unknown smiley");\n if(imageMap)\n {\n var box = createTiddlyElement(place,"span",null,"smiley",String.fromCharCode(160));\n box.style.position = "relative";\n box.style.width = "15px";\n box.style.height = "15px";\n box.style.marginLeft = "1px";\n box.style.marginRight = "1px";\n box.style.paddingRight = "12px";\n box.style.verticalAlign = "top";\n\n //now divide into 15x15 grid and create each pixel\n // rows\n for(r=0; r<15; r++)\n {\n // columns\n for(c=0; c<15; c++)\n {\n //create each pixel with the correct background\n var pix = document.createElement("img");\n pix.className = "smileyPixel";\n pix.style.position = "absolute";\n pix.border = 0;\n pix.style.top = r + "px";\n pix.style.left = c + "px";\n pix.style.width = "1px";\n pix.style.height = "1px";\n pix.style.backgroundColor = palette[imageMap.charCodeAt((r*15)+c)-97];\n pix.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";\n box.appendChild(pix);\n }\n }\n }\n}\n//}}}
/***\n|''Name:''|SpanishMacro|\n|''Version:''|1.1.0 (21-May-2006)|\n|''Author:''|dev_eddie|\n|''Type:''|Translation Plugin|\n!Description\nThere is a [[SpanishPlugin]] which is supposed to translate non-macro strings, and to be much safer.\nBoth plugins would conform es_ES\n\n!Revision History\n* 1.1.0 (21-May-2006) by dev_eddie\n\n!Code\n***/\n//{{{\n\nconfig.macros.search.label = "búsqueda";\nconfig.macros.search.prompt = "Buscar en este TiddlyWiki";\n//config.macros.search.accessKey = "F";\nconfig.macros.search.successMsg = "%0 entradas para %1";\nconfig.macros.search.failureMsg = "No hay entradas para %0";\nconfig.macros.tagging.label = "tagging";\nconfig.macros.tagging.labelNotTag = "sin tagging";\nconfig.macros.tagging.tooltip = "Lista de entradas marcadas con %0";\nconfig.macros.allTags.tooltip = "Mostrar todas las entradas marcadas con %0";\nconfig.macros.allTags.noTags = "No hay entradas marcadas";\nconfig.macros.list.all.prompt = "Todas las entradas en orden alfabético";\nconfig.macros.list.missing.prompt = "Entradas con enlaces no definidas";\nconfig.macros.list.orphans.prompt = "Entradas no enlazadas por otras entradas";\nconfig.macros.list.shadowed.prompt = "Entradas sombreadas con contenido por defecto";\nconfig.macros.closeAll.label = "cerrar todo";\nconfig.macros.closeAll.prompt = "Cerrar todas las entradas mostradas (excepto las que esten siendo editadas)";\n//config.macros.permaview.label = " permaview ";\n//config.macros.permaview.prompt = "Enlace a una URL que devuelve las entradas mostradas actualmente";\nconfig.macros.saveChanges.label = "guardar cambios";\nconfig.macros.saveChanges.prompt = "Guardar todas las entradas para crear un nuevo TiddlyWiki";\n//config.macros.saveChanges.accessKey = "S";\nconfig.macros.newTiddler.label = "nueva entrada";\nconfig.macros.newTiddler.prompt = "Crea una nueva entrada";\nconfig.macros.newTiddler.title = "Nueva Entrada";\nconfig.macros.newTiddler.accessKey = "N";\nconfig.macros.newJournal.label = "nuevo diario";\nconfig.macros.newJournal.prompt = "Crea una nueva entrada desde la fecha y hora actuales";\nconfig.macros.newJournal.accessKey="J";\n\n//}}}\n\n//{{{\n\nconfig.commands.closeTiddler.text = "cerrar";\nconfig.commands.closeTiddler.tooltip = "Cerrar esta entrada";\nconfig.commands.closeOthers.text = "cerrar otros"\nconfig.commands.closeOthers.tooltip = "Cerrar las otras entradas";\nconfig.commands.editTiddler.text = "editar";\nconfig.commands.editTiddler.tooltip="Edita esta entrada";\nconfig.commands.editTiddler.readOnlyText="ver";\nconfig.commands.editTiddler.readOnlyTooltip="Ver la fuente de esta entrada";\nconfig.commands.saveTiddler.text = "hecho";\nconfig.commands.saveTiddler.tooltip = "Guardar los cambios a esta entrada";\nconfig.commands.cancelTiddler.text = "cancelar";\nconfig.commands.cancelTiddler.tooltip = "Deshacer los cambios a esta entrada";\nconfig.commands.cancelTiddler.warning = "¿Está seguro de querer abandonar los cambios a %0";\nconfig.commands.cancelTiddler.readOnlyText = "hecho";\nconfig.commands.cancelTiddler.readOnlyTooltip = "Ver esta entrada normalmente";\nconfig.commands.deleteTiddler.text = "borrar";\nconfig.commands.deleteTiddler.tooltip = "Borra esta entrada";\nconfig.commands.deleteTiddler.warning = "¿Está seguro de querer borrar '%0'?";\n//config.commands.permalink.text = "permalink";\nconfig.commands.permalink.tooltip = " Permalink a esta entrada";\nconfig.commands.references.text = "referencias";\nconfig.commands.references.tooltip = "Muestra las entradas que enlazan a esta entrada";\nconfig.commands.references.popupNone = "Sin referencias";\nconfig.commands.jump.text = "Saltar";\nconfig.commands.jump.tooltip = "Saltar a otra entrada abierta";\n\n//}}}\n
/***\n|''Name:''|SpanishPlugin|\n|''Version:''|1.0.2 (21-May-2006)|\n|''Author:''|dev_eddie|\n|''Type:''|Translation Plugin|\n!Description\nThere is a [[SpanishMacro]] which is supposed to translate macro strings, too. \n\n!Revision History\n* 1.0.2 (21-May-2006) by dev_eddie\n\n!Code\n***/\n//{{{\n\nversion.extensions.SpanishPlugin= {\n major: 0, minor: 3, revision: 0, \n date: new Date(2006,5,21),\n type: 'translation',\n source: 'http://eddie.tiddlyspot.com/#SpanishPlugin'\n};\n\n// Messages\nconfig.messages = {\n customConfigError: "Error en la entrada systemConfig '%1' - %0",\n savedSnapshotError: "Parece que el TiddlyWiki fué incorrectamente guardado. Vea http://www.tiddlywiki.com/#DownloadSoftware para detalles",\n subtitleUnknown: "(desconocido)",\n undefinedTiddlerToolTip: "La entrada '%0' no existe aún",\n shadowedTiddlerToolTip: "La entrada '%0' no existe aún, pero tiene un valor predefinido sombreado",\n tiddlerLinkTooltip: "%0 - %1, %2",\n externalLinkTooltip: "Enlace externo %0",\n noTags: "No hay entradas marcadas",\n notFileUrlError: "Necesita guardar este TiddlyWiki a un archivo antes de poder guardar cambios",\n cantSaveError: "No es posible guardar cambios. Eso puede ser porque su navegador no soporte guardar (pruebe Firefox), o porque la ruta a su TiddlyWiki contenga caracteres ilegales",\n invalidFileError: "El archivo original '%0' no parece ser un TiddlyWiki válido",\n backupSaved: "Backup guardado",\n backupFailed: "Fallo guardando el archivo de backup",\n rssSaved: "RSS feed guardado",\n rssFailed: "Fallo guardando el archivo RSS feed",\n emptySaved: "Plantilla guardada",\n emptyFailed: "Fallo guardando el archivo de plantilla",\n mainSaved: "TiddlyWiki principal guardado",\n mainFailed: "Fallo guardando el archivo principal TiddlyWiki. Sus cambios no fueron guardados",\n macroError: "Error en la macro <<%0>>",\n macroErrorDetails: "Error mientras se ejecutaba la macro <<%0>>:\sn%1",\n missingMacro: "No existe esa macro",\n overwriteWarning: "Una entrada llamada '%0' ya existe. Elige OK para sobreescribirla",\n unsavedChangesWarning: "CUIDADO! Hay cambios sin guardar en TiddlyWiki\sn\snElija OK para guardar\snElija CANCELAR para descartar",\n confirmExit: "--------------------------------\sn\snHay cambios sin guardar en TiddlyWiki. Si continúa perderá esos cambios\sn\sn--------------------------------",\n saveInstructions: "SaveChanges",\n messageClose: {text: "cerrar", tooltip: "cierra este área de mensajes"},\n dates: {\n months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre","Diciembre"],\n days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]\n }\n };\n\n// More messages (rather a legacy layout that shouldn't really be like this)\nconfig.views = {\n wikified: {\n tag: {labelNoTags: "sin tags", labelTags: "tags: ", openTag: "Abrir tag '%0'", tooltip: "Mostrar entradas marcadas con '%0'", openAllText: "Abrir todo", openAllTooltip: "Abrir todas estas entradas", popupNone: "Ninguna entrada marcada con '%0'"},\n defaultText: "La entrada '%0' no existe aún. Doble-click para crearla",\n defaultModifier: "(perdido)",\n shadowModifier: "(sombra)"\n },\n editor: {\n tagPrompt: "Escribe los tags separados con espacios, [[usa corchetes dobles]] o añade",\n tagChooser: {text: "tags", tooltip: "Elige tags que añador a esta entrada", popupNone: "No hay tags definidos", tagTooltip: "Añade el tag '%0'"},\n defaultText: "Escribe el texto para '%0'"\n }\n };\n\n//}}}
/***\n!Devfire\nStyle by Clint Checketts (http://www.checkettsweb.com) for TiddlyWiki 2.0\nInspired by the GLP'd Darkfire Wordpress skin.\n\n!Sections in this Tiddler:\n*Generic rules\n*Links styles\n*Header\n*Main menu\n*Sidebar\n**Sidebar options\n**Sidebar tabs\n*Message area\n*Popup\n*Tabs\n*Tiddler display\n**Viewer\n**Editor\n*Misc. rules\n!Generic rules /% ============================================================= %/\n***/\n/*{{{*/\nbody {\nbackground-color: #000;\n}\n/*}}}*/\n/***\n!Link styles /% ============================================================= %/\n***/\n/*{{{*/\na,\na.button,\n#mainMenu a.button,\n#sidebarOptions .sliderPanel a{\n color: #ffbf00;\n border: 0;\n}\n\na:hover,\na.button:hover,\n#mainMenu a.button:hover,\n#sidebarOptions .sliderPanel a:hover\n#sidebarOptions .sliderPanel a:active{\n color: #ff7f00;\n border: 0;\n border-bottom: #ff7f00 1px dashed;\n background: transparent;\n text-decoration: none;\n}\n\n#displayArea .button.highlight{\n color: #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Header styles /% ============================================================= %/\n***/\n/*{{{*/\n.header{\n border-bottom: 2px solid #ffbf00;\n color: #fff;\n}\n\n.headerForeground a {\n color: #fff;\n}\n\n.header a:hover {\n border-bottom: 1px dashed #fff;\n}\n/*}}}*/\n/***\n!Main menu styles /% ============================================================= %/\n***/\n/*{{{*/\n#mainMenu {color: #fff;}\n#mainMenu h1{\n font-size: 1.1em;\n}\n#mainMenu li,#mainMenu ul{\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*}}}*/\n/***\n!Sidebar styles /% ============================================================= %/\n***/\n/*{{{*/\n#sidebar {\n right: 0;\n color: #fff;\n border: 2px solid #ffbf00;\n border-width: 0 0 2px 2px;\n}\n#sidebarOptions {\n background-color: #4c4c4c;\n padding: 0;\n}\n\n#sidebarOptions a{\n margin: 0;\n color: #ffbf00;\n border: 0;\n}\n#sidebarOptions a:hover {\n color: #4c4c4c;\n background-color: #ffbf00;\n\n}\n\n#sidebarOptions a:active {\n color: #ffbf00;\n background-color: transparent;\n}\n\n#sidebarOptions .sliderPanel {\n background-color: #333;\n margin: 0;\n}\n\n#sidebarTabs {background-color: #4c4c4c;}\n#sidebarTabs .tabSelected {\n padding: 3px 3px;\n cursor: default;\n color: #ffbf00;\n background-color: #666;\n}\n#sidebarTabs .tabUnselected {\n color: #ffbf00;\n background-color: #5f5f5f;\n padding: 0 4px;\n}\n\n#sidebarTabs .tabUnselected:hover,\n#sidebarTabs .tabContents {\n background-color: #666;\n}\n\n.listTitle{color: #FFF;}\n#sidebarTabs .tabContents a{\n color: #ffbf00;\n}\n\n#sidebarTabs .tabContents a:hover{\n color: #ff7f00;\n background: transparent;\n}\n\n#sidebarTabs .txtMoreTab .tabSelected,\n#sidebarTabs .txtMoreTab .tab:hover,\n#sidebarTabs .txtMoreTab .tabContents{\n color: #ffbf00;\n background: #4c4c4c;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #ffbf00;\n background: #5f5f5f;\n}\n\n.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}\n.tab.tabUnselected {background-color: #666;}\n.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}\n.tabContents {\n background-color: #4c4c4c;\n border: 0;\n}\n.tabContents .tabContents{background: #666;}\n.tabContents .tabSelected{background: #666;}\n.tabContents .tabUnselected{background: #5f5f5f;}\n.tabContents .tab:hover{background: #666;}\n/*}}}*/\n/***\n!Message area styles /% ============================================================= %/\n***/\n/*{{{*/\n#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}\n#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}\n#messageArea a:hover {color: #ff7f00;}\n#messageArea a:active {color: #ff7f00;}\n#messageArea .messageToolbar a{\n border: 1px solid #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Popup styles /% ============================================================= %/\n***/\n/*{{{*/\n#popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n#popup a {color: #ffbf00; }\n#popup a:hover { background: transparent; color: #ff7f00; border: 0;}\n#popup hr {color: #ffbf00; background: #ffbf00;}\n/*}}}*/\n/***\n!Tiddler Display styles /% ============================================================= %/\n***/\n/*{{{*/\n.title{color: #fff;}\nh1, h2, h3, h4, h5 {\n color: #fff;\n background-color: transparent;\n border-bottom: 1px solid #333;\n}\n\n.subtitle{\n color: #666;\n}\n\n.viewer {color: #fff; }\n\n.viewer table{background: #666; color: #fff;}\n\n.viewer th {background-color: #996; color: #fff;}\n\n.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n\n.viewer hr {color: #666;}\n\n.tiddler .button {color: #4c4c4c;}\n.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}\n.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}\n\n.toolbar {\n color: #4c4c4c;\n}\n\n.toolbar a.button,\n.editorFooter a{\n border: 0;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selectedTiddler .footer {\n color: #888;\n}\n\n.highlight, .marked {\n color: #000;\n background-color: #ffe72f;\n}\n.editorFooter {\n color: #aaa;\n}\n\n.tab{\n-moz-border-radius-topleft: 3px;\n-moz-border-radius-topright: 3px;\n}\n\n.tagging,\n.tagged{\n background: #4c4c4c;\n border: 1px solid #4c4c4c; \n}\n\n.selected .tagging,\n.selected .tagged{\n background: #000;\n border: 1px solid #ffbf00;\n}\n\n.tagging .listTitle,\n.tagged .listTitle{\n color: #fff;\n}\n\n.tagging .button,\n.tagged .button{\n color: #ffbf00;\n border: 0;\n padding: 0;\n}\n\n.tagging .button:hover,\n.tagged .button:hover{\nbackground: transparent;\n}\n/*}}}*//***\n!Devfire\nStyle by Clint Checketts (http://www.checkettsweb.com) for TiddlyWiki 2.0\nInspired by the GLP'd Darkfire Wordpress skin.\n\n!Sections in this Tiddler:\n*Generic rules\n*Links styles\n*Header\n*Main menu\n*Sidebar\n**Sidebar options\n**Sidebar tabs\n*Message area\n*Popup\n*Tabs\n*Tiddler display\n**Viewer\n**Editor\n*Misc. rules\n!Generic rules /% ============================================================= %/\n***/\n/*{{{*/\nbody {\nbackground-color: #000;\n}\n/*}}}*/\n/***\n!Link styles /% ============================================================= %/\n***/\n/*{{{*/\na,\na.button,\n#mainMenu a.button,\n#sidebarOptions .sliderPanel a{\n color: #ffbf00;\n border: 0;\n}\n\na:hover,\na.button:hover,\n#mainMenu a.button:hover,\n#sidebarOptions .sliderPanel a:hover\n#sidebarOptions .sliderPanel a:active{\n color: #ff7f00;\n border: 0;\n border-bottom: #ff7f00 1px dashed;\n background: transparent;\n text-decoration: none;\n}\n\n#displayArea .button.highlight{\n color: #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Header styles /% ============================================================= %/\n***/\n/*{{{*/\n.header{\n border-bottom: 2px solid #ffbf00;\n color: #fff;\n}\n\n.headerForeground a {\n color: #fff;\n}\n\n.header a:hover {\n border-bottom: 1px dashed #fff;\n}\n/*}}}*/\n/***\n!Main menu styles /% ============================================================= %/\n***/\n/*{{{*/\n#mainMenu {color: #fff;}\n#mainMenu h1{\n font-size: 1.1em;\n}\n#mainMenu li,#mainMenu ul{\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*}}}*/\n/***\n!Sidebar styles /% ============================================================= %/\n***/\n/*{{{*/\n#sidebar {\n right: 0;\n color: #fff;\n border: 2px solid #ffbf00;\n border-width: 0 0 2px 2px;\n}\n#sidebarOptions {\n background-color: #4c4c4c;\n padding: 0;\n}\n\n#sidebarOptions a{\n margin: 0;\n color: #ffbf00;\n border: 0;\n}\n#sidebarOptions a:hover {\n color: #4c4c4c;\n background-color: #ffbf00;\n\n}\n\n#sidebarOptions a:active {\n color: #ffbf00;\n background-color: transparent;\n}\n\n#sidebarOptions .sliderPanel {\n background-color: #333;\n margin: 0;\n}\n\n#sidebarTabs {background-color: #4c4c4c;}\n#sidebarTabs .tabSelected {\n padding: 3px 3px;\n cursor: default;\n color: #ffbf00;\n background-color: #666;\n}\n#sidebarTabs .tabUnselected {\n color: #ffbf00;\n background-color: #5f5f5f;\n padding: 0 4px;\n}\n\n#sidebarTabs .tabUnselected:hover,\n#sidebarTabs .tabContents {\n background-color: #666;\n}\n\n.listTitle{color: #FFF;}\n#sidebarTabs .tabContents a{\n color: #ffbf00;\n}\n\n#sidebarTabs .tabContents a:hover{\n color: #ff7f00;\n background: transparent;\n}\n\n#sidebarTabs .txtMoreTab .tabSelected,\n#sidebarTabs .txtMoreTab .tab:hover,\n#sidebarTabs .txtMoreTab .tabContents{\n color: #ffbf00;\n background: #4c4c4c;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #ffbf00;\n background: #5f5f5f;\n}\n\n.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}\n.tab.tabUnselected {background-color: #666;}\n.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}\n.tabContents {\n background-color: #4c4c4c;\n border: 0;\n}\n.tabContents .tabContents{background: #666;}\n.tabContents .tabSelected{background: #666;}\n.tabContents .tabUnselected{background: #5f5f5f;}\n.tabContents .tab:hover{background: #666;}\n/*}}}*/\n/***\n!Message area styles /% ============================================================= %/\n***/\n/*{{{*/\n#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}\n#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}\n#messageArea a:hover {color: #ff7f00;}\n#messageArea a:active {color: #ff7f00;}\n#messageArea .messageToolbar a{\n border: 1px solid #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Popup styles /% ============================================================= %/\n***/\n/*{{{*/\n#popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n#popup li.disabled{color: #ffbf00;}\n\n#popup a {color: #ffbf00; }\n#popup a:hover { background: transparent; color: #ff7f00; border: 0;}\n#popup hr {color: #ffbf00; background: #ffbf00;}\n/*}}}*/\n/***\n!Tiddler Display styles /% ============================================================= %/\n***/\n/*{{{*/\n.title{color: #fff;}\nh1, h2, h3, h4, h5 {\n color: #fff;\n background-color: transparent;\n border-bottom: 1px solid #333;\n}\n\n.subtitle{\n color: #666;\n}\n\n.viewer {color: #fff; }\n\n.viewer table{background: #666; color: #fff;}\n\n.viewer th {background-color: #996; color: #fff;}\n\n.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00}\n\n.viewer hr {color: #666;}\n\n.tiddler .button {color: #4c4c4c;}\n.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}\n.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}\n\n.toolbar {\n color: #4c4c4c;\n}\n\n.toolbar a.button,\n.editorFooter a{\n border: 0;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selectedTiddler .footer {\n color: #888;\n}\n\n.highlight, .marked {\n color: #000;\n background-color: #ffe72f;\n}\n.editorFooter {\n color: #aaa;\n}\n\n.tab{\n-moz-border-radius-topleft: 3px;\n-moz-border-radius-topright: 3px;\n}\n\n.tagging,\n.tagged{\n background: #4c4c4c;\n border: 1px solid #4c4c4c; \n}\n\n.selected .tagging,\n.selected .tagged{\n background: #000;\n border: 1px solid #ffbf00;\n}\n\n.tagging .listTitle,\n.tagged .listTitle{\n color: #fff;\n}\n\n.tagging .button,\n.tagged .button{\n color: #ffbf00;\n border: 0;\n padding: 0;\n}\n\n.tagging .button:hover,\n.tagged .button:hover{\nbackground: transparent;\n}\n\n.cascade {\n background: #4c4c4c;\n color: #ddd;\n border: 1px solid #ffbf00;\n}\n/*}}}*/
/***\nJavascript implementation of ''T''iny ''E''ncryption ''A''lgorythm\nTaken from [[Movable Type Script|http://www.movable-type.co.uk/scripts/TEAblock.html]]\n***/\n//{{{\n//\n// TEAencrypt: Use Corrected Block TEA to encrypt plaintext using password\n// (note plaintext & password must be strings not string objects)\n//\n// Return encrypted text as string\n//\nfunction TEAencrypt(plaintext, password)\n{\n if (plaintext.length == 0) return(''); // nothing to encrypt\n // 'escape' plaintext so chars outside ISO-8859-1 work in single-byte packing, but \n // keep spaces as spaces (not '%20') so encrypted text doesn't grow too long, and \n // convert result to longs\n var v = strToLongs(escape(plaintext).replace(/%20/g,' '));\n if (v.length == 1) v[1] = 0; // algorithm doesn't work for n<2 so fudge by adding nulls\n var k = strToLongs(password.slice(0,16)); // simply convert first 16 chars of password as key\n var n = v.length;\n\n var z = v[n-1], y = v[0], delta = 0x9E3779B9;\n var mx, e, q = Math.floor(6 + 52/n), sum = 0;\n\n while (q-- > 0) { // 6 + 52/n operations gives between 6 & 32 mixes on each word\n sum += delta;\n e = sum>>>2 & 3;\n for (var p = 0; p < n-1; p++) {\n y = v[p+1];\n mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z)\n z = v[p] += mx;\n }\n y = v[0];\n mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z)\n z = v[n-1] += mx;\n }\n // note use of >>> in place of >> due to lack of 'unsigned' type in JavaScript \n\n return escCtrlCh(longsToStr(v));\n}\n\n//\n// TEAdecrypt: Use Corrected Block TEA to decrypt ciphertext using password\n//\nfunction TEAdecrypt(ciphertext, password)\n{\n if (ciphertext.length == 0) return('');\n var v = strToLongs(unescCtrlCh(ciphertext));\n var k = strToLongs(password.slice(0,16)); \n var n = v.length;\n\n var z = v[n-1], y = v[0], delta = 0x9E3779B9;\n var mx, e, q = Math.floor(6 + 52/n), sum = q*delta;\n\n while (sum != 0) {\n e = sum>>>2 & 3;\n for (var p = n-1; p > 0; p--) {\n z = v[p-1];\n mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z)\n y = v[p] -= mx;\n }\n z = v[n-1];\n mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z)\n y = v[0] -= mx;\n sum -= delta;\n }\n\n var plaintext = longsToStr(v);\n // strip trailing null chars resulting from filling 4-char blocks:\n if (plaintext.search(/\s0/) != -1) plaintext = plaintext.slice(0, plaintext.search(/\s0/));\n\n return unescape(plaintext);\n}\n\n\n// supporting functions\n\nfunction strToLongs(s) { // convert string to array of longs, each containing 4 chars\n // note chars must be within ISO-8859-1 (with Unicode code-point < 256) to fit 4/long\n var l = new Array(Math.ceil(s.length/4))\n for (var i=0; i<l.length; i++) {\n // note little-endian encoding - endianness is irrelevant as long as \n // it is the same in longsToStr() \n l[i] = s.charCodeAt(i*4) + (s.charCodeAt(i*4+1)<<8) + \n (s.charCodeAt(i*4+2)<<16) + (s.charCodeAt(i*4+3)<<24);\n }\n return l; // note running off the end of the string generates nulls since \n} // bitwise operators treat NaN as 0\n\nfunction longsToStr(l) { // convert array of longs back to string\n var a = new Array(l.length);\n for (var i=0; i<l.length; i++) {\n a[i] = String.fromCharCode(l[i] & 0xFF, l[i]>>>8 & 0xFF, \n l[i]>>>16 & 0xFF, l[i]>>>24 & 0xFF);\n }\n return a.join(''); // use Array.join() rather than repeated string appends for efficiency\n}\n\nfunction escCtrlCh(str) { // escape control chars which might cause problems with encrypted texts\n return str.replace(/[\s0\sn\sv\sf\sr\sxa0!]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });\n}\n\nfunction unescCtrlCh(str) { // unescape potentially problematic nulls and control characters\n return str.replace(/!\sd\sd?\sd?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });\n}\n//}}}\n
/***\n''Name:'' TWUpdate\n''Author:'' Tom Otvos\n''Version:'' 1.0\n\n***/\n//{{{\n\nversion.extensions.twupdate = {major: 1, minor: 0, revision: 0, date: new Date(2006,4,23,0,0,0,0), source: "http://www.dcubed.ca/"};\n\nconfig.macros.twupdate = { \n label: "update",\n sourceUrl: "http://www.tiddlywiki.com/empty.html", \n lingo: {\n prompt: "Update this TiddlyWiki from TiddlyWiki.com", \n warning: "Are you sure you want to update this document with the latest version of TiddlyWiki (and do you know that all your plugins are compatible)?\sn\snIf you want to continue, your document will first be saved with a backup.",\n success: "Update was successful. Click on 'OK' to reload the document",\n errNoHttp: "Unable to allocate an HTTP request object for the update",\n errIncompatible: "This version of TiddlyWiki cannot be updated by this plugin. Sorry.",\n progressLoading: "Getting update from TiddlyWiki.com...",\n progressLoadSuccess: "File successfully loaded",\n progressLoadFailure: "File was not loaded successfully (%0)",\n progressMerging: "Merging with existing document..."\n }\n}\n\nconfig.macros.twupdate.handler = function(place,macroName,params)\n{\n if(!readOnly) {\n var label = params[0] ? params[0] : this.label;\n createTiddlyButton(place, label, this.lingo.prompt, this.onClick, null, null, null);\n }\n}\n\nconfig.macros.twupdate.onClick = function(e)\n{\n if (version.major != 2 || version.minor != 0 || version.revision < 7) {\n alert(config.macros.twupdate.lingo.errIncompatible);\n return;\n }\n \n if (!confirm(config.macros.twupdate.lingo.warning)) return;\n\n try {\n // force a save with backup\n var saveBackups = config.options.chkSaveBackups;\n config.options.chkSaveBackups = true;\n saveChanges();\n config.options.chkSaveBackups = saveBackups;\n \n var ajax = new AjaxHelper();\n displayMessage(config.macros.twupdate.lingo.progressLoading);\n ajax.getText(config.macros.twupdate.sourceUrl, config.macros.twupdate.performUpdate); \n }\n catch (e) {\n alert(e);\n }\n\n return false;\n}\n\n// Courtesy of http://www.worldtimzone.com/res/encode/...\nfunction utf8(wide) {\n var c, s;\n var enc = "";\n var i = 0;\n while(i<wide.length) {\n c= wide.charCodeAt(i++);\n // handle UTF-16 surrogates\n if (c>=0xDC00 && c<0xE000) continue;\n if (c>=0xD800 && c<0xDC00) {\n if (i>=wide.length) continue;\n s= wide.charCodeAt(i++);\n if (s<0xDC00 || c>=0xDE00) continue;\n c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;\n }\n // output value\n if (c<0x80) enc += String.fromCharCode(c);\n else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));\n else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));\n else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));\n }\n return enc;\n}\n\nconfig.macros.twupdate.performUpdate = function(emptyHtml, status, statusText)\n{\n // note that this is begin called from a callback from an event handler, so\n // "this" is most definitely not defined!\n \n if (status == 200)\n displayMessage(config.macros.twupdate.lingo.progressLoadSuccess);\n else {\n displayMessage(config.macros.twupdate.lingo.progressLoadFailure.format([statusText]));\n return;\n }\n displayMessage(config.macros.twupdate.lingo.progressMerging);\n \n // very important...convert the response to UTF-8 to be fully TW-compatible\n var re = /[^\su0000-\su007F]/g ;\n emptyHtml = emptyHtml.replace(re, function($0) {return(utf8($0));});\n \n // the bulk of this is cribbed from saveChanges()...\n var originalPath = document.location.toString();\n // Check we were loaded from a file URL\n if (originalPath.substr(0,5) != "file:") {\n alert(config.messages.notFileUrlError);\n if (store.tiddlerExists(config.messages.saveInstructions))\n displayTiddler(null,config.messages.saveInstructions);\n return;\n }\n var localPath = getLocalPath(originalPath);\n\n // Locate the storeArea div's\n var posOpeningDiv = emptyHtml.indexOf(startSaveArea);\n var posClosingDiv = emptyHtml.lastIndexOf(endSaveArea);\n if ((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n alert(config.messages.invalidFileError.format(['empty.html']));\n return;\n }\n\n // Save new file\n var revised = emptyHtml.substr(0,posOpeningDiv + startSaveArea.length) + \n convertUnicodeToUTF8(allTiddlersAsHtml()) + "\sn\st\st" +\n emptyHtml.substr(posClosingDiv);\n var newSiteTitle = convertUnicodeToUTF8((wikifyPlain("SiteTitle") + " - " + wikifyPlain("SiteSubtitle")).htmlEncode());\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n var save = saveFile(localPath, revised);\n if (save) {\n displayMessage(config.messages.mainSaved, "file://" + localPath);\n store.setDirty(false);\n alert(config.macros.twupdate.lingo.success);\n document.location.reload();\n }\n else\n alert(config.messages.mainFailed);\n}\n\nfunction AjaxHelper()\n{\n this.http = null;\n \n try\n {\n this.http = new XMLHttpRequest()\n }\n \n catch(e)\n {\n // if we don't get an internal object, try allocating it using ActiveX, with successive\n // fallbacks to earlier MSXML versions as necessary\n try\n {\n this.http = new ActiveXObject("Msxml2.XMLHTTP.4.0")\n } \n catch(e) \n {\n try\n {\n this.http = new ActiveXObject("MSXML2.XMLHTTP")\n } \n catch(e) \n {\n try\n {\n this.http = new ActiveXObject("Microsoft.XMLHTTP")\n } \n catch(e) \n {\n this.http = null\n }\n }\n }\n }\n \n if (!this.http) throw 'Unable to allocate an HTTP request object';\n}\n\nAjaxHelper.prototype.getText = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("GET", url, callback, async, true, false);\n}\n\nAjaxHelper.prototype.getXML = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("GET", url, callback, async, true, true);\n}\n\nAjaxHelper.prototype.getHead = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("HEAD", url, callback, async, false, false);\n}\n\nAjaxHelper.prototype.abort = function()\n{\n if (this.http) this.http.abort();\n}\n\nAjaxHelper.prototype.setRequestHeader = function(name, value)\n{\n if (this.http) this.http.setRequestHeader(name, value);\n}\n\nAjaxHelper.prototype._request = function(method, url, callback, async, hasResponse, hasResponseXML)\n{\n if (!this.http) return;\n \n // get reference to request object so we can use it in closure\n var xmlHttp = this.http, helper = this;\n xmlHttp.onreadystatechange = function()\n {\n if (!async) return;\n if (xmlHttp.readyState == 4)\n callback((hasResponse ? (hasResponseXML ? xmlHttp.responseXML : xmlHttp.responseText) : null), xmlHttp.status, xmlHttp.statusText, helper._parsedResponseHeaders());\n }\n \n try {\n // need some cross-domain privileges for Firefox\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n } \n catch (e) \n {\n }\n \n xmlHttp.open(method, url, async);\n xmlHttp.send(null);\n if (!async) callback((hasResponse ? (hasResponseXML ? xmlHttp.responseXML : xmlHttp.responseText) : null), xmlHttp.status, xmlHttp.statusText, this._parsedResponseHeaders());\n }\n \n catch (e)\n {\n alert(e);\n }\n}\n\nAjaxHelper.prototype._parsedResponseHeaders = function()\n{\n if (this.http) {\n var headersArray = new Array();\n var headers = this.http.getAllResponseHeaders().split("\sn");\n for (var i = 0; i < headers.length; i++) {\n var h = headers[i].trim();\n if (h.length == 0) continue;\n // value can have ':' so do not use split here!\n var sep = h.indexOf(':');\n headersArray[h.substring(0, sep).trim()] = h.substr(sep + 1).trim();\n }\n return headersArray;\n }\n else\n return null;\n}\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//}}}
/***\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" pane\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!!!!!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.04.30 [1.5.2]''\ndocumentation update\n''2006.04.30 [1.5.1]''\nin save(), when performing "save as" behavior, set current tiddler title (f.current) to new title\n''2006.04.24 [1.5.0]''\nadded 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]''\nlayout adjustments: move system panel above editor panel and move config setting controls to top of system panel\n''2006.04.23 [1.4.5]''\nfix HTML so that click on "readonly" checkbox won't change "minor edits" option value.\n''2006.04.23 [1.4.4]''\nin 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]''\ninit "minor edits" checkbox state from config.options.chkForceMinorEdits value\n''2006.04.23 [1.4.2]''\nadded "TidIDE v#.#.#: " title in front of subsystem checkboxes.\n''2006.04.23 [1.4.1]''\nadded 'readonly' checkbox and handling to editor.\n''2006.04.23 [1.4.0]''\nimplemented '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]''\nLayout 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]''\nassorted code cleanup and optimizations\n''2006.04.22 [1.3.0]''\nadded "tools" section via custom-defined TidIDETools tiddler content\n''2006.04.22 [1.2.2]''\ncorrected 'wrap' and 'white-space' CSS for system viewer textarea control so that IE preserves newlines.\n''2006.04.22 [1.2.1]''\nadded checkbox indicators in options droplist. Allows easy preview of boolean state value for chk* options.\n''2006.04.22 [1.2.0]''\nadded 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]''\nmigrated remaining functionality from ToolkitPlugin (now obsolete).\n''2006.04.21 [1.1.0]''\nadded "system" display and supporting functions\n''2006.04.21 [1.0.1]''\nadded formatHTML() for better HTML display in preview\n''2006.04.20 [1.0.0] 4:20:00pm''\nofficial release... renamed from ~TiddlerEditorPlugin to TidIDEPlugin. (pronounced "Tie Dyed"... dude!)\n''2006.04.20 [0.9.9]''\nadded "run" button to dynamically load systemConfig plugins (with warning/confirmation)\n''2006.04.20 [0.9.8]''\nlayout adjustments for narrow displays\n''2006.04.20 [0.9.7]''\nadded HTML viewer to preview display\n''2006.04.20 [0.9.6]''\nadded DOM viewer to preview display\n''2006.04.19 [0.9.5]''\nimproved save() handler so saving 'unnamed' edit does fallback to 'save as' prompt for tiddler name\n''2006.04.19 [0.9.4]''\nadded 'preview status' display field and refresh button. Currently shows preview rendering time and autofreeze notice, if any.\n''2006.04.19 [0.9.3]''\ncorrect IE object error by explicitly using "window." scope when referencing addKeyDownHandlers() function definition\n''2006.04.18 [0.9.2]''\nif TextAreaPlugin is installed, call addKeyDownHandlers() for extended ctrl-F/G and TAB keystrokes in textarea\n''2006.04.18 [0.9.1]''\n"save as" now presents an "overwriteWarning" message box instead of always rejecting existing tiddler titles\n''2006.04.18 [0.9.0]''\nadded "save as". Use TW standard text for new tiddler title and default text\n''2006.04.18 [0.8.5]''\nadded "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]''\nadded cookie for 'auto-freeze' time limit. Also, added more documentation.\n''2006.04.17 [0.8.3]''\nadded timing wrapper around preview wikify(). Automatically freeze preview display if tiddler rendering exceeds time limit;\n''2006.04.17 [0.8.2]''\nmore code cleanup for better 'dirty' flag handling''2006.04.17 [0.8.1]''\nshow/hide freeze checkbox when toggling preview display. Also, code cleanup for better 'multiple instance' definition\n''2006.04.17 [0.8.0]''\nadded "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]''\ncorrect month number offset (was 0-11 instead of 1-12)\n''2006.04.16 [0.7.0]''\nadded support for 'dirty' flag, read-only mode and improved alert/confirm/prompt handling\n''2006.04.16 [0.6.0]''\ncreated "add/remove" functions. Added handling to trigger autoSave() if option is set.\n''2006.04.15 [0.5.1]''\nmove 'save' logic to separate function, and added handling to create a 'real' tiddler when saving a shadow\n''2006.04.15 [0.5.0]''\nInitial 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: 2, date: new Date(2006,4,30)};\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 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 while (p) {\n if (p.substr(0,3)=="id:")\n { id=p.substr(3); }\n else if (p.substr(0,4)=="edit") {\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 panels+=this.html.editorpanel;\n // editor panel setup...\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++) tiddlerlist+="<option value='"+tiddlers[t].title+"'>"+tiddlers[t].title+"</option>";\n for (var t in config.shadowTiddlers) 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++) 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 var toolname=this.systemLabel;\n if (p.indexOf('|')!=-1) toolname=p.substr(0,p.indexOf('|'));\n selectors+=this.html.systemchk.replace(/%toolname%/mg,toolname);\n panels+=this.html.systempanel;\n }\n else {\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 panels+=this.html.toolspanel.replace(/%toolid%/mg,toolid);\n }\n p=params.shift(); // next param\n }\n var html=this.html.framework;\n html=html.replace(/%version%/mg,this.versionMsg.format([version.extensions.tidIDE.major,version.extensions.tidIDE.minor,version.extensions.tidIDE.revision]));\n html=html.replace(/%selector%/mg,selectors);\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 // 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.getsys=function(id) {\n var place=document.getElementById(id+"_systempanel"); if (!place) return;\n\n function showObject(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\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],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,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,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,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 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(/ (cookie)/,'')\n var value=f.config_view.value;\n config.options[name]=value;\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% <hr style='margin:0;padding:0'> %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' CHECKED \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' \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='' \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:none;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:none;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">TiddlyWiki internal 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:100%;font-size:8pt' value=''> \s\n </td><td style='width:20%;text-align:right;white-space:nowrap;border:0;padding:0;margin:0;'> \s\n <input type=button style='display:inline;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='display:inline;width:50%;' value='refresh' title='retrieve current TiddlyWiki options and system values' \s\n onclick='config.macros.tidIDE.getsys(\s"%id%\s")'> \s\n </td></tr><tr><td colspan=3 style='border:0;padding:0;margin:0'> \s\n <!-- system objects --> \s\n <select size=1 name='sys_styles' style='width:25%;font-size:8pt' onchange='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' onchange='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' onchange='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' onchange='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' onchange='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' onchange='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' onchange='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' onchange='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 <div style='white-space:normal'><textarea id='%id%_sysview' name=sysview cols=60 rows=12 \s\n onfocus='this.select()' style='width:100%;height:16em;font-size:8pt'></textarea></div> \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:block;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=12 style='width:100%;height:15em;font-size:8pt;' \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//}}}
/***\n|''Name:''|TiddlerStatsPlugin|\n|''Version:''|$Revision: 13 $ |\n|''Source:''|http://thePettersons.org/tiddlywiki.html#TiddlerStatsPlugin |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|Macro Extension |\n|''Requires:''|TiddlyWiki 2.0.0 or higher |\n!Description\nWant to know how big your TW really is? Want to see how big your biggest tiddler is? TiddlerStats is the answer!\n\nFinds and displays the number of and size of all tiddlers, the biggest, smallest, and average size. Even draws up a sparkline with that info in it!\n\n!Sample\n{{{<<tiddlerStats>>}}}\n<<tiddlerStats>>\n\n!Known issues\n* Sparkline isn't showing up if you embed this macro in a tiddler that's displayed via a slider. This doesn't look like an issue with the macro yet...\n\n!Todo\n* Add support for # of tiddlers changed in last 1..7, 14, 30 days\n\n!Revision history\n$History: PaulsNotepad.html $\n * \n * ***************** Version 5 *****************\n * User: paulpet Date: 3/02/06 Time: 12:17p\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * fixed firefox 1.5.0.1 crash //bug//\n * \n * ***************** Version 4 *****************\n * User: paulpet Date: 2/26/06 Time: 8:48a\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * \n * ***************** Version 3 *****************\n * User: paulpet Date: 2/26/06 Time: 8:47a\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * \n * ***************** Version 2 *****************\n * User: paulpet Date: 2/22/06 Time: 3:41p\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * Ported to TW2.0 fixed standard deviation problem\n\n!Code\n***/\n//{{{\nTiddler.prototype.tiddlerSize = function() {\n var x = 0 ;\n if ( this.title ) x += this.title.length;\n if ( this.text ) x += this.text.length;\n if ( this.modifier) x += this.modifier.length;\n if ( this.modified) x+= this.modified.convertToYYYYMMDDHHMM().length;\n if ( this.created ) x+= this.created.convertToYYYYMMDDHHMM().length;\n if ( this.tags ) {\n var allTags = this.tags.join();\n x += allTags.length;\n }\n return x;\n}\n\n// For backward compatibility with TW 1.2.x\n// from UdoBorkowski\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\nconfig.macros.tiddlerStats = {\ndoStats: function( stats ) {\n stats.average = stats.size / stats.count ;\n\n var ts = 0 ;\n store.forEachTiddler( function( title, tiddler ) {\n var x = tiddler.tiddlerSize() ;\n var t = x - stats.average ;\n ts += Math.pow( t, 2 );\n });\n stats.sdev = Math.sqrt( ts / stats.count ) ;\n\n stats.data = [] ;\n var bucket = parseInt( stats.max / stats.sdev ) + 1;\n for( var i = 0 ; i < bucket; i++ ) \n stats.data[i] = 0 ;\n\n stats.incontrol = 0 ;\n store.forEachTiddler( function( title, tiddler ) {\n var x = tiddler.tiddlerSize() ;\n if (((stats.average - stats.sdev) < x) && (x < (stats.average + stats.sdev))) stats.incontrol++ ;\n bucket = parseInt( x / stats.sdev ) ;\n stats.data[bucket]++ ;\n });\n \n return stats ;\n},\n\nshowStats: function( place, stats ) {\n createTiddlyElement( place, "li", null, null, stats.count + " Tiddlers" ) ;\n createTiddlyElement( place, "li", null, null, stats.size + " bytes (total content size)" ) ;\n createTiddlyElement( place, "li", null, null, stats.average + " is the average tiddler size" ) ;\n createTiddlyElement( place, "li", null, null, stats.sdev + " is the standard deviation" ) ;\n createTiddlyElement( place, "li", null, null, stats.incontrol + " within 1 standard deviation of the average" ) ;\n var li = createTiddlyElement( place, "li", null, null, stats.min + " is the smallest tiddler size " ) ;\n createTiddlyLink( li, stats.smallest, true ) ;\n li = createTiddlyElement( place, "li", null, null, stats.max + " is the largest tiddler size " ) ;\n createTiddlyLink( li, stats.largest, true ) ;\n},\n\nshowSparkle: function( place, stats ) {\n var li = createTiddlyElement( place, "li", null, null, null ) ;\n config.macros.sparkline.handler( li, "sparkline?", stats.data ) ;\n},\n\nshowTable: function( place, stats ) {\n var tbl = createTiddlyElement(place,"table",null,null,"");\n var tb = createTiddlyElement( tbl, "tbody", null, null );\n var tr ;\n for( var i = 0; i < stats.data.length ; i++ ) {\n if ( stats.data[i] > 0 ) {\n tr = createTiddlyElement( tb, "tr", null, null, null );\n createTiddlyElement(tr,"td",null,null, i );\n createTiddlyElement(tr,"td",null,null, (i * stats.sdev) + " < " + ((i+1) * stats.sdev) );\n createTiddlyElement(tr,"td",null,null, stats.data[i] );\n }\n }\n},\n\nhandler: function( place, macroName, params ) {\n var stats = new Object() ;\n stats.count = 0 ;\n stats.size = 0 ;\n stats.min = 99999;\n stats.max = 0 ;\n stats.smallest = 0;\n stats.largest = 0;\n stats.xsquared = 0 ;\n \n store.forEachTiddler(function(title,tiddler) {\n stats.count++ ;\n var x = tiddler.tiddlerSize() ;\n stats.size += x ;\n stats.xsquared += (x^2) ;\n if ( stats.min > x ) {\n stats.min = x ;\n stats.smallest = tiddler.title ;\n }\n if ( stats.max < x ) { \n stats.max = x ;\n stats.largest = tiddler.title ;\n }\n return x;\n });\n \n stats = this.doStats( stats ) ;\n\n createTiddlyElement( place, "b", null, null, "TiddlyWiki usage statistics" ) ;\n var ul = createTiddlyElement( place, "ul", null, null, null ) ;\n this.showStats( ul, stats ) ;\n this.showSparkle( ul, stats ) ;\n this.showTable( place, stats ) ;\n}};\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]\n***/\n
* Añadir los plugins y los temas.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 11/9/2006 20:49:11 | eddie | [[download.htm|file:///C:/Documents%20and%20Settings/eddie/Escritorio/download.htm]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 11/9/2006 20:57:10 | eddie | [[eddie.html|file:///C:/Documents%20and%20Settings/eddie/Escritorio/eddie.html]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 12/9/2006 2:57:59 | eddie | [[eddie(2).html|file:///C:/Documents%20and%20Settings/eddie/Escritorio/eddie(2).html#]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 13/9/2006 0:44:46 | eddie | [[eddie(2).html|file:///C:/Documents%20and%20Settings/eddie/Escritorio/eddie(2).html]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 17/9/2006 2:45:22 | eddie | [[eddie(2).html|file:///C:/Documents%20and%20Settings/eddie/Escritorio/mi%20blog%20nuevo/copia%20local/eddie(2).html#TiddlerStats]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 17/9/2006 13:45:51 | eddie | [[eddie(2).html|file:///C:/Documents%20and%20Settings/eddie/Escritorio/mi%20blog%20nuevo/copia%20local/eddie(2).html#TiddlerStats]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 17/9/2006 21:26:47 | eddie | [[eddie(2).html|file:///C:/Documents%20and%20Settings/eddie/Escritorio/mi%20blog%20nuevo/copia%20local/eddie(2).html]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 17/10/2006 9:51:59 | YourName | [[eddie.html|file:///C:/Documents%20and%20Settings/internet/Escritorio/eddie.html]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 17/10/2006 9:53:7 | eddie | [[eddie.html|file:///C:/Documents%20and%20Settings/internet/Escritorio/eddie.html]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 15/10/2006 4:13:30 | eddie | [[index.html|file:///C:/Documents%20and%20Settings/internet/Escritorio/index.html]] | [[store.cgi|http://eddie.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 3, \n date: new Date(2006,6,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: "Guardar y subir este TiddlyWiki a %0",\n saveLabel: "guardar en la web", \n saveToDisk: "guardar en el disco",\n uploadLabel: "subir" \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 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 if (storeUrl === '') {\n config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\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(false);\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 = "";\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\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n}\n\n//}}}\n////===
/***\n<<viewHtml>>\n<<viewAsJs>>\n***/\n//{{{\n\nconfig.macros.viewHtml = {handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,"Ver como HTML","",function() {\n var divs = document.getElementById("tiddler"+tiddler.title).getElementsByTagName("div");\n for (var i=0;i<divs.length;i++)\n if (divs[i].className == "viewer")\n displayMessage(divs[i].innerHTML);\n });\n}};\n\nString.prototype.escapeLineBreaks = function() {\n // from Tiddler.prototype.escapeLineBreaks\n return this.replace(regexpBackSlash,"\s\ss").replace(regexpNewLine,"\s\sn").replace(regexpCarriageReturn,"");\n}\n\n// this doesn't work right in IE..\nsetStylesheet("#messageArea {overflow:auto; max-height:95%;}","scrollDisplayAreaCSS");\n\nconfig.macros.viewAsJs = {handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,"Ver como JS","",function() {\n displayMessage('config.shadowTiddlers.' + tiddler.title + ' = "' + \n store.getTiddlerText(tiddler.title).escapeLineBreaks().replace(/"/g,'\s\s"') + '";');\n });\n}};\n\n\n//}}}\n
<div class='toolbar' macro='toolbar collapseTiddler collapseOthers -closeTiddler closeOthers fullscreen +editTiddler permalink references jump'><span macro='encrypt'></span><span macro='decrypt'></span></div>\n<div class='viewAsJs' macro='viewAsJs'></div>\n<div class='viewHtml' macro='viewHtml'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD de MMM de YYYY]]'></span> (creado el <span macro='view created date [[DD de MMM de YYYY]]'></span>)| <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>\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>
This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.\nFind out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Settings// &nbsp;&nbsp;@@Make sure you enter your password here.\n<<tiddler tiddlyspotControls>>\n@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to tiddlyspot.com.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy!// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments.
/***\n|''Name:''|YourSearchPlugin|\n|''Version:''|2.0.2 (2006-02-13)|\n|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n<<tiddler [[YourSearch Introduction]]>>\nFor more information see [[Help|YourSearch Help]].\n\n!Compatibility\nThis plugin requires TiddlyWiki 2.0. \nUse http://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1 for older TiddlyWiki versions.\n\n!Revision history\n* v2.0.2 (2006-02-13)\n** Bugfix for Firefox 1.5.0.1 related to the "Show prefix" checkbox. Thanks to Ted Pavlic for reporting and to BramChen for fixing. \n** Internal\n*** Make "JSLint" conform\n* v2.0.1 (2006-02-05)\n** Support "Exact Word Match" (use '=' to prefix word)\n** Support default filter settings (when no filter flags are given in search term)\n** Rework on the "less than 3 chars search text" feature (thanks to EricShulman)\n** Better support SinglePageMode when doing "Open all tiddlers" (thanks to EricShulman)\n** Support Firefox 1.5.0.1\n** Bug: Fixed a hilite bug in "classic search mode" (thanks to EricShulman)\n* v2.0.0 (2006-01-16)\n** Add User Interface\n* v1.0.1 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.0 (2005-12-28)\n** initial version\n!Code\nThe code is compressed. \n\nYou can retrieve a readable source code version from http://tiddlywiki.abego-software.de/#YourSearchPlugin-src.\n/%\n***/\nif(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:0,revision:2,date:new Date(2006,2,13),type:"plugin",source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin"};var alertAndThrow=function(_1){alert(_1);throw _1;};if(!window.abego){window.abego={};}if(abego.YourSearch){alertAndThrow("abego.YourSearch already defined");}abego.YourSearch={};if(version.major<2){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.0 or newer.\sn\snGet YourSearch 1.0.1 to use YourSearch with older versions of TiddlyWiki.\sn\snhttp://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1");}var STQ=function(_2,_3,_4,_5){this.queryText=_2;this.caseSensitive=_3;if(_5){this.regExp=new RegExp(_2,_3?"mg":"img");return;}this.terms=[];var re=/\ss*(\s-)?([#%!=]*)(?:(?:("(?:(?:\s\s")|[^"])*")|(\sS+)))(?:\ss+((?:[aA][nN][dD])|(?:[oO][rR]))(?!\sS))?/mg;var _7=re.exec(_2);while(_7!=null&&_7.length==6){var _8="-"==_7[1];var _9=_7[2];var _a=_9.indexOf("!")>=0;var _b=_9.indexOf("%")>=0;var _c=_9.indexOf("#")>=0;var _d=_9.indexOf("=")>=0;if(!_a&&!_b&&!_c){_a=config.options.chkSearchInTitle;_b=config.options.chkSearchInText;_c=config.options.chkSearchInTags;if(!_a&&!_b&&!_c){_a=_b=_c=true;}}if(_4){_b=false;_c=false;}var _e;if(_7[3]){try{_e=eval(_7[3]);}catch(ex){}}else{_e=_7[4];}if(!_e){throw "Invalid search expression: %0".format([_2]);}var _f=_7[5]&&_7[5].charAt(0).toLowerCase()=="o";this.terms.push(new STQ.Term(_e,_a,_b,_c,_8,_f,_3,_d));_7=re.exec(_2);}};var me=STQ.prototype;me.getMatchingTiddlers=function(_10){var _11=[];for(var i in _10){var t=_10[i];if((t instanceof Tiddler)&&this.matchesTiddler(t)){_11.push(t);}}return _11;};me.matchesTiddler=function(_14){if(this.regExp){return this.regExp.test(_14.title)||this.regExp.test(_14.text);}var n=this.terms.length;if(n==0){return false;}var _16=this.terms[0].matchesTiddler(_14);for(var i=1;i<this.terms.length;i++){if(this.terms[i-1].orFollows){if(!_16){_16|=this.terms[i].matchesTiddler(_14);}}else{if(_16){_16&=this.terms[i].matchesTiddler(_14);}}}return _16;};me.getOnlyMatchTitleQuery=function(){if(!this.onlyMatchTitleQuery){this.onlyMatchTitleQuery=new STQ(this.queryText,this.caseSensitive,true,this.useRegExp);}return this.onlyMatchTitleQuery;};me.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}var _18={};var n=this.terms.length;for(var i=0;i<this.terms.length;i++){var _1b=this.terms[i];if(!_1b.negate){_18[_1b.text]=true;}}var _1c=[];for(var t in _18){_1c.push("("+t.escapeRegExp()+")");}if(_1c.length==0){return null;}var _1e=_1c.join("|");return new RegExp(_1e,this.caseSensitive?"mg":"img");};me.toString=function(){if(this.regExp){return this.regExp.toString();}var _1f="";for(var i=0;i<this.terms.length;i++){_1f+=this.terms[i].toString();}return _1f;};STQ.Term=function(_21,_22,_23,_24,_25,_26,_27,_28){this.text=_21;this.inTitle=_22;this.inText=_23;this.inTag=_24;this.negate=_25;this.orFollows=_26;this.caseSensitive=_27;this.wordMatch=_28;var _29=_21.escapeRegExp();if(this.wordMatch){_29="\s\sb"+_29+"\s\sb";}this.regExp=new RegExp(_29,"m"+(_27?"":"i"));};STQ.Term.prototype.toString=function(){return (this.negate?"-":"")+(this.inTitle?"!":"")+(this.inText?"%":"")+(this.inTag?"#":"")+(this.wordMatch?"=":"")+"\s""+this.text+"\s""+(this.orFollows?" OR ":" AND ");};STQ.Term.prototype.matchesTiddler=function(_2a){if(!_2a){return false;}if(this.inTitle&&this.regExp.test(_2a.title)){return !this.negate;}if(this.inText&&this.regExp.test(_2a.text)){return !this.negate;}if(this.inTag){var _2b=_2a.tags;if(_2b){for(var i=0;i<_2b.length;i++){if(this.regExp.test(_2b[i])){return !this.negate;}}}}return this.negate;};var stringToInt=function(s,_2e){if(!s){return _2e;}var n=parseInt(s);return (n==NaN)?_2e:n;};var getIntAttribute=function(_30,_31,_32){return stringToInt(_30.getAttribute(_31));};var isDescendantOrSelf=function(_33,e){while(e!=null){if(_33==e){return true;}e=e.parentNode;}return false;};var getMatchCount=function(s,re){var m=s.match(re);return m?m.length:0;};var createEllipsis=function(_38){var e=createTiddlyElement(_38,"span");e.innerHTML="&hellip;";};var isWordChar=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var getWordBounds=function(s,_3c){if(!isWordChar(s[_3c])){return null;}for(var i=_3c-1;i>=0&&isWordChar(s[i]);i--){}var _3e=i+1;var n=s.length;for(i=_3c+1;i<n&&isWordChar(s[i]);i++){}return {start:_3e,end:i};};var removeTextDecoration=function(s){var _41=["''","{{{","}}}","//","<<<","/***","***/"];var _42="";for(var i=0;i<_41.length;i++){if(i!=0){_42+="|";}_42+="("+_41[i].escapeRegExp()+")";}return s.replace(new RegExp(_42,"mg"),"").trim();};var logText="";var lastLogTime=null;var logMessage=function(_44,s){var now=new Date();var _47=lastLogTime?(now-lastLogTime).toString():"";logText+="<tr><td>"+now.convertToYYYYMMDDHHMMSSMMM()+"</td><td align='right'>"+_47+"</td><td>"+_44+"</td><td>"+s.htmlEncode()+"</td></tr>\sn";lastLogTime=now;};function writeLog(){var t=" <<JsDoIt 'WriteLog' 'WriteLog' 'javascript:writeLog();story.closeTiddler(\s"Log\s");story.displayTiddler(null,\s"Log\s");'>>"+"<html><table><tbody><tr><th>Time</th><th>Delta (ms)</th><th>Kind</th><th>Message</th></tr>\sn"+logText+"</tbody></table></html>";store.saveTiddler("Log","Log",t,config.options.txtUserName,new Date(),["System","Log"]);logText="";lastLogTime=null;}var yourSearchResultID="yourSearchResult";var yourSearchResultItemsID="yourSearchResultItems";var maxCharsInTitle=80;var maxCharsInTags=50;var maxCharsInText=250;var maxPagesInNaviBar=10;var itemsPerPageDefault=25;var itemsPerPageWithPreviewDefault=10;var minMatchWithContextSize=40;var maxMovementForWordCorrection=4;var matchInTitleWeight=4;var precisionInTitleWeight=10;var matchInTagsWeight=2;var resultElement;var lastResults;var lastQuery;var lastSearchText;var searchInputField;var searchButton;var firstIndexOnPage=0;var currentTiddler;var indexInPage;var indexInResult;var getItemsPerPage=function(){var n=(config.options.chkPreviewText)?stringToInt(config.options.txtItemsPerPageWithPreview,itemsPerPageWithPreviewDefault):stringToInt(config.options.txtItemsPerPage,itemsPerPageDefault);return (n>0)?n:1;};var standardRankFunction=function(_4a,_4b){var _4c=_4b.getMarkRegExp();if(!_4c){return 1;}var _4d=_4a.title.match(_4c);var _4e=_4d?_4d.length:0;var _4f=getMatchCount(_4a.getTags(),_4c);var _50=_4d?_4d.join("").length:0;var _51=_4a.title.length>0?_50/_4a.title.length:0;var _52=_4e*matchInTitleWeight+_4f*matchInTagsWeight+_51*precisionInTitleWeight+1;return _52;};var findMatches=function(_53,_54,_55,_56,_57,_58){lastSearchText=_54;var _59=_53.reverseLookup("tags",_58,false);var _5a=new STQ(_54,_55,false,_56);lastQuery=_5a;var _5b=_5a.getMatchingTiddlers(_59);var _5c=abego.YourSearch.getRankFunction();for(var i=0;i<_5b.length;i++){var _5e=_5b[i];var _5f=_5c(_5e,_5a);_5e.searchRank=_5f;}if(!_57){_57="title";}var _60=function(a,b){var _63=a.searchRank-b.searchRank;if(_63==0){if(a[_57]==b[_57]){return (0);}else{return (a[_57]<b[_57])?-1:+1;}}else{return (_63>0)?-1:+1;}};_5b.sort(_60);lastResults=_5b;return _5b;};var moveToWordBorder=function(s,_65,_66){var _67;if(_66){_67=getWordBounds(s,_65);}else{if(_65<=0){return _65;}_67=getWordBounds(s,_65-1);}if(!_67){return _65;}if(_66){if(_67.start>=_65-maxMovementForWordCorrection){return _67.start;}if(_67.end<=_65+maxMovementForWordCorrection){return _67.end;}}else{if(_67.end<=_65+maxMovementForWordCorrection){return _67.end;}if(_67.start>=_65-maxMovementForWordCorrection){return _67.start;}}return _65;};var getContextRangeAround=function(s,_69,_6a,_6b,_6c){var _6d=Math.max(Math.floor(_6c/(_6b+1)),minMatchWithContextSize);var _6e=Math.max(_6d-(_6a-_69),0);var _6f=Math.min(Math.floor(_6a+_6e/3),s.length);var _70=Math.max(_6f-_6d,0);_70=moveToWordBorder(s,_70,true);_6f=moveToWordBorder(s,_6f,false);return {start:_70,end:_6f};};var getTextAndMatchArray=function(s,_72){var _73=[];if(_72){var _74=0;var n=s.length;var _76=0;do{_72.lastIndex=_74;var _77=_72.exec(s);if(_77){if(_74<_77.index){var t=s.substring(_74,_77.index);_73.push({text:t});}_73.push({text:_77[0],isMatch:true});_74=_77.index+_77[0].length;}else{_73.push({text:s.substr(_74)});break;}}while(true);}else{_73.push({text:s});}return _73;};var simpleCreateLimitedTextWithMarks=function(_79,s,_7b){if(!lastQuery){return;}var _7c=getTextAndMatchArray(s,lastQuery.getMarkRegExp());var _7d=0;for(var i=0;i<_7c.length&&_7d<_7b;i++){var t=_7c[i];var _80=t.text;if(t.isMatch){createTiddlyElement(_79,"span",null,"marked",_80);}else{var _81=_7b-_7d;if(_81<_80.length){_80=_80.substring(0,_81)+"...";}createTiddlyText(_79,_80);}_7d+=_80.length;}};var addRange=function(_82,_83,_84){var n=_82.length;if(n==0){_82.push({start:_83,end:_84});return;}var i=0;for(;i<n;i++){var _87=_82[i];if(_87.start<=_84&&_83<=_87.end){var r;var _89=i+1;for(;_89<n;_89++){r=_82[_89];if(r.start>_84||_83>_87.end){break;}}var _8a=_83;var _8b=_84;for(var j=i;j<_89;j++){r=_82[j];_8a=Math.min(_8a,r.start);_8b=Math.max(_8b,r.end);}_82.splice(i,_89-i,{start:_8a,end:_8b});return;}if(_87.start>_84){break;}}_82.splice(i,0,{start:_83,end:_84});};var getTotalRangesSize=function(_8d){var _8e=0;for(var i=0;i<_8d.length;i++){var _90=_8d[i];_8e+=_90.end-_90.start;}return _8e;};var writeTextAndMatchRange=function(_91,s,_93,_94,_95){var t;var _97;var pos=0;var i=0;var _9a=0;for(;i<_93.length;i++){t=_93[i];_97=t.text;if(_94<pos+_97.length){_9a=_94-pos;break;}pos+=_97.length;}var _9b=_95-_94;for(;i<_93.length&&_9b>0;i++){t=_93[i];_97=t.text.substr(_9a);_9a=0;if(_97.length>_9b){_97=_97.substr(0,_9b);}if(t.isMatch){createTiddlyElement(_91,"span",null,"marked",_97);}else{createTiddlyText(_91,_97);}_9b-=_97.length;}if(_95<s.length){createEllipsis(_91);}};var getMatchedTextCount=function(_9c){var _9d=0;for(var i=0;i<_9c.length;i++){if(_9c[i].isMatch){_9d++;}}return _9d;};var getMatchedTextWithContextRanges=function(_9f,s,_a1){var _a2=[];var _a3=getMatchedTextCount(_9f);var pos=0;for(var i=0;i<_9f.length;i++){var t=_9f[i];var _a7=t.text;if(t.isMatch){var _a8=getContextRangeAround(s,pos,pos+_a7.length,_a3,_a1);addRange(_a2,_a8.start,_a8.end);}pos+=_a7.length;}return _a2;};var fillUpRanges=function(s,_aa,_ab){var _ac=_ab-getTotalRangesSize(_aa);while(_ac>0){if(_aa.length==0){addRange(_aa,0,moveToWordBorder(s,_ab,false));return;}else{var _ad=_aa[0];var _ae;var _af;if(_ad.start==0){_ae=_ad.end;if(_aa.length>1){_af=_aa[1].start;}else{addRange(_aa,_ae,moveToWordBorder(s,_ae+_ac,false));return;}}else{_ae=0;_af=_ad.start;}var _b0=Math.min(_af,_ae+_ac);addRange(_aa,_ae,_b0);_ac-=(_b0-_ae);}}};var writeRanges=function(_b1,s,_b3,_b4,_b5){if(_b4.length==0){return;}if(_b4[0].start>0){createEllipsis(_b1);}var _b6=_b5;for(var i=0;i<_b4.length&&_b6>0;i++){var _b8=_b4[i];var len=Math.min(_b8.end-_b8.start,_b6);writeTextAndMatchRange(_b1,s,_b3,_b8.start,_b8.start+len);_b6-=len;}};var createLimitedTextWithMarksAndContext=function(_ba,s,_bc){if(!lastQuery){return;}if(s.length<_bc){_bc=s.length;}var _bd=getTextAndMatchArray(s,lastQuery.getMarkRegExp());var _be=getMatchedTextWithContextRanges(_bd,s,_bc);fillUpRanges(s,_be,_bc);writeRanges(_ba,s,_bd,_be,_bc);};var createLimitedTextWithMarks=function(_bf,s,_c1){return createLimitedTextWithMarksAndContext(_bf,s,_c1);};var myStorySearch=function(_c2,_c3,_c4){highlightHack=new RegExp(_c4?_c2:_c2.escapeRegExp(),_c3?"mg":"img");var _c5=findMatches(store,_c2,_c3,_c4,"title","excludeSearch");firstIndexOnPage=0;showResult();highlightHack=null;};var myMacroSearchHandler=function(_c6,_c7,_c8){var _c9="";var _ca=null;var _cb=function(txt){if(config.options.chkUseYourSearch){myStorySearch(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_c9=txt.value;};var _cd=function(e){_cb(searchInputField);return false;};var _cf=function(e){if(!e){var e=window.event;}switch(e.keyCode){case 13:_cb(this);break;case 27:if(isResultOpen()){closeResult();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){reopenResultIfApplicable();}if(this.value.length<3&&_ca){clearTimeout(_ca);}if((this.value.length>2)&&(this.value!=_c9)){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_ca){clearTimeout(_ca);}var txt=this;_ca=setTimeout(function(){_cb(txt);},500);}}if(this.value.length==0){closeResult();}};var _d3=function(e){this.select();reopenResultIfApplicable();};var btn=createTiddlyButton(_c6,this.label,this.prompt,_cd);var txt=createTiddlyElement(_c6,"input",null,null,null);if(_c8[0]){txt.value=_c8[0];}txt.onkeyup=_cf;txt.onfocus=_d3;txt.setAttribute("size",this.sizeTextbox);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}searchInputField=txt;searchButton=btn;};var isResultOpen=function(){return resultElement!=null&&resultElement.parentNode==document.body;};var closeResult=function(){if(isResultOpen()){document.body.removeChild(resultElement);}};var openAllFoundTiddlers=function(){closeResult();if(lastResults){var _d7=[];for(var i=0;i<lastResults.length;i++){_d7.push(lastResults[i].title);}story.displayTiddlers(null,_d7);}};var refreshResult=function(){if(!resultElement||!searchInputField){return;}var _d9=store.getTiddlerText("YourSearchResultTemplate");if(!_d9){_d9="<b>Tiddler YourSearchResultTemplate not found</b>";}resultElement.innerHTML=_d9;firstIndexOnPage=Math.floor(firstIndexOnPage/getItemsPerPage())*getItemsPerPage();applyHtmlMacros(resultElement,null);refreshElements(resultElement,null);if(lastResults&&lastResults.length>0){var _da=store.getTiddlerText("YourSearchItemTemplate");if(!_da){alertAndThrow("YourSearchItemTemplate not found");}var _db=document.getElementById(yourSearchResultItemsID);if(!_db){_db=createTiddlyElement(resultElement,"div",yourSearchResultItemsID);}var _dc=Math.min(firstIndexOnPage+getItemsPerPage(),lastResults.length);indexInPage=-1;for(var i=firstIndexOnPage;i<_dc;i++){currentTiddler=lastResults[i];indexInPage++;indexInResult=i;var _de=createTiddlyElement(_db,"div",null,"yourSearchItem");_de.innerHTML=_da;applyHtmlMacros(_de,null);refreshElements(_de,null);}}currentTiddler=null;ensureResultIsDisplayedNicely();};var ensureResultIsDisplayedNicely=function(){adjustResultPositionAndSize();scrollVisible();};var scrollVisible=function(){if(resultElement){window.scrollTo(0,ensureVisible(resultElement));}if(searchInputField){window.scrollTo(0,ensureVisible(searchInputField));}};var adjustResultPositionAndSize=function(){if(!searchInputField){return;}var _df=searchInputField;var _e0=findPosX(_df);var _e1=findPosY(_df);var _e2=_df.offsetHeight;var _e3=_e0;var _e4=_e1+_e2;var _e5=findWindowWidth();if(_e5<resultElement.offsetWidth){resultElement.style.width=(_e5-100)+"px";_e5=findWindowWidth();}var _e6=resultElement.offsetWidth;if(_e3+_e6>_e5){_e3=_e5-_e6-30;}if(_e3<0){_e3=0;}resultElement.style.left=_e3+"px";resultElement.style.top=_e4+"px";resultElement.style.display="block";};var showResult=function(){if(!resultElement){resultElement=createTiddlyElement(document.body,"div",yourSearchResultID,"yourSearchResult");}else{if(resultElement.parentNode!=document.body){document.body.appendChild(resultElement);}}refreshResult();};var reopenResultIfApplicable=function(){if(searchInputField==null||!config.options.chkUseYourSearch){return;}if((searchInputField.value==lastSearchText)&&lastSearchText&&!isResultOpen()){if(resultElement&&(resultElement.parentNode!=document.body)){document.body.appendChild(resultElement);ensureResultIsDisplayedNicely();}else{showResult();}}};var setFirstIndexOnPage=function(_e7){if(!lastResults||lastResults.length==0){return;}firstIndexOnPage=Math.min(Math.max(0,_e7),lastResults.length-1);refreshResult();};var onDocumentClick=function(e){if(e.target==searchInputField){return;}if(e.target==searchButton){return;}if(resultElement&&isDescendantOrSelf(resultElement,e.target)){return;}closeResult();};var onDocumentKeyup=function(e){if(e.keyCode==27){closeResult();}};addEvent(document,"click",onDocumentClick);addEvent(document,"keyup",onDocumentKeyup);config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",funcs:{},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return lastResults&&lastResults.length>0;},"previewText":function(){return config.options.chkPreviewText;}}};config.macros.yourSearch.handler=function(_ea,_eb,_ec,_ed,_ee,_ef){if(_ec.length==0){return;}var _f0=_ec[0];var _f1=config.macros.yourSearch.funcs[_f0];if(_f1){_f1(_ea,_eb,_ec,_ed,_ee,_ef);}};config.macros.yourSearch.funcs.itemRange=function(_f2){if(lastResults){var _f3=Math.min(firstIndexOnPage+getItemsPerPage(),lastResults.length);var s="%0 - %1".format([firstIndexOnPage+1,_f3]);createTiddlyText(_f2,s);}};config.macros.yourSearch.funcs.count=function(_f5){if(lastSearchText){createTiddlyText(_f5,lastResults.length.toString());}};config.macros.yourSearch.funcs.query=function(_f6){if(lastResults){createTiddlyText(_f6,lastSearchText);}};config.macros.yourSearch.funcs.version=function(_f7){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_f7,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";};config.macros.yourSearch.funcs.copyright=function(_fa){var e=createTiddlyElement(_fa,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">&copy; 2005-2006 <b><font color=\s"red\s">abego</font></b> Software<font>";};config.macros.yourSearch.funcs.linkButton=function(_fc,_fd,_fe,_ff,_100,_101){if(_fe<2){return;}var _102=_fe[1];var text=_fe<3?_102:_fe[2];var _104=_fe<4?text:_fe[3];var _105=_fe<5?null:_fe[4];var btn=createTiddlyButton(_fc,text,_104,closeResultAndDisplayTiddler,null,null,_105);btn.setAttribute("tiddlyLink",_102);};config.macros.yourSearch.funcs.closeButton=function(_107,_108,_109,_10a,_10b,_10c){var _10d=createTiddlyButton(_107,"close","Close the Search Results (Shortcut: ESC)",closeResult);};config.macros.yourSearch.funcs.openAllButton=function(_10e,_10f,_110,_111,_112,_113){if(!lastResults){return;}var n=lastResults.length;if(n==0){return;}var _115=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _116=createTiddlyButton(_10e,_115,"Open all found tiddlers (Shortcut: Alt-O)",openAllFoundTiddlers);_116.setAttribute("accessKey","O");};var onNaviButtonClick=function(e){if(!e){var e=window.event;}var _119=getIntAttribute(this,"page");setFirstIndexOnPage(_119*getItemsPerPage(),0);};config.macros.yourSearch.funcs.naviBar=function(_11a,_11b,_11c,_11d,_11e,_11f){if(!lastResults||lastResults.length==0){return;}var _120;var _121=Math.floor(firstIndexOnPage/getItemsPerPage());var _122=Math.floor((lastResults.length-1)/getItemsPerPage());if(_121>0){_120=createTiddlyButton(_11a,"Previous","Go to previous page (Shortcut: Alt-'<')",onNaviButtonClick,"prev");_120.setAttribute("page",(_121-1).toString());_120.setAttribute("accessKey","<");}for(var i=-maxPagesInNaviBar;i<maxPagesInNaviBar;i++){var _124=_121+i;if(_124<0){continue;}if(_124>_122){break;}var _125=(i+_121+1).toString();var _126=_124==_121?"currentPage":"otherPage";_120=createTiddlyButton(_11a,_125,"Go to page %0".format([_125]),onNaviButtonClick,_126);_120.setAttribute("page",(_124).toString());}if(_121<_122){_120=createTiddlyButton(_11a,"Next","Go to next page (Shortcut: Alt-'>')",onNaviButtonClick,"next");_120.setAttribute("page",(_121+1).toString());_120.setAttribute("accessKey",">");}};config.macros.yourSearch.funcs["if"]=function(_127,_128,_129,_12a,_12b,_12c){if(_129.length<2){return;}var _12d=_129[1];var _12e=(_12d=="not");if(_12e){if(_129.length<3){return;}_12d=_129[2];}var test=config.macros.yourSearch.tests[_12d];var _130=false;try{if(test){_130=test(_127,_128,_129,_12a,_12b,_12c)!=_12e;}else{_130=(!eval(_12d))==_12e;}}catch(ex){}if(!_130){_127.style.display="none";}};var createOptionWithRefresh=function(_131,_132,_133,_134){invokeMacro(_131,"option",_132,_133,_134);var elem=_131.lastChild;var _136=elem.onclick;elem.onclick=function(e){var _138=_136.apply(this,arguments);refreshResult();return _138;};return elem;};config.macros.yourSearch.funcs.chkPreviewText=function(_139,_13a,_13b,_13c,_13d,_13e){var _13f=_13b.slice(1).join(" ");var elem=createOptionWithRefresh(_139,"chkPreviewText",_13c,_13e);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",funcs:{}};config.macros.foundTiddler.handler=function(_141,_142,_143,_144,_145,_146){if(!currentTiddler){return;}var name=_143[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_141,_142,_143,_144,_145,_146);}};var closeResultAndDisplayTiddler=function(e){closeResult();var _14a=this.getAttribute("tiddlyLink");if(_14a){var _14b=this.getAttribute("withHilite");var _14c=highlightHack;if(_14b&&_14b=="true"&&lastQuery){highlightHack=lastQuery.getMarkRegExp();}story.displayTiddler(this,_14a);highlightHack=_14c;}return (false);};var getShortCutNumber=function(){if(!currentTiddler){return -1;}if(indexInPage>=0&&indexInPage<=9){return indexInPage<9?(indexInPage+1):0;}else{return -1;}};config.macros.foundTiddler.funcs.title=function(_14d,_14e,_14f,_150,_151,_152){if(!currentTiddler){return;}var _153=getShortCutNumber();var _154=_153>=0?"Open tiddler (Shortcut: Alt-%0)".format([_153.toString()]):"Open tiddler";var btn=createTiddlyButton(_14d,null,_154,closeResultAndDisplayTiddler,null);btn.setAttribute("tiddlyLink",currentTiddler.title);btn.setAttribute("withHilite","true");createLimitedTextWithMarks(btn,currentTiddler.title,maxCharsInTitle);if(_153>=0){btn.setAttribute("accessKey",_153.toString());}};config.macros.foundTiddler.funcs.tags=function(_156,_157,_158,_159,_15a,_15b){if(!currentTiddler){return;}createLimitedTextWithMarks(_156,currentTiddler.getTags(),maxCharsInTags);};config.macros.foundTiddler.funcs.text=function(_15c,_15d,_15e,_15f,_160,_161){if(!currentTiddler){return;}createLimitedTextWithMarks(_15c,removeTextDecoration(currentTiddler.text),maxCharsInText);};config.macros.foundTiddler.funcs.number=function(_162,_163,_164,_165,_166,_167){var _168=getShortCutNumber();if(_168>=0){var text="%0)".format([_168.toString()]);createTiddlyElement(_162,"span",null,"shortcutNumber",text);}};function scrollToAnchor(name){return false;}if(config.options.chkUseYourSearch==undefined){config.options.chkUseYourSearch=true;}if(config.options.chkPreviewText==undefined){config.options.chkPreviewText=true;}if(config.options.chkSearchAsYouType==undefined){config.options.chkSearchAsYouType=true;}if(config.options.chkSearchInTitle==undefined){config.options.chkSearchInTitle=true;}if(config.options.chkSearchInText==undefined){config.options.chkSearchInText=true;}if(config.options.chkSearchInTags==undefined){config.options.chkSearchInTags=true;}if(config.options.txtItemsPerPage==undefined){config.options.txtItemsPerPage=itemsPerPageDefault;}if(config.options.txtItemsPerPageWithPreview==undefined){config.options.txtItemsPerPageWithPreview=itemsPerPageWithPreviewDefault;}config.shadowTiddlers.AdvancedOptions+="\sn<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]])//";config.shadowTiddlers["YourSearch Introduction"]="!About YourSearch\sn"+"\sn"+"YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!\sn"+"\sn"+"''May the '~Alt-F' be with you.''\sn"+"\sn"+"\sn"+"!Features\sn"+"* YourSearch searches for tiddlers that match your query ''as you type'' into the 'search' field. It presents a list of the ''\s"Top Ten\s"'' tiddlers in a ''popup-like window'': the ''[[YourSearch Result]]''. The tiddlers currently displayed in your TiddlyWiki are not affected.\sn"+"* Using ''~TiddlerRank technology'' the [[YourSearch Result]] lists the ''most interesting tiddlers first''.\sn"+"* Through ''Filtered Search'' and ''Boolean Search'' you can easily refining your search, like excluding words or searching for multiple words. This way less tiddlers are displayed in the [[YourSearch Result]] and you can faster scan the result for the tiddler you are looking for.\sn"+"* The [[YourSearch Result]] lists the found tiddlers ''page-wise'', e.g. 10 per page. Use the ''Result Page Navigation Bar'' to navigate between pages if the result does not fit on one page.\sn"+"* The [[YourSearch Result]] states the ''total number of found tiddlers''. This way you can quickly decide if you want to browse the result list or if you want to refine your search first to shorten the result list.\sn"+"* Beside the ''title of the found tiddlers'' the [[YourSearch Result]] also ''displays tags'' and ''tiddler text previews''. The ''tiddler text preview'' is an extract of the tiddler's content, showing the most interesting parts related to your query (e.g. the texts around the words you are looking for).\sn"+"* The words you are looking for are hilited in the titles, tags and text previews of the [[YourSearch Result]].\sn"+"* If you are not interested in the tiddler text previews but prefer to get longer lists of tiddlers on one result page you may ''switch of the text preview''.\sn"+"* If the [[YourSearch Result]] contains the tiddler you are looking for you can just ''click its title to display'' it in your TiddlyWiki. Alternatively you may also ''open all found tiddlers'' at once. \sn"+"* Use [[YourSearch Options]] to customize YourSearch to your needs. E.g. depending on the size of your screen you may change the number of tiddlers displayed in the [[YourSearch Result]]. In the [[YourSearch Options]] and the AdvancedOptions you may also switch off YourSearch in case you temporarily want to use the standard search.\sn"+"* For the most frequently actions ''access keys'' are defined so you can perform your search without using the mouse.\sn"+"\sn";config.shadowTiddlers["YourSearch Help"]="<<tiddler [[YourSearch Introduction]]>>"+"\sn"+"!Filtered Search<html><a name='Filtered'/></html>\sn"+"Using the Filtered Search you can restrict your search to certain parts of a tiddler, e.g only search the tags or only the titles.\sn"+"|!What you want|!What you type|!Example|\sn"+"|Search ''titles only''|start word with ''!''|{{{!jonny}}}|\sn"+"|Search ''contents only''|start word with ''%''|{{{%football}}}|\sn"+"|Search ''tags only''|start word with ''#''|{{{#Plugin}}}|\sn"+"\sn"+"You may use more than one filter for a word. E.g. {{{!#Plugin}}} finds tiddlers containing \s"Plugin\s" either in the title or in the tags (but does not look for \s"Plugin\s" in the content).\sn"+"\sn"+"!Boolean Search<html><a name='Boolean'/></html>\sn"+"The Boolean Search is useful when searching for multiple words.\sn"+"|!What you want|!What you type|!Example|\sn"+"|''All words'' must exist|List of words|{{{jonny jeremy}}}|\sn"+"|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\sn"+"|A word ''must not exist''|Start word with ''-''|{{{-jonny}}}|\sn"+"\sn"+"''Note:'' When you specify two words, separated with a space, YourSearch finds all tiddlers that contain both words, but not necessarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need to put the words into quotes. I.e. you type: {{{\s"john brown\s"}}}.\sn"+"\sn"+"!'Exact Word' Search<html><a name='Exact'/></html>\sn"+"By default a search result all matches that 'contain' the searched text. \sn"+" E.g. if you search for 'Task' you will get all tiddlers containing 'Task', but also 'CompletedTask', 'TaskForce' etc.\sn"+"\sn"+"If you only want to get the tiddlers that contain 'exactly the word' you need to prefix it with a '='. E.g. typing '=Task' will the tiddlers that contain the word 'Task', ignoring words that just contain 'Task' as a substring.\sn"+"\sn"+"!Combined Search<html><a name='Combined'/></html>\sn"+"You are free to combine the various search options. \sn"+"\sn"+"''Examples''\sn"+"|!What you type|!Result|\sn"+"|{{{!jonny !jeremy -%football}}}| all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its titles, but no {{{football}}} in content.|\sn"+"|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact word). Tags named 'CompletedTask', 'TaskForce' etc. are not considered.|\sn"+"\sn"+"!~CaseSensitiveSearch and ~RegExpSearch<html><a name='Case'/></html>\sn"+"The standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearch. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\sn"+"\sn"+"!Access Keys<html><a name='Access'/></html>\sn"+"You are encouraged to use the access keys (also called \s"shortcut\s" keys) for the most frequently used operations. For quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\sn"+"\sn"+"|!Key|!Operation|\sn"+"|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search input field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the previous search result. This way you can quickly display multiple tiddlers using \s"Press {{{Alt-F}}}. Select tiddler.\s" sequences.|\sn"+"|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Result]] is already closed and the cursor is in the search input field the field's content is cleared so you start a new query.|\sn"+"|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second etc. tiddler from the result list.|\sn"+"|{{{Alt-O}}}|Opens all found tiddlers.|\sn"+"|{{{Alt-P}}}|Toggles the 'Preview Text' mode.|\sn"+"|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[YourSearch Result]].|\sn"+"|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the {{{Return}}} key actually starts the search (as does pressing the 'search' button).|\sn"+"\sn";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\sn"+"|>|<<option chkUseYourSearch>> Use 'Your Search'|\sn"+"|!|<<option chkPreviewText>> Show Text Preview|\sn"+"|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required to start search)|\sn"+"|!|Default Search Filter:<<option chkSearchInTitle>>Titles ('!') <<option chkSearchInText>>Texts ('%') <<option chkSearchInTags>>Tags ('#') <html><br><font size=\s"-2\s">The parts of a tiddlers that are searched when you don't explicitly specify a filter in the search text (using a '!', '%' or '#' prefix).</font></html>|\sn"+"|!|Number of items on search result page: <<option txtItemsPerPage>>|\sn"+"|!|Number of items on search result page with preview text: <<option txtItemsPerPageWithPreview>>|\sn";config.shadowTiddlers["YourSearchStyleSheet"]="/***\sn"+"!~YourSearchResult Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchResult {\sn"+"\stposition: absolute;\sn"+"\stwidth: 800px;\sn"+"\sn"+"\stpadding: 0.2em;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: White;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Summary Section\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchResult .summary {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 4px;\sn"+"}\sn"+"\sn"+".yourSearchRange, .yourSearchCount, .yourSearchQuery {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".yourSearchResult .summary .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+".yourSearchResult .summary .chkBoxLabel {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Items Area\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchResult .marked {\sn"+"\stbackground: none;\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".yourSearchItem {\sn"+"\stmargin-top: 2px;\sn"+"}\sn"+"\sn"+".yourSearchNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+"\sn"+".yourSearchTags {\sn"+"\stcolor: #008000;\sn"+"}\sn"+"\sn"+".yourSearchText {\sn"+"\stcolor: #808080;\sn"+"\stmargin-bottom: 6px;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Footer\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchFooter {\sn"+"\stmargin-top: 8px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+"\sn"+".yourSearchFooter a:hover{\sn"+"\stbackground: none;\sn"+"\stcolor: none;\sn"+"}\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Navigation Bar\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchNaviBar a {\sn"+"\stfont-size: 16px;\sn"+"\stmargin-left: 4px;\sn"+"\stmargin-right: 4px;\sn"+"\stcolor: black;\sn"+"\sttext-decoration: underline;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar a:hover {\sn"+"\stbackground-color: none;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar .prev {\sn"+"\stfont-weight: bold;\sn"+"\stcolor: blue;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar .currentPage {\sn"+"\stcolor: #FF0000;\sn"+"\stfont-weight: bold;\sn"+"\sttext-decoration: none;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar .next {\sn"+"\stfont-weight: bold;\sn"+"\stcolor: blue;\sn"+"}\sn"+"/*}}}*/\sn";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<span macro=\s"yourSearch if found\s">\sn"+"<!-- The Summary Header ============================================ -->\sn"+"<table class=\s"summary\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\stYourSearch Result <span class=\s"yourSearchRange\s" macro=\s"yourSearch itemRange\s"></span>\sn"+"\st\st&nbsp;of&nbsp;<span class=\s"yourSearchCount\s" macro=\s"yourSearch count\s"></span>\sn"+"\st\stfor&nbsp;<span class=\s"yourSearchQuery\s" macro=\s"yourSearch query\s"></span>\sn"+"\st</td>\sn"+"\st<td class=\s"yourSearchButtons\s" align=\s"right\s">\sn"+"\st\st<span macro=\s"yourSearch chkPreviewText\s"></span><span class=\s"chkBoxLabel\s">preview text</span>\sn"+"\st\st<span macro=\s"yourSearch openAllButton\s"></span>\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Options' options 'Configure YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Help' help 'Get help how to use YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch closeButton\s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"\sn"+"<!-- The List of Found Tiddlers ============================================ -->\sn"+"<div id=\s"yourSearchResultItems\s" itemsPerPage=\s"25\s" itemsPerPageWithPreview=\s"10\s"></div>\sn"+"\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"yourSearchFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\stResult page: <span class=\s"yourSearchNaviBar\s" macro=\s"yourSearch naviBar\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s"><span macro=\s"yourSearch version\s"></span>, <span macro=\s"yourSearch copyright\s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!-- end of the 'tiddlers found' case =========================================== -->\sn"+"</span>\sn"+"\sn"+"\sn"+"<!-- The \s"No tiddlers found\s" case =========================================== -->\sn"+"<span macro=\s"yourSearch if not found\s">\sn"+"<table class=\s"summary\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\stYourSearch Result: No tiddlers found for <span class=\s"yourSearchQuery\s" macro=\s"yourSearch query\s"></span>.\sn"+"\st</td>\sn"+"\st<td class=\s"yourSearchButtons\s" align=\s"right\s">\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Options' options 'Configure YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Help' help 'Get help how to use YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch closeButton\s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"</span>\sn"+"\sn"+"\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<span class='yourSearchNumber' macro='foundTiddler number'></span>\sn"+"<span class='yourSearchTitle' macro='foundTiddler title'/></span>&nbsp;-&nbsp;\sn"+"<span class='yourSearchTags' macro='foundTiddler tags'/></span>\sn"+"<span macro=\s"yourSearch if previewText\s"><div class='yourSearchText' macro='foundTiddler text'/></div></span>\sn"+"<!--\sn"+"}}}\sn"+"-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");var origMacros_search_handler=config.macros.search.handler;config.macros.search.handler=myMacroSearchHandler;var ownsOverwrittenFunctions=function(){var _16b=(config.macros.search.handler==myMacroSearchHandler);return _16b;};var checkForOtherHijacker=function(){if(!ownsOverwrittenFunctions()){alert("Message from YourSearchPlugin:\sn\sn\sn"+"Another plugin has disabled the 'Your Search' features.\sn\sn\sn"+"You may disable the other plugin or change the load order of \sn"+"the plugins (by changing the names of the tiddlers)\sn"+"to enable the 'Your Search' features.");}};setTimeout(checkForOtherHijacker,5000);abego.YourSearch.getStandardRankFunction=function(){return standardRankFunction;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return currentTiddler;};}\n/***\n%/\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005-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\n
<html><img src="http://msig.info/web2v2/(reflect)eddieBETA.png" alt="Generated Image" /></html>
/%\n/***\nEsta entrada se diseña automáticamente. Se añaden las cuatro ultimas entradas\nque se crearon marcadas con el tag entrada\n***/\n%/<<forEachTiddler\n where\n 'tiddler.tags.contains("entrada")'\n sortBy\n 'tiddler.created'\n descending\n write\n'(index < 4) ? "[["+tiddler.title+"]]\sn<<tiddler [["+tiddler.title+"]]$))\sn----\sn\sn" : "" '\n>>\n\n\n\n[[<<anteriores|anteriores]]
La portada que se ve ahora es solo un hack. \n\nEn realidad quería usar el mismo truco de la portada sobre DefaultTiddlers para que las entradas marcadas con cierto tag aparezcan al abrir el sitio pero por lo que parece, ese tiddler no se puede reescribir automagicamente usando ForEachTiddlerPlugin (un mecanismo de reescritura de tiddlers muy conveniente).\n\nAsí que por lo que parece, siendo un tiddler bastante estático tengo otras dos posibilidades: la primera es promover el hack de forEachTiddlerPlugin a un script de verdad y ponerlo en algun sitio donde se cargue antes que ese tiddler y lo reescriba (en lugar de reescribirse a sí mismo).\n\nLa otra posibilidad es reescribir DefaultTiddlers cada vez que se guarde mi tiddlywiki.
| tiddlyspot password:|<<option pasUploadPassword>>|\n| site management:|<<upload http://eddie.tiddlyspot.com/store.cgi index.html . . eddie>>//(requires tiddlyspot password)//<<br>>[[control panel|http://eddie.tiddlyspot.com/controlpanel]], [[download (go offline)|http://eddie.tiddlyspot.com/download]]|\n| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://tiddlyspot.com/faq/]], [[announcements|http://tiddlyspot.com/announce/]], [[blog|http://tiddlyspot.com/blog/]], [[email feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|