Shareme Wiki is loading ...

Requires Javascript.
Shareme Wiki - a reusable non-linear wiki about Enterprise and Mobile Technology
| source file:|{{{C:\sDocuments and Settings\sOwner\sMy Documents\sMy Pictures\sicon_sets\s30boxes_icon.png}}}|\n| attached on:|8 June 2007 by shareme|\n| description:|attached by FileDropPlugin|\n| embedded:|[[30boxes_icon.png|30boxes_icon.png]] - {{{type=image/png, size=461 bytes, encoded=625 bytes}}}|\n| local file:|/%LOCAL_LINK%/[[C:\sDocuments and Settings\sOwner\sMy Documents\sMy Pictures\sicon_sets\s30boxes_icon.png|file:///C:/Documents and Settings/Owner/My Documents/My Pictures/icon_sets/30boxes_icon.png]]|\n| remote link:|//none//|\nNotes:\n>This is a 30boxes icon.\nimage\n<<<\nusage: {{{[img[tooltip|30boxes_icon.png]] or [img[tooltip|30boxes_icon.png][link]]}}}\n[img[tooltip|30boxes_icon.png]]\n<<<\n\n/% DO NOT EDIT BELOW THIS POINT\n---BEGIN_DATA---\nimage/png;base64,\niVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+g\nvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wYIChYMkaInUgAAAVpJ\nREFUeNqlkzGu4kAQRF+bL1skhJ5o7oA0obkBmSPEBTghcAHIjAicQeYJgMkQiZ3Q\nG7DDms9u8NlKeqalUleVuqWqKuU3RARVRUS43++ICACqSpIkz3esIsIXwHg85hPs\n93uSOPlTJH05P4WIkPR9/hSqStInfqIi+R+yiPwJUVWfNtq2xXtP13UvhBACTdO8\nDPyK5NhsmobVakXbtmRZxnw+ZzQasdls2O12ABhjmM1m7xnEKVmWsVgs6LqOw+EA\nQFVVFEVBWZacz2e89w8F330553DOUdf1c5r3HhHBGIO1FhEhhMBgMHhXEL0dj0eM\nMaRp+tfwIi8RkZedv1wu3G43yrJEVZ++/3UnbyEul0uGwyHOOa7XK3meY60lTVPq\nuiaEgIhgreV0Oj0sRBWqynQ6pW1b1us1xhgmkwkARVHgvWe73eKcI8/zh6J4zn0V\n39e134v/WH8B86S/l6YVFzMAAAAASUVORK5CYII=\n---END_DATA---\n%/
To add trackback to roller of your posts requires some simple steps. These steps work in 2.x and 3.x and should work also in future versions of roller.\n\n!Steps to Add Trackback to Your Posts\nWithin your day template after the foreach statement you will want to add:\n<nowiki>\n<!--\n\n<rdf:RDF xmlns:rdf=""\n\n xmlns:trackback=""\n\n xmlns:dc="">\n\n<rdf:Description\n\n rdf:about="$absBaseURL/page/$userName?anchor=$entry.anchor"\n\n trackback:ping="$absBaseURL/trackback/$userName/$$entry.anchor"\n\n dc:title="$entry.title"\n\n dc:identifier="$absBaseURL/page/$userName?anchor=$entry.anchor"\n\n dc:subject="$"\n\n dc:description="$entry.title"\n\n dc:creator="$userName"\n\n dc:date="$entry.pubTime" />\n\n</rdf:RDF>\n\n-->\n</nowiki>\n\n\nLets explain the variables that are used so you use them somewhere else.\n\n$absBaseURL provides the base url of the roller community you are at or the base url of your roller installation. \n\n\n$userName this is the username of the weblog.\n\n\n$entry.anchor this is the portion of the url of the post.\n\n\n$entry.title this is the title of the entry or weblog post.\n\n\n$ this is the category name under which you are making your weblog post.\n\n\n$entry.pubTime is the publication time of the post.\n\n!Conclusion\nThere are many more macros to use beside the ones stated here in this article. They can be found in the users guides at:\n[[Roller User Guides|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
/***\n|Name|AliasPlugin|\n|Source||\n|Version|1.1.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Create text-substitution macros|\n\nDefine macros for abbreviations and other "aliases", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing.\n\n!!!!!Usage\n<<<\nFirst, decide upon a suitable "alias" for the text to be substituted. This is usually a short keyword or other abbreviated term that is easily input with just a few keystrokes. You can use any alias you like, but don't include any spaces in the alias name, since it will be used as the name of the 'alias macro' that is created, and macro names cannot contain spaces.\n\n//Note: If you use an alias name that ''does'' contain spaces, they will be automatically replaced with underscores ("_"), so that the resulting alias name will still be a valid macro name//\n\nTo create alias definitions, embed {{{<<alias newname "text to display"}}} >> macros in a tiddler. These macros don't actually produce any visible output, but simply define the alias macros that you want to use in your document, and thus they can be safely added to practically any tiddler without producing a change in that tiddler's appearance.\n\nThen, you can use the aliases you have defined like this: {{{<<newname>>}}}. You can include additional parameters when you invoke the macro: {{{<<newname param param param...>>}}}. These parameters are inserted into the macro's "text to display" by substituting for %0...%9 markers. \n\nFor example, to define a quick alias for inserting a link to any given subject on, you can write:\n{{{\n<<alias wikipedia "[[Wikipedia:%0|]]">>\n}}}\nwhich allows you to then write:\n{{{\n<<wikipedia TiddlyWiki>>\n}}}\nwhich is processed as if you wrote:\n{{{\n[[Wikipedia:TiddlyWiki|]]\n}}}\nand is displayed this way:\n><<alias wikipedia "[[Wikipedia:%0|]]">><<wikipedia TiddlyWiki>>\n\nNote:\nIn order to ensure that your aliases are defined and available for use throughout your document, you should add your definitions to a tiddler that you are certain will be displayed when your TW is first loaded, such as MainMenu or SiteTitle (or, any tiddler listed in DefaultTiddlers).\n<<<\n!!!!!Examples\n<<<\n<<alias>> {{{<<alias>>}}}\nmissing alias name: fail safe, do nothing\n\n<<alias alias1>> {{{<<alias alias1>>}}}\nmissing text params, default to text=name (e.g., "<<alias1>>")\n\n<<alias alias2 simple multi-word text substitution>> {{{<<alias alias2 simple multi-word text substitution>>}}}\n<<alias2>>\n\n<<alias "alias3 with spaces" "spaces in aliasname converted to _">> {{{<<alias "alias3 with spaces" "spaces in aliasname converted to _ ">>}}}\n<<alias3_with_spaces>>\n\n<<alias alias4 "multi-line \ntext\nsubstitution">> {{{<<alias alias4 "multi-line\ntext\nsubstitution">>}}}\n<<alias4>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''AliasPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for this plugin^^\n<<<\n!!!!!Revision History\n<<<\n''2007.03.21 [1.1.0]''\nadded support for parameter substitution into alias macros, using format() method and%0..%9 markers\n''2005.10.09 [1.0.3]''\ncombined documentation and code into a single tiddler\n''2005.08.12 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.alias= {major: 1, minor: 1, revision: 0, date: new Date(2007,3,21)};\nconfig.macros.alias= { };\nconfig.macros.alias.handler = function(place,macroName,params) {\n var alias=params.shift(); if (!alias) return; alias=alias.replace(/ /g,"_"); // don't allow spaces in alias\n if (config.macros[alias]==undefined) // create new macro (as needed)\n { \n config.macros[alias] = { };\n config.macros[alias].handler =\n function (place,macroName,params)\n { wikify(config.macros[macroName].text.format(params),place,null,null); }\n }\n config.macros[alias].text = params[0]?params.join(' '):alias; // set alias text\n}\n//}}}\n
In this article configuring ANT in Eclipse will be covered including adding libraries, templates, and etc. This article covers Eclipse 3.3 features.\n\n!ANT Preferences Introduction\nThe first step in configuring ANT is viewing the first ANT preferences page in Eclipse 3.3.\n!!Figure 1\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nSeveral developing areas such as JavaEE and JavaME may use build files named something other than build.xml and this is the place whereas you will change that in the General Settings section under Names separating each build file name by a comma.\n\n!ANT Home\nIn Eclipse 3.3 ANT version 1.7 is used which introduced to concept of AntLibs and thus we need to define ANT Home so that the AntLibs that come with ANT 1.7 are loaded and the external AntLibs that you may want to use. ANT run time settings is the preference page to look at this time.\n\n!!Figure 2\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nThus, Windows than Preferences than click on the ANT node to expand and click on Runtime and than make the classpath tab visible. Expand the Home Entries node and notice no home entries and while there click on add ANT Home and specify the location of th eclipse ANT plugin folder which is named org.apache.ant_1.7.0. In last step clikc apply on right bottom corner to finish.\n\n!Adding AntLibs\nNow its time to add some AntLibs which is also added in the classpath tab of the ANT Runtime preference page. While in the node with it expanded click on add external jars. Than choose an external jar to add as AntLibs. As a last step click on the apply button in bottom right corner.\n\n!!Figure 3\n[img[][]]<<imagebox>>\nClick to enlarge.\n\n!Adding Tasks\nBy adding ANT Tasks from the AntLibs you enable the ANT Content assist to guess and auto complete which task you might want to use in an ANT build file editing session within Eclipse. One of the best practices is to choose task names with a prefix that indicates which AntLibs library contains that task.\n\n!!Figure 4\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nYou will click add task and browse your AntLibs to choose an ant library and than drill down to choose the class that defines the task and name the task and click ok. At this point you will need to consult the docs that came with the AntLibs library because not every developer names a class to denote that it defines an ANT task. Remember as a last step to click on the apply button at the bottom right corner of the preferences panel.\n\n!ANT Editor\nYou will want to leave the default values in the Content Assist. Move onto changing ANT Formatter and ANT Templates values.\n\n!!Figure 5\n[img[][]]<<imagebox>>\nClick to enlarge.\n\n!!ANT Formatter\nThe next step is to configure the ANT formatter. A helpful tip is to disable using tabs and thus use spaces instead to denote different subsections of the ANT build file.\n\n!!Figure 6\n[img[][]]<<imagebox>>\nClick to enlarge.\n\n!!ANT Templates\nTo enable ANT content assist we now compose some ANT templates to describe the task we have now added. There are two template editing modes or types the full ANT build file and the task snippet. The full ANT build file type or mode looks like this in figure 7.\n\n!!Figure 7\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nThe second mode or type is the task snippet as in figure 8 where you have the ability to add the task snippet and insert variables.\n\n!!Figure 8\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nTo get the task snippets that you should be inputing check the ant task library documentation as most ant task developers do document their tasks in detail to allow you to complete this task. Remember that your last step should be to click on export within the template panel to export the templates to the doc sub directory of your user directory so that the next time you upgrade to anew version of Eclipse that you will have a copy of your ant templates to import.\n\n!!Conclusion\nThat concludes configuring ANT 1.7 in Eclipse 3.3.\n\n\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright\n
[img[]]\n!Introduction\nThis article describes Eclipse3.3 Ant features and tips but yo9u should still be able to use those tips that still work in Eclipse3.2 if you are still using Eclipse3.2.\n\n!ANT 1.7 Support\nANT 1.7 i snow support in Eclipse 3.3 and we have some new features and steps to support certain actions.\n\n!!Ant Libs\nThis section on Ant Libs covers new ANT 1.7 support that allows Eclipse users to load external ant libs and tasks associated with those libraries.\nEclipseAntLibs\n\n!Ant Core Support\n\n!!Ant Classpath Variables\nSetting Ant classpath Variables and parameters has been a feature for a while but let us review how to use it.\n\nEclipseAntClasspathVariables\n\n!!Ant Templates\nAnt templates can be set up to use predefined blocks of ant code as code tips within your Eclipse Ant Editor when editing Ant build files.\n\nEclipseAntTemplates\n\n!Environmental Variables\nYou can also set Ant Environmental Variables within Eclipse.\n\nEclipseAntEvrionVars\n
!Introduction\nApache ANT in some cases is just as hard as Make in understanding how to use and write build files. This is a resource list of notes and articles on using ANT and writing ANT build files.\n\n!Notes\n[[Out Build Target, Martin Fowler|]]\n[[Touch File, Martin Fowler|]]\n[[Ant in Anger, Steve Longhran|]]\n[[Project Dependencies Using Ant, Joe Schemtzer|]]\n[[Extending ANT, pdf format|]]\n[[An the ony bug you want near yrou project, Eric Hatcher Power Point format|]]\n\n\n
!Introduction\nA set of articles on the correct us of the Apache Ant build tool.\n\n!Articles\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Ant")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \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\ .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\ .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----\napplication/x-gzip\n.gz\n----\napplication/x-rar-compressed\n.rar\n----\napplication/octet-stream\ .exe .dll .ocx
/***\n|Name|AttachFilePlugin|\n|Source||\n|Version|3.5.3|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin,macro|\n|Requires||\n|Overrides|'image' and 'prettyLink' formatters, TiddlyWiki.prototype.getRecursiveTiddlerText()|\n|Description|Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage|\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|]]'' 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., {{{}}} 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''2007.03.01 [3.5.3]'' use apply() to invoke hijacked function\n''2007.02.25 [3.5.2]'' in hijack of "prettyLink", fix version check for TW2.2 compatibility (prevent incorrect use of fallback handler)\n''2007.01.09 [3.5.1]'' onClickAttach() refactored to create separate createAttachmentTiddler() API for use with FileDropPluginHandlers\n|please see [[AttachFilePluginHistory]] for additional revision details|\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n// // version\n//{{{\nversion.extensions.attach = {major: 3, minor: 5, revision: 3, date: new Date(2007,3,1)};\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 fileErr: "Invalid path/file or file not found",\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:|[[%0|%0]] - {{{type=%1, size=%2 bytes, encoded=%3 bytes}}}|\sn",\n nodataReport: "| embedded:|//none//|\sn",\n localReport: "| local file:|/%LOCAL_LINK%/[[%0|%1]]|\sn",\n nolocalReport: "| local file:|//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 ="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n = 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 style="border:0"><tr style="border:0"><td style="border:0;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 style="border:0">\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 style="border:0"><td style="border:0;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 style="border:0">\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;">\s\n </td></tr><tr style="border:0"><td style="border:0;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 style="border:0">\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;"\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 style="border:0"><td style="border:0;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 style="border:0">\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 style="border:0"><td style="border:0;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 style="border:0">\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;" style="display:none">\s\n </td></tr></table>\s\n </div>\s\n <table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n attach as&nbsp;\s\n </td><td style="border:0" 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;; }"\s\n onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt;" %disabled%>\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n description&nbsp;\s\n </td><td style="border:0" colspan=2>\s\n <input type=text name="notes" size=15 autocomplete=off>\s\n </td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\s\n add tags&nbsp;\s\n </td><td style="border:0">\s\n <input type=text name="tags" size=15 autocomplete=off value="" onfocus="">\s\n </td><td style="width:40%;text-align:right;border:0">\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 // attach the file\n return this.createAttachmentTiddler(theSource, theDate, theNotes, theTags, theTitle,\n useData, useLocal, useURL, theLocal, theURL, theMIMEType, upload);\n },\n getMIMEType:\n function(src,def) {\n var ext = src.substr(src.lastIndexOf('.')).toLowerCase();\n var list=store.getTiddlerText(this.typeList);\n if (!list || !list.trim().length) return def;\n // get server script list content from tiddler\n var parts=list.split("\sn----\sn");\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var mime=lines.shift(); // 1st line=MIME type\n var match=lines.shift(); // 2nd line=matching extensions\n if (match.indexOf(ext)!=-1) return mime;\n }\n return def;\n },\n createAttachmentTiddler:\n function (theSource, theDate, theNotes, theTags, theTitle,\n useData, useLocal, useURL, theLocal, theURL, theMIMEType, upload) {\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) { 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)\n 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 var panel=document.getElementById("attachPanel"); if (panel)"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 {"UniversalXPConnect"); }\n catch(e) { alert("access denied: "+filePath); return null; }\n var file = Components.classes[";1"].createInstance(Components.interfaces.nsILocalFile);\n try { file.initWithPath(filePath); } catch(e) { alert("cannot read file - invalid path: "+filePath); return null; }\n if (!file.exists()) { alert("cannot read file - not found: "+filePath); return null; }\n var inputStream = Components.classes[";1"].createInstance(Components.interfaces.nsIFileInputStream);\n inputStream.init(file, 0x01, 00004, null);\n var bInputStream = Components.classes[";1"].createInstance(Components.interfaces.nsIBinaryInputStream);\n bInputStream.setInputStream(inputStream);\n return(bInputStream.readBytes(inputStream.available()));\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 {'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"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"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\n//{{{\n// test for local file existence\n// Returns true/false without visible error display\n// Uses Components for FF and ActiveX FSO object for MSIE\nif (config.macros.attach.fileExists==undefined) config.macros.attach.fileExists=function(theFile) {\n var found=false;\n // DEBUG: alert('testing fileExists('+theFile+')...');\n if(window.Components) {\n try {"UniversalXPConnect"); }\n catch(e) { return false; } // security access denied\n var file = Components.classes[";1"].createInstance(Components.interfaces.nsILocalFile);\n try { file.initWithPath(theFile); }\n catch(e) { return false; } // invalid directory\n found = file.exists();\n }\n else { // use ActiveX FSO object for MSIE \n var fso = new ActiveXObject("Scripting.FileSystemObject");\n found = fso.FileExists(theFile)\n }\n // DEBUG: alert(theFile+" "+(found?"exists":"not found"));\n return found;\n}\n//}}}\n\n//{{{\nif (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {\n\n // extract embedded data, local and remote links (if any)\n var startmarker="---BEGIN_DATA---\sn";\n var endmarker="\sn---END_DATA---";\n var pos=0; var endpos=0;\n var text = store.getTiddlerText(title);\n var embedded="";\n var locallink="";\n var remotelink="";\n\n // look for embedded data, convert to data: URI\n if ((pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1)\n embedded="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\sn/g,'');\n if (embedded.length && !config.browser.isIE)\n return embedded; // use embedded data if any... except for IE, which doesn't support data URI\n\n // no embedded data... fallback to local/remote reference links...\n\n // look for 'attachment link markers'\n if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1)\n locallink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1)\n remotelink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n\n // document is being served remotely... use remote URL (if any) (avoids security alert)\n if (remotelink.length && document.location.protocol!="file:")\n return remotelink; \n\n // local link only... return link without checking file existence (avoids security alert)\n if (locallink.length && !remotelink.length) \n return locallink; \n\n // local link, check for file exist... use local link if found\n if (locallink.length) { \n if (this.fileExists(getLocalPath(locallink))) return locallink;\n // maybe local link is relative... add path from current document and try again\n var pathPrefix=document.location.href; // get current document path and trim off filename\n var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\s\s"); \n if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);\n if (this.fileExists(getLocalPath(pathPrefix+locallink))) return locallink;\n }\n\n // no embedded data, no local (or not found), fallback to remote URL (if any)\n if (remotelink.length) \n return remotelink;\n\n return ""; // attachment URL doesn't resolve\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) {\n var v=version.major+.1*version.minor+.01*version.revision;\n if (v>=2.13) {\n config.formatters[i].handler=function(w) \n {\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[3])\n {\n // Pretty bracketted link\n var link = lookaheadMatch[3];\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 e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))\n ? createExternalLink(w.output,link)\n : createTiddlyLink(w.output,link,false,null,w.isStatic);\n }\n else\n {\n e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n } else { // FALLBACK for TW2.1.2 and earlier\n config.formatters[i].handler=function(w)\n {\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 } // END FALLBACK\n } // if "prettyLink" formatter found\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.apply(this,arguments);\n }\n}\n//}}}\n
/***\n|Name|AttachFilePluginFormatters|\n|Source||\n|Version||\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|'image' and 'prettyLink' formatters, TiddlyWiki.prototype.getRecursiveTiddlerText|\n|Description|run-time library for distributing attachment tiddlers|\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: for additional information.''\n!!!!!Revision History\n<<<\n''2007.03.01 []'' sync with AttachFilePlugin v3.5.3 (use apply() to invoke hijack function)\n''2007.02.25 []'' sync with AttachFilePlugin v3.5.2 (fix for version check for TW2.2)\n''2007.01.09 []'' sync with AttachFilePlugin v3.5.1\n''2006.11.30 []'' sync with AttachFilePlugin v3.5.0\n''2006.11.09 []'' sync with AttachFilePlugin v3.4.6 (real fix for TW2.1.3)\n''2006.11.08 []'' sync with AttachFilePlugin v3.4.5 (temporary fix for TW2.1.3)\n''2006.09.10 []'' sync with AttachFilePlugin v3.4.4\n''2006.07.24 []'' sync with AttachFilePlugin v3.4.3\n''2006.07.13 []'' sync with AttachFilePlugin v3.4.2\n''2006.06.15 []'' sync with AttachFilePlugin v3.4.1\n''2006.05.20 []'' sync with AttachFilePlugin v3.4.0\n''2006.05.13 []'' 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\n//{{{\n// test for local file existence\n// Returns true/false without visible error display\n// Uses Components for FF and ActiveX FSO object for MSIE\nif (config.macros.attach.fileExists==undefined) config.macros.attach.fileExists=function(theFile) {\n var found=false;\n // DEBUG: alert('testing fileExists('+theFile+')...');\n if(window.Components) {\n try {"UniversalXPConnect"); }\n catch(e) { return false; } // security access denied\n var file = Components.classes[";1"].createInstance(Components.interfaces.nsILocalFile);\n try { file.initWithPath(theFile); }\n catch(e) { return false; } // invalid directory\n found = file.exists();\n }\n else { // use ActiveX FSO object for MSIE \n var fso = new ActiveXObject("Scripting.FileSystemObject");\n found = fso.FileExists(theFile)\n }\n // DEBUG: alert(theFile+" "+(found?"exists":"not found"));\n return found;\n}\n//}}}\n\n//{{{\nif (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {\n\n // extract embedded data, local and remote links (if any)\n var startmarker="---BEGIN_DATA---\sn";\n var endmarker="\sn---END_DATA---";\n var pos=0; var endpos=0;\n var text = store.getTiddlerText(title);\n var embedded="";\n var locallink="";\n var remotelink="";\n\n // look for embedded data, convert to data: URI\n if ((pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1)\n embedded="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\sn/g,'');\n if (embedded.length && !config.browser.isIE)\n return embedded; // use embedded data if any... except for IE, which doesn't support data URI\n\n // no embedded data... fallback to local/remote reference links...\n\n // look for 'attachment link markers'\n if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1)\n locallink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1)\n remotelink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));\n\n // document is being served remotely... use remote URL (if any) (avoids security alert)\n if (remotelink.length && document.location.protocol!="file:")\n return remotelink; \n\n // local link only... return link without checking file existence (avoids security alert)\n if (locallink.length && !remotelink.length) \n return locallink; \n\n // local link, check for file exist... use local link if found\n if (locallink.length) { \n if (this.fileExists(getLocalPath(locallink))) return locallink;\n // maybe local link is relative... add path from current document and try again\n var pathPrefix=document.location.href; // get current document path and trim off filename\n var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\s\s"); \n if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);\n if (this.fileExists(getLocalPath(pathPrefix+locallink))) return locallink;\n }\n\n // no embedded data, no local (or not found), fallback to remote URL (if any)\n if (remotelink.length) \n return remotelink;\n\n return ""; // attachment URL doesn't resolve\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) {\n var v=version.major+.1*version.minor+.01*version.revision;\n if (v>=2.13) {\n config.formatters[i].handler=function(w) \n {\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[3])\n {\n // Pretty bracketted link\n var link = lookaheadMatch[3];\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 e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))\n ? createExternalLink(w.output,link)\n : createTiddlyLink(w.output,link,false,null,w.isStatic);\n }\n else\n {\n e = createTiddlyLink(w.output,text,false,null,w.isStatic);\n }\n createTiddlyText(e,text);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n } else { // FALLBACK for TW2.1.2 and earlier\n config.formatters[i].handler=function(w)\n {\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 } // END FALLBACK\n } // if "prettyLink" formatter found\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.apply(this,arguments);\n }\n}\n//}}}\n
/***\n|Name|AttachFilePluginHistory|\n|Source||\n|Version|3.5.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|history|\n|Requires||\n|Overrides||\n|Description|Archived Revision History for AttachFilePlugin|\n\n!!!!!Archived Revision History for AttachFilePlugin\n<<<\n| Please see [[AttachFilePlugin]] for more recent revision details |\n''2006.11.30 [3.5.0]'' in getAttachment(), for local references, add check for file existence and fallback to remote URL if local file not found. Added fileExists() to encapsulate FF vs. IE local file test function (IE FSO object code is TBD).\n''2006.11.29 [3.4.8]'' in hijack for PrettyLink, 'simple bracketed link' opens tiddler instead of external link to attachment\n''2006.11.29 [3.4.7]'' in readFile(), added try..catch around initWithPath() to handle invalid/non-existent paths better.\n''2006.11.09 [3.4.6]'' REAL FIX for TWv2.1.3: incorporate new TW2.1.3 core "prettyLink" formatter regexp handling logic and check for version < 2.1.3 with fallback to old plugin code. Also, cleanup table layout in HTML (added "border:0" directly to table elements to override stylesheet)\n''2006.11.08 [3.4.5]'' TEMPORARY FIX for TWv2.1.3: disable hijack of wikiLink formatter due to changes in core wikiLink regexp definition. //Links to attachments are broken, but you can still use {{{[img[TiddlerName]]}}} to render attachments as images, as well as {{{background:url('[[TiddlerName]]')}}} in CSS declarations for background images.//\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 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<<<
| source file|{{{...\simages\smeow.gif}}}|\n| attached on|15 May 2006 by ELSDesignStudios|\n| embedded data|[[meow.gif|AttachFileSample]] - {{{type=image/gif, size=3399 bytes, encoded=4602 bytes}}}|\n| ~LocalFile|/%LOCAL_LINK%/[[images/meow.gif|images/meow.gif]]|\n| ~RemoteLink|/%REMOTE_LINK%/[[|]]|\nimage\n<<<\nusage: {{{[img[tooltip|AttachFileSample]] or [img[tooltip|AttachFileSample][link]]}}})\n[img[tooltip|AttachFileSample]]\n<<<\n\n/% DO NOT EDIT BELOW THIS POINT\n---BEGIN_DATA---\nimage/gif;base64,\nR0lGODlhOABQAPcAAAAACAAAEAAICAgICAgLDBAQCAQQGRAIEBgICBAQEBAQGBAY\nFBoOEhwUFCEYEBgYGA4cIBkgGyEcHCEhISkYGCkcHCEpHCklIRAgMRkmNSElKSEp\nNikeKykpKSExQiE5QjEhJTEpITEpKSkpMSkxISk1KTExITExKSktNTEpMTEpOTEx\nMSk5MSkxOSkxQik5PTkrKTkxMTE8KTFCMTExOTExQjE5PTFCPTk3MzlCMTkxQjk5\nQkI0MzlGPUg9M01JNi88TTlEUkI8REJCSkZDRFBDQkY/UFA/TjNMUkNOS1JKSkpW\nRj1KWEpKWj9OXEVZZlhMRlVLVVpSUlReUFdSYFVhX1JSa1VfbmBbU11ia2dcV3Fj\nXVpldWVkb2tnb3tnbGZ1ZHV6aWVwe3d5c2N4iXN3gntzgHeBiYd2dYWHeoh/jIKL\nkJWEfZmUh5CNlJ+VkICPn46XpZiSo5WfoJycnKaemaGcqKWlpZWnraWtqa2qoq2l\nrZavvKW4xK2lta2ws/8A/7WcjLWllLWlpbWlrb2tnMatnLWtpbWtrb2trbWttb2t\ntbWtvbW1pca1pbW1ra21va21xrW1tbW1vbW1xrW9tb21rb21tb21vb21xr29rb29\ntca9sca1vc69rda9ra29wa3GxrW9vbW9xq29zrHGyrPB0rXG1r29vb29xr29zr3G\nvb3Gxr3Gzr3G1sa9vcbGtc7GtdbGtcbGvc7GvdbGvd7Gvca9xsa9zsbGxsbGzsbG\n1s7DyNbGxtbGzs7G1rjQ2MbO0sbO3sbW1s7Owc7OzsbW3sbe3s7O1s7W0tbQx+HU\nzNDQ29bW1tvb1ufa1sPW6dDW4dbW3trY4sni7dbk797e3tbx9N7n3ufe3t7e597n\n597i7+fe597s9N73++fn3ufn5+fn7+fv5+fv7+/e5+/r4vfr4ufn9+fv9+fv/+/n\n7+/v8/Pz7/fv9+/v/+f3++f//+/39+/3/+//9+////f37/f39/f3//f/9/f////3\n7//39//3////9////yH5BAEAAIAALAAAAAA4AFAAQAj+AAEJHEiwoMGDCBMqXIiw\niA8tXbxIgXHhgY+FICSIiCFFihIeXRgm9OKlDJMqYs506UIDRIUKD7w8kLCiAw0q\n0ao8WCFhwgQqDx7E+EJHm0gpUaI0ibKDBo0dXeakazEkxYUOGjRMSQOmQw874eR9\nIHNPXrFba5Y8CLNDyYULGlZQRVjtzJCmTnew2AGp2j19gAGTC6ctnLvDZfWR07Aj\nCJAd4fTduxctFapbiDKTQ7gjSZcsT6PQqLmCxhA78v4GnuxOHuGzeei8kVLkh5I1\nb9y80XPp0q1s+lK7E3eQjSIvbqJAEiPGjR0/c9REqyavtTx9rVtn09asmJsvbMb+\nuLlcrFn3YsqsiRM33M3CDlkUsWMnT978cM206Y/WjH+187cEGOArqKCiCCJ00DEH\nHXXkIdJBEgQVlEsS1iThAwlg+EAXcNgBySiQQILKJWOM8YYy2Tyo4oqA5HELMtxx\nVwyLNA5UxAUxxPBWjTjGIIIWNSKUhhddUFFFU0O89BZjQ9DQwYUPVKABCEJg8cYZ\nK5aRxRNM0JDCCimkQMUONXUAwlVOKbGDGHhAMEczgemjTV2jXeCTBqZFoZASVDDR\nxGildTbHX3zUgJeTZ0Cimj5kBLHDEEM0IU59cd6TDmHm7WFQNHDAwcVoT5m2Qg2t\nAJPYau6wY01/2ohTjDb+Z91hhiK3FMiILnkcWIw1iLlz0BuPquHEFaDWtEMVclyX\nWpz1pUNONdKkkkoWyEGSqyKXvYJeNtmEo6pRCEkyaX3ykMPOYOWSw41+2rDTGjnd\nNoMMMsXoUkw05SFzXnlnFaiIikpOIIEUbrzaSit+RPFWByK4ocoordzC74iKKHLG\nFmm4kQciQSIkgQQIIEAAAQ+Q/IDIIieQAAFROPcHI9heUodh2ujT8c0CzcEdt8Ph\n7DONGgwxxs+A7BADEUT4SOMEMWyBBRYiEA2ID16oYYYZDsXwQGNOMHGFFUz4ucMF\nND2qRBdmeDEE0Uq0IccWSuDQwdwXXrBCkxVFKOH+VVB8UceMNHohxhVNipDCEBqk\noIGUTu70AA4P3PUEYG6cEQXiM0lwwRBryKNiF1dcwYQQDK+wQxZijGYmnk+tsEIV\nGrgTZ6VniMHUCHZ3EAWQCWlRxe+X47BCy8UEc08GcmfVwVUxLDHFECPoE01TTWhj\nTRQimBBDEW64QUYTZczBhBcJCTFEFKODSkMUZcAJWDWMjDJHGW4089df3DiRBRDg\nwzE7YPLgji5uIQmEzIMaeHgU+nbwqCaEaFEAXI82rqOav8gDLgOzjj5c9YpbXEIR\n2bjHLQ5yBjdw4QxjGs0OOvA6MQSjGrNLjX2akQ1U0KEMXlACDYh0uS3M4Q3+CeoA\nHbKBmHuE4yBJ6EEXUveomiBuCKhwA3AqOJmypIMb+ILEH1ChhTXoIUEbqwMiXsEL\nZThjOOEgB8cO4gYqKOEMDNxhFKjQBFmFw4IAZM25uJOKMWyhi35gxFk6WAxnqOcw\n5wKcQdAgJz84shrVcIMfRpEOSMqjGtGoTnVSJY78dIcRf2ADFPwgsbM0Q2LmaRVm\nGNKGYmzSPvYxFzsqOZ12dSsbACrlq85Sq1sQ6EBrfBAReHI1baTjUuGIhjZ0UZkC\n3cI89CqPeQrkBzq4IQ1nWMOCCsijoPhgBUKoQstokJUJQOkBSlADJVqRimKgghEw\ne4MW0KCxZvisIif+QwCUMnShkD2ABmaQAyQoMYoCXYINdCgGcKRmEAkRQAErI4DK\ngiIHP/wBEoy4hDvN0wxfMXRFo7CXNYh4j492TBG7VJVJV1oQKDBUCzi6WZQuUAai\n+UAEPvDRBWikEaTxIGo/EwIP/igFH0hARZoTwRC+8AUtFEFqPlCCFryghZtSRE8H\n6cIOHnABH0iBWl4wwxGgupIiKUEIPqjAqKhihSY4igYjMGcHUrCDKIS1hFKTAlVF\nAwIq1W19NMCnhCRQgRBAAQ28SIPP1nCGNBTDaXfZQQoq8LGgYAVSILjQBC6wAyEQ\nAQ11SFGNuvC7P+2ACXO4i+kipNYHdIBMppn+hxteRyYqCEwCOJDCHDyqIixoQQxu\nleyXojA3rFxgBK57ixcmcNozAOYeeAjCGWZiN7hM4AmjUFEVmpCFJrjuSxEhE1ZA\nYLq7KQFS0RjU/+5xhjI0YQcauEBesKoQM2QBUp113dzm4CjFZaVM8RWCGwA4u3sA\nowmq1cAE8GQF+iJECXNkwg6E11kmuCEdGSATCLISlyqAwXkQSI0TuACHdBTjDh0A\ngwmw0EAyiWElCilCEvDrlKfsoAzC0Ecc9uI6DXDVxxPwwgjuAQc8NSEa3UiDMngh\nu3v8oXZ3QIYX/KCQIdCxKYGiQhei8dw5tHEIXqjCHGAImHR8QAhAuEL+FsrwP8E0\nQxdwVogC71JjIXShFdcJDH6sUQxFQJAccHCvE87Qh0WVJRrhCJCBFEKNK0yYgZ3N\nwgrcAIl0zK414qAPAPPsXQvBSR7TrNiBJKGPNyAkGsbgA1NcxwLXuQEPwrA0s9wR\nDms8N1XuOOYQJLCF/ESDPwOsVR7glCoSliEOZWCgapNwJDm0AoKSqc49FEGFMtyh\nVqhIWArWoAgF5WEPLmqDfGTXM4M8oQxXSF2kxpSFHbTADX/wS6XIBatmSKILQzAc\npMIkhTSo4Q1pGGM2NqmYg1xhd2sYTQqcdAEqJMENmSywJtnBnVsoopomagMQGVSH\nQVziFc1AETn+qmNPg1CBCkFwQxC+RKa71bUMsnvuZDRZrmog45138HKu6FCxzGhr\nVdkQRzhEexAiZRMFe2nSClB3B21AsIrycNav34lDN9wiDwW6TBmdEQ720NoaCTmD\nGqgghnbvQA7ppt8twnKq+rwLktHIgxbaAIU1+AEVxSgGL3hRSF5tkFt3QEgsdOyG\nO1zUDWVgxK/1lQ53jbwsnNzOKf2giDdAgQ54zzu/aLgePi9kMqZIRzBGMYpfV6Px\nlaxGu7BjH3FkwxqrwvYYftDO7jxTl2dBRBsYcongkKtcs4w63AszmGaIA1ZnyTtH\nzaN5iQVIEXpwj0iw4Abr1OdcFKcPu/T+I/lc8rJftapYbOrAItNhQRHyyLS5CMOf\nfb0qGvqqV949WDE63MEN2qRDbGgUg+WtQARbdnr/cUq6wAg5NwfK1H7TdAl+kAd5\n4AYYswYJ8gpBQllcNTdj4AWMEAxyAAE+JiFKIB6jcAvBUC8jAjNugAUmQgfBVCNB\nAVsLVwVZwAQPYE5Q8hZ/MAqM0AonqAiDoAXioQdEFyTnVIRBoTIJoAAg0AVyYAeR\nACIjgghh8AaoMFI+gyEhgwAJoE9QQgBaqAAvWAaBdBmXcQd1ACdl8VE6kk8ZsoVJ\nCFEJMGl2MAdzADOv8AYdpQ+8wFIDUTIj44VBAQgeQlC1ogvNgAouykAHFMiHCkEJ\nqtAK0rQqjKgipWcNvyE7k6gip8QOXTeEmcgQbAAI3VByNBIQAAA7\n---END_DATA---\n%/
| source file|{{{...images\smeow2.jpg}}}|\n| attached on|15 May 2006 by ELSDesignStudios|\n| embedded data|//none//|\n| local link|/%LOCAL_LINK%/[[images/meow2.jpg|images/meow2.jpg]]|\n| remote link|/%REMOTE_LINK%/[[|]]|\nimage\n<<<\nusage: {{{[img[tooltip|AttachFileSample2]] or [img[tooltip|AttachFileSample2][link]]}}})\n[img[tooltip|AttachFileSample2]]\n<<<\n
/***\n|Name|AutoTaggerPlugin|\n|Source||\n|Version|1.5.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|TiddlyWiki.prototype.saveTiddler|\n|Description|Automatically tag tiddlers with their creation date, modification date, author, etc. and/or scan and tag the tiddler with any tags that are embedded in the content|\n\n!!!!!Usage\n<<<\nWhen ~AutoTagger is present, it automatically ''generates 'creation date' and 'creator' tag values'' for all newly created tiddlers, so that this information is retained even after a tiddler has been updated many times. In addition, if you enter ''//auto//'' as a tiddler tag value, ~AutoTagger ''scans the tiddler content'' (including title) for all existing tags, and ''automatically adds any embedded tags that it finds''.\n\nYou can also specify a default tag (e.g. "untagged") that will be added to the tiddler if no other tags have been specified. This ensures that all tiddlers will have at least one tag associated with them.\n\nAfter the new tags have been added to the tiddler, they are treated just as if you had entered them by hand and can be edited to make any changes you want. Of course, as long as the "auto" tag is still present on a tiddler, ~AutoTagger will re-scan that tiddler's content each time it is edited. If you DO edit the generated tags, you can remove the "auto" tag from the tiddler to prevent it from being re-scanned when you press 'done' to finish editing.\n\n//Note: the special-purpose ''"systemConfig" tag is not added automatically, even if matched in the tiddler content'', since this tag should be added manually to ensure it is always used appropriately.//\n\n//Note: if you have set the "auto" tag on a tiddler, and then add several tags to your document, those tags will ''not'' be automatically added to the tiddler until you actually edit that tiddler and press 'done' to trigger an AutoTagger scan.//\n<<<\n!!!!!Configuration\n<<<\nThe ~AutoTagger plugin comes with a ''self-contained control panel''. Use these controls to enable or disable automatic 'creation date' or 'creator' tagging, modify the default date formatting, or redefine the special 'scan trigger' tag value (so you can use "auto" as a normal tag value in your document).\n\n<<option chkAutoTagAuthor>> add 'created by' tag //(when a tiddler is first created)//\n<<option chkAutoTagDate>> add 'creation date' tag, using date format: <<option txtAutoTagFormat>>\n<<option chkAutoTagEditor>> add 'edited by' tag //(when a tiddler is updated)//\n<<option chkAutoTagModDate>> add 'modification date' tag, using date format: <<option txtAutoTagModFormat>>\n<<option chkAutoTagTrigger>> scan tiddler content for matching tags when tagged with: <<option txtAutoTagTrigger>>\n<<option chkAutoTagDefault>> add default tag(s) to tiddlers that are not otherwise tagged: <<option txtAutoTagDefault>>\n----\n//date formatting syntax://\n^^//''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero//^^\n^^//''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero//^^\n^^//''YYYY'' - full year, ''YY'' - two digit year//^^\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''AutoTaggerPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.03.14 [1.5.0]'' added support for tagging tiddlers with modification date\n''2007.01.20 [1.4.1]'' don't add create date tag to dated journal tiddlers (based on request from ConalElliot)\n''2006.12.10 [1.4.0]'' added option to use default tag value when no tags are specified\n''2006.08.29 [1.3.3]'' use newTags.contains() instead of newTags.find() to check for 'auto' tag\n''2006.06.15 [1.3.2]'' hijack TiddlyWiki.prototype.saveTiddler instead of store.saveTiddler. Permits other plugins to also hijack the function (thanks to Simon Baird for finding this!)\n''2006.05.31 [1.3.1]'' Re-assemble tags into a space-separated string (use encodeTiddlyLink to add {{{[[...]]}}} as needed) before passing it on to core (or other hijacked function)\n''2005.10.09 [1.3.0]'' Added 'edited by' tagging. Combined documentation and code into a single tiddler\n''2005.08.16 [1.2.0]'' Added optional scanning for tags in tiddler content (based on suggestion from Jacques Turbé)\n''2005.08.15 [1.1.0]'' Added 'created by' tag generation (based on suggestion from Elise Springer). Renamed from DateTag to AutoTagger\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.autoTagger = {major: 1, minor: 5, revision: 0, date: new Date(2007,3,14)};\n\nif (config.options.chkAutoTagDate==undefined)\n config.options.chkAutoTagDate=false;\nif (config.options.chkAutoTagModDate==undefined)\n config.options.chkAutoTagModDate=false;\nif (config.options.chkAutoTagEditor==undefined)\n config.options.chkAutoTagEditor=false;\nif (config.options.chkAutoTagAuthor==undefined)\n config.options.chkAutoTagAuthor=false;\nif (config.options.chkAutoTagTrigger==undefined)\n config.options.chkAutoTagTrigger=false;\nif (config.options.txtAutoTagTrigger==undefined)\n config.options.txtAutoTagTrigger="auto";\nif (config.options.chkAutoTagDefault==undefined)\n config.options.chkAutoTagDefault=false;\nif (config.options.txtAutoTagDefault==undefined)\n config.options.txtAutoTagDefault="untagged";\nif (config.options.txtAutoTagFormat==undefined)\n config.options.txtAutoTagFormat="YYYY.0MM.0DD";\nif (config.options.txtAutoTagModFormat==undefined)\n config.options.txtAutoTagModFormat="YYYY.0MM.0DD";\n\n// hijack saveTiddler()\nTiddlyWiki.prototype.coreSaveTiddler=TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler=function(title,newTitle,newBody,modifier,modified,tags)\n{\n // get the tags as passed from the tiddler editor\n var newTags = [];\n if (tags) newTags = (typeof tags == "string") ? tags.readBracketedList() : tags;\n\n // if saving a new tiddler, add 'creation date' tag\n var now=new Date().formatString(config.options.txtAutoTagFormat);\n if (config.options.chkAutoTagDate && (store.getTiddler(title)==undefined))\n if (newTitle!=now) newTags.pushUnique(now); // don't add create date tag to dated journal tiddlers\n // if saving a new tiddler, add 'created by' tag\n if (config.options.chkAutoTagAuthor && (store.getTiddler(title)==undefined))\n newTags.pushUnique(config.options.txtUserName);\n // if saving an existing tiddler, add 'edited by' tag\n if (config.options.chkAutoTagEditor && store.getTiddler(title))\n newTags.pushUnique(config.options.txtUserName);\n // if saving an existing tiddler, add 'modification date' tag\n if (config.options.chkAutoTagModDate && store.getTiddler(title))\n newTags.pushUnique(new Date().formatString(config.options.txtAutoTagModFormat));\n\n // if tagged for scanning, find tags embedded in text of tiddler title/body\n var allTags = store.getTags();\n if (config.options.chkAutoTagTrigger\n && config.options.txtAutoTagTrigger.length\n && newTags.contains(config.options.txtAutoTagTrigger))\n for (var t=0; t<allTags.length; t++)\n {\n // note: don't automatically tag a tiddler with 'systemConfig'\n if (allTags[t][0]=='systemConfig')\n continue;\n if ((newBody.indexOf(allTags[t][0])!=-1) || (newTitle.indexOf(allTags[t][0])!=-1))\n newTags.pushUnique(allTags[t][0]);\n }\n\n // encode tags with [[...]] (as needed)\n for (var t=0; t<newTags.length; t++) newTags[t]=String.encodeTiddlyLink(newTags[t]);\n\n // if there are no tags on this tiddler (either user-entered or auto-tagged)\n // and AutoTagDefault is enabled then use default tag (if any)\n if (!newTags.length && config.options.chkAutoTagDefault && config.options.txtAutoTagDefault.length)\n newTags.push(config.options.txtAutoTagDefault);\n\n // reassemble tags into a string (for other plugins that require a string) and pass it all on\n return this.coreSaveTiddler(title,newTitle,newBody,modifier,modified,newTags.join(" "));\n}\n//}}}
/%enter FAQ list item text here%/\n{{menubox small{\n__enter FAQ display title text here__\n\nenter FAQ content here\n}}}
/***\n|Name|BlankPlugin|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description||\n\n!!!!!Usage\n<<<\nDescribe purpose and usage\n<<<\n!!!!!Configuration\n<<<\ncheckboxes and input fields for plugin-specific options\n<<<\n!!!!!Examples\n<<<\nsyntax for macros/formatters\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n<<<\n!!!!!Revision History\n<<<\n''2007.01.01 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by ____________ \n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.PLUGINNAME= {major: 0, minor: 0, revision: 0, date: new Date(2007,1,1)};\n//}}}
/%\n|Name|BlankScript|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires||\n|Overrides||\n|Description||\n%/<script>\n var here=story.findContainingTiddler(place); if (!here) return;\n var tid=store.getTiddler(here.getAttribute('tiddler'));\n var out="";\n // add code here >>>\n return out;\n</script>
/***\n|Name|BreadcrumbsPlugin|\n|Source||\n|OriginalAuthor|Alan Hecht (with 2.0 update from 'jack' and revisions by Bram Chen)|\n|Version||\n|Author|Eric Shulman|\n|License|[[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Story.prototype.displayTiddler,TiddlyWiki.prototype.deleteTiddler|\n|Description|show a list of tiddlers viewed during this session. Also defines "back" (previousTiddler) toolbar button and macro|\n\n!Configuration\n<<<\n<<option chkShowBreadcrumbs>> show breadcrumbs display\n>//Note: although this checkbox does toggle the breadcrumbs ''setting'', the actual breadcrumbs ''display'' is not updated until the next crumb is added (or a previous crumb is clicked on). In order for the checkbox setting to have ''immediate'' effect, please see [[ToggleBreadcrumbs]], which uses [[InlineJavascriptPlugin]] to synchronize the checkbox setting and the breadcrumbs display.//\n<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler\n>//Note: standard (non-enabled) behavior is to ''trim'' the breadcrumbs list when visiting a previously viewed tiddler, so that all crumbs following that tiddler are removed from the list.//\n<<<\n!Revision History:\n__TiddlyTools (TT) variant:__\n1.5.8.0 2007.05.26 - added support for {{{<<option chkReorderBreadcrumbs>>}}} to toggle trim vs. re-order behavior when visiting previously viewed tiddlers\n1.5.7.0 2007.05.25 - added support for {{{<<option chkShowBreadcrumbs>>}}} to toggle //display// of breadcrumbs\n1.5.6.0 2007.05.24 - in refreshCrumbs(), remove non-existing tiddler titles from crumb list. Also, hijack deleteTiddler() so crumbs can be updated after tiddler is deleted.\n1.5.5.0 2007.04.11 - added optional params to previousTiddler macro handler() to allow alternative label and tooltip text (instead of default "back")\n1.5.4.0 2007.03.02 - in refreshCrumbs(), for TW2.2, look for "storyDisplay" instead of "tiddlerDisplay" but keep fallback to "tiddlerDisplay" for TW2.1 or earlier\n1.5.3.0 2007.02.24 - changed from hijack of onClickTiddlerLink to hijack of displayTiddler() so that ALL displayed tiddlers are recorded in the crumbs, including programmatically displayed tiddlers opened by macros, scripts, etc., (such as [[GotoPlugin]], among many others) in addition to those opened by clicks on links.\n1.5.2.0 2007.02.24 - eliminated global space clutter by moving function and data declarations so they are contained inside config.breadCrumbs object.\n1.5.1.0 2007.02.06 - added "previousTiddler" macro (for use in sidebar)\n1.5.0.0 2007.02.05 - added "previousTiddler" toolbar command (aka, "back")\n1.4.0.1 2006.08.04 - change spaces to tabs\n1.4.0.0 2006.08.04 - modified from 1.4.0 distro:\n<<<\nin refreshCrumbs(), set {{{display:none/block}}} instead of {{{visibility:hidden/visible}}}\nin restartHome(), check for valid crumbArea before setting style\ngeneral code cleanup/reformat using tabs to indent\n<<<\n|1.4.0|Aug 02, 2006|Fixed bug, the redefined onClickTiddlerLink_orig_breadCrumbs works incorrectly on IE|\n|1.3.0|Jul 20, 2006|Runs compatibly with TW 2.1.0 (rev #403+)|\n|1.2.0|Feb 07, 2006|change global array breadCrumbs to config.breadCrumbs by Eric's suggestion|\n|1.1.0|Feb 04, 2006|JSLint checked|\n|1.0.0|Feb 01, 2006|TW2 ready and code Cleaned-up|\n\n!Code section:\n***/\n//{{{\nversion.extensions.breadCrumbs = {major: 1, minor: 5, revision: 8, date: new Date("May 26, 2007")};\n\n// show/hide display option (default is to SHOW breadcrumbs)\nif (config.options.chkShowBreadcrumbs==undefined)\n config.options.chkShowBreadcrumbs=true;\n\n// REORDER breadcrumbs when visiting previously viewed tiddler (default is to TRIM breadcrumbs)\nif (config.options.chkReorderBreadcrumbs==undefined)\n config.options.chkReorderBreadcrumbs=false;\n\n// hijack story.displayTiddler() so crumbs can be refreshed when a tiddler is displayed\nif (Story.prototype.breadCrumbs_coreDisplayTiddler==undefined)\n Story.prototype.breadCrumbs_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n this.breadCrumbs_coreDisplayTiddler.apply(this,arguments);\n // if not displaying tiddler during document startup, then add it to the breadcrumbs\n // note: 'startingUp' flag is a global, set/reset by the core init() function\n if (!startingUp) config.breadCrumbs.addCrumb(title);\n}\n\n// hijack store.removeTiddler() so crumbs can be refreshed when a tiddler is deleted\nif (TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined)\n TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler;\nTiddlyWiki.prototype.removeTiddler= function(title)\n{\n this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);\n config.breadCrumbs.refreshCrumbs();\n}\n\nconfig.breadCrumbs = {\n crumbs: [], // the list of current breadcrumbs\n addCrumb: function (title) { // ELS: changed from passing event, "e", to passing tiddler title\n var thisCrumb = "[[" + title + "]]";\n var ind = this.crumbs.find(thisCrumb);\n if(ind === null)\n this.crumbs.push(thisCrumb);\n else if (config.options.chkReorderBreadcrumbs)\n this.crumbs.push(this.crumbs.splice(ind,1)[0]); // reorder crumbs\n else\n this.crumbs=this.crumbs.slice(0,ind+1); // trim crumbs\n this.refreshCrumbs();\n return false;\n },\n refreshCrumbs: function() {\n var crumbArea = document.getElementById("breadCrumbs");\n if (!crumbArea) {\n var crumbArea = document.createElement("div");\n = "breadCrumbs";\n "none";\n var targetArea= document.getElementById("tiddlerDisplay"); // TW2.1-\n if (!targetArea) targetArea = document.getElementById("storyDisplay"); // TW2.2+\n targetArea.parentNode.insertBefore(crumbArea,targetArea);\n }\n = config.options.chkShowBreadcrumbs?"block":"none";\n removeChildren(crumbArea);\n createTiddlyButton(crumbArea,"Home",null,this.restartHome);\n for (c=0; c<this.crumbs.length; c++)\n if (!store.tiddlerExists(this.crumbs[c].replace(/\s[\s[/,'').replace(/\s]\s]/,'')))\n this.crumbs.splice(c,1); // remove non-existing tiddler from crumbs\n wikify(" | " + this.crumbs.join(' > '),crumbArea);\n },\n restartHome: function() {\n story.closeAllTiddlers();\n restart();\n config.breadCrumbs.crumbs = [];\n var crumbArea = document.getElementById("breadCrumbs");\n if (crumbArea) = "none";\n }\n};\n\nconfig.commands.previousTiddler = {\n text: 'back',\n tooltip: 'view the previous tiddler',\n hideReadOnly: false,\n dateFormat: 'DDD, MMM DDth YYYY hh:0mm:0ss',\n handler: function(event,src,title) {\n var here=story.findContainingTiddler(src); if (!here) return;\n if (config.breadCrumbs.crumbs.length>1) {\n var crumb=config.breadCrumbs.crumbs[config.breadCrumbs.crumbs.length-2].replace(/\s[\s[/,'').replace(/\s]\s]/,'');\n story.displayTiddler(here,crumb);\n }\n else\n config.breadCrumbs.restartHome();\n return false;\n }\n};\n\nconfig.macros.previousTiddler= {\n label: 'back',\n prompt: 'view the previous tiddler',\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var label=params.shift(); if (!label) label=this.label;\n var prompt=params.shift(); if (!prompt) prompt=this.prompt;\n createTiddlyButton(place,label,prompt,function() {\n if (config.breadCrumbs.crumbs.length>1) {\n var crumb=config.breadCrumbs.crumbs[config.breadCrumbs.crumbs.length-2].replace(/\s[\s[/,'').replace(/\s]\s]/,'');\n story.displayTiddler(place,crumb);\n }\n else\n config.breadCrumbs.restartHome();\n });\n }\n}\n//}}}
/%CSS syntax attribute reference chart%/\n{{menubox{{{small{\n~~Source: Paul Petterson~~\n|>|>| !Selectors |\n| ''Selector'' | ''Sample'' | ''Description'' |\n| tag | H1 { color: blue ; } |Selects all of the specified HTML tags |\n| class | .myClass { color: blue; } |Selects all HTML tags with the attribute class="myClass" specified |\n| ID | #tag56 { color: blue; } |Selects the single HTML tag with the attibute ID="tag56" specified |\n| Grouping | H1, H2, H3 { color: blue ; } | selects all specified selectors (tags, class, or ID can be specified) |\n| Contextual | H1 B { color: red; } |selects all 'B' tags in H1. Context selectors can be tag, class, or ID selectors |\n\n|>|>|>| !Units |\n| ''Type'' | ''Unit'' | ''Description'' |\n| Length | mm, cm, in |millimeters, centimeters, inches |\n|~| pt, pc |point size, pica |\n|~| em, ex |relative to the point size of the font, relative to x-height of the font |\n|~| px |pixel (device dependent) |\n| Percentage | % |calculated as a percentage of their default size used in context |\n| Keywords | .. | ... |\n| Color | <name> |Color names ex: green see: ColorNames |\n|~| rgb() |specify number or percengate rgb(100%, 0, 100%) |\n|~| <hex value> |specify hex RGB number of color ex: #00FF00 see: ColorChart |\n\n|>|>|>| !Font Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| font-family |[font name or type] | font-family: Verdana, Arial; | Y |\n| font-style |normal, italic | font-style:italic; | Y |\n| font-variant |normal, small-cap | font-variant:small-caps; | Y |\n| font-weight |normal, bold | font-weight:bold; | Y |\n| font-size |[ xx-large, x-large, large, medium, small, x-small, xx-small ], [ larger, smaller ], \s\spercentage'\s\s, //length// | font-size:12pt; | Y |\n| font |[//font-style// / //font-variant// / //font-weight//] ? //font-size// [//line-height//] ? //font-family// | font: bold 12pt Arial; | Y |\n\n|>|>|>| !Color and Background Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| color |//color // | color: red | Y |\n| background-color |//color//, transparent | background-color: yellow | N* |\n| background-image |//url//, none | background-image: url(house.jpg)| N* |\n| background-repeat |repeat, repeat-x, repeat-y, no-repeat | background-repeat: no-repeat | N* |\n| background-attachment |scroll, fixed | background-attachment: fixed | N* |\n| background-position |[ //position// , //length// ], {1,2}, [ top, center, bottom ] -or- [ left, center, right ] | background-position: top center | N* |\n| background |transparent, //color// -or- //url// -or- repeat -or- scroll -or- //position// | background: silver url(house.jpg) repeat-y | N* |\n|>|>|>| !*Starting in CSS2, these properties are inherited. |\n\n|>|>|>| !Text Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| letter-spacing |normal, //length// | letter-spacing:5pt | Y |\n| text-decoration |none, underline, overline, line-through | text-decoration:underline | N |\n| vertical-align |sub, super, | vertical-align:sub | N |\n| text-transform |capitalize, uppercase, lowercase, none | text-transform:lowercase | N |\n| text-align |left, right, center, justify | text-align:center | N |\n| text-indent |//length//, //percentage// | text-indent:25px | N |\n| line-height |normal, //number//, //length//, //percentage// | line-height:15pt | N |\n\n\n''The //CSS Box//''\n<html>\n<div style="color:black;background-color:#FFFFCC;padding:1em;border:thin solid black;text-align:center;width=30%">margin\n<div style="color:white;background-color:black;padding:1em;border:thin solid black;text-align:center;width=100%">border\n<div style="color:black;background-color:#FFCC99;padding:1em;border:thin solid black;text-align:center;width=100%">padding\n<div style="color:black;background-color:white;border:thin solid black;text-align:center;width=100%">content<br/>\n<div style="float:left">&lt;-</div><div style="float:right">-&gt;</div>CSS 'width'\n</div>\n</div>\n</div>\n</div>\n</html>\n\n\n|>|>|>| !Box Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| margin-top |//length//, //percentage//, auto | margin-top:5px | N |\n| margin-right |//length//, //percentage//, auto | margin-right:5px | N |\n| margin-bottom |//length//, //percentage//, auto | margin-bottom:1em | N |\n| margin-left |//length//, //percentage//, auto | margin-left:5pt | N |\n| margin |//length//, //percentage//, auto {1,4}| margin: 10px 5px 10px 5px | N |\n| padding-top |//length//, //percentage// | padding-top:10%| N |\n| padding-right |//length//, //percentage// | padding-right:15px | N |\n| padding-bottom |//length//, //percentage// | padding-bottom:1.2em | N |\n| padding-left |//length//, //percentage// | padding-left:10pt; } | N |\n| padding |//length//, //percentage// {1,4}| padding: 10px 10px 10px 15px | N |\n| border-top-width |thin, medium, thick, //length// | border-top-width:thin | N |\n| border-right-width |thin, medium, thick, //length// | border-right-width:medium | N |\n| border-bottom-width |thin, medium, thick, //length// | border-bottom-width:thick | N |\n| border-left-width |thin, medium, thick, //length// | border-left-width:15px | N |\n| border-width |thin, medium, thick, //length// {1,4}| border-width: 3px 5px 3px 5px | N |\n| border-top-color |//color // | border-top-color:navajowhite | N |\n| border-right-color |//color// | border-right-color:whitesmoke | N |\n| border-bottom-color |//color// | border-bottom-color:black | N |\n| border-left-color |//color// | border-left-color:#C0C0C0 | N |\n| border-color |//color// {1,4} | border-color: green red white blue; } | N |\n| border-top-style |none, solid, double, groove, ridge, inset, outset | border-top-style:solid | N |\n| border-right-style |none, solid, double, groove, ridge, inset, outset | border-right-style:double | N |\n| border-bottom-style |none, solid, double, groove, ridge, inset, outset | border-bottom-style:groove | N |\n| border-left-style |none, solid, double, groove, ridge, inset, outset | border-left-style:none | N |\n| border-style |none, solid, double, groove, ridge, inset, outset | border-style:ridge; }| N |\n| border-top |//border-width//, //border-style//, //border-color// | border-top: medium outset red | N |\n| border-right |//border-width//, //border-style//, //border-color// | border-right: thick inset maroon | N |\n| border-bottom |//border-width//, //border-style//, //border-color// | border-bottom: 10px ridge gray | N |\n| border-left |//border-width//, //border-style//, //border-color// | border-left: 1px groove red | N |\n| border |//border-width//, //border-style//, //border-color// | border: thin solid blue | N |\n| float |none, left, right | float:none | N |\n| clear |none, left, right, both | clear:left | N |\n\n|>|>|>| !Classification Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| display |none, block, inline, list-item | display:none | N |\n| list-style-type |disk, circle, square, decimal, lower-roman, upper-roman, lower-alpha, upper-alpha, none | list-style-type:upper-alpha | Y |\n| list-style-image |//url//, none | list-style-image:url(icFile.gif) | Y |\n| list-style-position |inside, outside | list-style-position:inside | Y |\n| list-style |//keyword// -or- //position// -or- //url// | list-style: square outside url(icFolder.gif) | Y |\n\n|>|>|>| !Positioning Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Applies Too'' | ''Inherited?'' |\n| clip |//shape//, auto | clip:rect(0px 200px 200px 0px) | all element | N |\n| height |//length//, auto | height:200px | DIV, SPAN and replaced element | N |\n| left |//length//, //percentage//, auto | left:0px | absolutely and relatively positioned element | N |\n| overflow |visible, hidden, scroll, auto | overflow:scroll | all element | N |\n| position |absolute, relative, static | position:absolute | all element | N |\n| top |//length//, //percentage//, auto | top:0px | absolutely and relatively positioned element | N |\n| visibility |visible, hidden, inherit | visibility:visible | all element | N |\n| width |//length//, //percentage//, auto | width:80%| DIV, SPAN and replaced element | N |\n| z-index |auto, //integer// | z-index:-1| absolutely and relatively positioned element | N |\n\n|>|>|>| !Printing Properties |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| page-break-before |auto, always -or- left, right | page-break-before:alway | N |\n| page-break-after |auto, always -or- left, right | page-break-before:auto | N |\n\n|>|>|>| !Pseudo Classes |\n| ''Property'' | ''Valid Values'' | ''Example'' | ''Inherited?'' |\n| cursor |auto, crosshair, default, hand, move, e-resize, ne-resize, nw-resize, n-resize, se-resize, sw-resize, s-resize, w-resize, text, wait, help | { cursor:hand; } | Y |\n| active, hover, link, visited | n/a | a:hover { color:red; } | Y |\n| first-letter, first-line |any font manipulating declaration | p:first-letter{ float:left;color:blue } | N |\n}}}}}}
/***\n|Name|CheckboxPlugin|\n|Source||\n|Version|2.1.3|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Add checkboxes to your tiddler content|\n\nCheckbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title|tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title|tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title|tag)] or [x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the | or : separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title|)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it. //''NOTE: beginning with version 2.1.2 of this plugin, the "|" separator is the preferred separator between the title and tag name, as it avoids syntactic ambiguity when ":" is used within tiddler titles or tag names.''//\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.\n\nThe first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Configuration\n<<<\nNormally, when a checkbox state is changed, the affected tiddlers are automatically re-rendered, so that any checkbox-dependent dynamic content can be updated. There are three possible tiddlers to be re-rendered, depending upon where the checkbox is placed, and what kind of storage method it is using.\n*''container'': the tiddler in which the checkbox is displayed. (e.g., this tiddler)\n*''tagged'': the tiddler that is being tagged (e.g., "~MyTask" when tagging "~MyTask:done")\n*''tagging'': the "tag tiddler" (e.g., "~done" when tagging "~MyTask:done")\nYou can set the default refresh handling for all checkboxes in your document by using the following javascript syntax either in a systemConfig plugin, or as an inline script. (Substitute true/false values as desired):\n{{{config.checkbox.refresh = { tagged:true, tagging:true, container:true };}}}\n\nYou can also override these defaults for any given checkbox by using an initialization function to set one or more of the refresh options. For example:\n{{{[_{this.refresh.container=false}]}}}\n<<<\n!!!!!Examples\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\n>checked and unchecked static default values\n>[X] label\n>[_] label\n//{{{\n[_=demo] label\n//}}}\n>document-based value (id='demo', no cookie)\n>[_=demo] label\n//{{{\n[_=chkDemo] label\n//}}}\n>cookie-based value (id='chkDemo')\n>[_=chkDemo] label\n//{{{\n[_(CheckboxPlugin|demotag)]\n[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}]\n//}}}\n>tag-based value (TogglyTagging)\n>[_(CheckboxPlugin|demotag)] toggle 'demotag' (and refresh tiddler display)\n>[_(CheckboxPlugin|demotag){this.refresh.tagged=this.refresh.container=false}] toggle 'demotag' (no refresh)\n>current tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n><script label="click to view current tags">alert(store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString());return false</script>\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\n>custom init and onClick functions\n>[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.05.04 - 2.1.3 fix use of findContainingTiddler() to check for a non-null return value, so that checkboxes won't crash when used outside of tiddler display context (such as in header, sidebar or mainmenu)\n2006.03.11 - 2.1.2 added "|" as delimiter to tag-based storage syntax (e.g. "tiddler|tag") to avoid parsing ambiguity when tiddler titles or tag names contain ":". Using ":" as a delimiter is still supported but is deprecated in favor of the new "|" usage. Based on a problem reported by JeffMason.\n2006.02.25 - 2.1.0 added configuration options to enable/disable forced refresh of tiddlers when toggling tags\n2006.02.23 - 2.0.4 when toggling tags, force refresh of the tiddler containing the checkbox.\n2006.02.23 - 2.0.3 when toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n2006.02.23 - 2.0.2 when using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n{{{[x([[Tiddler with spaces]]:[[tag with spaces]])]}}}\n2006.01.10 - 2.0.1 when toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n2006.01.04 - 2.0.0 update for ~TW2.0\n2005.12.27 - 1.1.2 Fix lookAhead regExp handling for {{{[x=id]}}}, which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n2005.12.26 - 1.1.2 Corrected use of toUpperCase() in tiddler re-write code when comparing {{{[X]}}} in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n2005.12.26 - 1.1.0 Revise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock\n2005.12.25 - 1.0.0 added support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n2005.12.08 - 0.9.3 support separate 'init' and 'onclick' function definitions.\n2005.12.08 - 0.9.2 clean up lookahead pattern\n2005.12.07 - 0.9.1 only update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n2005.12.07 - 0.9.0 initial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 1, revision:3 , date: new Date(2006,5,4)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.checkbox = { refresh: { tagged:true, tagging:true, container:true } };\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n c.container=story.findContainingTiddler(w.output); if (c.container); // 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; // trim off leading "="\n if (config.options[]!=undefined)\n c.checked=config.options[];\n else\n config.options[]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=c.container;\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf("|"); if (pos==-1) var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[]=this.checked; if (,3)=="chk") saveOptionCookie(; }\n if ((! ||,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=story.findContainingTiddler(this); if (t) {\n var t=store.getTiddler(;\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n if (this.refresh.tagged) story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n if (this.refresh.tagging) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n }\n }\n // refresh containing tiddler (but not during initial rendering, or we get an infinite loop!)\n if (!this.init && this.refresh.container && this.container!=this.tiddler)\n story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox\n return true;\n}\n//}}}
/***\n| Name:|Clock2|\n| Author:|Simon Baird|\n| Description:|A skinnable, sizeable analog clock|\n| Source:||\n| Requires:|Firefox 1.5.x or maybe Safari|\n| Version:|1.0.3|\n| Date:|4-Aug-2006|\n!!Note\n* Does not work in IE or Opera due to lack of canvas support.\n* If you make a nice skin send it to me and I will include it here.\n!!Ideas\n* Can we support IE with this?\n* Skin should specify order of drawing so things can be on top of other things\n* Fix it so we can have filled and/or stroked elements\n* Skin should allow any number of moving and static elements\n* Make download and example for non-TW use\n* Make floating draggable?\n!!Examples\n{{{\n<<clock2 fancy>><<clock2 120>>\n<<clock2 chunkySwiss>> <<clock2 60 chunkySwiss noSeconds>><<clock2 '{\n outerBorder: { lineWidth: 60, radius:55, color: "#dd8877", alpha: 1 },\n smallIndicator: { lineWidth: 4, startAt: 80, endAt: 95, color: "white", alpha: 1 },\n largeIndicator: { lineWidth: 12, startAt: 77, endAt: 89, color: "#dd8877", alpha: 1 },\n hourHand: { lineWidth: 15, startAt: -15, endAt: 50, color: "white", alpha: 1 },\n minuteHand: { lineWidth: 10, startAt: 24, endAt: 200, color: "#771100", alpha: 0.6 },\n secondHand: { lineWidth: 3, startAt: 22, endAt: 83, color: "green", alpha: 0 },\n secondDecoration: { lineWidth: 1, startAt: 52, radius: 26, fillColor: "white", color: "red", alpha: 0.2 }\n}'>>\n\n}}}\n<<clock2 fancy>><<clock2 120>>\n<<clock2 chunkySwiss>> <<clock2 60 chunkySwiss noSeconds>><<clock2 '{\n outerBorder: { lineWidth: 60, radius:55, color: "#dd8877", alpha: 1 },\n smallIndicator: { lineWidth: 4, startAt: 80, endAt: 95, color: "white", alpha: 1 },\n largeIndicator: { lineWidth: 12, startAt: 77, endAt: 89, color: "#dd8877", alpha: 1 },\n hourHand: { lineWidth: 15, startAt: -15, endAt: 50, color: "white", alpha: 1 },\n minuteHand: { lineWidth: 10, startAt: 24, endAt: 200, color: "#771100", alpha: 0.6 },\n secondHand: { lineWidth: 3, startAt: 22, endAt: 83, color: "green", alpha: 0 },\n secondDecoration: { lineWidth: 1, startAt: 52, radius: 26, fillColor: "white", color: "red", alpha: 0.2 }\n}'>>\n\nSee also BigClock.\n!!Code\n***/\n//{{{\n\nwindow.CoolClock = function(canvasId,displayRadius,skinId,showSecondHand) {\n return this.init(canvasId,displayRadius,skinId,showSecondHand);\n}\n\nCoolClock.config = {\n clockTracker: {},\n tickDelay: 1000,\n longTickDelay: 15000,\n defaultRadius: 85,\n renderRadius: 100,\n defaultSkin: "swissRail",\n skins: {\n // try making your own...\n swissRail: {\n outerBorder: { lineWidth: 1, radius:95, color: "black", alpha: 1 },\n smallIndicator: { lineWidth: 2, startAt: 89, endAt: 93, color: "black", alpha: 1 },\n largeIndicator: { lineWidth: 4, startAt: 80, endAt: 93, color: "black", alpha: 1 },\n hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "black", alpha: 1 },\n minuteHand: { lineWidth: 7, startAt: -15, endAt: 75, color: "black", alpha: 1 },\n secondHand: { lineWidth: 1, startAt: -20, endAt: 85, color: "red", alpha: 1 },\n secondDecoration: { lineWidth: 1, startAt: 70, radius: 4, fillColor: "red", color: "red", alpha: 1 }\n },\n chunkySwiss: {\n outerBorder: { lineWidth: 5, radius:97, color: "black", alpha: 1 },\n smallIndicator: { lineWidth: 4, startAt: 89, endAt: 93, color: "black", alpha: 1 },\n largeIndicator: { lineWidth: 8, startAt: 80, endAt: 93, color: "black", alpha: 1 },\n hourHand: { lineWidth: 12, startAt: -15, endAt: 60, color: "black", alpha: 1 },\n minuteHand: { lineWidth: 10, startAt: -15, endAt: 85, color: "black", alpha: 1 },\n secondHand: { lineWidth: 4, startAt: -20, endAt: 85, color: "red", alpha: 1 },\n secondDecoration: { lineWidth: 2, startAt: 70, radius: 8, fillColor: "red", color: "red", alpha: 1 }\n },\n fancy: {\n outerBorder: { lineWidth: 5, radius:95, color: "green", alpha: 0.7 },\n smallIndicator: { lineWidth: 1, startAt: 80, endAt: 93, color: "black", alpha: 0.4 },\n largeIndicator: { lineWidth: 1, startAt: 30, endAt: 93, color: "black", alpha: 0.5 },\n hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "blue", alpha: 0.7 },\n minuteHand: { lineWidth: 7, startAt: -15, endAt: 92, color: "red", alpha: 0.7 },\n secondHand: { lineWidth: 10, startAt: 80, endAt: 85, color: "blue", alpha: 0.3 },\n secondDecoration: { lineWidth: 1, startAt: 30, radius: 50, fillColor: "blue", color: "red", alpha: 0.15 }\n }\n }\n};\n\nCoolClock.prototype = {\n init: function(canvasId,displayRadius,skinId,showSecondHand) {\n this.canvasId = canvasId;\n this.displayRadius = displayRadius || CoolClock.config.defaultRadius;\n this.skinId = skinId || CoolClock.config.defaultSkin;\n this.showSecondHand = typeof showSecondHand == "boolean" ? showSecondHand : true;\n this.tickDelay = CoolClock.config[ this.showSecondHand ? "tickDelay" : "longTickDelay"];\n\n this.canvas = document.getElementById(canvasId);\n this.canvas.setAttribute("width",this.displayRadius*2);\n this.canvas.setAttribute("height",this.displayRadius*2);\n\n this.renderRadius = CoolClock.config.renderRadius; \n\n var scale = this.displayRadius / this.renderRadius;\n this.ctx = this.canvas.getContext("2d");\n this.ctx.scale(scale,scale);\n\n CoolClock.config.clockTracker[canvasId] = this;\n this.tick();\n return this;\n },\n\n fullCircle: function(skin) {\n this.fullCircleAt(this.renderRadius,this.renderRadius,skin);\n },\n\n fullCircleAt: function(x,y,skin) {\n with (this.ctx) {\n save();\n globalAlpha = skin.alpha;\n lineWidth = skin.lineWidth;\n arc(x, y, skin.radius, 0, 2*Math.PI, false);\n if (skin.fillColor) {\n fillStyle = skin.fillColor\n fill();\n }\n else {\n // XXX why not stroke and fill\n strokeStyle = skin.color;\n stroke();\n }\n restore();\n }\n },\n\n radialLineAtAngle: function(angleFraction,skin) {\n with (this.ctx) {\n save();\n translate(this.renderRadius,this.renderRadius);\n rotate(Math.PI * (2 * angleFraction - 0.5));\n globalAlpha = skin.alpha;\n strokeStyle = skin.color;\n lineWidth = skin.lineWidth;\n if (skin.radius) {\n this.fullCircleAt(skin.startAt,0,skin)\n }\n else {\n beginPath();\n moveTo(skin.startAt,0)\n lineTo(skin.endAt,0);\n stroke();\n }\n restore();\n }\n },\n\n render: function(hour,min,sec) {\n var skin = CoolClock.config.skins[this.skinId];\n this.ctx.clearRect(0,0,this.renderRadius*2,this.renderRadius*2);\n\n this.fullCircle(skin.outerBorder);\n\n for (var i=0;i<60;i++)\n this.radialLineAtAngle(i/60,skin[ i%5 ? "smallIndicator" : "largeIndicator"]);\n \n this.radialLineAtAngle((hour+min/60)/12,skin.hourHand);\n this.radialLineAtAngle((min+sec/60)/60,skin.minuteHand);\n if (this.showSecondHand) {\n this.radialLineAtAngle(sec/60,skin.secondHand);\n this.radialLineAtAngle(sec/60,skin.secondDecoration);\n }\n },\n\n\n nextTick: function() {\n setTimeout("CoolClock.config.clockTracker['"+this.canvasId+"'].tick()",this.tickDelay);\n },\n\n stillHere: function() {\n return document.getElementById(this.canvasId) != null;\n },\n\n refreshDisplay: function() {\n var now = new Date();\n this.render(now.getHours(),now.getMinutes(),now.getSeconds());\n },\n\n tick: function() {\n if (this.stillHere()) {\n this.refreshDisplay()\n this.nextTick();\n }\n }\n}\n\n\n\nconfig.macros.clock2 = {\n counter: 0,\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var size,skin,seconds,skinData;\n for (var i=0;i<params.length;i++)\n if (/^\sd+$/.exec(params[i]))\n size = params[i];\n else if (params[i] == "noSeconds")\n seconds = false;\n else if (/^\s{/.exec(params[i]))\n eval("skinData = " + params[i]);\n else\n skin = params[i];\n if (skinData) {\n CoolClock.config.skins.customSkin = skinData;\n skin = "customSkin";\n }\n var canvas = createTiddlyElement(place,"canvas","clockcanvas"+this.counter);\n var clock = new CoolClock("clockcanvas"+this.counter,size,skin,seconds);\n this.counter++;\n }\n}\n\n//}}}\n
/***\n| Name|CloseOnCancelPlugin|\n| Description|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
/%\n|Name|CloseSlider|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin, NestedSlidersPlugin|\n|Overrides||\n|Description|embed a 'close' link floating in upper right corner of slider. closes current slider panel.|\n%/<script label="[x]" title="hide this section">\n var panel=place;\n while (panel && panel.className!='sliderPanel' && panel.className!='floatingPanel')\n { panel=panel.parentNode; }\n if (!panel) { alert('not in a slider'); return false; }\n'none';\n var cookie=panel.button.sliderCookie;\n if (cookie && cookie.length) {\n config.options[cookie]=false;\n if (config.options[cookie]!=panel.button.defOpen)\n saveOptionCookie(cookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n</script><script>\n"normal";\n if (story.findContainingTiddler(place))\n place.lastChild.className="toolbar button";\n else {\n var\n s.fontSize="90%"; s.float="right";\n }\n</script>
/***\n|Name|CollapseTiddlersPlugin|\n|Source||\n|Version|2007.30.03|\n|Author|Bradley Meck (modified by ELS)|\n|License|unknown|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|show/hide content of a tiddler while leaving tiddler title visible|\n\n|ELS 3/30/2007: add a shadow definition for CollapsedTemplate. Tweak ViewTemplate shadow so "fold/unfold" and "focus" toolbar items automatically appear when using default templates. Remove error check for "CollapsedTemplate" existence, since shadow version will now always work as a fallback. |\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\n//{{{\n\nconfig.shadowTiddlers.CollapsedTemplate=\n "<!--{{{-->\s\n <div class='toolbar' macro='toolbar expandTiddler collapseOthers closeTiddler closeOthers +editTiddler permalink references jump'></div>\s\n <div class='title' macro='view title'></div>\s\n <!--}}}-->";\n\n// automatically tweak shadow ViewTemplate to add "collapseTiddler collapseOthers" commands at 'front' of toolbar (before 'closeTiddler')\nconfig.shadowTiddlers.ViewTemplate=config.shadowTiddlers.ViewTemplate.replace(/closeTiddler/,"collapseTiddler collapseOthers closeTiddler");\n\nconfig.commands.collapseTiddler = {\ntext: "fold",\ntooltip: "Collapse this tiddler",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nif(e.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif(e.getAttribute("template") != t ){\ne.setAttribute("oldTemplate",e.getAttribute("template"));\nstory.displayTiddler(null,title,t);\n}\n}\n}\n}\n\nconfig.commands.expandTiddler = {\ntext: "unfold",\ntooltip: "Expand this tiddler",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nstory.displayTiddler(null,title,e.getAttribute("oldTemplate"));\n}\n}\n\nconfig.macros.collapseAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"Collapse All","",function(){\nstory.forEachTiddler(function(title,tiddler){\nif(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE])\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nstory.displayTiddler(null,title,t);\n})})\n}\n}\n\nconfig.macros.expandAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"Expand All","",function(){\nstory.forEachTiddler(function(title,tiddler){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif(tiddler.getAttribute("template") == t) story.displayTiddler(null,title,tiddler.getAttribute("oldTemplate"));\n})})\n}\n}\n\nconfig.commands.collapseOthers = {\ntext: "focus",\ntooltip: "Expand this tiddler and collapse all others",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nstory.forEachTiddler(function(title,tiddler){\nif(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (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//}}}\n
<!--{{{-->\n<!--\n|Name|CollapsedTemplate|\n|Source||\n|Version||\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|template|\n|Requires||\n|Overrides||\n|Description|alternative to ViewTemplate, used to display tiddler when 'folded'|\n-->\n<span class='toolbar' macro='tiddler ShowPopup with: FavoriteTiddlers "goto" "quick access to favorite tiddlers" button auto'></span>\n<span class='toolbar' macro='toolbar references jump'></span>\n<span class='toolbar'>|</span>\n<span class='toolbar' macro='toolbar permalink'></span>\n<span class='toolbar' macro='newDocument label:print "prompt:print an HTML snapshot of this tiddler" - print here'></span>\n<span class='toolbar' macro='toolbar +editTiddler copyTiddler sendTiddler'></span>\n<span class='toolbar'>|</span>\n<span class='toolbar' macro='toolbar expandTiddler collapseOthers closeTiddler closeOthers'></span>\n<span class='title'>\n <span class='floatleft' macro='tiddler ShowTiddlerIcons' style='cursor:auto !important;'></span>\n <span macro='view title'></span>\n</span>\n<!--}}}-->\n
/%RGB hexadecimal 216-color "Web safe" palette %/\nSource: Paul Petterson, revised by Eric Shulman\n{{menubox{\n|bgcolor(#FFF):FFF |bgcolor(#CCC):CCC |bgcolor(#999):999 |bgcolor(#666):@@color(white):666@@ |bgcolor(#333):@@color(white):333@@ |bgcolor(#000):@@color(white):000@@ |bgcolor(#FC0):~FC0 |bgcolor(#F90):F90 |bgcolor(#F60):@@color(white):F60@@ |bgcolor(#F30):@@color(white):F30@@ |>|>|>|>|>| |\n|bgcolor(#9C0):9C0 |>|>|>| |bgcolor(#C90):C90 |bgcolor(#FC3):~FC3 |bgcolor(#FC6):~FC6 |bgcolor(#F96):F96 |bgcolor(#F63):@@color(white):F63@@ |bgcolor(#C30):@@color(white):C30@@ |>|>|>| |bgcolor(#C03):@@color(white):C03@@ |\n|bgcolor(#CF0):~CF0 |bgcolor(#CF3):~CF3 |bgcolor(#330):@@color(white):330@@ |bgcolor(#660):@@color(white):660@@ |bgcolor(#990):990 |bgcolor(#CC0):~CC0 |bgcolor(#FF0):~FF0 |bgcolor(#C93):C93 |bgcolor(#C63):@@color(white):C63@@ |bgcolor(#300):@@color(white):300@@ |bgcolor(#600):@@color(white):600@@ |bgcolor(#900):@@color(white):900@@ |bgcolor(#C00):@@color(white):C00@@ |bgcolor(#F00):@@color(white):F00@@ |bgcolor(#F36):@@color(white):F36@@ |bgcolor(#F03):@@color(white):F03@@ |\n|bgcolor(#9F0):9F0 |bgcolor(#CF6):~CF6 |bgcolor(#9C3):9C3 |bgcolor(#663):@@color(white):663@@ |bgcolor(#993):993 |bgcolor(#CC3):~CC3 |bgcolor(#FF3):~FF3 |bgcolor(#960):@@color(white):960@@ |bgcolor(#930):@@color(white):930@@ |bgcolor(#633):@@color(white):633@@ |bgcolor(#933):@@color(white):933@@ |bgcolor(#C33):@@color(white):C33@@ |bgcolor(#F33):@@color(white):F33@@ |bgcolor(#C36):@@color(white):C36@@ |bgcolor(#F69):@@color(white):F69@@ |bgcolor(#F06):@@color(white):F06@@ |\n|bgcolor(#6F0):6F0 |bgcolor(#9F6):9F6 |bgcolor(#6C3):6C3 |bgcolor(#690):690 |bgcolor(#996):996 |bgcolor(#CC6):~CC6 |bgcolor(#FF6):~FF6 |bgcolor(#963):@@color(white):963@@ |bgcolor(#630):@@color(white):630@@ |bgcolor(#966):@@color(white):966@@ |bgcolor(#C66):@@color(white):C66@@ |bgcolor(#F66):@@color(white):F66@@ |bgcolor(#903):@@color(white):903@@ |bgcolor(#C39):@@color(white):C39@@ |bgcolor(#F6C):@@color(white):~F6C@@ |bgcolor(#F09):@@color(white):F09@@ |\n|bgcolor(#3F0):3F0 |bgcolor(#6F3):6F3 |bgcolor(#390):390 |bgcolor(#6C0):6C0 |bgcolor(#9F3):9F3 |bgcolor(#CC9):~CC9 |bgcolor(#FF9):~FF9 |bgcolor(#C96):C96 |bgcolor(#C60):@@color(white):C60@@ |bgcolor(#C99):C99 |bgcolor(#F99):F99 |bgcolor(#F39):@@color(white):F39@@ |bgcolor(#C06):@@color(white):C06@@ |bgcolor(#906):@@color(white):906@@ |bgcolor(#F3C):@@color(white):~F3C@@ |bgcolor(#F0C):@@color(white):~F0C@@ |\n|bgcolor(#0C0):0C0 |bgcolor(#3C0):3C0 |bgcolor(#360):@@color(white):360@@ |bgcolor(#693):693 |bgcolor(#9C6):9C6 |bgcolor(#CF9):~CF9 |bgcolor(#FFC):FFC |bgcolor(#FC9):~FC9 |bgcolor(#F93):F93 |bgcolor(#FCC):FCC |bgcolor(#F9C):~F9C |bgcolor(#C69):@@color(white):C69@@ |bgcolor(#936):@@color(white):936@@ |bgcolor(#603):@@color(white):603@@ |bgcolor(#C09):@@color(white):C09@@ |bgcolor(#303):@@color(white):303@@ |\n|bgcolor(#3C3):3C3 |bgcolor(#6C6):6C6 |bgcolor(#0F0):0F0 |bgcolor(#3F3):3F3 |bgcolor(#6F6):6F6 |bgcolor(#9F9):9F9 |bgcolor(#CFC):CFC |>|>| |bgcolor(#C9C):~C9C |bgcolor(#969):@@color(white):969@@ |bgcolor(#939):@@color(white):939@@ |bgcolor(#909):@@color(white):909@@ |bgcolor(#636):@@color(white):636@@ |bgcolor(#606):@@color(white):606@@ |\n|bgcolor(#060):@@color(white):060@@ |bgcolor(#363):@@color(white):363@@ |bgcolor(#090):090 |bgcolor(#393):393 |bgcolor(#696):696 |bgcolor(#9C9):9C9 |>|>| |bgcolor(#FCF):FCF |bgcolor(#F9F):~F9F |bgcolor(#F6F):@@color(white):~F6F@@ |bgcolor(#F3F):@@color(white):~F3F@@ |bgcolor(#F0F):@@color(white):~F0F@@ |bgcolor(#C6C):@@color(white):~C6C@@ |bgcolor(#C3C):@@color(white):~C3C@@ |\n|bgcolor(#030):@@color(white):030@@ |bgcolor(#0C3):0C3 |bgcolor(#063):@@color(white):063@@ |bgcolor(#396):396 |bgcolor(#6C9):6C9 |bgcolor(#9FC):9FC |bgcolor(#CFF):CFF |bgcolor(#39F):39F |bgcolor(#9CF):9CF |bgcolor(#CCF):CCF |bgcolor(#C9F):~C9F |bgcolor(#96C):@@color(white):96C@@ |bgcolor(#639):@@color(white):639@@ |bgcolor(#306):@@color(white):306@@ |bgcolor(#90C):@@color(white):90C@@ |bgcolor(#C0C):@@color(white):~C0C@@ |\n|bgcolor(#0F3):0F3 |bgcolor(#3F6):3F6 |bgcolor(#093):093 |bgcolor(#0C6):0C6 |bgcolor(#3F9):3F9 |bgcolor(#9FF):9FF |bgcolor(#9CC):9CC |bgcolor(#06C):@@color(white):06C@@ |bgcolor(#69C):69C |bgcolor(#99F):99F |bgcolor(#99C):99C |bgcolor(#93F):@@color(white):93F@@ |bgcolor(#60C):@@color(white):60C@@ |bgcolor(#609):@@color(white):609@@ |bgcolor(#C3F):@@color(white):~C3F@@ |bgcolor(#C0F):@@color(white):~C0F@@ |\n|bgcolor(#0F6):0F6 |bgcolor(#6F9):6F9 |bgcolor(#3C6):3C6 |bgcolor(#096):096 |bgcolor(#6FF):6FF |bgcolor(#6CC):6CC |bgcolor(#699):699 |bgcolor(#036):@@color(white):036@@ |bgcolor(#369):@@color(white):369@@ |bgcolor(#66F):@@color(white):66F@@ |bgcolor(#66C):@@color(white):66C@@ |bgcolor(#669):@@color(white):669@@ |bgcolor(#309):@@color(white):309@@ |bgcolor(#93C):@@color(white):93C@@ |bgcolor(#C6F):@@color(white):~C6F@@ |bgcolor(#90F):@@color(white):90F@@ |\n|bgcolor(#0F9):0F9 |bgcolor(#6FC):6FC |bgcolor(#3C9):3C9 |bgcolor(#3FF):3FF |bgcolor(#3CC):3CC |bgcolor(#399):399 |bgcolor(#366):@@color(white):366@@ |bgcolor(#069):@@color(white):069@@ |bgcolor(#039):@@color(white):039@@ |bgcolor(#33F):@@color(white):33F@@ |bgcolor(#33C):@@color(white):33C@@ |bgcolor(#339):@@color(white):339@@ |bgcolor(#336):@@color(white):336@@ |bgcolor(#63C):@@color(white):63C@@ |bgcolor(#96F):@@color(white):96F@@ |bgcolor(#60F):@@color(white):60F@@ |\n|bgcolor(#0FC):0FC |bgcolor(#3FC):3FC |bgcolor(#0FF):0FF |bgcolor(#0CC):0CC |bgcolor(#099):099 |bgcolor(#066):@@color(white):066@@ |bgcolor(#033):@@color(white):033@@ |bgcolor(#39C):39C |bgcolor(#36C):@@color(white):36C@@ |bgcolor(#00F):@@color(white):00F@@ |bgcolor(#00C):@@color(white):00C@@ |bgcolor(#009):@@color(white):009@@ |bgcolor(#006):@@color(white):006@@ |bgcolor(#003):@@color(white):003@@ |bgcolor(#63F):@@color(white):63F@@ |bgcolor(#30F):@@color(white):30F@@ |\n|bgcolor(#0C9):0C9 |>|>|>| |bgcolor(#09C):09C |bgcolor(#3CF):3CF |bgcolor(#6CF):6CF |bgcolor(#69F):69F |bgcolor(#36F):@@color(white):36F@@ |bgcolor(#03C):@@color(white):03C@@ |>|>|>| |bgcolor(#30C):@@color(white):30C@@ |\n|>|>|>|>|>| |bgcolor(#0CF):0CF |bgcolor(#09F):09F |bgcolor(#06F):@@color(white):06F@@ |bgcolor(#03F):@@color(white):03F@@ |>|>|>|>|>| |\n<script>"95%"</script>}}}
Background: #fff\nForeground: #000\nPrimaryPale: #8cf\nPrimaryLight: #18f\nPrimaryMid: #04b\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
//{{{\nconfig.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \n//}}}\n
/***\n|Name|CopyTiddlerPlugin|\n|Source||\n|Version|2.1.2|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Quickly create a copy of any existing tiddler|\n\n!!!!!Usage\n<<<\nView a tiddler and select the "copy" toolbar item. A new tiddler editor is opened with a title of "Copy of TiddlerName" containing copies of the text/tags from the original tiddler. Note: If select the "copy" toolbar item while //editing// a tiddler, the current values of the text/tags that are displayed in the existing tiddler editor are used (including any unsaved changes you may have made to those values).\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''CopyTiddlerPlugin'' (tagged with <<tag systemConfig>>)\n\n* When using the default (shadow) EditTemplate, the plugin automatically updates the template to include the ''copyTiddler'' toolbar command.\n* If you have created a custom EditTemplate tiddler, you will need to manually add the ''copyTiddler'' toolbar command to your existing template toolbar definition.\n* If you add ''copyTiddler'' to the ViewTemplate toolbar definition, the ''copy'' toolbar command will also appear when viewing a tiddler.\n{{{\n<!-- add 'copyTiddler' command to existing toolbar definition -->\n<div class='toolbar' macro='toolbar ... copyTiddler ... '>\n}}}\n<<<\n!!!!!Revisions\n<<<\n''2007.05.17 [2.1.2]'' use store.getTiddlerText() to retrieve tiddler content, so that SHADOW tiddlers can be copied correctly when in VIEW mode\n''2007.04.01 [2.1.1]'' in copyTiddler.handler(), fix check for editor fields by ensuring that found field actually has edit=="text" attribute\n''2007.02.05 [2.1.0]'' in copyTiddler.handler(), if editor fields (textfield and/or tagsfield) can't be found (i.e., tiddler is in VIEW mode, not EDIT mode), then get text/tags values from stored tiddler instead of active editor fields. Allows use of COPY toolbar directly from VIEW mode (based on a request from LaurentCharles)\n''2006.12.12 [2.0.0]'' completely rewritten so plugin just creates a new tiddler EDITOR with a copy of the current tiddler EDITOR contents, instead of creating the new tiddler in the STORE by copying the current tiddler values from the STORE.\n''2005.xx.xx [1.0.0]'' original version by Tim Morgan\n<<<\n!!!!!Credits\n>This feature was originally developed by Tim Morgan. Current version developed by EricShulman from [[ELS Design Studios|]]\n!!!!!Code\n***/\n//{{{\nversion.extensions.copyTiddler= {major: 2, minor: 1, revision: 2, date: new Date(2007,5,17)};\nconfig.commands.copyTiddler = {\n text: 'copy',\n hideReadOnly: true,\n tooltip: 'Make a copy of this tiddler',\n prefix: "Copy of ",\n handler: function(event,src,title) {\n var text=store.getTiddlerText(title); // get text from tiddler (or shadow)\n var tags=[]; var tid=store.getTiddler(title); if (tid) tags=tid.getTags();\n var textfield=story.getTiddlerField(title,"text");\n if (textfield&&textfield.getAttribute("edit")=="text") var text=textfield.value; // edit mode, use field value\n var tagsfield=story.getTiddlerField(title,"tags");\n if (tagsfield&&tagsfield.getAttribute("edit")=="tags") var tags=tagsfield.value; // edit mode, use field value\n var newTitle = this.prefix + title;\n story.displayTiddler(null,newTitle,DEFAULT_EDIT_TEMPLATE);\n story.getTiddlerField(newTitle,"text").value=text;\n story.getTiddlerField(newTitle,"tags").value=tags;\n story.focusTiddler(newTitle,"title");\n return false;\n }\n};\n\n// automatically tweak shadow EditTemplate to add "copyTiddler" toolbar command (following "cancelTiddler")\nconfig.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/cancelTiddler/,"cancelTiddler copyTiddler");\n\n// backward-compatibility to support TW versions <2.1.0\nif (Story.prototype.getTiddlerField==undefined) {\n Story.prototype.getTiddlerField = function(title,field) {\n var tiddlerElem = document.getElementById(this.idPrefix + title);\n var e = null;\n if(tiddlerElem != null) {\n var children = tiddlerElem.getElementsByTagName("*");\n for (var t=0; t<children.length; t++) {\n var c = children[t];\n if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea") {\n if(!e) e = c;\n if(c.getAttribute("edit") == field) e = c;\n }\n }\n }\n return e;\n }\n}\n//}}}
/***\n|Name|DatePlugin|\n|Source||\n|Version|2.3.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nThis plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.05.31 [2.3.0]'' list "created" tiddlers in date popup. Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]].\n<<<\n!!!!!Code\n***/\n//{{{\ = {major: 2, minor: 3, revision: 0, date: new Date(2007,5,31)};\n//}}}\n\n//{{{\ = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n createdbg: "#bbeeff", // "beef"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\ = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format);\n if (!linkformat);\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n"normal";\n }\n\n// format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date)||hasCreateds(date))\n {"normal";"bold"; }\n if (hasReminders(date))\n {"underline"; }\n if(isToday(date))\n {"1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (!="") )\n { =; }\n if(isHoliday(date)&&(!=""))\n { =; }\n if (hasCreateds(date)&&(!=""))\n { =; }\n if (hasModifieds(date)&&(!=""))\n { =; }\n if (store.tiddlerExists(linkto)&&(!=""))\n { =; }\n if (hasReminders(date)&&(!=""))\n { =; }\n if(isToday(date)&&(!=""))\n { =; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return ([date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i <; i++) {\n var[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = createTiddlerPopup(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(\n createTiddlyLink(popup,,true);\n else\n createTiddlyText(popup,;\n addCreatedsToPopup(popup,,this.format);\n addModifiedsToPopup(popup,,this.format);\n addRemindersToPopup(popup,,this.linkformat);\n }\n scrollToTiddlerPopup(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexCreateds() // build list of tiddlers, hash indexed by creation date\n{\n var createds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].created.formatString("YYYY0MM0DD")\n if (!createds[date])\n createds[date]=new Array();\n createds[date].push(tiddlers[t].title);\n }\n return createds;\n}\nfunction hasCreateds(date) // returns true if date has created tiddlers\n{\n if (!;\n return ([date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addCreatedsToPopup(popup,when,format)\n{\n var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));\n if (force || !;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var createds =[when.formatString("YYYY0MM0DD")];\n if (createds) {\n createds.sort();\n var e=createTiddlyElement(popup,"div",null,null,"created:");\n for(var t=0; t<createds.length; t++) {\n var link=createTiddlyLink(popup,createds[t],false);\n link.appendChild(document.createTextNode(indent+createds[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (! = indexModifieds();\n return ([date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));\n if (force || !;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods =[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changed:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!\n = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return ([date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
// // date plugin calendar colors\n//{{{\[ "01/01", "07/04", "07/24", "11/24" ]; // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\[ 1,0,0,0,0,0,1 ]; // day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6\"YYYY.0MM.0DD"; // default date display format\"YYYY.0MM.0DD"; // 'dated tiddler' link format\"#c0c0c0";\"#ffaace";\"#bbeeff";\"#bbeeff";\"#babb1e";\"#c0ffee";\n//}}}
ShareMePersonal ShareAlikeCopyright
!Introduction\nI have created some google coop mashups for use as stand alone searches and searches that can be embedded in Integrated Developer Environment tools.\n\n!The Google Coop Mashups\n[[Struts Framework|]] Allows searching for Struts Framework information.\n[[Groovy and Grails|]] Searches for Groovy and Grails developer information.\n[[Ruby and Ruby on Rails|]] Searches for Ruby and Ruby on Rails programming information.\n[[Servers|]] Currently searches for programming information covering servers such as Resin, Jboss, Glassfish, and Apache Geronimo. Will soon include servers for rails type frameworks and Apache httpd.\n[[Build Systems|]] Covers searches of Apache Ant, Apache Maven, Apache Continuum, Crusiecontrol, and Apache Ivy.\n[[Hibernate Framework|]] Covers the Hibernate Framework.\n[[Spring Framework|]] Covers the Spring Framework.\n[[Javaee|]] Covers Javaee technology.\n[[Eclipse|]] Covers Eclipse.\n[[Javame|]] Covers javame.\n\n
Document Object Model or DOM is a computer language independent object model to represent HTML or XML documents. The w3c developed the first spec DOM level 0 in early 1990s.\n\nBrowsers up to and including Netscape 4 and MSIE 4 supported DOM level 0 and browsers beyond this point support DOM level 1 and some support DOM level 2 and DOM level 3.\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
/%\n|Name|DoubleClickDisable|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|block double-click handler for any specific tiddler|\n%/<script>\n if (!story.findContainingTiddler(place)) return;\n var t=story.findContainingTiddler(place); // get the tiddler element\n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"viewer")) t.ondblclick=null; // disable double-click\n</script>
[img[]]\n!Introduction\nThese articles cover Eclipse 3.2.x, Eclipse 3.3.x, and beyond.\n\n!Articles\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Eclipse")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \n>>
In this article I will describe a new way to set web search within the Eclipse Help Search wizard rather than the traditional google search command operators.\n\n!First Step Google Coop Customized Search Engine\nThe first step you will complete is to set up Google coop cses to embed in Eclipse, follow directions in this article:\n<<tiddlerbox "Google Coop Customized Search" "GoogleCoopCustomizedSearch" "The GoogleCoopArticle">>\n\n!Embedding Google Coop cses in Eclipse\nNow make a list of the urls of the Google Coop cses you created in the above step. This is what my Eclipse Help Search use to look like before using this method:\n!!Figure 1\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nNotice that there are a lot of searches checked which means its hard to manage. By setting up Google coop cses as subject searches we can decrease the amount of searches in eclipse to manage.\n\nOnce you get the Eclipse Help Search view in the side panel, click on advance within the side panel. This is how you will enter one of your Google Coop cses as a web search:\n!!Figure 2\n[img[][]]<<imagebox>>\nClick to enlarge.\n\nIn figure 2 you see how I have added a Google Coop cse for Groovy and Grails. \n\n!Conclusion\nAs you can see in figure 2 by using Google Coop cses as subject searches my Help Search panel is more manageable and easier to use.\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
!Introduction\nThis covers programming languages and technology in the enterprise area.\n\n!Resources\nFreeTechBookList\nTechnicalPresentations\nAntNotes\nDeveloperMashup\n\n!Java\nJavaNotes\n\n!Groovy\n\n!Ruby\n\n!PHP\n\n!Perl\n
/%\n|Name|ExpandSlidersScript|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin, NestedSlidersPlugin|\n|Overrides||\n|Description|simulateously expand/collapse all nested sliders in a tiddler (or ID'd DOM element)|\n%//% usage:\n<<tiddler ExpandSlidersScript with: elementID expandlabel collapselabel>>\n\n%/<script label="expand">\n // if 'in a tiddler', expand all sliders... otherwise, expand based on passed in element ID\n var here=story.findContainingTiddler(place);\n if (!here) {\n if ("$1"=="$"+"1") { alert("ExpandSlidersScript: not in a tiddler, please use 'with: elementID' syntax"); return; }\n var here=document.getElementById("$1");\n if (!here) { alert("ExpandSlidersScript: unknown elementID: '$1'"); return; }\n }\n var expandlabel="expand"; if ("$2"!="$"+"2") var expandlabel="$2";\n var collapselabel="collapse"; if ("$3"!="$"+"3") var collapselabel="$3";\n var elems=here.getElementsByTagName("*");\n var state=(place.innerHTML.toLowerCase().indexOf("expand")!=-1)?"none":"block";\n for (var e=0; e<elems.length; e++) {\n var p=elems[e].sliderPanel;\n if (p && p.className=="sliderPanel") {\n if ( window.onClickNestedSlider({target:elems[e]});\n }\n }\nplace.innerHTML=state=="none"?collapselabel:expandlabel;\n return false;\n</script><script>\n place.lastChild.className="button";\n var expandlabel="expand"; if ("$2"!="$"+"2") var expandlabel="$2";\n var collapselabel="collapse"; if ("$3"!="$"+"3") var collapselabel="$3";\n if (place.lastChild.innerHTML.toLowerCase().indexOf("expand")==-1)\n place.lastChild.innerHTML=collapselabel;\n else\n place.lastChild.innerHTML=expandlabel;\n</script>
/***\n| Name:|ExtentTagButtonPlugin|\n| Description:|Adds a New tiddler button in the tag drop down|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:||\n| Author:|Simon Baird <>|\n| License||\n***/\n//{{{\n\n// can't hijack a click handler. must redefine this entirely.\n// would be good to refactor in the core...\n// this version copied from 2.1.3 core\n\n// Event handler for clicking on a tiddler tag\nfunction onClickTag(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = Popup.create(this);\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n if(popup && tag)\n {\n var tagged = store.getTaggedTiddlers(tag);\n var titles = [];\n var li,r;\n for(r=0;r<tagged.length;r++)\n if(tagged[r].title != title)\n titles.push(tagged[r].title);\n var lingo = config.views.wikified.tag;\n\n wikify("<<newTiddler label:'New tiddler' tag:"+tag+">>",createTiddlyElement(popup,"li")); // <---- the only modification\n\n if(titles.length > 0)\n {\n var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);\n openAll.setAttribute("tag",tag);\n createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");\n for(r=0; r<titles.length; r++)\n {\n createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);\n }\n }\n else\n createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));\n createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");\n var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);\n createTiddlyText(h,lingo.openTag.format([tag]));\n }\n,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n\n//}}}\n\n
/%Is there a "Developer's Guide to TiddlyWiki?"%/\n{{menubox{{{small{\n__Is there a "Developer's Guide to TiddlyWiki?"__\n\nAs you might imagine, once you get past the basics of TiddlyWiki, there is SO much more that you can do when you write your own javascript code. However, because TiddlyWiki has been evolving so quickly and in such great leaps, the developer documentation has been lagging behind the development of core API functions and plugin coding methodologies.\n\nUnfortunately, there *currently* isn't really any official "developer's guide". Mostly, people have been digging through other people's code to learn how it's done. Picking which bit of code to start with is an important question. Start with a simple macro whose use and purpose you understand.... then, climb inside the code... if the plugin writer has well-written code (or at least well-documented via embedded comments), you should be able to figure out what they've done.\n\nThat having been said, there are several bits and pieces that have been put together by various individuals that might offer some help getting started:\n*\n*\n*\n*\n\nIn addition, I am working on a new book: "TiddlyTech: An Author's Guide to TiddlyWiki", which I hope to have in 'real-world' print later this year. In the interim, I will be periodically posting short FAQ/HowTo articles on TiddlyTools, and will probably release the initial chapters for review and comment before finalizing their content for printing.\n}}}}}}
/%Reduce working memory usage in FireFox%/\n{{menubox small{\n__Use FireFox config setting to reduce working memory when browser is minimized__\n\nTo reduce memory usage by Firefox, try this:\n# Type 'about:config' in Firefox address bar and press Enter.\n# Right click in the page and select 'New > Boolean'.\n# Type 'config.trim_on_minimize' in the box that pops up. Press Enter.\n# Select 'True' and then press Enter.\n# Restart Firefox.\n\nWhat this does is cause FireFox to automatically its reduce working memory whenever the browser window is minimized. I tested this under FF2002 on WinXPSP2 using a local copy of TiddlyTools, and the browser's memory usage (as shown by the Task Manager "Processes" tab) went from around 38Mb down to around 5Mb, just by minimizing the window!!\n\nIn addition, not only does this setting dramatically reduce the memory used by FireFox while it is minimized, but after you restore the browser window, it appears that FireFox continues to use significantly less memory than before (though more than when minimized). I've also noticed that FireFox seems to run a bit quicker after a minimize/restore, especially if it has been running all day with an actively edited TW document. \n\nThese side-effects are most likely the result of some *global* garbage collection process that is apparently being performed to reclaim wasted memory space each time the window is minimized. \n\nOriginal source of this 'tweak':\n\n}}}
/%TiddlyWiki documents don't pass W3C HTML validation%/\n{{menubox{{{small{\n__TiddlyWiki documents don't pass W3C HTML validation__\n\nWhen your browser requests a page from a webserver (or file system if "file://..." is used), the source HTML delivered back to your browser is a simple block of //human-readable text//. The browser then parses the HTML syntax in this text and uses it like a recipe to generate the DOM (Document Object Model) *data* elements that correspond to the HTML syntax and then uses the DOM elements to actually render the visible portion of the web page on your screen.\n\nHowever, unlike a typical web page which just contains 'static HTML' stored as text, most of the ''content in a ~TiddlyWiki document is kept as tiddler //data// in a hidden "store area"'' which has to be processed by the ~TiddlyWiki core programming before it can be rendered by the browser.\n\n''~TiddlyWiki does NOT generate HTML'' from this tiddler data. Instead, it bypasses the browser's normal HTML parser and, using it's own "wikify()" parser, converts tiddler source content directly into the DOM data elements that the browser uses to render the page.\n\nAs a result of this processing, most HTML validators aren't very useful or informative for analyzing ~TiddlyWiki documents, since they typically only examine the statically-defined source content of the document, without actually running any javascript processing. Since ~TiddlyWiki doesn't contain much actual HTML in its source file, there's simply not much for an HTML validator to sink it's teeth into.\n}}}}}}
/%Improving TiddlyWiki processing speed when editing/saving tiddler changes%/\n{{menubox{{{small{\n__Improving TiddlyWiki processing speed when editing/saving tiddler changes__\n\nThe performance of the TiddlyTools plugins depends largely on two factors:\n* the performance of your overall system, which is affected by\n** the CPU speed\n** the amount of RAM,\n** disk access rates,\n** etc.\n* which browser you are using: Internet Explorer is significantly slower that other browsers at processing certain portions of the javascript code that implement the TW core as well as all TiddlyTools plugins and inline scripts (using the InlineJavascriptPlugin). Except for 'animation' effects, FireFox seems to be consistently faster than IE, and often produces a very noticeable improvement in response time for many activities.\n\nHowever, if your document is performing "too slow" even with FireFox running on a fast system, you can also try eliminating some of the plugins that are installed in your document to see what effect that has. Look for plugins that 'hijack' the saveTiddler() function, since that adds overhead each time you press "done" after editing a tiddler.\n\nThere are, of course, many other reasons that various TiddlyWiki actions can take a long time finish, such as slow upload/download speeds, browser "memory leaks", and even the occasional programming bug //(gasp! "... say it ain't so, Joe!")//.\n}}}}}}
/%Installing Plugins: some suggested 'best practices'%/\n{{menubox{{{small{\n__Installing Plugins: some suggested 'best practices'__\n\nMost plugins are actively maintained and many are updated fairly often with bug fixes, performance improvements, new features, etc. I get *lots* of feedback every day from users of my TiddlyTools plugins, with ideas for new features, requests for help, bug reports, and even "fan mail" (I love getting those... about 3-5 per week!... feels really nice... send more!!! :-)\n\nOf course, once someone has installed some of my plugins in their document, they typically start building their content around those features, so that correctly processing the tiddler content now depends upon that specific set of plugins. Obviously, if you copy an *entire* TW document from somewhere else, you should use the plugins it contains, as installed by that document's author, so that you are assured that everything in THAT document will work together properly.\n\nHowever... if you are copying just a few plugins to incorporate into *your own* document, then you probably should TRY using the newest version of a plugin, whenever possible. By convention, most plugin authors include a "revision history" section that describes the important changes that have occurred in the plugin, and assign a "revision number" to each of those sets of changes.\n\nWhen you copy a plugin from another document, you should always check to see if there any notes in the tiddler content indicating it has been *modified* for use in that specific document. If so, you might not want to use that copy of the plugin, since it could produce output or interactions that differ greatly from the offical version. This could make your tiddler content less "shareable" with other TW documents, because those tiddlers would be dependent upon having the altered, non-standard plugins installed.\n\nAlways check for a link back to an "official" distribution source URL. Go there and check the plugin documentation to find out the current plugin revision number. Compare that with the one you copied from the other document. If they are not the same, you should review the revision histories to determine what has changed. If they are the same, you are *probably* OK (though this is not assured, since an author might have modified the plugin source without documenting their changes).\n\nEven if the revision numbers ARE different, the plugin changes may be completely backward compatible with the earlier revision, so that there would be nearly no downside to installing the latest version into your document. Of course, sometimes a newer feature will require other changes that you might not want/need, or will make the plugin significantly larger, so you can still choose to go with the older/modified version you have already copied, IF it actually does what you need.\n\nLastly, once you have installed the most up-to-date revision in your document, you should avoid altering it unless absolutely necessary, so that your copy can be easily shared with others while not contributing more complexity to the whole "revision skew/custom code changes" situation.\n}}}}}}
/%Printing tiddler content formatted to fit 3x5 index cards%/\n{{menubox{{{small{\n__Printing tiddler content formatted to fit 3x5 index cards__\n\nTo print tiddler content in a format that fits on 3x5 index card stock generally requires a specialized set of PageTemplate and ViewTemplate definitions, combined with CSS stylesheet definitions for printed media (see StyleSheetPrint), that are all optimized for the 3x5 presentation format.\n\nThe most active interest in printing to 3x5 cards has been from people who are using David Allen's "GTD" (Getting Things Done) method of time management. There is a thriving community of TiddlyWiki-based GTD-ers (see who are using TiddlyWiki documents that have been (such as the popular MonkeyGTD and d-Cubed (d^^3^^) varieties, both of which can be found at\n\nEven for non-GTD use, the 3x5 card format could be very helpful, inasmuch as the "cards in a box" metaphor maps very well to explain the basic idea of tiddlers contained in a TiddlyWiki document (and especially for those people who are not familiar with the wiki concept or are not frequent computer users).\n\nCurrently, TiddlyTools does not currently offer a 3x5 display/print "theme"... but check back soon for the new IndexCards stylesheet/template theme.\n}}}}}}
/***\n|FileDropPlugin|h\n|author : BradleyMeck|\n|version : 0.1.1|\n|date : Nov 13 2006|\n|usage : drag a file onto the TW to have it be made into a tiddler|\n|browser(s) supported : Mozilla|\n\n!Trouble Shooting\n*If the plugin does not seem to work, open up the page "about:config" (just type it in the address bar) and make sure @@color(blue):signed.applets.codebase_principal_support@@ is set to @@color(blue):true@@\n\n!Revisions\n*Multiple File Dropping API updated, to end all capturing events after yours return a value that makes if(myFunctionsReturnValue) evaluate to true\n*Added support for multiple file drop handlers\n**Use the config.macros.fileDrop.addEventListener(@@color(green):String Flavor@@, @@color(green):Function handler(nsiFile){}@@, @@color(green):Boolean addToFront@@) function\n***Standard Flavor is "application/x-moz-file"\n***addToFront gives your handler priority over all others at time of add\n*Old plugin would disallow drops of text vetween applications because it didn't check if the transfer was a file.\n\n!Example Handler\n*Adds simple file import control, add this to a tiddler tagged {{{systemConfig}}} to make file dropping work\n{{{\nconfig.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile)\n{\n if(\n confirm("You have dropped the file \s""+nsiFile.path+"\s" onto the page, it will be imported as a tiddler. Is that ok?")\n )\n {\n var newDate = new Date();\n var title = prompt("what would you like to name the tiddler?");\n store.saveTiddler(title,title,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);\n }\n return true;\n})\n}}}\n\n!Example Handler without popups and opening the tiddler on load\n*Adds simple file import control, add this to a tiddler tagged {{{systemConfig}}} to make file dropping work\n{{{\nconfig.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile)\n{\n var newDate = new Date();\n store.saveTiddler(nsiFile.path,nsiFile.path,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);\n story.displayTiddler(null,nsiFile.path)\n return true;\n})\n}}}\n\n***/\n\n//{{{\nconfig.macros.fileDrop = {varsion : {major : 0, minor : 0, revision: 1}};\nconfig.macros.fileDrop.customDropHandlers = [];\n\nconfig.macros.fileDrop.dragDropHandler = function(evt) {\n\n'UniversalXPConnect');\n // Load in the native DragService manager from the browser.\n var dragService = Components.classes[";1"].getService(Components.interfaces.nsIDragService);\n\n // Load in the currently-executing Drag/drop session.\n var dragSession = dragService.getCurrentSession();\n\n // Create an instance of an nsITransferable object using reflection.\n var transferObject = Components.classes[";1"].createInstance();\n\n // Bind the object explicitly to the nsITransferable interface. We need to do this to ensure that\n // methods and properties are present and work as expected later on.\n transferObject = transferObject.QueryInterface(Components.interfaces.nsITransferable);\n\n // I've chosen to add only the x-moz-file MIME type. Any type can be added, and the data for that format\n // will be retrieved from the Drag/drop service.\n transferObject.addDataFlavor("application/x-moz-file");\n\n // Get the number of items currently being dropped in this drag/drop operation.\n var numItems = dragSession.numDropItems;\n for (var i = 0; i < numItems; i++)\n {\n // Get the data for the given drag item from the drag session into our prepared\n // Transfer object.\n dragSession.getData(transferObject, i);\n\n // We need to pass in Javascript 'Object's to any XPConnect method which\n // requires OUT parameters. The out value will then be saved as a new\n // property called Object.value.\n var dataObj = {};\n var dropSizeObj = {};\n\nfor(var ind = 0; ind < config.macros.fileDrop.customDropHandlers.length; ind++)\n{\n var item = config.macros.fileDrop.customDropHandlers[ind];\n if(dragSession.isDataFlavorSupported(item.flavor))\n {\n transferObject.getTransferData(item.flavor, dataObj, dropSizeObj);\n var droppedFile = dataObj.value.QueryInterface(Components.interfaces.nsIFile);\n // Display all of the returned parameters with an Alert dialog.\n var result =,droppedFile);\n // Since the event is handled, prevent it from going to a higher-level event handler.\n evt.stopPropagation();\n evt.preventDefault();\n if(result){break;}\n }\n}\n }\n}\n\nif(!window.event)\n{\n // Register the event handler, and set the 'capture' flag to true so we get this event\n // before it bubbles up through the browser.\n window.addEventListener("dragdrop", config.macros.fileDrop.dragDropHandler , true);\n}\n\nconfig.macros.fileDrop.addEventListener = function(paramflavor,func,inFront)\n{\nvar obj = {};\nobj.flavor = paramflavor;\nobj.handler = func;\nif(!inFront)\n{config.macros.fileDrop.customDropHandlers.push(obj);}\nelse{config.macros.fileDrop.customDropHandlers.shift(obj);}\n}\n//}}}
/***\n|Name|FileDropPluginConfig|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires|FileDropPlugin, AttachFilePlugin|\n|Overrides||\n|Description|Adds AttachFile handler for drag-and-drop of binary files.|\n\n!!!!! TiddlyTools FileDrop+AttachFile extended handler:\n* use just filename instead of whole path as tiddler title\n* check for existing tiddler and prompt for new name\n* use AttachFilePlugin if MIME type is not text/plain\n* handle folder drops (drops each file)\n<<<\n''FileDrop+AttachFile configuration options:''\n<<option chkFileDropAttachEncodeData>> enable FileDrop+AttachFile extension for non-text files\ndon't encode binary files when larger than: <<option txtFileDropAttachDataLimit>>\n<<<\nSee FileDropPlugin for more documentation on handler implementation specifics, including sample code for default drop handlers.\n***/\n//{{{\nif (config.options.chkFileDropAttachEncodeData==undefined)\n config.options.chkFileDropAttachEncodeData=true;\nif (config.options.txtFileDropAttachDataLimit==undefined)\n config.options.txtFileDropAttachDataLimit=32768;\nconfig.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile)\n{\n var files=[nsiFile];\n if (nsiFile.isDirectory()) {\n if (!confirm(nsiFile.path+" is a folder... are you sure you want to attach all the files it contains?"))\n return true;\n var folder=nsiFile.directoryEntries;\n var files=[];\n while (folder.hasMoreElements()) {\n var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);\n if (f instanceof Components.interfaces.nsILocalFile) files.push(f);\n }\n }\n for (i=0; i<files.length; i++) {\n var file=files[i];\n if (file.isDirectory()) continue; // skip over nested directories\n var type="text/plain";\n var now=new Date();\n var title=file.leafName; // tiddler name is file name\n var path=file.path;\n var size=file.fileSize;\n while (title && title.length && store.tiddlerExists(title))\n title=prompt(title+" already exists. Please enter a new tiddler title for\sn "+path,title);\n if (!title || !title.length) return; // aborted by user\n if (config.macros.attach && config.macros.attach.getMIMEType)\n type=config.macros.attach.getMIMEType(file.leafName,type);\n if (type=="text/plain")\n store.saveTiddler(null,title,loadFile(path),config.options.txtUserName,now,[]);\n else {\n // only encode data if enabled and file is smaller than limit. Default is 32768 (32K) bytes.\n var embed=config.options.chkFileDropAttachEncodeData\n && file.fileSize<config.options.txtFileDropAttachDataLimit;\n config.macros.attach.createAttachmentTiddler(path,\n now.formatString(config.macros.timeline.dateFormat),\n "attached by FileDropPlugin", "attachment excludeMissing",\n title, embed, true, false, path, "", type, false);\n }\n story.displayTiddler(null,title);\n }\n return true;\n})\n//}}}
//~~(Part of the [[ForEachTiddlerPlugin]])~~//\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\n\n''Using JavaScript''\n\nTo give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples]] and adapt them to your needs.\n\n''The Elements of the Macro''\n\nThe arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.\n\n<<slider chkFETInClause [[inClause]] "inClause" "inClause">>\n<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>\n<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>\n<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>\n<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>\n\n''Using Macros and ">" inside the forEachTiddler Macro''\n\nYou may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.\n\nIn addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.\n\n\n\nSee also [[ForEachTiddlerExamples]].
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.8 (2007-04-12)|\n|''Source:''||\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|]]|\n|''Copyright:''|&copy; 2005-2007 [[abego Software|]]|\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.8 (2007-04-12)\n** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)\n* v1.0.7 (2007-03-28)\n** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)\n* v1.0.6 (2006-09-16)\n** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.\n** Support "begin", "end" and "none" expressions in "write" action\n* v1.0.5 (2006-02-05)\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\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\nif (!window.abego) window.abego = {};\n\nversion.extensions.ForEachTiddlerPlugin = {\n major: 1, minor: 0, revision: 8, \n date: new Date(2007,3,12), \n source: "",\n licence: "[[BSD open source license (abego Software)|]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2007 ("\n};\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,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {\n major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: ""};\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.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(, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(, 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\nabego.parseNamedParameter = function(name, parameter, i) {\n var beginExpression = null;\n if ((i < parameter.length) && parameter[i] == name) {\n i++;\n if (i >= parameter.length) {\n throw "Missing text behind '%0'".format([name]);\n }\n \n return config.macros.forEachTiddler.paramEncode(parameter[i]);\n }\n return null;\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 "begin" option\n var beginExpression = abego.parseNamedParameter("begin", parameter, p);\n if (beginExpression !== null) \n p += 2;\n var endExpression = abego.parseNamedParameter("end", parameter, p);\n if (endExpression !== null) \n p += 2;\n var noneExpression = abego.parseNamedParameter("none", parameter, p);\n if (noneExpression !== null) \n p += 2;\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 if (count > 0 && beginExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);\n \n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (count > 0 && endExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);\n\n if (count == 0 && noneExpression) \n text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);\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, // the tiddler containing the <<forEachTiddler ...>> macro call.\n viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result\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 var tiddlyWiki = new TiddlyWiki();\n\n // Starting with TW 2.2 there is a helper function to import the tiddlers\n if (tiddlyWiki.importTiddlyWiki) {\n if (!tiddlyWiki.importTiddlyWiki(content))\n throw "File '"+path+"' is not a TiddlyWiki.";\n tiddlyWiki.dirty = false;\n return tiddlyWiki;\n }\n \n // The legacy code, for TW < 2.2\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 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 && &&,lenPrefix) == idPrefix)\n title =;\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: ""};\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: ""};\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: ""};\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: ""};\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: ""};\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: ""};\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: ""};\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 ([[|]])\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
!Introduction\nSeveral places put out free technical books as resources for developers. Hopefully, I have listed here most of those places. Some places require free registration to dowloand the books.\n\n!Common\n[[Domain Driven Design Quickly from InfoQ|]]\n[[Enterprise SOA from InfoQ|]]\n[[Agile Patterns from InfoQ|]]\n[[Scrum Checklist from InfoQ|]]\n\n!Ruby\n[[Ruby from InfoQ|]]\n[[Enterprise Ruby on Rails on line|]]\n[[Mr Neighborly Ruby on Rails|]]\n[[Programming Ruby on line form|]]\n[[Why poignant guide to ruby programming|]]\n\n\n\n\n!Grails\n[[Grails from InfoQ|]]\n\n!Java\n[[Java Transaction Design Strategies from InfoQ|]]\n[[Mastering EJB3 from TSS|]]\n[[Masteri8ng EJB from TSS|]]\n[[EJB Design Patterns from TSS|]]\n[[J2ee Architects Handbook from TSS|]]\n[[Servlets JSP from TSS|]]\n[[Java Testing and Design from TSS|]]\n[[Jarkata Struts Live from TSS|]]\n[[Thinking in Java|]]\n[[Thinking in Enterprise Java|]]\n\n\n!Servers\n[[Apache Geronimo 1.0 and 1.1 Books from Chariot Solutions|]]\n\n\n!Continuous Build Integration Servers\n[[Apache Maven 2.0 book from Mergere|]]\n[[Apache Maven 2.0 O'Reilly Definitive Guide, on line version|]]\n\n\n
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>\n\nSee also MonkeyPirateTiddlyWiki.
A set of Google Coop customized searches can be used as a development tool. This article will detail the steps to set up a Google Coop customized search.\n\n!Google Coop\nThe first step is to create a customized search engine at:\n[[Google Coop Customized Search Engine|]]\n\nYou beginning scree will look this where you give your google coop cse a name:\n!!Figure 1\n[img[][]]<<imagebox>>\nClick to enlarge image.\n\nThe next screen gogole will display allows you to add sites which look like this:\nFigure 2\n[img[][]]<<imagebox>>\nClick to enlarge image.\n\nAs you add sites you will want to do test searches to verify that your search is working. The way I have set mine up is to subject searches such as javame, javaee, eclipse, and etc using a mixture of sites to add including wikis. Once you have tested make sure you have saved it. Bookmark the cse url for your search.\n\n!Conclusion\nOnce you have your google coop cses than you can use them as stand alone searches or embed them within your favorite integrated development environment.\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
/***\n|Name|HTMLFormattingPlugin|\n|Source||\n|Version|2.1.4|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|'HTML' formatter|\n|Description|Use wiki syntax formatting inside of HTML content|\n\nThe shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.\n\nWhen HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML. However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain. This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.\n!!!!!Usage\n<<<\nThe ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.\n\nWhen a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags. This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content. Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.\n<<<\n!!!!!Line breaks\n<<<\nOne major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.\n\nEven though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.\n\nIf removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead. Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.\n\nNote: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.\n<<<\n!!!!!How it works\n<<<\nThe TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block. Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it. Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html. It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.\n\nHowever, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.\n\nSimilarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward. Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(\n\nAs a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).\n\nAfter the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements. The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node. At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for HTMLFormatting handling^^\n<<<\n!!!!!Revision History\n<<<\n''2006.09.10 [2.1.4]'' update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)\n''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children. (thanks to "ayj" for bug report)\n''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content. This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)\n''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox crash bug when referencing globals\n''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements\n''2005.11.06 [2.0.1]'' code cleanup\n''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code\n''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler\n''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers\n''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling\n''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 4, date: new Date(2006,9,10)};\n\n// find the formatter for HTML and replace the handler\ninitHTMLFormatter();\nfunction initHTMLFormatter()\n{\n for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);\n if (i<config.formatters.length) config.formatters[i].handler=function(w) {\n 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 var html=lookaheadMatch[1];\n // optionally suppress wiki-style literal handling of newlines\n // strip any carriage returns added by Internet Explorer's textarea edit field\n // encode newlines as \sn so Internet Explorer's HTML parser won't eat them\n // encode macro brackets (<< and >>) so HTML parser won't eat them\n if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(regexpNewLine,' ');\n html=html.replace(regexpCarriageReturn,'');\n html=html.replace(regexpNewLine,'\s\sn');\n html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');\n // create span to hold HTML\n // parse HTML and normalize the results\n // walk node tree and call wikify() on each text node\n var e = createTiddlyElement(w.output,"span");\n e.innerHTML=html;\n e.normalize(); \n wikifyTextNodes(e);\n // advance to next parse position\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n}\n\n// wikify text nodes remaining after HTML content is processed (pre-order recursion)\nfunction wikifyTextNodes(theNode)\n{\n // textarea node doesn't get wikified, just decoded... \n if (theNode.nodeName.toLowerCase()=='textarea')\n theNode.value=theNode.value.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(regexpBackSlashEn,'\sn');\n else for (var i=0;i<theNode.childNodes.length;i++) {\n var theChild=theNode.childNodes.item(i);\n if (theChild.nodeName.toLowerCase()=='option') continue;\n if (theChild.nodeName.toLowerCase()=='select') continue;\n wikifyTextNodes(theChild);\n if (theChild.nodeName=='#text') {\n var txt=theChild.nodeValue;\n // decode macro brackets and newlines\n txt=txt.replace(/\s%%\s(/g,'<<').replace(/\s)\s%%/g,'>>').replace(regexpBackSlashEn,'\sn');\n // replace text node with wikified() span\n var newNode=createTiddlyElement(null,"span");\n theNode.replaceChild(newNode,theChild);\n wikify(txt,newNode);\n }\n }\n}\n//}}}
/%\n|Name|HideTiddlerBackground|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|hide a tiddler's background and border (if any)|\n\nUsage: <<tiddler HideTiddlerBackground>>\n\n%/<script>\n var;\n s.backgroundImage="none";\n s.backgroundColor="transparent"\n s.borderColor="transparent";\n s.borderWidth=0;\n s.margin=0;\n s.padding=0;\n</script>
/%\n|Name|HideTiddlerSubtitle|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|hide a tiddler's subtitle (dates/created by) display|\n\nUsage: <<tiddler HideTiddlerSubtitle>>\n\n%/<script>\n // get the tiddler element\n var t=story.findContainingTiddler(place);\n if (t &&!="tiddlerHideTiddlerSubtitle") \n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"subtitle"))\n t.childNodes[i].style.display="none";\n</script>
/%\n|Name|HideTiddlerTags|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|hide a tiddler's tagged/tagging display elements|\n\nUsage: <<tiddler HideTiddlerTags>>\n\n%/<script>\n var t=story.findContainingTiddler(place);\n if (t &&!="tiddlerHideTiddlerTags")\n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"tagging")||hasClass(t.childNodes[i],"tagged"))\n t.childNodes[i].style.display="none";\n</script>
/%\n|Name|HideTiddlerTitle|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|hide a tiddler's title display elements (name, dates, and author)|\n\nUsage: <<tiddler HideTiddlerTitle>>javascript:;\ndone\n\n%/<script>\n // get the tiddler element\n var t=window.story.findContainingTiddler(place);\n if (t &&!="tiddlerHideTiddlerTitle") \n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"title")||hasClass(t.childNodes[i],"subtitle"))\n t.childNodes[i].style.display="none";\n</script>
/%\n|Name|HideTiddlerToolbar|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|hide a tiddler's toolbar display|\n\nUsage: <<tiddler HideTiddlerToolbar>>\n\n%/<script>\n var t=story.findContainingTiddler(place);\n if (t &&!="tiddlerHideTiddlerToolbar")\n for (var i=0; i<t.childNodes.length; i++)\n if (hasClass(t.childNodes[i],"toolbar"))\n t.childNodes[i].style.display="none";\n</script>
/***\n| Name|HideWhenPlugin|\n| Description|Allows conditional inclusion/exclusion in templates|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\nFor use in ViewTemplate and EditTemplate. Example usage:\n{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.removeElementWhen = function(test,place) {\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }}\n\n});\n\n//}}}\n\n
/***\n|Name|HoverMenuPlugin|\n|Created by|SaqImtiaz|\n|Location||\n|Version|1.11|\n|Requires|~TW2.x|\n!Description:\nProvides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.\n\n!Demo:\nObserve the hovering menu on the right edge of the screen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nTo customize your HoverMenu, edit the HoverMenu shadow tiddler.\n\nTo customize whether the menu sticks to the right or left edge of the screen, and its start position, edit the HoverMenu configuration settings part of the code below. It's well documented, so don't be scared!\n\nThe menu has an id of hoverMenu, in case you want to style the buttons in it using css.\n\n!Notes:\nSince the default HoverMenu contains buttons for toggling the side bar and jumping to the top of the screen and to open tiddlers, the ToggleSideBarMacro, JumpMacro and the JumpToTopMacro are included in this tiddler, so you dont need to install them separately. Having them installed separately as well could lead to complications.\n\nIf you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.\n\n!To Do:\n* rework code to allow multiple hovering menus in different positions, horizontal etc.\n* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu\n\n!History:\n*03-08-06, ver 1.1.2: compatibility fix with SelectThemePlugin\n*03-08-06, ver 1.11: fixed error with button tooltips\n*27-07-06, ver 1.1 : added JumpMacro to hoverMenu\n*23-07-06\n\n!Code\n***/\n\n/***\nstart HoverMenu plugin code\n***/\n//{{{\nconfig.hoverMenu={};\n//}}}\n\n/***\nHoverMenu configuration settings\n***/\n//{{{\nconfig.hoverMenu.settings={\n align: 'right', //align menu to right or left side of screen, possible values are 'right' and 'left' \n x: 1, // horizontal distance of menu from side of screen, increase to your liking.\n y: 158 //vertical distance of menu from top of screen at start, increase or decrease to your liking\n };\n//}}}\n\n//{{{\n//continue HoverMenu plugin code\nconfig.hoverMenu.handler=function()\n{ \n if (!document.getElementById("hoverMenu"))\n {\n var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");\n theMenu.setAttribute("refresh","content");\n theMenu.setAttribute("tiddler","HoverMenu");\n var menuContent = store.getTiddlerText("HoverMenu");\n wikify(menuContent,theMenu);\n }\n\n var Xloc = this.settings.x;\n Yloc =this.settings.y;\n var ns = (navigator.appName.indexOf("Netscape") != -1);\n function SetMenu(id)\n {\n var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];\n if(document.layers);\n GetElements.sP=function(x,y){[config.hoverMenu.settings.align]=x +"px"; +"px";};\n GetElements.x = Xloc;\n GetElements.y = findScrollY();\n GetElements.y += Yloc;\n return GetElements;\n }\n window.LoCate_XY=function()\n {\n var pY = findScrollY();\n ftlObj.y += (pY + Yloc - ftlObj.y)/15;\n ftlObj.sP(ftlObj.x, ftlObj.y);\n setTimeout("LoCate_XY()", 10);\n }\n ftlObj = SetMenu("hoverMenu");\n LoCate_XY();\n};\n\nwindow.old_lewcid_hovermenu_restart = restart;\nrestart = function()\n{\n window.old_lewcid_hovermenu_restart();\n config.hoverMenu.handler();\n};\n\nsetStylesheet(\n"#hoverMenu .imgLink, #hoverMenu .imgLink:hover {border:none; padding:0px; float:right; margin-bottom:2px; margin-top:0px;}\sn"+\n"#hoverMenu .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; margin-bottom:4px;}\sn"+\n"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#fff; background:#000; padding:0 5px; float:right; margin-bottom:4px;}\sn"+\n"#hoverMenu .button {width:100%; text-align:center}"+\n"#hoverMenu { position:absolute; width:7px;}\sn"+\n"\sn","hoverMenuStyles");\n\n\nconfig.macros.renameButton={};\nconfig.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n\n if (place.lastChild.tagName!="BR")\n {\n = params[0];\n if (params[1]) {place.lastChild.title = params[1];}\n }\n};\n\nconfig.shadowTiddlers["HoverMenu"]="<<top>>\sn<<toggleSideBar>><<renameButton '>' >>\sn<<jump j '' top>>\sn<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\sn<<newTiddler>><<renameButton n>>\sn";\n//}}}\n//end HoverMenu plugin code\n\n//Start ToggleSideBarMacro code\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "«",\n arrow2: "»"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n (,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n (,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n//}}}\n//end ToggleSideBarMacro code\n\n//start JumpToTopMacro code\n//{{{\{};\,macroName)\n{\n createTiddlyButton(place,"^","jump to top",this.onclick);\n}\\n{\n window.scrollTo(0,0);\n};\n\ =\n{\n text:" ^ ",\n tooltip:"jump to top"\n};\n\ = function(event,src,title)\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpToStartMacro code\n\n//start JumpMacro code\n//{{{\nconfig.macros.jump= {};\nconfig.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = (params[0] && params[0]!=".")? params[0]: 'jump';\n var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';\n var top = (params[2] && params[2]=='top') ? true: false; \n\n var btn =createTiddlyButton(place,label,tooltip,this.onclick);\n if (top==true)\n btn.setAttribute("top","true")\n}\n\nconfig.macros.jump.onclick = function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var top = theTarget.getAttribute("top");\n var popup = Popup.create(this);\n if(popup)\n {\n if(top=="true")\n {createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',;\n createTiddlyElement(popup,"hr");}\n \n story.forEachTiddler(function(title,element) {\n createTiddlyLink(createTiddlyElement(popup,"li"),title,true);\n });\n }\n,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\ = function()\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpMacro code\n\n//utility functions\n//{{{\ = function(unused,slowly)\n{\n var curr = Popup.stack[Popup.stack.length-1];\n var rootLeft = findPosX(curr.root);\n var rootTop = findPosY(curr.root);\n var rootHeight = curr.root.offsetHeight;\n var popupLeft = rootLeft;\n var popupTop = rootTop + rootHeight;\n var popupWidth = curr.popup.offsetWidth;\n var winWidth = findWindowWidth();\n if (isChild(curr.root,'hoverMenu'))\n var x = config.hoverMenu.settings.x;\n else\n var x = 0;\n if(popupLeft + popupWidth+x > winWidth)\n popupLeft = winWidth - popupWidth -x;\n if (isChild(curr.root,'hoverMenu'))\n { = x + "px";}\n else\n = popupLeft + "px";\n = popupTop + "px";\n = "block";\n addClass(curr.root,"highlight");\n if(config.options.chkAnimate)\n anim.startAnimating(new Scroller(curr.popup,slowly));\n else\n window.scrollTo(0,ensureVisible(curr.popup));\n}\n\nwindow.isChild = function(e,parentId) {\n while (e != null) {\n var parent = document.getElementById(parentId);\n if (parent == e) return true;\n e = e.parentNode;\n }\n return false;\n};\n//}}}\n\n\n
/%Javascript cross-domain data access security issues%/\n{{menubox{{{small{\n__Javascript cross-domain data access security issues__\n\nCertain JavaScript features require expanded "cross-domain" privileges, normally restricted for use with ''signed'' scripts. You can set your browser to allow or disallow a signed script based on the digital sigature of the originator (or ''principal'') of the signed script. However, for an //''unsigned''// script to use expanded privileges, a ''codebase principal'', derived from the origin of the script rather than from verifying a digital signature of a certificate, must be used.\n>''Codebase principals are disabled by default; to enable them in FireFox, go to "about:config" in your browser, and set {{{signed.applets.codebase_principal_support}}} to {{{true}}} (//note: other browsers' settings may vary... if applicable, try adding //{{{user_pref("signed.applets.codebase_principal_support", true);}}}// to your browser's "preferences" file//).''\nWhen an unsigned script requests expanded privileges with codebase principals enabled, a dialog box advises that the script has not been digitally signed, and asks for permission to grant privileges based on the URL (the 'codebase principal') rather than signed/verified author information.\n<<<\n| Privilege |Description |\n| UniversalBrowserRead|Allows reading of privileged data from the browser. This allows the script to pass the same origin check for any document.|\n| UniversalBrowserWrite|Allows modification of privileged data in a browser. This allows the script to pass the same origin check for any document.|\n| UniversalBrowserAccess|Allows both reading and modification of privileged data from the browser. This allows the script to pass the same origin check for any document.|\n| UniversalFileRead|Allows a script to read any files stored on hard disks or other storage media connected to your computer.|\n| UniversalPreferencesRead|Allows the script to read preferences using the navigator.preference method.|\n| UniversalPreferencesWrite|Allows the script to set preferences using the navigator.preference method.|\n| UniversalSendMail|Allows the program to send mail in the user's name.|\n<<<\nThe following features require expanded privileges:\n* Setting a file upload widget requires UniversalFileRead.\n* Submitting a form to a mailto: or news: URL requires UniversalSendMail.\n* Using an about: URL other than about:blank requires UniversalBrowserRead.\n* event object: Setting any property requires UniversalBrowserWrite.\n* DragDrop event: Getting the value of the data property requires UniversalBrowserRead.\n* history object: Getting the value of any property requires UniversalBrowserRead.\n* navigator object:\n** Getting the value of a preference using the preference method requires UniversalPreferencesRead.\n** Setting the value of a preference using the preference method requires UniversalPreferencesWrite.\n* window object: Allow of the following operations require UniversalBrowserWrite.\n** Adding or removing the directory bar, location bar, menu bar, personal bar, scroll bar, status bar, or toolbar.\n** Using the methods in the following table under the indicated circumstances\n<<<\n| enableExternalCapture|To capture events in pages loaded from different servers. Follow this method with captureEvents.|\n| close|To unconditionally close a browser window.|\n| moveBy|To move a window off the screen.|\n| moveTo|To move a window off the screen.|\n| open|To create a window smaller than 100 x 100 pixels or larger than the screen can accommodate by using innerWidth, innerHeight, outerWidth, and outerHeight.<<br>>To place a window off screen by using screenX and screenY.<<br>>To create a window without a titlebar by using titlebar.<<br>>To use alwaysRaised, alwaysLowered, or z-lock for any setting.<<br>>|\n| resizeTo|To resize a window smaller than 100 x 100 pixels or larger than the screen can accommodate.|\n| resizeBy|To resize a window smaller than 100 x 100 pixels or larger than the screen can accommodate.|\n<<<\n**Setting the properties in the following table under the indicated circumstances:\n<<<\n| innerWidth|To set the inner width of a window to a size smaller than 100 x 100 or larger than the screen can accommodate.|\n| innerHeight|To set the inner height of a window to a size smaller than 100 x 100 or larger than the screen can accommodate.|\n<<<\n}}}}}}
/%Override cookie-based option settings with 'hard-coded' values%/\n{{menubox{{{small{\n__Override cookie-based option settings with 'hard-coded' values__\n\nYou can override //any// cookie-based config.option.* setting by ''hard-coding'' the desired value into a systemConfig tiddler (i.e., a plugin).\n\nFor example, suppose you prefer to set EnableAnimations to false by default, so that the first time your readers visit your document, they won't have to disable it themselves... all you need to do is to create a tiddler containing the following line of javascript:\n{{{\nconfig.options.chkAnimate=false;\n}}}\nthen, tag that tiddler with<<tag systemConfig>>to make it a plugin... the javascript it contains will be invoked //after// you save and reload the document. At "load-time", option values are initialized in this order:\n<<<\n# hard-coded values in the TiddlyWiki core code.\n# values from cookies (read from the browser)\n# values set by plugins\n<<<\nBecause plugins are executed last, any values they set supercede the values loaded from the browser's cookies or set by the core code.\n>{{fine{note: plugins are executed in //alphanumeric// order (based on tiddler title). Most of the time this does not cause any problems. However, if a plugin references an option value during it's load-time initialization, you will need to make sure that the tiddler containing the overridden cookie values is executed //first// by giving it a tiddler title that is sorted ahead of the dependent plugin's title.}}}\nexample: ConfigTweaks\n}}}}}}
/%Reposition slider panels within a tiddler%/\n{{menubox{{{small{\n__Reposition slider panels within a tiddler__\n\nWhen you select a slider button, everything following that slider button is 'pushed down' the page so that the corresponding slider panel can be displayed. However, when several slider buttons are on the same line (e.g. to create a horizontal 'menubar'), opening one of these sliders 'splits' the menubar, so that any menu items following the open slider are pushed down below that slider.\n\nTo preserve the single-row layout of slider buttons, you can use InlineJavascriptPlugin to ''set a specific element ID within each slider panel'', and then ''move the identified elements by directly DOM manipulation'' so that all panels //follow// the slider buttons, instead of being placed //in-between// them.\n!!!!! example\nwithout stacking:\n+++[label1]\n stuff1\n=== +++[label2]\n stuff2\n=== +++[label3]\n stuff3\n=== +++[label4]\n stuff4\n===\n{{{\n+++[label1]\n stuff1\n=== +++[label2]\n stuff2\n=== +++[label3]\n stuff3\n=== +++[label4]\n stuff4\n===\n}}}\n----\nwith stacking:\n+++[label1]\n stuff1\n===<script>"panel1"</script> +++[label2]\n stuff2\n===<script>"panel2"</script> +++[label3]\n stuff3\n===<script>"panel3"</script> +++[label4]\n stuff4\n===<script>"panel4"</script><script>\n place.insertBefore(document.getElementById("panel1"),null);\n place.insertBefore(document.getElementById("panel2"),null);\n place.insertBefore(document.getElementById("panel3"),null);\n place.insertBefore(document.getElementById("panel4"),null);\n</script>\n{{{\n+++[label1]\n stuff1\n===<script>"panel1"</script> +++[label2]\n stuff2\n===<script>"panel2"</script> +++[label3]\n stuff3\n===<script>"panel3"</script> +++[label4]\n stuff4\n===<script>"panel4"</script><script>\n place.insertBefore(document.getElementById("panel1"),null);\n place.insertBefore(document.getElementById("panel2"),null);\n place.insertBefore(document.getElementById("panel3"),null);\n place.insertBefore(document.getElementById("panel4"),null);\n</script>\n}}}\n}}}}}}
/%Reposition tag display below the tiddler content%/\n{{menubox small{\n__How to move the tiddler tag display so that tags appear below the tiddler content__\n\nYou can move a tiddler's tag display so that the tags appear in a line below the tiddler rather than as a list that 'floats' along the right side of the tiddler content.\n\nIn ViewTemplate, move this line:\n{{{\n <div class='tagged' macro='tags'></div>\n}}}\nso that occurs just before this line:\n{{{\n <div class='tagClear'></div>\n}}}\nin StyleSheet, add the following CSS to override the default appearance of the .tagged class (defined in StyleSheetLayout):\n{{{\n .tagged { float:left !important; }\n .tagged li { display:inline; }\n}}}\nThe first line makes the tag display appear left-aligned with the tiddler content. The second line eliminates the 'newlines' between tag values, so that they all appear on a single line instead of one-per-line (note: if you have a LOT of tags, they may still wrap onto additional lines if the line gets wider than the tiddler display area). You may also want to change or eliminate the background for the .tagged area:\n{{{\n .tagged { background:transparent !important; border:0 !important; }\n}}}\n}}}
/***\n|Name|InlineJavascriptPlugin|\n|Source||\n|Version|1.6.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Insert Javascript executable code directly into your tiddler content.|\n\n''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. You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text\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" title="clicking this link will show an 'alert' box" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='""'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n> 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''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script\n''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper. Fixes error caused when last line of script is a comment.\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:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 6, revision: 0, date: new Date(2007,2,19)};\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")?(?: title=\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[5]) { // there is script code\n if (lookaheadMatch[4]) // 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[5]+"\sn};_out(this);"\n link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");\n link.setAttribute("href","javascript:;");\n"pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[5]+"\sn};_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//}}}
//{{{\nconfig.formatters.unshift( {\n name: "inlinetabs",\n match: "\s\s<tabs",\n lookaheadRegExp: /(?:<tabs (.*)>\sn)((?:.|\sn)*?)(?:\sn<\s/tabs>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var cookie = lookaheadMatch[1];\n var wrapper = createTiddlyElement(null,"div",null,cookie);\n var tabset = createTiddlyElement(wrapper,"div",null,"tabset");\n tabset.setAttribute("cookie",cookie);\n var validTab = false;\n var firstTab = '';\n var tabregexp = /(?:<tab (.*)>)(?:(?:\sn)?)((?:.|\sn)*?)(?:<\s/tab>)/mg;\n while((m = tabregexp.exec(lookaheadMatch[2])) != null)\n {\n if (firstTab == '') firstTab = m[1];\n var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");\n tab.setAttribute("tab",m[1]);\n tab.setAttribute("content",m[2]);\n tab.title = m[1];\n if(config.options[cookie] == m[1])\n validTab = true;\n }\n if(!validTab)\n config.options[cookie] = firstTab;\n w.output.appendChild(wrapper);\n story.switchInlineTab(tabset,config.options[cookie]);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n})\n\nStory.prototype.switchInlineTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents");\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n wikify(theTab.getAttribute("content"),tabContent);\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n \nStory.prototype.onClickInlineTab = function(e)\n{\n story.switchInlineTab(this.parentNode,this.getAttribute("tab"));\n return false;\n}\n//}}}
This article will cover how to install the Sun Microsystems Java Distro into Linux.\n\n!Non Debian Distros\nSun Microsystems has made two Java Distros for Linux, a RedHat RPM which can be installed both in RedHat,Fedora, and Centos and a binary one that can install in non standard Linux distros. Thus, basically download the file as logged in as admin and follow the install instructions once you click the file.\n\n!Debian and Debian Derived Distros\nIn Debian and Derived Debian Distros you will need to with at least Etch 4.0 to set an apt entry pointing to the non-free repo directory.\n\n!Setting the Java Version Switch\n\n\n
/***\n|''Name:''|IntelliTaggerPlugin|\n|''Version:''|1.0.1 (2007-05-18)|\n|''Type:''|plugin|\n|''Source:''||\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|\n|''~SourceCode:''|[[IntelliTaggerPlugin SourceCode]]|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~CoreVersion:''|2.0.8|\n|''Browser:''|Firefox or better|\n***/\n// /%\nif(!version.extensions.IntelliTaggerPlugin){\nif(!window.abego){\nwindow.abego={};\n}\nif(!abego.internal){\nabego.internal={};\n}\nabego.alertAndThrow=function(s){\nalert(s);\nthrow s;\n};\nif(version.major<2){\nabego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");\n}\nversion.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:1,date:new Date(2007,4,18),type:"plugin",source:"",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 or better"};\nabego.createEllipsis=function(_2){\nvar e=createTiddlyElement(_2,"span");\ne.innerHTML="&hellip;";\n};\nabego.isPopupOpen=function(_4){\nreturn _4&&_4.parentNode==document.body;\n};\nabego.openAsPopup=function(_5){\nif(_5.parentNode!=document.body){\ndocument.body.appendChild(_5);\n}\n};\nabego.closePopup=function(_6){\nif(abego.isPopupOpen(_6)){\ndocument.body.removeChild(_6);\n}\n};\nabego.getWindowRect=function(){\nreturn {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};\n};\nabego.moveElement=function(_7,_8,_9){\"px";\"px";\n};\nabego.centerOnWindow=function(_a){\nif(!="absolute"){\nthrow "abego.centerOnWindow: element must have absolute position";\n}\nvar _b=abego.getWindowRect();\nabego.moveElement(_a,_b.left+(_b.width-_a.offsetWidth)/2,;\n};\nabego.isDescendantOrSelf=function(_c,e){\nwhile(e){\nif(_c==e){\nreturn true;\n}\ne=e.parentNode;\n}\nreturn false;\n};\nabego.toSet=function(_e){\nvar _f={};\nfor(var i=0;i<_e.length;i++){\n_f[_e[i]]=true;\n}\nreturn _f;\n};\nabego.filterStrings=function(_11,_12,_13){\nvar _14=[];\nfor(var i=0;i<_11.length&&(_13===undefined||_14.length<_13);i++){\nvar s=_11[i];\nif(s.match(_12)){\n_14.push(s);\n}\n}\nreturn _14;\n};\nabego.arraysAreEqual=function(a,b){\nif(!a){\nreturn !b;\n}\nif(!b){\nreturn false;\n}\nvar n=a.length;\nif(n!=b.length){\nreturn false;\n}\nfor(var i=0;i<n;i++){\nif(a[i]!=b[i]){\nreturn false;\n}\n}\nreturn true;\n};\nabego.moveBelowAndClip=function(_1b,_1c){\nif(!_1c){\nreturn;\n}\nvar _1d=findPosX(_1c);\nvar _1e=findPosY(_1c);\nvar _1f=_1c.offsetHeight;\nvar _20=_1d;\nvar _21=_1e+_1f;\nvar _22=findWindowWidth();\nif(_22<_1b.offsetWidth){\"px";\n}\nvar _23=_1b.offsetWidth;\nif(_20+_23>_22){\n_20=_22-_23-30;\n}\nif(_20<0){\n_20=0;\n}\"px";\"px";\"block";\n};\nabego.compareStrings=function(a,b){\nreturn (a==b)?0:(a<b)?-1:1;\n};\nabego.sortIgnoreCase=function(arr){\nvar _27=[];\nvar n=arr.length;\nfor(var i=0;i<n;i++){\nvar s=arr[i];\n_27.push([s.toString().toLowerCase(),s]);\n}\n_27.sort(function(a,b){\nreturn (a[0]==b[0])?0:(a[0]<b[0])?-1:1;\n});\nfor(i=0;i<n;i++){\narr[i]=_27[i][1];\n}\n};\nabego.getTiddlerField=function(_2d,_2e,_2f){\nvar _30=document.getElementById(_2d.idPrefix+_2e);\nvar e=null;\nif(_30!=null){\nvar _32=_30.getElementsByTagName("*");\nfor(var t=0;t<_32.length;t++){\nvar c=_32[t];\nif(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){\nif(!e){\ne=c;\n}\nif(c.getAttribute("edit")==_2f){\ne=c;\n}\n}\n}\n}\nreturn e;\n};\nabego.setRange=function(_35,_36,end){\nif(_35.setSelectionRange){\n_35.setSelectionRange(_36,end);\nvar max=0+_35.scrollHeight;\nvar len=_35.textLength;\nvar top=max*_36/len,bot=max*end/len;\n_35.scrollTop=Math.min(top,(bot+top-_35.clientHeight)/2);\n}else{\nif(_35.createTextRange!=undefined){\nvar _3b=_35.createTextRange();\n_3b.collapse();\n_3b.moveEnd("character",end);\n_3b.moveStart("character",_36);\;\n}else{\;\n}\n}\n};\nabego.internal.TagManager=function(){\nvar _3c=null;\nvar _3d=function(){\nif(_3c){\nreturn;\n}\n_3c={};\nstore.forEachTiddler(function(_3e,_3f){\nfor(var i=0;i<_3f.tags.length;i++){\nvar tag=_3f.tags[i];\nvar _42=_3c[tag];\nif(!_42){\n_42=_3c[tag]={count:0,tiddlers:{}};\n}\n_42.tiddlers[_3f.title]=true;\n_42.count+=1;\n}\n});\n};\nvar _43=TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler=function(_44,_45,_46,_47,_48,_49){\nvar _4a=this.fetchTiddler(_44);\nvar _4b=_4a?_4a.tags:[];\nvar _4c=(typeof _49=="string")?_49.readBracketedList():_49;\n_43.apply(this,arguments);\nif(!abego.arraysAreEqual(_4b,_4c)){\nabego.internal.getTagManager().reset();\n}\n};\nvar _4d=TiddlyWiki.prototype.removeTiddler;\nTiddlyWiki.prototype.removeTiddler=function(_4e){\nvar _4f=this.fetchTiddler(_4e);\nvar _50=_4f&&_4f.tags.length>0;\n_4d.apply(this,arguments);\nif(_50){\nabego.internal.getTagManager().reset();\n}\n};\nthis.reset=function(){\n_3c=null;\n};\nthis.getTiddlersWithTag=function(tag){\n_3d();\nvar _52=_3c[tag];\nreturn _52?_52.tiddlers:null;\n};\nthis.getAllTags=function(_53){\n_3d();\nvar _54=[];\nfor(var i in _3c){\n_54.push(i);\n}\nfor(i=0;_53&&i<_53.length;i++){\n_54.pushUnique(_53[i],true);\n}\nabego.sortIgnoreCase(_54);\nreturn _54;\n};\nthis.getTagInfos=function(){\n_3d();\nvar _56=[];\nfor(var _57 in _3c){\n_56.push([_57,_3c[_57]]);\n}\nreturn _56;\n};\nvar _58=function(a,b){\nvar a1=a[1];\nvar b1=b[1];\nvar d=b[1].count-a[1].count;\nreturn d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());\n};\nthis.getSortedTagInfos=function(){\n_3d();\nvar _5e=this.getTagInfos();\n_5e.sort(_58);\nreturn _5e;\n};\nthis.getPartnerRankedTags=function(_5f){\nvar _60={};\nfor(var i=0;i<_5f.length;i++){\nvar _62=this.getTiddlersWithTag(_5f[i]);\nfor(var _63 in _62){\nvar _64=store.getTiddler(_63);\nif(!(_64 instanceof Tiddler)){\ncontinue;\n}\nfor(var j=0;j<_64.tags.length;j++){\nvar tag=_64.tags[j];\nvar c=_60[tag];\n_60[tag]=c?c+1:1;\n}\n}\n}\nvar _68=abego.toSet(_5f);\nvar _69=[];\nfor(var n in _60){\nif(!_68[n]){\n_69.push(n);\n}\n}\n_69.sort(function(a,b){\nvar d=_60[b]-_60[a];\nreturn d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());\n});\nreturn _69;\n};\n};\nabego.internal.getTagManager=function(){\nif(!abego.internal.gTagManager){\nabego.internal.gTagManager=new abego.internal.TagManager();\n}\nreturn abego.internal.gTagManager;\n};\n(function(){\nvar _6e=2;\nvar _6f=1;\nvar _70=30;\nvar _71;\nvar _72;\nvar _73;\nvar _74;\nvar _75;\nvar _76;\nif(!abego.IntelliTagger){\nabego.IntelliTagger={};\n}\nvar _77=function(){\nreturn _72;\n};\nvar _78=function(tag){\nreturn _75[tag];\n};\nvar _7a=function(s){\nvar i=s.lastIndexOf(" ");\nreturn (i>=0)?s.substr(0,i):"";\n};\nvar _7d=function(_7e){\nvar s=_7e.value;\nvar len=s.length;\nreturn (len>0&&s[len-1]!=" ");\n};\nvar _81=function(_82){\nvar s=_82.value;\nvar len=s.length;\nif(len>0&&s[len-1]!=" "){\n_82.value+=" ";\n}\n};\nvar _85=function(tag,_87,_88){\nif(_7d(_87)){\n_87.value=_7a(_87.value);\n}\nstory.setTiddlerTag(_88.title,tag,0);\n_81(_87);\nabego.IntelliTagger.assistTagging(_87,_88);\n};\nvar _89=function(n){\nif(_76){\nif(_76.length>n){\nreturn _76[n];\n}\nn-=_76.length;\n}\nreturn (_74&&_74.length>n)?_74[n]:null;\n};\nvar _8b=function(n,_8d,_8e){\nvar _8f=_89(n);\nif(_8f){\n_85(_8f,_8d,_8e);\n}\n};\nvar _90=function(_91){\nvar pos=_91.value.lastIndexOf(" ");\nvar _93=(pos>=0)?_91.value.substr(++pos,_91.value.length):_91.value;\nreturn new RegExp(_93.escapeRegExp(),"i");\n};\nvar _94=function(_95,_96){\nvar _97=0;\nfor(var i=0;i<_95.length;i++){\nif(_96[_95[i]]){\n_97++;\n}\n}\nreturn _97;\n};\nvar _99=function(_9a,_9b,_9c){\nvar _9d=1;\nvar c=_9a[_9b];\nfor(var i=_9b+1;i<_9a.length;i++){\nif(_9a[i][1].count==c){\nif(_9a[i][0].match(_9c)){\n_9d++;\n}\n}else{\nbreak;\n}\n}\nreturn _9d;\n};\nvar _a0=function(_a1,_a2){\nvar _a3=abego.internal.getTagManager().getSortedTagInfos();\nvar _a4=[];\nvar _a5=0;\nfor(var i=0;i<_a3.length;i++){\nvar c=_a3[i][1].count;\nif(c!=_a5){\nif(_a2&&(_a4.length+_99(_a3,i,_a1)>_a2)){\nbreak;\n}\n_a5=c;\n}\nif(c==1){\nbreak;\n}\nvar s=_a3[i][0];\nif(s.match(_a1)){\n_a4.push(s);\n}\n}\nreturn _a4;\n};\nvar _a9=function(_aa,_ab){\nreturn abego.filterStrings(abego.internal.getTagManager().getAllTags(_ab),_aa);\n};\nvar _ac=function(){\nif(!_71){\nreturn;\n}\nvar _ad=store.getTiddlerText("IntelliTaggerMainTemplate");\nif(!_ad){\n_ad="<b>Tiddler IntelliTaggerMainTemplate not found</b>";\n}\n_71.innerHTML=_ad;\napplyHtmlMacros(_71,null);\nrefreshElements(_71,null);\n};\nvar _ae=function(e){\nif(!e){\nvar e=window.event;\n}\nvar tag=this.getAttribute("tag");\nif(_73){\,tag,e);\n}\nreturn false;\n};\nvar _b2=function(_b3){\ncreateTiddlyElement(_b3,"span",null,"tagSeparator"," | ");\n};\nvar _b4=function(_b5,_b6,_b7,_b8,_b9){\nif(!_b6){\nreturn;\n}\nvar _ba=_b8?abego.toSet(_b8):{};\nvar n=_b6.length;\nvar c=0;\nfor(var i=0;i<n;i++){\nvar tag=_b6[i];\nif(_ba[tag]){\ncontinue;\n}\nif(c>0){\n_b2(_b5);\n}\nif(_b9&&c>=_b9){\nabego.createEllipsis(_b5);\nbreak;\n}\nc++;\nvar _bf="";\nvar _c0=_b5;\nif(_b7<10){\n_c0=createTiddlyElement(_b5,"span",null,"numberedSuggestion");\n_b7++;\nvar key=_b7<10?""+(_b7):"0";\ncreateTiddlyElement(_c0,"span",null,"suggestionNumber",key+") ");\nvar _c2=_b7==1?"Ctrl-Space or ":"";\n_bf=" (Shortcut: %1Alt-%0)".format([key,_c2]);\n}\nvar _c3=config.views.wikified.tag.tooltip.format([tag]);\nvar _c4=(_78(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_bf]);\nvar _c5="%0; Shift-Click: %1".format([_c4,_c3]);\nvar btn=createTiddlyButton(_c0,tag,_c5,_ae,_78(tag)?"currentTag":null);\nbtn.setAttribute("tag",tag);\n}\n};\nvar _c7=function(){\nif(_71){\nwindow.scrollTo(0,ensureVisible(_71));\n}\nif(_77()){\nwindow.scrollTo(0,ensureVisible(_77()));\n}\n};\nvar _c8=function(e){\nif(!e){\nvar e=window.event;\n}\nif(!_71){\nreturn;\n}\nvar _cb=resolveTarget(e);\nif(_cb==_77()){\nreturn;\n}\nif(abego.isDescendantOrSelf(_71,_cb)){\nreturn;\n}\nabego.IntelliTagger.close();\n};\naddEvent(document,"click",_c8);\nvar _cc=Story.prototype.gatherSaveFields;\nStory.prototype.gatherSaveFields=function(e,_ce){\n_cc.apply(this,arguments);\nvar _cf=_ce.tags;\nif(_cf){\n_ce.tags=_cf.trim();\n}\n};\nvar _d0=function(_d1){\nstory.focusTiddler(_d1,"tags");\nvar _d2=abego.getTiddlerField(story,_d1,"tags");\nif(_d2){\nvar len=_d2.value.length;\nabego.setRange(_d2,len,len);\nwindow.scrollTo(0,ensureVisible(_d2));\n}\n};\nvar _d4=config.macros.edit.handler;\nconfig.macros.edit.handler=function(_d5,_d6,_d7,_d8,_d9,_da){\n_d4.apply(this,arguments);\nvar _db=_d7[0];\nif((_da instanceof Tiddler)&&_db=="tags"){\nvar _dc=_d5.lastChild;\n_dc.onfocus=function(e){\nabego.IntelliTagger.assistTagging(_dc,_da);\nsetTimeout(function(){\n_d0(_da.title);\n},100);\n};\n_dc.onkeyup=function(e){\nif(!e){\nvar e=window.event;\n}\nif(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){\n_8b(e.keyCode==48?9:e.keyCode-49,_dc,_da);\n}else{\nif(e.ctrlKey&&e.keyCode==32){\n_8b(0,_dc,_da);\n}\n}\nsetTimeout(function(){\nabego.IntelliTagger.assistTagging(_dc,_da);\n},100);\nreturn false;\n};\n_81(_dc);\n}\n};\nvar _e0=function(e){\nif(!e){\nvar e=window.event;\n}\nvar _e3=resolveTarget(e);\nvar _e4=_e3.getAttribute("tiddler");\nif(_e4){\nstory.displayTiddler(_e3,_e4,"IntelliTaggerEditTagsTemplate",false);\n_d0(_e4);\n}\nreturn false;\n};\nvar _e5=config.macros.tags.handler;\nconfig.macros.tags.handler=function(_e6,_e7,_e8,_e9,_ea,_eb){\n_e5.apply(this,arguments);\nabego.IntelliTagger.createEditTagsButton(_eb,createTiddlyElement(_e6.lastChild,"li"));\n};\nvar _ec=function(){\nif(_71&&_72&&!abego.isDescendantOrSelf(document,_72)){\nabego.IntelliTagger.close();\n}\n};\nsetInterval(_ec,100);\nabego.IntelliTagger.displayTagSuggestions=function(_ed,_ee,_ef,_f0,_f1){\n_74=_ed;\n_75=abego.toSet(_ee);\n_76=_ef;\n_72=_f0;\n_73=_f1;\nif(!_71){\n_71=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");\"absolute";\n}\n_ac();\nabego.openAsPopup(_71);\nif(_77()){\nvar w=_77().offsetWidth;\nif(_71.offsetWidth<w){\*(_6e+_6f))+"px";\n}\nabego.moveBelowAndClip(_71,_77());\n}else{\nabego.centerOnWindow(_71);\n}\n_c7();\n};\nabego.IntelliTagger.assistTagging=function(_f3,_f4){\nvar _f5=_90(_f3);\nvar s=_f3.value;\nif(_7d(_f3)){\ns=_7a(s);\n}\nvar _f7=s.readBracketedList();\nvar _f8=_f7.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_f7),_f5,_70):_a0(_f5,_70);\nabego.IntelliTagger.displayTagSuggestions(_a9(_f5,_f7),_f7,_f8,_f3,function(tag,e){\nif(e.shiftKey){\,e);\n}else{\n_85(tag,_f3,_f4);\n}\n});\n};\nabego.IntelliTagger.close=function(){\nabego.closePopup(_71);\n_71=null;\nreturn false;\n};\nabego.IntelliTagger.createEditTagsButton=function(_fb,_fc,_fd,_fe,_ff,id,_101){\nif(!_fd){\n_fd="[edit]";\n}\nif(!_fe){\n_fe="Edit the tags";\n}\nif(!_ff){\n_ff="editTags";\n}\nvar _102=createTiddlyButton(_fc,_fd,_fe,_e0,_ff,id,_101);\n_102.setAttribute("tiddler",(_fb instanceof Tiddler)?_fb.title:String(_fb));\nreturn _102;\n};\nabego.IntelliTagger.getSuggestionTagsMaxCount=function(){\nreturn 100;\n};\nconfig.macros.intelliTagger={label:"intelliTagger",handler:function(_103,_104,_105,_106,_107,_108){\nvar _109=_107.parseParams("list",null,true);\nvar _10a=_109[0]["action"];\nfor(var i=0;_10a&&i<_10a.length;i++){\nvar _10c=_10a[i];\nvar _10d=config.macros.intelliTagger.subhandlers[_10c];\nif(!_10d){\nabego.alertAndThrow("Unsupported action '%0'".format([_10c]));\n}\n_10d(_103,_104,_105,_106,_107,_108);\n}\n},subhandlers:{showTags:function(_10e,_10f,_110,_111,_112,_113){\n_b4(_10e,_74,_76?_76.length:0,_76,abego.IntelliTagger.getSuggestionTagsMaxCount());\n},showFavorites:function(_114,_115,_116,_117,_118,_119){\n_b4(_114,_76,0);\n},closeButton:function(_11a,_11b,_11c,_11d,_11e,_11f){\nvar _120=createTiddlyButton(_11a,"close","Close the suggestions",abego.IntelliTagger.close);\n},version:function(_121){\nvar t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);\nvar e=createTiddlyElement(_121,"a");\ne.setAttribute("href","");\ne.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";\n},copyright:function(_124){\nvar e=createTiddlyElement(_124,"a");\ne.setAttribute("href","");\ne.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">&copy; 2006-2007 <b><font color=\s"red\s">abego</font></b> Software<font>";\n}}};\n})();\nconfig.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";\nconfig.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";\nconfig.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";\nconfig.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|]].";\nconfig.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|]]\sn";\n(function(){\nvar _126=restart;\nrestart=function(){\nsetStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"IntelliTaggerStyleSheet");\n_126.apply(this,arguments);\n};\n})();\n}\n\n//%/\n
!Introduction\nJava notes and articles with an enterprise bent.\n\n!External Notes\n\n!!Testing\n[[Beyond Unit Testing, Steve Longhran pdf format|]]\n[[Testing, Steve Longhran pdf format|]]\n\n!!Web Services\n[[When Web Services Go Bad, Steve Longhran pdf format|]]\n
JavaOS is java operating system coded in java that runs in a JavaVirtualMachine. Sun released JavaOS in 1996 and it is now considered a legacy system.\n\nJavaOS was designed for set boxes and was Sun Microsystems second attempt the set box market with the first being with Project Green bid for java to be the programming language of set boxes by Time Warner.\n\n\n!References\n[[JavaOS(a wikipedia article)|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
JavaPhone is an extension to PersonalJava to use the mobile JavaTelephonyAPI to control telephony functions such as placing a call, checking battery level, address book, calendar, and etc.\n\n!References\n[[JavaPhone API|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
In 1995 Brendan Eich while working at Netscape came up with a programming script language that could be embedded in a browser. Netscape 2 released in 1996 was the first browser to support javascript. Late in 1996 European Computer Manufacturers Association (ECMA) published the ecmascript as a standard in response to Netscape submitting javascript for standardization approval.\n\nJavascript has similar object syntax to java although it is an interpreted computer programming language which means it is evaluate and executed as the browser reads the javascript file.\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
The Java Telephony API was created to allow object oriented computer control of telephony including call control.\n\n!References\n[[Java Telephony API|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
[img[]]\n\n!Outside Articles\n[[Havi Trans Colors(MIDP:JavaTV)|]]\n\n!Articles at Here\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Javame")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \n>>
/***\n|Name|ListboxPlugin|\n|Source||\n|Version|0.7.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|set tiddler fields by selecting enumerated values from a listbox or droplist|\n|Status| ''ALPHA - EXPERIMENTAL ONLY - SUBJECT TO CHANGE - DO NOT DISTRIBUTE'' |\n\n!!!!!Usage\n<<<\nThe {{{<<select>>}}} macro sets tiddler field values by selecting from pre-configured enumerated values in listbox/droplist control. The macro may be used within the ViewTemplate or EditTemplate to a listbox/droplist to every tiddler, or embedded directly in specific tiddler content to create interfaces for custom-built TW "applications" that use tiddler fields to store application-specific values.\n\nSyntax for use in ViewTemplate/EditTemplate:\n{{{\n<div class="editor" macro="select fieldname@tiddlername rows:nn width:xxx autoSave allowBlank allowOther\n value value value ..."></div>\n<div class="editor" macro="select fieldname@tiddlername rows:nn width:xxx autoSave allowBlank allowOther\n label=value label=value label=value ..."></div>\n<div class="editor" macro="select fieldname@tiddlername rows:nn width:xxx autoSave allowBlank allowOther\n +TiddlerName allowEdit"></div>\n}}}\n\nSyntax for direct embedding in tiddler content:\n{{{\n<<select fieldname@tiddlername rows:nn width:xxx allowBlank allowOther\n value value value ...>>\n<<select fieldname@tiddlername rows:nn width:xxx allowBlank allowOther\n label=value label=value label=value ...>>\n<<select fieldname@tiddlername rows:nn width:xxx allowBlank allowOther\n +TiddlerName allowEdit>>\n}}}\n\n//where://\n''fieldname@tiddlername''\n>specifies the tiddler field associated with the list display. The "@tiddlername" portion is optional and, when omitted, the current tiddler is assumed.\n''rows:nn''\n>specifies the number of lines to display in the list. If rows=1, a 'droplist' is displayed. If rows>1 a fixed-height listbox is used. By default (or if rows=0 is used), the listbox is displayed with enough lines to show all items without scrolling (i.e., "fit to contents - vertically")\n''width:xxx''\n>specifies the width of the list, using a CSS dimension value (px, em, in, cm, or %). The default is auto (i.e., "fit to contents - horizontally").\n''autoSave''\n>when used in EditTemplate, this keyword forces selection changes to be applied immediately rather than waiting for the "done" command to be invoked. Note: because the standard ViewTemplate toolbar does not have a "done" command to signal the end of the editing activity, ''autoSave'' is always enabled when working with a selection list that is not being displayed via EditTemplate.\n''allowBlank''\n>when the value of a tiddler field is "undefined", a special 'blank' list item is added at the beginning of the list so that the undefined field value can be indicated. If a field value is subsequently selected, the blank item is removed from the list. Use the ''allowBlank'' keyword to always include the blank item in the list and allow it to be re-selected, allowing you to set the field value back to "undefined" (i.e., delete the field).\n''allowOther''\n>when the value of a tiddler field does not match any of the values in the list, a special 'other' is added at the end of the list so that the unrecognized field value can be indicated. If another field value is subsequently selected, the 'other' item is removed from the list. Use the ''allowOther'' keyword to always include the 'other item in the list. When this item is selected, you will be prompted to enter a custom value to assign to the field.\n''value value value ...'' //(inline list definition)//\n//or// ''label=value label=value label=value ...'' //(inline list definition)//\n//or// ''+TiddlerName'' //(tiddler-based list definition)//\n>specifies list item values or label/value pairs. You can also use the ''+TiddlerName'' syntax to define the values or label/value pairs using a tiddler containing an "HR-separated" list, where each list item is one or two lines of text, separated from the next item by a horizontal rule: """----""". The first line of each item contains the value or label=value that will appear in the list. The second, optional line allows you to specify a custom tooltip for that list item. The default tooltip for a list item is: "{{{set fieldname@tiddlername=itemvalue}}}". Note: if all list entries are single-line (i.e., you are not defining ANY custom tooltips), you can omit the horizontal rule between entries... each line of text will be treated as a separate list entry.\n''allowEdit'' //(for use with +TiddlerName param only)//\n>adds optional "edit list..." item to the end of the list, to enable quick editing of a tiddler-based list definition. Note: if the ''+TiddlerName'' parameter refers to a tiddler that does not yet exist, the "edit list..." item is automatically added to the list, even if ''allowEdit'' was not specified. This allows you to place an 'empty' tiddler-based list into your content (e.g., """<<select fieldname =NewTiddlerName>>"""), and then create and define the tiddler-based list later on.\n<<<\n!!!!!Examples\n<<<\n''inline list definition:''\n{{{<<select thing rows:1 eenie meenie miney moe>>}}}\n<<select thing rows:1 eenie meenie miney moe>>\n{{{<<select size rows:1 xsmall=30 small=32 medium=34 large=36 xlarge=38>>}}}\n<<select size rows:1 xsmall=30 small=32 medium=34 large=36 xlarge=38>>\n{{{<<select size allowOther xsmall=30 small=32 medium=34 large=36 xlarge=38>>}}}\n<<select size allowOther xsmall=30 small=32 medium=34 large=36 xlarge=38>>\n\n''tiddler-based list definition:''\n{{{<<select color rows:1 +ListboxSample>>}}}\n<<select color rows:1 +ListboxSample>>\n{{{<<select color allowBlank allowOther +ListboxSample allowEdit>>}}}\n<<select color allowBlank allowOther +ListboxSample allowEdit>>\n{{{<<select demo@ListboxDemoTarget +ListboxNewSample>>}}}\n<<select demo@ListboxDemoTarget +ListboxNewSample>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\nListboxPlugin\n<<<\n!!!!!Revision History\n<<<\n''2007.05.29 [0.7.0]'' split render() logic from handler(), added notification-based refresh() for lists that use +TiddlerName definition so changes in underlying tiddler definition are automatically sync'ed up in any currently displayed lists\n''2007.05.15 [0.6.1]'' code/documentation cleanup\n''2007.05.14 [0.6.0]'' lots more options\n''2007.05.12 [0.5.0]'' started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by Eric L Shulman / ELS Design Studios\n<<<\n!!!!!Code\n***/\n//{{{\ {major: 0, minor: 7, revision: 0, date: new Date(2007,5,29)};\n\ = {\n tooltip: "select a value for %0%1",\n blankTooltip: "set %0%1=[null] (delete field value)",\n valueTooltip: "set %0%1=%2",\n otherLabel: "other",\n otherTooltip: "set %0%1=[???] (enter custom value)",\n otherPrompt: "enter a value for '%0%1'",\n editLabel: "edit list...",\n editTooltip: "edit '%0' list definition (%1)",\n changeMsg: "setting %0%1=%2",\n verbose: false,\n handler:\n function(place,macroName,params,wikifier,paramString,tiddler) {\n if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one\n var here=story.findContainingTiddler(place);\n if (here) tiddler=store.getTiddler(here.getAttribute("tiddler"))\n }\n\n // get target tiddler and fieldname\n var target=tiddler; // default to fields in current tiddler\n var targetID=tiddler?tiddler.title:"";\n var field=params.shift();\n var pos=field.indexOf("@"); // check for "@TiddlerName" suffix on fieldname\n if (pos!=-1) {\n targetID=field.substr(pos+1);\n target=store.getTiddler(targetID); // get target tiddler (may be non-existent)\n field=field.substr(0,pos);\n }\n // if no field name, do nothing\n if(!field || !field.length) return;\n\n var p=params.shift();\n var rows="0"; if (p.substr(0,5)=="rows:") { rows=p.substr(5); p=params.shift(); } // optional list height in lines\n var width="auto"; if (p.substr(0,6)=="width:") { width=p.substr(6); p=params.shift(); } // optional CSS width\n var autosave=(p.toLowerCase()=="autosave"); if (autosave) p=params.shift(); // optional autosave\n var allowBlank=(p.toLowerCase()=="allowblank"); if (allowBlank) p=params.shift(); // add optional empty item\n var allowOther=(p.toLowerCase()=="allowother"); if (allowOther) p=params.shift(); // add optional "other: ____" item\n\n if (tiddler && !story.isDirty(tiddler.title)) autosave=true; // if tiddler is in VIEW mode, force autosave\n\n if (p.substr(0,1)=="+") { // get list from HR-separated tiddler\n var listsrc=p.substr(1); var listtxt=store.getTiddlerText(listsrc,"");\n var separator="\sn";\n if (listtxt && listtxt.indexOf("\sn----\sn")!=-1) separator="\sn----\sn";\n var list=[];\n if (listtxt && listtxt.length) var list=listtxt.split(separator);\n var allowEdit=(params[0] && params[0].toLowerCase()=="allowedit"); // add optional "edit list..." item\n if (allowEdit) p=params.shift();\n }\n else { // get list from macro params: "value value value ..." or "label=value label=value label=value ..."\n var list=[];\n while (p) {\n var parts=p.split("=");\n var label=parts[0]; var v=parts[1]?parts[1]:parts[0];\n list.push(label+"="+v);\n p=params.shift();\n }\n }\n // register notification handler for ALL tiddler changes (to sync lists)\n store.addNotification(null,this.refresh);\n // render the control\n this.render(createTiddlyElement(place,"span"), tiddler, targetID, field, list, listsrc, rows, width, autosave, allowBlank, allowOther, allowEdit);\n },\n refresh:\n function (title) {\n var lists=document.getElementsByTagName("select");\n for (i=0; i<lists.length; i++) {\n if (lists[i].getAttribute("listsrc")==title) {\n var place=lists[i].parentNode;\n var tiddler=story.findContainingTiddler(place);\n var targetID=lists[i].getAttribute("tiddler");\n var field=lists[i].getAttribute("edit");\n var listsrc=lists[i].getAttribute("listsrc");\n var rows=lists[i].getAttribute("rows");\n var width=lists[i].getAttribute("width");\n var autosave=lists[i].getAttribute("autosave")=="true";\n var allowBlank=lists[i].getAttribute("allowBlank")=="true";\n var allowOther=lists[i].getAttribute("allowOther")=="true";\n var allowEdit=lists[i].getAttribute("allowEdit")=="true";\n // get the list\n var listtxt=store.getTiddlerText(listsrc,"");\n var separator="\sn"; if (listtxt && listtxt.indexOf("\sn----\sn")!=-1) separator="\sn----\sn";\n var list=[]; if (listtxt && listtxt.length) var list=listtxt.split(separator);\n // re-render control\n removeChildren(place);\n, tiddler, targetID, field, list, listsrc, rows, width, autosave, allowBlank, allowOther, allowEdit);\n }\n }\n },\n render:\n function (place, tiddler, targetID, field, list, listsrc, rows, width, autosave, allowBlank, allowOther, allowEdit) {\n var val=store.getValue(store.getTiddler(targetID),field);\n var count=0; var options="";\n // "@TiddlerName" suffix for display in tooltips (omit if targetID is for current tiddler)\n var targetDisplay=(!tiddler || targetID!=tiddler.title?"@"+targetID:"");\n // add default 'undefined' item\n if (val==undefined || allowBlank) {\n var title=this.blankTooltip.format([field,targetDisplay]);\n options+='<option value="" title="'+title+'"></option>';\n count++;\n }\n // add enumerated items\n var isOther=(val!=undefined);\n for (opt=0; opt<list.length; opt++) {\n var lines=list[opt].split("\sn"); var parts=lines[0].split("=");\n var label=parts[0];\n var v=parts[1]?parts[1]:parts[0];\n var title=lines[1]?lines[1]:this.valueTooltip.format([field,targetDisplay,v]);\n options+='<option value="'+v+'" '+(val==v?'selected':'')+' title="'+title+'">'+label+'</option>';\n if (val==v) isOther=false; // found matching value in list\n count++;\n }\n // add other... item\n if (val!=undefined && isOther||allowOther) {\n var label="other"+(isOther?(": "+val):"...");\n var v=isOther?val:"";\n var title=this.otherTooltip.format([field,targetDisplay]);\n options+='<option value="'+v+'" '+(isOther?'selected':'')+' title="'+title+'">'+label+'</option>';\n count++;\n }\n // add edit list... item\n if (listsrc && (!store.tiddlerExists(listsrc) || allowEdit)) {\n var title=this.editTooltip.format([field,listsrc]);\n options+='<option value="'+listsrc+'" title="'+title+'">'+this.editLabel+'</option>';\n count++;\n }\n // construct full HTML\n var html='<select ';\n html+=(val!=undefined?'value="'+val+'" ':'')+'" edit="'+field+'" ';\n html+='onchange="return,event)" ondblclick="return false" ';\n html+='autosave="'+autosave+'" allowBlank="'+allowBlank+'" ';\n html+='allowOther="'+allowOther+'" allowEdit="'+allowEdit+'" ';\n html+='rows="'+rows+'" size="'+(rows!=0?rows:count)+'" ';\n html+='tiddler="'+targetID+'" '+'" listsrc="'+listsrc+'" ';\n html+='title="'+this.tooltip.format([field,targetDisplay])+'" style="width:'+width+'">'+options+'</select>';\n // pass to browser for rendering\n place.innerHTML=html;\n },\n onChange:\n function(here,event) {\n if (here.options[here.selectedIndex] {\n story.displayTiddler(story.findContainingTiddler(here),here.value,DEFAULT_EDIT_TEMPLATE);\n return false;\n }\n var;\n if (here.getAttribute("allowother")=="true" && here.options[here.selectedIndex].text.substr(0,label.length)==label) {\n var newval=prompt([here.getAttribute("edit")]),here.value);\n if (!newval) {// user cancelled\n var v=store.getValue(here.getAttribute("tiddler"),here.getAttribute("edit"));\n { here.value=v; if (v==undefined) here.selectedIndex=0; return false; }\n };\n here.options[here.selectedIndex].value=newval;\n here.options[here.selectedIndex]": "+newval;\n here.value=newval;\n }\n if (here.getAttribute("autosave")=="true") {\n // defer setting field value until after onChange handling has finished\n // avoids browser problems due to listbox content being refreshed *during* onChange handling\n Date()).convertToYYYYMMDDHHMMSSMMM()+Math.random().toString(); // unique ID\n setTimeout('"''")',1);\n }\n return false;\n },\n setFieldValue:\n function(id) {\n var here=document.getElementById(id);\n var tid=here.getAttribute("tiddler"); if (!tid || !tid.length) return; // no target tiddler specified, do nothing\n\n // touch (or create) target tiddler so that modified and modifier are updated\n var body=""; var tags=[]; var fields={};\n var target=store.getTiddler(tid);\n if (target) { body=target.text; tags=target.tags; fields=target.fields; }\n store.saveTiddler(tid,tid,body,config.options.txtUserName,new Date(),tags,fields);\n\n // set the field value in the target tiddler\n var field=here.getAttribute("edit");\n store.setValue(tid,field,here.value.length?here.value:null); // if value is blank, delete field\n if (\n { clearMessage(); displayMessage([field,tid,here.value])); }\n }\n}\n//}}}
[[Welcome to Tiddlyspot]] GettingStarted\nShareMePersonal\nEnterpriseEnterprise\n[[Mobile]]\nLinuxUnix\n
<!--XHMTL10Loader-START--><script type="text/javascript">\n//<![CDATA[\nif (!window.abego) window.abego = {};\nif (!abego.XHTML10Loader) {\n //--------------------------------\n // abego.XHTML10Loader (inherits from LoaderBase)\n \n abego.XHTML10Loader = function() {};\n abego.XHTML10Loader.prototype = new LoaderBase();\n \n abego.XHTML10Loader.prototype.lingo = {\n unnamedValue: "Unnamed value",\n redefining: "Redefining value of %0",\n noXHTML10Format: "Storage not in XHTML 1.0 format"\n }\n \n abego.XHTML10Loader.prototype.getTitle = function(store, e) {\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute('title');\n if(!title && { \n var lenPrefix = store.idPrefix.length;\n if (,lenPrefix) == store.idPrefix)\n title =;\n }\n return title;\n };\n \n abego.XHTML10Loader.prototype.internalizeTiddler = function(store, tiddler, title, data) {\n var fields = {};\n var elems = data.childNodes;\n for(var i = 0; i < elems.length; i++) {\n var e = elems[i];\n var name = e.getAttribute('title');\n if (!name) \n throw this.lingo.unnamedValue;\n if (fields[name] !== undefined) \n throw this.lingo.redefining.format([name]);\n fields[name] = getNodeText(e.firstChild); \n }\n \n // Extract (and remove) the standard fields from the extended fields\n var text = fields.text;\n var modifier = fields.modifier;\n var modified = Date.convertFromYYYYMMDDHHMM(fields.modified);\n var c = fields.created;\n var created = c ? Date.convertFromYYYYMMDDHHMM(c) : modified;\n var tags = fields.tags;\n delete fields.modifier;\n delete fields.modified;\n delete fields.created;\n delete fields.tags;\n delete fields.text;\n delete fields.title;\n \n tiddler.assign(title,text,modifier,modified,tags,created,fields);\n \n return tiddler;\n };\n \n var findRootNode = function(nodes) {\n if (nodes) {\n // skip leading text nodes\n for (var i = 0; i < nodes.length; i++)\n if (nodes[i].nodeType != 3)\n break;\n \n if (i < nodes.length && nodes[i].className == 'twXHTML10')\n return nodes[i];\n }\n };\n \n abego.XHTML10Loader.prototype.loadTiddlers = function(store,nodes) {\n // in the twXHMTL10 format all tiddler elements are contained in one enclosing DIV\n // that contains the format information\n var root = findRootNode(nodes)\n if (!root) \n throw this.lingo.noXHTML10Format;\n return LoaderBase.prototype.loadTiddlers.apply(this, [store, root.childNodes]);\n };\n \n \n //--------------------------------\n // Hijack the loadFromDiv\n (function() {\n var origTiddlyWikiLoadFromDiv = TiddlyWiki.prototype.loadFromDiv;\n TiddlyWiki.prototype.loadFromDiv = function(srcID,idPrefix) {\n // use the XHTML 1.0 loader when the storearea is in 'twXHTML10' format,\n // otherwise use the default loader\n var e = document.getElementById(srcID);\n if (e && findRootNode(e.childNodes))\n this.loader = new abego.XHTML10Loader();\n return origTiddlyWikiLoadFromDiv.apply(this, arguments);\n };\n })();\n}\n\n\n//]]>\n</script>\n<!--XHMTL10Loader-END-->\n
<!--{{{-->\n<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>\n<!--}}}-->\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>Shareme Wiki</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>
%\n|Name|MediaCenter|\n|Source||\n|Version|1.0.2|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin, HTMLFormattingPlugin, MediaCenterList|\n|Overrides||\n|Description|embedded multi-type player for winmedia, real, quicktime, flash, and JPG/GIF images |\n\nUsage:\n <<tiddler MediaCenter with: ID>>\nWhere:\n ID (optional, but recommended)\n used to create unique DOM element IDs for the MediaCenter form and the player object.\n This allows multiple instances of the player to be rendered in the same document.\n Default is "$1"\n\n%/<html><form id="playerform_$1" style="display:block;margin:0;padding:0"\n onsubmit="document.getElementById('mediacenter_player_$1').style.display=document.getElementById('mediacenter_resize_$1').style.display='inline'; config.macros.player.loadURL(null,'player_$1',this.type.value,this.url.value,this.w.value,this.h.value,this.ctrls.checked);this.done.disabled=false;return false;"><!--\n--><nobr><select name="favorites" id="mediacenter_favorites_$1" size="1" style="font-size:8pt;width:25%"\n onchange="this.form.url.value=this.value; document.getElementById('mediacenter_player_$1').style.display=document.getElementById('mediacenter_resize_$1').style.display='inline'; config.macros.player.loadURL(null,'player_$1', this.form.type.value, this.form.url.value, this.form.w.value, this.form.h.value, this.form.ctrls.checked); this.form.done.disabled=false"><!--\n--><option value="">media favorites...</option><!--\n--></select><!--\n--><input type="button" value="add" title="add URL to the MediaCenter favorites" style="font-size:8pt;width:5%"\n onclick="window.mediaCenterAddFavorite(this.form.url);"><!--\n--><input type="button" value="del" title="remove URL from the MediaCenter favorites" style="font-size:8pt;width:5%"\n onclick="window.mediaCenterDeleteFavorite(this.form.favorites);"><!--\n--><input type="button" value="edit" title="edit the MediaCenter favorites list definition" style="font-size:8pt;width:5%"\n onclick="story.displayTiddler(null,'MediaCenterList',2)"><!--\n--><input type="text" name="url" size="60" value="" style="font-size:8pt;width:30%"\n onfocus=""><!--\n--><select name="type" id="mediacenter_type_$1" size="1" style="font-size:8pt;width:13%"><!--\n--><option value="">media type...</option><!--\n--><option value="">auto-detect</option><!--\n--><option value="windows">Windows Media</option><!--\n--><option value="realone">Real One</option><!--\n--><option value="quicktime">QuickTime</option><!--\n--><option value="flash">Flash</option><!--\n--><option value="image">JPG/GIF image</option><!--\n--><option value="iframe">web page</option><!--\n--></select><!--\n--><input type="submit" value="go" title="view URL in embedded player" style="font-size:8pt;width:4%"><!--\n--><input type="button" value="open" title="view URL in a separate player" style="font-size:8pt;width:6%"\n onclick="if(this.form.url.value.length)"><!--\n--><input type="button" value="done" name="done" disabled title="disconnect from URL" style="font-size:8pt;width:6%"\n onclick="config.macros.player.loadURL(null,'player_$1',null,null,this.form.w.value,'0px');document.getElementById('mediacenter_player_$1').style.display=document.getElementById('mediacenter_resize_$1').style.display='none';this.disabled=true; "><!--\n--><div id="mediacenter_player_$1" style="display:none"><center><<player "id=player_$1" "" 100% 0>></center></div><span id="mediacenter_resize_$1" style="margin-top:2px;display:none;"><div style="float:right;font-size:8pt"><!--\n--> size: <input type="text" name="w" size="3" value="" style="font-size:8pt;"\n onfocus=""><!--\n-->x<input type="text" name="h" size="3" value="" style="font-size:8pt;"\n onfocus=""><!--\n--> <input type="submit" value="set" style="font-size:8pt;width:5%"\n onclick="if(!this.form.w.value.trim().length)this.form.w.value=config.options.txtPlayerDefaultWidth; if(!this.form.h.value.trim().length)this.form.h.value=config.options.txtPlayerDefaultHeight;"><!--\n--><input type="submit" value="reset" style="font-size:8pt;width:5%"\n onclick="this.form.w.value=config.options.txtPlayerDefaultWidth; this.form.h.value=config.options.txtPlayerDefaultHeight; this.form.ctrls.checked=true"><!--\n--><input type="button" value="fit" title="resize player to fit containing window" style="font-size:8pt;width:5%"\n onclick="window.mediaCenterFitSize(this)"><!--\n--></div><!--\n--> <input type="checkbox" name="ctrls" CHECKED \n onclick="config.macros.player.loadURL(null,'player_$1', this.form.type.value, this.form.url.value, this.form.w.value, this.form.h.value, this.checked)">show controls</span><!--\n--></nobr></form></html><script>\n\ndocument.getElementById("playerform_$1").w.value=config.options.txtPlayerDefaultWidth;\ndocument.getElementById("playerform_$1").h.value=config.options.txtPlayerDefaultHeight;\n\n // load favorites droplist from HR-separated "MediaCenterList" tiddler contents\n var here=document.getElementById("mediacenter_favorites_$1");\n while (here.options[1]) here.options[1]=null; // remove current list items (leave 'prompt' item)\n var list=store.getTiddlerText("MediaCenterList");\n if (list && list.trim().length) {\n var parts=list.split("\sn----\sn");\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n var indent=value&&value.length?"\sxa0\sxa0":"";\n here.options[here.length]=new Option(indent+label,value,false,false);\n }\n }\n\n\nwindow.mediaCenterFitSize = function(place) {\n var trim=89; // fudge factor to account for the other controls + padding + borders. ADJUST THIS VALUE TO FIT LAYOUT\n var t=story.findContainingTiddler(place); if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;\n var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:\n var h=t.offsetHeight-trim; // workaround: get containing panel/tiddler height and subtract "trim" height\n config.macros.player.loadURL(null,'player_$1',this.form.type.value,place.form.url.value,w,h,place.form.ctrls.checked); // reload player with new size\n place.form.w.value=w; place.form.h.value=h; // update width/height input fields\n}\n\nwindow.mediaCenterAddFavorite = function(place) {\n var v=place.value; if (!v.length) return;\n var d=prompt("Please enter a description for\sn"+place.value); if (!d || !d.length) return;\n var t = store.getTiddler("MediaCenterList"); t.set(null,"%0\sn%1\sn----\sn%2".format([d,v,t.text]));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MediaCenterList",1,true);\n story.refreshTiddler("MediaCenter",1,true);\n store.setDirty(true);\n}\n\nwindow.mediaCenterDeleteFavorite = function(place) {\n var v=place.value; if (!v.length) return;\n var d=place.options[place.selectedIndex].text; if (!d.length) return;\n var t = store.getTiddler("MediaCenterList");\n if (!confirm("Are you sure you want to remove this MediaCenter favorite?\sn\sn"+d+"\sn"+v)) return;\n var pat='%0\sn%1\sn----\sn'.format([d.replace(/\sxa0/g,''),v]); var re=new RegExp(pat,"i");\n t.set(null,t.text.replace(re,""));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MediaCenterList",1,true);\n story.refreshTiddler("MediaCenter",1,true);\n store.setDirty(true);\n}\n\n</script>
"PovertyUSA" - WATCH THIS!\n\n----\nJack W counts (1yr old)\n\n----\nKulak's Woodshed: Live/Recorded acoustic music\n\n----\nwebcams...\n\n----\nTimes Square\n\n----\nMonterey Bay\n\n----\nMonterey Aquarium - Sharks\n\n----\nChiswell Island, Alaska - Sea Lions\n\n----\nWrightsville Beach, North Carolina\n\n----\nKoningsplein, Amsterdam\nmms://\n----\nCorsica\nhttp://\n----\nnews...\n\n----\nBBC News24 - Live\n\n----\nBBC News - London Summary\n\n----\nBBC Entertainment News\n\n----\nBloomberg Business News\n\n----\nmovies (AmericaFree.TV)...\n\n----\nClassic Comedy\n\n----\nClassic Movies\n\n----\n"B" Movies\n\n----\nscience/education...\n\n----\nPBS: Annenberg/CPB\n\n----\nNASA TV\n\n----\ngovernment...\n\n----\nC-SPAN 1\n\n----\nC-SPAN 2\n\n----\nC-SPAN 3\n\n----\ngames...\n\n----\nRag Doll\n\n----\nAsteroids\n\n----\nPacMan\n\n----\nTetris\n\n----\nSimon\n
/%\n|Name|MiniBrowser|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin, MiniBrowserList|\n|Overrides||\n|Description|use an 'inline frame' to display another site inside a tiddler with navigation buttons and a dropdown list of favorite URLs.|\n\nUsage:\n<<tiddler MiniBrowser with: id>>\n\nwhere:\n id - (optional) specifies an ID to assign to the DOM element for the embedded IFRAME. If you want to have **more than one** MiniBrowser displayed at a time, you MUST provide an ID, so that each MiniBrowser can be uniquely identified within the DOM structure.\n\nNote: MiniBrowserList can be *empty*, but must already exist for you to ADD a favorite to the list. If you don't copy the sample list from TiddlyTools, be sure to create this tiddler in your own document if you intend to use the MiniBrowser's "favorites" droplist.\n\n%/<html><form target="browser_$1" style="margin:0;padding:0"\n onsubmit="this.action=this.url.value; this.form.done.disabled=false" style="margin:0;padding:0"><nobr><!--\n--><input type="button" value="<" title="back" style="font-size:8pt;width:3%"\n onclick="try{window.frames['browser_$1'].history.go(-1)}catch(e){window.history.go(-1)}" ><!--\n--><input type="button" value=">" title="forward" style="font-size:8pt;width:3%"\n onclick="try{window.frames['browser_$1'].history.go(+1)}catch(e){window.history.go(+1)}"><!--\n--><input type="button" value="+" title="refresh"style="font-size:8pt;width:3%"\n onclick="window.frames['browser_$1'].location.reload()"><!--\n--><input type="button" value="x" title="stop"style="font-size:8pt;width:3%"\n onclick="window.stop()"><!--\n--><select name="bookmarks" id="browser_bookmarks_$1" size="1" style="font-size:8pt;width:21%"\n onchange="var f=document.getElementById('browser_$1'); if (!this.value.length) return window.miniBrowserResetSize(); else window.miniBrowserSetSize(this.form); this.form.url.value=this.value; this.form.action=this.value; this.form.submit(); this.form.done.disabled=false">\n<option value="">bookmarks...</option>\n</select><!--\n--><input type="button" value="add" title="add this URL to the MiniBrowser bookmarks" style="font-size:8pt;width:5%"\n onclick="window.miniBrowserAddBookmark(this.form.url);"><!--\n--><input type="button" value="del" title="remove this URL from the MiniBrowser bookmarks" style="font-size:8pt;width:5%"\n onclick="window.miniBrowserDeleteBookmark(this.form.bookmarks);"><!--\n--><input type="button" value="edit" title="edit the MiniBrowser bookmarks list definition" style="font-size:8pt;width:5%"\n onclick="story.displayTiddler(null,'MiniBrowserList',2)"><!--\n--><input type="text" name="url" size="60" value="" style="font-size:8pt;width:35%"\n onfocus=";" onkeyup="var k=event.keyCode; if (k==13|k==10);"><!--\n--><input type="button" name="go" value="go" title="view this URL" style="font-size:8pt;width:4%"\n onclick="if(!this.form.url.value.length) return; window.miniBrowserSetSize(this.form); this.form.action=this.form.url.value; this.form.submit(); this.form.done.disabled=false"><!--\n--><input type="button" value="open" title="open this URL in a separate window" style="font-size:8pt;width:6%"\n onclick="if(this.form.url.value.length)"><!--\n--><input type="button" value="done" name="done" title="stop viewing this URL" disabled style="font-size:8pt;width:6%"\n onclick="this.form.url.value=''; this.form.bookmarks.selectedIndex=0; window.miniBrowserResetSize(); this.disabled=true;">\n<iframe name="browser_$1" id="browser_$1" style="width:100%;height:1em;display:none;background:#fff;border:1px solid"></iframe><div id="browser_resize_$1" style="text-align:center;marginTop:2px;display:none;font-size:8pt"><!--\n--> size: <input type="text" name="w" size="3" value="100%" style="font-size:8pt;"\n onfocus=""><!--\n-->x<input type="text" name="h" size="3" value="400" style="font-size:8pt;"\n onfocus=""><!--\n--> <input type="button" value="set" style="font-size:8pt;"\n onclick="var w=this.form.w.value.trim(); if (!w||!w.length) w='100%'; var h=this.form.h.value.trim(); if (!h||!h.length) h='400'; if (!w.replace(/[0-9]*/,'').length) w+='px'; if (!h.replace(/[0-9]*/,'').length) h+='px'; var f=document.getElementById('browser_$1');;;"><!--\n--><input type="button" value="reset" style="font-size:8pt;"\n onclick="var w='100%'; var h='400'; var f=document.getElementById('browser_$1');;'px'; this.form.w.value=w; this.form.h.value=h;"><!--\n--><input type="button" value="fit" title="resize to fit containing window" style="font-size:8pt;"\n onclick="window.miniBrowserFitSize(this)"><!--\n--></div></nobr></form></html><script>\n\n // load bookmarks droplist from HR-separated "MiniBrowserList" tiddler contents\n var here=document.getElementById("browser_bookmarks_$1");\n while (here.length) here.options[0]=null; // remove current list items\n here.options[here.length]=new Option("bookmarks...","",true,true);\n var list=store.getTiddlerText("MiniBrowserList");\n if (list && list.trim().length) {\n var parts=list.split("\sn----\sn");\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n var indent=value&&value.length?"\sxa0\sxa0":"";\n here.options[here.length]=new Option(indent+label,value,false,false);\n }\n }\n\nwindow.miniBrowserSetSize = function(form) {\n var f=document.getElementById('browser_$1');\n var w=form.w.value.trim(); if (!w||!w.length) w='100%'; if (!w.replace(/[0-9]*/,'').length) w+='px'; \n var h=form.h.value.trim(); if (!h||!h.length) h='400'; if (!h.replace(/[0-9]*/,'').length) h+='px';\n;;"block";\n document.getElementById('browser_resize_$1').style.display="block";\n return false;\n}\n\nwindow.miniBrowserResetSize = function() {\n var f=document.getElementById('browser_$1');\n if (f.src.length) f.src="";\n'100%';'1em';"none";\n document.getElementById('browser_resize_$1').style.display="none";\n return false;\n}\nwindow.miniBrowserFitSize = function(place) {\n var trim=88; // fudge factor for controls + padding + borders. ADJUST TO FIT LAYOUT\n var t=story.findContainingTiddler(place);\n if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;\n var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:\n var h=(t.offsetHeight-trim); // workaround: get containing panel/tiddler height and subtract "trim" height\n place.form.w.value=w; place.form.h.value=h; // update width/height input fields\n var f=document.getElementById('browser_$1');\n;"px";\n}\n\nwindow.miniBrowserAddBookmark = function(place) {\n var v=place.value; if (!v.length) return;\n var d=prompt("Please enter a description for\sn"+place.value); if (!d || !d.length) return;\n var t = store.getTiddler("MiniBrowserList"); t.set(null,"%0\sn%1\sn----\sn%2".format([d,v,t.text]));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MiniBrowserList",1,true);\n story.refreshTiddler("MiniBrowser",1,true);\n store.setDirty(true);\n}\n\nwindow.miniBrowserDeleteBookmark = function(place) {\n var v=place.value; if (!v.length) return;\n var d=place.options[place.selectedIndex].text; if (!d.length) return;\n var t = store.getTiddler("MiniBrowserList");\n if (!confirm("Are you sure you want to remove this MiniBrowser bookmark?\sn\sn"+d+"\sn"+v)) return;\n var pat='%0\sn%1\sn----\sn'.format([d.replace(/\sxa0/g,''),v]); var re=new RegExp(pat,"i");\n t.set(null,t.text.replace(re,""));\n var here=story.findContainingTiddler(place);\n if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);\n story.refreshTiddler("MiniBrowserList",1,true);\n story.refreshTiddler("MiniBrowser",1,true);\n store.setDirty(true);\n}\n</script><<tiddler HideTiddlerTags>>
TiddlySites:\n\n----\ - official release\n\n----\ - current release notes\n\n----\ - new development pre-prelease\n\n----\ - new development/wiki/source control\n\n----\nTiddlyTools - plugins, scripts, templates, etc.\n\n----\nTiddlySpot - instant TiddlyWiki hosting!!\n\n----\nGeneral:\n\n----\nGoogle Groups - discussion/community help\n\n----\ - find popular TiddlyWiki sites\n\n----\nFrappr - add a pin to the TiddlyWiki user map!\n\n----\nReferences:\n\n----\nDevGuru CSSQuickRef\n\n----\nDevGuru JSQuickRef\n\n----\nGeneral:\n\n----\nNews - CNN\n\n----\nNews - BBC\n\n----\nComics\n\n----\nTelevision\n\n----\nWeather\n\n----\nEarthquakes\n\n----\nMaps\n
!Introduction\nThis is a resource page for mobile development using J2me(javame).\n\n
This article describes Mobile Ajax and its role within mobile technology.\n\n!Mobile Ajax Beginnings\nMobile Ajax was coined somewhere in 2005 to 2006 time period with the eventual establishment of a some Mobile Ajax work groups through the interactions of [[w3c|]] and [[openajax|]]. Basically, Mobile Ajax is the same as regular Ajax but implemented differently to handle mobile technology uniqueness.\n\n!Mobile Ajax Difficulties\nThe main problem relates to working on a constrained device with limited resources which translates into http latency, slow load times, and etc. Asynchronous HTML and HTTP(AHAH) - or AJAH is designed specifically to address these issues. Both methods transfer HTML or XHTML as the data representation instead of XML.\n\nThe other aspect is how to get access to device specific functions such as bluetooth. Right now there is not a way that tis non complex to accomplish this goal as you have to code a device specific operating system stub to pass stuff to the mobile ajax framework. Some of the areas that w3c and openajax is exploring is having javame through the jcp enable this functionality through a possible addition to Javame MIDP 4.\n\n!References\n[[mobile Ajax FAQ|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
!Introduction\nA listing of mobile technology articles.\n\n!Articles\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Mobile")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \n>>
[[MonkeyPirateTiddlyWiki|]] is a distribution of [[TiddlyWiki|]] created by Simon Baird. See [[the web site|]] for more information.\n!!Upgrading ~MonkeyPirateTiddlyWiki\nThis "empty" ~MonkeyPirateTiddlyWiki file comes pre-installed with the core ~MonkeyPirateTiddlyWiki plugins. You can upgrade these core plugins to the latest version by doing the following:\n* Click ImportTiddlers\n* Click "Choose..." and select "~MptwUpgradeURL"\n* Click "fetch"\n* Click the checkbox in the first column heading to select all tiddlers\n* Click "More actions..." and select "Import these tiddlers"\n* Click "OK" to confirm you want to overwrite the tiddlers\n* Save and reload\n
/***\n|Name|MoveablePanelPlugin|\n|Source||\n|Version|1.3.5|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires|NestedSlidersPlugin|\n|Overrides||\n|Description|Add move, size, max/restore mouse event handling and fold/unfold, hover/scroll, and close/dock toolbar command items to any floating panel|\n!!!!!Usage\n<<<\nsyntax: {{{<<moveablePanel>>}}}\n\nexample: //using NestedSlidersPlugin 'floating panel' syntax//\n//{{{\n+++^30em^[panel]<<moveablePanel>>this is a headline for the panel\n----\n this is a moveable floating panel\n with a few lines of text\n as an example for you to try...\n //note: this line is really long so you can see what happens to word wrapping when you re-size this panel//\n===\n//}}}\nTry it: +++^30em^[panel]<<moveablePanel>>this is a headline for the panel\n----\n this is a moveable floating panel\n with a few lines of text\n as an example for you to try...\n //note: this line is really long so you can see what happens to word wrapping when you re-size this panel//\n===\n\n\nWhen the mouse is just inside the edges of the tiddler/panel, the cursor will change to a "crossed-arrows" symbol, indicating that the panel is "moveable". Grab (click-hold) the panel anywhere in the edge area and then drag the mouse to reposition the panel.\n\nTo resize the panel, hold the ''shift'' key and then grab the panel: the cursor will change to a "double-arrow" symbol. Drag a side edge of the panel to stretch horizontally or vertically, or drag a corner of the panel to stretch in both dimensions at once.\n\nDouble-clicking anywhere in the edge area of a panel will 'maximize' it to fit the current browser window.\n\nWhen the mouse is anywhere over a panel (not just near the edge), a 'toolbar menu' appears in the ''upper right corner'', with the following command items:\n*fold/unfold: ''fold'' temporarily reduces the panel height to show just one line of text. ''unfold'' restores the panel height.\n*hover/scroll: when you scroll the browser window, the moveable panels scroll with it. ''hover'' lets you keep a panel in view, while the rest of the page content moves in the window. ''scroll'' restores the default scrolling behavior for the panel. //Note: Due to browser limitations, this feature is not currently available when using Internet Explorer (v6 or lower)... sorry.//\n*close: ''close'' hides a panel from the page display. If you have moved/resized a panel, closing it restores its default position and size.\n*dock: unlike a floating panel, a moveable //tiddler// does not "float" on the page until it has actually been moved from its default position. When moving a tiddler, the ''close'' command is replaced with ''dock'', which restores the tiddler to its default //non-floating// location on the page.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''MoveablePanelPlugin'' (tagged with <<tag systemConfig>>)\nNote: for compatibility, please also install the current version of ''NestedSlidersPlugin''.\n<<<\n!!!!!Revision History\n<<<\n''2007.06.02 [1.3.5]'' in handler(), if floating panel has a corresponding button element (i.e., a NestedSlider), then remove onmouseover handler from that button element, to prevent automatic "snap to original location" behavior. This allows *moveable* floating panels to maintain their placement when they have been manually re-positioned. This change is made for compatibility with [[NestedSlidersPlugin]] use of onmouseover (see Revision History entry for version 2.0.4)\n''2006.10.17 [1.3.4]'' when moving panel, adjust position for relative containing DIV\n''2006.05.25 [1.3.3]'' in closePanel(), use p.button.onclick() so that normal processing (updating slider button tooltip, access key, etc.) is performed\n''2006.05.11 [1.3.2]'' doc update\n''2006.05.11 [1.3.1]'' re-define all functions within moveablePanel object (eliminate global window.* function definitions (and some "leaky closures" in IE)\n''2006.05.11 [1.3.0]'' converted from inline javascript to true plugin\n''2006.05.09 [1.2.3]'' in closePanel(), set focus to sliderpanel button (if any)\n''2006.05.02 [1.2.2]'' in MoveOrSizePanel(), calculate adjustments for top and left when inside nested floating panels\n''2006.04.06 [1.2.1]'' in getPanel(), allow redefinition or bypass of "moveable" tag (changed from hard-coded "tearoff")\n''2006.03.29 [1.2.0]'' in getPanel(), require "tearoff" tag to enable floating tiddlers\n''2006.03.13 [1.1.0]'' added handling for floating tiddlers and conditional menu display\n''2006.03.06 [1.0.2]'' set move or resize cursor during mousetracking\n''2006.03.05 [1.0.1]'' use "window" vs "document.body" so mousetracking in FF doesn't drop the panel when moving too quickly\n''2006.03.04 [1.0.0]'' Initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.moveablePanel= {major: 1, minor: 3, revision: 5, date: new Date(2007,6,2)};\n//}}}\n//{{{\nconfig.macros.moveablePanel= { \n handler:\n function(place,macroName,params) {\n var p=this.getPanel(place); if (!p) return;\n var showfold=true; var showhover=true;\n while (param=params.shift()) {\n if (param.toLowerCase()=="nofold") showfold=false;\n if (param.toLowerCase()=="nohover") showhover=false;\n }\n\n // remember original panel event handlers, size, location, border\n if (!p.saved) p.saved= {\n mouseover: p.onmouseover,\n mouseout: p.onmouseout,\n dblclick: p.ondblclick,\n top:,\n left:,\n width:,\n height:,\n position:,\n border:\n };\n\n // create control menu items\n var menupos=p.className=="floatingPanel"?"float:right;":"position:absolute;right:2em;top:3em;";\n var menustyle=p.className!="floatingPanel"?'style="border:1px solid #666;background:#ccc;color:#000;padding:0px .5em;"':"";\n var html='<div style="font-size:7pt;display:none;'+menupos+'">&nbsp;';\n if (p.className=="floatingPanel" && showfold)\n html+='<a href="javascript:;" title="reduce panel size" '+menustyle\n +' onclick="return config.macros.moveablePanel.foldPanel(this,event)">fold</a>&nbsp; ';\n if (!config.browser.isIE && showhover)\n html+='<a href="javascript:;" title="keep panel in view when scrolling"'+menustyle\n +' onclick="return config.macros.moveablePanel.hoverPanel(this,event)">hover</a>&nbsp; ';\n if (p.className=="floatingPanel")\n html+='<a href="javascript:;" title="close panel and reset to default size and position"'+menustyle\n +' onclick="return config.macros.moveablePanel.closePanel(this,event)">close</a>';\n else\n html+='<a href="javascript:;" title="reset panel to default size and position"'+menustyle\n +' onclick="return config.macros.moveablePanel.closePanel(this,event)">dock</a>';\n html+='</div>';\n p.menudiv=createTiddlyElement(place,"span");\n p.menudiv.innerHTML=html;\n\n // init mouse handling and tooltip\n p.title="drag edge to move, shift key=stretch, double-click=max/restore";\n p.onmouseover=function(event) {\n if (this.className=="floatingPanel"||"absolute"||"fixed") {\n if (this.className!="floatingPanel")"1px dotted #999"; // border around tiddler\n"inline";\n }\n if (this.saved.mouseover) return this.saved.mouseover(event);\n };\n p.onmouseout=function(event) {\n"none";\n if (this.className!="floatingPanel");\n if (this.saved.mouseout) return this.saved.mouseout(event);\n };\n p.ondblclick=function(event) {\n if (!config.macros.moveablePanel.maximizePanel(this,event)) return false; // processed\n return this.saved.dblclick?this.saved.dblclick(event):true;\n };\n p.onmousemove=function(event) { return config.macros.moveablePanel.setCursorPanel(this,event); };\n p.onmousedown=function(event) { return config.macros.moveablePanel.moveOrSizePanel(this,event); };\n if (p.className=="floatingPanel" && p.button) // floating slider panel\n p.button.onmouseover=null; // prevent automatic trigger of adjustSliderPos() when mouseover on floating slider button\n },\n\n getPanel:\n function(place) {\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode; if (p) return p; // floatingPanel\n p=story.findContainingTiddler(place); if (!p || !store.getTiddler(p.getAttribute("tiddler"))) return null; // not in a tiddler\n\n // moveable **tiddlers** in IE have LOTS of problems... DISABLED FOR NOW... but floating panels still work in IE\n if (config.browser.isIE) return null;\n\n // tiddlers tagged (e.g. with "moveable") to allow movement? use null or "" to bypass tag check\n var tag="moveable"; if (!tag || !tag.trim().length) return p;\n return (store.getTiddler(p.getAttribute("tiddler")).tags.find(tag)!=null)?p:null; // tiddler is tagged for moving\n },\n\n processed:\n function(event) {\n event.cancelBubble=true; if (event.stopPropagation) event.stopPropagation(); return false;\n },\n\n getClientWidth:\n function() {\n if(document.width!=undefined) return document.width;\n if(document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth;\n if(document.body && document.body.clientWidth) return document.body.clientWidth;\n if(window.innerWidth!=undefined) return window.innerWidth;\n return 100; // should never get here\n },\n\n closePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (p.hover) this.hoverPanel(p.hoverButton,event); \n if (p.folded) this.foldPanel(p.foldButton,event); \n p.maxed=false; \n;\n;\n;\n;\n;\n if (p.button) { p.button.focus(); onClickNestedSlider({target:p.button}); } // click on slider "button" (if any) to close the panel\n return this.processed(event);\n },\n\n foldPanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (!p.foldButton) p.foldButton=place;\n if (p.folded) {\n;\n;\n } else {\n;"1em"; \n;"hidden";\n }\n p.folded=!p.folded;\n place.innerHTML=p.folded?"unfold":"fold";\n place.title=p.folded?"restore panel size":"reduce panel size";\n return this.processed(event);\n },\n\n hoverPanel:\n function(place,event) {\n if (config.browser.isIE) { return this.processed(event); } // 'fixed' position is not handled properly by IE :-(\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (!p.hoverButton) p.hoverButton=place;\n if (p.hover)\n;\n else\n {;"fixed"; }\n p.hover=!p.hover;\n place.innerHTML=p.hover?"scroll":"hover";\n place.title=p.hover?"make panel move with page when scrolling":"keep panel in view when scrolling page";\n return this.processed(event);\n },\n\n maximizePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight))\n return true; // not near an edge... let double click bubble through\n if (p.folded) this.foldPanel(p.foldButton,event); // unfold panel first (if needed)\n if (p.maxed) {\n;\n;\n;\n;\n;\n } else {\n;\n;\n;\n;\n;\n // IE gets the percentage stretch wrong if floating panel is inside a table\n*0.95+"px"):"95%";\n"95%";\n'1em';\n"absolute";\n }\n p.maxed=!p.maxed;\n return this.processed(event);\n },\n\n setCursorPanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight))\n {"auto"; if (!p.savedtitle) p.savedtitle=p.title; p.title=""; }\n else {\n!event.shiftKey?"move":((isTop?'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');\n if (p.savedtitle) p.title=p.savedtitle;\n }\n return true; // let mouseover event bubble through\n },\n\n moveOrSizePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight)) return true; // not near an edge... let mousedown bubble through\n \n // when resizing, change cursor to show directional (NSEW) "drag arrows"\n var sizing=event.shiftKey; // remember this for use during mousemove tracking\n if (sizing)'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');\n \n var adjustLeft=0; var adjustTop=0;\n var pp=p.parentNode; while (pp &&!='relative') pp=parent.parentNode;\n if (pp) { adjustLeft+=findPosX(pp); adjustTop+=findPosY(pp); }\n var pp=p.parentNode; while (pp && pp.className!="floatingPanel") pp=pp.parentNode;\n if (pp) { adjustLeft+=findPosX(pp); adjustTop+=findPosY(pp); }\n \n // start tracking mousemove events\n config.macros.moveablePanel.activepanel=p;\n var target=p; // if 'capture' handling not supported, track within panel only\n if (document.body.setCapture) { document.body.setCapture(); var target=document.body; } // IE\n if (window.captureEvents) { window.captureEvents(Event.MouseMove|Event.MouseUp,true); var target=window; } // moz\n if (target.onmousemove!=undefined) target.saved_mousemove=target.onmousemove;\n target.onmousemove=function(e){\n if (!e) var e=window.event;\n var p=config.macros.moveablePanel.activepanel;\n if (!p) { this.onmousemove=this.saved_mousemove?this.saved_mousemove:null; return; }\n \n // PROBLEM: p.offsetWidth and p.offsetHeight do not seem to account for padding or borders\n // WORKAROUND: subtract padding and border (in px) when calculating new panel width and height\n // TBD: get these values from convert to px as needed.\n var paddingWidth=10.6667; var paddingHeight=10.6667;\n var borderWidth=1; var borderHeight=1;\n var adjustWidth=-(paddingWidth*2+borderWidth*2);\n var adjustHeight=-(paddingHeight*2+borderHeight*2);\n \n if (!="absolute") { // convert relative DIV to movable absolute DIV\n"absolute";\n"px";"px";\n"px";"px";\n }\n var newX=!config.browser.isIE?e.pageX:e.clientX;\n var newY=!config.browser.isIE?e.pageY:e.clientY;\n if (sizing) { // resize panel\n // don't let panel get smaller than edge "grab" zones\n var minWidth=edgeWidth*2-adjustWidth;\n var minHeight=edgeHeight*2-adjustHeight;\n p.maxed=false; // make sure panel is not maximized\n if (p.folded) this.foldPanel(p.foldButton,e); // make sure panel is unfolded\n if (isBottom) var newHeight=height+newY-y+1;\n if (isTop) var newHeight=height-newY+y+1;\n if (isLeft) var newWidth=width-newX+x+1;\n if (isRight) var newWidth=width+newX-x+1;\n if (isLeft||isRight)>minWidth?newWidth:minWidth)+adjustWidth+"px";\n if (isLeft)"px";\n if (isTop||isBottom)>minHeight?newHeight:minHeight)+adjustHeight+"px";\n if (isTop)"px";\n } else { // move panel\n"px";\n"px";\n }\n var status=sizing?("size: "",""pos: "",";\n window.status=status.replace(/(\s.[0-9]+)|px/g,""); // remove decimals and "px"\n return config.macros.moveablePanel.processed(e);\n };\n \n // stop tracking mousemove events\n if (target.onmouseup!=undefined) target.saved_mouseup=target.onmouseup;\n target.onmouseup=function(e){\n if (!e) var e=window.event;\n if (this.releaseCapture) this.releaseCapture(); // IE\n if (this.releaseEvents) this.releaseEvents(Event.MouseMove|Event.MouseUp); // moz\n this.onmousemove=this.saved_mousemove?this.saved_mousemove:null;\n this.onmouseup=this.saved_mouseup?this.saved_mouseup:null;\n config.macros.moveablePanel.activepanel=null;\n window.status="";\n return config.macros.moveablePanel.processed(e);\n };\n return this.processed(event); // mousedown handled\n }\n};\n//}}}
/***\n| Name|MptwLayoutPlugin|\n| Description|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|\n| Version|3.0 ($Rev: 1845 $)|\n| Source||\n| Author|Simon Baird <>|\n| License||\n!Notes\nPresumes you have TagglyTaggingPlugin installed. To enable this you should have a PageTemplate containing {{{[[MptwPageTemplate]]}}} and similar for ViewTemplate and EditTemplate.\n***/\n//{{{\n// used in MptwViewTemplate\nconfig.mptwDateFormat = 'DD/MM/YY';\nconfig.mptwJournalFormat = 'Journal DD/MM/YY';\n//config.mptwDateFormat = 'MM/0DD/YY';\n//config.mptwJournalFormat = 'Journal MM/0DD/YY';\n\nconfig.shadowTiddlers.GettingStarted += "\sn\snSee also MonkeyPirateTiddlyWiki.";\n\n//}}}\n\n//{{{\nmerge(config.shadowTiddlers,{\n\n'MptwEditTemplate':[\n "<!--{{{-->",\n "<!--- ($Rev: 1829 $) --->",\n "<div class=\s"toolbar\s" macro=\s"toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler\s"></div>",\n "<div class=\s"title\s" macro=\s"view title\s"></div>",\n "<div class=\s"editLabel\s">Title</div><div class=\s"editor\s" macro=\s"edit title\s"></div>",\n "<div class=\s"editLabel\s">Tags</div><div class=\s"editor\s" macro=\s"edit tags\s"></div>",\n "<div class=\s"editorFooter\s"><span macro=\s"message views.editor.tagPrompt\s"></span><span macro=\s"tagChooser\s"></span></div>",\n "<div macro=\s"showWhenExists EditPanelTemplate\s">[[EditPanelTemplate]]</div>",\n "<div class=\s"editor\s" macro=\s"edit text\s"></div>",\n "<!--}}}-->"\n].join("\sn"),\n\n'MptwPageTemplate':[\n "<!--{{{-->",\n "<!-- ($Rev: 1829 $) -->",\n "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",\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 "<!-- horizontal MainMenu -->",\n "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",\n "<!-- original MainMenu menu -->",\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 "<!--}}}-->"\n].join("\sn"),\n\n'MptwStyleSheet':[\n "/*{{{*/",\n "/* ($Rev: 1860 $) */",\n "",\n "/* a contrasting background so I can see where one tiddler ends and the other begins */",\n "body {",\n " background: [[ColorPalette::TertiaryLight]];",\n "}",\n "",\n "/* sexy colours and font for the header */",\n ".headerForeground {",\n " color: [[ColorPalette::PrimaryPale]];",\n "}",\n ".headerShadow, .headerShadow a {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* separate the top menu parts */",\n ".headerForeground, .headerShadow {",\n " padding: 1em 1em 0;",\n "}",\n "",\n ".headerForeground, .headerShadow {",\n " font-family: 'Trebuchet MS' sans-serif;",\n " font-weight:bold;",\n "}",\n ".headerForeground .siteSubtitle {",\n " color: [[ColorPalette::PrimaryLight]];",\n "}",\n ".headerShadow .siteSubtitle {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* make shadow go and down right instead of up and left */",\n ".headerShadow {",\n " left: 1px;",\n " top: 1px;",\n "}",\n "",\n "/* prefer monospace for editing */",\n ".editor textarea {",\n " font-family: 'Consolas' monospace;",\n "}",\n "",\n "/* sexy tiddler titles */",\n ".title {",\n " font-size: 250%;",\n " color: [[ColorPalette::PrimaryLight]];",\n " font-family: 'Trebuchet MS' sans-serif;",\n "}",\n "",\n "/* more subtle tiddler subtitle */",\n ".subtitle {",\n " padding:0px;",\n " margin:0px;",\n " padding-left:0.5em;",\n " font-size: 90%;",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n ".subtitle .tiddlyLink {",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n "",\n "/* a little bit of extra whitespace */",\n ".viewer {",\n " padding-bottom:3px;",\n "}",\n "",\n "/* don't want any background color for headings */",\n "h1,h2,h3,h4,h5,h6 {",\n " background: [[ColorPalette::Background]];",\n " color: [[ColorPalette::Foreground]];",\n "}",\n "",\n "/* give tiddlers 3d style border and explicit background */",\n ".tiddler {",\n " background: [[ColorPalette::Background]];",\n " border-right: 2px [[ColorPalette::TertiaryMid]] solid;",\n " border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",\n " margin-bottom: 1em;",\n " padding-bottom: 2em;",\n "}",\n "",\n "/* make options slider look nicer */",\n "#sidebarOptions .sliderPanel {",\n " border:solid 1px [[ColorPalette::PrimaryLight]];",\n "}",\n "",\n "/* the borders look wrong with the body background */",\n "#sidebar .button {",\n " border-style: none;",\n "}",\n "",\n "/* this means you can put line breaks in SidebarOptions for readability */",\n "#sidebarOptions br {",\n " display:none;",\n "}",\n "/* undo the above in OptionsPanel */",\n "#sidebarOptions .sliderPanel br {",\n " display:inline;",\n "}",\n "",\n "/* horizontal main menu stuff */",\n "#displayArea {",\n " margin: 1em 15.7em 0em 1em; /* use the freed up space */",\n "}",\n "#topMenu br {",\n " display: none;",\n "}",\n "#topMenu {",\n " background: [[ColorPalette::PrimaryMid]];",\n " color:[[ColorPalette::PrimaryPale]];",\n "}",\n "#topMenu {",\n " padding:2px;",\n "}",\n "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",\n " margin-left: 0.5em;",\n " margin-right: 0.5em;",\n " padding-left: 3px;",\n " padding-right: 3px;",\n " color: [[ColorPalette::PrimaryPale]];",\n " font-size: 115%;",\n "}",\n "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",\n " background: [[ColorPalette::PrimaryDark]];",\n "}",\n "",\n "/* for Tagger Plugin, thanks sb56637 */",\n ".popup li a {",\n " display:inline;",\n "}",\n "",\n "/* make it print a little cleaner */",\n "@media print {",\n " #topMenu {",\n " display: none ! important;",\n " }",\n " /* not sure if we need all the importants */",\n " .tiddler {",\n " border-style: none ! important;",\n " margin:0px ! important;",\n " padding:0px ! important;",\n " padding-bottom:2em ! important;",\n " }",\n " .tagglyTagging .button, .tagglyTagging .hidebutton {",\n " display: none ! important;",\n " }",\n " .headerShadow {",\n " visibility: hidden ! important;",\n " }",\n " .tagglyTagged .quickopentag, .tagged .quickopentag {",\n " border-style: none ! important;",\n " }",\n " .quickopentag a.button, .miniTag {",\n " display: none ! important;",\n " }",\n "}",\n "/*}}}*/"\n].join("\sn"),\n\n'MptwViewTemplate':[\n "<!--{{{-->",\n "<!--- ($Rev: 1830 $) --->",\n "",\n "<div class='toolbar'>",\n " <span macro=\s"showWhenTagged systemConfig\s">",\n " <span macro=\s"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\s"></span>",\n " </span>",\n " <span style=\s"padding:1em;\s"></span>",\n " <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump'></span>",\n " <span macro='newHere label:\s"new here\s"'></span>",\n " <span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:\s"MM/0DD/YY\s"}}'></span>",\n "</div>",\n "",\n "<div class=\s"tagglyTagged\s" macro=\s"tags\s"></div>",\n "",\n "<div class='titleContainer'>",\n " <span class='title' macro='view title'></span>",\n " <span macro=\s"miniTag\s"></span>",\n "</div>",\n "",\n "<div class='subtitle'>",\n " <span macro='view modifier link'></span>,",\n " <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:\s"MM/0DD/YY\s"}}'></span>",\n " (<span macro='message views.wikified.createdPrompt'></span>",\n " <span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:\s"MM/0DD/YY\s"}}'></span>)",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewPanelTemplate\s">[[ViewPanelTemplate]]</div>",\n "",\n "<div macro=\s"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer' macro='view text wikified'></div>",\n "</div>",\n "<div macro=\s"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer'><pre macro='view text'></pre></div>",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewDashboardTemplate\s">[[ViewDashboardTemplate]]</div>",\n "",\n "<div class=\s"tagglyTagging\s" macro=\s"tagglyTagging\s"></div>",\n "",\n "<!--}}}-->"\n].join("\sn")\n\n});\n//}}}\n
For upgrading directly from tiddlyspot. See [[ImportTiddlers]].\nURL: /proxy/\n
For upgrading. See [[ImportTiddlers]].\nURL:\n
/***\n|Name|NestedSlidersPlugin|\n|Source||\n|Version|2.0.4|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Slider.prototype.stop|\n|Description|Make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content.|\n\n++++!!!!![Configuration]>\nEnable animation for slider panels\n<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing\n>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:\n><<option chkAnimate>> enable animations (entire document)\n>For slider animation to occur, you must also allow animation in general.\n\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. You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nAdditional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*mouse auto rollover\n*custom class/label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{^width^}}} (or just {{{^}}})^^\nmakes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)^^\n* {{{*}}}^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{{{class{[label=key|tooltip]}}}}}}^^\nuses custom label/tooltip/accesskey. {{{{{class{...}}}}}}, {{{=key}}} and {{{|tooltip}}} are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n===\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel. This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page. (thanks to Harsha for bug report)\n''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)\n''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function\n|please see [[NestedSlidersPluginHistory]] for additional revision details|\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 2, minor: 0, revision: 4, date: new Date(2007,5,31)};\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;\nif (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(?:\s\s{\s\s{([\s\sw]+[\s\ss\s\sw]*)\s\s{)?(\s\s[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n // defopen=lookaheadMatch[1]\n // cookiename=lookaheadMatch[2]\n // header=lookaheadMatch[3]\n // panelwidth=lookaheadMatch[4]\n // rollover=lookaheadMatch[5]\n // class=lookaheadMatch[6]\n // label=lookaheadMatch[7]\n // blockquote=lookaheadMatch[8]\n // deferred=lookaheadMatch[9]\n\n lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey\n var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // parse custom label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n title = lookaheadMatch[7].trim().slice(1,-1);\n var pos=title.indexOf("|");\n if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }\n if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }\n if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);\n\n // set extra button attributes\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n\n // "non-click" MouseOver opens/closes slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n // otherwise, mouseover aligns floater position with button\n else btn.onmouseover=function(event)\n { window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):""; // save requested panel size\n btn.sliderPanel=panel;\n = show;\n;\n panel.onmouseover=function(event) // mouseover aligns floater position with button\n { window.adjustSliderPos(this.parentNode,this.button,this,this.className); }\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[9]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[8]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align floater position with button\n window.adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[8]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel =;\n var theSlider = theTarget.sliderPanel\n var isOpen =!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") = "<";\n else if (theLabel=="<") = ">";\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 && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n = isOpen ? "none" : "block";\n // reset to default width (might have been changed via plugin code)\n;\n // align floater panel position with target button\n if (!isOpen) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n // if showing panel, set focus to first 'focus-able' element in panel\n if (!="none") {\n var ctrls=theSlider.getElementsByTagName("*");\n for (var c=0; c<ctrls.length; c++) {\n var t=ctrls[c].tagName.toLowerCase();\n if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length) {\n config.options[this.sliderCookie]=!isOpen;\n if (config.options[this.sliderCookie]!=this.defOpen)\n saveOptionCookie(this.sliderCookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = this.sliderCookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n\n// TW2.1 and earlier:\n// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n { this.coreStop.apply(this,arguments); = "visible"; }\n\n// TW2.2+\n// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed\nif (version.major+.1*version.minor+.01*version.revision>=2.2) {\n Morpher.prototype.coreStop = Morpher.prototype.stop;\n Morpher.prototype.stop = function()\n { this.coreStop.apply(this,arguments); = "visible"; }\n}\n\n// adjust floating panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (!="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-15;\n"px";"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|Name|NestedSlidersPluginHistory|\n|Source||\n|Version|2.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|history|\n|Requires||\n|Overrides||\n|Description|Archived Revision History for NestedSlidersPlugin|\n\n!!!!!Archived Revision History for NestedSlidersPlugin\n<<<\n| Please see [[NestedSlidersPlugin]] for more recent revision details |\n''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}\n''2006.07.25 - 1.9.3'' when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it. Significantly reduces the 'cookie overhead' when default slider states are used.\n''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"\n''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value\n''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label\n''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element\n''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position\n''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)\n''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox crash bug when assigning to globals\n''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.\n''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.\n''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state\n''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin\n''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used. code cleanup, added documentation\n''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}. changed name to EasySlidersPlugin\n''2005.11.03 - 1.0.0'' initial public release\n<<<
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal macros|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:||\n| Author:|Simon Baird <>|\n| License||\n***/\n//{{{\nmerge(config.macros, {\n newHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n newJournalHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n }\n});\n\n//}}}\n\n
/%\n|Name|NextTiddler|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|insert a link that, when clicked, closes the current tiddler and opens another one in its place|\n\nusage: <<tiddler NextTiddler with: NewTiddlerTitle linktext>>\n\n%/<script label="$2">\n var tiddler=story.findContainingTiddler(place);\n story.displayTiddler(tiddler,"$1");\n story.closeTiddler(; // close self\n return false;\n</script>
/%\n|Name|OpenMostRecentTiddler|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|goto the most recently modified tiddler|\n%/<script label="last change">\n var tids=store.getTiddlers("modified","excludeLists").reverse();\n story.displayTiddler(null,tids[0].title);\n story.refreshTiddler(tids[0],null,true)\n</script><script>\n place.lastChild.title="goto the most recently modified tiddler";\n</script>
/%\n|Name|OpenTiddlers|\n|Source||\n|Version|0.0.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|script|\n|Requires|InlineJavascriptPlugin|\n|Overrides||\n|Description|open multiple tiddlers with a single click|\n\nUsage: <<tiddler OpenTiddlers with: "label with space" "tiddler tiddler [[tiddler with spaces]] tiddler..." template>>\n(template is optional and defaults to ViewTemplate)\n\n%/<script label="$1"> var tidlist="$2"; if ("$3"!="$"+"3") var template="$3";\n story.displayTiddlers(story.findContainingTiddler(place),tidlist.readBracketedList(),template);\n</script>
!Introduction\nHere you will find other developer tool articles that cover other tools besides the integrated developer environment tools.\n\n!Articles\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Tools")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \n>>\n
PersonalJava came after JavaOS and was Sun Microsystems 3rd attempt at java in Consumer Electronics devices. PersonalJava was often shorten to the term pJava.\n\nPersonalJava(pJava) is a subset of 1.1.x Java. Some additional APIs come the from mobile JavaTelephonyAPI and the extension is called JavaPhone. Although PersonalJava was originally a stand alone API for mobile devices, it now can be found in the PersonalProfile of JavaME CennectedDeviceConfiguration(CDC).\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
/***\n|Name|PlayerPlugin|\n|Source||\n|Version|1.1.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Embed 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'', ''flash'', ''image'' or ''iframe''. If the media type is not specified, the plugin automatically detects Windows, Real, QuickTime, Flash video or JPG/GIF images by matching known file extensions and/or specialized streaming-media transfer protocols (such as RTSP:). For unrecognized media types, the plugin displays an error message.\n\n''If you use [[AttachFilePlugin]] to encode and store a media file within your document, you can play embedded media content by using the title of the //attachment tiddler//'' as a parameter in place of the usual reference to an external URL. When playing an attached media content, you should always explicitly specify the media type parameter, because the name used for the attachment tiddler may not contain a known file extension from which a default media type can be readily determined.\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>>}}}\n<<player id=1>>\n===\n+++[RealOne]...\nBBC London: Live and Recorded news\n{{{<<player id=2>>}}}\n<<player id=2>>\n===\n+++[Quicktime]...\nAmerica Free TV: Classic Comedy\n{{{<<player id=3>>}}}\n<<player id=3>>\n===\n+++[Flash]...\nAsteroids arcade game\n{{{<<player id=4 400 300>>}}}\n<<player id=4 400 300>>\nGoogle Video\n{{{<<player id=5 flash 400 326>>}}}\n<<player id=5 flash 400 326>>\nYouTube Video\n{{{<<player id=6 flash 400 300>>}}}\n<<player id=6 flash 400 300>>\n===\n+++[Still Images]...\nGIF (best for illustrations, animations, diagrams, etc.)\n{{{<<player id=7 image images/meow.gif auto auto>>}}}\n<<player id=7 image images/meow.gif auto auto>>\nJPG (best for photographs, scanned images, etc.)\n{{{<<player id=8 image images/meow2.jpg 200 150>>}}}\n<<player id=8 image images/meow2.jpg 200 150>>\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''2007.05.22 [1.1.0]'' added support for type=="iframe" (displays src URL in an IFRAME)\n''2006.12.06 [1.0.1]'' in handler(), corrected check for config.macros.attach (instead of config.macros.attach.getAttachment) so that player plugin will work when AttachFilePlugin is NOT installed. (Thanks to Phillip Ehses for bug report)\n''2006.11.30 [1.0.0]'' support embedded media content using getAttachment() API defined by AttachFilePlugin or AttachFilePluginFormatters. Also added support for 'image' type to render JPG/GIF still images\n''2006.02.26 [0.7.0]'' major 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]'' added support for 'extra' macro params to pass through to object parameters\n''2006.01.19 [0.5.0]'' Initial ALPHA release\n''2005.12.23 [0.0.0]'' Started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]].\n<<<\n!!!!!Code\n***/\n\n// // macro definition\n\n//{{{\nversion.extensions.player = {major: 1, minor: 1, revision: 0, date: new Date(2007,5,22)};\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")||(params[0]=="image")||(params[0]=="iframe"))\n type=params.shift();\n var url=params.shift(); if (!url || !url.trim().length) url="";\n if (url.length && config.macros.attach!=undefined) // if AttachFilePlugin is installed\n if ((tid=store.getTiddler(url))!=null && tid.isTagged("attachment")) // if URL is attachment tiddler title\n url=config.macros.attach.getAttachment(url); // replace TiddlerTitle with attachment-expanded 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)) { // determine type from URL\n u=url.toLowerCase();\n if ((u.indexOf('mms')!=-1)||(u.indexOf('.asx')!=-1)||(u.indexOf('.wvx')!=-1)||(u.indexOf('.wmv')!=-1)||(u.indexOf('.mp3')!=-1))\n var type="windows";\n else if ((u.indexOf('rtsp')!=-1)||(u.indexOf('.ram')!=-1)||(u.indexOf('.rpm')!=-1)||(u.indexOf('.rm' )!=-1)||(u.indexOf('.ra' )!=-1))\n var type="realone";\n else if ((u.indexOf('.mov')!=-1)||(u.indexOf('.qt' )!=-1))\n var type="quicktime";\n else if ((u.indexOf('.swf')!=-1)||(u.indexOf('.flv')!=-1))\n var type="flash";\n else if ((u.indexOf('.jpg')!=-1)||(u.indexOf('.gif')!=-1))\n var type="image";\n else if ((u.indexOf('.htm')!=-1)||(u.indexOf('.html')!=-1))\n var type="iframe";\n }\n if (!type || !config.macros.player.html[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 if (type=="image") show=show?"block":"none";\n if (type=="iframe") show=show?"block":"none";\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// JPG/GIF still images\nconfig.macros.player.html.image='\s\n <img width="%w%" height="%h%" style="display:%s%;" src="%u%">';\n//}}}\n\n//{{{\n// IFRAME web page viewer\nconfig.macros.player.html.iframe='\s\n <iframe id="%i%" width="%w%" height="%h%" style="display:%s%;" src="%u%"></iframe>';\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\' \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=",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="" \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=""> \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=""> \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=",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="" \s\n type="application/x-shockwave-flash" scale="exactfit"> \s\n </embed> \s\n </object>';\n//}}}
/***\n|Name|Plugin: Scientific Notation|\n|Created by|BobMcElrath|\n|Email|my first name at my last name dot org|\n|Location||\n|Version|1.0|\n|Requires|[[TiddlyWiki|]] &ge; 2.0.3, [[jsMath|]] &ge; 3.0, [[Plugin: jsMath]]|\n!Description\nThis plugin will render numbers expressed in scientific notation, such as {{{3.5483e12}}} using the jsMath plugin to display it in an intuitive way such as 3.5483e12. You may customize the number of significant figures displayed, as well as "normalize" numbers so that {{{47392.387e9}}} is displayed as 47392.387e9.\n!Installation\nInstall the Requirements, above, add this tiddler to your tiddlywiki, and give it the {{{systemConfig}}} tag.\n!History\n* 1-Feb-06, version 1.0, Initial release\n!Code\n***/\n//{{{\nconfig.formatters.push({\n name: "scientificNotation",\n match: "\s\sb[0-9]+\s\s.[0-9]+[eE][+-]?[0-9]+\s\sb",\n element: "span",\n className: "math",\n normalize: true, // set to 'true' to convert numbers to X.XXX \stimes 10^{y}\n sigfigs: 3, // with this many digits in the mantissa\n handler: function(w) {\n var snRegExp = new RegExp("\s\sb([0-9]+(?:\s\s.[0-9]+)?)[eE]([-0-9+]+)\s\sb");\n var mymatch = snRegExp.exec(w.matchText);\n var mantissa = mymatch[1];\n var exponent = parseInt(mymatch[2]);\n // normalize the number.\n if(this.normalize) {\n mantissa = parseFloat(mantissa);\n while(mantissa > 10.0) {\n mantissa = mantissa / 10.0;\n exponent++; \n }\n while(mantissa < 1.0) {\n mantissa = mantissa * 10.0;\n exponent--;\n }\n var sigfigsleft = this.sigfigs;\n mantissa = parseInt(mantissa) + "." + (Math.round(Math.pow(10,this.sigfigs-1)*mantissa)+"").substr(1,this.sigfigs-1);\n }\n var e = document.createElement(this.element);\n e.className = this.className;\n if(exponent == 0) {\n e.appendChild(document.createTextNode(mantissa));\n } else {\n e.appendChild(document.createTextNode(mantissa + "\s\stimes 10^{" + exponent + "}"));\n }\n w.output.appendChild(e);\n }\n});\n//}}}
/***\n|''Name:''|Plugin: Syntaxify|\n|''Description:''|Performs syntax highlighting on CSS, JavaScript, and HTML/XML|\n|''Version:''|1.2|\n|''Date:''|January 29, 2007|\n|''Source:''||\n|''Author:''|BobMcElrath|\n|''Email:''|my first name at my last name dot org|\n|''License:''|[[GPL open source license|]]|\n|''~CoreVersion:''|2.0.0|\n!Description\nThis plugin will syntax highlight ("pretty-print") source code used by TiddlyWiki. To activate CSS markup, enclose the code in the CSS code in the delimiters \n<html><code>\n/&#42;{{{&#42;/<br/>\n/&#42; CSS code here &#42/<br/>\n/&#42;}}}&#42;/<br/>\n</code></html>\nTo activate XML markup, enclose your HTML/XML in the delimiters\n<html><code>\n&lt;!--{{{--&gt;<br/>\n&lt;!-- XML/HTML code here --&gt;<br/>\n&lt;!--}}}--&gt;<br/>\n</code></html>\nAnd to activate JavaScript markup, enclose your code in the delimiters\n<html><code>\n//{{{<br/>\n// JavaScript code here.<br/>\n//}}}<br/>\n</code></html>\n\nIn addition, all of the above languages can be syntaxified by using the custom class formatter\n<html><code>\n{{foo{<br/>\n code for language "foo" here<br/>\n}}}<br/>\n</code></html>\nwhere {{{foo}}} is the name of the language: {{{css}}}, {{{javascript}}}, or {{{xml}}}. This plugin can be extended with new languages by creating a data structure like those below (in {{{syntaxify.languages}}} and then calling {{{syntaxify.addLanguages}}}.\n!History\n* 1.2 Release\n** Now syntaxifies in-line style code (thanks [[Conal Elliott|]]).\n** Fix multi-line comments in CSS.\n** Consolidate customClassesHelper and monospacedByLineHelper which had lots of duplicated code.\n** Fix autoLinkWikiWords bug when using custom classes and the tag formatter.\n** Fix compatibility problems between 2.1 and 2.0 (termRegExp vs. terminator)\n* 1.1 Release\n** Rewrite things to make it easier to add new languages.\n** Override customClasses to syntaxify when the class corresponds to a known language.\n** TiddlyWiki 2.1 beta compatibility\n* 1.0.2 Release\n** Don't use {{{class}}} as a variable name, dummy.\n* 1.0.1 Release\n** Simplified stylesheet and removed line numbering.\n** Fixed highlighting when <html><code>&#42;/</code></html> appeared at the beginning of a line.\n** Fixed blank lines not being shown if {{{list-style-type: none}}} was turned on.\n** Small speedups\n* 1.0.0 Initial Release\n!Code\n***/\n//{{{\nversion.extensions.Syntaxify = { major: 1, minor: 2, revision: 0, date: new Date("2007","01","29"),\n source: ""\n};\n\nvar syntaxify = {};\n\nsyntaxify.regexpSpace = new RegExp(" ", "mg");\nsyntaxify.regexpTab = new RegExp("\st", "mg");\nsyntaxify.regexpAmp = new RegExp("&","mg");\nsyntaxify.regexpLessThan = new RegExp("<","mg");\nsyntaxify.regexpGreaterThan = new RegExp(">","mg");\nsyntaxify.regexpQuote = new RegExp("\s"","mg");\nsyntaxify.regexpDoubleQuotedString = new RegExp("\s"(?:\s\s\s\s.|[^\s\s\s\s\s"])*?\s"", "mg");\nsyntaxify.regexpSingleQuotedString = new RegExp("'(?:\s\s\s\s.|[^\s\s\s\s'])*?'", "mg");\nsyntaxify.regexpCSingleLineComment = new RegExp('//.*$', "g");\nsyntaxify.regexpCMultiLineComment \n = new RegExp('/\s\s*(?:(?:.|(?:\s\sr)?\s\sn)(?!\s\s*/))*(?:.|(?:\s\sr)?\s\sn)?\s\s*/',"mg");\nString.prototype.htmlListMono = function() {\n return(this.replace(syntaxify.regexpAmp,"&amp;")\n .replace(syntaxify.regexpLessThan,"&lt;")\n .replace(syntaxify.regexpGreaterThan,"&gt;")\n .replace(syntaxify.regexpQuote,"&quot;")\n .replace(syntaxify.regexpSpace,"&nbsp;")\n .replace(syntaxify.regexpTab,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"));\n}\n\nsyntaxify.handleSpanClass = function(w) {\n var match, lastPos=0;\n if(this.lookahead) {\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 createTiddlyText(w.output, lookaheadMatch[1]);\n var e = createTiddlyElement(w.output, "span", null,;\n e.innerHTML = this.hasSpaces?lookaheadMatch[2].htmlListMono():lookaheadMatch[2];\n }\n } else {\n while((match = regexpNewLine.exec(w.matchText)) != null) { // multi-line\n var alt = "";\n var e = createTiddlyElement(w.output, "span", null,;\n e.innerHTML = this.hasSpaces?w.matchText.substr(lastPos,match.index-lastPos).htmlListMono()\n :w.matchText.substr(lastPos,match.index-lastPos);\n if(w.output.className != "alt") alt = "alt";\n w.output = createTiddlyElement(w.output.parentNode, "li", null, alt);\n lastPos = match.index;\n } \n var e = createTiddlyElement(w.output, "span", null,;\n e.innerHTML = this.hasSpaces?w.matchText.substr(lastPos, w.matchText.length-lastPos).htmlListMono()\n :w.matchText.substr(lastPos, w.matchText.length-lastPos)\n }\n}\n\n/* This is a shadow tiddler. Do not edit it here. Instead, open the tiddler StyleSheetSyntaxify \n * and edit it instead. (go to the toolbar on the right and select "More"->"Shadowed") */\nconfig.shadowTiddlers.StyleSheetSyntaxify = "/*{{{*/\sn"\n+".viewer .syntaxify {\sn"\n+" font-family: monospace;\sn"\n+"}\sn"\n+".viewer div.syntaxify {\sn"\n+" background-color: #ffc;\sn"\n+" border: 1px solid #fe8;\sn"\n+" padding: 0.5em;\sn"\n+" margin: 0 0 1em 0.5em;\sn"\n+" font-size: 1.2em;\sn"\n+" overflow: auto;\sn"\n+"}\sn\sn"\n+".syntaxify ol {\sn"\n+" margin: 0;\sn"\n+" padding: 1px;\sn"\n+" color: #2B91AF;\sn"\n+"}\sn\sn"\n+".syntaxify ol li {\sn"\n+" background-color: #ffc;\sn"\n+" color: black;\sn"\n+" list-style-type: none;\sn"\n+"/* An alternate style to enable line numbering -- remove the line above and uncomment below if desired */\sn"\n+"/*\sn"\n+" list-style-type: 1;\sn"\n+" border-left: 3px solid #fe8;\sn"\n+" margin-left: 3.5em;\sn"\n+"*/\sn"\n+"}\sn\sn"\n+"/* To disable alternating lines having a different colors, comment out the following line. */\sn"\n+".syntaxify ol li.alt { background-color: #ffe; }\sn\sn"\n+".syntaxify ol li span { color: black; }\sn"\n+".syntaxify .singleLineComments { color: green; }\sn"\n+".syntaxify .multiLineComments { color: green; }\sn"\n+".syntaxify .multiLineComments1 { color: red; }\sn"\n+".syntaxify .tag { font-weight: bold; color: blue; }\sn"\n+".syntaxify .tagname { font-weight: bold; color: black; }\sn"\n+".syntaxify .attribute { color: rgb(127,0,85); }\sn"\n+".syntaxify .value { color: rgb(42,0,255); }\sn"\n+".syntaxify .keywords { color: #006699; }\sn"\n+".syntaxify .keywords1 { color: red; }\sn"\n+".syntaxify .delimiters { color: maroon; }\sn"\n+".syntaxify .delimiters1 { color: olive; }\sn"\n+".syntaxify .literals { color: maroon; }\sn"\n+".syntaxify .literals1 { color: blue; }\sn"\n+".syntaxify .literals2 { color: blue; }\sn"\n+".syntaxify .literals3 { color: #129; }\sn"\n+".syntaxify .identifiers { font-weight: bold; color: blue; }\sn"\n+".syntaxify .identifiers1 { font-weight: bold; color: black; }\sn"\n+"/*}}}*/";\n\nstore.addNotification("StyleSheetSyntaxify",refreshStyles);\nconfig.shadowTiddlers.ViewTemplate = "<!--{{{-->\sn"+config.shadowTiddlers.ViewTemplate+"\sn<!--}}}-->";\nconfig.shadowTiddlers.EditTemplate = "<!--{{{-->\sn"+config.shadowTiddlers.EditTemplate+"\sn<!--}}}-->";\nconfig.shadowTiddlers.PageTemplate = "<!--{{{-->\sn"+config.shadowTiddlers.PageTemplate+"\sn<!--}}}-->";\nconfig.shadowTiddlers.StyleSheetPrint = "/*{{{*/\sn"+config.shadowTiddlers.StyleSheetPrint+"\sn/*}}}*/";\n\nsyntaxify.commonFormatters = [\n{ name: "spaces",\n match: "[ \s\st]+",\n handler: function(w) {\n w.output.innerHTML += w.matchText.htmlListMono();\n }\n},{ name: "newline",\n match: "\s\sn",\n handler: function(w) {\n var alt = ""\n if(w.output.className != "alt") alt = "alt";\n if(!w.output.hasChildNodes()) w.output.innerHTML = "&nbsp;";\n w.output = createTiddlyElement(w.output.parentNode, "li", null, alt);\n }\n}];\n\nsyntaxify.xmlTagFormatters = syntaxify.commonFormatters;\nsyntaxify.xmlTagFormatters = syntaxify.xmlTagFormatters.concat([\n{ name: "tagname",\n match: '<[/\s\s?]?\s\ss*(?:[\s\sw-\s\s.]+)',\n lookahead: '(<[/\s\s?]?\s\ss*)([\s\sw-\s\s.]+)',\n handler: syntaxify.handleSpanClass\n},{\n name: "attribute-value",\n match: '[\s\sw-\s.]+(?:\s\ss*=\s\ss*"[^"]*?"|\s'[^\s']*?\s'|\s\sw+)?',\n lookahead: '([\s\sw-\s.]+)(?:(\s\ss*=\s\ss*)("[^"]*?"|\s'[^\s']*?\s'|\s\sw+))?',\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 var e = createTiddlyElement(w.output, "span", null, "attribute");\n e.innerHTML = lookaheadMatch[1];\n if(lookaheadMatch[2]) {\n var e = createTiddlyElement(w.output, "span");\n e.innerHTML = lookaheadMatch[2].htmlListMono();\n e = createTiddlyElement(w.output, "span", null, "value");\n e.innerHTML = lookaheadMatch[3].htmlListMono();\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length; \n }\n}]);\n\n\n// A rather huge data structure to store languages. Add to it!\nsyntaxify.languages = {\njavascript: {\n singleLineComments: [[syntaxify.regexpCSingleLineComment.source]],\n multiLineComments: [[syntaxify.regexpCMultiLineComment.source]],\n keywords: [['abstract', 'boolean', 'break', 'byte', 'case', 'catch', 'char',\n 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do',\n 'double', 'else', 'enum', 'export', 'extends', 'false', 'final',\n 'finally', 'float', 'for', 'function', 'goto', 'if', 'implements',\n 'import', 'in', 'instanceof', 'int', 'interface', 'long', 'native',\n 'new', 'null', 'package', 'private', 'protected', 'public', 'return',\n 'short', 'static', 'super', 'switch', 'synchronized', 'this', 'throw',\n 'throws', 'transient', 'true', 'try', 'typeof', 'var', 'void',\n 'volatile', 'while', 'with']\n ],\n literals: [\n [syntaxify.regexpSingleQuotedString.source],\n [syntaxify.regexpDoubleQuotedString.source],\n ["\s\sb\s\sd+(?:\s\s.\s\sd+(?:[eE][\s\s+-]\s\sd+)?)?\s\sb"] // Numbers\n ],\n delimiters: [["[\s\s{\s\s}]"],["[\s\s(\s\s)]"],["[\s\s[\s\s]]"]]\n}, \ncss: {\n multiLineComments: [[syntaxify.regexpCMultiLineComment.source]],\n keywords: [\n // Keywords appearing on the LHS of expressions\n ['ascent', 'azimuth', 'background-attachment', 'background-color',\n 'background-image', 'background-position', 'background-repeat',\n 'background', 'baseline', 'bbox', 'border-collapse', 'border-color',\n 'border-spacing', 'border-style', 'border-top', 'border-right',\n 'border-bottom', 'border-left', 'border-top-color',\n 'border-right-color', 'border-bottom-color', 'border-left-color',\n 'border-top-style', 'border-right-style', 'border-bottom-style',\n 'border-left-style', 'border-top-width', 'border-right-width',\n 'border-bottom-width', 'border-left-width', 'border-width', 'border',\n 'bottom', 'cap-height', 'caption-side', 'centerline', 'clear', 'clip',\n 'color', 'content', 'counter-increment', 'counter-reset', 'cue-after',\n 'cue-before', 'cue', 'cursor', 'definition-src', 'descent',\n 'direction', 'display', 'elevation', 'empty-cells', 'float',\n 'font-size-adjust', 'font-family', 'font-size', 'font-stretch',\n 'font-style', 'font-variant', 'font-weight', 'font', 'height', 'left',\n 'letter-spacing', 'line-height', 'list-style-image',\n 'list-style-position', 'list-style-type', 'list-style', 'margin-top',\n 'margin-right', 'margin-bottom', 'margin-left', 'margin',\n 'marker-offset', 'marks', 'mathline', 'max-height', 'max-width',\n 'min-height', 'min-width', 'orphans', 'outline-color',\n 'outline-style', 'outline-width', 'outline', 'overflow', 'padding-top',\n 'padding-right', 'padding-bottom', 'padding-left', 'padding', 'page',\n 'page-break-after', 'page-break-before', 'page-break-inside', 'pause',\n 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'play-during',\n 'position', 'quotes', 'richness', 'right', 'size', 'slope', 'src',\n 'speak-header', 'speak-numeral', 'speak-punctuation', 'speak',\n 'speech-rate', 'stemh', 'stemv', 'stress', 'table-layout',\n 'text-align', 'text-decoration', 'text-indent', 'text-shadow',\n 'text-transform', 'unicode-bidi', 'unicode-range', 'units-per-em',\n 'vertical-align', 'visibility', 'voice-family', 'volume',\n 'white-space', 'widows', 'width', 'widths', 'word-spacing', 'x-height',\n 'z-index'],\n // Treat !important as a different kind of keyword\n ["important"]\n ],\n literals: [\n // Literals appearing on the RHS of expressions\n ['above', 'absolute', 'all', 'always', 'aqua', 'armenian', 'attr',\n 'aural', 'auto', 'avoid', 'baseline', 'behind', 'below',\n 'bidi-override', 'black', 'blink', 'block', 'blue', 'bold', 'bolder',\n 'both', 'bottom', 'braille', 'capitalize', 'caption', 'center',\n 'center-left', 'center-right', 'circle', 'close-quote', 'code',\n 'collapse', 'compact', 'condensed', 'continuous', 'counter',\n 'counters', 'crop', 'cross', 'crosshair', 'cursive', 'dashed',\n 'decimal', 'decimal-leading-zero', 'default', 'digits', 'disc',\n 'dotted', 'double', 'embed', 'embossed', 'e-resize', 'expanded',\n 'extra-condensed', 'extra-expanded', 'fantasy', 'far-left',\n 'far-right', 'fast', 'faster', 'fixed', 'format', 'fuchsia', 'gray',\n 'green', 'groove', 'handheld', 'hebrew', 'help', 'hidden', 'hide',\n 'high', 'higher', 'icon', 'inline-table', 'inline', 'inset', 'inside',\n 'invert', 'italic', 'justify', 'landscape', 'large', 'larger',\n 'left-side', 'left', 'leftwards', 'level', 'lighter', 'lime',\n 'line-through', 'list-item', 'local', 'loud', 'lower-alpha',\n 'lowercase', 'lower-greek', 'lower-latin', 'lower-roman', 'lower',\n 'low', 'ltr', 'marker', 'maroon', 'medium', 'message-box', 'middle',\n 'mix', 'move', 'narrower', 'navy', 'ne-resize', 'no-close-quote',\n 'none', 'no-open-quote', 'no-repeat', 'normal', 'nowrap', 'n-resize',\n 'nw-resize', 'oblique', 'olive', 'once', 'open-quote', 'outset',\n 'outside', 'overline', 'pointer', 'portrait', 'pre', 'print',\n 'projection', 'purple', 'red', 'relative', 'repeat', 'repeat-x',\n 'repeat-y', 'ridge', 'right', 'right-side', 'rightwards', 'rtl',\n 'run-in', 'screen', 'scroll', 'semi-condensed', 'semi-expanded',\n 'separate', 'se-resize', 'show', 'silent', 'silver', 'slower', 'slow',\n 'small', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid',\n 'speech', 'spell-out', 'square', 's-resize', 'static', 'status-bar',\n 'sub', 'super', 'sw-resize', 'table-caption', 'table-cell',\n 'table-column', 'table-column-group', 'table-footer-group',\n 'table-header-group', 'table-row', 'table-row-group', 'teal',\n 'text-bottom', 'text-top', 'thick', 'thin', 'top', 'transparent',\n 'tty', 'tv', 'ultra-condensed', 'ultra-expanded', 'underline',\n 'upper-alpha', 'uppercase', 'upper-latin', 'upper-roman', 'url',\n 'visible', 'wait', 'white', 'wider', 'w-resize', 'x-fast', 'x-high',\n 'x-large', 'x-loud', 'x-low', 'x-slow', 'x-small', 'x-soft',\n 'xx-large', 'xx-small', 'yellow'],\n // Font literals\n ['[mM]ono(?:space)?', '[tT]ahoma', '[vV]erdana', '[aA]rial',\n '[hH]elvetica', '[sS]ans(?:-serif)?', '[sS]erif', '[Cc]ourier'],\n // Measurement literals\n ["\s\sb\s\sd+(?:\s\s.\s\sd+)?(?:em|pt|px|cm|in|pc|mm)\s\sb"],\n // Color literals\n ['(?:\s\s#[a-fA-F0-9]{6}\s\sb|\s\s#[a-fA-F0-9]{3}\s\sb|rgb\s\s(\s\ss*\s\sd+\s\ss*,\s\ss*\s\sd+\s\ss*,\s\ss*\s\sd+\s\ss*\s\s))']\n ],\n identifiers: [["\s\s.[a-zA-Z_]\s\sw*"],["\s\s#[a-zA-Z_]\s\sw*"]],\n delimiters: [["[\s\s{\s\s}]"]]\n}, \nxml: {\n multiLineComments: [\n ["<[^!>]*!--\s\ss*(?:(?:.|(?:\s\sr)?\s\sn)(?!--))*?(?:(?:.|(?:\s\sr)?\s\sn)(?=--))?\s\ss*--[^>]*?>"],\n ['<\s\s!\s\s[[\s\sw\s\ss]*?\s\s[(?:(?:.|(?:\s\sr)?\s\sn)(?!\s\s]\s\s]>))*?(?:(?:.|(?:\s\sr)?\s\sn)(?=\s\s]\s\s]>))?\s\s]\s\s]>']\n ],\n customFormatters: [{\n name: "tag",\n match: "<[/\s\s?]?[^>]*?>",\n handler: function(w) {\n var formatter = new Formatter(syntaxify.xmlTagFormatters);\n var wikifier = new Wikifier(w.matchText, formatter, w.highlightRegExp, w.tiddler);\n wikifier.subWikify(w.output, null);\n }\n }]\n}};\n\nconfig.formatterHelpers.customClassesHelper = function(w) {\n var lookaheadRegExp = (typeof(this.lookaheadRegExp) == "undefined")?(new RegExp(this.lookahead,"mg")):this.lookaheadRegExp;\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source);\n var language = (typeof(this.language) == "undefined")?lookaheadMatch[1]:this.language;\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var isByLine = (typeof(this.byLine) == "undefined")?(lookaheadMatch[2] == "\sn"):this.byLine;\n var p = createTiddlyElement(w.output,isByLine ? "div" : "span",null,language);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if(typeof(syntaxify.formatters[language]) != "undefined") {\n var d = createTiddlyElement(w.output,isByLine?"div":"span",\n null,"syntaxify "+language);\n var formatter = new Formatter(syntaxify.formatters[language]);\n if(typeof(this.termRegExp) == "undefined") {\n var text = lookaheadMatch[1]; \n } else {\n this.termRegExp.lastIndex = w.nextMatch;\n var terminatorMatch = this.termRegExp.exec(w.source);\n var text = w.source.substr(w.nextMatch, terminatorMatch.index-w.nextMatch);\n }\n if(config.browser.isIE) text = text.replace(/\sn/g,"\sr"); \n if (isByLine) {\n var l = createTiddlyElement(d,"ol");\n var li = createTiddlyElement(l,"li");\n var wikifier = new Wikifier(text, formatter, w.highlightRegExp, w.tiddler);\n wikifier.subWikify(li, null);\n if(!l.childNodes[l.childNodes.length-1].hasChildNodes())\n l.removeChild(l.childNodes[l.childNodes.length-1]);\n } else {\n var wikifier = new Wikifier(text,formatter,w.highlightRegExp,w.tiddler);\n wikifier.subWikify(d, null);\n }\n if(typeof(this.termRegExp) != "undefined")\n w.nextMatch = terminatorMatch.index + terminatorMatch[0].length;\n else\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length; \n } else {\n if(isByLine)\n var e = createTiddlyElement(w.output,"code",null,null,text); \n else\n var e = createTiddlyElement(w.output,"pre",null,null,text); \n }\n }\n}\n\nsyntaxify.formatters = {};\n\nsyntaxify.addLanguages = function(languages) {\n for(lang in languages) {\n syntaxify.formatters[lang] = new Array();\n for(var i=0;i<syntaxify.commonFormatters.length;i++)\n syntaxify.formatters[lang].push(syntaxify.commonFormatters[i]);\n var addSpanClass = function(rule, spaces, wordbreak) {\n if(typeof(languages[lang][rule]) != "undefined") {\n for(var j=0;j<languages[lang][rule].length;j++) {\n syntaxify.formatters[lang].push({\n name: rule+((j==0)?"":j),\n match: wordbreak?("(?:\s\sb"+languages[lang][rule][j].join("\s\sb|\s\sb")+"\s\sb)")\n :("(?:"+languages[lang][rule][j].join("|")+")"),\n hasSpaces: spaces,\n handler: syntaxify.handleSpanClass\n });\n }\n }\n };\n addSpanClass("singleLineComments", true, false);\n addSpanClass("multiLineComments", true, false);\n addSpanClass("keywords", false, true);\n addSpanClass("literals", true, false);\n addSpanClass("delimiters", false, false);\n addSpanClass("identifiers", false, false);\n if(typeof(languages[lang].customFormatters) != "undefined") \n syntaxify.formatters[lang] = syntaxify.formatters[lang].concat(languages[lang].customFormatters);\n }\n}\n\nsyntaxify.addLanguages(syntaxify.languages);\n\n// Override the several built-in TiddlyWiki language-specific <pre> formatters\nfor(var i=0;i<config.formatters.length;i++) { \n if(config.formatters[i].name == "monospacedByLineForPlugin") { \n config.formatters[i].language = "javascript";\n config.formatters[i].byLine = true;\n config.formatters[i].handler = config.formatterHelpers.customClassesHelper; \n } \n if(config.formatters[i].name == "monospacedByLineForCSS") { \n config.formatters[i].language = "css";\n config.formatters[i].byLine = true;\n config.formatters[i].handler = config.formatterHelpers.customClassesHelper; \n } \n if(config.formatters[i].name == "monospacedByLineForTemplate") { \n config.formatters[i].language = "xml";\n config.formatters[i].byLine = true;\n config.formatters[i].handler = config.formatterHelpers.customClassesHelper; \n } \n if(config.formatters[i].name == "customClasses") {\n config.formatters[i].handler = config.formatterHelpers.customClassesHelper; \n if(typeof(config.formatters[i].termRegExp) == "undefined")\n config.formatters[i].termRegExp = new RegExp(config.formatters[i].terminator, "mg");\n }\n}\n\n// make syntaxify reliably accessible from dependent plugins even under IE.\nconfig.macros.syntaxify = syntaxify;\n//}}}\n
/***\n|Name|Plugin: jsMath|\n|Created by|BobMcElrath|\n|Email|my first name at my last name dot org|\n|Location||\n|Version|1.5.1|\n|Requires|[[TiddlyWiki|]] &ge; 2.0.3, [[jsMath|]] &ge; 3.0|\n!Description\nLaTeX is the world standard for specifying, typesetting, and communicating mathematics among scientists, engineers, and mathematicians. For more information about LaTeX itself, visit the [[LaTeX Project|]]. This plugin typesets math using [[jsMath|]], which is an implementation of the TeX math rules and typesetting in javascript, for your browser. Notice the small button in the lower right corner which opens its control panel.\n!Installation\nIn addition to this plugin, you must also [[install jsMath|]] on the same server as your TiddlyWiki html file. If you're using TiddlyWiki without a web server, then the jsMath directory must be placed in the same location as the TiddlyWiki html file.\n\nI also recommend modifying your StyleSheet use serif fonts that are slightly larger than normal, so that the math matches surrounding text, and \s\ssmall fonts are not unreadable (as in exponents and subscripts).\n{{{\n.viewer {\n line-height: 125%;\n font-family: serif;\n font-size: 12pt;\n}\n}}}\n\nIf you had used a previous version of [[Plugin: jsMath]], it is no longer necessary to edit the main tiddlywiki.html file to add the jsMath <script> tag. [[Plugin: jsMath]] now uses ajax to load jsMath.\n!History\n* 11-Nov-05, version 1.0, Initial release\n* 22-Jan-06, version 1.1, updated for ~TW2.0, tested with jsMath 3.1, editing tiddlywiki.html by hand is no longer necessary.\n* 24-Jan-06, version 1.2, fixes for Safari, Konqueror\n* 27-Jan-06, version 1.3, improved error handling, detect if ajax was already defined (used by ZiddlyWiki)\n* 12-Jul-06, version 1.4, fixed problem with not finding image fonts\n* 26-Feb-07, version 1.5, fixed problem with Mozilla "unterminated character class".\n* 27-Feb-07, version 1.5.1, Runs compatibly with TW 2.1.0+, by Bram Chen\n!Examples\n|!Source|!Output|h\n|{{{The variable $x$ is real.}}}|The variable $x$ is real.|\n|{{{The variable \s(y\s) is complex.}}}|The variable \s(y\s) is complex.|\n|{{{This \s[\sint_a^b x = \sfrac{1}{2}(b^2-a^2)\s] is an easy integral.}}}|This \s[\sint_a^b x = \sfrac{1}{2}(b^2-a^2)\s] is an easy integral.|\n|{{{This $$\sint_a^b \ssin x = -(\scos b - \scos a)$$ is another easy integral.}}}|This $$\sint_a^b \ssin x = -(\scos b - \scos a)$$ is another easy integral.|\n|{{{Block formatted equations may also use the 'equation' environment \sbegin{equation} \sint \stan x = -\sln \scos x \send{equation} }}}|Block formatted equations may also use the 'equation' environment \sbegin{equation} \sint \stan x = -\sln \scos x \send{equation}|\n|{{{Equation arrays are also supported \sbegin{eqnarray} a &=& b \s\s c &=& d \send{eqnarray} }}}|Equation arrays are also supported \sbegin{eqnarray} a &=& b \s\s c &=& d \send{eqnarray} |\n|{{{I spent \s$7.38 on lunch.}}}|I spent \s$7.38 on lunch.|\n|{{{I had to insert a backslash (\s\s) into my document}}}|I had to insert a backslash (\s\s) into my document|\n!Code\n***/\n//{{{\n\n// AJAX code adapted from\n// This is already loaded by ziddlywiki...\nif(typeof(window["ajax"]) == "undefined") {\n ajax = {\n x: function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}},\n gets: function(url){var x=ajax.x();'GET',url,false);x.send(null);return x.responseText}\n }\n}\n\n// Load jsMath\njsMath = {\n Setup: {inited: 1}, // don't run jsMath.Setup.Body() yet\n Autoload: {root: new String(document.location).replace(/[^\s/]*$/,'jsMath/')} // URL to jsMath directory, change if necessary\n};\nvar jsMathstr;\ntry {\n jsMathstr = ajax.gets(jsMath.Autoload.root+"jsMath.js");\n} catch(e) {\n alert("jsMath was not found: you must place the 'jsMath' directory in the same place as this file. "\n +"The error was:\sn"": "+e.message);\n throw(e); // abort eval\n}\ntry {\n window.eval(jsMathstr);\n} catch(e) {\n alert("jsMath failed to load. The error was:\sn" + ": " + e.message + " on line " + e.lineNumber);\n}\njsMath.Setup.inited=0; // allow jsMath.Setup.Body() to run again\n\n// Define wikifers for latex\nconfig.formatterHelpers.mathFormatHelper = function(w) {\n var e = document.createElement(this.element);\n e.className = this.className;\n var endRegExp = new RegExp(this.terminator, "mg");\n endRegExp.lastIndex = w.matchStart+w.matchLength;\n var matched = endRegExp.exec(w.source);\n if(matched) {\n var txt = w.source.substr(w.matchStart+w.matchLength, \n matched.index-w.matchStart-w.matchLength);\n if(this.keepdelim) {\n txt = w.source.substr(w.matchStart, matched.index+matched[0].length-w.matchStart);\n }\n e.appendChild(document.createTextNode(txt));\n w.output.appendChild(e);\n w.nextMatch = endRegExp.lastIndex;\n }\n}\n\nconfig.formatters.push({\n name: "displayMath1",\n match: "\s\s\s$\s\s\s$",\n terminator: "\s\s\s$\s\s\s$\s\sn?", // 2.0 compatability\n termRegExp: "\s\s\s$\s\s\s$\s\sn?",\n element: "div",\n className: "math",\n handler: config.formatterHelpers.mathFormatHelper\n});\n\nconfig.formatters.push({\n name: "inlineMath1",\n match: "\s\s\s$", \n terminator: "\s\s\s$", // 2.0 compatability\n termRegExp: "\s\s\s$",\n element: "span",\n className: "math",\n handler: config.formatterHelpers.mathFormatHelper\n});\n\nvar backslashformatters = new Array(0);\n\nbackslashformatters.push({\n name: "inlineMath2",\n match: "\s\s\s\s\s\s\s(",\n terminator: "\s\s\s\s\s\s\s)", // 2.0 compatability\n termRegExp: "\s\s\s\s\s\s\s)",\n element: "span",\n className: "math",\n handler: config.formatterHelpers.mathFormatHelper\n});\n\nbackslashformatters.push({\n name: "displayMath2",\n match: "\s\s\s\s\s\s\s[",\n terminator: "\s\s\s\s\s\s\s]\s\sn?", // 2.0 compatability\n termRegExp: "\s\s\s\s\s\s\s]\s\sn?",\n element: "div",\n className: "math",\n handler: config.formatterHelpers.mathFormatHelper\n});\n\nbackslashformatters.push({\n name: "displayMath3",\n match: "\s\s\s\sbegin\s\s{equation\s\s}",\n terminator: "\s\s\s\send\s\s{equation\s\s}\s\sn?", // 2.0 compatability\n termRegExp: "\s\s\s\send\s\s{equation\s\s}\s\sn?",\n element: "div",\n className: "math",\n handler: config.formatterHelpers.mathFormatHelper\n});\n\n// These can be nested. e.g. \sbegin{equation} \sbegin{array}{ccc} \sbegin{array}{ccc} ...\nbackslashformatters.push({\n name: "displayMath4",\n match: "\s\s\s\sbegin\s\s{eqnarray\s\s}",\n terminator: "\s\s\s\send\s\s{eqnarray\s\s}\s\sn?", // 2.0 compatability\n termRegExp: "\s\s\s\send\s\s{eqnarray\s\s}\s\sn?",\n element: "div",\n className: "math",\n keepdelim: true,\n handler: config.formatterHelpers.mathFormatHelper\n});\n\n// The escape must come between backslash formatters and regular ones.\n// So any latex-like \scommands must be added to the beginning of\n// backslashformatters here.\nbackslashformatters.push({\n name: "escape",\n match: "\s\s\s\s.",\n handler: function(w) {\n w.output.appendChild(document.createTextNode(w.source.substr(w.matchStart+1,1)));\n w.nextMatch = w.matchStart+2;\n }\n});\n\nconfig.formatters=backslashformatters.concat(config.formatters);\n\nwindow.wikify = function(source,output,highlightRegExp,tiddler)\n{\n if(source && source != "") {\n if(version.major == 2 && version.minor > 0) {\n var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);\n wikifier.subWikifyUnterm(output);\n } else {\n var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);\n wikifier.subWikify(output,null);\n }\n jsMath.ProcessBeforeShowing();\n }\n}\n//}}}\n
Ever want to have in your post buttons so that viewers can submit your post to Digg, DZone, and etc. This is often referred to as a post to footer and is quite easy to add.\n\n!First Step\nThe code that we will lbe using uses roller macros of $entry and $entry.title. To find the submit urls you can often search for other bloggers who using these types of footers such as:\n[[Eric Thauvin's The Truth Is Out There|]]\n\nYou will also want to grab some icons to indicate the sites you users will be submitting your post to using the footer you are creating.\n\n!Second Step\nThis is the code I use at my weblog:\n<nowiki>\n<span class="addtobadge">\n<a href="$entry.title&amp;url=$entry" title="Bookmark on"><img src="" alt="dzone" width="16" height="16" border="0"></a> \n<a href=";url=$entry&amp;title=$entry.title" title="Bookmark on"><img src="" alt="" width="16" height="16" border="0"></a> \n<a href="$entry&amp;t=$entry.title" title="Bookmark on Yahoo! My Web 2.0"><img src="" alt="Yahoo!" width="16" height="16" border="0"></a>\n<a href=";url=$entry" title="Digg It"><img src="" alt="digg" width="16" height="16" border="0"></a> \n<a href="$entry&amp;title=$entry.title" title="Post to reddit"><img src="images/bookmarks/reddit.gif\n" alt="reddit" width="16" height="16" border="0"></a> \n<a href=";save?u=$entry&amp;h=$entry.ttile" title="Post to newsvine"><img src="" alt="newsvine" width="16" height="16" border="0"></a>\n<a href="$entry" title="submit it to slashdot"><img src="" alt="slashdotit" wdith="16" height="16" border="0"></a>\n<a href="$entry&title=$entry.title" title="Stumble"><img src="" alt="stumbleupon" width="16" height="16" border="0"></a>\n<a href=";title=$entry.ttile&amp;bkmk=$entry" title="googlebookmark"><img src="" alt="googlebookmark" width="16" height="16" border="0"></a>\n<a href="$entry&title=$entry.title&desc=$entry.title" title="markaboo"><img src="" alt="markaboo" width="16" height="16" border="0"></a></span></div>\n</span>\n</nowiki>\n\nYou will of course change the img srcs to where your images are stored. You will notice that I use the title parameter in both the href tag and the img tag. This should be enough to trigger the tips opoup feature in most browsers. If not, than you can always add descriptive text to all the links. In my code I include dzone, digg, my yahoo, reddit, newsvine, googlebookmark, markaboo, slashdot and delicious.\n\nYou will be adding this code to the bottom of your day template before the end of the the foreach statement. Some screen shots:\n!!Figure 1\n[img[][]]<<imagebox>>\nClick on Image to Enlarge\n\n!Conclusion\n\nYou can see the final result in my blog at:\n[[Shareme blog|]]\n\nThis concludes adding a post to sites footer to roller tip.\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
Project Green was Sun Microsystems first consumer electronics project which started 1990.\n\nTwo products came out of Project Green, one was a SPARC based wireless PDA called Star7(*7) and an application programming environment called originally OAK. Of course, the Duke mascot was also developed at that time as the visual mascot of the user guide that operated on Star7.\n\nOAK was later renamed to Java in 1993-1994.\n\n!References\n[[The Green Project History at|]]\n[[Java(wikipedia article)|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright\n
/***\n| Name|QuickOpenTagPlugin|\n| Description|Changes tag links to make it easier to open tags as tiddlers|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE?\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++) {\n var theListItem = createTiddlyElement(theDateList,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by QuickOpenTagPlugin */",\n".tagglyTagged .quickopentag, .tagged .quickopentag ",\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",\n"/* extra specificity to make it work right */",\n"#displayArea .viewer .quickopentag a.button, ",\n"#displayArea .viewer .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink ",\n" { border:0px solid black; }",\n"#displayArea .viewer .quickopentag a.button, ",\n"#mainMenu .quickopentag a.button ",\n" { margin-left:0px; padding-left:2px; }",\n"#displayArea .viewer .quickopentag a.tiddlyLink, ",\n"#mainMenu .quickopentag a.tiddlyLink ",\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",\n"a.miniTag {font-size:150%;} ",\n"#mainMenu .quickopentag a.button ",\n" /* looks better in right justified main menus */",\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n }\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
In theory, there is no difference between theory and practice. But, in practice, there is.\n----\nSometimes when reading Goethe I have the paralyzing suspicion that he is trying to be funny.\n----\nBefore I got married I had six theories about bringing up children; now I have six children and no theories.\n----\nA witty saying proves nothing.\n----\nThe problem with some people is that when they aren't drunk, they're sober.\n----\nThe great thing about television is that if something important happens anywhere in the world, day or night, you can always change the channel.\n----\nDon't be so humble - you are not that great.\n----\nThe combination "ough" can be pronounced in nine different ways. The following sentence contains them all: "A rough-coated, dough-faced, thoughtful ploughman strode through the streets of Scarborough; after falling into a slough, he coughed and hiccoughed." \n----\nIf you lived here, you'd be home by now...\n----\nI love my dust. It shows I had something better to do.\n----\nTime flies like an arrow... Fruit flies like a banana [Groucho Marx]\n----\nIf you don't know where you're going, you'll probably end up somewhere else.\n----\nWeebles wobble... but they don't fall down!\n----\nIt's all very simple... or else it's all very complex... or perhaps it's neither... or both.\n----\nAccepting reality is the first step to insanity\n----\nOops! Sorry. My karma ran over your dogma.\n----\nIf it looks like a duck, walks like a duck and sounds like a duck, it's probably something else.\n----\nSome times you feel like a nut, some times you bolt.\n----\nSantaclaustrophobia... The feeling that Christmas is closing in all around you.\n----\nDon't touch that! You don't know where it's been...\n----\nWhy is abbreviation such a long word?\n----\nLife's a trip, not a destination. So watch out for the cows.\n----\nDiplomacy is the art of saying 'Nice doggie!'... until you can find a rock.\n----\nScientists working on cloning technology have done what the american educational system has been doing for years - producing identical sheep.\n----\nUmm... What's another word for thesaurus?\n----\nGive me ambiguity or give me something else\n----\nDon't anthropomorphize your computer, it doesn't like it.\n----\nNinth Law of Cartoon Physics: Everything falls faster than an anvil.\n----\nNew clinical studies show there aren't any answers. So just enjoy the questions...\n----\nOh yeah? Far out!\n----\nBoycott Shampoo - Demand the REAL poo!\n----\nOn Blintze! On Bagel! On Spaetzle! On Strudel! On Matzo! On Latke! On Kuchen! On Kugel!... Merry Chanukah!\n----\nRemember: Don't sweat the petty things... and don't pet the sweaty things.\n----\nSign in lunch room: Shoes are required to eat in the cafeteria... socks can eat anywhere they want.\n----\nDon't be irreplaceable, if you can't be replaced, you can't be promoted.\n----\n5 out of 4 people have problems with fractions...\n----\nOsborne's Law of Mathematics: Variables won't; constants aren't.\n----\nAlways remember you're unique, just like everyone else.\n----\nSomething to ponder: What was the best thing *before* sliced bread? Hmmm...\n----\nPhysics Joke #27: Two hydrogen atoms bump into each other while walking down the street: 'Are you alright?'... 'No, I lost an electron!'... 'Are you sure?'... 'Yeah, I'm Positive!'\n----\nThe one thing I can't stand is intolerant people!\n----\nOld programmers never die. . . they just can't C as well.\n----\nWorld Shortest 'Bar' joke: A guy walks into a bar... OUCH! he says...\n----\nWho are you going to believe, me or your own eyes? \n----\nNever judge a man 'til you have walked a mile in his shoes, because by then, he's a mile away, you've got his shoes, and you can say whatever the hell you want to.\n----\nThe problem with troubleshooting is that real trouble shoots back.\n----\nHow much wood would a woochuck chuck if a woodchuck could chuck wood?\n----\nThese are the roots of rhythm: boom, de boom, de-boom, ding-dong, ooh! [Leila ~Gallagher-Breen]\n----\nThese are the roots of music: boom-chicky-chicky boom, meow, meow, baddom, baddom, ding-aling-a-long, chicky-boom! [Leila ~Gallagher-Breen]\n----\nClassified ad (in Physics Quarterly): Got Mole problems? Call Avagadro Exterminators: 602-1023\n----\nHe who laughs last thinks slowest\n----\nWould a fly without wings be called a walk?\n----\nThe winner of the World's Worst Analogy contest: 'The little boat glided across the water in exactly the way a bowling ball wouldn't.'\n----\nFrom the 'say what?!?' files: We are ready for any unforeseen event that may or may not occur. [Dan Quayle 9/22/90]\n----\nI believe you should live each day as if it is your last, which is why I don't have any clean laundry because, come on, who wants to wash clothes on the last day of their life? [Jack Handy]\n----\nPRINTER - A device consisting of three main parts: the case, the jammed paper tray, and the blinking red light.\n----\nDilbert's Laws of Work: The more crap you put up with, the more crap you are going to get.\n----\nQ: Why'd the electron cross the road? A: 'Cause he was already on the other side...\n----\nWhen the going gets tough, remember STRESSED spelled backwards is DESSERTS.\n----\nFoobar... baz. Mumble: frotz, gronk, snork. Snerfle? Natter and gromish!\n----\nPentiums melt in your PC, not in your hand.\n----\neveryone is cute... even me. But in purple... I'm STUNNING!! [Londo Mollari] \n----\nI always wanted to be somebody, but I should have been more specific. [Lily Tomlin] \n----\nIt's OK to change horses in mid-stream, especially if the first horse can't swim! [Laura Shulman] \n----\nWork is the curse of the drinking classes. [Oscar Wilde] \n----\nWe have only two things to worry about: That things will never get back to normal, and that they already have.\n----\nIntelligence is a funny thing: those who don't have it think they do, and those who do are smart enough to know better.\n----\nLife is hard, Love is strange. Nothing lasts, people change. Dream of a long and wonderful future, but live now.\n----\n'Can you prove any of the stuff you believe in?', my friend asked. When I said that's not how belief works, he nodded and said that's what he thought but he was just checking to make sure he hadn't missed a key point.\n----\nLife ... It's a good place to be!\n----\nDo not follow where the path may lead. Go, instead, where there is no path, and leave a trail.\n----\nHistory is made at night... character is what you are in the dark. [Dr. Emilio Lizardo, aka Lord John Worfin] \n----\nYou can't always get what you want... but if you try sometimes, you just may find, that you get what you need. [The Rolling Stones] \n----\nThe only man who behaved sensibly was my tailor; he took my measurement anew every time he saw me, while all the rest went on with their old measurements and expected them to fit me. [George Bernard Shaw] \n----\nIn matters of style, swim with the current: in matters of principle, stand like a rock. [Thomas Jefferson] \n----\nGreat things are not done by impulse, but by a series of small things brought together. [Vincent van Gogh] \n----\n'I think there is a world market for maybe five computers.' [Thomas Watson, chairman of IBM, 1943] \n----\nWe have to live today by what truth we can get today, and be ready tomorrow to call it falsehood. [William James] \n----\nThere are two ways of spreading light: to be the candle or the mirror that reflects it. [Edith Wharton] \n----\nTalent develops in tranquility, character in the full current of human life. [Johann Wolfgang von Goethe (1749-1832)] \n----\nOur firmest convictions are apt to be the most suspect; they mark our limitations and our bounds. Life is a petty thing unless it is moved by the indomitable urge to extend its boundaries. [Jose Ortega y Gasset] \n----\nIt takes courage to grow up and turn out to be who you really are. [e e cummings (1894-1962)] \n----\nIf we knew what it was we were doing, it would not be called research, would it? [Albert Einstein] \n----\nTo invent, you need a good imagination and a pile of junk. [Thomas Edison] \n----\nDare to be naive. [R. Buckminster Fuller] \n----\nQuiet minds cannot be perplexed or frightened, but go on in fortune or misfortune at their own private pace, like a clock during a thunderstorm. [Robert Louis Stevenson] \n----\nIn the struggle between yourself and the world, second the world. [Franz Kafka] \n----\nEvery man's condition is a solution in hieroglyph to those inquiries he would put. He acts it as life before he apprehends it as truth. [Ralph Waldo Emerson] \n----\nOne can remain alive...if one is unafraid of change, insatiable in intellectual curiosity, interested in big things, and happy in small ways. [Edith Wharton] \n----\na rock is like space because it doesnt move; and space is like a rock because it is empty. words are buddhas. [Jack Kerouac] \n----\nThe whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. [Bertrand Russell] \n----\nDoubt is not a pleasant state of mind, but certainty is absurd. [Voltaire] \n----\nEducation is not the filling of a pail, but the lighting of a fire. [William Butler Yeats] \n----\nIf you take yourself too seriously, no one else will take you seriously enough... [Eric Shulman] \n----\nThere are only four questions of value in life... What is sacred? Of what is the spirit made? What is worth living for, and what is worth dying for? The answer to each is the same: only love. [Don Juan ~DeMarco] \n----\nIf you are a dreamer, come in. If you are a dreamer, a wisher, a liar, a hope-er, a pray-er, a magic bean buyer... If you're a pretender, come sit by my fire... For we have some flax-golden tales to spin. Come in! Come in! [Shel Silverstein] \n----\nO money, money, money, I'm not necessarily one of those who think thee holy, But I often stop to wonder how thou canst go out so fast when thou comest in so slowly. [Ogden Nash] \n----\nThere is no progress without struggle. [Frederick Douglass] \n----\nBefore you can do something, you must become something. [Goethe] \n----\nThe man who follows the crowd will usually get no further than the crowd. The man who walks alone is likely to find himself in places no one has ever been. [Alan ~Ashley-Pit] \n----\nWeep not for the dead for they are but empty cages from which the bird has flown. [Tibetan Book of The Dead] \n----\nI wish it would dawn upon engineers that, in order to be an engineer, it is not enough to be an engineer. [Jose Ortega y Gasset] \n----\nEvery exit is an entry somewhere. [Tom Stoppard] \n----\nWherever we are, it is but a stage on the way to somewhere else, and whatever we do, however well we do it, it is only a preparation to do something else that shall be different. [Robert Louis Stevenson] \n----\nWe judge ourselves by what we feel capable of doing, while others judge us by what we have already done. [Henry Wadsworth Longfellow] \n----\nAll our words are but crumbs that fall down from the feast of the mind. [Kahlil Gibran, "Sand and Foam"] \n----\nIt's a lot harder to find joy than it is to find bread. Feed your soul first, then go shopping. [Eric Shulman] \n----\nWhy do you hasten to remove anything which hurts your eye, while if something affects your soul you postpone the cure until next year? [Horace] \n----\nNot to know is bad. Not to want to know is worse. Not to hope is unthinkable. Not to care is unforgivable. [Nigerian folk saying] \n----\nOnly half of writing is saying what you mean. The other half is preventing people from reading what they expected you to mean. [James Richardson, 'Ploughshares'] \n----\nThere are no shortcuts to anyplace worth going. [Beverly Sills] \n----\nSomewhere, something incredible is waiting to be known. [Carl Sagan] \n----\nCourage is the price that Life extracts for granting peace. [Amelia Earhart] \n----\nGreat things are not done by impulse, but by a series of small things brought together. [Vincent van Gogh] \n----\nChoose a job you love, and you will never have to work a day in your life. [Confucius] \n----\nThere is only one success - to be able to spend your life in your own way. [Christopher Morley] \n----\nWe choose our joys and sorrows long before we experience them. [Kahlil Gibran] \n----\nIt is all a frame of mind, this enjoyment of living. [Lin Yutang] \n----\nWork for something because it is good, not just because it stands a chance to succeed. [Vaclav Havel] \n----\nThe easiest way to get what you want is to help others get what they want. [Deepak Chopra] \n----\nAll generalizations are false, including this one. [Bucky Radfish]\n----\nIn science, 'fact' can only mean 'confirmed to such a degree that it would be perverse to withhold provisional assent.' I suppose that apples might start to rise tomorrow, but the possibility does not merit equal time in physics classrooms. [Stephen Jay Gould (1941 - 2002)]\n----\nTwenty years from now, you will be more disappointed by the things you didn't do, than by the ones you did. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore, dream... [Mark Twain]\n----\nTo live only for some future goal is shallow. It's the sides of the mountain that sustain life, not the top. [Robert M. Pirsig]\n----\nNothing is so contagious as enthusiasm; it moves stones, it charms brutes. Enthusiasm is the genius of sincerity, and truth accomplishes no victories without it. [Edward G. E. ~Bulwer-Lytton (1803 - 1873)]\n----\nThe past is but the beginning of a beginning, and all that is and has been is but the twilight of the dawn. [Herbert George Wells]\n----\nWe grow great by dreams. All big men are dreamers. They see things in the soft haze of a spring day or in the red fire of a long winter's evening. Some of us let these great dreams die, but others nourish and protect them; nurse them through bad days till they bring them to the sunshine and light, which comes always to those who sincerely hope that their dreams will come true. [Woodrow Wilson]\n----\nBe brave enough to live life creatively. The creative is the place where no one else has ever been. You have to leave the city of your comfort and go into the wilderness of your intuition. You can't get there by bus, only by hard work and risk and by not quite knowing what you're doing. What you'll discover will be wonderful. What you'll discover will be yourself. [Alan Alda]\n----\nIf we had no winter, the spring would not be so pleasant; if we did not sometimes taste of adversity, prosperity would not be so welcome.\n----\nSolitude, if rightly used, becomes not only a privilege but a necessity. Only a superficial soul fears to fraternize with itself.\n----\nOne of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important.\n----\nHope is like a road in the country: there was never a road, but when many people walk on it, the road comes into existence.\n----\nYou can only find truth with logic if you have already found truth without it.\n----\nLove is always bestowed as a gift - freely, willingly and without expectation. We don't love to be loved; we love to love.\n----\nAlways listen to experts. They'll tell you what can't be done, and why. Then do it.\n----\nDistance between two hearts is not an obstacle; rather a great reminder of just how strong true love can be.\n----\nNot everything that can be counted counts, and not everything that counts can be counted.\n----\nLife's challenges are not supposed to paralyze you, they're supposed to help you discover who you are.\n----\nNothing splendid has ever been achieved except by those who dared believe that something inside them was superior to circumstances.\n----\nWhether you think that you can, or that you can't, you are usually right.\n----\nThe only time you run out of chances is when you stop taking them.\n----\nKnowledge speaks, but wisdom listens.\n----\nToo often we give our children answers to remember rather than problems to solve.\n----\nBooks are the shoes with which we tread the footsteps of great minds. A book may lie dormant for fifty years or for two thousand years in a forgotten corner of a library, only to reveal, upon being opened, the marvels or the abysses that it contains, or the line that seems to have been written for me alone. In this respect the writer is not different from any other human being: whatever we say or do can have far-reaching consequences.\n----\nA people that values its privileges above its principles soon loses both.\n----\nTreat everyone with politeness, even those who are rude to you. Not because they are nice, but because you are.\n----\nThe ultimate measure of a man is not where he stands in moments of comfort and convenience, but where he stands in times of challenge and controversy. What lies behind us and what lies before us, are only small matters compared to what lies within us. \n----\nBeing in charge of your own reality is a little tougher; it takes a lot of thinking and brutal honesty. [Phil Glatz]\n----\nThere are always going to be amazingly creative people doing wonderful things. [Phil Glatz]\n----\nThe trick is to rise above the symptoms of being aware, and actually BE aware. [Phil Glatz]\n----\nA revolution is coming - a revolution which will be peaceful if we are wise enough; compassionate if we care enough; successful if we are fortunate enough - but a revolution which is coming whether we will it or not. We can affect its character, we cannot alter its inevitability. [John F. Kennedy]\n----\nOn two occasions I have been asked (by members of Parliament!), 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. [Charles Babbage]\n----\nIn your presence even my shadow acquires the sensation of touch.
/***\n|Name|QuoteOfTheDayPlugin|\n|Source||\n|Version|1.2.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Display a randomly selected "quote of the day" from a list defined in a separate tiddler|\n\n!!!!!Usage\n<<<\n{{{<<QOTD tiddlername noclick norandom delay>>}}}\n* ''tiddlername'' is the name of a tiddler containing your list of quotes, each separated by a horizontal line (use {{{----}}} on a line by itself).\n* Each time the macro is rendered it will display a different quotation, selected at random from the specified tiddler. To display quotes in the sequence in which they occur in the tiddler, you can use the ''norandom'' keyword.\n* By default, clicking on the rendered quote will select and display another random quote. Use the optional ''noclick'' keyword parameter to disable this "onClick" handling.\n* By default, a clickable or timed quote will be displayed insider a 'slider' panel, so that standard TW animation effects will be used. However, slider panels are always rendered as "block-level" content, forcing a newline both before and after the slider panel. Use the ''inline'' keyword parameter to bypass this side-effect and display a clickable/timed quote without automatically adding surrounding linebreaks.\n* The quote can also be refreshed automatically, by specifying a numeric ''delay'' parameter (in milliseconds) which enables a countdown timer. When the mouse is over the quote, the timer is automatically stopped. Moving the mouse away from the quote content restarts the timer.\n<<<\n!!!!!Example\n<<<\n{{{<<QOTD Quotations 10000>>}}}\n<<QOTD Quotations 10000>>\n\n{{{<<QOTD SiteNews norandom 10000>>}}}\n<<QOTD SiteNews norandom 10000>>\n\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''QuoteOfTheDayPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for QuoteOfTheDay handling^^\n<<<\n!!!!!Revision History\n<<<\n''2007.05.03 [1.2.1]'' corrected logic for handling "inline" display (i.e., bypass slider and use of 'block' for quote elements)\n''2007.05.03 [1.2.0]'' added sliderPanel wrapper around quote to take advantage of core-supported slider animation. Use "noslider"/"inline" keyword param to suppress use of slider. Also added tooltips for click, delay, and click+delay modes.\n''2007.04.16 [1.1.2]'' code cleanup\n''2007.04.16 [1.1.1]'' onClick handling now supports sequential as well as random order\n''2007.04.14 [1.1.0]'' added onClick handling for selecting and display a new random quote\n''2005.10.21 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]].\nBased on a suggestion by M.Russula\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.QOTD = {major: 1, minor: 2, revision: 1, date: new Date(2007,5,3)};\nconfig.macros.QOTD = {\n clickTooltip: "click to view another item",\n timerTooltip: "auto-timer stopped... 'mouseout' to restart timer",\n timerClickTooltip: "auto-timer stopped... click to view another item, or 'mouseout' to restart timer",\n handler:\n function(place,macroName,params) {\n var tid=params.shift(); // source tiddler containing HR-separated quotes\n var p=params.shift();\n var click=true; // allow click for next item\n var inline=false; // wrap in slider for animation effect\n var random=true; // pick an item at random (default for "quote of the day" usage)\n while (p) {\n if (p.toLowerCase()=="noclick") var click=false;\n if (p.toLowerCase()=="inline") var inline=true;\n if (p.toLowerCase()=="norandom") var random=false;\n if (!isNaN(p)) var delay=p;\n p=params.shift();\n }\n if ((click||delay) && !inline) {\n var panel = createTiddlyElement(null,"div",null,"sliderPanel");\n"none";\n place.appendChild(panel);\n var here=createTiddlyElement(panel,click?"a":"span",null,"QOTD");\n }\n else\n var here=createTiddlyElement(place,click?"a":"span",null,"QOTD");\n Date()).convertToYYYYMMDDHHMMSSMMM()+Math.random().toString(); // unique ID\n here.setAttribute("tid",tid);\n if (delay) here.setAttribute("delay",delay);\n here.setAttribute("random",random);\n if (click) {\n here.title=this.clickTooltip\n if (!inline)"block";\n here.setAttribute("href","javascript:;");\n here.onclick=function(event)\n { config.macros.QOTD.showNextItem(this,this.getAttribute("tid")); }\n }\n here.setAttribute("nextItem",0);\n config.macros.QOTD.showNextItem(here,tid);\n if (delay) {\n here.title=click?this.timerClickTooltip:this.timerTooltip\n here.onmouseover=function(event)\n { clearTimeout(this.ticker); };\n here.onmouseout=function(event)\n { this.ticker=setTimeout("config.macros.QOTD.tick('""')",this.getAttribute("delay")); };\n here.ticker=setTimeout("config.macros.QOTD.tick('""')",delay);\n }\n },\n tick: function(id) {\n var here=document.getElementById(id); if (!here) return;\n config.macros.QOTD.showNextItem(here,here.getAttribute("tid"));\n here.ticker=setTimeout("config.macros.QOTD.tick('"+id+"')",here.getAttribute("delay"));\n },\n showNextItem:\n function (here,tid) {\n // hide containing slider panel (if any)\n var p=here.parentNode;\n if (p.className=="sliderPanel") = "none"\n\n // get a new quote, re-render quote display element, and advance index counter\n var txt=store.getTiddlerText(tid); if (!txt) return;\n var items=txt.split("\sn----\sn");\n var index=here.getAttribute("nextItem");\n if (here.getAttribute("random")=="true") index=Math.floor(Math.random()*items.length);\n removeChildren(here);\n wikify(items[index],here);\n index++; if (index==items.length) index=0;\n here.setAttribute("nextItem",index);\n\n // redisplay slider panel (if any), with possible animation\n if (p.className=="sliderPanel") {\n if(anim && config.options.chkAnimate)\n anim.startAnimating(new Slider(p,true,false,"none"));\n else\n"block";\n }\n }\n}\n//}}}
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:||\n| Author:|Simon Baird <>|\n| License||\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
/***\n|Location||\n|Version|1.0|\n|Requires|~TW2.1.x, TinyMCE 2.1.x|\n|Browsers|Firefox 2.0.x|\n!Description:\nIntegrate tinyMCE richtext editor in TiddlyWiki.\n\n!Demo:\nAfter installation, tag a tiddler as richText and edit it.\n\n!Installation:\n# Download tinyMCE from and unzip it somewhere. By default, tiny_mce.js script path should be tiny_mce/tiny_mce.js (so in a tiny_mce subdirectory).\n# Import the RichTextPlugin tiddler and tag it as a systemConfig.\n# Add txtTinyMCEPath and txtRichTextTag in advanced options panel, or use the following. \n**<<option txtTinyMCEPath>> TinyMCE Path (relative or absolute)\n**<<option txtRichTextTag>> taggled tiddler will edit in richText mode by default\n# Adapt this option values to your needs.\n# Save and reload your tiddlywiki.\n# __Optionnally__, you can add a richText macro to the EditTemplate toolbar. It adds a button to switch on and off the richText editor.\n# __Optionnaly__, edit tiny_mce\sthemes\ssimple\scss\s*.css files to adapt the look and feel in rich text editor.\n# tag a tiddler as richText (or the value you put in the options) and edit it. Have a fine job !\n\n!History:\n*20-03-07: ver 1.0\n\n!Code\n***/\n//{{{\nconfig.commands.saveTiddler.richTextPreviousHandler = config.commands.saveTiddler.handler;\nconfig.commands.saveTiddler.handler = function (event,src,title) {\n if (typeof tinyMCE!= "undefined") config.commands.richText.RichTextMode("off",title);\n return config.commands.saveTiddler.richTextPreviousHandler(event,src,title);\n}\n\nconfig.commands.cancelTiddler.richTextPreviousHandler = config.commands.cancelTiddler.handler;\nconfig.commands.cancelTiddler.handler = function (event,src,title){\n if (typeof tinyMCE!= "undefined") config.commands.richText.RichTextMode("off",title);\n return config.commands.cancelTiddler.richTextPreviousHandler(event,src,title);\n}\n\nconfig.commands.deleteTiddler.richTextPreviousHandler = config.commands.deleteTiddler.handler;\nconfig.commands.deleteTiddler.handler = function (event,src,title){\n if (typeof tinyMCE!= "undefined") config.commands.richText.RichTextMode("off",title);\n return config.commands.deleteTiddler.richTextPreviousHandler(event,src,title);\n}\n\nconfig.commands.editTiddler.richTextPreviousHandler = config.commands.editTiddler.handler;\nconfig.commands.editTiddler.handler = function (event,src,title){\n var res = config.commands.editTiddler.richTextPreviousHandler(event,src,title);\n if (store.getTiddler(title).tags.contains(config.options.txtRichTextTag)) \n if (typeof tinyMCE!="undefined") config.commands.richText.RichTextMode("on",title);\nreturn res;\n}\n\nmerge(config.options,{txtTinyMCEPath : "tiny_mce/tiny_mce.js", txtRichTextTag : "richText"},true);\n\nconfig.commands.richText = {\n handler : function (event,src,title){\n this.RichTextMode("switch", title);\nreturn false;\n },\n text:"Richtext (on/off)",\n tooltip:"write it in rich text",\n matchingRules : { // global definition to avoid defintion in a recursive function\n strong : {wikIn : "''", wikOut : "''"}, \n em : {wikIn : "//", wikOut : "//" }, \n u : {wikIn : "__", wikOut : "__" }, \n strike : {wikIn : "--", wikOut : "--" }, \n p : {wikIn : "\sn", wikOut : "" }, \n br : {wikIn : "\sn", wikOut : "" }, \n li : {wikIn : "\sn", wikOut : ""}, \n ul : {wikIn : "", wikOut : ""}, \n ol : {wikIn : "", wikOut : ""}\n },\n tinyMCELoad :function (){\n var scriptElement = document.createElement("script");\n scriptElement.src = config.options.txtTinyMCEPath;\n scriptElement.type= "text/javascript";\n scriptElement.language = "javascript";\n document.getElementsByTagName("head")[0].appendChild(scriptElement); \n this.tinyMCEInit();\n }, \n tinyMCEInit : function () {\n if (typeof tinyMCE== "undefined") window.setTimeout("config.commands.richText.tinyMCEInit()",100);\n else tinyMCE.init({mode : "none", theme : "simple", gecko_spellcheck : "true", strict_loading_mode : true}); //wait script is loaded\n },\n \n WikiToHTML : function(myString){ //Convert Wiki code to HTML code\n for (tag in this.matchingRules){\n if ((this.matchingRules[tag].wikIn==this.matchingRules[tag].wikOut)&&(this.matchingRules[tag].wikIn!="")){ // format delimiters\n myString=this.ReplaceWithTag(myString,this.matchingRules[tag].wikIn,"<"+tag+">","</"+tag+">");\n }\n }\n lines = myString.split("\sn");\n var ul=0; ol=0; ulLevel=0, olLevel=0;\n for (cpt=0; cpt<lines.length; cpt++){\n\n olLevel=(/^#+/.exec(lines[cpt])||"").toString().length; // count # at line begining\n ulLevel=(/^\s*+/.exec(lines[cpt])||"").toString().length; // count * at line begining\n lines[cpt]=lines[cpt].replace(/^#+/,""); // delete wiki symbols before replacing with equivalent HTML\n lines[cpt]=lines[cpt].replace(/^\s*+/,""); // delete wiki symbols before replacing with equivalent HTML\n \n if (ulLevel||olLevel) lines[cpt]="<li>"+lines[cpt]+"</li>"; // wiki line are paragraphs or list items\n else lines[cpt]="<P>"+lines[cpt]+"</P>"\n \n if (ulLevel>ul) lines[cpt]=Array(ulLevel-ul+1).join("<ul>")+lines[cpt]; // list open tags match wiki symbol count changes, here unordered list. Use Array.join(+1) to repeat string.\n if (olLevel>ol) lines[cpt]=Array(olLevel-ol+1).join("<ol>")+lines[cpt]; // list open tags match wiki symbol count changes, here ordered list. Use Array.join(+1) to repeat string.\n if (ulLevel<ul) lines[cpt]=Array(ul-ulLevel+1).join("</ul>")+lines[cpt]; // list close tags match wiki symbol count changes, here unordered list. Use Array.join(+1) to repeat string.\n if (olLevel<ol) lines[cpt]=Array(ol-olLevel+1).join("</ol>")+lines[cpt]; // list close tags match wiki symbol count changes, here ordered list. Use Array.join(+1) to repeat string.\n \n ul=ulLevel; ol=olLevel;\n }\n res = lines.join("");\n if (ul+ol>0) for(var cpt=0;cpt<ul+ol; cpt++) res+="</ul>" //if list item is last line, must close tags here\n return res;\n },\n HTMLNodeToWiki : function(myNode, ol, ul, last){//Convert HTML code to Wiki code\n if (myNode.nodeType==3) return myNode.textContent; // final node level = text\n \n var ol=ol||""; var ul=ul||""; var last=last||"ul"; var res = "";\n var nName = myNode.nodeName.toLowerCase();\n \n switch (nName) {\n case "ul" : ul+="*"; last = "ul"; break; //increase list level\n case "ol" : ol+="#"; last = "ol"; break; //increase numerical list level\n case "li" : res = eval(last); //apply list level to wiki code\n }\n \n for (var cpt=0; cpt< myNode.childNodes.length; cpt++)\n res += this.HTMLNodeToWiki(myNode.childNodes[cpt], ol, ul, last); // convert children recursively\n \n if (this.matchingRules[nName]) // then HTML element has wiki equivalent\n res = this.matchingRules[nName].wikIn + res + this.matchingRules[nName].wikOut;\n return res;\n },\n ReplaceWithTag : function(myString, lookFor, tagForOpen, tagForClose){ // replace tag alternatively with tagForOpen and tagForClose\n var stringArray = myString.split(lookFor);\n var res=stringArray[0];\n for (var cpt=1;cpt<stringArray.length;cpt++){\n if (cpt%2!=0) res=res+tagForOpen+stringArray[cpt];\n else res=res+tagForClose+stringArray[cpt]; \n }\n return res;\n },\n\n RichTextMode : function (mode, title){\nif (typeof tinyMCE== "undefined") return false;\n var editorID="richtext"+title;\n var area = document.getElementById("tiddler"+title).getElementsByTagName("textarea")[0];\n var statut = (tinyMCE.getInstanceById(editorID)!=null);\n\n if (mode!="on" && mode !="off") mode="switch"; // only accept "on", "off" or "switch" (default value)\n if (statut && (mode=="switch")) mode="off"; \n if (!statut && (mode=="switch")) mode="on";\n\n if (mode=="on" && !statut){\n area.value=this.WikiToHTML(area.value);\n tinyMCE.addMCEControl(area,editorID);\n }\n if (mode=="off" && statut){\n tinyMCE.removeMCEControl(editorID);\n var myDiv = document.createElement("div");\n myDiv.innerHTML=area.value;\n area.value = this.HTMLNodeToWiki(myDiv).replace(/\sn/,""); // remove unuseful first carriage return\n }\n } \n}\n\nif (navigator.userAgent.indexOf('Gecko') != -1) config.commands.richText.tinyMCELoad(); \n\n//}}}
[img[]]\n\n!Introduction\nThe following articles are tips in using the Roller Weblog system that is often found in java developer communities. These articles cover roller versions 2.x, 3.x, and beyond.\n\n!Articles\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Roller")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \n>>
/***\n| Name|SaveCloseTiddlerPlugin|\n| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|\n| Version|3.0 ($Rev: 2134 $)|\n| Date|$Date: 2007-04-30 16:11:12 +1000 (Mon, 30 Apr 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\nTo use these you must add them to the tool bar in your EditTemplate\n***/\n//{{{\nmerge(config.commands,{\n\n saveCloseTiddler: {\n text: 'done/close',\n tooltip: 'Save changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.saveTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n },\n\n cancelCloseTiddler: {\n text: 'cancel/close',\n tooltip: 'Undo changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.cancelTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n }\n\n});\n\n//}}}\n\n
/***\n| Name|SelectPalettePlugin|\n| Description|Lets you easily change colour palette|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\n/***\n!!Usage:\n{{{<<<selectPalette>>}}}\n<<selectPalette>>\n\n!!WARNING\nWill overwrite your ColorPalette tiddler.\n***/\n\n//{{{\n\nmerge(config.macros,{\n\n setPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var paletteName = params[0] ? params[0] : tiddler.title;\n createTiddlyButton(place,"apply","Apply this palette",function(e) {\n config.macros.selectPalette.updatePalette(tiddler.title);\n return false;\n });\n }\n },\n\n selectPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyDropDown(place,this.onPaletteChange,this.getPalettes());\n },\n\n getPalettes: function() {\n var result = [\n {caption:"-palette-", name:""},\n {caption:"(Default)", name:"(default)"}\n ];\n var tagged = store.getTaggedTiddlers("palette","title");\n for(var t=0; t<tagged.length; t++) {\n var caption = tagged[t].title;\n var sliceTitle = store.getTiddlerSlice(caption,"Name");\n if (sliceTitle)\n caption = sliceTitle;\n result.push({caption:sliceTitle, name:tagged[t].title});\n }\n return result;\n },\n\n onPaletteChange: function(e) {\n config.macros.selectPalette.updatePalette(this.value);\n return true;\n },\n\n updatePalette: function(title) {\n if (title != "") {\n store.deleteTiddler("ColorPalette");\n if (title != "(default)")\n store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),\n config.options.txtUserName,undefined,"");\n this.refreshPalette();\n if(config.options.chkAutoSave)\n saveChanges(true);\n }\n },\n\n refreshPalette: function() {\n config.macros.refreshDisplay.onClick();\n }\n }\n});\n\nconfig.shadowTiddlers.OptionsPanel = "<<selectPalette>>\sn\sn" + config.shadowTiddlers.OptionsPanel;\n\n//}}}\n\n
<html><a rel="license" href="">\n<img alt="Creative Commons License" style="border-width:0" src="" />\n</a>\n<br />This \n<span xmlns:dc="" href="" rel="dc:type">work</span> is licensed under a \n<a rel="license" href="">Creative Commons Attribution-Share Alike 3.0 License</a>.</html>
ShareME WIki
!Introduction\nWith several years of programing experience I thought it would be time to set up a wiki with resources. This shareme wiki covers both enterprise and mobile technology with technical resources, articles, and etc. Some of the technology covered is java but there are also other programming technologies covered.\n\n!Presence\n[img[tooltip="My Twitter"|icon_twitter.png][link=""]] [img[tooltip="My Jaiku"|jaiku-sms.png][link=""]][img[tooltip="MY 30boxes Calendar"|30boxes_icon.png][link=""]][img[tooltip="My JRoller Blog:ShareME"|roller_icon.png][link=""]][img[tooltip="My ClaimID"|claimid_icon.png][link=""]]\n\n!Communities\n[img[tooltip="TheServerSide"|tss_icon.png][link=""]][img[tooltip="j2meforums"|j2meforums_icon.png][link=""]][img[tooltip="eclipsezone"|eclipsezone_icon.png][link=""]][img[tooltip="javalobby"|javal;obby_icon.png][link=""]][img[tooltip="java net"|java_net_icon.png][link=""]][img[tooltip="javaranch"|javaranch_icon.png][link=""]]\n\n!My Articles and Presentations\nApacheAntArticles\nJavameArticles\nJavaeeArticles\nEclipseArticles\nMobileTechnologyArticles\nRollerArticles\nOtherDevToolArticles\nWebTechnologyArticles\n\n\n\n<<QOTD Quotations>>\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright\n
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>
a reusable non-linear wiki about Enterprise and Mobile Technology
Shareme Wiki
/***\n\n''Inspired by [[TiddlyPom|]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location||\n|Version|0.21 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nwindow.old_lewcid_splash_restart=window.restart;\n\nwindow.restart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n if (document.getElementById("contentWrapper"))\n document.getElementById("contentWrapper").style.display = "block";\n \n window.old_lewcid_splash_restart();\n \n if (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n}\n\n\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n//}}}
/***\n|Name|TableOfContentsPlugin|\n|Source||\n|Version|2.3.2|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|replace the standard tabbed contents list with a scrolling listbox|\n\nWhen there are many tiddlers in a document, the standard 'tabbed list of tiddlers' in the right-hand sidebar can become very long, occupying a lot of page space and requiring a lot scrolling in order to locate and select a tiddler.\n\nThe TableOfContentsPlugin addresses this problem by replacing the standard tabbed list display with a single listbox/droplist control that uses a very small amount of page space, regardless of the number of tiddlers in the document.\n\n!!!!!Usage\n<<<\nTo view a tiddler, simply select (or double-click) its title from the listbox and it will automatically be displayed on the page. The listbox also includes special 'command' items that determine the order and type of tiddlers that are shown in the list:\n\n''[by title]'' displays all tiddlers in the document.\n''[by date/author/tags]'' displays indented sections, sorted accordingly, with headings (indicated by a '+') that can be expanded, one at a time, to view the list of tiddlers in that section.\n''[missing]'' displays tiddlers that have been referenced within the document but do not yet exist.\n''[orphans]'' displays tiddlers that do exist in the document but have not been referenced by a link from anywhere else within the document.\n''[system]'' displays special tiddlers that are used by TiddlyWiki to configure built-in features and add-on macros/extensions. The list includes all tiddlers tagged with <<tag systemTiddlers>> ("templates") or <<tag systemConfig>> (plug-in extensions), plus any 'shadow tiddlers' (built-in default systemTiddlers) that have not been over-ridden by custom tiddler definitions.\n\nThe current list ''display setting is indicated by an arrow (">")'' symbol to the left of command item. Selecting a command item causes the listbox to be reloaded with the appropriate contents and sort order.\n\nWhen you are viewing a list of tiddlers by date/author/tags, ''shift-clicking'' on a section heading or command item causes the listbox display to ''toggle between "show-one-section-at-a-time" and "expand-all-sections"'' display options, allowing you to quickly see all tiddler titles at once without having to view individual indented sections one at a time.\n\nThe ''size of the listbox can be adjusted'' so you can view more (or less) tiddler titles at one time. Select ''[-]'' to reduce the size by one line, ''[+]'' to increase the size by one line, or ''[=]'' to autosize the list to fit the current contents (toggles on/off). //Note: If the listbox is reduced to a single line, it displayed as a droplist instead of a fixed-sized listbox.// You can ''show/hide the entire listbox'' by selecting the "contents" label that appears above the listbox.\n<<<\n!!!!!Control Panel\n<<<\nBy default, tiddlers tagged with <<tag excludeLists>>, are omitted from the TableOfContents so that 'system' tiddlers (e.g. MainMenu, SiteTitle, StyleSheet, etc.) can be hidden, reducing "information overload" and making it easier to select relevant tiddlers when reading your document. However, when //editing// your document, including these hidden tiddlers in the list can be more helpful, so that changes to the menus, titles, styles, etc. can be more quickly accomplished.\n----\n''To include hidden tiddlers in the TableOfContents display, select the following option:''\n<<option chkTOCIncludeHidden>> include hidden tiddlers in TableOfContents(ignores <<tag excludeLists>> tag)\n^^note: this setting is ignored when ''<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP'' is enabled^^\n<<<\n!!!!!Parameters\n<<<\nThe macro accepts optional parameters to control various features and functions:\n* ''{{{label:text}}}''\nReplace the default text ("contents") that appears above the TableOfContents listbox. //Note: to include spaces in the label text, you must enclose the entire parameter in quotes// (e.g., {{{"label:my list of tiddlers"}}})\n* ''{{{sort:fieldtype}}}''\nSets the initial display order for items in the listbox. 'fieldtype' is one of the following pre-defined keywords: ''title'', ''modified'' //(date)//, ''modifier'' //(author)//, ''tags'', ''missing'', ''orphans'', or ''system''\n* ''{{{date:format}}}''\nControls the formatting of dates in TableOfContents display. 'format' is a text-substitution template containing one or more of the following special notations.\n** DDD - day of week in full (eg, "Monday")\n** DD - day of month, 0DD - adds leading zero, DDth adds suffix\n** MMM - month in full (eg, "July")\n** MM - month number, 0MM - adds leading zero\n** YYYY - full year, YY - two digit year\n//Note: to include spaces in the formatting template, you must enclose the entire parameter in quotes// (e.g., {{{"date:DDD, DD/MM/YY"}}})\n* ''{{{size:nnn}}}''\nSets the initial number of lines to display in the listbox. If this parameter is omitted or "size:1" is specified, a single-line droplist is created. When a size > 1 is provided, a standard, fixed-size scrollable listbox is created. You can use "size:0" or "size:auto" to display a varible-height listbox that automatically adjusts to fit the current list contents without scrolling.\n* ''{{{width:nnn[cm|px|em|%]}}}''\nSets the width of the listbox control. Overrides the built-in CSS width declaration (=100%). Use standard CSS width units (cm=centimeters, px=pixels, em=M-space, %=proportional to containing area). You can also use a ".TOCList" custom CSS class definition to override the built-in CSS declarations for the listbox.\n* ''{{{padding:nnn[cm|px|em|%]}}}''\nOverrides default listbox control padding. Sets the CSS padding style.\n* ''{{{margin:nnn[cm|px|em|%]}}}''\nOverrides default listbox control spacing. Sets the CSS margin style.\n* ''{{{prompt}}}''\nSets the non-selectable prompt text that is displayed as the first line of the listbox //(note: this feature is not supported by the listbox control on all browsers)//. Let's you include a short text message (such as "select a tiddler"), even when displaying a compact single-line droplist.\n* ''{{{inline}}}''\nNormally, the TableOfContents plugin is contained inside a {{{<div>}}} element. This setting causes the plugin to use a {{{<span>}}} instead, allowing for more flexible 'inline' placement when embedded within other content.\n* ''{{{hidelist}}}''\nHides the listbox when the TableOfContents is first displayed. Initially, only the listbox label and size controls will appear. Clicking on the listbox label text will alternately show/hide the listbox display. //Note: this setting does not affect the content of the listbox, only whether or not it is initially visible.//\n* ''{{{-title}}}''\nOmit "by title" command item and corresponding listbox content. \n* ''{{{-date}}}''\nOmit "by date" command item and corresponding listbox content. \n* ''{{{-author}}}''\nOmit "by author" command item and corresponding listbox content. \n* ''{{{-tags}}}''\nOmit "by tags" command item and corresponding listbox content. \n* ''{{{-missing}}}''\nOmit "missing" command item and corresponding listbox content. \n* ''{{{-orphans}}}''\nOmit "orphans" command item and corresponding listbox content. \n* ''{{{-system}}}''\nOmit "system" command item and corresponding listbox content. \n<<<\n!!!!!Examples\n<<<\n<<tableOfContents "label:all tiddlers" sort:title width:40% size:1>>\n<<tableOfContents "label:by date" sort:modified size:1 width:40%>>\n<<tableOfContents "label:tagged tiddlers" sort:tags size:1 width:40%>>\n<<tableOfContents "label:system tiddlers" sort:system size:1 width:40%>>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TableOfContentsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for TableOfContents handling^^\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<tableOfContents>>}}} macro^^\n\n<<<\n!!!!!Revision History\n<<<\n''2007.03.22 [2.3.2]'' in refreshTOCLists(), when sorting by date, use convertToLocalYYYYMMDDHHMM() instead of formatString() to compare dates for 'section headings' and only use formatString() when actually generating the section heading date display. Improves performance significantly for date sorted listbox, especially in documents with hundreds of tiddlers. Suggestion by AndreasHoefler.\n''2007.03.21 [2.3.1]'' in refreshTOCLists(), only get list of 'select' elements, instead of scanning through all elements (saves significant time during refresh events. Suggestion by AndreasHoefler.\n''2006.11.27 [2.3.0]'' added ability to omit sections from listbox via macro params (e.g., "-date -tags", etc.). Based on request from DavidWinfield.\n''2006.05.21 [2.2.7]'' added onkeyup handling for enter key (=view selected tiddler, equivalent to double-click)\n''2006.02.14 [2.2.6]'' FF1501 fix: add 'var r' and 'var k' to unintended global variable declarations in refreshTOCList() and getTOCListFromButton(). Thanks for report from AndreasHoefler.\n''2006.02.04 [2.2.5]'' add 'var' to unintended global variable declarations to avoid FireFox crash bug when assigning to globals\n''2005.12.21 [2.2.2]'' in onClickTOCList() and onDblClickTOCList(), prevent mouse events from 'bubbling' up to other handlers\n''2005.10.30 [2.2.1]'' in refreshTOCList(), fixed calculation of "showHidden" to check for 'readOnly' (i.e., "via HTTP") flag. Based on a report from LyallPearce\n''2005.10.30 [2.2.0]'' hide tiddlers tagged with 'excludeLists' (with option to override, i.e., "include hidden tiddlers")\n''2005.10.09 [2.1.0]'' combined documentation and code in a single tiddler\nadded click toggle for expand-all vs. show-one-branch\n''2005.08.07 [2.0.0]'' major re-write to not use static ID values for listbox controls, so that multiple macro instances can exist without corrupting each other or the DOM. Moved HTML and CSS definitions into plugin code instead of using separate tiddlers. Added macro parameters for label, sort, date, size, width, hidelist and showtabs\n''2005.08.03 [1.0.3]'' added "showtabs" optional parameter\n''2005.07.27 [1.0.2]'' core update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet(). Added show/hide toggle (click on 'contents' link)\n''2005.07.23 [1.0.1]'' added parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.tableOfContents = {major: 2, minor: 3, revision: 2, date: new Date(2007,3,22)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\n// define defaults for cookie-based option values\nif (config.options.txtTOCSortBy==undefined) config.options.txtTOCSortBy="modified";\nif (config.options.txtTOCListSize==undefined) config.options.txtTOCListSize=19;\nif (config.options.chkTOCShow==undefined) config.options.chkTOCShow=true;\nif (config.options.chkTOCIncludeHidden==undefined) config.options.chkTOCIncludeHidden=false;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTOCIncludeHidden>> include hidden tiddlers in TableOfContents";\n\n// define macro "tableOfContents" to render controls\nconfig.macros.tableOfContents = { label: "contents" };\nconfig.macros.tableOfContents.cmdMax=7; // index of maximum command item\n\nconfig.macros.tableOfContents.css = '\s\n.TOC { padding:0.5em 1em 0.5em 1em; }\s\n.TOC a { padding:0em 0.25em 0em 0.25em; color:inherit; }\s\n.TOCList { width: 100%; font-size:8pt; margin:0em; }\s\n';\n\nconfig.macros.tableOfContents.html = '\s\n<div style="text-align:right">\s\n <span style="float:left">\s\n <a href="JavaScript:;" id="TOCMenu" style="padding: 0em;"\s\n onclick="onClickTOCMenu(this)" title="show/hide table of contents">%label%</a>\s\n </span>\s\n <a href="JavaScript:;" id="TOCSmaller" style="display:inline"\s\n onclick="resizeTOC(this)" title="reduce list size">&#150;</a>\s\n <a href="JavaScript:;" id="TOCLarger"style="display:inline"\s\n onclick="resizeTOC(this)" title="increase list size">+</a>\s\n <a href="JavaScript:;" id="TOCMaximize"style="display:inline"\s\n onclick="resizeTOC(this)" title="maximize/restore list size">=</a>\s\n</div>\s\n';\n\nconfig.macros.tableOfContents.handler = function(place,macroName,params) { \n var parsedParams = new Array();\n parsedParams['label']=this.label;\n parsedParams['inline']=false;\n while (params.length>0) {\n if (params[0]=="label:none")\n parsedParams['label']="";\n else if (params[0].substr(0,6)=="label:")\n parsedParams['label']=params[0].substr(6);\n if (params[0].substr(0,7)=="prompt:")\n parsedParams['prompt']=params[0].substr(7);\n if (params[0].substr(0,8)=="padding:")\n parsedParams['padding']=params[0].substr(8);\n if (params[0].substr(0,7)=="margin:")\n parsedParams['margin']=params[0].substr(7);\n if (params[0].substr(0,5)=="sort:")\n parsedParams['sortby']=params[0].substr(5);\n if (params[0].substr(0,5)=="date:")\n parsedParams['date']=params[0].substr(5);\n if ((params[0]=="size:auto")||(params[0]=="size:0"))\n parsedParams['autosize']=true;\n else if (params[0] && (params[0].substr(0,5)=="size:"))\n parsedParams['requestedSize']=params[0].substr(5);\n if (params[0].substr(0,6)=="width:")\n parsedParams['width']=params[0].substr(6);\n if (params[0]=="hidelist")\n parsedParams['hidelist']=true;\n if (params[0]=="inline")\n parsedParams['inline']=true;\n if (params[0]=="-title")\n parsedParams['hide_title']=true;\n if (params[0]=="-date")\n parsedParams['hide_date']=true;\n if (params[0]=="-author")\n parsedParams['hide_author']=true;\n if (params[0]=="-tags")\n parsedParams['hide_tags']=true;\n if (params[0]=="-missing")\n parsedParams['hide_missing']=true;\n if (params[0]=="-orphans")\n parsedParams['hide_orphans']=true;\n if (params[0]=="-system")\n parsedParams['hide_system']=true;\n params.shift(); \n }\n setStylesheet(config.macros.tableOfContents.css,"tableOfContents");\n var newTOC=createTiddlyElement(place,parsedParams['inline']?"span":"div",null,"TOC",null)\n if (parsedParams['margin']) {['margin']; }\n if (parsedParams['padding']) {['padding']; }\n if (parsedParams['label']!="") newTOC.innerHTML=config.macros.tableOfContents.html.replace(/%label%/,parsedParams['label']);\n var newTOCList=createTOCList(newTOC,parsedParams)\n refreshTOCList(newTOCList);\n store.addNotification(null,reloadTOCLists); // reload listbox after every tiddler change\n}\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onChangeTOCList=onChangeTOCList;\nwindow.onClickTOCList=onClickTOCList;\nwindow.onDblClickTOCList=onDblClickTOCList;\nwindow.reloadTOCLists=reloadTOCLists;\nwindow.refreshTOCList=refreshTOCList;\nwindow.onClickTOCMenu=onClickTOCMenu;\nwindow.resizeTOC=resizeTOC;\n \nfunction createTOCList(place,params)\n{\n var theList = createTiddlyElement(place,"select",null,"TOCList",params['prompt'])\n theList.params=params;\n theList.onchange=onChangeTOCList;\n theList.onclick=onClickTOCList;\n theList.ondblclick=onDblClickTOCList;\n theList.onkeyup=onKeyUpTOCList;\n ? "block" : "none" ;\n theList.sortBy=config.options.txtTOCSortBy;\n theList.dateFormat="DD MMM YYYY";\n theList.requestedSize=config.options.txtTOCListSize;\n theList.expandall=false;\n theList.cmdMax=config.macros.tableOfContents.cmdMax;\n if (params['hide_title']) theList.cmdMax--;\n if (params['hide_date']) theList.cmdMax--;\n if (params['hide_author']) theList.cmdMax--;\n if (params['hide_tags']) theList.cmdMax--;\n if (params['hide_missing']) theList.cmdMax--;\n if (params['hide_orphans']) theList.cmdMax--;\n if (params['hide_system']) theList.cmdMax--;\n if (params['sortby'])\n { theList.sortBy=params['sortby']; theList.noSortCookie=true; }\n if (params['date'])\n { theList.dateFormat=params['date']; }\n if (params['autosize'])\n { theList.autosize=true; theList.noSizeCookie=true; }\n if (params['requestedSize'])\n { theList.requestedSize=params['requestedSize']; theList.noSizeCookie=true; }\n if (params['width'])\n {['width']; }\n if (params['hidelist'])\n { ="none" ; theList.noShowCookie=true; }\n if (params['expandall'])\n { theList.expandall=true; }\n return theList;\n}\n\nfunction onChangeTOCList()\n{\n var thisTiddler=this.options[this.selectedIndex].value;\n if ((this.size==1)&&(thisTiddler!='')&&(this.selectedIndex>this.cmdMax))\n story.displayTiddler(null,thisTiddler,1);\n refreshTOCList(this);\n return false;\n}\n\nfunction onClickTOCList(e)\n{\n\n if (!e) var e = window.event;\n if (this.size==1)\n return; // don't toggle display for droplist\n if (e.shiftKey)\n { this.expandall=!this.expandall; refreshTOCList(this);}\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();\n return true;\n}\n\nfunction onDblClickTOCList(e)\n{\n if (!e) var e = window.event;\n var thisTiddler=this.options[this.selectedIndex].value;\n if ((thisTiddler!='')&&(this.selectedIndex>this.cmdMax))\n story.displayTiddler(null,thisTiddler,1);\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nfunction onKeyUpTOCList(e)\n{\n if (!e) var e = window.event;\n if (e.keyCode!=13) return true;\n var thisTiddler=this.options[this.selectedIndex].value;\n if ((thisTiddler!='')&&(this.selectedIndex>this.cmdMax))\n story.displayTiddler(null,thisTiddler,1);\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nfunction reloadTOCLists()\n{\n var all=document.all? document.all.tags("select") : document.getElementsByTagName("select");\n for (var i=0; i<all.length; i++)\n if (all[i].className=="TOCList")\n { all[i].selectedIndex=-1; refreshTOCList(all[i]); }\n}\n \nfunction refreshTOCList(theList)\n{\n // DEBUG var starttime=new Date();\n var selectedIndex = theList.selectedIndex;\n if (selectedIndex==-1) selectedIndex=0;\n var sortBy = theList.sortBy;\n var showHidden = config.options.chkTOCIncludeHidden\n && !(config.options.chkHttpReadOnly && readOnly);\n\n if (selectedIndex==0) sortBy=theList.sortBy; // "nnn tiddlers" heading\n else if (selectedIndex<=theList.cmdMax)\n sortBy=theList.value;\n else {\n if (theList.options[theList.selectedIndex].value=='') expandTOC(theList);\n return;\n }\n theList.sortBy = sortBy;\n if (!theList.noSortCookie)\n { config.options.txtTOCSortBy=sortBy; saveOptionCookie("txtTOCSortBy"); }\n\n // get the list of tiddlers and filter out 'hidden' tiddlers (i.e., tagged with "excludeLists")\n var tiddlers = [];\n switch (sortBy) {\n case "missing":\n tiddlers = store.getMissingLinks();\n break;\n case "tags":\n tiddlers = store.getTags();\n break;\n case "orphans":\n var titles = store.getOrphans();\n for (var t = 0; t < titles.length; t++)\n if (showHidden || store.getTiddler(titles[t]).tags.find("excludeLists")==null)\n tiddlers.push(titles[t]);\n break;\n case "system":\n var temp = store.getTaggedTiddlers("systemTiddlers");\n for (var t = 0; t < temp.length; t++)\n if (showHidden || temp[t].tags.find("excludeLists")==null)\n tiddlers.pushUnique(temp[t].title,true);\n var temp = store.getTaggedTiddlers("systemConfig");\n for (var t = 0; t < temp.length; t++)\n if (showHidden || temp[t].tags.find("excludeLists")==null)\n tiddlers.pushUnique(temp[t].title,true);\n for (var t in config.shadowTiddlers) tiddlers.pushUnique(t,true);\n tiddlers.sort();\n break;\n default:\n var temp = store.getTiddlers(sortBy);\n for (var t = 0; t < temp.length; t++)\n if (showHidden || temp[t].tags.find("excludeLists")==null)\n tiddlers.push(temp[t]);\n }\n\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n theList.saved=null;\n\n // add heading and control items to list\n var i=0;\n var theHeading=tiddlers.length+' tiddlers:';\n if (sortBy=='missing') theHeading=tiddlers.length+' missing tiddlers:';\n if (sortBy=='orphans') theHeading=tiddlers.length+' orphaned tiddlers:';\n if (sortBy=='tags') theHeading=tiddlers.length+' tags:';\n if (sortBy=='system') theHeading=tiddlers.length+' system tiddlers:';\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var sel=">";\n theList.options[i++]=new Option(theHeading,'',false,false);\n if (!theList.params['hide_title']) \n theList.options[i++]=new Option(((sortBy=="title")?sel:indent)+' [by title]','title',false,false);\n if (!theList.params['hide_date']) \n theList.options[i++]=new Option(((sortBy=="modified")?sel:indent)+' [by date]','modified',false,false);\n if (!theList.params['hide_author']) \n theList.options[i++]=new Option(((sortBy=="modifier")?sel:indent)+' [by author]','modifier',false,false);\n if (!theList.params['hide_tags']) \n theList.options[i++]=new Option(((sortBy=="tags")?sel:indent)+' [by tags]','tags',false,false);\n if (!theList.params['hide_missing']) \n theList.options[i++]=new Option(((sortBy=="missing")?sel:indent)+' [missing]','missing',false,false);\n if (!theList.params['hide_orphans']) \n theList.options[i++]=new Option(((sortBy=="orphans")?sel:indent)+' [orphans]','orphans',false,false);\n if (!theList.params['hide_system']) \n theList.options[i++]=new Option(((sortBy=="system")?sel:indent)+' [system]','system',false,false);\n // output the tiddler list\n switch(sortBy)\n {\n case "title":\n for (var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n // continue with same logic as for 'modifier'...\n case "modifier":\n var lastSection = "";\n for (var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sortBy=="modified") theSection = tiddler.modified.convertToLocalYYYYMMDDHHMM().substr(0,8);\n if (sortBy=="modifier") theSection = tiddler.modifier;\n if (theSection != lastSection)\n {\n lastSection = theSection;\n if (sortBy=="modified") theSection = tiddler.modified.formatString(theList.dateFormat);\n theList.options[i++] = new Option('+ '+theSection,"",false,false);\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n expandTOC(theList);\n break;\n case "tags":\n // tagged tiddlers, by tag\n var tagcount=0;\n var lastTag = null;\n for (var t = 0; t < tiddlers.length; t++) // actually a list of tags, not tiddlers...\n {\n var theTag = tiddlers[t][0];\n var tagged = new Array();\n var temp = store.getTaggedTiddlers(theTag);\n for(var r=0; r<temp.length; r++)\n if (showHidden || temp[r].tags.find("excludeLists")==null)\n tagged.push(temp[r]);\n if (tagged.length)\n {\n tagcount++;\n theList.options[i++]= new\n Option('+ '+theTag+" ("+tagged.length+")","",false,false);\n for(var r=0; r<tagged.length; r++)\n theList.options[i++] = new\n Option(indent+indent+tagged[r].title,tagged[r].title,false,false);\n }\n }\n // count untagged tiddlers\n var temp = store.getTiddlers("title");\n var c=0; for (var r=0; r<temp.length;r++) if (!temp[r].tags.length) c++;\n // create 'pseudo-tag' listing untagged tiddlers (if any)\n if (c>0)\n {\n theList.options[i++] = new Option("+ untagged ("+c+")","",false,false);\n for (var r=0; r<temp.length;r++) if (!temp[r].tags.length)\n theList.options[i++] = new\n Option(indent+indent+temp[r].title,temp[r].title,false,false);\n }\n theList.options[0].text=tagcount+' tags:';\n expandTOC(theList);\n break;\n case "missing":\n case "orphans":\n case "system":\n for (var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t],tiddlers[t],false,false);\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n // DEBUG var endtime=new Date();\n // DEBUG alert("refreshTOC() elapsed time: "+(endtime-starttime)+" msec");\n}\n\n// show/hide branch of TOCList based on current selection\nfunction expandTOC(theList)\n{\n var selectedIndex = theList.selectedIndex;\n if (selectedIndex==-1) selectedIndex=0;\n var sortBy = theList.sortBy;\n\n // don't collapse/expand list for alpha-sorted "flatlist" TOC contents\n if ((sortBy=="title")||(sortBy=="missing")||(sortBy=="orphans")||(sortBy=="system"))\n return;\n // or list control items\n if ((selectedIndex>0)&&(selectedIndex<=theList.cmdMax))\n return;\n\n var theText = theList.options[selectedIndex].text;\n var theValue = theList.options[selectedIndex].value;\n // save fully expanded list contents (if not already saved)\n if (!theList.saved)\n {\n theList.saved = new Array();\n for (var i=0; i < theList.length; i++)\n {\n opt = theList.options[i];\n theList.saved[i] = new Option(opt.text, opt.value, opt.defaultSelected, opt.selected);\n }\n }\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n\n // put back all items \n if (theList.expandall)\n {\n var i=0;\n for (var t=0; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n if (opt.text==theText) selectedIndex=i-1;\n }\n theList.selectedIndex = selectedIndex;\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n return;\n }\n\n // put back heading items until item text matches current selected heading\n var i=0;\n for (var t=0; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n if ((opt.value=='')||(i<=theList.cmdMax))\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n if (opt.text==theText)\n break;\n }\n selectedIndex=i-1; // this is the NEW index of the current selected heading\n // put back items with value!='' until value==''\n for ( t++; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n if (opt.value!='')\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n if (opt.value=='')\n break;\n }\n // put back remaining items with value==''\n for ( ; t<theList.saved.length; t++)\n {\n var opt=theList.saved[t];\n if (opt.value=='')\n theList.options[i++] = new Option(opt.text,opt.value,opt.defaultSelected,opt.selected);\n }\n theList.selectedIndex = selectedIndex;\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n}\n\n// these functions process clicks on the 'control links' that are displayed above the listbox\nfunction getTOCListFromButton(which)\n{\n var theList = null;\n switch (\n {\n case 'TOCMenu':\n var theSiblings = which.parentNode.parentNode.parentNode.childNodes;\n var;\n break;\n case 'TOCSmaller':\n case 'TOCLarger':\n case 'TOCMaximize':\n var theSiblings = which.parentNode.parentNode.childNodes;\n var;\n break;\n }\n for (var k=0; k<theSiblings.length; k++)\n if (theSiblings[k].className=="TOCList") { theList=theSiblings[k]; break; }\n // DEBUG if (theList) alert('found '+theList.className+' for '' button in '+thePlace);\n return theList;\n}\n\nfunction onClickTOCMenu(which)\n{\n var theList=getTOCListFromButton(which);\n if (!theList) return;\n var opening ="none";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theList,opening,false,"none"));\n else\n = opening ? "block" : "none" ;\n if (!theList.noShowCookie)\n { config.options.chkTOCShow = opening; saveOptionCookie("chkTOCShow"); }\n return(false);\n}\n\nfunction resizeTOC(which)\n{\n var theList=getTOCListFromButton(which);\n if (!theList) return;\n\n var size = theList.size;\n if ("none") // make sure list is visible\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theList,true,false,"none"));\n else\n = "block" ;\n switch (\n {\n case 'TOCSmaller': // decrease current listbox size\n if (theList.autosize) { theList.autosize=false; size=config.options.txtTOCListSize; }\n if (size==1) break;\n size -= 1; // shrink by one line\n theList.requestedSize = theList.size = size;\n break;\n case 'TOCLarger': // increase current listbox size\n if (theList.autosize) { theList.autosize=false; size=config.options.txtTOCListSize; }\n if (size>=theList.options.length) break;\n size += 1; // grow by one line\n theList.requestedSize = theList.size = size;\n break;\n case 'TOCMaximize': // toggle autosize\n theList.autosize = (theList.size!=theList.options.length);\n theList.size = (theList.autosize)?theList.options.length:theList.requestedSize;\n break;\n }\n if (!theList.noSizeCookie && !theList.autosize)\n { config.options.txtTOCListSize=size; saveOptionCookie("txtTOCListSize"); }\n}\n//}}}\n
/***\n|Name|TagCloudPlugin|\n|Source||\n|Version|0.0.0|\n|Author|Clint Checketts|\n|License|unknown|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description||\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| Name|TagglyTaggingPlugin|\n| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version|3.0 ($Rev: 2101 $)|\n| Date|$Date: 2007-04-20 00:24:20 +1000 (Fri, 20 Apr 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\n!Notes\nSee\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':",\n excerpts: "excerpts",\n noexcerpts: "no excerpts"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"],\n excerpts: ["noexcerpts","excerpts"]\n },\n valuePrefix: "taggly.",\n excludeTags: ["excludeLists","excludeTagging"],\n excerptSize: 50,\n excerptMarker: "/%"+"%/"\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n getExcerpt: function(inTiddlerTitle,title) {\n if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {\n var t = store.getTiddler(title);\n if (t) {\n var text = t.text.replace(/\sn/," ");\n var marker = text.indexOf(this.config.excerptMarker);\n if (marker != -1) {\n return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";\n }\n else if (text.length < this.config.excerptSize) {\n return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";\n }\n else {\n return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";\n }\n }\n }\n return "";\n },\n\n notHidden: function(t,inTiddler) {\n if (typeof t == "string") \n t = store.getTiddler(t);\n return (!t || !t.tags.containsAny(this.config.excludeTags) ||\n (inTiddler && this.config.excludeTags.contains(inTiddler)));\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n var first = true;\n for (var i=0;i<list.length;i++) {\n if (this.notHidden(list[i],title)) {\n var countString = this.getTaggingCount(list[i].title);\n var excerpt = this.getExcerpt(title,list[i].title);\n if (useCommas)\n output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);\n else\n output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\sn");\n\n first = false;\n }\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (this.notHidden(list[i].tags[j],title)) {\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n if (this.notHidden(list[i],title)) {\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\sn";\n\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n\n }\n }\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n if (this.notHidden(leftOvers[i],title))\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n if (allTagsHolder[allTags[i]] != "")\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n if (this.notHidden(list[i].title,this.config.inTiddler))\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title) + "\sn" + childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n this.config.inTiddler = title; // nasty. should pass it in to traverse probably\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"excerpts");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by TagglyTaggingPlugin */",\n".tagglyTagging { padding-top:0.5em; }",\n".tagglyTagging li.listTitle { display:none; }",\n".tagglyTagging ul {",\n" margin-top:0px; padding-top:0.5em; padding-left:2em;",\n" margin-bottom:0px; padding-bottom:0px;",\n"}",\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",\n".tagglyTagging table { margin:0px; padding:0px; }",\n".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",\n".tagglyTagging .button, .tagglyTagging .hidebutton {",\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",\n" border:0px; padding-left:0.3em;padding-right:0.3em;",\n"}",\n".tagglyTagging .button:hover, .hidebutton:hover, ",\n".tagglyTagging .button:active, .hidebutton:active {",\n" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",\n"}",\n".selected .tagglyTagging .button { visibility:visible; }",\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",\n".tagglyTagging ul ul li {margin-left:0.5em; }",\n".editLabel { font-size:90%; padding-top:0.5em; }",\n".tagglyTagging .commas { padding-left:1.8em; }",\n"/* not technically tagglytagging but will put them here anyway */",\n".tagglyTagged li.listTitle { display:none; }",\n".tagglyTagged li { display: inline; font-size:90%; }",\n".tagglyTagged ul { margin:0px; padding:0px; }",\n".excerpt { color:[[ColorPalette::TertiaryMid]]; }",\n"div.tagglyTagging table,",\n"div.tagglyTagging table tr,",\n"td.tagglyTagging",\n" {border-style:none!important; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
!Introduction\nlinks to Technical Presentations can be found at this page.\n\n!Java\n[[JavaPolis|]]\n[[JavaOne|]]\n[[EclipseCon|]]\n
/***\n|Name|TextAreaPlugin|\n|Source||\n|Version|2.1.3|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Story.prototype.focusTiddler|\n|Description|Adds extra keyboard functions to the standard textarea control in the tiddler editor|\n\n''Control-F'' and ''control-G'' will ''"Find text"'' and ''"find text aGain"'', respectively, allowing you to copy, find, paste, findagain, paste, etc to perform "search-and-replace" actions. The plugin also adds an ''autosize toolbar'' command and ''resizeEditor macro'' (to be placed in the EditTemplate) to permit on-the-fly adjustment of the tiddler editor text area height.\n\n* ''autosizeEditor'' - toggles the tiddler editor textarea height between fixed-height and "automatically fit the contents".\n* ''resizeEditor'' - adds 'grab handle' below textarea to stretch field height\n!!!!!Configuration\n<<<\nenable\n<<option chkTextAreaExtensions>> use control-f (find), control-g (find again) inside text area\n<<option chkDisableAutoSelect>> place cursor at start of textarea instead of pre-selecting content\n<<option chkResizeEditor>> modify shadow EditTemplate to add resizeable text area (and autosize command)\n> Note: if you are using the default (shadow) EditTemplate, the plugin automatically updates the template to include the ''autosizeEditor'' toolbar command and ''resizeEditor'' macro. If you have created a custom EditTemplate tiddler, you will need to manually add the ''autosizeEditor'' toolbar command and ''resizeEditor'' macro to your existing template:\n{{{\n<!-- add 'autosizeEditor' command to end of existing editor toolbar definition -->\n<div class='toolbar' macro='toolbar ... autosizeEditor'>\n}}}\nand\n{{{\n<!-- add span with 'resizeEditor' macro anywhere in the edit template -->\n<span macro='resizeEditor'></span>\n}}}\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''TextAreaPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.04.29 [2.1.3]'' in addKeyDownHandlers(), used 'findText' instead of 'find', hopefully to avoid strict ECMAScript1.5 error on certain browsers.\n''2007.03.01 [2.1.2]'' use apply() to invoke hijacked core function\n''2006.11.16 [2.1.0]'' restored chkDisableAutoSelect (place cursor at start of textarea instead of pre-selecting content)\n''2006.11.16 [2.0.0]'' removed chkDisableEscapeKey (obsolete... use custom EditTemplate to change toolbar definition). Rewrote focusTiddler as a HIJACK instead of just overwriting core function (permits other plugins to also hijack function). Removed TAB character processing (now built-in as of TW2.1). Merged code from ResizeEditorPlugin:\n> ''2006.11.16 [1.3.x]'' merged with TextAreaPlugin\n> ''2006.11.02 [1.3.1]'' in DragMove() and DragStop(), check for undefined properties so IE doesn't report "Not Implemented" error when property is referenced without having been previously initialized.\n> ''2006.11.01 [1.3.0]'' added 'resizeEditor' MACRO for 'grab handle' stretch resizing (based on code from Jon Scully and Jason Johnston ( \n> ''2006.11.01 [1.2.6]'' removed increaseEditor, decreaseEditor, and resizeEditor toolbar COMMAND definitions (resize by setting 'rows' property of textarea field conflicts with resize via style.height CSS attribute as set by autosize/drag).\n> ''2006.11.01 [1.2.5]'' fixed 'savedkeypress' handling (was writing to savedkeyup by mistake)\n> ''2006.10.28 [1.2.4]'' added '+' to 'saveTiddler' toolbar command (enables ctrl-enter keyhandling)\n> ''2006.10.18 [1.2.3]'' added decreaseEditor and increaseEditor commands\n> ''2006.10.18 [1.2.2]'' onkeypress handling to redirect PGUP/PGDN to window.scrollByPages() (works in FF, but not yet in IE)\n> ''2006.10.18 [1.2.1]'' fixed references to default string constants (oops!)\n> ''2006.10.18 [1.2.0]'' renamed 'resizeEditor' to 'autosizeEditor' and added new 'resizeEditor' toolbar command to prompt for # of rows to display\n> ''2006.10.02 [1.1.1]'' show checkbox in button label (when automatic resizing is enabled)\n> ''2006.10.01 [1.1.0]'' added 'onkeyup' automatic fit-to-contents handling\n> ''2006.09.30 [1.0.0]'' initial release\n''2006.08.01 [1.1.2]'' improved processed() utility function to handle IE5 and IE6, as well as calling preventDefault() for moz browsers. Thanks to Bradley Meck for research and code examples.\n''2006.07.09 [1.1.1]'' removed chkDisableAutoSelect\n''2006.02.14 [1.1.0]'' added option for chkDisableEscapeKey (default is standard action)\n''2006.01.22 [1.0.1]'' only add extra key processing for TEXTAREA elements (not other edit fields).\nadded option to enable/disable textarea keydown extensions (default is "standard keys" only)\n''2006.01.22 [1.0.0]'' Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.\n<<<\n!!!!!Credits\n<<<\n>This feature was developed by EricShulman from [[ELS Design Studios|]] with 'grab handle' stretch resizing adapted from TW code by Jon Scully and TextAreaResizer() by Jason Johnston (\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.textAreaPlugin= {major: 2, minor: 1, revision: 3, date: new Date(2007,4,29)};\n//}}}\n\n//{{{\nif (!config.options.chkTextAreaExtensions) config.options.chkTextAreaExtensions=true;\nif (!config.options.chkDisableAutoSelect) config.options.chkDisableAutoSelect=true;\nif (!config.options.chkResizeEditor) config.options.chkResizeEditor=true;\n\n// automatically tweak shadow EditTemplate to add "autosizeEditor" toolbar command\nif (config.options.chkResizeEditor)\n config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/deleteTiddler/,"deleteTiddler autosizeEditor");\n// automatically tweak shadow EditTemplate to add "resizeEditor" macro\nif (config.options.chkResizeEditor)\n config.shadowTiddlers.EditTemplate+="<span macro='resizeEditor'></span>";\n\n// Put focus in a specified tiddler field\nStory.prototype.TextAreaExtensions_focusTiddler=Story.prototype.focusTiddler;\nStory.prototype.focusTiddler = function(title,field)\n{\n this.TextAreaExtensions_focusTiddler.apply(this,arguments); // first call core\n var e = this.getTiddlerField(title,field);\n if (e && config.options.chkDisableAutoSelect) {\n if (e.setSelectionRange) // FF\n e.setSelectionRange(0,0);\n else if (e.createTextRange) // IE\n { var r=e.createTextRange(); r.collapse(true);; }\n }\n if (e && config.options.chkTextAreaExtensions) addKeyDownHandlers(e);\n}\n//}}}\n\n//{{{\nfunction addKeyDownHandlers(e)\n{\n // exit if not textarea or element doesn't allow selections\n if (e.tagName.toLowerCase()!="textarea" || !e.setSelectionRange) return;\n\n // utility function: exits keydown handler and prevents browser from processing the keystroke\n var processed=function(ev) {\n ev.cancelBubble=true; // IE4+\n try{event.keyCode=0;}catch(e){}; // IE5\n if (window.event) ev.returnValue=false; // IE6\n if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror\n if (ev.stopPropagation) ev.stopPropagation(); // all\n return false;\n }\n // capture keydown in edit field\n e.saved_onkeydown=e.onkeydown; // save current keydown handler (if any)\n e.onkeydown=function(ev) { if (!ev) var ev=window.event;\n var key=ev.keyCode;\n if (!key) {\n var char=event.which?event.which:event.charCode;\n if (char==102) key=70;\n if (char==103) key=71;\n }\n // process CTRL-F (find matching text) or CTRL-G (find next match)\n if (ev.ctrlKey && (key==70||key==71)) {\n\n // prompt for text to find\n var defFind=e.findText?e.findText:e.value.substring(e.selectionStart,e.selectionEnd);\n if (key==70||!e.findText||!e.findText.length) // ctrl-f or no saved search text\n { var f=prompt("find:", defFind); e.focus(); if (f) e.findText=f; }\n if (!e.findText||!e.findText.length) return processed(ev); // if no search text, exit\n\n // do case-insensitive match with 'wraparound'... if not found, alert and exit \n var newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase(),e.selectionStart+1);\n if (newstart==-1) newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase());\n if (newstart==-1) { alert("'"+e.findText+"' not found"); e.focus(); return processed(ev); }\n\n // set new selection, scroll it into view, and report line position in status bar\n e.setSelectionRange(newstart,newstart+e.findText.length);\n var linecount=e.value.split('\sn').length;\n var thisline=e.value.substr(0,e.selectionStart).split('\sn').length;\n e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);\n window.status="line: "+thisline+"/"+linecount;\n return processed(ev);\n }\n if (e.saved_onkeydown) // call previous keydown handler (if any)\n e.saved_onkeydown(ev);\n }\n}\n//}}}\n\n// // 'autosize' toolbar command\n//{{{\nconfig.commands.autosizeEditor = {\n text: 'autosize',\n tooltip: 'adjust the editor height to fit the contents',\n text_alt: '<input type="checkbox" style="padding:0;margin:0;border:0;background:transparent;" checked>autosize',\n tooltip_alt: 'uncheck to reset the editor to the standard height',\n hideReadOnly: false,\n handler: function(event,src,title) {\n var here=story.findContainingTiddler(src); if (!here) return;\n var ta=here.getElementsByTagName('textarea'); if (!ta) return;\n for (i=0;i<ta.length;i++) { ta[i].button=src; if (!ta[i].maxed) this.start(ta[i]); else this.stop(ta[i],true); }\n return false;\n },\n start: function(e) {\n if (!e.savedkeyup) e.savedkeyup=e.onkeyup;\n if (!e.savedkeypress) e.savedkeypress=e.onkeypress;\n;\n'px'; // NOTE "-2" adjustment... for scrollbar top+bottom border width???\n e.onkeypress=function(ev) {\n if (!ev) var ev=window.event; var e=resolveTarget(ev);\n if (ev.keyCode==33) { // PGUP\n if (window.scrollByPages) window.scrollByPages(-1);\n return false;\n }\n if (ev.keyCode==34) { // PGDN\n if (window.scrollByPages) window.scrollByPages(1);\n return false;\n }\n if (e.savedkeypress) e.savedkeypress();\n }\n e.onkeyup=function(ev) {\n if (!ev) var ev=window.event; var e=resolveTarget(ev);\n'px';\n if (e.savedkeyup) e.savedkeyup();\n }\n e.button.innerHTML=config.commands.autosizeEditor.text_alt;\n e.button.title=config.commands.autosizeEditor.tooltip_alt;\n e.maxed=true;\n },\n stop: function(e,resetHeight) {\n if (resetHeight);\n e.onkeyup=e.savedkeyup;\n e.onkeypress=e.savedkeypress;\n e.button.innerHTML=config.commands.autosizeEditor.text;\n e.button.title=config.commands.autosizeEditor.tooltip;\n e.maxed=false;\n }\n};\n//}}}\n\n// // grab-and-stretch handle for textareas\n//{{{\nconfig.macros.resizeEditor = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var here=story.findContainingTiddler(place); if (!here) return;\n var ta=here.getElementsByTagName('textarea'); if (!ta) return;\n for (i=0;i<ta.length;i++) new window.TextAreaResizer(ta[i]);\n }\n}\n\n// TextAreaResizer script by Jason Johnston (\n// Created August 2003. Use freely, but give me credit.\n// adds a handle below textareas that the user can drag with the mouse to resize the textarea.\n// MODIFIED by ELS for cross-browser (IE) compatibility, including:\n// fixups and adjustments to CSS styles,\n// use 'old style' assignment of mouse event handlers instead of using addEventListener(),\n// use window.event if event param is null,\n// use offsetHeight instead of getComputedStyle()\n// use explicit window.* global scope declaration for functions called from event handlers\n\nwindow.TextAreaResizer = function(elt) {\n this.element = elt;\n this.create();\n}\nwindow.TextAreaResizer.prototype = {\n create : function() {\n var elt = this.element;\n var thisRef = this;\n var h = this.handle = document.createElement("div");\n = "3px"; // was 4px... looked too fat!\n = "hidden"; // ELS: force IE to trim height to < 1em\n"px"; // ELS: match textarea width\n = "#999"; // ELS: standard mid-tone (dark) gray\n = "s-resize";\n h.title = "Drag to resize text box";\n h.onmousedown=function(evt){thisRef.dragStart(evt)};\n elt.parentNode.insertBefore(h, elt.nextSibling);\n },\n dragStart : function(evt) {\n if (!evt) var evt=window.event;\n this.dragStop(evt); // ELS: stop any current drag processing first\n var thisRef = this;\n this.dragStartY = evt.clientY;\n this.dragStartH = this.element.offsetHeight;\n document.savedmousemove=document.onmousemove;\n document.onmousemove=this.dragMoveHdlr=function(evt){thisRef.dragMove(evt)};\n document.savedmouseup=document.onmouseup;\n document.onmouseup=this.dragStopHdlr=function(evt){thisRef.dragStop(evt)};\n },\n dragMove : function(evt) {\n if (!evt) var evt=window.event;\n // ELS: make sure height is at least 10px\n var h=this.dragStartH+evt.clientY-this.dragStartY;\n if (h<10) h=10;"px";\n // ELS: match textarea width (which can change due to document scrollbars)\n"px";\n // ELS: when manually resizing, disable autoresizing (without restoring saved height)\n if (this.element.maxed!=undefined && this.element.maxed)\n config.commands.autosizeEditor.stop(this.element,false);\n },\n dragStop : function(evt) {\n if (!evt) var evt=window.event;\n document.onmousemove=(document.savedmousemove!=undefined)?document.savedmousemove:null;\n document.onmousemove=(document.savedmouseup!=undefined)?document.savedmouseup:null;\n },\n destroy : function() {\n var elt = this.element;\n elt.parentNode.removeChild(this.handle);\n = "";\n }\n};\n//}}}
In this article I will give an over view of Mobile 2.0 and its relationship to Web 2.0.\n\n!Beginnings of Mobile 2.0\nYou might think it is a simple mobilify web 2.0 and we are done type process, but it is more complicated than that. Mobile 2.0 seems to have been coined in the 2004 to 2006 time span to mean Web 2.0 for mobile. In this case I use the mobile definition of EU telecomms which hold that mobile means mobile data services. In the USA its referred to as wireless or cellular data services.\n\n!Mobile Geek Power, Migrating Web 2.0 to Mobile\nBasically, the challenges on the technology side is two fold. The first aspect is standardization of certain underlying technology in order to enable web 2.0 on mobile.\n\nFor example, most mobile browsers(over 30 in 2007) have different subsets of javascript that they support. Some such as mFoundry has come up with a javame solution where as the MobileAjax components including javascript are enclosed in a MIDlet thus by-passing the Mobile Web Browser.\n\nOthers have come out with mobile web frameworks building upon a certain mobile web browser javascript subset such as Opera's mobile ajax framework. Currently, there is also a movement in among the mobile web browser OEMs to standardize the javascript subset on one specific opensource library and other mobile browser libraries. Some are suggesting use of [[webkit|]], an opensource browser engine. Unlike other solutions that involve a javascript subset webkit is small enough to be able to include a full javascript core\n\n!Tear Down These Walls\nMobile 2.0 is often defined as user preferred service experience on a restricted mobile device. Unlike desktop pcs and laptops there are more restrictions of device specific functions in browser environments on mobile devices than other devices. The fancy stuff like bluetooth and etc are not accessible via mobile browser javascript.\n\nWhy? The being open to users concept is an alien concept the mobile industry. Some of the reasoning is that due to the costs of the infrastructure mobile companies want to limit access to either make back the investment or secure the network from harm or both.\n\nHowever, things have change since the 1960s when the cell phone was invented. Certainly the security policies of both the mobile operating systems and application environments such as javame at this time are enough to pacify mobile operators.\nWhile coding terminal resident server stubs per each mobile operating system to enable access to device specific functions such as bluetooth is too complex; javame MIDP 3.0 features may allow a MIDlet o tact as a terminal resident server stub and allow data to be passed from the mobile browser to this MIDLet tsr to get access to bluetooth and etc.\n\nSome signs of this approach or a precursor is how Opera codes its mobile browserr which is two parts, a MIDlet browser runtime and a mobile operating system tsr. But, even than we have certain Mobile Operators(evil CDMA operators) limiting 34d party applications unless they get their over priced revenue often jokingly referred to as the mobile mafia approach.\n\n!Conclusion\nWhile Mobile 2.0 is certainly Web 2.0 on mobile it is more complicated to get to the non technology areas of giving the user power and choice with some types of mobile operators becoming more of an obstacle.\n\n\n!References\n[[Understanding Mobile 2.0 by Rudy De Waele|]]\n[[Mobile web 2.0: Web 2.0 and its impact on the mobility and digital convergence|]]\n[[Mobile web 2.0: AJAX for mobile devices – why mobile AJAX will replace both J2ME and XHTML as the preferred platform for mobile applications development|]]\n[[Mobile web 2.0: A service blueprint|]]\n[[Mobile web 2.0: Web 2.0 and its impact on the mobility and digital convergence|]]\n[[Mobile web 2.0: AJAX for mobile devices – why mobile AJAX will replace both J2ME and XHTML as the preferred platform for mobile applications development - Part two|]]\n[[Jonghong Jeon's ETRI presentation on Mobile 2.0 in PDf format|]]\n[[The three characteristics of mobile web 2.0|]]\n[[Digital convergence = mashups|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright\n
While <<tiddlerbox "TheRealWebTwo" "TheRealWebTwo" "TheRealWebTwo">> covered Web 2.0 we are now fast approaching Web 3.0 emergence. While Web 3.0 certainly does include components of Web 2.0 such as Ajax, Social Democracy, and Respect the User; it also has some new features.\n\n!A New Web Services Architecture\nThe new web services architecture is REST which was introduced in a doctoral thesis in 2000 by Roy Fielding, one of the original authors of the HTTP specification. It stands for Representational State Transfer. Application state and functionality is defined as resources that are accessible by well defined urls(hyperli9nks).\n\nResources both on server side and client side have a universal interface that has a well defined constrained set of state operations and constrained content types. Some examples that have REST characteristics are RSS Feeds, WebDAV, JavaBeans, and SOA.\n\nThis is only one part of Web 3.0.\n\n!Semantic web: Microformats\nWe have all heard of the Semantic Web with RDF, OWL, and etc. The problem is that most web producers and consumers do have programing degrees to deal with the complexity of RDF, OWL, tuples, and etc. Enter microformats which are XHTML markups that allow everyone to tag web content with semantic information.\n\nThe other component is the browsers that are able to read microformats such as MSIE8, Firefox3, and etc. Of course the other component will be the updating of search engines to recognize and index this microformat semantic data.\n\n!Conclusion\nJust as in Web 2.0 there are technology components that are new to innovate on the server and client connection as well as technology innovations that give more power to web user and web content producer whether that content is human readable or web services in nature.\n\n\n!References\n[[Representational State Transfer(a Wikipedia article)|]]\n[[Microformats(a Wikipedia article)|]]\n
Over the years many different groups have miss understood what Web 2.0 is and thus this article serves to clear up those miss understandings.\n\n!Web 2.0 Beginnings\nIn late 1990s Microsoft came up with a new browser technology innovation called <<tiddlerbox "XMLHttpRequest" "XMLHttpRequest" "XMLHttpRequest">> object and as with the Netscape plugin technology most top browsers choose to include the technology for the good of all internet browser users. Basically, it allows a browser to make a server side request without waiting for the server to return a response. This is in direct contrast to even how html pages are served as the browser waits for the server response in order to display a normal html page to the user.\n\nIn 2004 several people gathered together to define web 2.0 as part of the drive to formulate a technology conference around web technology. Thus, they came up with not clearly defined web as a platform instead of defining what basic technology components are in Web 2.0.\n\n!In Comes Ajax\n<<tiddlerbox "XMLHttpRequest" "XMLHttpRequest" "XMLHttpRequest">> is kind of useless without some type of html page script to make ue of it in a web application. Plus, with the rejection of activex technology by most web developers <<tiddlerbox "XMLHttpRequest" "XMLHttpRequest" "XMLHttpRequest">> Object's usefulness remained dormant. Ajax was coined as a term in 2005 to denote Asynchronous <<tiddlerbox "JavaScript" "JavaScript" "JavaScript">> And XML.\n\nAjax includes CSS, XHTML, <<tiddlerbox "DocumentObjectModel" "DocumentObjectModel" "DocumentObjectModel">>, XML, XSLT, <<tiddlerbox "JavaScript" "JavaScript" "JavaScript">>, and of course the <<tiddlerbox "XMLHttpRequest" "XMLHttpRequest" "XMLHttpRequest">> object to retrieve that data in asynchronous way.\n\n!Social Democracy\nBasically, allowing the public to build and mashup the service or web application with another application and thus improving the usefulness of both and the popularity of both web 2.0 applications. Newsvine is one example of this letting users mashup their own news feeds to build their won feeds page as homepage tool.\n\nDifferent from old media in that editors are not choosing stories and thus not damping the output. Output is highlighted and selected by interactions of users with search engines and thus its somewhat non republic democracy but a web user democracy.\n\n!Respect The Users\nRespect the users because they are the 2nd tier of people that act as a profit multiplier if you choose to give them something that another company does not. In a Web Startup it is not use a MBA and crank numbers but get seed capital and give away power to the user of the web 2.0 application.\n\n!Conclusion\nWeb 2.0 is not just Ajax but a coming together of both ajax technologies and shaping web user patterns by giving power to the web users. Both technology and behavior of giving power to a web user in a web 2.0 application are very important parts o0f Web 2.0.\n\n!References\n[[What is Web 2.0 by Tim O'Reilly|]]\n[[Web 2.0 by Paul Graham|]]\n[[Ajax: A New Approach to Web Applications by Jesse James Garrett|]]\n[[A web 2.0 FAQ|]]\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
/***\n| Name:|TiddlerExcerptTooltip|\n| Source:||\n| Author:|Simon Baird, adapted from original version posted to mailing list by Udo Borkowski|\n| Version:|1.0.0|\n| Description:|Make tooltip of tiddler links the first line or excerpt of the tiddler content|\n***/\n//{{{\n\n// adjust the following to your preference\nconfig.TiddlerExcerptTooltip = {\n trimLength: 60,\n dateFormat:"DD-MM-YY"\n}\n\n// %0 is title\n// %1 is modifier\n// %2 is modified date\n// %3 is first line\n// %4 is first so many characters\n// %5 is short modified date\n// %6 is short created date\n\n// firefox seems to trim the tooltip if it gets too long...\nconfig.messages.tiddlerLinkTooltip = "%1/%5: %4";\n\nconfig.messages.tiddlerEmpty = "(empty)";\n\nTiddler.prototype.getSubtitle = function()\n{\n var theModifier = this.modifier;\n if(!theModifier)\n theModifier = config.messages.subtitleUnknown;\n var theModified = this.modified;\n if(theModified)\n theModified = theModified.toLocaleString();\n else\n theModified = config.messages.subtitleUnknown;\n\n var m = this.text.match(/\ss*(.*)/);\n var firstLine = (m != null && m.length >= 1) ? m[1] : "";\n\n var contentExcerpt = this.text.prettyTrim(config.TiddlerExcerptTooltip.trimLength);\n if (contentExcerpt == "")\n contentExcerpt = config.messages.tiddlerEmpty;\n\n var shortModified = this.modified.formatString(config.TiddlerExcerptTooltip.dateFormat);\n var shortCreated = this.created.formatString(config.TiddlerExcerptTooltip.dateFormat);\n\n\n return config.messages.tiddlerLinkTooltip.format(\n [this.title,theModifier,theModified,firstLine,contentExcerpt,shortModified,shortCreated]); \n}\n\n// this lifted from TagUtils\nString.prototype.prettyTrim = function(len,prefix,postfix) {\n var result = this.trim().replace(/\sr\sn/g,' ').replace(/[\sn|\st]/g,' ');\n if (result.length > len - 3)\n return result.trim().substr(0,len) + '...';\n else\n return result;\n}\n\n//}}}\n
/***\n|Name|TiddlerGroupsPlugin|\n|Source||\n|Version|2.2.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Define groups of tiddlers and display an entire group or navigate between tiddlers with first/previous/next/last|\n!!!!!Usage\n<<<\n* {{{<<tiddlerGroups >>}}}\n** display droplist of all tiddler groups plus commands and display options\n* {{{<<tiddlerGroups groupname action buttons>>}}}, where:\n** groupname indicates a specific group on which to operate. If groupname is omitted, the plugin automatically finds the first tiddler group that contains the current tiddler.\n** action is one of the following keywords:\n*** ''list'' displays a droplist of tiddlers for the indicated group, along with previous/next pushbuttons on either side of the list. 'buttons' is an //optional// parameter to specify which buttons will appear when using the droplist display.\n**** ''allbuttons'' displays buttons for first/last as well as previous/next.\n**** ''nobuttons'' displays the droplist without any buttons\n**** ''onlybuttons'' hides the droplist and shows just the buttons\n*** ''first'', ''next'', ''previous'', or ''last'' displays a link to the indicated tiddler within the group. The next/previous links are relative to the current tiddler.\n*** ''here'' displays the current tiddler name as a link that, when clicked refreshes (re-renders) that tiddler\n** \n<<<\n!!!!!Configuration\n<<<\nThe default droplist display includes several commands to:\n* quickly ''add a group'' to the list (using the currently displayed tiddlers)\n* ''edit the list'' so you can manually add/remove/re-order the group definitions.\n* ''set DefaultTiddlers'' (using the currently displayed tiddlers)\nNote: these commands are automatically hidden when TW is operating in 'readOnly' mode (i.e., when viewed via http:)\n\nGroups are defined in [[TiddlerGroupsList]]. Each group definition is separated by a {{{----}}} (horizontal rule), and consists of two lines of text:\n* a description (for display in the droplist) and\n* a space-separated list of tiddler titles (use {{{[[...]]}}} around titles containing spaces).\n** If you place a "+" before a tiddler title, it is replaced with a list of tiddlers that are ''//linked//'' from that tiddler (using the same format as the standard DefaultTiddlers content).\n** When a parameter is preceded by an "=", it is replaced with a list of tiddlers that are tagged with that value.\n\nThe droplist shows all tiddler groups that are currently defined in the TiddlerGroupsList, followed by several viewing options:\n* ''fold grouped tiddlers'' - if a CollapsedTemplate tiddler is defined in the document, you can automatically fold the tiddlers as they are displayed to make it easier to locate desired content without excessive scrolling. This is especially useful if the group contains many tiddlers or tiddlers with lengthy content.\n* ''close other tiddlers'' - reduce information clutter by ensuring that only the tiddlers from the selected group are displayed.\n* ''open new window'' - view the grouped tiddlers in a separate copy of the current document (not including unsaved tiddler changes)\n<<<\n!!!!!Examples\n<<<\n{{{<<tiddlerGroups>>}}}\n<<tiddlerGroups>>\n\n{{{<<tiddlerGroups "plugins">>}}}\n<<tiddlerGroups "plugins">>\n\n{{{<<tiddlerGroups "document info" list nobuttons>>}}}\n<<tiddlerGroups "document info" list nobuttons>>\n\n{{{<<tiddlerGroups "document info" list allbuttons>>}}}\n<<tiddlerGroups "document info" list allbuttons>>\n\n{{{<<tiddlerGroups "document info" list onlybuttons>>}}}\n<<tiddlerGroups "document info" list onlybuttons>>\n\n{{{<<tiddlerGroups "document info" list allbuttons onlybuttons>>}}}\n<<tiddlerGroups "document info" list allbuttons onlybuttons>>\n\n{{{<<tiddlerGroups "plugins" first "first">> <<tiddlerGroups "plugins" previous "previous">> <<tiddlerGroups "plugins" here "here">> <<tiddlerGroups "plugins" next "next">> <<tiddlerGroups "plugins" last "last">>}}}\n<<tiddlerGroups "plugins" first "first">> <<tiddlerGroups "plugins" previous "previous">> <<tiddlerGroups "plugins" here "here">> <<tiddlerGroups "plugins" next "next">> <<tiddlerGroups "plugins" last "last">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TiddlerGroupsPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revisions\n<<<\n''2007.04.23 [2.2.0]'' added "allbuttons", "nobuttons", and "onlybuttons" options for use with droplist display\n''2007.04.22 [2.1.5]'' in handler(), enable use of "first", "last" or "list" params when NOT in a tiddler (e.g., MainMenu). Note: "previous" and "next" must be used from within a tiddler, since need a 'current tiddler' to determine the relative previous/next tiddler in the group.\n''2007.04.21 [2.1.4]'' in handler(), when generating droplist, added a trailing space after "selected" text. This fixes problem where listitem for current tiddler had "selectedvalue=..." instead of "selected value=..." \n''2007.04.19 [2.1.3]'' in handler(), also wikify() self-referential FPNL and explicit 'here' links.\n''2007.04.19 [2.1.2]'' in handler(), when creating first/previous/next/last links, use wikify() to render link so that images or other wiki-formatted content can be used instead of default text.\n''2006.11.09 [2.1.0]'' use generated HTML instead of direct DOM calls to create 'guided tour' buttons/droplist (workaround for IE object creation errors)\n''2006.09.18 [2.0.0]'' added parameters: 'list' displays specified group "guided tour" droplist and buttons. first/prev/next/last display links to related tiddlers in the same group, 'here' display link to refresh current tiddler.\n''2006.09.12 [1.1.6]'' when adding to empty list, don't insert \sn----\sn before first group item\n''2006.08.23 [1.1.5]'' added "set default tiddlers" command\n''2006.08.22 [1.1.0]'' added expansion of "=Tag" references to auto-generate groups based on matching tags\n''2006.07.18 [1.0.0]'' fixed expansion of "+TiddlerName" references\n''2006.06.11 [0.9.5]'' cleanup options handling. added 'close others' option. added 'open new window' option. use cookies for tracking options\n''2006.06.09 [0.8.1]'' added 'fold group when viewed' toggle option\n''2006.06.09 [0.7.0]'' added notification for auto-refresh when list definitions are changed\n''2006.06.08 [0.5.0]'' converted to plugin/macro\n''2006.06.02 [0.0.0]'' started (as inline javascript)\n<<<\n!!!!!Credits\n>This feature was developed by EricShulman from [[ELS Design Studios|]]\n!!!!!Code\n***/\n//{{{\nversion.extensions.tiddlerGroups= {major: 2, minor: 2, revision: 0, date: new Date(2007,4,23)};\n\nif (config.options.chkGroupFold==undefined) config.options.chkGroupFold=false;\nif (config.options.chkGroupClose==undefined) config.options.chkGroupClose=true;\nif (config.options.chkGroupOpen==undefined) config.options.chkGroupOpen=false;\n\nconfig.macros.tiddlerGroups= { \n\n groupsList: "TiddlerGroupsList",\n indent: "\sxa0\sxa0\sxa0\sxa0",\n selectprompt: "select a group to view",\n optionsprompt: "viewing options",\n foldcmd: "[%0] fold group",\n closecmd: "[%0] close others",\n opencmd: "[%0] new window",\n addcmd: "add a group...",\n addprompt: "Please enter a group name for these tiddlers:\sn%0",\n editcmd: "edit the list...",\n defcmd: "set default tiddlers...",\n defprompt: "DefaultTiddlers will be set to:\sn%0\sn\snIs it OK to proceed?",\n defmsg: "DefaultTiddlers has been updated",\n notingroupmsg: "'%0' is not in a tiddler group",\n groupnotfoundmsg: "'%0' is not a recognized tiddler group name",\n firstcmd: "first",\n firstbutton: "<<",\n firstmsg: "display first tiddler from '%0'",\n nextcmd: "next",\n nextbutton: ">",\n nextmsg: "display next tiddler from '%0'",\n previouscmd: "previous",\n previousbutton: "<",\n previousmsg: "display previous tiddler from '%0'",\n lastcmd: "last",\n lastbutton: ">>",\n lastmsg: "display last tiddler from '%0'",\n refreshmsg: "redisplay '%0'",\n handler:\n function(place,macroName,params) {\n\n // get name of current tiddler (if any)\n var here=story.findContainingTiddler(place);\n if (here) var tid=here.getAttribute("tiddler");\n\n if (!params[0]) { // show full group list with commands/options\n var s=createTiddlyElement(place,"select",null,"tiddlerGroupsList");\n s.size=1; s.onchange=this.onchange;\n setStylesheet(".tiddlerGroupsList { width:100%; }", "tiddlerGroupsListStyles");\n store.addNotification(this.groupsList,this.refresh); this.refresh();\n return;\n }\n var groupname="";\n var p=params.shift();\n if (p=='first'||p=='previous'||p=='here'||p=='next'||p=='last'||p=='list') {\n // find group from current tiddler name\n if (!tid) return; // not in a tiddler\n groupname=this.findgroup(tid);\n if (!groupname) return; // current tiddler is not in a group\n }\n else { groupname=p; p=params.shift(); } // user-specified group name\n\n // get grouped tiddlers\n var tids=this.getgroup(groupname); \n if (!tids) { displayMessage(this.groupnotfoundmsg.format([groupname])); return; }\n\n var i=0;\n switch (p) {\n case 'first':\n i=0;\n break;\n case 'previous':\n if (!tid) return; // not in a tiddler\n i=tids.find(tid);\n if (i==null) { i=0; break; } // not in group, link to start of group\n i--; if (i<0) i=0;\n break;\n case 'here': // display a refresh link for current tiddler (even if not in a group)\n if (!tid) return; // not in a tiddler\n var label=tid; if (params[0]) label=params.shift();\n createTiddlyButton(place,label,this.refreshmsg.format([tid]), function()\n { var here=story.findContainingTiddler(place); if (here) story.refreshTiddler(here.getAttribute("tiddler"),null,true); });\n return; \n case 'next':\n if (!tid) return; // not in a tiddler\n i=tids.find(tid);\n if (i==null) { i=0; break; } // not in group, link to start of group\n i++; if (i>tids.length-1) i=tids.length-1;\n break;\n case 'last':\n i=tids.length-1;\n break;\n case 'list':\n default:\n var nobuttons=false;\n if (params[0]) nobuttons=(params[0].toLowerCase()=="nobuttons"); if (nobuttons) params.shift();\n var allbuttons=false;\n if (params[0]) allbuttons=(params[0].toLowerCase()=="allbuttons"); if (allbuttons) params.shift();\n var onlybuttons=false;\n if (params[0]) onlybuttons=(params[0].toLowerCase()=="onlybuttons"); if (onlybuttons) params.shift();\n var h="";\n h+='<form style="display:inline">';\n if ((!nobuttons||onlybuttons) && allbuttons) {\n h+='<input type="button" value="'+this.firstbutton+'" style="padding:0" title="'+this.firstmsg.format([groupname])+'"';\n h+=' onclick="this.form.list.selectedIndex=1; this.form.list.onchange();">';\n }\n if (!nobuttons||onlybuttons) {\n h+='<input type="button" value="'+this.previousbutton+'" style="padding:0 0.3em" title="'+this.previousmsg.format([groupname])+'"';\n h+=' onclick="var i=this.form.list.selectedIndex-1; if (i<1) i=1; this.form.list.selectedIndex=i; this.form.list.onchange();">';\n }\n h+='<select size="1" name="list"';\n if (onlybuttons) h+=' style="display:none;"';\n h+=' onchange="if (this.value)story.displayTiddler(this,this.value);">';\n h+='<option value="">'+groupname+'...</option>';\n for (i=0; i<tids.length; i++) {\n h+='<option '+\n (tids[i]==tid?'selected ':'')+\n 'value="'+tids[i]+'">\sxa0\sxa0'+tids[i]+'</option>';\n }\n h+='</select>';\n if (!nobuttons||onlybuttons) {\n h+='<input type="button" value="'+this.nextbutton+'" style="padding:0 0.3em" title="'+this.nextmsg.format([groupname])+'"';\n h+=' onclick="var i=this.form.list.selectedIndex+1; if (i>this.form.list.options.length-1) i=this.form.list.options.length-1; this.form.list.selectedIndex=i; this.form.list.onchange();">';\n }\n if ((!nobuttons||onlybuttons) && allbuttons) {\n h+='<input type="button" value="'+this.lastbutton+'" style="padding:0" title="'+this.lastmsg.format([groupname])+'"';\n h+=' onclick="this.form.list.selectedIndex=this.form.list.options.length-1; this.form.list.onchange();">';\n }\n h+='</form>';\n createTiddlyElement(place,"span").innerHTML=h;\n return;\n }\n // override default labelling with specified text (if any)\n var label=tids[i]; if (params[0]) label=params.shift();\n if (tid==tids[i]) { // self-referential links turn into 'refresh links'\n var btn=createTiddlyButton(place,null,this.refreshmsg.format([tid]), function()\n { var here=story.findContainingTiddler(place); if (here) story.refreshTiddler(here.getAttribute("tiddler"),null,true); });\n wikify(label,btn); \n }\n else // create link\n wikify(label,createTiddlyLink(place,tids[i],false));\n },\n\n refresh:\n function() { // called directly, AND triggered by notification events\n var indent=config.macros.tiddlerGroups.indent;\n var all=document.all? document.all : document.getElementsByTagName("select");\n for (var i=0; i<all.length; i++) {\n if (all[i].className!="tiddlerGroupsList") continue;\n var here=all[i];\n while (here.length) here.options[0]=null; // remove current list items\n here.options[here.length]=new Option(config.macros.tiddlerGroups.selectprompt,"",true,true);\n var list=store.getTiddlerText(config.macros.tiddlerGroups.groupsList);\n if (list && list.trim().length) {\n var parts=list.split("\sn----\sn");\n for (var p=0; p<parts.length; p++) {\n var lines=parts[p].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n here.options[here.length]=new Option(indent+label,value,false,false);\n }\n }\n here.options[here.length]=new Option(config.macros.tiddlerGroups.optionsprompt,"",false,false);\n if (!config.options.chkGroupOpen) {\n if (store.tiddlerExists("CollapsedTemplate")) {\n var msg=config.macros.tiddlerGroups.foldcmd.format([config.options.chkGroupFold?"x":"\sxa0\sxa0"]);\n here.options[here.length]=new Option(indent+msg,"_fold",false,false);\n }\n var msg=config.macros.tiddlerGroups.closecmd.format([config.options.chkGroupClose?"x":"\sxa0\sxa0"]);\n here.options[here.length]=new Option(indent+msg,"_close",false,false);\n }\n var msg=config.macros.tiddlerGroups.opencmd.format([config.options.chkGroupOpen?"x":"\sxa0\sxa0"]);\n here.options[here.length]=new Option(indent+msg,"_open",false,false);\n if (!readOnly) {\n here.options[here.length]=new Option(config.macros.tiddlerGroups.defcmd,"_setdef",false,false);\n here.options[here.length]=new Option(config.macros.tiddlerGroups.addcmd,"_add",false,false);\n here.options[here.length]=new Option(config.macros.tiddlerGroups.editcmd,"_edit",false,false);\n }\n }\n },\n\n expandlist:\n function(list) {\n var expandedlist=[];\n for (var i=0; i<list.length; i++)\n switch (list[i].substr(0,1)) {\n case '+': // get list from tiddler\n var sublist=store.getTiddlerText(list[i].substr(1)).readBracketedList();\n for (var j=0; j<sublist.length; j++)\n expandedlist.push(sublist[j]);\n break;\n case '=': // get tagged tiddlers\n var sublist=store.getTiddlers("title");\n for (var j=0; j<sublist.length; j++)\n if (sublist[j].tags.contains(list[i].substr(1)))\n expandedlist.push(sublist[j].title);\n break;\n default:\n expandedlist.push(list[i]);\n break;\n }\n return expandedlist;\n },\n\n findgroup:\n function(tid) {\n var text=store.getTiddlerText(config.macros.tiddlerGroups.groupsList);\n if (!text || !text.trim().length) return; // no group definitions\n var groups=text.split("\sn----\sn");\n for (var g=0; g<groups.length; g++) {\n var lines=groups[g].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n if (this.expandlist(value.readBracketedList()).find(tid)!=null) break;\n }\n return (g==groups.length?null:label);\n },\n\n getgroup:\n function(groupname) {\n var text=store.getTiddlerText(config.macros.tiddlerGroups.groupsList);\n if (!text || !text.trim().length) return; // no group definitions\n var groups=text.split("\sn----\sn");\n for (var g=0; g<groups.length; g++) {\n var lines=groups[g].split("\sn");\n var label=lines.shift(); // 1st line=display text\n var value=lines.shift(); // 2nd line=item value\n if (label==groupname) break;\n }\n if (g==groups.length) return; // unknown group\n return this.expandlist(value.readBracketedList());\n },\n\n onchange:\n function() { // this == droplist control\n var v=this.value; if (!v.length) return;\n switch (v) {\n case '_fold':\n config.options.chkGroupFold=!config.options.chkGroupFold;\n saveOptionCookie('chkGroupFold'); config.macros.tiddlerGroups.refresh();\n break;\n case '_close':\n config.options.chkGroupClose=!config.options.chkGroupClose;\n saveOptionCookie('chkGroupClose'); config.macros.tiddlerGroups.refresh();\n break;\n case '_open':\n config.options.chkGroupOpen=!config.options.chkGroupOpen;\n saveOptionCookie('chkGroupOpen'); config.macros.tiddlerGroups.refresh();\n break;\n case '_add':\n var list=[]; story.forEachTiddler(function(title,element){list.push(String.encodeTiddlyLink(title))}); list=list.join(" ");\n var d=prompt(config.macros.tiddlerGroups.addprompt.format([list.readBracketedList().join(', ')]),'');\n if (!d || !d.trim().length) return;\n var t=store.getTiddler(config.macros.tiddlerGroups.groupsList);\n var newtext=t.text+(t.text.length?"\sn----\sn":"")+d+"\sn"+list;\n store.saveTiddler(t.title,t.title,newtext,config.options.txtUserName,new Date(),t.tags);\n story.refreshTiddler(config.macros.tiddlerGroups.groupsList,null,true);\n config.macros.tiddlerGroups.refresh(); this.value=list; // reload list and select newly added item\n break;\n case '_edit':\n story.displayTiddler(null,config.macros.tiddlerGroups.groupsList,2);\n break;\n case '_setdef':\n this.selectedIndex=0; // reset selection\n var list=[]; story.forEachTiddler(function(title,element){list.push(String.encodeTiddlyLink(title))}); list=list.join(" ");\n if (!confirm(config.macros.tiddlerGroups.defprompt.format([list.readBracketedList().join(', ')]))) return;\n var t=store.getTiddler("DefaultTiddlers");\n store.saveTiddler(t.title,t.title,list,config.options.txtUserName,new Date(),t.tags);\n story.refreshTiddler("DefaultTiddlers",null,true);\n clearMessage(); displayMessage(config.macros.tiddlerGroups.defmsg);\n break;\n default:\n var expandedlist=config.macros.tiddlerGroups.getgroup(this.options[this.selectedIndex].text.trim());\n if (!expandedlist) return; // group not found\n if (config.options.chkGroupOpen) {\n var list=[];\n for (var i=0; i<expandedlist.length; i++)\n list[i]=String.encodeTiddlyLink(expandedlist[i]);\n expandedlist=expandedlist.join(" ");\n var url=document.location.protocol+"//""#";\n url+=encodeURIComponent(list);\n,"_blank");\n break;\n }\n if (config.options.chkGroupClose) story.closeAllTiddlers();\n var template=(config.options.chkGroupFold && store.tiddlerExists("CollapsedTemplate"))?"CollapsedTemplate":null;\n story.displayTiddlers(null,expandedlist,template);\n break;\n }\n }\n}\n//}}}
/***\n|Name:|TiddlerPreviewsPlugin|\n|Source:||\n|Author:|Dustin Diaz|\n|License:|Creative Commons 2005|\n|version:| |\n|Description:|Based on Sweet Ttiles adapted to TW for tiddler previews by Saq Imtiaz|\n***/\n//{{{\n// based on Sweet Titles (c) Creative Commons 2005\n//\n// Author: Dustin Diaz |\n// Adapted to TW for tiddler previews by Saq Imtiaz\nconfig.linkPreview ={\n tiddlyLinkPreview : true,\n externalLinkPreview : false,\n customTiddlerPreview : true\n}\n\nif (config.linkPreview.customTiddlerPreview)\n {\n Tiddler.prototype.getSubtitle = function()\n {\n return (this.text.length>0 ? this.text.substr(0,110) : "(no text)");\n }\n }\n\nif (config.linkPreview.tiddlyLinkPreview)\n {\n old_tiddlerPreview_createTiddlyButton=createTiddlyButton;\n window.createTiddlyButton = function (theParent,theText,theTooltip,theAction,theClass,theId,theAccessKey)\n {\n var theButton = old_tiddlerPreview_createTiddlyButton.apply(this,arguments);\n if (theButton.className.indexOf('tiddlyLink')!=-1)\n {\n theButton = setLinkPreview(theButton);\n }\n return theButton;\n }\n }\n\nfunction setLinkPreview (theButton)\n{\n theButton.setAttribute("tip",theButton.getAttribute("title"));\n addEvent(theButton,'mouseover',sweetTitles.tipOver);\n addEvent(theButton,'mouseout',sweetTitles.tipOut);\n theButton.setAttribute("title","");\n return theButton;\n}\n\nif (config.linkPreview.externalLinkPreview)\n {\n old_tiddlerPreview_createExternalLink=createExternalLink;\n window.createExternalLink = function(place,url)\n {\n var theLink = old_tiddlerPreview_createExternalLink(place,url);\n theLink = setLinkPreview(theLink);\n return(theLink);\n }\n }\n\nwindow.old_lewcid_pt_restart = restart;\nrestart = function()\n{\n window.old_lewcid_pt_restart();\n sweetTitles.init();\n};\n\nwindow.refreshTiddlyLink = function(e,title)\n{\n var i = getTiddlyLinkInfo(title,e.className);\n e.className = i.classes;\n if (!e.getAttribute('tip'))\n e.title = i.subTitle;\n}\n\nsetStylesheet("body div#toolTip { position:absolute;z-index:1000;width:220px;background:#000;border:2px double #fff;text-align:left;padding:5px;min-height:1em;-moz-border-radius:5px; }\sn body div#toolTip p { margin:0;padding:2px;color:#fff;font:11px/12px verdana,arial,sans-serif; font-weight:bold; word-break:normal;display:block;overflow:hidden;}","linkPreviewStyles");\n\nvar sweetTitles = { \n xCord : 0, // @Number: x pixel value of current cursor position\n yCord : 0, // @Number: y pixel value of current cursor position\n tipElements : ['a','abbr','acronym'], // @Array: Allowable elements that can have the toolTip\n obj : Object, // @Element: That of which you're hovering over\n tip : Object, // @Element: The actual toolTip itself\n active : 0, // @Number: 0: Not Active || 1: Active\n init : function() {\n this.tip = createTiddlyElement(document.getElementsByTagName('body')[0],"div","toolTip");\n = '0';\n = 'hidden';\n },\n updateXY : function(e) {\n var theTarget = resolveTarget(e);\n sweetTitles.xCord = findPosX(theTarget);\n sweetTitles.yCord = findPosY(theTarget);\n },\n tipOut: function() {\n if ( window.tID ) {\n clearTimeout(tID);\n }\n if ( window.opacityID ) {\n clearTimeout(opacityID);\n }\n = 'hidden';\n },\n tipOver : function(e) {\n sweetTitles.obj = this;\n tID = window.setTimeout("sweetTitles.tipShow()",500);\n sweetTitles.updateXY(e);\n },\n tipShow : function() { \n var scrX = Number(this.xCord);\n var scrY = Number(this.yCord);\n var tp = parseInt(scrY+15);\n var lt = parseInt(scrX+10);\n var anch = this.obj;\n this.tip.innerHTML = "<p>"+anch.getAttribute('tip')+"<em></em></p>";\n = ( parseInt(findWindowWidth()+findScrollX()) < parseInt(this.tip.offsetWidth+lt) )? parseInt(lt-(this.tip.offsetWidth))+'px' : = lt+'px';\n = ( parseInt(findWindowHeight()+findScrollY()) < parseInt(this.tip.offsetHeight+tp) ) ? parseInt(tp-(this.tip.offsetHeight+15))+'px': = tp+5+'px';\n = 'visible';\n = '.1';\n this.tipFade(10);\n },\n tipFade: function(opac) {\n var passed = parseInt(opac);\n var newOpac = parseInt(passed+10);\n if ( newOpac < 80 ) {\n = '.'+newOpac;\n = "alpha(opacity:"+newOpac+")";\n opacityID = window.setTimeout("sweetTitles.tipFade('"+newOpac+"')",20);\n }\n else { \n = '.80';\n = "alpha(opacity:80)";\n }\n }\n};\n//}}}
!Images in a lightbox:\n[img[][]]<<imagebox>>\n<nowiki>usage: [img[thumb image][big image]]<<image box>></nowiki>\n\nLet's try a text link:\n\n[[click me|claimid_icon.png]]<<imagebox>>\n<nowiki>usage: [[click me|image]]<<imagebox>></nowiki>\n\n----\n!Html div in a lightbox:\n\n<html><div id="testDiv" style="display:none;"><div style="text-align:center"><br><br><br><br> Lightboxes have become very cliche, but they can still be useful!<iframe src=""\nwidth=800 height=400"></iframe></div></html><<divbox "Gmail" "LighboxDivIframe" "Gmail in a Lightbox Div Iframe!">>\n\n----\n!Tiddlers in a lightbox:\n\nLet's give it a go:\n\n<<tiddlerbox "menu" "MainMenu" "Thats my main menu, and the links work!">>\n<nowiki>usage: <<tiddlerbox "text" "MyTidller" "MyToolTip">></nowiki>\n
/***\n|''Name:''|TiddlyLightBox|\n|''Date:''|Jan 1, 2006|\n|''Version:''|1.0 beta|\n|''Author:''|Saq Imtiaz|\n|''Location:''||\n|''Documentation:''||\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|''Based on:''|DC3.LightBox<br>Light Box Gone Wild <br>Ibox|\n\n!!Code\n***/\n//{{{\nconfig.macros.imagebox ={};\nconfig.macros.imagebox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var e = place.lastChild;\n e.onclick = function(){TiddlyLightBox.initBox('image',this,params[1],params[2],params[0]);return false;};\n}\n\nconfig.macros.divbox ={};\nconfig.macros.divbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n if (params[0]!=".")\n createTiddlyButton(place,params[0],params[0],function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;});\n else\n {\n var e = place.lastChild;\n e.onclick = function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;};\n }\n}\n\nconfig.macros.tiddlerbox ={}\nconfig.macros.tiddlerbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n config.macros.divbox.handler(place,macroName,[params[0],"tiddler:"+params[1],params[2],params[3],params[4]]);\n return false;\n}\n\nstore.addNotification("TiddlyLightBoxStyles",refreshStyles);\n\nif (!window.TiddlyLightBox)\n window.TiddlyLightBox = {};\n var loadingImage = "indicator.gif";\n window.TiddlyLightBox =\n {\n _curBox: null, // [sentinel]\n\n lightBoxHtml : '<div id="lightBoxOverlay" onclick="TiddlyLightBox.hideBox()" style="display:none"></div><div id="lightboxprogress" style="display:none;"><img src=\s''+loadingImage+'\s' alt=\s'loading\s' style="width:128px;height:128px;"></div><div class="lightBox" id="lightBox" style="display:none"><div id="lightBoxContent"></div><div id="lightBoxTitle">This is a title</div><div id="lightBoxClose"><a href:"#" onclick="TiddlyLightBox.hideBox();return false;">Click to close</a></div></div>',\n\n createBoxWrapper : function()\n {\n var wrapper = createTiddlyElement(document.getElementsByTagName("body")[0],"div","tiddlyLightBoxWrapper");\n wrapper.innerHTML = this.lightBoxHtml;\n },\n\n initBox : function(contentType,url,w,h,text)\n {\n if (this._curBox)\n return;\n this.showProgress();\n this.hideSelects("hidden");\n this.showBg();\n this._curBox = true;\n this.sizeTheBox(contentType,w,h);\n if (contentType == 'image')\n this.showImage(url,text);\n else if (contentType == 'html')\n this.showHtml(url,text);\n return false;\n },\n \n sizeTheBox : function(contentType,w,h)\n {\n var box = document.getElementById("lightBoxContent");\n if (w && isNaN(parseInt(w)))\n {\n addClass(box,w);\n }\n else if (w ||h || contentType == 'html')\n {\n = w? w+ "px" : "450px";\n = h? h+ "px" : "280px";\n if (contentType=='image')\n setStylesheet("#lightBoxContent img{height:100%;width:100%;}","lightBoxImageSizeHack");\n }\n },\n\n showProgress : function()\n {\n var progress = document.getElementById("lightboxprogress");\n'';\n this._center(progress);\n },\n \n hideProgress: function()\n {\n var progress = document.getElementById("lightboxprogress");\n'none';\n },\n\n //this function lifted from Lightbox Gone Wild\n hideSelects: function(visibility)\n {\n var selects = document.getElementsByTagName('select');\n for(i = 0; i < selects.length; i++)\n {\n selects[i].style.visibility = visibility;\n }\n },\n\n showBg: function()\n {\n var overlay = document.getElementById('lightBoxOverlay');\n if (config.browser.isIE)\n {\n = Math.max(document.documentElement.scrollHeight,document.documentElement.offsetHeight);\n = document.documentElement.scrollWidth;\n }\n = 'block';\n },\n\n showImage: function (url,text)\n {\n imgPreloader = new Image();\n imgPreloader.onload = function ()\n {\n var lb = document.getElementById("lightBoxContent");\n lb.innerHTML = "<img src="+url+">";\n lb.onclick = function(){TiddlyLightBox.hideBox();return false;};\n TiddlyLightBox.posBox(text);\n };\n imgPreloader.src = url;\n },\n \n showHtml : function(theID,text)\n {\n var lb = document.getElementById("lightBoxContent");\n if (theID.indexOf("tiddler:")==-1)\n lb.innerHTML = document.getElementById(theID).innerHTML;\n else\n { \n wikify(store.getTiddlerText(theID.replace("tiddler:","")),lb);\n lb.className='tiddler';\n }\n = "auto";\n this.posBox(text);\n },\n\n posBox: function(text)\n {\n this.setTitle(text);\n this.hideProgress();\n var lb = document.getElementById("lightBox");\n = "";\n = "hidden";\n = "absolute";\n this._center(lb);\n if(!TiddlyLightBox._curBox) return;\n = "visible";\n = "block";\n },\n\n setTitle: function(text)\n {\n document.getElementById("lightBoxTitle").innerHTML= (text==undefined)? '': text;\n },\n\n _center: function(lb)\n {\n var lbSize = new TiddlyLightBox.getElementSize(lb);\n = (Math.round(findWindowWidth()/2) - (lbSize.width /2) + findScrollX())+'px';\n = (Math.round(findWindowHeight()/2) - (lbSize.height /2) + findScrollY())+'px';\n },\n\n //this function lifted from Ibox\n getElementSize : function(elem)\n {\n this.width = elem.offsetWidth ||;\n this.height = elem.offsetHeight ||;\n },\n\n hideBox: function()\n {\n if(!this._curBox)\n return;\n document.getElementById("tiddlyLightBoxWrapper").innerHTML= this.lightBoxHtml;\n setStylesheet("","lightBoxImageSizeHack");\n this._curBox = null;\n return false;\n }\n}\n\nTiddlyLightBox.createBoxWrapper();\n\nStory.prototype.findContainingTiddler = function(e)\n{\n while(e && (!hasClass(e,"tiddler") || !e.getAttribute("tiddler")))\n e = e.parentNode;\n return(e);\n}\n\nconfig.shadowTiddlers.TiddlyLightBoxStyles="/*{{{*/\sn#lightBoxOverlay {\sn position:absolute;\sn top: 0;\sn left: 0;\sn width: 100%;\sn height: 100%;\sn z-index: 90; \sn background-color: #000;\sn -moz-opacity: 0.75;\sn opacity: .75;\sn filter: alpha(opacity=75);\sn}\sn#lightBoxOverlay[id]{ \sn position: fixed;\sn}\sn\sn#lightboxprogress { \sn margin:0;padding:0;\sn position: absolute;\sn z-index:95;\sn}\sn\sndiv.lightBox {\sn background: #fff;\sn color: #fff;\sn border: 4px solid #525252;\snpadding:20px 20px 25px 20px; position:absolute; z-index:99;\sn}\sn\sn#lightBoxClose {text-align:right; color:#000; font-size:1.0em; position:absolute; bottom:6px; right:20px;}\sn#lightBoxClose a{color:#666; border-bottom:1px solid #666;cursor:pointer;}\sn#lightBoxClose a:hover {color:#111; border-bottom:1px solid #666; cursor:pointer; background:transparent;}\sn\sn#lightBoxContent {border:1px solid #525252;color:#000; background:#fff;}\sn#lightBox .tiddler {background:#fff;}\sn\sn#lightBoxContent img {border:0;margin:0;padding:0;display:block;cursor:pointer;}\sn\sn#lightBoxTitle {padding:0px; font-weight:bold; position:absolute; left:20px;bottom:6px; font-size:1.1em; color:#000;}\sn\sn/*}}}*/";\n//}}}
/***\n| Name|ToggleTagPlugin|\n| Description|Makes a checkbox which toggles a tag in a tiddler|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source||\n| Author|Simon Baird <>|\n| License||\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\nNotes:\n* If TiddlerName doesn't exist it will be silently created\n* Set label to '-' to specify no label\n* See also\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n label = (label == '-' ? '' : label);\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.toggleTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n store.setTiddlerTag(title,this.checked,tag);\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
/***\nRequired by Tiddlyspot\n***/\n//{{{\n\nconfig.options.chkHttpReadOnly = false; // make it so you can by default see edit controls via http\n\nif (window.location.protocol != "file:")\n config.options.chkGTDLazyAutoSave = false; // disable autosave in d3\n\nconfig.tiddlyspotSiteId = 'shareme';\n\n// probably will need to redo this for TW 2.2\nwith (config.shadowTiddlers) {\n SiteUrl = 'http://'+config.tiddlyspotSiteId+'';\n SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");\n OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");\n DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n MainMenu = MainMenu.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n}\n\nmerge(config.shadowTiddlers,{\n\n'Welcome to Tiddlyspot':[\n "This document is a ~TiddlyWiki from A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + "]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",\n "<<tiddler TspotControls>>",\n "See also GettingStarted.",\n "",\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 \s"save to web\s" 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 \s"upload\s" and your ~TiddlyWiki will be saved back to",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[|]]. Also visit [[TiddlyWiki Guides|]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|]].",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your site. Please email [[|]] with any comments or suggestions."\n].join("\sn"),\n\n'TspotControls':[\n "| tiddlyspot password:|<<option pasUploadPassword>>|",\n "| site management:|<<upload http://" + config.tiddlyspotSiteId + " index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + "]], [[download (go offline)|http://" + config.tiddlyspotSiteId + "]]|",\n "| links:|[[|]], [[FAQs|]], [[announcements|]], [[blog|]], email [[support|]] & [[feedback|]], [[donate|]]|"\n].join("\sn"),\n\n'TspotSidebar':[\n "<<upload http://" + config.tiddlyspotSiteId + " index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + "' class='button'>download</a></html>"\n].join("\sn"),\n\n'TspotOptions':[\n "tiddlyspot password:",\n "<<option pasUploadPassword>>",\n ""\n].join("\sn")\n\n});\n//}}}\n
/***\n|Name|UnformattedTextPlugin|\n|Source||\n|Version|1.1.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License| <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description||\n\nAdd //extended quotes// around specific tiddler content to prevent any embedded formatting syntax from being processed by TiddlyWiki's rendering engine, so the content will appear exactly as entered into the tiddler (i.e., "raw text"), even when it contains character sequences that would normally be treated as TiddlyWiki formatting instructions.\n!!!!!Usage\n<<<\nThis plugin adds new wiki syntax for surrounding tiddler content so that it can be excluded from the TiddlyWiki formatting rules when it is rendered.\n//{{{\n"""content goes here"""\n//}}}\nor\n//{{{\n<nowiki>content goes here</nowiki>\n//}}}\nwhere:\n* {{{"""}}} //(three double-quote characters)// (or {{{<nowiki>}}} and {{{</nowiki>}}})^^\nmarks the start and end of the unformatted content^^\n<<<\n!!!!!Examples\n<<<\nContent containing TiddlyWiki formatting syntax can be shown with the syntax unchanged:\n{{{\n"""this text is //not italic// and <<not a macro>> and [[not a link]]"""\n<nowiki>this text is //not italic// and <<not a macro>> and [[not a link]]</nowiki>\n}}}\n"""this text is //not italic// and <<not a macro>> and [[not a link]]"""\n<nowiki>this text is //not italic// and <<not a macro>> and [[not a link]]</nowiki>\n\nNote that, although formatting syntax contained ''within'' the quoted content does not affect the style of the output, any formatting syntax ''surrounding'' the quoted content will still be applied. For example, the following unformatted output will be underlined:\n{{{\n__"""this text is //not italic// and <<not a macro>> and [[not a link]], but it IS underlined"""__\n}}}\n__"""this text is //not italic// and <<not a macro>> and [[not a link]], but it IS underlined"""__\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''UnformattedTextPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.09.21 [1.1.0]'' added alternative syntax: {{{<nowiki>...</nowiki>}}}\n''2005.11.07 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.unformattedText = {major: 1, minor: 1, revision: 0, date: new Date(2006,9,21)};\n\nconfig.formatters.push( {\n name: "rawText",\n match: "(?:\s\s\s"{3}|<nowiki>)",\n lookahead: "(?:\s\s\s"{3}|<nowiki>)((?:.|\s\sn)*?)(?:\s\s\s"{3}|</nowiki>)",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var e = createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 6/5/2007 22:43:49 | YourName | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/5/2007 22:58:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/5/2007 6:34:50 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/5/2007 6:35:19 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/5/2007 6:24:35 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/5/2007 7:39:43 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/5/2007 8:6:15 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/5/2007 15:55:38 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . |\n| 10/5/2007 9:59:18 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/5/2007 10:27:32 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/5/2007 10:35:21 | shareme | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/5/2007 10:41:15 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/5/2007 11:57:50 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/5/2007 16:22:39 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/5/2007 18:21:18 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . |\n| 12/5/2007 16:33:4 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html]] | [[store.cgi|]] | . | index.html | . |\n| 19/5/2007 18:58:41 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html#ShareMePersonal]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 19/5/2007 19:2:38 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html#ShareMePersonal]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 19/5/2007 20:36:13 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html#ShareMePersonal]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 19/5/2007 21:10:3 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html#ShareMePersonal]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 19/5/2007 22:54:24 | ShareMe | [[shareme.html|file:///C:/Documents%20and%20Settings/Owner/Desktop/shareme.html#ShareMePersonal]] | [[store.cgi|]] | . | index.html | . |\n| 21/5/2007 10:4:49 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 21/5/2007 10:11:22 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 21/5/2007 10:15:18 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 21/5/2007 10:15:19 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 21/5/2007 10:26:2 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 21/5/2007 10:30:1 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 21/5/2007 10:34:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 21/5/2007 11:32:43 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 21/5/2007 11:35:56 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 26/5/2007 8:5:12 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 8:19:12 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 8:42:24 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 8:59:29 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 9:2:14 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 9:34:48 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 9:39:26 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 9:42:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 10:52:6 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 11:53:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 26/5/2007 12:26:38 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 28/5/2007 10:15:57 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 28/5/2007 15:48:4 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 3/6/2007 13:58:9 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 14:10:58 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 14:43:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 15:29:23 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 16:40:47 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 16:52:2 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 17:2:9 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 17:25:18 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 17:45:53 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 18:1:15 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 18:17:17 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 18:32:51 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 18:44:3 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 19:2:34 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 19:36:40 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 20:4:50 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 20:25:26 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 20:39:37 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 23:15:8 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 3/6/2007 23:26:36 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 4/6/2007 17:29:9 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 4/6/2007 18:15:24 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 6:27:31 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 6:32:57 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 7:12:53 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 7:27:54 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 7:41:52 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 7:41:55 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 7:57:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 7:57:35 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 8:13:50 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 8:13:55 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 8:42:50 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 8:42:56 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 8:58:37 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 9:17:35 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 9:17:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 9:20:47 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 9:20:53 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 9:26:6 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok | Ok | Ok |\n| 5/6/2007 9:33:12 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 9:37:58 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 9:44:57 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 9:55:38 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 9:55:44 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 10:7:16 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 10:7:22 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 10:7:59 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 10:8:5 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 10:16:11 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 10:16:22 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 10:30:45 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 10:30:52 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 10:39:18 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 11:36:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 11:36:36 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 11:54:15 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 13:17:24 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 13:35:8 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 13:44:31 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 13:56:10 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 13:56:16 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 14:6:10 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 14:14:42 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 14:21:48 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 14:26:6 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 14:30:3 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 14:41:16 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 14:50:16 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 14:50:23 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 15:0:26 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:7:23 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:17:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:24:58 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:32:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:39:0 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:47:23 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 15:56:29 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 16:10:54 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 16:21:29 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 16:21:36 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 5/6/2007 16:29:36 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 5/6/2007 20:55:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 21:1:7 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 21:5:58 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 21:18:49 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 21:25:4 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 21:36:7 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 21:48:32 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 22:3:59 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 22:10:29 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 5/6/2007 22:19:48 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:1:19 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:9:26 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:15:42 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:21:10 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:31:9 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:36:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:41:56 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:48:7 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 7:52:20 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 8:6:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/6/2007 8:39:26 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/6/2007 9:2:17 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 10:37:23 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 10:54:43 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/6/2007 11:34:25 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 11:46:5 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/6/2007 11:46:14 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 6/6/2007 12:35:49 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 13:9:47 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 14:30:5 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/6/2007 14:41:59 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 6/6/2007 14:42:12 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok | Ok |\n| 6/6/2007 15:15:32 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 15:30:31 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 21:16:56 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 21:34:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 22:53:56 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 6/6/2007 23:50:21 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 7/6/2007 8:7:38 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 7/6/2007 11:37:2 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 7/6/2007 12:16:49 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 7/6/2007 12:28:5 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 7/6/2007 13:3:27 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 7/6/2007 13:20:15 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/6/2007 6:7:59 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 6:20:53 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 6:32:35 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 6:45:5 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 7:26:32 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 7:41:36 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 8:1:57 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 8:19:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/6/2007 8:49:37 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 9:28:20 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 10:35:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 11:15:0 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/6/2007 11:42:8 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/6/2007 11:47:1 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 8/6/2007 12:20:35 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 12:42:7 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 13:1:48 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 13:18:38 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 13:39:10 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 13:54:44 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 14:20:6 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 14:42:2 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 14:55:3 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 15:30:47 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 8/6/2007 16:6:4 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 8/6/2007 17:8:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 6:36:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 7:0:51 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 7:55:11 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 8:7:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 8:42:55 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 11:22:26 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 11:33:0 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 12:38:4 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 12:48:32 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 13:1:12 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 13:11:55 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 14:17:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 15:5:32 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 15:22:35 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 15:38:9 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 15:45:42 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 15:55:11 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 15:59:52 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 18:47:11 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 19:44:17 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 21:14:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 9/6/2007 21:35:2 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 22:24:20 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 22:35:39 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/6/2007 23:16:52 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/6/2007 7:26:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/6/2007 7:39:44 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/6/2007 7:46:16 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 8:26:3 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 8:41:49 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/6/2007 8:51:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 9:2:41 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 10/6/2007 11:49:25 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 13:23:49 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 14:35:45 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 14:52:17 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 15:25:24 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 15:36:57 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 16:6:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 16:43:31 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 16:53:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 18:16:23 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 19:13:43 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 19:55:56 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 20:35:46 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 21:22:8 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 21:38:15 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 21:50:5 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 10/6/2007 22:22:16 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 11/6/2007 8:7:25 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 11/6/2007 9:8:15 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 11/6/2007 9:29:53 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 11/6/2007 10:32:25 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 12/6/2007 12:15:8 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/6/2007 14:8:30 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/6/2007 14:50:18 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/6/2007 15:10:31 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 12/6/2007 16:5:45 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 13/6/2007 7:15:52 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 8:17:7 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 8:30:7 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 13/6/2007 8:30:14 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok | Ok |\n| 13/6/2007 9:45:37 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 10:4:15 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 10:25:27 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 10:44:47 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 11:9:8 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 11:39:21 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 13/6/2007 11:51:53 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 14/6/2007 9:30:37 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 14/6/2007 10:55:24 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 14/6/2007 11:19:10 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 14/6/2007 13:23:12 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 14/6/2007 14:48:21 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 23/6/2007 10:24:48 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 10:43:17 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 11:6:50 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 11:24:44 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 11:48:51 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 12:5:11 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 12:51:28 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 13:10:22 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . | Ok |\n| 23/6/2007 13:17:38 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |\n| 9/7/2007 9:57:35 | shareme | [[/|]] | [[store.cgi|]] | . | index.html | . |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.5|\n|''Date:''|Oct 15, 2006|\n|''Source:''||\n|''Documentation:''||\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license| ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 5, \n date: new Date(2006,9,15),\n source: '',\n documentation: '',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\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: 1}, \n date: new Date(2006,8,19)\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: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: ''\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 {\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 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.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\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.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\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 c.className = "chkOptionInput "+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 c.className = "chkOptionInput "+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 backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\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.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\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 (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = 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 // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\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 var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\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 var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\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 =, 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"UniversalXPConnect");\n var converter = Components.classes[""]\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\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\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 var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \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'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 // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\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 //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //"POST", storeUrl, true, username, password);\n try {\n"POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\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 + "\snStatus: "+request.status.statusText);\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\ = 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"UniversalBrowserRead");\n }\n else {\n"UniversalXPConnect");\n }\n } catch (e) { }\n //"GET", document.location.toString(), true, username, password);\n try {\n"GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \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()]) + "\snStatus: "+request.status.statusText);\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','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nif (document.location.toString().substr(0,4) == "http") {\n config.options.chkAutoSave = false; \n saveOptionCookie('chkAutoSave');\n}\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation| ]]\sn"; \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\n
!Introduction\nA listing of Web Technology articles.\n\n!Articles\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Web")'\n script\n '\n function getFirstLine(s) {\n var m = s.match(/\ss*(.*)/);\n return m != null && m.length >= 1 ? m[1] : "";\n }\n '\n write\n '"*[["+tiddler.title+"]] &rarr; "+getFirstLine(tiddler.text)+"\sn"' \n>>
Javame came from several different convergence of several projects and trends at Sun Microsystems. To begin we go back to h0ow java came to be as a computer programming language.\n\n!Beginnings of Java\nIn 1990 ProjectGreen was formed to explore computer control and integration in consumer electronics devices. Products such as Star7 and a new computer language called OAK were produced to assist in attempt to win bids to produce setboxes for the cable industry. \n\nAfter loosing the TimeWarner bid FirstPerson was brought back into Sun Microsystems and team re-targeted the OAK computer language for the web in 1994 and renamed the programming language java.\n\n!Consumer Electronics 2nd Steps\nPersonalJava was Sun Microsystems 2nd foray into consumer electronics devices. While mobile JTAPI helped target PersonalJava for mobile devices a new api for tv called JavaTV was also developed that used the PersonalJava subset.\n\nEmbeddedJava, which originally meant JavaCard, which was developed in 1996 with the first javacard being used in mobile devices in 1997. EmbeddedJava was later re-branded to mean the whole java ecosystem of apis, jvms, and etc that target consumer electronic devices.\n\n!J2ME and MIDP are Born\nIn 1997 several java apis for mobile devices were developed by Asian telecom companies. However, Sun Microsystems determined that a configuration and profile scheme was needed for mobile devices to group devices in groups by memory and functionality and set about defining J2ME configurations in fall of 1999. \n\nIn fall of 1999 Motorola became the spec lead for the MobileInformationDeviceProfile(MIDP) which was the first profile to be used in mobile devices deploying J2ME. \n\n\n\n!References\n[[Project Green History at|]]\n[[Java(wikipedia article)|]]\n\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
In contrast to GSM, CDMA was invented by one company called Qualcomm which holds patents on CDMA technology.\n\n!CDMA Term Meaning\nCDMA refers to Code Division Multiplexing Access. Flavors of CDMA include N-CDMA, B-CDMA, W-CDMA, cdmaOne, and CDAM200.\n\n!References\n[[Digital Cellular Technologies|]]
One person did not invent GSM but several individuals and groups contributed to the mobile communication system known as GSM(Global System for Mobile communications).\n\n!Frequency Hopping\nThe would be no GSM without usage of frequency hopping an invention co-invented by Hedy Lamarr in the 1940s. This frequency hopping application is not only found in GSM networks but also in military communications systems. The first military use was during the Cuban Missile crisis.\n\n!Torleiv Maseng\nIn the 1980s Europe had competing mobile analogue standards for mobile communications systems. Sweden and other Scandinavia telecoms formed a project called SINETF and asked Mr Maseng to join the project to come up with a new mobile communication system in 1981.\n\nLater this group merged with other European groups to form CEPT and hey called the group of researchers researching the new mobile communications system the Group Spécial Mobile (GSM). Than large disagreements crippled the efforts until 1987. In 1987 tests in Paris Mr Mseng's system won out in all tests as he used both frequency hopping and optimization of how much bandwidth to send to reduce interference due to reflections and etc.\n\n!The meaning of GSM\nThe meaning of GSM has come to mean the type of network air interface service even though the GSM group now within European Telecommunication Standards Institute (ETSI) defines not only the air interface but the whole system from the air interface to how it integrates with the land line phone systems.\n\n!Dualband, Triband, and Quadband\nDue to the different times of emergence of mobile communications within different geographical areas GSM frequencies are not the same world wide and thus travelers to different countries often make use of a dual, triband, or quadband handset to handle this obstacle.\n\n!Conclusion\nGSM currently servers approximately billions of subscribers world wide due to the cooperation of the European Telecommunications Industry.\n\n\n\n!References\n[[Hedy Lamarr|]]\n[[Inventor of the GSM system published by GEMINI|]]\n[[History of GSM|]]
No single person invented IPTV as it has been developed as an group effort of standards bodies world wide.\n\n!Meaning of IPTV Term\nIPTV refers to Internet Protocol transmission of TeleVision video. The public media has shorten the term to ITV or Interactive TeleVision.\n\n!IPTV Components\nThrough the interaction of such standards bodies as the US based Advanced Televisions Standards Committee(ATSC) on the Digital Television Application Software Environment(DASE) and the European Digital Video Broadcasting(DVB) group on the Multimedia Home Platform we have programmable APIs for the application environment in IPTV. Component APIs such as HAVi, DVB-MHP, OSGi, OCAP, JavaTV and etc.\n\n!References\n[[IPTV|]]\n[[Interactive TV Web|]]\n
As with most stories the cell phone was not entirely invented by one person but many people and groups competing against one another.\n\n!The Term Cell\nThe term cell comes form the idea of having multiple base stations that the handset's calls get handed off to as the handset travels from one cell base station's area to another base station area. The Hexagon Cell concept was developed in the mid 1940s by AT&T and Bell Labs.\n\nThe handoff concept and technology did not emerge until the 1970s through Amos Edward Joel's work at Bell Labs and thus cell handsets before mid 1970s were only connecting to one cell base station\n\n!Martin Cooper\nWhile it is true that Martin Cooper did not invent the first cell phone it can be said that he did invent the first portable cell phone in 1973 while at Motorola as handsets before this period were so bulky to only be able to be deployed in vehicles and certain stand alone terminals.\n\n!References\n[[Martin Cooper(a wikipedia article)|]]\n
A Wiki about Enterprise and Mobile Technology
/***\n|''Name:''|XHTML10Plugin|\n|''Version:''|1.0.1 (2006-09-16)|\n|''Source:''||\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|]]|\n|''Copyright:''|&copy; 2005-2006 [[abego Software|]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox or better; Internet Explorer 6.0|\n\nMake your ~TiddlyWiki XHTML 1.0 compliant format.\n\nOnce the plugin is installed the existing tiddlers of that TiddlyWiki are automatically converted to the new (XHTML 1.0 compliant) format on the first save. After that all changes are stored in the XHTML format.\n\n!Source Code\n***/\n//{{{\n// Ensure the Plugin is only installed once.\n//\nif (!version.extensions.XHTML10Plugin) {\n\nif (version.major < 2 || (version.major == 2 && version.minor < 1)) {\n (function() {\n var s = "Use TiddlyWiki 2.1 or better to run the XHTML10Plugin.";\n alert(s);\n throw s;\n })();\n}\n\nversion.extensions.XHTML10Plugin = {\n major: 1, minor: 0, revision: 1,\n date: new Date(2006, 8, 16),\n source: "",\n licence: "[[BSD open source license (abego Software)|]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2006 (",\n};\n\n// Ensure the global abego namespace is set up.\nif (!window.abego) window.abego = {};\n\n\n//--------------------------------\n// XHTML10Saver (inherits from SaverBase)\n\nabego.XHTML10Saver = function() {};\n\nabego.XHTML10Saver.prototype = new SaverBase();\n\nabego.XHTML10Saver.prototype.externalizeTiddler = function(store, tiddler) {\n try {\n var s = '';\n store.forEachField(tiddler, \n function(tiddler, fieldName, value) {\n // don't store stuff from the temp namespace\n if (!fieldName.match(/^temp\s./)) {\n if (value)\n value = value.htmlEncode();\n s += ['<pre title="',fieldName,'">',value,'</pre>'].join("");\n }\n });\n return ['<div title="',tiddler.title.htmlEncode(),'">',s,'</div>'].join("");\n\n } catch (e) {\n showException(e, config.messages.tiddlerSaveError.format([tiddler.title]));\n return '';\n }\n};\n\nabego.XHTML10Saver.prototype.externalize = function(store) {\n return ["<div class='twXHTML10'>\sn",SaverBase.prototype.externalize.apply(this, arguments),"\sn</div>"].join("");\n};\n\n\n//--------------------------------\n// Overwrite TiddlyWiki.prototype.getSaver to use the XHTML10 format on save\n\nTiddlyWiki.prototype.getSaver = function() {\n if (!this.saver) \n this.saver = new abego.XHTML10Saver();\n return this.saver;\n};\n\n//======================================\n// Install the Loader into the HTML page\n\n(function() {\n // The loader code will be inserted into the PostHead markup block,\n // so it can be executed before tiddlers are loaded. We cannot just put this\n // code into a normal plugin since this "load" code is required to load\n // tiddlers. I.e. this code must be executed before any tiddlers/plugins\n // can be loaded.\n\n var getXHTML10LoaderBlock = function() {\n // The loader code in a big JavaScript string.\n // You may get a non-stringified version of the XHTML10Loader source code at\n //\n\n XHTML10LoaderCode = \n "if (!window.abego) window.abego = {};\snif (!abego.XHTML10Loader) {\sn\st//-"+\n "-------------------------------\sn\st// abego.XHTML10Loader (inherits from"+\n " LoaderBase)\sn\st\sn\stabego.XHTML10Loader = function() {};\sn\stabego.XHTML10Loa"+\n "der.prototype = new LoaderBase();\sn\st\sn\stabego.XHTML10Loader.prototype.lin"+\n "go = {\sn\st\stunnamedValue: \s"Unnamed value\s",\sn\st\stredefining: \s"Redefining valu"+\n "e of %0\s",\sn\st\stnoXHTML10Format: \s"Storage not in XHTML 1.0 format\s"\sn\st}\sn\st\sn\sta"+\n "bego.XHTML10Loader.prototype.getTitle = function(store, e) {\sn\st\stvar tit"+\n "le = null;\sn\st\stif(e.getAttribute)\sn\st\st\sttitle = e.getAttribute('title');\sn\st\st"+\n "if(!title && {\st\sn\st\st\stvar lenPrefix = store.idPrefix.length;\sn\st\st\stif "+\n "(,lenPrefix) == store.idPrefix)\sn\st\st\st\sttitle ="+\n "enPrefix);\sn\st\st}\sn\st\streturn title;\sn\st};\sn\st\sn\"+\n "ternalizeTiddler = function(store, tiddler, title, data) {\sn\st\stvar field"+\n "s = {};\sn\st\stvar elems = data.childNodes;\sn\st\stfor(var i = 0; i < elems.leng"+\n "th; i++) {\sn\st\st\stvar e = elems[i];\sn\st\st\stvar name = e.getAttribute('title');"+\n "\sn\st\st\stif (!name) \sn\st\st\st\stthrow this.lingo.unnamedValue;\sn\st\st\stif (fields[name]"+\n " !== undefined) \sn\st\st\st\stthrow this.lingo.redefining.format([name]);\sn\st\st\stfi"+\n "elds[name] = getNodeText(e.firstChild); \sn\st\st}\sn\st\sn\st\st// Extract (and remov"+\n "e) the standard fields from the extended fields\sn\st\stvar text = fields.te"+\n "xt;\sn\st\stvar modifier = fields.modifier;\sn\st\stvar modified = Date.convertFro"+\n "mYYYYMMDDHHMM(fields.modified);\sn\st\stvar c = fields.created;\sn\st\stvar create"+\n "d = c ? Date.convertFromYYYYMMDDHHMM(c) : modified;\sn\st\stvar tags = field"+\n "s.tags;\sn\st\stdelete fields.modifier;\sn\st\stdelete fields.modified;\sn\st\stdelete f"+\n "ields.created;\sn\st\stdelete fields.tags;\sn\st\stdelete fields.text;\sn\st\stdelete fi"+\n "elds.title;\sn\st\sn\st\sttiddler.assign(title,text,modifier,modified,tags,creat"+\n "ed,fields);\sn\st\st\sn\st\streturn tiddler;\sn\st};\sn\st\sn\stvar findRootNode = function(no"+\n "des) {\sn\st\stif (nodes) {\sn\st\st\st// skip leading text nodes\sn\st\st\stfor (var i = 0;"+\n " i < nodes.length; i++)\sn\st\st\st\stif (nodes[i].nodeType != 3)\sn\st\st\st\st\stbreak;\sn\st\st"+\n "\st\st\st\sn\st\st\stif (i < nodes.length && nodes[i].className == 'twXHTML10')\sn\st\st\st\st"+\n "return nodes[i];\sn\st\st}\sn\st};\sn\st\sn\stabego.XHTML10Loader.prototype.loadTiddlers"+\n " = function(store,nodes) {\sn\st\st// in the twXHMTL10 format all tiddler el"+\n "ements are contained in one enclosing DIV\sn\st\st// that contains the forma"+\n "t information\sn\st\stvar root = findRootNode(nodes)\sn\st\stif (!root) \sn\st\st\stthrow "+\n "this.lingo.noXHTML10Format;\sn\st\streturn LoaderBase.prototype.loadTiddlers"+\n ".apply(this, [store, root.childNodes]);\sn\st};\sn\st\sn\st\sn\st//-------------------"+\n "-------------\sn\st// Hijack the loadFromDiv\sn\st(function() {\sn\st\stvar origTidd"+\n "lyWikiLoadFromDiv = TiddlyWiki.prototype.loadFromDiv;\sn\st\"+\n "totype.loadFromDiv = function(srcID,idPrefix) {\sn\st\st\st// use the XHTML 1."+\n "0 loader when the storearea is in 'twXHTML10' format,\sn\st\st\st// otherwise "+\n "use the default loader\sn\st\st\stvar e = document.getElementById(srcID);\sn\st\st\sti"+\n "f (e && findRootNode(e.childNodes))\sn\st\st\st\stthis.loader = new abego.XHTML1"+\n "0Loader();\sn\st\st\streturn origTiddlyWikiLoadFromDiv.apply(this, arguments);"+\n "\sn\st\st};\sn\st})();\sn}\sn\sn";\n return '<'+'script type="text/javascript">\sn//<![CDATA[\sn'+XHTML10LoaderCode+'\sn//]]>\sn</script'+'>\sn';\n };\n\n var insertLoaderBlock = function() {\n if (!store)\n throw "XHTML10LoaderInstaller must run as a plugin";\n \n var START = "<!--XHMTL10Loader-START-->";\n var END = "<!--XHMTL10Loader-END-->";\n \n var postHeadText = store.getTiddlerText("MarkupPostHead");\n if (postHeadText.getChunk(START, END)) \n return; // already installed\n\n postHeadText += "\sn"+START+getXHTML10LoaderBlock()+END+"\sn";\n var tiddler = store.getTiddler("MarkupPostHead");\n var tags = tiddler ? tiddler.tags : [];\n store.saveTiddler("MarkupPostHead","MarkupPostHead",postHeadText,config.options.txtUserName,new Date(),tags);\n alert("XHTML10Loader installed.\snPlease save and reload your TiddlyWiki to complete the installation. After that your TiddlyWiki will be stored in an XHTML 1.0 compliant format.");\n };\n \n insertLoaderBlock(); \n})();\n\n} // of single install\n\n//}}}\n
In late 1990s Microsoft came up with XMLHttpRequest technology. On the server side it first appeared in Outlook Web Access 2000 and on the client side in MSIE 5.\n\nXMLHttpRequest allows a program to request data without waiting for a server reply to continue onto other processing.\n\n\nCopyright 2007 [img[tooltip="sharealike attribution copyright license"|cc_attributionsharealike_88x31.png]] ShareAlikeCopyright
/***\n|''Name:''|YourSearchPlugin|\n|''Version:''|2.1.1 (2007-03-11)|\n|''Source:''| ([[|]])|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|]]|\n|''Copyright:''|&copy; 2005-2006 [[abego Software|]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; ~InternetExplorer 6.0|\n!About YourSearch\nYourSearch 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!\n\nFor more information see [[Help|YourSearch Help]].\n!Compatibility\nThis plugin requires TiddlyWiki 2.1. \nCheck the [[archive|]] for ~YourSearchPlugins supporting older versions of TiddlyWiki.\n!Source Code\n***/\n/***\nThis plugin's source code is compressed (and hidden). Use this [[link|]] to get the readable source code.\n***/\n///%\nif(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:1,revision:1,source:"",licence:"[[BSD open source license (abego Software)|]]",copyright:"Copyright (c) abego Software GmbH, 2005-2007 ("};if(!window.abego){window.abego={};}if(!Array.forEach){Array.forEach=function(_1,_2,_3){for(var i=0,len=_1.length;i<len;i++){,_1[i],i,_1);}};Array.prototype.forEach=function(_5,_6){for(var i=0,len=this.length;i<len;i++){,this[i],i,this);}};}abego.toInt=function(s,_9){if(!s){return _9;}var n=parseInt(s);return (n==NaN)?_9:n;};abego.createEllipsis=function(_b){var e=createTiddlyElement(_b,"span");e.innerHTML="&hellip;";};abego.shallowCopy=function(_d){if(!_d){return _d;}var _e={};for(var n in _d){_e[n]=_d[n];}return _e;};abego.copyOptions=function(_10){return !_10?{}:abego.shallowCopy(_10);};abego.countStrings=function(_11,s){if(!s){return 0;}var len=s.length;var n=0;var _15=0;while(1){var i=_11.indexOf(s,_15);if(i<0){return n;}n++;_15=i+len;}return n;};abego.getBracedText=function(_17,_18,_19){if(!_18){_18=0;}var re=/\s{([^\s}]*)\s}/gm;re.lastIndex=_18;var m=re.exec(_17);if(m){var s=m[1];var _1d=abego.countStrings(s,"{");if(!_1d){if(_19){_19.lastIndex=re.lastIndex;}return s;}var len=_17.length;for(var i=re.lastIndex;i<len&&_1d;i++){var c=_17.charAt(i);if(c=="{"){_1d++;}else{if(c=="}"){_1d--;}}}if(!_1d){if(_19){_19.lastIndex=i-1;}return _17.substring(m.index+1,i-1);}}};,_22,_23,_24){if(!_24){_24=[];}_21.forEach(function(t){if(,t)){_24.push(t);}});return _24;};abego.TiddlerFilterTerm=function(_26,_27){if(!_27){_27={};}var _28=_26;if(!_27.textIsRegExp){_28=_26.escapeRegExp();if(_27.fullWordMatch){_28="\s\sb"+_28+"\s\sb";}}var _29=new RegExp(_28,"m"+(_27.caseSensitive?"":"i"));this.tester=new abego.MultiFieldRegExpTester(_29,_27.fields,_27.withExtendedFields);};abego.TiddlerFilterTerm.prototype.test=function(_2a){return this.tester.test(_2a);};abego.parseNewTiddlerCommandLine=function(s){var m=/(.*?)\s.(?:\ss+|$)([^#]*)(#.*)?/.exec(s);if(!m){m=/([^#]*)()(#.*)?/.exec(s);}if(m){var r;if(m[3]){var s2=m[3].replace(/#/g,"");r=s2.parseParams("tag");}else{r=[[]];}var _2f=m[2]?m[2].trim():"";r.push({name:"text",value:_2f});r[0].text=[_2f];return {title:m[1].trim(),params:r};}else{return {title:s.trim(),params:[[]]};}};abego.parseTiddlerFilterTerm=function(_30,_31,_32){var re=/\ss*(?:(?:\s{([^\s}]*)\s})|(?:(=)|([#%!])|(?:(\sw+)\ss*\s:(?!\s/\s/))|(?:(?:("(?:(?:\s\s")|[^"])+")|(?:\s/((?:(?:\s\s\s/)|[^\s/])+)\s/)|(\sw+\s:\s/\s/[^\ss]+)|([^\ss\s)\s-\s"]+)))))/mg;var _34={"!":"title","%":"text","#":"tags"};var _35={};var _36;re.lastIndex=_31;while(1){var i=re.lastIndex;var m=re.exec(_30);if(!m||m.index!=i){throw "Word or String literal expected";}if(m[1]){var _39={};var _3a=abego.getBracedText(_30,0,_39);if(!_3a){throw "Invalid {...} syntax";}var f=Function("tiddler","return ("+_3a+");");return {func:f,lastIndex:_39.lastIndex,markRE:null};}if(m[2]){_36=true;}else{if(m[3]){_35[_34[m[3]]]=1;}else{if(m[4]){_35[m[4]]=1;}else{var _3c=m[6];var _3d=m[5]?window.eval(m[5]):m[6]?m[6]:m[7]?m[7]:m[8];var _3e=abego.copyOptions(_3e);_3e.fullWordMatch=_36;_3e.textIsRegExp=_3c;var _3f=[];for(var n in _35){_3f.push(n);}if(_3f.length==0){_3e.fields=_3e.defaultFields;}else{_3e.fields=_3f;_3e.withExtendedFields=false;}var _41=new abego.TiddlerFilterTerm(_3d,_3e);var _42=_3c?_3d:_3d.escapeRegExp();if(_42&&_36){_42="\s\sb"+_42+"\s\sb";}return {func:function(_43){return _41.test(_43);},lastIndex:re.lastIndex,markRE:_42?"(?:"+_42+")":null};}}}}};abego.BoolExp=function(s,_45,_46){this.s=s;var _47=_46&&_46.defaultOperationIs_OR;var _48=/\ss*(?:(\s-|not)|(\s())/gi;var _49=/\ss*\s)/g;var _4a=/\ss*(?:(and|\s&\s&)|(or|\s|\s|))/gi;var _4b=/\ss*[^\s)\ss]/g;var _4c=/\ss*(\s-|not)?(\ss*\s()?/gi;var _4d;var _4e=function(_4f){_4c.lastIndex=_4f;var m=_4c.exec(s);var _51;var _52;if(m&&m.index==_4f){_4f=_4c.lastIndex;_51=m[1];if(m[2]){var e=_4d(_4f);_49.lastIndex=e.lastIndex;if(!_49.exec(s)){throw "Missing ')'";}_52={func:e.func,lastIndex:_49.lastIndex,markRE:e.markRE};}}if(!_52){_52=_45(s,_4f,_46);}if(_51){_52.func=(function(f){return function(_55){return !f(_55);};})(_52.func);_52.markRE=null;}return _52;};_4d=function(_56){var _57=_4e(_56);while(1){var l=_57.lastIndex;_4a.lastIndex=l;var m=_4a.exec(s);var _5a;var _5b;if(m&&m.index==l){_5a=!m[1];_5b=_4e(_4a.lastIndex);}else{try{_5b=_4e(l);}catch(e){return _57;}_5a=_47;}_57.func=(function(_5c,_5d,_5e){return _5e?function(_5f){return _5c(_5f)||_5d(_5f);}:function(_60){return _5c(_60)&&_5d(_60);};})(_57.func,_5b.func,_5a);_57.lastIndex=_5b.lastIndex;if(!_57.markRE){_57.markRE=_5b.markRE;}else{if(_5b.markRE){_57.markRE=_57.markRE+"|"+_5b.markRE;}}}};var _61=_4d(0);this.evalFunc=_61.func;if(_61.markRE){this.markRegExp=new RegExp(_61.markRE,_46.caseSensitive?"mg":"img");}};abego.BoolExp.prototype.exec=function(){return this.evalFunc.apply(this,arguments);};abego.BoolExp.prototype.getMarkRegExp=function(){return this.markRegExp;};abego.BoolExp.prototype.toString=function(){return this.s;};abego.MultiFieldRegExpTester=function(re,_63,_64){;this.fields=_63?_63:["title","text","tags"];this.withExtendedFields=_64;};abego.MultiFieldRegExpTester.prototype.test=function(_65){var;for(var i=0;i<this.fields.length;i++){var s=store.getValue(_65,this.fields[i]);if(typeof s=="string"&&re.test(s)){return this.fields[i];}}if(this.withExtendedFields){return store.forEachField(_65,function(_69,_6a,_6b){return typeof _6b=="string"&&re.test(_6b)?_6a:null;},true);}return null;};abego.TiddlerQuery=function(_6c,_6d,_6e,_6f,_70){if(_6e){this.regExp=new RegExp(_6c,_6d?"mg":"img");this.tester=new abego.MultiFieldRegExpTester(this.regExp,_6f,_70);}else{this.expr=new abego.BoolExp(_6c,abego.parseTiddlerFilterTerm,{defaultFields:_6f,caseSensitive:_6d,withExtendedFields:_70});}this.getQueryText=function(){return _6c;};this.getUseRegExp=function(){return _6e;};this.getCaseSensitive=function(){return _6d;};this.getDefaultFields=function(){return _6f;};this.getWithExtendedFields=function(){return _70;};};abego.TiddlerQuery.prototype.test=function(_71){if(!_71){return false;}if(this.regExp){return this.tester.test(_71);}return this.expr.exec(_71);};abego.TiddlerQuery.prototype.filter=function(_72){return,this.test,this);};abego.TiddlerQuery.prototype.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}return this.expr.getMarkRegExp();};abego.TiddlerQuery.prototype.toString=function(){return (this.regExp?this.regExp:this.expr).toString();};abego.PageWiseRenderer=function(){this.firstIndexOnPage=0;};merge(abego.PageWiseRenderer.prototype,{setItems:function(_73){this.items=_73;this.setFirstIndexOnPage(0);},getMaxPagesInNavigation:function(){return 10;},getItemsCount:function(_74){return this.items?this.items.length:0;},getCurrentPageIndex:function(){return Math.floor(this.firstIndexOnPage/this.getItemsPerPage());},getLastPageIndex:function(){return Math.floor((this.getItemsCount()-1)/this.getItemsPerPage());},setFirstIndexOnPage:function(_75){this.firstIndexOnPage=Math.min(Math.max(0,_75),this.getItemsCount()-1);},getFirstIndexOnPage:function(){this.firstIndexOnPage=Math.floor(this.firstIndexOnPage/this.getItemsPerPage())*this.getItemsPerPage();return this.firstIndexOnPage;},getLastIndexOnPage:function(){return Math.min(this.getFirstIndexOnPage()+this.getItemsPerPage()-1,this.getItemsCount()-1);},onPageChanged:function(_76,_77){},renderPage:function(_78){if(_78.beginRendering){_78.beginRendering(this);}try{if(this.getItemsCount()){var _79=this.getLastIndexOnPage();var _7a=-1;for(var i=this.getFirstIndexOnPage();i<=_79;i++){_7a++;_78.render(this,this.items[i],i,_7a);}}}finally{if(_78.endRendering){_78.endRendering(this);}}},addPageNavigation:function(_7c){if(!this.getItemsCount()){return;}var _7d=this;var _7e=function(e){if(!e){var e=window.event;}var _81=abego.toInt(this.getAttribute("page"),0);var _82=_7d.getCurrentPageIndex();if(_81==_82){return;}var _83=_81*_7d.getItemsPerPage();_7d.setFirstIndexOnPage(_83);_7d.onPageChanged(_81,_82);};var _84;var _85=this.getCurrentPageIndex();var _86=this.getLastPageIndex();if(_85>0){_84=createTiddlyButton(_7c,"Previous","Go to previous page (Shortcut: Alt-'<')",_7e,"prev");_84.setAttribute("page",(_85-1).toString());_84.setAttribute("accessKey","<");}for(var i=-this.getMaxPagesInNavigation();i<this.getMaxPagesInNavigation();i++){var _88=_85+i;if(_88<0){continue;}if(_88>_86){break;}var _89=(i+_85+1).toString();var _8a=_88==_85?"currentPage":"otherPage";_84=createTiddlyButton(_7c,_89,"Go to page %0".format([_89]),_7e,_8a);_84.setAttribute("page",(_88).toString());}if(_85<_86){_84=createTiddlyButton(_7c,"Next","Go to next page (Shortcut: Alt-'>')",_7e,"next");_84.setAttribute("page",(_85+1).toString());_84.setAttribute("accessKey",">");}}});abego.LimitedTextRenderer=function(){var _8b=40;var _8c=4;var _8d=function(_8e,_8f,_90){var n=_8e.length;if(n==0){_8e.push({start:_8f,end:_90});return;}var i=0;for(;i<n;i++){var _93=_8e[i];if(_93.start<=_90&&_8f<=_93.end){var r;var _95=i+1;for(;_95<n;_95++){r=_8e[_95];if(r.start>_90||_8f>_93.end){break;}}var _96=_8f;var _97=_90;for(var j=i;j<_95;j++){r=_8e[j];_96=Math.min(_96,r.start);_97=Math.max(_97,r.end);}_8e.splice(i,_95-i,{start:_96,end:_97});return;}if(_93.start>_90){break;}}_8e.splice(i,0,{start:_8f,end:_90});};var _99=function(_9a){var _9b=0;for(var i=0;i<_9a.length;i++){var _9d=_9a[i];_9b+=_9d.end-_9d.start;}return _9b;};var _9e=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var _a0=function(s,_a2){if(!_9e(s[_a2])){return null;}for(var i=_a2-1;i>=0&&_9e(s[i]);i--){}var _a4=i+1;var n=s.length;for(i=_a2+1;i<n&&_9e(s[i]);i++){}return {start:_a4,end:i};};var _a6=function(s,_a8,_a9){var _aa;if(_a9){_aa=_a0(s,_a8);}else{if(_a8<=0){return _a8;}_aa=_a0(s,_a8-1);}if(!_aa){return _a8;}if(_a9){if(_aa.start>=_a8-_8c){return _aa.start;}if(_aa.end<=_a8+_8c){return _aa.end;}}else{if(_aa.end<=_a8+_8c){return _aa.end;}if(_aa.start>=_a8-_8c){return _aa.start;}}return _a8;};var _ab=function(s,_ad){var _ae=[];if(_ad){var _af=0;var n=s.length;var _b1=0;do{_ad.lastIndex=_af;var _b2=_ad.exec(s);if(_b2){if(_af<_b2.index){var t=s.substring(_af,_b2.index);_ae.push({text:t});}_ae.push({text:_b2[0],isMatch:true});_af=_b2.index+_b2[0].length;}else{_ae.push({text:s.substr(_af)});break;}}while(true);}else{_ae.push({text:s});}return _ae;};var _b4=function(_b5){var _b6=0;for(var i=0;i<_b5.length;i++){if(_b5[i].isMatch){_b6++;}}return _b6;};var _b8=function(s,_ba,_bb,_bc,_bd){var _be=Math.max(Math.floor(_bd/(_bc+1)),_8b);var _bf=Math.max(_be-(_bb-_ba),0);var _c0=Math.min(Math.floor(_bb+_bf/3),s.length);var _c1=Math.max(_c0-_be,0);_c1=_a6(s,_c1,true);_c0=_a6(s,_c0,false);return {start:_c1,end:_c0};};var _c2=function(_c3,s,_c5){var _c6=[];var _c7=_b4(_c3);var pos=0;for(var i=0;i<_c3.length;i++){var t=_c3[i];var _cb=t.text;if(t.isMatch){var _cc=_b8(s,pos,pos+_cb.length,_c7,_c5);_8d(_c6,_cc.start,_cc.end);}pos+=_cb.length;}return _c6;};var _cd=function(s,_cf,_d0){var _d1=_d0-_99(_cf);while(_d1>0){if(_cf.length==0){_8d(_cf,0,_a6(s,_d0,false));return;}else{var _d2=_cf[0];var _d3;var _d4;if(_d2.start==0){_d3=_d2.end;if(_cf.length>1){_d4=_cf[1].start;}else{_8d(_cf,_d3,_a6(s,_d3+_d1,false));return;}}else{_d3=0;_d4=_d2.start;}var _d5=Math.min(_d4,_d3+_d1);_8d(_cf,_d3,_d5);_d1-=(_d5-_d3);}}};var _d6=function(_d7,s,_d9,_da,_db){if(_da.length==0){return;}var _dc=function(_dd,s,_df,_e0,_e1){var t;var _e3;var pos=0;var i=0;var _e6=0;for(;i<_df.length;i++){t=_df[i];_e3=t.text;if(_e0<pos+_e3.length){_e6=_e0-pos;break;}pos+=_e3.length;}var _e7=_e1-_e0;for(;i<_df.length&&_e7>0;i++){t=_df[i];_e3=t.text.substr(_e6);_e6=0;if(_e3.length>_e7){_e3=_e3.substr(0,_e7);}if(t.isMatch){createTiddlyElement(_dd,"span",null,"marked",_e3);}else{createTiddlyText(_dd,_e3);}_e7-=_e3.length;}if(_e1<s.length){abego.createEllipsis(_dd);}};if(_da[0].start>0){abego.createEllipsis(_d7);}var _e8=_db;for(var i=0;i<_da.length&&_e8>0;i++){var _ea=_da[i];var len=Math.min(_ea.end-_ea.start,_e8);_dc(_d7,s,_d9,_ea.start,_ea.start+len);_e8-=len;}};this.render=function(_ec,s,_ee,_ef){if(s.length<_ee){_ee=s.length;}var _f0=_ab(s,_ef);var _f1=_c2(_f0,s,_ee);_cd(s,_f1,_ee);_d6(_ec,s,_f0,_f1,_ee);};};(function(){function alertAndThrow(msg){alert(msg);throw msg;}if(version.major<2||(version.major==2&&version.minor<1)){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.1 or newer.\sn\snCheck the archive for YourSearch plugins\snsupporting older versions of TiddlyWiki.\sn\snArchive:");}abego.YourSearch={};var _f3;var _f4;var _f5=function(_f6){_f3=_f6;};var _f7=function(){return _f3?_f3:[];};var _f8=function(){return _f3?_f3.length:0;};var _f9=4;var _fa=10;var _fb=2;var _fc=function(s,re){var m=s.match(re);return m?m.length:0;};var _100=function(_101,_102){var _103=_102.getMarkRegExp();if(!_103){return 1;}var _104=_101.title.match(_103);var _105=_104?_104.length:0;var _106=_fc(_101.getTags(),_103);var _107=_104?_104.join("").length:0;var _108=_101.title.length>0?_107/_101.title.length:0;var rank=_105*_f9+_106*_fb+_108*_fa+1;return rank;};var _10a=function(_10b,_10c,_10d,_10e,_10f,_110){_f4=null;var _111=_10b.reverseLookup("tags",_110,false);try{var _112=[];if(config.options.chkSearchInTitle){_112.push("title");}if(config.options.chkSearchInText){_112.push("text");}if(config.options.chkSearchInTags){_112.push("tags");}_f4=new abego.TiddlerQuery(_10c,_10d,_10e,_112,config.options.chkSearchExtendedFields);}catch(e){return [];}var _113=_f4.filter(_111);var _114=abego.YourSearch.getRankFunction();for(var i=0;i<_113.length;i++){var _116=_113[i];var rank=_114(_116,_f4);_116.searchRank=rank;}if(!_10f){_10f="title";}var _118=function(a,b){var _11b=a.searchRank-b.searchRank;if(_11b==0){if(a[_10f]==b[_10f]){return (0);}else{return (a[_10f]<b[_10f])?-1:+1;}}else{return (_11b>0)?-1:+1;}};_113.sort(_118);return _113;};var _11c=80;var _11d=50;var _11e=250;var _11f=50;var _120=25;var _121=10;var _122="yourSearchResult";var _123="yourSearchResultItems";var _124;var _125;var _126;var _127;var _128;var _129=function(){if(version.extensions.YourSearchPlugin.styleSheetInited){return;}version.extensions.YourSearchPlugin.styleSheetInited=true;setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");};var _12a=function(){return _125!=null&&_125.parentNode==document.body;};var _12b=function(){if(_12a()){document.body.removeChild(_125);}};var _12c=function(e){_12b();var _12e=this.getAttribute("tiddlyLink");if(_12e){var _12f=this.getAttribute("withHilite");var _130=highlightHack;if(_12f&&_12f=="true"&&_f4){highlightHack=_f4.getMarkRegExp();}story.displayTiddler(this,_12e);highlightHack=_130;}return (false);};var _131=function(){if(!_126){return;}var root=_126;var _133=findPosX(root);var _134=findPosY(root);var _135=root.offsetHeight;var _136=_133;var _137=_134+_135;var _138=findWindowWidth();if(_138<_125.offsetWidth){"px";_138=findWindowWidth();}var _139=_125.offsetWidth;if(_136+_139>_138){_136=_138-_139-30;}if(_136<0){_136=0;}"px";"px";"block";};var _13a=function(){if(_125){window.scrollTo(0,ensureVisible(_125));}if(_126){window.scrollTo(0,ensureVisible(_126));}};var _13b=function(){_131();_13a();};var _13c;var _13d;var _13e=new abego.PageWiseRenderer();var _13f=function(_140){this.itemHtml=store.getTiddlerText("YourSearchItemTemplate");if(!this.itemHtml){alertAndThrow("YourSearchItemTemplate not found");};if(!{,"div",_123);}};merge(_13f.prototype,{render:function(_141,_142,_143,_144){_13c=_144;_13d=_142;var item=createTiddlyElement(,"div",null,"yourSearchItem");item.innerHTML=this.itemHtml;applyHtmlMacros(item,null);refreshElements(item,null);},endRendering:function(_146){_13d=null;}});var _147=function(){if(!_125||!_126){return;}var html=store.getTiddlerText("YourSearchResultTemplate");if(!html){html="<b>Tiddler YourSearchResultTemplate not found</b>";}_125.innerHTML=html;applyHtmlMacros(_125,null);refreshElements(_125,null);var _149=new _13f(_125);_13e.renderPage(_149);_13b();};_13e.getItemsPerPage=function(){var n=(config.options.chkPreviewText)?abego.toInt(config.options.txtItemsPerPageWithPreview,_121):abego.toInt(config.options.txtItemsPerPage,_120);return (n>0)?n:1;};_13e.onPageChanged=function(){_147();};var _14b=function(){if(_126==null||!config.options.chkUseYourSearch){return;}if((_126.value==_124)&&_124&&!_12a()){if(_125&&(_125.parentNode!=document.body)){document.body.appendChild(_125);_13b();}else{abego.YourSearch.onShowResult(true);}}};var _14c=function(){_12b();_125=null;_124=null;};var _14d=function(self,e){while(e!=null){if(self==e){return true;}e=e.parentNode;}return false;};var _150=function(e){if({return;}if({return;}if(_125&&_14d(_125,{return;}_12b();};var _152=function(e){if(e.keyCode==27){_12b();}};addEvent(document,"click",_150);addEvent(document,"keyup",_152);var _154=function(text,_156,_157){_124=text;_f5(_10a(store,text,_156,_157,"title","excludeSearch"));abego.YourSearch.onShowResult();};var _158=function(_159,_15a,_15b,_15c,_15d,_15e){_129();_124="";var _15f=null;var _160=function(txt){if(config.options.chkUseYourSearch){_154(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_124=txt.value;};var _162=function(e){_160(_126);return false;};var _164=function(e){if(!e){var e=window.event;}_126=this;switch(e.keyCode){case 13:if(e.ctrlKey&&_128&&_12a()){_128.onclick.apply(_128,[e]);}else{_160(this);}break;case 27:if(_12a()){_12b();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){_14b();}if(this.value.length<3&&_15f){clearTimeout(_15f);}if(this.value.length>2){if(this.value!=_124){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_15f){clearTimeout(_15f);}var txt=this;_15f=setTimeout(function(){_160(txt);},500);}}else{if(_15f){clearTimeout(_15f);}}}if(this.value.length==0){_12b();}};var _168=function(e){;clearMessage();_14b();};var args=_15d.parseParams("list",null,true);var _16b=getFlag(args,"buttonAtRight");var _16c=getParam(args,"sizeTextbox",this.sizeTextbox);var btn;if(!_16b){btn=createTiddlyButton(_159,this.label,this.prompt,_162);}var txt=createTiddlyElement(_159,"input",null,null,null);if(_15b[0]){txt.value=_15b[0];}txt.onkeyup=_164;txt.onfocus=_168;txt.setAttribute("size",_16c);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}if(_16b){btn=createTiddlyButton(_159,this.label,this.prompt,_162);}_126=txt;_127=btn;};var _16f=function(){_12b();var _170=_f7();var n=_170.length;if(n){var _172=[];for(var i=0;i<n;i++){_172.push(_170[i].title);}story.displayTiddlers(null,_172);}};var _174=function(_175,_176,_177,_178){invokeMacro(_175,"option",_176,_177,_178);var elem=_175.lastChild;var _17a=elem.onclick;elem.onclick=function(e){var _17c=_17a.apply(this,arguments);_147();return _17c;};return elem;};var _17d=function(s){var _17f=["''","{{{","}}}","//","<<<","/***","***/"];var _180="";for(var i=0;i<_17f.length;i++){if(i!=0){_180+="|";}_180+="("+_17f[i].escapeRegExp()+")";}return s.replace(new RegExp(_180,"mg"),"").trim();};var _182=function(){var i=_13c;return (i>=0&&i<=9)?(i<9?(i+1):0):-1;};var _184=new abego.LimitedTextRenderer();var _185=function(_186,s,_188){_184.render(_186,s,_188,_f4.getMarkRegExp());};var _189=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_18a,_18b,_18c,_18d,_18e,tags,_190){_189.apply(this,arguments);_14c();};var _191=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_192){_191.apply(this,arguments);_14c();};config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",handler:function(_193,_194,_195,_196,_197,_198){if(_195.length==0){return;}var name=_195[0];var func=config.macros.yourSearch.funcs[name];if(func){func(_193,_194,_195,_196,_197,_198);}},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return _f8()>0;},"previewText":function(){return config.options.chkPreviewText;}},funcs:{itemRange:function(_19b){if(_f8()){var _19c=_13e.getLastIndexOnPage();var s="%0 - %1".format([_13e.getFirstIndexOnPage()+1,_19c+1]);createTiddlyText(_19b,s);}},count:function(_19e){createTiddlyText(_19e,_f8().toString());},query:function(_19f){if(_f4){createTiddlyText(_19f,_f4.toString());}},version:function(_1a0){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_1a0,"a");e.setAttribute("href","");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_1a3){var e=createTiddlyElement(_1a3,"a");e.setAttribute("href","");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>";},newTiddlerButton:function(_1a5){if(_f4){var r=abego.parseNewTiddlerCommandLine(_f4.getQueryText());var btn=config.macros.newTiddler.createNewTiddlerButton(_1a5,r.title,r.params,"new tiddler","Create a new tiddler based on search text. (Shortcut: Ctrl-Enter; Separators: '.', '#')",null,"text");var _1a8=btn.onclick;btn.onclick=function(){_12b();_1a8.apply(this,arguments);};_128=btn;}},linkButton:function(_1a9,_1aa,_1ab,_1ac,_1ad,_1ae){if(_1ab<2){return;}var _1af=_1ab[1];var text=_1ab<3?_1af:_1ab[2];var _1b1=_1ab<4?text:_1ab[3];var _1b2=_1ab<5?null:_1ab[4];var btn=createTiddlyButton(_1a9,text,_1b1,_12c,null,null,_1b2);btn.setAttribute("tiddlyLink",_1af);},closeButton:function(_1b4,_1b5,_1b6,_1b7,_1b8,_1b9){var _1ba=createTiddlyButton(_1b4,"close","Close the Search Results (Shortcut: ESC)",_12b);},openAllButton:function(_1bb,_1bc,_1bd,_1be,_1bf,_1c0){var n=_f8();if(n==0){return;}var _1c2=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _1c3=createTiddlyButton(_1bb,_1c2,"Open all found tiddlers (Shortcut: Alt-O)",_16f);_1c3.setAttribute("accessKey","O");},naviBar:function(_1c4,_1c5,_1c6,_1c7,_1c8,_1c9){_13e.addPageNavigation(_1c4);},"if":function(_1ca,_1cb,_1cc,_1cd,_1ce,_1cf){if(_1cc.length<2){return;}var _1d0=_1cc[1];var _1d1=(_1d0=="not");if(_1d1){if(_1cc.length<3){return;}_1d0=_1cc[2];}var test=config.macros.yourSearch.tests[_1d0];var _1d3=false;try{if(test){_1d3=test(_1ca,_1cb,_1cc,_1cd,_1ce,_1cf)!=_1d1;}else{_1d3=(!eval(_1d0))==_1d1;}}catch(ex){}if(!_1d3){"none";}},chkPreviewText:function(_1d4,_1d5,_1d6,_1d7,_1d8,_1d9){var _1da=_1d6.slice(1).join(" ");var elem=_174(_1d4,"chkPreviewText",_1d7,_1d9);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;}}};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",handler:function(_1dc,_1dd,_1de,_1df,_1e0,_1e1){var name=_1de[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_1dc,_1dd,_1de,_1df,_1e0,_1e1);}},funcs:{title:function(_1e4,_1e5,_1e6,_1e7,_1e8,_1e9){if(!_13d){return;}var _1ea=_182();var _1eb=_1ea>=0?"Open tiddler (Shortcut: Alt-%0)".format([_1ea.toString()]):"Open tiddler";var btn=createTiddlyButton(_1e4,null,_1eb,_12c,null);btn.setAttribute("tiddlyLink",_13d.title);btn.setAttribute("withHilite","true");_185(btn,_13d.title,_11c);if(_1ea>=0){btn.setAttribute("accessKey",_1ea.toString());}},tags:function(_1ed,_1ee,_1ef,_1f0,_1f1,_1f2){if(!_13d){return;}_185(_1ed,_13d.getTags(),_11d);},text:function(_1f3,_1f4,_1f5,_1f6,_1f7,_1f8){if(!_13d){return;}_185(_1f3,_17d(_13d.text),_11e);},field:function(_1f9,_1fa,_1fb,_1fc,_1fd,_1fe){if(!_13d){return;}var name=_1fb[1];var len=_1fb.length>2?abego.toInt(_1fb[2],_11f):_11f;var v=store.getValue(_13d,name);if(v){_185(_1f9,_17d(v),len);}},number:function(_202,_203,_204,_205,_206,_207){var _208=_182();if(_208>=0){var text="%0)".format([_208.toString()]);createTiddlyElement(_202,"span",null,"shortcutNumber",text);}}}};var opts={chkUseYourSearch:true,chkPreviewText:true,chkSearchAsYouType:true,chkSearchInTitle:true,chkSearchInText:true,chkSearchInTags:true,chkSearchExtendedFields:true,txtItemsPerPage:_120,txtItemsPerPageWithPreview:_121};for(var n in opts){if(config.options[n]==undefined){config.options[n]=opts[n];}}config.shadowTiddlers.AdvancedOptions+="\sn<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]]) ([[help|YourSearch Help]])// ";config.shadowTiddlers["YourSearch Help"]="!Field Search\snWith the Field Search you can restrict your search to certain fields of a tiddler, e.g"+" only search the tags or only the titles. The general form is //fieldname//'':''//textToSearch// (e."+"g. {{{title:intro}}}). In addition one-character shortcuts are also supported for the standard field"+"s {{{title}}}, {{{text}}} and {{{tags}}}:\sn|!What you want|!What you type|!Example|\sn|Search ''titles "+"only''|start word with ''!''|{{{!jonny}}} (shortcut for {{{title:jonny}}})|\sn|Search ''contents/text "+"only''|start word with ''%''|{{{%football}}} (shortcut for {{{text:football}}})|\sn|Search ''tags only"+"''|start word with ''#''|{{{#Plugin}}} (shortcut for {{{tags:Plugin}}})|\sn\snUsing this feature you may"+" also search the extended fields (\s"Metadata\s") introduced with TiddlyWiki 2.1, e.g. use {{{priority:1"+"}}} to find all tiddlers with the priority field set to \s"1\s".\sn\snYou may search a word in more than one"+" field. E.g. {{{!#Plugin}}} (or {{{title:tags:Plugin}}} in the \s"long form\s") finds tiddlers containin"+"g \s"Plugin\s" either in the title or in the tags (but does not look for \s"Plugin\s" in the text). \sn\sn!Boole"+"an Search\snThe 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}}} (or {{{jonny and 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}}} (or {{{not jonny}}})|\sn\sn''Note:'' When you specify two"+" words, separated with a space, YourSearch finds all tiddlers that contain both words, but not neces"+"sarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need"+" to put the words into quotes. I.e. you type: {{{\s"john brown\s"}}}.\sn\snUsing parenthesis you may change "+"the default \s"left to right\s" evaluation of the boolean search. E.g. {{{not (jonny or jeremy)}}} finds"+" all tiddlers that contain neither \s"jonny\s" nor \s"jeremy. In contrast to this {{{not jonny or jeremy}}"+"} (i.e. without parenthesis) finds all tiddlers that either don't contain \s"jonny\s" or that contain \