WebGL viewer - From pictures\nhttp://www.digitalepigraphy.org/toolbox/digitize.html\n\nhttp://www.cubicvr.org/
<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\n<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\n<<option chkToggleLinks>> Clicking on links to tiddlers that are already open causes them to close\n^^(override with Control or other modifier key)^^\n<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\n<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> ConfirmBeforeDeleting\nMaximum number of lines in a tiddler edit box: <<option txtMaxEditRows>>\nFolder name for backup files: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field\nDAV-URL: <<option txtDAVURL 50>>
// //''Name:'' Blog\n// //''Version:'' 0.1\n// //''Author:'' [[Anshul Nigham|http://yavin4.anshul.info]] (adapted from an earlier plugin by [[ClintChecketts|http://www.checkettsweb.com/]]) \n// //''Type:'' Plugin\n// //''Description:'' Posts the most recently edited tiddlers when the TiddlyWiki is opened, similar to a blog.\n// //''Syntax:'' Change the daysOrPosts and numOfDaysOrPosts variables below\n// // If daysOrPosts variable is "days", tiddlers from the past numOfDaysOrPosts dates will be displayed\n// // If daysOrPosts variable is "posts", the past numOfDaysOrPosts tiddlers will be displayed \n\n// // ''Tested against:'' Tiddlywiki 2.1.3\n\n// // ''HOWTO:'' Simply copy this entire tiddler and paste it into a new tiddler in your own tiddlywiki.\n// // Tag it with systemConfig, and also with systemTiddlers if you don't want it to appear within the blog views. Name it anything you like\n\n// // History:\n// // 28MAY2007\n// // * Sort by 'created' date rather than 'modified' date, to be more blog-like (YMMV)\n// // * copy function into config object to work with Haloplugin, which turned out to not be useful, but now it'd done\n// // * made code to fit in a pretty block.\n\n//{{{\nvar daysOrPosts = "posts";\nvar numOfDaysOrPosts = "10";\n\nconfig.macros.blogplugin = {};\nconfig.macros.blogplugin.displayTopTiddlers = function ()\n{\n if(window.location.hash) daysOrPosts = "";\n if(daysOrPosts == "posts")\n {\n var tiddlerNames = store.reverseLookup("tags","systemTiddlers",false,"created");\n if (tiddlerNames.length < numOfDaysOrPosts)\n numOfDaysOrPosts = tiddlerNames.length;\n for(var t = tiddlerNames.length-numOfDaysOrPosts;t<=tiddlerNames.length-1;t++)\n story.displayTiddler("top",tiddlerNames[t].title,DEFAULT_VIEW_TEMPLATE,false,false);\n }\n if (daysOrPosts == "days"){\n var lastDay = "";\n var tiddlerNames = store.reverseLookup("tags","systemTiddlers",false,"modified");\n var t = tiddlerNames.length -1;\n var tFollower = 0;\n for(t;t>=0;t--) if(numOfDaysOrPosts >= 0){\n var theDay = tiddlerNames[t].created.convertToYYYYMMDDHHMM().substr(0,8);\n if(theDay != lastDay){\n numOfDaysOrPosts = numOfDaysOrPosts -1;\n lastDay = theDay;\n tFollower = t;\n }\n }\n\n for(tFollower = tFollower+1; tFollower < tiddlerNames.length;tFollower++){\n displayTiddler("top",tiddlerNames[tFollower].title,'ViewTemplate',false,false);\n }\n }\n}\n\nwindow.original_restart = window.restart;\nwindow.restart = function()\n{\n window.original_restart();\n config.macros.blogplugin.displayTopTiddlers();\n}\n//}}}
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler wikibar'></div><div class='title' macro='view title'></div><div class='editor' macro='edit tags' style='display:none;'></div><div class='GuestSign' >Your Name: <span macro='option txtUserName'></span>(NickName)<br />Comments:</div><div class='editor' macro='edit text'></div>
LegacyHomepage\nHelloThere
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* Resources:\n** http://tiddlywiki.com/\n** https://groups.google.com/forum/?fromgroups=#!forum/tiddlywiki\n** http://tiddlertoddler.tiddlyspot.com/ \n** http://www.tiddlytools.com/ - plugins e.t.c.\n** http://tiddlyvault.tiddlyspot.com/ - more plugins\n** http://www.tiddlywiki.com/archive/ - legacy versions\n
Welcome to this wiki - based on [[TiddlyWiki|http://tiddlywiki.com/]], a reusable non-linear personal web notebook. It's a unique wiki that people love using to keep ideas and information organised. [[TiddlyWiki|http://tiddlywiki.com/]] was originally created by JeremyRuston and is now a thriving open source project with a busy Community of independent developers - for more details, please see original site http://tiddlywiki.com/.\n\nTiddlyWiki is written in HTML, CSS and JavaScript to run on any reasonably modern browser without needing any ServerSide logic. It allows anyone to create personal SelfContained hypertext documents that can be published to a WebServer, sent by email, stored in a DropBox or kept on a USB thumb drive to make a WikiOnAStick. Because it doesn't need to be installed and configured it makes a great GuerillaWiki.\n\nThis is a legacy revision <<version>> of TiddlyWiki Classic, and is published under an OpenSourceLicense, for the purpose only to support the now also legacy - but still functional - [[SaveToDAV|SaveChangesToDAV]] plugin.\n\nA comprehensive re-write of the entire TiddlyWiki system - now as of lately also by default include **WEBDAV** save function. http://tiddlywiki.com
//Removes hidden tiddlers from lists.//\n//Version: 0.2.0//\n\n//{{{\nTiddlyWiki.prototype.getTags = function()\n{\n var results = [];\n this.forEachTiddler(function(title,tiddler) {\n if(tiddler.tags.find('excludeLists')===null)\n {\n for(var g=0; g<tiddler.tags.length; g++){\n var tag = tiddler.tags[g];\n var taggingTiddler = store.fetchTiddler(tag);\n if(!taggingTiddler || !taggingTiddler.tags || taggingTiddler.tags.find('excludeLists')===null){\n var f = false;\n for(var c=0; c<results.length; c++){\n if(results[c][0] == tag){\n f = true;\n results[c][1]++;\n }\n }\n if(!f){\n results.push([tag,1]);\n }\n }\n }\n }\n });\n results.sort(function (a,b) {if(a[0].toLowerCase() == b[0].toLowerCase()){ return(0);} else {return (a[0].toLowerCase() < b[0].toLowerCase()) ? -1 : +1;} });\n return results;\n};\n\nTiddlyWiki.prototype.getOrphans = function()\n{\n var results = [];\n this.forEachTiddler(function (title,tiddler) {\n if(this.getReferringTiddlers(title).length === 0 && tiddler.tags.find('excludeLists')===null){\n results.push(title);\n }\n });\n results.sort();\n return results;\n};\n//}}}
/***\n|Name|ImportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|\n|Documentation|http://www.TiddlyTools.com/#ImportTiddlersPluginInfo|\n|Version|4.6.2|\n|Author|Eric Shulman|\n|License|http://www.TiddlyTools.com/#LegalStatements|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Description|interactive controls for import/export with filtering.|\nCombine tiddlers from any two TiddlyWiki documents. Interactively select and copy tiddlers from another TiddlyWiki source document. Includes prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. When done, a list of all imported tiddlers is written into [[ImportedTiddlers]].\n!!!!!Documentation\n<<<\nsee [[ImportTiddlersPluginInfo]] for details\n<<<\n!!!!!interactive control panel\n<<<\n<<importTiddlers inline>>\n{{clear{\n^^(see also: [[ImportTiddlers]] shadow tiddler)^^}}}\n<<<\n!!!!!Revisions\n<<<\n2011.02.14 4.6.2 fix OSX error: use picker.file.path\n2009.10.10 4.6.1 in createImportPanel, Use {{{window.Components}}} instead of {{{config.browser.isGecko}}} to avoid applying FF3 'file browse' fixup in Chrome.\n2009.10.06 4.6.0 added createTiddlerFromFile (import text files)\n|please see [[ImportTiddlersPluginInfo]] for additional revision details|\n2005.07.20 1.0.0 Initial Release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.ImportTiddlersPlugin= {major: 4, minor: 6, revision: 2, date: new Date(2011,2,14)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\n// default shadow definition\nconfig.shadowTiddlers.ImportTiddlers='<<importTiddlers inline>>';\n\n// use shadow tiddler content in backstage panel\nif (config.tasks) config.tasks.importTask.content='<<tiddler ImportTiddlers>>' // TW2.2 or above\n//}}}\n//{{{\n// backward-compatiblity for TW2.0.x and TW1.2.x\nif (config.macros.importTiddlers==undefined) config.macros.importTiddlers={};\nif (typeof merge=='undefined') {\n function merge(dst,src,preserveExisting) {\n for(var i in src) { if(!preserveExisting || dst[i] === undefined) dst[i] = src[i]; }\n return dst;\n }\n}\nif (config.browser.isGecko===undefined)\n config.browser.isGecko=(config.userAgent.indexOf('gecko')!=-1);\n//}}}\n//{{{\nmerge(config.macros.importTiddlers,{\n $: function(id) { return document.getElementById(id); }, // abbreviation\n label: 'import tiddlers',\n prompt: 'Copy tiddlers from another document',\n openMsg: 'Opening %0',\n openErrMsg: 'Could not open %0 - error=%1',\n readMsg: 'Read %0 bytes from %1',\n foundMsg: 'Found %0 tiddlers in %1',\n filterMsg: "Filtered %0 tiddlers matching '%1'",\n summaryMsg: '%0 tiddler%1 in the list',\n summaryFilteredMsg: '%0 of %1 tiddler%2 in the list',\n plural: 's are',\n single: ' is',\n countMsg: '%0 tiddlers selected for import',\n processedMsg: 'Processed %0 tiddlers',\n importedMsg: 'Imported %0 of %1 tiddlers from %2',\n loadText: 'please load a document...',\n closeText: 'close',\n doneText: 'done',\n startText: 'import',\n stopText: 'stop',\n local: true, // default to import from local file\n src: '', // path/filename or URL of document to import (retrieved from SiteUrl)\n proxy: '', // URL for remote proxy script (retrieved from SiteProxy)\n useProxy: false, // use specific proxy script in front of remote URL\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: '', // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 10, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n sync: false, // add 'server' fields to imported tiddlers (for sync function)\n lastFilter: '', // most recent filter (URL hash) applied\n lastAction: null, // most recent collision button performed\n index: 0, // current processing index in import list\n sort: '' // sort order for imported tiddler listbox\n});\n//}}}\n//{{{\n// hijack core macro handler\nif (config.macros.importTiddlers.coreHandler==undefined)\n config.macros.importTiddlers.coreHandler=config.macros.importTiddlers.handler;\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!params[0] || params[0].toLowerCase()=='core') { // default to built in\n if (config.macros.importTiddlers.coreHandler)\n config.macros.importTiddlers.coreHandler.apply(this,arguments);\n else \n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n } else if (params[0]=='link') { // show link to floating panel\n createTiddlyButton(place,params[1]||this.label,params[2]||this.prompt,onClickImportMenu);\n } else if (params[0]=='inline') {// show panel as INLINE tiddler content\n createImportPanel(place);\n this.$('importPanel').style.position='static';\n this.$('importPanel').style.display='block';\n } else if (config.macros.loadTiddlers)\n config.macros.loadTiddlers.handler(place,macroName,params); // any other params: loadtiddlers\n}\n//}}}\n//{{{\n// Handle link click to create/show/hide control panel\nfunction onClickImportMenu(e) { var e=e||window.event;\n var parent=resolveTarget(e).parentNode;\n var panel=document.getElementById('importPanel');\n if (panel==undefined || panel.parentNode!=parent) panel=createImportPanel(parent);\n var isOpen=panel.style.display=='block';\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,false,'none'));\n else\n panel.style.display=isOpen?'none':'block';\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n}\n//}}}\n//{{{\n// Create control panel: HTML, CSS\nfunction createImportPanel(place) {\n var cmi=config.macros.importTiddlers; // abbrev\n var panel=cmi.$('importPanel');\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(store.getTiddlerText('ImportTiddlersPlugin##css'),'importTiddlers');\n panel=createTiddlyElement(place,'span','importPanel',null,null)\n panel.innerHTML=store.getTiddlerText('ImportTiddlersPlugin##html');\n refreshImportList();\n if (!cmi.src.length) cmi.src=store.getTiddlerText('SiteUrl')||'';\n cmi.$('importSourceURL').value=cmi.src;\n if (!cmi.proxy.length) cmi.proxy=store.getTiddlerText('SiteProxy')||'SiteProxy';\n cmi.$('importSiteProxy').value=cmi.proxy;\n if (window.Components) { // FF3 FIXUP\n cmi.$('fileImportSource').style.display='none';\n cmi.$('importLocalPanelFix').style.display='block';\n }\n cmi.$('chkSync').checked=cmi.sync;\n cmi.$('chkImportTags').checked=cmi.importTags;\n cmi.$('chkKeepTags').checked=cmi.keepTags;\n cmi.$('chkAddTags').checked=cmi.addTags;\n cmi.$('txtNewTags').value=cmi.newTags;\n cmi.$('txtNewTags').style.display=cmi.addTags?'block':'none';\n cmi.$('chkSync').checked=cmi.sync;\n cmi.$('chkImportReport').checked=config.options.chkImportReport;\n return panel;\n}\n//}}}\n//{{{\n// process control interactions\nfunction onClickImportButton(which,event) {\n var cmi=config.macros.importTiddlers; // abbreviation\n var list=cmi.$('importList'); if (!list) return false;\n var thePanel=cmi.$('importPanel');\n var theCollisionPanel=cmi.$('importCollisionPanel');\n var theNewTitle=cmi.$('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'importFromFile': // show local panel\n case 'importFromWeb': // show HTTP panel\n cmi.local=(which.id=='importFromFile');\n cmi.showPanel('importLocalPanel',cmi.local);\n cmi.showPanel('importHTTPPanel',!cmi.local);\n break;\n case 'importOptions': // show/hide options panel\n cmi.showPanel('importOptionsPanel',cmi.$('importOptionsPanel').style.display=='none');\n break;\n case 'fileImportSource':\n case 'importLoad': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n cmi.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (cmi.src=='') break;\n // Load document, read it's DOM and fill the list\n cmi.loadRemoteFile(cmi.src,cmi.filterTiddlerList);\n break;\n case 'importSelectFeed': // select a pre-defined systemServer feed URL\n var p=Popup.create(which); if (!p) return false;\n var tids=store.getTaggedTiddlers('systemServer');\n if (!tids.length)\n createTiddlyText(createTiddlyElement(p,'li'),'no pre-defined server feeds');\n for (var t=0; t<tids.length; t++) {\n var u=store.getTiddlerSlice(tids[t].title,'URL');\n var d=store.getTiddlerSlice(tids[t].title,'Description');\n if (!d||!d.length) d=store.getTiddlerSlice(tids[t].title,'description');\n if (!d||!d.length) d=u;\n createTiddlyButton(createTiddlyElement(p,'li'),tids[t].title,d,\n function(){\n var u=this.getAttribute('url');\n document.getElementById('importSourceURL').value=u;\n config.macros.importTiddlers.src=u;\n document.getElementById('importLoad').onclick();\n },\n null,null,null,{url:u});\n }\n Popup.show();\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return false;\n // create popup with feed list\n // onselect, insert feed URL into input field.\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n if (list.options[t].value=='') continue;\n list.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value=='') continue;\n list.options[t].selected=!store.tiddlerExists(list.options[t].value);\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value==''||!store.tiddlerExists(list.options[t].value)) continue;\n for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler\n { var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }\n list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified>0); // updated tiddler\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value=='') continue;\n if (!store.tiddlerExists(list.options[t].value)) { list.options[t].selected=true; count++; continue; }\n for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler\n { var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }\n list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified!=0); // changed tiddler\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importApplyFilter': // filter list to include only matching tiddlers\n importReport(); // if an import was in progress, generate a report\n clearMessage();\n if (!cmi.all) // no tiddlers loaded = '0 selected'\n { displayMessage(cmi.countMsg.format([0])); return false; }\n var hash=cmi.$('importLastFilter').value;\n cmi.inbound=cmi.filterByHash('#'+hash,cmi.all);\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n cmi.$('importApplyToAll').checked=false;\n cmi.$('importStart').value=cmi.stopText;\n if (cmi.index>0) cmi.index=-1; // stop processing\n else cmi.index=importTiddlers(0); // or begin processing\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!cmi.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n cmi.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: ';\n theText +='[['+cmi.src+'#'+theItem.value+'|'+cmi.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString('MM/DD/YYYY 0hh:0mm:0ss');\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString('MM/DD/YYYY 0hh:0mm:0ss');\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (list.options.length==1) break;\n list.size-=(list.size>5)?1:0;\n cmi.listsize=list.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (list.options.length==1) break;\n list.size+=(list.size<list.options.length)?1:0;\n cmi.listsize=list.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (list.options.length==1) break;\n list.size=(list.size==list.options.length)?cmi.listsize:list.options.length;\n break;\n }\n}\n//}}}\n//{{{\nconfig.macros.importTiddlers.showPanel=function(place,show,skipAnim) {\n if (typeof place=='string') var place=document.getElementById(place);\n if (!place||!place.style) return;\n if(!skipAnim && anim && config.options.chkAnimate) anim.startAnimating(new Slider(place,show,false,'none'));\n else place.style.display=show?'block':'none';\n}\n//}}}\n//{{{\nfunction refreshImportList(selectedIndex) {\n var cmi=config.macros.importTiddlers; // abbrev\n var list=cmi.$('importList'); if (!list) return;\n // if nothing to show, reset list content and size\n if (!cmi.inbound) {\n while (list.length > 0) { list.options[0] = null; }\n list.options[0]=new Option(cmi.loadText,'',false,false);\n list.size=cmi.listsize;\n cmi.$('importLoad').disabled=false;\n cmi.$('importLoad').style.display='inline';\n cmi.$('importStart').disabled=true;\n cmi.$('importOptions').disabled=true;\n cmi.$('importOptions').style.display='none';\n cmi.$('fileImportSource').disabled=false;\n cmi.$('importFromFile').disabled=false;\n cmi.$('importFromWeb').disabled=false;\n cmi.$('importStart').value=cmi.startText;\n cmi.$('importClose').value=cmi.doneText;\n cmi.$('importSelectPanel').style.display='none';\n cmi.$('importOptionsPanel').style.display='none';\n return;\n }\n // there are inbound tiddlers loaded...\n cmi.$('importLoad').disabled=true;\n cmi.$('importLoad').style.display='none';\n cmi.$('importOptions').style.display='inline';\n cmi.$('importOptions').disabled=false;\n cmi.$('fileImportSource').disabled=true;\n cmi.$('importFromFile').disabled=true;\n cmi.$('importFromWeb').disabled=true;\n cmi.$('importClose').value=cmi.closeText;\n if (cmi.$('importSelectPanel').style.display=='none')\n cmi.showPanel('importSelectPanel',true);\n\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) cmi.sort='title'; // heading\n if (selectedIndex==1) cmi.sort='title';\n if (selectedIndex==2) cmi.sort='modified';\n if (selectedIndex==3) cmi.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < list.options.length; t++) {\n if (!list.options[t].selected) continue;\n if (list.options[t].value!='')\n count+=1;\n else { // if heading is selected, deselect it, and then select and count all in section\n list.options[t].selected=false;\n for ( t++; t<list.options.length && list.options[t].value!=''; t++) {\n list.options[t].selected=true;\n count++;\n }\n }\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n }\n cmi.$('importStart').disabled=!count;\n if (selectedIndex>3) return; // no refresh needed\n\n // get the alphasorted list of tiddlers\n var tiddlers=cmi.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (list.length > 0) { list.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n if (cmi.all.length==tiddlers.length)\n var summary=cmi.summaryMsg.format([tiddlers.length,(tiddlers.length!=1)?cmi.plural:cmi.single]);\n else\n var summary=cmi.summaryFilteredMsg.format([tiddlers.length,cmi.all.length,(cmi.all.length!=1)?cmi.plural:cmi.single]);\n list.options[i++]=new Option(summary,'',false,false);\n list.options[i++]=new Option(((cmi.sort=='title' )?'>':indent)+' [by title]','',false,false);\n list.options[i++]=new Option(((cmi.sort=='modified')?'>':indent)+' [by date]','',false,false);\n list.options[i++]=new Option(((cmi.sort=='tags')?'>':indent)+' [by tags]','',false,false);\n // output the tiddler list\n switch(cmi.sort) {\n case 'title':\n for(var t = 0; t < tiddlers.length; t++)\n list.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case 'modified':\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = '';\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n list.options[i++] = new Option(theSection,'',false,false);\n lastSection = theSection;\n }\n list.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case 'tags':\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n if (!tags || !tags.length) {\n if (theTitles['untagged']==undefined) { theTags.push('untagged'); theTitles['untagged']=new Array(); }\n theTitles['untagged'].push(title);\n }\n else for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n list.options[i++]=new Option(theTag,'',false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n list.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n list.selectedIndex=selectedIndex; // select current control item\n if (list.size<cmi.listsize) list.size=cmi.listsize;\n if (list.size>list.options.length) list.size=list.options.length;\n}\n//}}}\n//{{{\n// re-entrant processing for handling import with interactive collision prompting\nfunction importTiddlers(startIndex) {\n var cmi=config.macros.importTiddlers; // abbrev\n if (!cmi.inbound) return -1;\n var list=cmi.$('importList'); if (!list) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<cmi.inbound.length;t++)\n cmi.inbound[t].status='';\n for (var i=startIndex; i<list.options.length; i++) {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!list.options[i].selected) || ((t=list.options[i].value)==''))\n continue;\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==t) break;\n var inbound = cmi.inbound[j];\n var theExisting = store.getTiddler(inbound.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (inbound.status=='added')\n continue;\n // don't import the 'ImportedTiddlers' history from the other document...\n if (inbound.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (inbound.status.substr(0,7)!='replace') && (inbound.status.substr(0,5)!='merge'))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = '';\n if (cmi.importTags)\n newTags+=inbound.getTags() // import remote tags\n if (cmi.keepTags && theExisting)\n newTags+=' '+theExisting.getTags(); // keep existing tags\n if (cmi.addTags && cmi.newTags.trim().length)\n newTags+=' '+cmi.newTags; // add new tags\n inbound.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n inbound.status=(inbound.status=='')?'added':inbound.status;\n // set sync fields\n if (cmi.sync) {\n if (!inbound.fields) inbound.fields={}; // for TW2.1.x backward-compatibility\n inbound.fields['server.page.revision']=inbound.modified.convertToYYYYMMDDHHMM();\n inbound.fields['server.type']='file';\n inbound.fields['server.host']=(cmi.local&&!cmi.src.startsWith('file:')?'file:///':'')+cmi.src;\n }\n // do the import!\n store.suspendNotifications();\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags, inbound.fields, true, inbound.created);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value (needed for TW2.1.x and earlier)\n store.resumeNotifications();\n }\n return(-1); // signals that we really finished the entire list\n}\nfunction importStopped() {\n var cmi=config.macros.importTiddlers; // abbrev\n var list=cmi.$('importList'); if (!list) return;\n var theNewTitle=cmi.$('importNewTitle');\n if (cmi.index==-1){ \n cmi.$('importStart').value=cmi.startText;\n importReport(); // import finished... generate the report\n } else {\n // import collision...\n // show the collision panel and set the title edit field\n cmi.$('importStart').value=cmi.stopText;\n cmi.showPanel('importCollisionPanel',true);\n theNewTitle.value=list.options[cmi.index].value;\n if (cmi.$('importApplyToAll').checked && cmi.lastAction && cmi.lastAction.id!='importRename')\n onClickImportButton(cmi.lastAction);\n }\n}\n//}}}\n//{{{\nfunction importReport() {\n var cmi=config.macros.importTiddlers; // abbrev\n if (!cmi.inbound) return;\n // if import was not completed, the collision panel will still be open... close it now.\n var panel=cmi.$('importCollisionPanel'); if (panel) panel.style.display='none';\n // get the alphasorted list of tiddlers\n var tiddlers = cmi.inbound;\n // gather the statistics\n var count=0; var total=0;\n for (var t=0; t<tiddlers.length; t++) {\n if (!tiddlers[t].status || !tiddlers[t].status.trim().length) continue;\n if (tiddlers[t].status.substr(0,7)!='skipped') count++;\n total++;\n }\n // generate a report\n if (total) displayMessage(cmi.processedMsg.format([total]));\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport=new Tiddler(); theReport.title='ImportedTiddlers'; theReport.text=''; }\n // format the report content\n var now = new Date();\n var newText = 'On '+now.toLocaleString()+', '+config.options.txtUserName\n newText +=' imported '+count+' tiddler'+(count==1?'':'s')+' from\sn[['+cmi.src+'|'+cmi.src+']]:\sn';\n if (cmi.addTags && cmi.newTags.trim().length)\n newText += 'imported tiddlers were tagged with: "'+cmi.newTags+'"\sn';\n newText += '<<<\sn';\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status)\n newText += '#[['+tiddlers[t].title+']] - '+tiddlers[t].status+'\sn';\n newText += '<<<\sn';\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!='')?'\sn----\sn':'')+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags, theReport.fields);\n story.displayTiddler(null,theReport.title,1,null,null,false);\n story.refreshTiddler(theReport.title,1,true);\n }\n // reset status flags\n for (var t=0; t<cmi.inbound.length; t++) cmi.inbound[t].status='';\n // mark document as dirty and let display update as needed\n if (count) { store.setDirty(true); store.notifyAll(); }\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(cmi.importedMsg.format([count,tiddlers.length,cmi.src.replace(/%20/g,' ')]));\n}\n//}}}\n//{{{\n// // File and XMLHttpRequest I/O\nconfig.macros.importTiddlers.askForFilename=function(here) {\n var msg=here.title; // use tooltip as dialog box message\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf('/'); if (slashpos==-1) slashpos=path.lastIndexOf('\s\s'); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n var file='';\n var result='';\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeOpen);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.path;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XPSP2 IE only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { // fallback\n var result=prompt(msg,path+file);\n }\n }\n return result;\n}\n\nconfig.macros.importTiddlers.loadRemoteFile = function(src,callback) {\n if (src==undefined || !src.length) return null; // filename is required\n var original=src; // URL as specified\n var hashpos=src.indexOf('#'); if (hashpos!=-1) src=src.substr(0,hashpos); // URL with #... suffix removed (needed for IE)\n clearMessage();\n displayMessage(this.openMsg.format([src.replace(/%20/g,' ')]));\n if (src.substr(0,5)!='http:' && src.substr(0,5)!='file:') { // if not a URL, read from local filesystem\n var txt=loadFile(src);\n if (!txt) { // file didn't load, might be relative path.. try fixup\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 src=pathPrefix+src;\n if (pathPrefix.substr(0,5)!='http:') src=getLocalPath(src);\n var txt=loadFile(src);\n }\n if (!txt) { // file still didn't load, report error\n displayMessage(config.macros.importTiddlers.openErrMsg.format([src.replace(/%20/g,' '),'(filesystem error)']));\n } else {\n displayMessage(config.macros.importTiddlers.readMsg.format([txt.length,src.replace(/%20/g,' ')]));\n if (version.major+version.minor*.1+version.revision*.01!=2.52) txt=convertUTF8ToUnicode(txt);\n if (callback) callback(true,original,txt,src,null);\n }\n } else {\n doHttp('GET',src,null,null,config.options.txtRemoteUsername,config.options.txtRemotePassword,callback,original,null);\n }\n}\n\nconfig.macros.importTiddlers.readTiddlersFromHTML=function(html){\n var remoteStore=new TiddlyWiki();\n remoteStore.importTiddlyWiki(html);\n return remoteStore.getTiddlers('title'); \n}\n\nconfig.macros.importTiddlers.readTiddlersFromCSV=function(CSV){\n var remoteStore=new TiddlyWiki();\n // GET NAMES\n var lines=CSV.replace(/\sr/g,'').split('\sn');\n var names=lines.shift().replace(/"/g,'').split(',');\n CSV=lines.join('\sn');\n // ENCODE commas and newlines within quoted values\n var comma='!~comma~!'; var commaRE=new RegExp(comma,'g');\n var newline='!~newline~!'; var newlineRE=new RegExp(newline,'g');\n CSV=CSV.replace(/"([^"]*?)"/g,\n function(x){ return x.replace(/\s,/g,comma).replace(/\sn/g,newline); });\n // PARSE lines\n var lines=CSV.split('\sn');\n for (var i=0; i<lines.length; i++) { if (!lines[i].length) continue;\n var values=lines[i].split(',');\n // DECODE commas, newlines, and doubled-quotes, and remove enclosing quotes (if any)\n for (var v=0; v<values.length; v++)\n values[v]=values[v].replace(commaRE,',').replace(newlineRE,'\sn')\n .replace(/^"|"$/g,'').replace(/""/g,'"');\n // EXTRACT tiddler values\n var title=''; var text=''; var tags=[]; var fields={};\n var created=null; var when=new Date(); var who=config.options.txtUserName;\n for (var v=0; v<values.length; v++) { var val=values[v];\n if (names[v]) switch(names[v].toLowerCase()) {\n case 'title': title=val.replace(/\s[\s]\s|/g,'_'); break;\n case 'created': created=new Date(val); break;\n case 'modified':when=new Date(val); break;\n case 'modifier':who=val; break;\n case 'text': text=val; break;\n case 'tags': tags=val.readBracketedList(); break;\n default: fields[names[v].toLowerCase()]=val; break;\n }\n }\n // CREATE tiddler in temporary store\n if (title.length)\n remoteStore.saveTiddler(title,title,text,who,when,tags,fields,true,created||when);\n }\n return remoteStore.getTiddlers('title');\n}\n\nconfig.macros.importTiddlers.createTiddlerFromFile=function(src,txt) {\n var t=new Tiddler();\n var pos=src.lastIndexOf("/"); if (pos==-1) pos=src.lastIndexOf("\s\s");\n t.title=pos==-1?src:src.substr(pos+1);\n t.text=txt; \n t.created=t.modified=new Date();\n t.modifier=config.options.txtUserName;\n if (src.substr(src.length-3,3)=='.js') t.tags=['systemConfig'];\n return [t];\n}\n\nconfig.macros.importTiddlers.filterTiddlerList=function(success,params,txt,src,xhr){\n var cmi=config.macros.importTiddlers; // abbreviation\n var src=src.replace(/%20/g,' ');\n if (!success) { displayMessage(cmi.openErrMsg.format([src,xhr.status])); return; }\n cmi.all=cmi.readTiddlersFromHTML(txt);\n if (!cmi.all||!cmi.all.length) cmi.all=cmi.readTiddlersFromCSV(txt)\n if (!cmi.all||!cmi.all.length) cmi.all=cmi.createTiddlerFromFile(src,txt)\n var count=cmi.all?cmi.all.length:0;\n var querypos=src.lastIndexOf('?'); if (querypos!=-1) src=src.substr(0,querypos);\n displayMessage(cmi.foundMsg.format([count,src]));\n cmi.inbound=cmi.filterByHash(params,cmi.all); // use full URL including hash (if any)\n cmi.$('importLastFilter').value=cmi.lastFilter;\n window.refreshImportList(0);\n}\n\nconfig.macros.importTiddlers.filterByHash=function(src,tiddlers){\n var hashpos=src.lastIndexOf('#'); if (hashpos==-1) return tiddlers;\n var hash=src.substr(hashpos+1); if (!hash.length) return tiddlers;\n var tids=[];\n var params=hash.parseParams('anon',null,true,false,false);\n for (var p=1; p<params.length; p++) {\n switch (params[p].name) {\n case 'anon':\n case 'open':\n tids.pushUnique(params[p].value);\n break;\n case 'tag':\n if (store.getMatchingTiddlers) { // for boolean expressions - see MatchTagsPlugin\n var r=store.getMatchingTiddlers(params[p].value,null,tiddlers);\n for (var t=0; t<r.length; t++) tids.pushUnique(r[t].title);\n } else for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].isTagged(params[p].value))\n tids.pushUnique(tiddlers[t].title);\n break;\n case 'story':\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].title==params[p].value) {\n tiddlers[t].changed();\n for (var s=0; s<tiddlers[t].links.length; s++)\n tids.pushUnique(tiddlers[t].links[s]);\n break;\n }\n break;\n case 'search':\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].text.indexOf(params[p].value)!=-1)\n tids.pushUnique(tiddlers[t].title);\n break;\n }\n }\n var matches=[];\n for (var t=0; t<tiddlers.length; t++)\n if (tids.contains(tiddlers[t].title))\n matches.push(tiddlers[t]);\n displayMessage(config.macros.importTiddlers.filterMsg.format([matches.length,hash]));\n config.macros.importTiddlers.lastFilter=hash;\n return matches;\n}\n//}}}\n/***\n!!!Control panel CSS\n//{{{\n!css\n#importPanel {\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\n padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em;\n}\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\n#importPanel select { width:100%;margin:0px;font-size:8pt;line-height:110%;}\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\n#importPanel .box { border:1px solid #000; background-color:#eee; padding:3px 5px; margin-bottom:5px; -moz-border-radius:5px;-webkit-border-radius:5px;}\n#importPanel .topline { border-top:1px solid #999; padding-top:2px; margin-top:2px; }\n#importPanel .rad { width:auto; }\n#importPanel .chk { width:auto; margin:1px;border:0; }\n#importPanel .btn { width:auto; }\n#importPanel .btn1 { width:98%; }\n#importPanel .btn2 { width:48%; }\n#importPanel .btn3 { width:32%; }\n#importPanel .btn4 { width:23%; }\n#importPanel .btn5 { width:19%; }\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\n#backstagePanel #importPanel { left:10%; right:auto; }\n!end\n//}}}\n!!!Control panel HTML\n//{{{\n!html\n<!-- source and report -->\n<table><tr><td align=left>\n import from\n <input type="radio" class="rad" name="importFrom" id="importFromFile" value="file" CHECKED\n onclick="onClickImportButton(this,event)" title="show file controls"> local file\n <input type="radio" class="rad" name="importFrom" id="importFromWeb" value="http"\n onclick="onClickImportButton(this,event)" title="show web controls"> web server\n</td><td align=right>\n <input type=checkbox class="chk" id="chkImportReport"\n onClick="config.options['chkImportReport']=this.checked;"> create report\n</td></tr></table>\n\n<div class="box" id="importSourcePanel" style="margin:.5em">\n<div id="importLocalPanel" style="display:block;margin-bottom:2px;"><!-- import from local file -->\nenter or browse for source path/filename<br>\n<input type="file" id="fileImportSource" size=57 style="width:100%"\n onKeyUp="config.macros.importTiddlers.src=this.value"\n onChange="config.macros.importTiddlers.src=this.value;document.getElementById('importLoad').onclick()">\n<div id="importLocalPanelFix" style="display:none"><!-- FF3 FIXUP -->\n <input type="text" id="fileImportSourceFix" style="width:90%"\n title="Enter a path/file to import"\n onKeyUp="config.macros.importTiddlers.src=this.value"\n onChange="config.macros.importTiddlers.src=this.value;document.getElementById('importLoad').onclick()">\n <input type="button" id="fileImportSourceFixButton" style="width:7%" value="..."\n title="Select a path/file to import"\n onClick="var r=config.macros.importTiddlers.askForFilename(this); if (!r||!r.length) return;\n document.getElementById('fileImportSourceFix').value=r;\n config.macros.importTiddlers.src=r;\n document.getElementById('importLoad').onclick()">\n</div><!--end FF3 FIXUP-->\n</div><!--end local-->\n<div id="importHTTPPanel" style="display:none;margin-bottom:2px;"><!-- import from http server -->\n<table><tr><td align=left>\n enter a URL or <a href="javascript:;" id="importSelectFeed"\n onclick="return onClickImportButton(this,event)" title="select a pre-defined 'systemServer' URL">\n select a server</a><br>\n</td><td align=right>\n <input type="checkbox" class="chk" id="importUsePassword"\n onClick="config.macros.importTiddlers.usePassword=this.checked;\n config.macros.importTiddlers.showPanel('importIDPWPanel',this.checked,true);">password\n <input type="checkbox" class="chk" id="importUseProxy"\n onClick="config.macros.importTiddlers.useProxy=this.checked;\n config.macros.importTiddlers.showPanel('importSiteProxy',this.checked,true);">proxy\n</td></tr></table>\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\n onChange="config.macros.importTiddlers.proxy=this.value;">\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\n onKeyUp="config.macros.importTiddlers.src=this.value"\n onChange="config.macros.importTiddlers.src=this.value;">\n<div id="importIDPWPanel" style="text-align:center;margin-top:2px;display:none";>\nusername: <input type=text id="txtImportID" style="width:25%" \n onChange="config.options.txtRemoteUsername=this.value;">\n password: <input type=password id="txtImportPW" style="width:25%" \n onChange="config.options.txtRemotePassword=this.value;">\n</div><!--end idpw-->\n</div><!--end http-->\n</div><!--end source-->\n\n<div class="box" id="importSelectPanel" style="display:none;margin:.5em;">\n<table><tr><td align=left>\nselect:\n<a href="javascript:;" id="importSelectAll"\n onclick="return onClickImportButton(this)" title="SELECT all tiddlers">\n all</a>\n <a href="javascript:;" id="importSelectNew"\n onclick="return onClickImportButton(this)" title="SELECT tiddlers not already in destination document">\n added</a>\n <a href="javascript:;" id="importSelectChanges"\n onclick="return onClickImportButton(this)" title="SELECT tiddlers that have been updated in source document">\n changes</a>\n <a href="javascript:;" id="importSelectDifferences"\n onclick="return onClickImportButton(this)" title="SELECT tiddlers that have been added or are different from existing tiddlers">\n differences</a>\n</td><td align=right>\n<a href="javascript:;" id="importListSmaller"\n onclick="return onClickImportButton(this)" title="SHRINK list size">\n – </a>\n<a href="javascript:;" id="importListLarger"\n onclick="return onClickImportButton(this)" title="GROW list size">\n + </a>\n<a href="javascript:;" id="importListMaximize"\n onclick="return onClickImportButton(this)" title="MAXIMIZE/RESTORE list size">\n = </a>\n</td></tr></table>\n<select id="importList" size=8 multiple\n onchange="setTimeout('refreshImportList('+this.selectedIndex+')',1)">\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\n</select>\n<div style="text-align:center">\n <a href="javascript:;"\n title="click for help using filters..."\n onclick="alert('A filter consists of one or more space-separated combinations of: tiddlertitle, tag:[[tagvalue]], tag:[[tag expression]] (requires MatchTagsPlugin), story:[[TiddlerName]], and/or search:[[searchtext]]. Use a blank filter to restore the list of all tiddlers.'); return false;"\n >filter</a>\n <input type="text" id="importLastFilter" style="margin-bottom:1px; width:65%"\n title="Enter a combination of one or more filters. Use a blank filter for all tiddlers."\n onfocus="this.select()" value=""\n onKeyUp="config.macros.importTiddlers.lastFilter=this.value"\n onChange="config.macros.importTiddlers.lastFilter=this.value;">\n <input type="button" id="importApplyFilter" style="width:20%" value="apply"\n title="filter list of tiddlers to include only those that match certain criteria"\n onclick="return onClickImportButton(this)">\n </div>\n</div><!--end select-->\n\n<div class="box" id="importOptionsPanel" style="text-align:center;margin:.5em;display:none;">\n apply tags: <input type=checkbox class="chk" id="chkImportTags" checked\n onClick="config.macros.importTiddlers.importTags=this.checked;">from source \n <input type=checkbox class="chk" id="chkKeepTags" checked\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing \n <input type=checkbox class="chk" id="chkAddTags" \n onClick="config.macros.importTiddlers.addTags=this.checked;\n config.macros.importTiddlers.showPanel('txtNewTags',this.checked,false);\n if (this.checked) document.getElementById('txtNewTags').focus();">add tags<br>\n <input type=text id="txtNewTags" style="margin-top:4px;display:none;" size=15 onfocus="this.select()" \n title="enter tags to be added to imported tiddlers" \n onKeyUp="config.macros.importTiddlers.newTags=this.value;\n document.getElementById('chkAddTags').checked=this.value.length>0;" autocomplete=off>\n <nobr><input type=checkbox class="chk" id="chkSync" \n onClick="config.macros.importTiddlers.sync=this.checked;">\n link tiddlers to source document (for sync later)</nobr>\n</div><!--end options-->\n\n<div id="importButtonPanel" style="text-align:center">\n <input type=button id="importLoad" class="importButton btn3" value="open"\n title="load listbox with tiddlers from source document"\n onclick="onClickImportButton(this)">\n <input type=button id="importOptions" class="importButton btn3" value="options..."\n title="set options for tags, sync, etc."\n onclick="onClickImportButton(this)">\n <input type=button id="importStart" class="importButton btn3" value="import"\n title="start/stop import of selected source tiddlers into current document"\n onclick="onClickImportButton(this)">\n <input type=button id="importClose" class="importButton btn3" value="done"\n title="clear listbox or hide control panel"\n onclick="onClickImportButton(this)">\n</div>\n\n<div class="none" id="importCollisionPanel" style="display:none;margin:.5em 0 .5em .5em;">\n <table><tr><td style="width:65%" align="left">\n <table><tr><td align=left>\n tiddler already exists:\n </td><td align=right>\n <input type=checkbox class="chk" id="importApplyToAll" \n onclick="document.getElementById('importRename').disabled=this.checked;"\n checked>apply to all\n </td></tr></table>\n <input type=text id="importNewTitle" size=15 autocomplete=off">\n </td><td style="width:34%" align="center">\n <input type=button id="importMerge"\n class="importButton" style="width:47%" value="merge"\n title="append the incoming tiddler to the existing tiddler"\n onclick="onClickImportButton(this)"><!--\n --><input type=button id="importSkip"\n class="importButton" style="width:47%" value="skip"\n title="do not import this tiddler"\n onclick="onClickImportButton(this)"><!--\n --><br><input type=button id="importRename"\n class="importButton" style="width:47%" value="rename"\n title="rename the incoming tiddler"\n onclick="onClickImportButton(this)"><!--\n --><input type=button id="importReplace"\n class="importButton" style="width:47%" value="replace"\n title="discard the existing tiddler"\n onclick="onClickImportButton(this)">\n </td></tr></table>\n</div><!--end collision-->\n!end\n//}}}\n***/
\n|[img[http://www.m2zone.net/140549.png]] http://linuxcounter.net/|[img[http://www.m2zone.net/patent_button.png]]<br>Mjukvarupaten, Nej Tack! <br> ffii.se| [img[http://www.m2zone.net/icons/apacheicon.gif]]|\n\nWelcome to m2zone.net, My personal Space on the net\n\nSome links, My weather links page, designed for paraglider pilots in my region of east southern Sweden, might be useful for some others to maybe, and I try to have this updated as am a flying myself.\n\n|Some pages hosted here. | My server is also hosting|\n|Weather link page,[[View|WeatherSidebar]] / Add as [[Sidebar|MozillaSidebar]] |[[FMJK|http://www.fmjk.org/]] - Finspångs Järnvägsklubb|\n|TiddlyWiki with DAV |[[STALklubben|http://www.stalklubben.org]] - Personalklubben för turbinföretag i Finspång|\n|[[M2 Wiki|www.m2zone.net]] |Other links|\n|[[My personal Wiki|https://dav.messagingengine.com/m2swe.fastmail.fm/files/public/wiki-pub.htm]] (auhorization needed) |http://www.karinmartensson.se |\n\n\n
Username:\n<<option txtUserName>>\n
[[Home|http://www.m2zone.net/]]\n[[TiddlyWiki with DAV |http://public.m2swe.fastmail.fm/wiki-pub.htm]]
PostBody Test
<!--{{{-->\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>m2zone</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>
I wrote a weather sidebar, as an Mozilla Sidebar, that was quite handy to know when to leave work and get out paragliding. This web technology though was mad obsolete later on - including Mozilla - http://www-archive.mozilla.org/xpapps/sidebar/
"The movie15 Package"\n\nLaurana.pdf
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/js_api_reference.pdf\n\nhttp://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/Acro6JSGuide.pdf
// //''Name:'' Save Changes To DAV plugin\n// //''Version:'' <<getversion saveChangesToDAV>> (<<getversiondate calendar "DD MMM YYYY">>)\n// //''Depends on:'' YATWA http://www.rumsby.org/yatwa/\n// //''Author:'' PeterSuschlik <peter-tiddly //at// suschlik //dot// de>\n\n// //''Syntax:'' \n// //<< {{{saveChangesToDAV}}} >>\n\n// //''Description:'' \n// //This plugin allows you to upload your changes to a webserver via WebDAV (at the moment only the methods {{{GET}}} and {{{PUT}}} are implemented)\n// //It should be add to SideBarOptions.\n// //Addionally, add << {{{option txtDAVURL 50}}} >> to AdvancedOptions.\n\n// //''WebDAV Apache Setup Example''\n// // Wiki-URL: http://{{{host}}}/wiki/\n// // DAV-URL: http://{{{host}}}/wiki/dav/index.html\n// // * setup WebDAV for {{{host}}} as usual\n// // * symlink /wiki/index.html to /wiki/dav/index.html\n\n// //''Notes on XMLHttpRequest restrictions''\n// //Due to security reasons there are some restrictions on connection to a webserver via XMLHttpRequest\n// //The wiki and the upload WebDAV directory must live on the same host\n\n// //''TODO''\n// // * some documentation/comments\n\n\n// //''Configuration:''\n// //Modify {{{txtDAVURL}}} option at AdvancedOptions.\n// //For setup see above.\n\n// //''Code section:''\n// (you should not need to alter anything below here)//\n\n/*\n{{{\n*/\n\nfunction isHttp() {\n return document.location.toString().search(/https?:\s/\s//) != -1;\n}\n\nfunction DAVSaver() {\n this.uploading = false;\n}\n\nDAVSaver.prototype = {\n xmlhttprequest: function() {\n try {\n return new XMLHttpRequest();\n return new ActiveXObject("Msxml2.XMLHTTP");\n return new ActiveXObject("Microsoft.XMLHTTP");\n } catch(e) {}\n alert("Could not construct XmlHttpRequest Object!");\n },\n reset: function() {\n this.uploading = false;\n return null;\n },\n loadLocal: function() {\n var originalPath = document.location.toString();\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\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 displayMessage('Loading locally: ' + localPath, localPath);\n var original = loadFile(localPath);\n if (original == null) {\n displayMessage('Loading locally failed: ' + localPath, localPath);\n return;\n }\n this.doUpload(original);\n },\n loadRemote: function() {\n var xml = this.xmlhttprequest();\n xml._uploader = this;\n displayMessage('Loading remotely: ' + this.url, this.url);\n xml.onreadystatechange = function() {\n if (xml.readyState != 3)\n displayMessage("Download-State " + xml.readyState);\n if (xml.readyState == 4) {\n if (xml.status == 200) {\n displayMessage('Downloaded ' + xml.responseText.length + ' bytes');\n xml._uploader.doUpload(xml.responseText);\n } else {\n displayMessage('Upload failed ' + xml.status, xml._uploader.url);1\n xml._uploader.reset();\n }\n }\n }\n xml.open('GET', this.url, true);\n xml.send('');\n },\n loadAndUpload: function() {\n if (isHttp()) {\n this.loadRemote();\n } else {\n this.loadLocal();\n }\n },\n upload: function() {\n if (readOnly) return;\n if (this.uploading) {\n displayMessage("Upload in progress - please wait");\n return;\n }\n this.url = config.options['txtDAVURL'];\n if (this.url == null || this.url == "") {\n alert("No DAV URL specified in AdvancedOptions!\sn\sn" +\n"Maybe you need to add the following line to AdvancedOptions:\sn" +\n"DAV-URL <<option txtDAVURL 50>>");\n return;\n }\n this.uploading = true;\n this.loadAndUpload();\n },\n doUpload: function(content) {\n if (content == null) return;\n content = this.reviseStore(content);\n displayMessage("Uploading " + content.length + " bytes to " + this.url);\n var xml = this.xmlhttprequest();\n xml._uploader = this;\n xml.onreadystatechange = function() {\n displayMessage("Upload-State " + xml.readyState);\n if (xml.readyState == 4) {\n if (xml.status == 201 || xml.status == 204) {\n displayMessage("Uploaded", this.url);\n } else {\n displayMessage("Upload failed " + xml.status, xml._uploader.url);\n }\n xml._uploader.reset();\n }\n }\n if (!isHttp()) {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n xml.open('PUT', this.url, true);\n xml.send(content);\n },\n reviseStore: function(original) {\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n alert(config.messages.invalidFileError.format([localPath]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n convertUnicodeToUTF8(allTiddlersAsHtml()) + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle = store.getTiddlerText("SiteTitle","TiddlyWiki").htmlEncode();\n revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n return revised;\n },\n onClick: function() {\n clearMessage();\n this.upload();\n },\n}\nvar davSaver = new DAVSaver();\n\nversion.extensions.saveChangesToDAV = {major: 0, minor: 2, revision: 1, date: new Date(2005,09,09)};\n\nif (isHttp() && (config.options['txtDAVURL'] == null || config.options['txtDAVURL'] == "")) {\n config.options['txtDAVURL'] = document.location.href;\n}\n\nconfig.macros.saveChangesToDAV = {\n label: "save to dav",\n prompt: "Save all tiddlers to create a new TiddlyWiki to DAV"\n}\n\nconfig.macros.saveChangesToDAV.handler = function(place) {\n if(!readOnly)\n createTiddlyButton(place,this.label,this.prompt, function() { davSaver.onClick() });\n}\n\n/** Override */\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 size = params[1] || 15; // configure size\n var c;\n switch(opt.substr(0,3))\n {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size; // configure size\n c.value = config.options[opt];\n place.appendChild(c);\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.checked = config.options[opt];\n place.appendChild(c);\n break;\n }\n}\n\nfunction convertUnicodeToUTF8(s)\n{\n if(saveUsingSafari)\n return s;\n/* This does not work remotely!\n else if(window.Components)\n return mozConvertUnicodeToUTF8(s);\n*/\n else\n return manualConvertUnicodeToUTF8(s);\n}\n\n/*\n}}}\n*/
This legacy TiddlyWiki version [[2.1.3|http://tiddlywiki.com/archive/empty.2.1.3.html]], is the last know version to still work with the SaveChangesToDAV plugin, version 2.1.3 from 2005-09-09.\n\nIf accessing the wiki after installation on a DAV server, see too that the checkbox in the AdvancedOptions, to Hide Editing Features when viewed over HTTP, is deselected. Also the [[option|OptionsPanel]] Save Bakups and Auto Save under options should be deselected.\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChangesToDAV>> [[edit|https://dav.messagingengine.com/m2swe.fastmail.fm/files/public/wiki-pub.htm]] <<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
My personal Space on the net
m2swe
https://dav.messagingengine.com/m2swe.fastmail.fm/files/private/wiki.htm
\n/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#SplashScreenPlugin|\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//{{{\nvar old_lewcid_splash_restart=restart;\n\nrestart = 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 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* html .tiddler {\n height: 1%;\n}\n\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\ntext-align: justify;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
[[TiddlyWiki|http://tiddlywiki.com/]] for windows is using [[ActiveX|http://en.wikipedia.org/wiki/ActiveX]] plugin to allow saving. But if [[ActiveX|http://en.wikipedia.org/wiki/ActiveX]] is disabled, and not possible to change, ie corporate settings, then you may turn the wiki file to a [[HTA|http://en.wikipedia.org/wiki/HTML_Application]] application instead. This allow "Local" application to run scripts as the IE security enforcement is not longer used.\n\nSimplest method is to create a HTA file like wiki.hta, that calls the wiki.html file, this allow the corrcurrent use from both IE and FF, IE users use the HTA appliction, and the others users calls the html file direct.\n\nThe contents of the HTA file should be something like:\n\n{{{\n<HTML>\n<HEAD>\n<TITLE>Wiki</TITLE>\n<HTA:APPLICATION ID="Wiki"\n BORDER="thin"\n INNERBORDER="no"\n SCROLL="no"\n CAPTION="yes"\n SHOWINTASKBAR="yes"\n SINGLEINSTANCE="yes"\n SYSMENU="yes"\n WINDOWSTATE="normal">\n<STYLE> body {margin:0} </STYLE>\n</HEAD>\n<BODY>\n<IFRAME src="wiki.htm" application=yes width="100%"\n height=100% marginwidth=0 marginheight=0\n frameborder=0>Iframes not supported</IFRAME>\n</BODY>\n</HTML>\n}}}\n
\n<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump deleteTiddler'></div>\n<div class='title' macro='view title'></div></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n<!--}}}-->\n
<HTML>\n<table CELLSPACING="2" CELLPADDING="0" BORDER="0" WIDTH="144" >\n<tr>\n<td Align="center" colspan="2" >\n<a href="http://www.m2zone.net/weather/D2.JPG">\n<img SRC="http://www.m2zone.net/weather/D2.t.jpg" ALT="Latest Metar" HSPACE=1 VSPACE=1 BORDER=0 height=120 width=120></a>\n<br><a href="http://www.sat.dundee.ac.uk">Image courtesy of the University of Dundee</a>\n</td>\n</tr>\n</table>\n</HTML>\nThis image is regularly created and cropped.
Old Legacy...\n\n<html>\n<SCRIPT LANGUAGE="JavaScript">\n<!-- Begin\nfunction addSideBar() {\n if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function"))\n {\n window.sidebar.addPanel ("Weather Links",\n "http://www.m2zone.net/twiki/bin/view/2go/WeatherSidebar","");\n }\n else\n {\n var rv = window.confirm ("This page is enhanced for use with Netscape 6/Mozilla 1 or later." + "Would you like to upgrade now?");\n if (rv)\n document.location.href = "http://www.mozilla.org";\n }\n// End -->\n}\n</script>\n<SCRIPT LANGUAGE="JavaScript">\n<!-- Begin\nfunction formHandler(){\nvar URL = document.form.site.options[document.form.site.selectedIndex].value;\nwindow._content.location=url = URL;\n// End -->\n}\n</script>\n<SCRIPT LANGUAGE="JavaScript">\n<!-- Begin\nfunction formHandler2(){\nvar URL = document.form2.site2.options[document.form2.site2.selectedIndex].value;\nwindow._content.location=url = URL;\n// End -->\n}\n</script>\n<body background="http://www.m2zone.net/clouds.gif">\n<font size=-2>\n<table CELLSPACING="2" CELLPADDING="0" BORDER="0" WIDTH="144" >\n<tr>\n<td Align="center" colspan="2" >\n<a href="http://www.m2zone.net/weather/D2.JPG">\n<img SRC="http://www.m2zone.net/weather/D2.t.jpg" ALT="Latest Metar" HSPACE=1 VSPACE=1 BORDER=0 height=120 width=120></a>\n<br><a href="http://www.sat.dundee.ac.uk">Image courtesy of the University of Dundee</a>\n</td>\n</tr>\n<tr>\n<td valign="top" Align="left" colspan="2" ><hr><h3>SMHI <a href="http://www.smhi.se">(länk)</a></h3>\n</td>\n</tr>\n<tr>\n<td valign="top" align="left">\nPrognoser:<br><a href="http://www.smhi.se/weather/landvader/prognos15_4.htm">Land</a>/\n<a href="http://www.smhi.se/weather/sjovader/sjveder.htm">Sjö</a>\n<br><a href="http://www.smhi.se/weather/kustobs/kustobs.htm">Kustobs.</a>\n</td>\n<td valign="top" align="left">\n<a href="http://produkter.smhi.se/sparv/klsoar/index.htm" alt="klsoar:viggen03">Flygväder</a>\n<br><a href="http://produkter.smhi.se/trafik/flyg/vfr/vfrkarta.gif">VFR-karta</a>\n<br><a href="/weather/soaring.html">Termik/Vindar</a>\n<br>\n</td>\n</tr>\n<tr><td valign="top" colspan="2" ><hr></td></tr>\n<tr>\n<td valign="top" Align=center>\n<a href="http://www.met-office.gov.uk/weather/europe/europeforecast.html">Met.Office</a><br>\n<a href="http://www.met-office.gov.uk/weather/satellite/animation.html">Animation</a><hr>\n<a href="http://medea.grennaskolan.se/wwc/weathertext_se.html">Grännaskolan</a></td>\n<td valign="top" Align="center">\n<a href="http://www.aftonbladet.se/vader/js/ntv_landvader.html?keyId=44">Aftonbladet</a><br>\n<a href="http://www.nt.se/GEN_vader_sve.asp?PartOfTheWorld=%C3%96sterg%C3%B6tland">NT</a>/ <a href="http://www.corren.se/mer-pa-corren/vader/index.xml?city-id=0105081">Corren</a><br>\n<a href="http://www.tv4.se/vader/countryForecast.asp">TV4</a>/ <a href="http://www.svt.se/texttv/403.html">SVT Text</a><br>\n<a href="http://www.eurometeo.com/english/city/country_se/">EuroMETEO</a><br>\n<a href="http://theyr.net/cg/cny/I1498c9/F=js*s*030405*12*SC*se_Stockholm">Halo/Theyr</a></td>\n</tr>\n<tr><td valign="top" colspan="2" Align="left" ><hr>\n<h3>Foreca <a href="http://www.foreca.se/">(länk)</a></h3></td></tr>\n<tr>\n<td Align="center">\n<a href="http://batvadret.foreca.se/area8a.html">Väst (Vättern)</a></td>\n<td valign="top" colspan="2" Align="center">\n<a href="http://batvadret.foreca.se/area4a.html">Öst</a><br>\n<a href="http://www.foreca.se/b%C3%A5tv%C3%A4dret/vind/landsort-h%C3%A4radssk%C3%A4r">Landsort-Häradsskär</a>\n\n</td>\n</tr>\n<tr>\n<td valign="top" colspan="2" Align="left"><hr>\n<h3>Vindguru <a href="http://www.windguru.cz/int/index.php">(länk)</a></h3></td></tr>\n<tr>\n<td valign="top" colspan="2" Align="left">\n<form name="form" method="POST" onSubmit>\n<select NAME="site" SIZE="1" onChange="formHandler()" type="submit">\n<option selected value="http://www.windguru.cz/int/index.php?spotcislo=144&viewspot=Go!">Välj plats</option>\n<option value="http://www.windguru.cz/int/index.php?spotcislo=152&viewspot=Go!">Jönköping</option>\n<option value="http://www.windguru.cz/int/index.php?spotcislo=144&viewspot=Go!">Linköping</option>\n<option value="http://www.windguru.cz/int/index.php?spotcislo=90&viewspot=Go!">Kalmar</option>\n</select>\n</form>\n</td>\n</tr>\n<tr><td valign="top" colspan="2" Align="left" ><hr>\n<h3>Vägverket <a href="http://trafikinfo.trafikverket.se/LIT/#url=Vagtrafiken/Karta&fav=%7B%22userExtent%22%3A1%2C%22menuObjectId%22%3A%22maxWind%22%2C%22initEW%22%3A586445.60943886%2C%22initNS%22%3A6487613.7763895%2C%22initZoom%22%3A7%2C%22currentSite%22%3A%22Vagtrafiken/Karta%22%7D">(länk)</a></h3></td></tr>\n<tr>\n<td valign="top" colspan="2" Align="left">\n<form name="form2" method="POST" onSubmit>\n<select NAME="site2" SIZE="1" onChange="formHandler2()" type="submit">\n<option selected value="http://www.vv.se/triss/karta/stationfull.asp?Informator=601&Term=Vind&Back=1">Välj plats</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=617">Jönköping</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=601">Gränna</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=544">Ödeshög</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=">Väderstad</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=829">Västra Ed</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=546">Mantorp</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=528">Lövstad</option>\n<option value="http://trafikinfo.vv.se/trinimap/info_start.aspx?Back=0&GIF=&Object=VVIS_FULL&VVISTerm=3&StationNo=425">Kålmården</option>\n<option value="http://trafikinfo.vv.se/trinimap/">Karta alla</option>\n</select>\n</form>\n</td>\n</tr>\n<tr><td valign="top" colspan="2" Align="left"><hr><h3>Flygplatser</h3></td></tr>\n<tr>\n<td Align=center>\n<a href="http://weather.noaa.gov/weather/current/ESGJ.html">Jönköping</a>\n<br><a href="http://weather.noaa.gov/weather/current/ESSP.html">Norrköping</a>\n<br><a href="http://www.wunderground.com/global/stations/02562.html">Linköping</a>\n</td>\n<td Align=center>\n<a href="http://blinder.lfv.se/cgi/met/nswc_cont?password=SE-LFV&B1=Send">Luftfartsverket</a>\n<br><a href="http://weather.noaa.gov/weather/SE_cc.html">NWS-Sweden</a>\n</td>\n</tr>\n<tr>\n<td valign="top" colspan="2" Align="center"><hr>\n<a href="javascript:addSideBar();">Lägg till denna sida som <br><nop>SideBar</a>\n</td>\n</tr>\n</table>\n</font>\n</html>