<script> alert ("alert");</script>
/***\n''Single Page Mode Plugin for TiddlyWiki version 2.0 or above''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#SinglePageModePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nNormally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.\n\n!!!!!Usage\n<<<\nSinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.\n\nEven when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.\n<<<\n!!!!!Configuration\n<<<\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:\n\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SinglePageMode handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''\n<<<\n!!!!!Revision History\n<<<\n''2006.06.01 [2.2.0]'' added chkTopOfPageMode handling\n''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers\n''2005.12.27 [2.0.0]'' Update for TW2.0\n''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts\n''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them\n''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.\n''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nSupport for BACK/FORWARD buttons adapted from code developed by Clint Checketts\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageMode= {major: 2, minor: 2, revision: 0, date: new Date(2006,6,1)};\n\nif (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSinglePageMode>> Display one tiddler at a time";\n\nif (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";\n\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash)\n return;\n var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));\n tiddlerName=tiddlerName.replace(/\s[\s[/,"").replace(/\s]\s]/,""); // strip any [[ ]] bracketing\n if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);\n}\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (config.options.chkSinglePageMode) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n story.closeAllTiddlers();\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }\n this.SPM_coreDisplayTiddler(srcElement,title,template,animate,slowly)\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)\n{\n // suspend single-page mode when displaying multiple tiddlers\n var save=config.options.chkSinglePageMode;\n config.options.chkSinglePageMode=false;\n this.SPM_coreDisplayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly);\n config.options.chkSinglePageMode=save;\n}\n//}}}
''<html><a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/amazon-report.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;">Detailed Report</a></html>''\n<html><table class="report" id="earningsReport"><tr><td colspan="7"><table><tbody><tr><td colspan="4" class="header"><div class="reportHeading"><h2 class="f10">Earnings Report Totals</h2><h3 class="f7">October 4, 2004 to June 4, 2006</h3></div></td></tr><tr><th class="left-border"></th><th class="title">Items Shipped</th><th class="title">Revenue</th><th class="title">Referral Fees</th></tr><tr><td class="text">Total Amazon.com Items Shipped</td><td>1323</td><td>$21,911.81</td><td>$1,522.48</td></tr><tr><td class="text">Total Third Party Items Shipped</td><td>421</td><td>$4,918.82</td><td>$350.63</td></tr><tr class="bold"><td class="text">Total Items Shipped</td><td>1744</td><td>$26,830.63</td><td>$1,873.11</td></tr><tr class="bold"><td class="text">Total Items Returned</td><td>-10</td><td>-$603.60</td><td>-$39.78</td></tr><tr class="bold"><td class="text">Total Refunds</td><td>-9</td><td>-$104.43</td><td>-$7.36</td></tr><tr class="totals"><td class="text">TOTAL REFERRAL FEES</td><td>1725</td><td>$26,122.60</td><td>$1,825.97</td></tr></tbody></table></html>
config.options.chkTopOfPageMode = true;
[[about InterraBot]]
<script>\nvar pard = document.partner;\nif (document.new_partner) pard = document.new_partner;\nif (pard) return "\sn\snThe current default beneficiary is ''{{{" + pard +"}}}''.";\n</script>
<html><form>\n<select name="beneficiary" onchange="document.new_partner = this.value; story.refreshTiddler('install it',null,true);story.refreshTiddler('DisplayCurrentBene',null,true);story.refreshTiddler('where the $ goes',null,true); story.refreshTiddler('about InterraBot',null,true); return false;">\n<option value="">select beneficiary</option>\n<option value="Alternet">Alternet</option>\n<option value="Witness">Witness</option>\n<option value="InTheseTimes">In These Times</option>\n<option value="firedoglake">firedoglake</option>\n<option value="MotherJones">Mother Jones</option>\n</select>\n</form></html>
<<exportTiddlers inline>>
/***\n''Export Tiddlers Plugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ExportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\nExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...). An interactive control panel lets you specify a destination, and then select which tiddlers to export. A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded. ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''\n\n!!!!!Inline interface (live)\n<<<\n<<exportTiddlers inline>>\n<<<\n!!!!!Usage\n<<<\nOptional "special tiddlers" used by this plugin:\n* SiteUrl^^\nURL for official server-published version of document being viewed\ndefault: //none//^^\n* SiteHost^^\nhost name/address for remote server (e.g., "www.server.com" or "192.168.1.27")\ndefault: //none//^^\n* SitePost^^\nremote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")\ndefault: //none//^^\n* SiteParams^^\narguments (if any) for server-side receiving script\ndefault: //none//^^\n* SiteID^^\nusername or other authorization identifier for login-controlled access to remote server\ndefault: current TiddlyWiki username (e.g., "YourName")^^\n* SiteDate^^\nstored date/time stamp for most recent published version of document\ndefault: current document.modified value (i.e., the 'file date')^^\n<<<\n!!!!!Example\n<<<\n<<exportTiddlers>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < exportTiddlers > >" macro^^\n<<<\n!!!!!Revision History\n<<<\n''2006.03.29 [2.1.3]''^^\nadded calls to convertUnicodeToUTF8() for generated output, so it better handles international characters.\n''2006.02.12 [2.1.2]''^^\nadded var to unintended global 'tags' in matchTags(). Avoids FF1501 bug when filtering by tags. (based on report by TedPavlic)\n''2006.02.04 [2.1.1]''^^\nadded var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.02.02 [2.1.0]''^^\nAdded support for output of complete TiddlyWiki documents. Let's you use ExportTiddlers to generate 'starter' documents from selected tiddlers.^^\n''2006.01.21 [2.0.1]''^^\nDefer initial panel creation and only register a notification function when panel first is created\nin saveChanges 'hijack', create panel as needed. Note: if window.event is not available to identify the click location, the export panel is positioned relative to the 'tiddlerDisplay' element of the TW document.\n^^\n''2005.12.27 [2.0.0]''^^\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n^^\n''2005.12.24 [0.9.5]''^^\nMinor adjustments to CSS to force correct link colors regardless of TW stylesheet selection\n^^\n''2005.12.16 [0.9.4]''^^\nDynamically create/remove exportPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.\n^^\n''2005.11.15 [0.9.2]''^^\nadded non-Ajax post function to bypass javascript security restrictions on cross-domain I/O. Moved AJAX functions to separate tiddler (no longer needed here). Generalized HTTP server to support UnaWiki servers\n^^\n+++[previous releases...]\n''2005.11.08 [0.9.1]''^^\nmoved HTML, CSS and control initialization into exportInit() function and call from macro handler instead of at load time. This allows exportPanel to be placed within the same containing element as the "export tiddlers" button, so that relative positioning can be achieved.\n^^\n''2005.10.28 [0.9.0]''^^\nadded 'select opened tiddlers' feature\nBased on a suggestion by Geoff Slocock\n^^\n''2005.10.24 [0.8.3]''^^\nCorrected hijack of 'save changes' when using http:\n^^\n''2005.10.18 [0.8.2]''^^\nadded AJAX functions\n^^\n''2005.10.18 [0.8.1]''^^\nCorrected timezone handling when filtering for date ranges.\nImproved error checking/reporting for invalid filter values and filters that don't match any tiddlers.\nExporting localfile-to-localfile is working for IE and FF\nExporting server-to-localfile works in IE (after ActiveX warnings), but has security issues in FF\nCross-domain exporting (localfile/server-to-server) is under development\nCookies to remember filter settings - coming soon\nMore style tweaks, minor text changes and some assorted layout cleanup.\n^^\n''2005.10.17 [0.8.0]''^^\nFirst pre-release.\n^^\n''2005.10.16 [0.7.0]''^^\nfilter by tags\n^^\n''2005.10.15 [0.6.0]''^^\nfilter by title/text\n^^\n''2005.10.14 [0.5.0]''^^\nexport to local file (DIV or XML)\n^^\n''2005.10.14 [0.4.0]''^^\nfilter by start/end date\n^^\n''2005.10.13 [0.3.0]''^^\npanel interaction\n^^\n''2005.10.11 [0.2.0]''^^\npanel layout\n^^\n''2005.10.10 [0.1.0]''^^\ncode framework\n^^\n''2005.10.09 [0.0.0]''^^\ndevelopment started\n^^\n===\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // +++[version]\n//{{{\nversion.extensions.exportTiddlers = {major: 2, minor: 1, revision: 3, date: new Date(2006,3,29)};\n//}}}\n// //===\n\n// // +++[macro handler]\n//{{{\nconfig.macros.exportTiddlers = {\n label: "export tiddlers",\n prompt: "Copy selected tiddlers to an export document",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields\n};\n\nconfig.macros.exportTiddlers.handler = function(place,macroName,params) {\n if (params[0]!="inline")\n { createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }\n var panel=createExportPanel(place);\n panel.style.position="static";\n panel.style.display="block";\n}\n\nfunction createExportPanel(place) {\n var panel=document.getElementById("exportPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");\n panel=createTiddlyElement(place,"span","exportPanel",null,null)\n panel.innerHTML=config.macros.exportTiddlers.html;\n exportShowPanel(document.location.protocol);\n exportInitFilter();\n refreshExportList(0);\n store.addNotification(null,refreshExportList); // refresh listbox after every tiddler change\n return panel;\n}\n\nfunction onClickExportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createExportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n// //===\n\n// // +++[Hijack saveChanges] diverts 'notFileUrlError' to display export control panel instead\n//{{{\nwindow.coreSaveChanges=window.saveChanges;\nwindow.saveChanges = function()\n{\n if (document.location.protocol=="file:") { coreSaveChanges(); return; }\n var e = window.event;\n var parent=e?resolveTarget(e).parentNode:document.body;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent) panel=createExportPanel(parent);\n exportShowPanel(document.location.protocol);\n if (parent==document.body) { panel.style.left="30%"; panel.style.top="30%"; }\n panel.style.display = "block" ;\n}\n//}}}\n// //===\n\n// // +++[IE needs explicit scoping] for functions called by browser events\n//{{{\nwindow.onClickExportMenu=onClickExportMenu;\nwindow.onClickExportButton=onClickExportButton;\nwindow.exportShowPanel=exportShowPanel;\nwindow.exportShowFilterFields=exportShowFilterFields;\nwindow.refreshExportList=refreshExportList;\n//}}}\n// //===\n\n// // +++[CSS] for floating export control panel\n//{{{\nconfig.macros.exportTiddlers.css = '\s\n#exportPanel {\s\n display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px;}\s\n#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#exportPanel .rad { width:auto; }\s\n#exportPanel .chk { width:auto; }\s\n#exportPanel .btn { width:auto; }\s\n#exportPanel .btn1 { width:98%; }\s\n#exportPanel .btn2 { width:48%; }\s\n#exportPanel .btn3 { width:32%; }\s\n#exportPanel .btn4 { width:24%; }\s\n#exportPanel .btn5 { width:19%; }\s\n';\n//}}}\n// //===\n\n// // +++[HTML] for export control panel interface\n//{{{\nconfig.macros.exportTiddlers.html = '\s\n<!-- output target and format -->\s\n<table cellpadding="0" cellspacing="0"><tr><td width=50%>\s\n export to\s\n <select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\s\n <option value="file:" SELECTED>this computer</option>\s\n <option value="http:">web server (http)</option>\s\n <option value="https:">secure web server (https)</option>\s\n <option value="ftp:">file server (ftp)</option>\s\n </select>\s\n</td><td width=50%>\s\n output format\s\n <select id="exportFormat" size=1>\s\n <option value="DIV">TiddlyWiki export file</option>\s\n <option value="TW">TiddlyWiki document</option>\s\n <option value="XML">RSS feed (XML)</option>\s\n </select>\s\n</td></tr></table>\s\n\s\n<!-- export to local file -->\s\n<div id="exportLocalPanel" style="margin-bottom:5px;margin-top:5px;">\s\nlocal path/filename<br>\s\n<input type="file" id="exportFilename" size=56 style="width:100%"><br>\s\n</div><!--panel-->\s\n\s\n<!-- export to http server -->\s\n<div id="exportHTTPPanel" style="display:none;margin-bottom:5px;margin-top:5px;">\s\ndocument URL<br>\s\n<input type="text" id="exportHTTPSiteURL" onfocus="this.select()"><br>\s\nserver script / parameters<br>\s\n<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- export to ftp server -->\s\n<div id="exportFTPPanel" style="display:none;margin-bottom:5px;margin-top:5px;">\s\n<table cellpadding="0" cellspacing="0" width="33%"><tr valign="top"><td>\s\n host server<br>\s\n <input type="text" id="exportFTPHost" onfocus="this.select()"><br>\s\n</td><td width="33%">\s\n username<br>\s\n <input type="text" id="exportFTPID" onfocus="this.select()"><br>\s\n</td><td width="33%">\s\n password<br>\s\n <input type="password" id="exportFTPPW" onfocus="this.select()"><br>\s\n</td></tr></table>\s\nFTP path/filename<br>\s\n<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- list of tiddlers -->\s\n<table><tr align="left"><td>\s\n select:\s\n <a href="JavaScript:;" id="exportSelectAll"\s\n onclick="onClickExportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n &nbsp;opened&nbsp;</a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportListSmaller"\s\n onclick="onClickExportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n</td></tr></table>\s\n<select id="exportList" multiple size="10" style="margin-bottom:5px;"\s\n onchange="refreshExportList(this.selectedIndex)">\s\n</select><br>\s\n\s\n<!-- selection filter -->\s\n<div id="exportFilterPanel" style="display:none">\s\n<table><tr align="left"><td>\s\n selection filter\s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportHideFilter"\s\n onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\s\n</td></tr></table>\s\n<div class="box">\s\n<input type="checkbox" class="chk" id="exportFilterStart" value="1"\s\n onclick="exportShowFilterFields(this)"> starting date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportStartDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterStartBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\s\n onclick="exportShowFilterFields(this)"> ending date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportEndDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterEndBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id=exportFilterTags value="1"\s\n onclick="exportShowFilterFields(this)"> match tags<br>\s\n<input type="text" id="exportTags" onfocus="this.select()">\s\n<input type="checkbox" class="chk" id=exportFilterText value="1"\s\n onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\s\n<input type="text" id="exportText" onfocus="this.select()">\s\n</div> <!--box-->\s\n</div> <!--panel-->\s\n\s\n<!-- action buttons -->\s\n<div style="text-align:center">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportFilter" value="apply filter">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportStart" value="export tiddlers">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportClose" value="close">\s\n</div><!--center-->\s\n';\n//}}}\n// //===\n\n// // +++[initialize interface]>\n// // +++[exportShowPanel(which)]\n//{{{\nfunction exportShowPanel(which) {\n var index=0; var panel='exportLocalPanel';\n switch (which) {\n case 'file:':\n case undefined:\n index=0; panel='exportLocalPanel'; break;\n case 'http:':\n index=1; panel='exportHTTPPanel'; break;\n case 'https:':\n index=2; panel='exportHTTPPanel'; break;\n case 'ftp:':\n index=3; panel='exportFTPPanel'; break;\n default:\n alert("Sorry, export to "+which+" is not yet available");\n break;\n }\n exportInitPanel(which);\n document.getElementById('exportTo').selectedIndex=index;\n document.getElementById('exportLocalPanel').style.display='none';\n document.getElementById('exportHTTPPanel').style.display='none';\n document.getElementById('exportFTPPanel').style.display='none';\n document.getElementById(panel).style.display='block';\n}\n//}}}\n// //===\n\n// // +++[exportInitPanel(which)]\n//{{{\nfunction exportInitPanel(which) {\n switch (which) {\n case "file:": // LOCAL EXPORT PANEL: file/path:\n // ** no init - security issues in IE **\n break;\n case "http:": // WEB EXPORT PANEL\n case "https:": // SECURE WEB EXPORT PANEL\n // url\n var siteURL=store.getTiddlerText("SiteUrl");\n if (store.tiddlerExists("unawiki_download")) {\n var theURL=store.getTiddlerText("unawiki_download");\n theURL=theURL.replace(/\s[\s[download\s|/,'').replace(/\s]\s]/,'');\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n siteURL=which+"//"+theHost+theURL\n }\n if (!siteURL) siteURL="SiteUrl";\n document.getElementById("exportHTTPSiteURL").value=siteURL;;\n // server script/params\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n // get POST\n var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";\n var thePost=store.getTiddlerText(title);\n if (!thePost || !thePost.length) thePost="/"+title;\n // get PARAMS\n var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";\n var theParams=store.getTiddlerText(title);\n if (!theParams|| !theParams.length) theParams=title;\n var serverURL = which+"//"+theHost+thePost+"?"+theParams;\n document.getElementById("exportHTTPServerURL").value=serverURL;\n break;\n case "ftp:": // FTP EXPORT PANEL\n // host\n var siteHost=store.getTiddlerText("SiteHost");\n if (!siteHost || !siteHost.length) siteHost=document.location.host;\n if (!siteHost || !siteHost.length) siteHost="SiteHost";\n document.getElementById("exportFTPHost").value=siteHost;\n // username\n var siteID=store.getTiddlerText("SiteID");\n if (!siteID || !siteID.length) siteID=config.options.txtUserName;\n document.getElementById("exportFTPID").value=siteID;\n // password\n document.getElementById("exportFTPPW").value="";\n // file/path\n document.getElementById("exportFTPFilename").value="";\n break;\n }\n}\n//}}}\n// //===\n\n// // +++[exportInitFilter()]\n//{{{\nfunction exportInitFilter() {\n // TBD: persistent settings via local cookies\n // start date\n document.getElementById("exportFilterStart").checked=false;\n document.getElementById("exportStartDate").value="";\n // end date\n document.getElementById("exportFilterEnd").checked=false;\n document.getElementById("exportEndDate").value="";\n // tags\n document.getElementById("exportFilterTags").checked=false;\n document.getElementById("exportTags").value="not excludeExport";\n // text\n document.getElementById("exportFilterText").checked=false;\n document.getElementById("exportText").value="";\n // show/hide filter input fields\n exportShowFilterFields();\n}\n//}}}\n// //===\n\n// // +++[exportShowFilterFields(which)]\n//{{{\nfunction exportShowFilterFields(which) {\n var show;\n\n show=document.getElementById('exportFilterStart').checked;\n document.getElementById('exportFilterStartBy').style.display=show?"block":"none";\n document.getElementById('exportStartDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterStartBy').value;\n document.getElementById('exportStartDate').value\n =getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterStartBy') && (val=='other'))\n document.getElementById('exportStartDate').focus();\n\n show=document.getElementById('exportFilterEnd').checked;\n document.getElementById('exportFilterEndBy').style.display=show?"block":"none";\n document.getElementById('exportEndDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterEndBy').value;\n document.getElementById('exportEndDate').value\n =getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterEndBy') && (val=='other'))\n document.getElementById('exportEndDate').focus();\n\n show=document.getElementById('exportFilterTags').checked;\n document.getElementById('exportTags').style.display=show?"block":"none";\n\n show=document.getElementById('exportFilterText').checked;\n document.getElementById('exportText').style.display=show?"block":"none";\n}\n//}}}\n// //===\n// //===\n\n// // +++[onClickExportButton(which): control interactions]\n//{{{\nfunction onClickExportButton(which)\n{\n // DEBUG alert(which.id);\n var theList=document.getElementById('exportList'); if (!theList) return;\n var count = 0;\n var total = store.getTiddlers('title').length;\n switch (which.id)\n {\n case 'exportFilter':\n count=filterExportList();\n var panel=document.getElementById('exportFilterPanel');\n if (count==-1) { panel.style.display='block'; break; }\n theList.options[0].text=formatExportListHeader(count,total);\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage("filtered "+theList.options[0].text);\n if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }\n break;\n case 'exportStart':\n exportTiddlers();\n break;\n case 'exportHideFilter':\n case 'exportToggleFilter':\n var panel=document.getElementById('exportFilterPanel')\n panel.style.display=(panel.style.display=='block')?'none':'block';\n break;\n case 'exportSelectChanges':\n var lastmod=new Date(document.lastModified);\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;\n theList.options[t].selected=(tiddler.modified>lastmod);\n count += (tiddler.modified>lastmod)?1:0;\n }\n theList.options[0].text=formatExportListHeader(count,total);\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(theList.options[0].text);\n if (count==0) alert("There are no unsaved changes");\n break;\n case 'exportSelectAll':\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count += 1;\n }\n theList.options[0].text=formatExportListHeader(count,count);\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(theList.options[0].text);\n break;\n case 'exportSelectOpened':\n for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;\n var tiddlerDisplay = document.getElementById("tiddlerDisplay");\n for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {\n var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);\n for (var i = 0; i < theList.options.length; i++) {\n if (theList.options[i].value!=tiddler) continue;\n theList.options[i].selected=true; count++; break;\n }\n }\n theList.options[0].text=formatExportListHeader(count,total);\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(theList.options[0].text);\n if (count==0) alert("There are no tiddlers currently opened");\n break;\n case 'exportListSmaller': // decrease current listbox size\n var min=5;\n theList.size-=(theList.size>min)?1:0;\n break;\n case 'exportListLarger': // increase current listbox size\n var max=(theList.options.length>25)?theList.options.length:25;\n theList.size+=(theList.size<max)?1:0;\n break;\n case 'exportClose':\n document.getElementById('exportPanel').style.display='none';\n break;\n }\n}\n//}}}\n// //===\n\n// // +++[list display]\n//{{{\nfunction formatExportListHeader(count,total)\n{\n var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";\n txt += (count==0)?"none":(count==total)?"all":count;\n txt += " selected for export";\n return txt;\n}\n\nfunction refreshExportList(selectedIndex)\n{\n var theList = document.getElementById("exportList");\n var sort;\n if (!theList) return;\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) sort='modified';\n if (selectedIndex==1) sort='title';\n if (selectedIndex==2) sort='modified';\n if (selectedIndex==3) sort='modifier';\n\n // get the alphasorted list of tiddlers\n var tiddlers = store.getTiddlers('title');\n // unselect headings and count number of tiddlers actually selected\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n if (theList.options[i].value=="") theList.options[i].selected=false;\n count+=theList.options[i].selected?1:0;\n }\n // disable "export" button if no tiddlers selected\n document.getElementById("exportStart").disabled=(count==0);\n // update listbox heading to show selection count\n if (theList.options.length)\n theList.options[0].text=formatExportListHeader(count,tiddlers.length);\n\n // if a [command] item, reload list... otherwise, no further refresh needed\n if (selectedIndex>3) return;\n\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=\n new Option(formatExportListHeader(0,tiddlers.length), "",false,false);\n theList.options[i++]=\n new Option(((sort=="title" )?">":indent)+' [by title]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);\n // output the tiddler list\n switch(sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modifier":\n case "modified":\n var tiddlers = store.getTiddlers(sort);\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();\n if (sort=="modifier") theSection=tiddler.modifier;\n if (theSection != lastSection)\n {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n}\n//}}}\n// //===\n\n// // +++[list filtering]\n//{{{\nfunction getFilterDate(val,id)\n{\n var result=0;\n switch (val) {\n case 'site':\n var timestamp=store.getTiddlerText("SiteDate");\n if (!timestamp) timestamp=document.lastModified;\n result=new Date(timestamp);\n break;\n case 'file':\n result=new Date(document.lastModified);\n break;\n case 'other':\n result=new Date(document.getElementById(id).value);\n break;\n default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31\n var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;\n var oneday=86400000;\n if (id=='exportStartDate')\n result=new Date((Math.floor(now/oneday)-val)*oneday+tz);\n else\n result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);\n break;\n }\n // DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\snnow="+now);\n return result;\n}\n\nfunction filterExportList()\n{\n var theList = document.getElementById("exportList"); if (!theList) return -1;\n\n var filterStart=document.getElementById("exportFilterStart").checked;\n var val=document.getElementById("exportFilterStartBy").value;\n var startDate=getFilterDate(val,'exportStartDate');\n\n var filterEnd=document.getElementById("exportFilterEnd").checked;\n var val=document.getElementById("exportFilterEndBy").value;\n var endDate=getFilterDate(val,'exportEndDate');\n\n var filterTags=document.getElementById("exportFilterTags").checked;\n var tags=document.getElementById("exportTags").value;\n\n var filterText=document.getElementById("exportFilterText").checked;\n var text=document.getElementById("exportText").value;\n\n if (!(filterStart||filterEnd||filterTags||filterText)) {\n alert("Please set the selection filter");\n document.getElementById('exportFilterPanel').style.display="block";\n return -1;\n }\n if (filterStart&&filterEnd&&(startDate>endDate)) {\n var msg="starting date/time:\sn"\n msg+=startDate.toLocaleString()+"\sn";\n msg+="is later than ending date/time:\sn"\n msg+=endDate.toLocaleString()\n alert(msg);\n return -1;\n }\n\n // scan list and select tiddlers that match all applicable criteria\n var total=0;\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-tiddler list items (section headings)\n var opt=theList.options[i]; if (opt.value=="") continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; \n var sel=true;\n if ( (filterStart && tiddler.modified<startDate)\n || (filterEnd && tiddler.modified>endDate)\n || (filterTags && !matchTags(tiddler,tags))\n || (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))\n sel=false;\n opt.selected=sel;\n count+=sel?1:0;\n total++;\n }\n return count;\n}\n//}}}\n\n//{{{\nfunction matchTags(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }\n return false;\n}\n//}}}\n// //===\n\n// // +++[output data formatting]>\n// // +++[exportHeader(format)]\n//{{{\nfunction exportHeader(format)\n{\n switch (format) {\n case "TW": return exportTWHeader();\n case "DIV": return exportDIVHeader();\n case "XML": return exportXMLHeader();\n }\n}\n//}}}\n// //===\n\n// // +++[exportFooter(format)]\n//{{{\nfunction exportFooter(format)\n{\n switch (format) {\n case "TW": return exportDIVFooter();\n case "DIV": return exportDIVFooter();\n case "XML": return exportXMLFooter();\n }\n}\n//}}}\n// //===\n\n// // +++[exportTWHeader()]\n//{{{\nfunction exportTWHeader()\n{\n // Get the URL of the document\n var originalPath = document.location.toString();\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n { alert(config.messages.notFileUrlError); return; }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n // Load the original file\n var original = loadFile(localPath);\n if(original == null)\n { alert(config.messages.cantSaveError); return; }\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n { alert(config.messages.invalidFileError.format([localPath])); return; }\n return original.substr(0,posOpeningDiv+startSaveArea.length)\n}\n//}}}\n// //===\n\n// // +++[exportDIVHeader()]\n//{{{\nfunction exportDIVHeader()\n{\n var out=[];\n var now = new Date();\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<html><body>");\n out.push("<style type=\s"text/css\s">");\n out.push("#storeArea {display:block;margin:1em;}");\n out.push("#storeArea div");\n out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");\n out.push("#javascriptWarning");\n out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");\n out.push("</style>");\n out.push("<div id=\s"javascriptWarning\s">");\n out.push("TiddlyWiki export file<br>");\n out.push("Source: <b>"+convertUnicodeToUTF8(document.location.toString())+"</b><br>");\n out.push("Title: <b>"+title+"</b><br>");\n out.push("Subtitle: <b>"+subtitle+"</b><br>");\n out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");\n out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");\n out.push("</div>");\n out.push("<div id=\s"storeArea\s">");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportDIVFooter()]\n//{{{\nfunction exportDIVFooter()\n{\n var out=[];\n out.push("</div></body></html>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportXMLHeader()]\n//{{{\nfunction exportXMLHeader()\n{\n var out=[];\n var now = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<" + "?xml version=\s"1.0\s"?" + ">");\n out.push("<rss version=\s"2.0\s">");\n out.push("<channel>");\n out.push("<title>" + title + "</title>");\n if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");\n out.push("<description>" + subtitle + "</description>");\n out.push("<language>en-us</language>");\n out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");\n out.push("<pubDate>" + now.toGMTString() + "</pubDate>");\n out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");\n out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportXMLFooter()]\n//{{{\nfunction exportXMLFooter()\n{\n var out=[];\n out.push("</channel></rss>");\n return out;\n}\n//}}}\n// //===\n\n// // +++[exportData()]\n//{{{\nfunction exportData(theList,theFormat)\n{\n // scan export listbox and collect DIVs or XML for selected tiddler content\n var out=[];\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-selected items and section headings\n var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; \n if (theFormat=="TW") out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));\n if (theFormat=="DIV") out.push(convertUnicodeToUTF8(thisTiddler.title+"\sn"+thisTiddler.saveToDiv()));\n if (theFormat=="XML") out.push(convertUnicodeToUTF8(thisTiddler.saveToRss()));\n }\n return out;\n}\n//}}}\n// //===\n// //===\n\n// // +++[exportTiddlers(): output selected data to local or server]\n//{{{\nfunction exportTiddlers()\n{\n var theList = document.getElementById("exportList"); if (!theList) return;\n\n // get the export settings\n var theProtocol = document.getElementById("exportTo").value;\n var theFormat = document.getElementById("exportFormat").value;\n\n // assemble output: header + tiddlers + footer\n var theData=exportData(theList,theFormat);\n var count=theData.length;\n var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\sn");\n var msg="";\n switch (theProtocol) {\n case "file:":\n var theTarget = document.getElementById("exportFilename").value.trim();\n if (!theTarget.length) msg = "A local path/filename is required\sn";\n if (!msg && saveFile(theTarget,txt))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "http:":\n case "https:":\n var theTarget = document.getElementById("exportHTTPServerURL").value.trim();\n if (!theTarget.length) msg = "A server URL is required\sn";\n if (!msg && exportPost(theTarget+encodeURIComponent(txt)))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "ftp:":\n default:\n msg="Sorry, export to "+theLocation+" is not yet available";\n break;\n }\n clearMessage(); displayMessage(msg,theTarget);\n}\n//}}}\n// //===\n\n// // +++[exportPost(url): cross-domain post] uses hidden iframe to submit url and capture responses\n//{{{\nfunction exportPost(url)\n{\n var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="exportFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.location.replace(url);\n return true;\n}\n//}}}\n// //===\n
<script>\nvar out = "[[install InterraBot|http://www.mediaventure.org/bloobot/download-interrabot-script.php"\nvar pard = document.partner;\nif (document.new_partner) pard = document.new_partner;\nif (pard) {\n out += "?partner=" + pard ;\n if (document.referr) out += "&rid=" + document.referr;\n}\nelse if (document.referr) out += "?rid=" + document.referr;\n\nout += "]]";\n\nreturn out;\n\n</script>
TiddlyWiki\nuses Wiki style markup, a way of lightly "tagging" plain text so it can\nbe transformed into HTML. Edit this Tiddler to see samples.\n\n! Header\nSamples\n!Header 1\n!!Header 2\n!!!Header 3\n!!!!Header 4\n!!!!!Header 5\n\n! Unordered Lists:\n* Lists are where it's at\n* Just use an\nasterisk and you're set\n** To nest lists just add more\nasterisks...\n***...like this\n* The circle makes a great bullet\nbecause once you've printed a list you can mark off completed items\n*\nYou can also nest mixed list types\n## Like this\n\n! Ordered Lists\n#\nOrdered lists are pretty neat too\n# If you're handy with HTML and CSS\nyou could customize the [[numbering\nscheme|http://www.w3schools.com/css/pr_list-style-type.asp]]\n## To\nnest, just add more octothorpes (pound signs)...\n### Like this\n* You\ncan also\n** Mix list types\n*** like this\n# Pretty neat don't you\nthink?\n\n! Tiddler links\nTo create a Tiddler link, just use\nmixed-case WikiWord, or use [[brackets]] for NonWikiWordLinks. This is\nhow the GTD style [[@Action]] lists are created. \n\nNote that existing\nTiddlers are in bold and empty Tiddlers are in italics. See\nCreatingTiddlers for details.\n\n! External Links\nYou can link to\n[[external sites|http://google.com]] with brackets. You can also\nLinkToFolders on your machine or network shares.\n\n! Images\nEdit this\ntiddler to see how it's\ndone.\n[img[http://img110.echo.cx/img110/139/gorilla8nw.jpg]]\n\n!Tables\n|!th1111111111|!th2222222222|\n|>|\ncolspan |\n| rowspan |left|\n|~| right|\n|colored| center\n|\n|caption|c\n\nFor a complex table example, see PeriodicTable.\n\n!\nHorizontal Rules\nYou can divide a tiddler into\n----\nsections by\ntyping four dashes on a line by themselves.\n\n!\nBlockquotes\n<<<\nThis is how you do an extended, wrapped\nblockquote so you don't have to put angle quotes on every\nline.\n<<<\n>level 1\n>level 1\n>>level\n2\n>>level 2\n>>>level 3\n>>>level\n3\n>>level 2\n>level 1\n\n! Other\nFormatting\n''Bold''\n==Strike==\n__Underline__\n//Italic//\nSuperscript:\n2^^3^^=8\nSubscript: a~~ij~~ = -a~~ji~~\n@@highlight@@ Unfortunately\nhighlighting is broken right now.\n@@color(green):green\ncolored@@\n@@bgcolor(#ff0000):color(#ffffff):red colored@@ Hex colors\nare also broken right now.
var host=location.href; \nvar matchstr = "[?&]partner=([A-Za-z0-9-]+)";\nvar matcher = new RegExp(matchstr); \nvar out = host.match(matcher); \nif (out) document.partner = out[1];\nelse document.partner = "";\n\nvar matchstr2 = "[?&]rid=([A-Za-z0-9-]+)";\nvar matcher2 = new RegExp(matchstr2); \nout = host.match(matcher2); \nif (out) document.referr= out[1];\nelse document.referr= "";
<<importTiddlers inline>>
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x, 2.0 and 2.1beta''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ImportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important. This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. It can also be very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\n!!!!!Interactive interface\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n<<importTiddlers inline>>\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//\n\nSelect one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//\n\n''Import Report History''\n\nWhen tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!non-interactive 'load tiddlers' macro\n<<<\nUseful for automated installation/update of plugins and other tiddler content.\n\n{{{<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>}}}\n<<loadTiddlers "label:load tiddlers from %0" http://www.tiddlytools.com/example.html confirm>>\n\nSyntax:\n{{{<<loadTiddlers label:text prompt:text filter source quiet confirm>>}}}\n\n''label:text'' and ''prompt:text''\n>defines link text and tooltip (prompt) that can be clicked to trigger the load tiddler processing. If a label is NOT provided, then no link is created and loadTiddlers() is executed whenever the containing tiddler is rendered.\n''filter'' (optional) determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"tiddler:~TiddlerName"'' retrieves only the specific tiddler named in the parameter.\n>''"tag:text"'' retrieves only the tiddlers tagged with the indicated text.\n''source'' (required) is the location of the imported document. It can be either a local document path/filename in whatever format your system requires, or a remote web location (starting with "http://" or "https://")\n>use the keyword ''ask'' to prompt for a source location whenever the macro is invoked\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"confirm"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n''2006.04.18 [3.0.4]''\nin loadTiddlers.handler, fixed parsing of "prompt:" param. Also, corrected parameters mismatch in loadTiddlers() callback function definition (order of params was wrong, resulting in filters NOT being applied)\n''2006.04.12 [3.0.3]''\nmoved many display messages to macro properties for easier L10N translations via 'lingo' definitions.\n''2006.04.12 [3.0.2]''\nadditional refactoring of 'core candidate' code. Proposed API now defines "loadRemoteFile()" for XMLHttpRequest processing with built in fallback for handling local filesystem access, and readTiddlersFromHTML() to process the resulting source HTML content.\n''2006.04.04 [3.0.1]''\nin refreshImportList(), when using [by tags], tiddlers without tags are now included in a new "untagged" psuedo-tag list section\n''2006.04.04 [3.0.0]''\nSeparate non-interactive {{{<<importTiddlers...>>}}} macro functionality for incorporation into TW2.1 core and renamed as {{{<<loadTiddlers>>}}} macro. New parameters for loadTiddlers: ''label:text'' and ''prompt:text'' for link creation, ''ask'' for filename/URL, ''tag:text'' for filtering, "confirm" for accept/reject of individual inbound tiddlers. Also, ImportedTiddlers report generator output has been simplified and "importReplace/importPublic" tags and associated "force" param (which were rarely, if ever, used) has been dropped.\n''2006.03.30 [2.9.1]''\nwhen extracting store area from remote URL, look for "</body>" instead of "</body>\sn</html>" so it will match even if the "\sn" is absent from the source.\n''2006.03.30 [2.9.0]''\nadded optional 'force' macro param. When present, autoImportTiddlers() bypasses the checks for importPublic and importReplace. Based on a request from Tom Otvos.\n''2006.03.28 [2.8.1]''\nin loadImportFile(), added checks to see if 'netscape' and 'x.overrideMimeType()' are defined (IE does *not* define these values, so we bypass this code)\nAlso, when extracting store area from remote URL, explicitly look for "</body>\sn</html>" to exclude any extra content that may have been added to the end of the file by hosting environments such as GeoCities. Thanks to Tom Otvos for finding these bugs and suggesting some fixes.\n''2006.02.21 [2.8.0]''\nadded support for "tiddler:TiddlerName" filtering parameter in auto-import processing\n''2006.02.21 [2.7.1]''\nClean up layout problems with IE. (Use tables for alignment instead of SPANs styled with float:left and float:right)\n''2006.02.21 [2.7.0]''\nAdded "local file" and "web server" radio buttons for selecting dynamic import source controls in ImportPanel. Default file control is replaced with URL text input field when "web server" is selected. Default remote document URL is defined in SiteURL tiddler. Also, added option for prepending SiteProxy URL as prefix to remote URL to mask cross-domain document access (requires compatible server-side script)\n''2006.02.17 [2.6.0]''\nRemoved "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]''\nadded checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]''\nFF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]''\ncorrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]''\nmoved globals from window.* to config.macros.importTiddlers.* to avoid FireFox 1.5.0.1 crash bug when referencing globals\n''2006.01.18 [2.5.0]''\nadded checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]''\nadded "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]''\nAdded support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]''\nAdded "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]''\nStrip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]''\nReorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]''\nAdded "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]''\nWhen a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]''\nIMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]''\nWhen refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]''\nWhen "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]''\ntweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]''\nDynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]''\nfixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]''\nadded 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]''\nonly load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]''\nfixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]''\ncombined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]''\nmoved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]''\ncore update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]''\nadded parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // ''MACRO DEFINITION''\n//{{{\n// Version\nversion.extensions.importTiddlers = {major: 3, minor: 0, revision: 4, date: new Date(2006,4,18)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n foundMsg: "Found %0 tiddlers in %1",\n countMsg: "%0 tiddlers selected for import",\n importedMsg: "Imported %0 of %1 tiddlers from %2",\n src: "", // path/filename or URL of document to import (retrieved from SiteUrl tiddler)\n proxy: "", // URL for remote proxy script (retrieved from SiteProxy tiddler)\n useProxy: false, // use specific proxy script in front of remote URL\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n if (!config.macros.loadTiddlers.handler)\n { alert("importTiddlers error: this plugin requires LoadTiddlersPlugin or TiddlyWiki 2.1+"); return; }\n if (!params[0]) // LINK TO FLOATING PANEL\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n else if (params[0]=="inline") {// // INLINE TIDDLER CONTENT\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n }\n else config.macros.loadTiddlers.handler(place,macroName,params); // FALLBACK: PASS TO LOADTIDDLERS\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS, register for notification\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n store.addNotification(null,refreshImportList); // refresh listbox after every tiddler change\n refreshImportList();\n var siteURL=store.getTiddlerText("SiteUrl"); if (!siteURL) siteURL="";\n document.getElementById("importSourceURL").value=siteURL;\n config.macros.importTiddlers.src=siteURL;\n var siteProxy=store.getTiddlerText("SiteProxy"); if (!siteProxy) siteProxy="SiteProxy";\n document.getElementById("importSiteProxy").value=siteProxy;\n config.macros.importTiddlers.proxy=siteProxy;\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#importPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px;}\s\n#importPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#importPanel .rad { width:auto; }\s\n#importPanel .chk { width:auto; margin:1px; }\s\n#importPanel .btn { width:auto; }\s\n#importPanel .btn1 { width:98%; }\s\n#importPanel .btn2 { width:48%; }\s\n#importPanel .btn3 { width:32%; }\s\n#importPanel .btn4 { width:24%; }\s\n#importPanel .btn5 { width:19%; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importCollisionPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML \n//{{{\nconfig.macros.importTiddlers.html = '\s\n<!-- source and report -->\s\n<table><tr><td align=left>\s\n import from\s\n <input type="radio" class="rad" name="importFrom" value="file" CHECKED\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=!this.checked?\s'block\s':\s'none\s'"> local file\s\n <input type="radio" class="rad" name="importFrom" value="http"\s\n onClick="document.getElementById(\s'importLocalPanel\s').style.display=!this.checked?\s'block\s':\s'none\s';\s\n document.getElementById(\s'importHTTPPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> web server\s\n</td><td align=right>\s\n <input type=checkbox class="chk" id="chkImportReport" checked\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;"> create a report\s\n</td></tr></table>\s\n<!-- import from local file -->\s\n<div id="importLocalPanel" style="display:block;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\nlocal document path/filename:<br>\s\n<input type="file" id="fileImportSource" size=57 style="width:100%"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<!-- import from http server -->\s\n<div id="importHTTPPanel" style="display:none;margin-bottom:5px;margin-top:5px;padding-top:3px;border-top:1px solid #999">\s\n<table><tr><td align=left>\s\n remote document URL:<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="importUseProxy"\s\n onClick="config.macros.importTiddlers.useProxy=this.checked;\s\n document.getElementById(\s'importSiteProxy\s').style.display=this.checked?\s'block\s':\s'none\s'"> use a proxy script\s\n</td></tr></table>\s\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\s\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\s\n onChange="config.macros.importTiddlers.proxy=this.value;">\s\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n</div><!--panel-->\s\n\s\n<table><tr><td align=left>\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</td><td align=right>\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</td></tr></table>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox class="chk" id="chkAddTags" checked\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox class="chk" id="chkKeepTags" checked\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags<br>\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importCollisionPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theCollisionPanel = document.getElementById('importCollisionPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadRemoteFile(config.macros.importTiddlers.src, function(src,txt) {\n var tiddlers = readTiddlersFromHTML(txt);\n var count=tiddlers?tiddlers.length:0;\n displayMessage(config.macros.importTiddlers.foundMsg.format([count,src]));\n config.macros.importTiddlers.inbound=tiddlers;\n window.refreshImportList(0);\n });\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: ';\n theText +='[['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY 0hh:0mm:0ss");\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theImported.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (theImported.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (theImported.status.substr(0,7)!="replace") && (theImported.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=theImported.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n theImported.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n theImported.status=(theImported.status=="")?'added':theImported.status;\n // do the import!\n store.addTiddler(theImported);\n store.setDirty(true);\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the collision panel and set the title edit field\n document.getElementById('importCollisionPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the collision panel will still be open... close it now.\n var panel=document.getElementById('importCollisionPanel'); if (panel) panel.style.display='none';\n\n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n // gather the statistics\n var count=0;\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].status && tiddlers[t].status.trim().length && tiddlers[t].status.substr(0,7)!="skipped") count++;\n\n // generate a report\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName\n newText +=" imported "+count+" tiddler"+(count==1?"":"s")+" from\sn[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n store.addTiddler(theReport);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n\n // reset status flags\n for (var t=0; t<config.macros.importTiddlers.inbound.length; t++) config.macros.importTiddlers.inbound[t].status="";\n\n // refresh display if tiddlers have been loaded\n if (count) { store.setDirty(true); store.notifyAll(); }\n\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(config.macros.importTiddlers.importedMsg.format([count,tiddlers.length,config.macros.importTiddlers.src]));\n}\n//}}}\n\n/***\n!!!!!TW 2.1beta Core Code Candidate\n//The following section is a preliminary 'code candidate' for incorporation of non-interactive 'load tiddlers' functionality into TW2.1beta. //\n***/\n//{{{\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\nconfig.macros.loadTiddlers = {\n label: "",\n prompt: "add/update tiddlers from '%0'",\n askMsg: "Please enter a local path/filename or a remote URL",\n openMsg: "Opening %0",\n openErrMsg: "Could not open %0 - error=%1",\n readMsg: "Read %0 bytes from %1",\n foundMsg: "Found %0 tiddlers in %1",\n loadedMsg: "Loaded %0 of %1 tiddlers from %2"\n};\n\nconfig.macros.loadTiddlers.handler = function(place,macroName,params) {\n var label=(params[0] && params[0].substr(0,6)=='label:')?params.shift().substr(6):this.label;\n var prompt=(params[0] && params[0].substr(0,7)=='prompt:')?params.shift().substr(7):this.prompt;\n var filter="updates";\n if (params[0] && (params[0]=='all' || params[0]=='new' || params[0]=='changes' || params[0]=='updates'\n || params[0].substr(0,8)=='tiddler:' || params[0].substr(0,4)=='tag:'))\n filter=params.shift();\n var src=params.shift(); if (!src || !src.length) return; // filename is required\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="confirm"); if (ask) params.shift();\n if (label.trim().length) {\n // link triggers load tiddlers from another file/URL and then applies filtering rules to add/replace tiddlers in the store\n createTiddlyButton(place,label.format([src]),prompt.format([src]), function() {\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n loadRemoteFile(src,loadTiddlers,quiet,ask,filter);\n })\n }\n else {\n // load tiddlers from another file/URL and then apply filtering rules to add/replace tiddlers in the store\n if (src=="ask") src=prompt(config.macros.loadTiddlers.askMsg);\n loadRemoteFile(src,loadTiddlers,quiet,ask,filter);\n }\n}\n\nfunction loadTiddlers(src,html,quiet,ask,filter)\n{\n var tiddlers = readTiddlersFromHTML(html);\n var count=tiddlers?tiddlers.length:0;\n if (!quiet) displayMessage(config.macros.loadTiddlers.foundMsg.format([count,src]));\n var count=0;\n if (tiddlers) for (var t=0;t<tiddlers.length;t++) {\n var theInbound = tiddlers[t];\n var theExisting = store.getTiddler(theInbound.title);\n if (theInbound.title=='ImportedTiddlers')\n continue; // skip "ImportedTiddlers" history from the other document...\n\n // apply the all/new/changes/updates filter (if any)\n if (filter && filter!="all") {\n if ((filter=="new") && theExisting) // skip existing tiddlers\n continue;\n if ((filter=="changes") && !theExisting) // skip new tiddlers\n continue;\n if ((filter.substr(0,4)=="tag:") && theInbound.tags.find(filter.substr(4))==null) // must match specific tag value\n continue;\n if ((filter.substr(0,8)=="tiddler:") && theInbound.title!=filter.substr(8)) // must match specific tiddler name\n continue;\n if (store.tiddlerExists(theInbound.title) && ((theExisting.modified.getTime()-theInbound.modified.getTime())>=0)) // tiddler is unchanged\n continue;\n }\n // get confirmation if required\n if (ask && !confirm((theExisting?"Update":"Add")+" tiddler '"+theInbound.title+"'\snfrom "+src))\n { tiddlers[t].status="skipped - cancelled by user"; continue; }\n // DO IT!\n store.addTiddler(theInbound);\n tiddlers[t].status=theExisting?"updated":"added"\n count++;\n }\n if (count) {\n // refresh display\n store.setDirty(true);\n store.notifyAll();\n // generate a report\n if (config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport= new Tiddler(); theReport.title = 'ImportedTiddlers'; theReport.text = ""; }\n // format the report content\n var now = new Date();\n var newText = "On "+now.toLocaleString()+", "+config.options.txtUserName+" loaded "+count+" tiddlers from\sn[["+src+"|"+src+"]]:\sn";\n newText += "<<<\sn";\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status) newText += "#[["+tiddlers[t].title+"]] - "+tiddlers[t].status+"\sn";\n newText += "<<<\sn";\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+theReport.title+"'); store.deleteTiddler('"+theReport.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!="")?'\sn----\sn':"")+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n store.addTiddler(theReport);\n if (!quiet) { story.displayTiddler(null,theReport.title,1,null,null,false); story.refreshTiddler(theReport.title,1,true); }\n }\n }\n // always show final message when tiddlers were actually loaded\n if (!quiet||count) displayMessage(config.macros.loadTiddlers.loadedMsg.format([count,tiddlers.length,src]));\n}\n\nfunction loadRemoteFile(src,callback,quiet,ask,filter) {\n if (src==undefined || !src.length) return null; // filename is required\n if (!quiet) clearMessage();\n if (!quiet) displayMessage(config.macros.loadTiddlers.openMsg.format([src]));\n if (src.substr(0,4)!="http") { // fallback to read from local filesystem\n var txt=loadFile(src);\n if ((txt==null)||(txt==false)) // file didn't load\n { if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"])); }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([txt.length,src]));\n if (callback) callback(src,convertUTF8ToUnicode(txt),quiet,ask,filter);\n }\n }\n else {\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 }\n }\n }\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status == 200) {\n if (!quiet) displayMessage(config.macros.loadTiddlers.readMsg.format([x.responseText.length,src]));\n if (callback) callback(src,x.responseText,quiet,ask,filter);\n }\n else {\n if (!quiet) displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,x.status]));\n }\n }\n }\n if ((document.location.protocol=="file:") && (typeof(netscape)!="undefined")) { // UniversalBrowserRead only works from a local file context\n try { netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead')}\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",url,true);\n if (x.overrideMimeType) x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage(config.macros.loadTiddlers.openErrMsg.format([src,"(unknown)"]));\n displayMessage(e.description?e.description:e.toString());\n }\n }\n }\n}\n\nfunction readTiddlersFromHTML(html)\n{\n // extract store area from html \n var start=html.indexOf('<div id="storeArea">');\n var end=html.indexOf('</body>',start);\n var sa="<html><body>"+html.substring(start,end)+"</body></html>";\n\n // load html into iframe document\n var f=document.getElementById("loaderFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="loaderFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.open(); d.writeln(sa); d.close();\n\n // read tiddler DIVs from storeArea DOM element \n var sa = d.getElementById("storeArea");\n if (!sa) return null;\n sa.normalize();\n var nodes = sa.childNodes;\n if (!nodes || !nodes.length) return null;\n var tiddlers = [];\n for(var t = 0; t < nodes.length; t++) {\n var title = null;\n if(nodes[t].getAttribute)\n title = nodes[t].getAttribute("tiddler");\n if(!title && nodes[t].id && (nodes[t].id.substr(0,5) == "store"))\n title = nodes[t].id.substr(5);\n if(title && title != "")\n tiddlers.push((new Tiddler()).loadFromDiv(nodes[t],title));\n }\n return tiddlers;\n}\n//}}}
On Saturday, June 10, 2006 2:20:04 PM, YourName imported 1 tiddler from\n[[http://checkettsweb.com/tw/index.html|http://checkettsweb.com/tw/index.html]]:\n<<<\n#[[WebPageTemplate]] - added\n<<<\n<html><input type="button" href="javascript:;" onclick="story.closeTiddler('ImportedTiddlers'); store.deleteTiddler('ImportedTiddlers');" value="discard report"></html>
/***\n''InlineJavascriptPlugin for ~TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#InlineJavascriptPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nInsert Javascript executable code directly into your tiddler content. Lets you ''call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a label="..." parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://www.TiddlyTools.com/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.04.19 [1.5.0]''\nadded 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]''\nadded 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]''\nwhen 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]''\nfor '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\nBased on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]''\nhandle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]''\npass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 5, revision: 0, date: new Date(2006,4,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")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[4]) { // there is script code\n if (lookaheadMatch[3]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[4]+"};_out(this);"\n link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[4]+"};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n\n
''[[Interra Project website|http://www.interraproject.org]]''\n\nIn the context of a growing dominance of large, centralized businesses, an eroding sense of community and connection, failing local economies, and environmental degradation, a group of over 100 visionaries have come together with ''Dee Hock, the founder of Visa International'' and ''Greg Steltenpohl, founder of the Odwalla juice company'' to enable systemic change. Interra empowers citizen consumers to wield a tool they use everyday—credit and debit cards—to influence how things are made and disposed of, how money circulates within their communities, and how businesses, in general, behave.\n\n''Consumers own the power of 70% of GNP, but until now they have not wielded it to better their communities and the world at large.''\n
[[about InterraBot]]
[[about InterraBot]] [[the big vision]] [[how it works]] [[where it works|supported merchant sites]] [[sales so far]] [[where the $ goes]] [[endorsed by]] [[install it]] [[privacy]] [[register|to register]] [[Interra Project]]\n\n~~website powered by [[TiddlyWiki|http://www.tiddlywiki.com]]~~
<<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>>\n
<div class='header' >\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
Right-click over [[this link|#]] and "save target as". You should then be able to open that file in a browser and own it.
window.showDiv=function(object) {\n var object = document.getElementById(object); if(!object) return;\n object.style.visibility='visible'; \n object.style.display='block';\n }\n window.hideDiv=function(object) {\n var object = document.getElementById(object); if(!object) return;\n object.style.visibility='hidden'; object.style.display='none';\n}
<<search>>\n<<option chkSinglePageMode>> One at a time\n<<option chkTopOfPageMode>> Always on top <<closeAll>><<permaview>> <<newTiddler>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>
[img[http://www.mediaventure.org/bloobot/images/bloobot2-med.jpg]] &nbsp;smart money for good things
~InterraBot
\n\nvar SORT_COLUMN_INDEX;\n\nfunction sortables_init() {\n // Find all tables with class sortable and make them sortable\n if (!document.getElementsByTagName) return;\n tbls = document.getElementsByTagName("table");\n for (ti=0;ti<tbls.length;ti++) {\n thisTbl = tbls[ti];\n if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {\n //initTable(thisTbl.id);\n ts_makeSortable(thisTbl);\n }\n }\n}\n\nfunction ts_makeSortable(table) {\n if (table.rows && table.rows.length > 0) {\n var firstRow = table.rows[0];\n }\n if (!firstRow) return;\n \n // We have a first row: assume it's the header, and make its contents clickable links\n for (var i=0;i<firstRow.cells.length;i++) {\n var cell = firstRow.cells[i];\n var txt = ts_getInnerText(cell);\n cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;">'+txt+'<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';\n }\n}\n\nfunction ts_getInnerText(el) {\n if (typeof el == "string") return el;\n if (typeof el == "undefined") { return el };\n if (el.innerText) return el.innerText; //Not needed but it is faster\n var str = "";\n \n var cs = el.childNodes;\n var l = cs.length;\n for (var i = 0; i < l; i++) {\n switch (cs[i].nodeType) {\n case 1: //ELEMENT_NODE\n str += ts_getInnerText(cs[i]);\n break;\n case 3: //TEXT_NODE\n str += cs[i].nodeValue;\n break;\n }\n }\n return str;\n}\n\nfunction ts_resortTable(lnk) {\n // get the span\n var span;\n for (var ci=0;ci<lnk.childNodes.length;ci++) {\n if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];\n }\n var spantext = ts_getInnerText(span);\n var td = lnk.parentNode;\n var column = td.cellIndex;\n var table = getParent(td,'TABLE');\n \n // Work out a type for the column\n if (table.rows.length <= 1) return;\n var itm = ts_getInnerText(table.rows[1].cells[column]);\n sortfn = ts_sort_caseinsensitive;\n if (itm.match(/^\sd\sd[\s/-]\sd\sd[\s/-]\sd\sd\sd\sd$/)) sortfn = ts_sort_date;\n if (itm.match(/^\sd\sd[\s/-]\sd\sd[\s/-]\sd\sd$/)) sortfn = ts_sort_date;\n if (itm.match(/^[£$]/)) sortfn = ts_sort_currency;\n if (itm.match(/^[\sd\s.]+$/)) sortfn = ts_sort_numeric;\n SORT_COLUMN_INDEX = column;\n var firstRow = new Array();\n var newRows = new Array();\n for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }\n for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }\n\n newRows.sort(sortfn);\n\n if (span.getAttribute("sortdir") == 'down') {\n ARROW = '&nbsp;&nbsp;&uarr;';\n newRows.reverse();\n span.setAttribute('sortdir','up');\n } else {\n ARROW = '&nbsp;&nbsp;&darr;';\n span.setAttribute('sortdir','down');\n }\n \n // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones\n // don't do sortbottom rows\n for (i=0;i<newRows.length;i++) { if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) table.tBodies[0].appendChild(newRows[i]);}\n // do sortbottom rows only\n for (i=0;i<newRows.length;i++) { if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}\n \n // Delete any other arrows there may be showing\n var allspans = document.getElementsByTagName("span");\n for (var ci=0;ci<allspans.length;ci++) {\n if (allspans[ci].className == 'sortarrow') {\n if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?\n allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';\n }\n }\n }\n \n span.innerHTML = ARROW;\n}\n\nfunction getParent(el, pTagName) {\n if (el == null) return null;\n else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) // Gecko bug, supposed to be uppercase\n return el;\n else\n return getParent(el.parentNode, pTagName);\n}\nfunction ts_sort_date(a,b) {\n // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX\n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);\n if (aa.length == 10) {\n dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);\n } else {\n yr = aa.substr(6,2);\n if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }\n dt1 = yr+aa.substr(3,2)+aa.substr(0,2);\n }\n if (bb.length == 10) {\n dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);\n } else {\n yr = bb.substr(6,2);\n if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }\n dt2 = yr+bb.substr(3,2)+bb.substr(0,2);\n }\n if (dt1==dt2) return 0;\n if (dt1<dt2) return -1;\n return 1;\n}\n\nfunction ts_sort_currency(a,b) { \n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n return parseFloat(aa) - parseFloat(bb);\n}\n\nfunction ts_sort_numeric(a,b) { \n aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));\n if (isNaN(aa)) aa = 0;\n bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); \n if (isNaN(bb)) bb = 0;\n return aa-bb;\n}\n\nfunction ts_sort_caseinsensitive(a,b) {\n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();\n if (aa==bb) return 0;\n if (aa<bb) return -1;\n return 1;\n}\n\nfunction ts_sort_default(a,b) {\n aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);\n bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);\n if (aa==bb) return 0;\n if (aa<bb) return -1;\n return 1;\n}\n\n\nfunction addEvent(elm, evType, fn, useCapture)\n// addEvent and removeEvent\n// cross-browser event handling for IE5+, NS6 and Mozilla\n// By Scott Andrew\n{\n if (elm.addEventListener){\n elm.addEventListener(evType, fn, useCapture);\n return true;\n } else if (elm.attachEvent){\n var r = elm.attachEvent("on"+evType, fn);\n return r;\n } else {\n alert("Handler could not be removed");\n }\n} \n\nsortables_init();\n
Its useful to understand the structure of a web page so you can 'describe' in your styles which element (like div, a, or #contentWrapper) you are coloring. For simplicity I'll only include elements that you would want to style. (Firefox extensions make this easier and somwhat automated.) I hope to make this list collapsable in the future to improve legibility.\n\n*html\n**body\n***div#contentWrapper //Use this for [[Centering the TiddlyWiki]] or [[Increasing specificity]]//\n****div#header\n*****div#titleLine\n******span.siteTitle //The site's title (content is controlled by the SiteTitle tiddler)// \n******span.siteSubtitle //The site's subtitle (content is controlled by the SiteSubtitle tiddler)//\n****div#sidebar //The sidebar on the right//\n*****div#sidebarOptions //The sidebar that contains the seach box (content is controlled by the SideBarOptions tiddler)//\n******div.sliderPanel //This is the panel containing the option checkboxes (content is controled by the OptionsPanel tiddler)//\n*****div#sidebarTabs //The sidebar with the tabs (content is controlled by the SideBarTabs tiddler) //\n******div.txtMainTab //The class name is determined by the tab generating macro//\n*******div.tabset //The tabs are contained in the tabset//\n********a.tab.tabSelected\n********a.tab.tabUnselected\n*******div.tabContents\n****div#mainMenu\n****div#displayArea\n*****div#messageArea\n*****div#tiddlerDisplay\n******div#tiddlerTiddlerName.tiddler //The TiddlerName part of the id is customized per tiddler (See [[Tiddler IDs]]) //\n*******div.unselectedTiddler //This div's class changes to .unselected when the mouse hovers over it. //\n********div#toolbarTiddlerName.toolbar\n********div#titleTiddlerName.title\n********div#bodyTiddlerName.body //This div and its children (.viewer and .footer) change when editing (see [[Editor Structure]]) //\n*********div#viewerTiddlerName.viewer\n**********div#popup //The popup is generated in a number of places but it uses the same code (see [[Styling the popup]]) //\n***********hr //The horizontal rule exists in all popups//\n*********div#footerTiddlerName.footer\n**********div //This div holds the tags listing//
/***\nPlace your custom CSS here\n***/\n/*{{{*/\n\n#contentWrapper {\nfont-family: verdana;\nfont-size: 11px;\n}\n\n.header {\nfont-family: 'Courier New';\ncolor: yellow; }\n\n.siteTitle {\nfont-weight: bold;\nfont-size: 30px;\npadding-left: 10px;\n}\n.siteSubtitle {\n font-size: 18px;\n font-weight: bold;\n padding-left: 10px;\n\n}\n\n.siteSubtitle img {\nmargin-bottom: -9px;\n}\n\n#displayArea {\nborder: 0px solid grey;\nmargin-left: 165px;\n}\n\n.header {\nbackground:#0678B4;\n}\n\n#mainMenu {\n line-height: 166%;\n border: 1px solid #999;\n border-bottom: 1px solid #999;\n letter-spacing: 1px;\nfont-size: 11px;\nwidth: 13em;\n}\n\n\n#mainMenu, #mainMenu a {\nbackground: #FFFFee;\n}\n\n#mainMenu a {\n color: #003;\n display: block;\n padding: 0 5px 0 5px;\n height: 22px;\n line-height: 22px;\n border-top: 0;\n border-bottom: 0;\n letter-spacing: 1px;\n}\n#mainMenu a:hover {\n background: #0678B4;\n color: yellow;\n}\n\n\n\n\n#titleLine { color: #66f; }\n#titleLine a { color: #36c; }\n#titleLine a:hover { color: #99f; }\n\n.tiddler {\nborder: 1px solid grey;\nmargin: 3px;\nmargin-top: 15px;\npadding-bottom: 10px;\nbackground: #f5f5f5;\n}\n\n\n#sidebarOptions.sliderPanel {\nbackground: yellow;\n}\n\n[[StylesheetInterraBot]]\n#bb-example {\nbackground: url(images/amazon-diamond3.gif);\nwidth: 650px; \nmin-width: 400px; \nmin-height: 300px; \n}\n\n/*}}}*/\n
/*{{{*/\n#bloobot {\nfloat: right; \nposition: absolute;\nbackground: #ffffef;\nz-index: 200;\n}\np.bloobot-commission {\nmargin: 2px 0 1px 0;font-size: 11px; color: #333; \n}\n\n#bloobot-open-container {\n margin: 0 auto 0 auto; \n border-bottom: 1px solid #000000; \n padding: 0px;\n font-size: 11px; \n color: #333;\n border: 1px solid blue;\n }\n \n\n#bloobot a {\ncolor: #045C8C;\ntext-decoration: underline;\n}\n\n \np.bloobot-text {\nmargin: 2px 0 1px 0;\ncolor: #333; \nfont-size: 11px;\n}\n\n#bloobot a.bloobot-link {\nfont-size: 11px; color: #049;\n}\n\np.bloobot-alert-text {\nmargin: 0px 0 0px 0;\ncolor: #333; \n}\n#bloobot a.bloobot-alert-link {\nbackground: white; \ncolor:red; \npadding: 2px;\n}\n\ntd.bloobot-right {\nborder: 1px solid #999;\nbackground: #fafaff;\npadding: 6px;\nfont-size: 11px;\n}\n\n#bloobot-product-info , #bloobot-merchant-info, #bloobot-alerts {\nbackground: white;\nborder: 1px solid grey;\nmargin: 3px;\npadding: 2px;\n}\n\n#bloobot-register {\nbackground: white;\npadding: 5px;\nborder: 1px solid grey;\nmargin-top: 3px;\n}\n#bloobot-user-info {\nbackground: white;\npadding: 5px;\nborder: 1px solid grey;\nmargin-top: 3px;\n}\n#bloobot-housekeeping {\nbackground: white;\npadding: 5px;\nborder: 1px solid grey;\nmargin-top: 3px;\n}\n\n/*}}}*/
#bloobot {\nposition: absolute;\nbackground: #ffffef;\nz-index: 300;\nfont-family: verdana, arial, sans-serif;\nfont-size: 1px;\n}\np.bloobot-commission {\nmargin: 2px 0 1px 0;font-size: 11px; color: #333; \n}\n\n#bloobot-open-container {\n margin: 0 auto 0 auto; \n border-bottom: 1px solid #000000; \n padding: 0px;\n font-size: 11px; \n color: #333;\n border: 1px solid #bbb;\n width: 450px;\n width: auto;\n max-width: 600px;\n -moz-border-radius: 20px;\n border: 2px solid #888;\n }\n\n#bloobot-open-container table , #bloobot-open-container tr, #bloobot-open-container td {\nmargin: 0px;\npadding: 0px;\nborder: 0px;\nfont-size: 11px;\n} \n#bloobot-open-container img {\npadding-right: 10px;\n}\n\n#bloobot a {\ncolor: #045C8C;\ntext-decoration: none;\nbackground: none;\n}\n#bloobot a:hover {\nbackground: none;\ntext-decoration: underline;\n}\n \np.bloobot-text {\nmargin: 2px 0 1px 0;\ncolor: #333; \nfont-size: 11px;\n}\n\n#bloobot a.bloobot-link {\nfont-size: 11px; color: #049;\n}\n\np.bloobot-alert-text {\nmargin: 0px 0 0px 0;\ncolor: #333; \n}\n#bloobot a.bloobot-alert-link {\nbackground: white; \ncolor:red; \npadding: 2px;\n}\n\ntd.bloobot-right {\nborder: 1px solid #999;\nbackground: #fafaff;\npadding: 6px;\nfont-size: 11px;\n}\n\n#bloobot-product-info , #bloobot-merchant-info, #bloobot-alerts ,#bloobot-register, #bloobot-user-info, #bloobot-housekeeping{\nbackground: white;\nborder: 1px solid grey;\nmargin: 3px;\npadding: 3px;\nmargin: 3px \n}\n\n.bb-toggle-window {\nbackground : #efefef;\nmargin: 5px;\npadding: 3px;\nborder: 1px solid #666;\n}\n\n\n\n
Each installation of InterraBot is given a ''UniqueID'' so we can credit users for spreading the word. It is displayed in the InterraBot window when you click on the logo and then "User Info".\n\nThe first time a new installation of InterraBot is used, is given a ''unique serial number'' by the server so it can keep a count of the number of installations. That is the ONLY time InterraBot sends your UniqueID anywhere.\n\nThe primary use of the UniqueID is when you point others to www.mediaventure.org/bloobot?rid=# where # is your UniqueID ("rid" means referrer ID). That allows us to associate your UniqueID with any new users that follow that link.\n\nSuch credits will be converted to something useful if and when you [[register|to register]].
SiteTitle\nSiteSubtitle\nStyleSheet\nFormattingInstructions\nDefaultTiddlers\nMainMenu\nSaveYourOwnCopy
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></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<div class='toolbar' macro='toolbar -cancelTiddler'></div>\n<div class='title'><span macro='view title'></span> (source code)</div>\n<div class='editor' macro='edit text'></div>\n<!--}}}-->\n
<div class='header' >\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='WebSideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='WebSideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
<<search>>\n<<option chkSinglePageMode>> One at a time\n<<option chkTopOfPageMode>> Always on top <<closeAll>><<permaview>>
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags >>
/***\n!WebTemplatePlugin with ViewSourcePlugin and 404TiddlerPlugin\n''Version'': 0.3 (19 Jan 2006)\n''Author'': Clint Checketts\n\n!Instructions\nWebPageTemplate\nWebViewTemplate\nWebEditTemplate\n\n!Code\n***/\n//{{{\nconfig.options.chkHttpReadOnly = true;\nreadOnly = (document.location.toString().substr(0,4) == "http") ? config.options.chkHttpReadOnly : false;\n\nconfig.shadowTiddlers['WebPageTemplate'] = config.shadowTiddlers['PageTemplate'];\nconfig.shadowTiddlers['WebViewTemplate'] = "<!--{{{-->\sn<div class='toolbar' macro='toolbar closeTiddler permalink +viewSource'></div>\sn<div class='title' macro='view title'></div>\sn<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\sn<div class='tagging' macro='tagging'></div>\sn<div class='tagged' macro='tags'></div>\sn<div class='viewer' macro='view text wikified'></div>\sn<div class='tagClear'></div>\sn<!--}}}-->";\nconfig.shadowTiddlers['WebEditTemplate'] = "<!--{{{-->\sn<div class='toolbar' macro='toolbar -cancelTiddler'></div>\sn<div class='title'><span macro='view title'></span> (source code)</div>\sn<div class='editor' macro='edit text'></div>\sn<!--}}}-->\sn";\n\nif(readOnly){ \n showWebView();\n}\n\nwindow.applyPageTemplateWebTemplate = window.applyPageTemplate;\nwindow.applyPageTemplate = function(title){\n if(readOnly && store.tiddlerExists('WebPageTemplate')) title = 'WebPageTemplate';\n applyPageTemplateWebTemplate(title);\n}\n\nfunction showWebView(){\n config.tiddlerTemplates[1] = "WebViewTemplate";\n config.tiddlerTemplates[2] = "WebEditTemplate";\n}\n\nconfig.macros.testWebView = {}\nconfig.macros.testWebView.handler = function(place,macroName,params)\n{\n createTiddlyButton(place,"ToggleWebTemplates","Toggle the web mode",toggleWebView);\n}\n\nvar toggleWebView = function(){\n readOnly = !readOnly;\n if(readOnly){\n showWebView();\n } else {\n config.tiddlerTemplates[1] = "ViewTemplate";\n config.tiddlerTemplates[2] = "EditTemplate";\n }\n store.notifyAll();\n}\n//}}}\n/***\n!View Source Plugin\n***/\n//{{{\nvar viewSourceSelectAllByDefault = true;\n\nconfig.commands.viewSource = {text: "view source", tooltip: "View this tiddler's wiki markup"},\nconfig.commands.viewSource.handler = function(event,src,title){\n clearMessage();\n story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);\n\n var theTiddler = document.getElementById("tiddler"+title);\n var tiddlerElements = theTiddler.getElementsByTagName("textarea")\n\n for (var i = 0; i < tiddlerElements.length; i++){\n tiddlerElements[i].setAttribute("readonly","readonly");\n }\n\n if (tiddlerElements.length > 0){\n tiddlerElements[0].focus();\n if (viewSourceSelectAllByDefault) tiddlerElements[0].select();\n }\n return false;\n}\n//}}}\n/***\n!404 Tiddler Plugin\n***/\n//{{{\n//config.shadowTiddlers['404 Error'] = "The tiddler you were looking for doesn't exist.\sn\snTry a <<search>> for the information you were looking for.";\nconfig.shadowTiddlers['404Template'] = "<div class='toolbar' macro='toolbar -closeTiddler closeOthers'></div><div class='title'>404 Error: <span macro='view title'></span></div><div class='viewer'>The page '<span macro='view title'></span>' doesn't exist.<br /><br />Try a <span macro='search'></span> for the information you were looking for.</div>";\n\n\nStory.prototype.displayTiddler404 = Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n// if (readOnly && !store.tiddlerExists(title) && !store.isShadowTiddler(title)){title = '404 Error'}\n if (readOnly && !store.tiddlerExists(title) && !store.isShadowTiddler(title)){template = '404Template';}\n this.displayTiddler404(srcElement,title,template,animate,slowly);\n}\n\n//}}}
<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers permalink +viewSource references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n<!--}}}-->
InterraBot is a ''very simple way for your online purchasing to benefit causes you care about''. \n\nOnce installed, it automagically donates ''4-10% of your online purchases'' to your [[chosen beneficiary|where the $ goes]]. \n\n''No extra cost, no change in your shopping behavior, no registration.'' It's a simple free way to support your favorite [[eco-social]] causes financially. \n\n[[How's that?|how it works]]\n\nInterraBot is a browser "plugin" (Firefox only right now) that automatically collects commissions through existing [[affiliate programs]] at [[most major retailers|supported merchant sites]], and credits them to the beneficiary the user currently has chosen. \n\nIt is an initiative of the ''[[Interra Project]]'', and ''100% of revenues'' go to independent media and progressive non-profits. <<tiddler DisplayCurrentBene>>\n\nIf you're not using it, you're ''[[throwing away money]]''. The [[eco-social]] constituency spent tens of billions of dollars online last year, and most of that could have collected commissions. That's a lot of money.\n\nHere's ''an [[example]]'' of how it looks.\n\nBesides creating a significant source of funding for good things, InterraBot is a lightweight way for [[large numbers of citizens to "vote with their dollars"|the big vision]], at least online.\n\nWe realize we're asking for a lot of trust, which is why you should [[look at who endorses us|endorsers]].\n\nSo what are you waiting for? [[Install it|install it]].
Affiliate programs reward websites for sending customers to online retailers. The best known is [[Amazon Associates|http://associates.amazon.com/gp/associates/join]], which gives a commission on any sale if, for instance, a website recommends a book and links to its Amazon purchase page.\n\nFor more info, see [[Wikipedia|http://en.wikipedia.org/wiki/Affiliate_marketing]]
see UniqueID\n
We use the term "eco-social" to describe anything that has a positive impact on the environment and/or society, ideally both. This being a human planet, they are inseparable.
''[***DRAFT ONLY, FOR DISCUSSION PURPOSES ONLY ***]''\n\n''Endorsing organizations:''\n* [[Powell's Books|http://www.powells.com]]\n* [[Interra Project|http://www.interraproject.org]]\n* [[Alternet|http://www.alternet.org]]\n* [[Planetwork]]\n* [[Ethical Markets]]\n* [[Global Exchange]]\n* [[Witness]]\n\n''Quotes from luminaries. Some possible examples:''\n\nGreg Steltenpohl, founder of Odwalla?\nSomeone from the Berkman Center?\nDee Hock?\nDaily Kos?\nGlobal Exchange?\nPeter Gabriel?\n\n
''Mouse over the little blue guy and click the links inside.''\n**Firefox only, or at least NOT Internet Explorer**\n**If you have InterraBot installed already, click on the monkey at the bottom to disable it temporarily**\n \n<html><div id="bb-example" >\n\n<div id="bloobot"> <div id="bloobot-container"><div onmouseover="javascript:showDiv('bb-logo-open'); hideDiv('bb-logo-closed');" onmouseout="javascript:showDiv('bb-logo-closed'); hideDiv('bb-logo-open');"><div id="bb-logo-closed" style="visibility: visible; display: block;"> <img src="http://www.mediaventure.org/bloobot/images/bloobot2-tiny.jpg" border="0" alt="Open InterraBot"></div><div id="bb-logo-open" style="display: none; visibility: hidden;"><div id="bloobot-open-container"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="padding: 0px;" align="top" valign="top"><img src="http://www.mediaventure.org/bloobot/images/bloobot2-small.jpg" border="0"></td><td><p class="bloobot-text">Thanks for using <a href="http://www.mediaventure.org/bloobot" target="_blank" class="bloobot-link">InterraBot</a>. </p> <div id="bb-newsession" style="visibility: hidden; display: none;"><p class="bloobot-text"><strong><a href="http://www.mediaventure.org/books?merchant=amazon&amp;original=http%3A//www.amazon.com/gp/product/B000BR4IP0/qid%3D1151971790/sr%3D1-4/ref%3Dsr_1_4/104-2591953-0174361%3F%255Fencoding%3DUTF8%26s%3Djewelry%26v%3Dglance%26n%3D3367581">CLICK HERE</a> </strong><br>to benefit <strong>firedoglake</strong> when you shop at Amazon. <br><br>Or select another beneficiary.</p><div id="bloobot-select-bene"><form id="bloobot-bene" method="get" action="javascript: parent.location.href='http://www.mediaventure.org/books/index.html?beneficiary=' + document.foo ; ">\n\n<select name="beneficiary" onchange="document.foo = this.value; form.submit();">\n<option selected="selected" value="firedoglake">firedoglake</option>\n<option value="Alternet">Alternet</option>\n<option value="Witness">Witness</option>\n<option value="InTheseTimes">In These Times</option>\n<option value="firedoglake">firedoglake</option>\n<option value="MotherJones">Mother Jones</option>\n<option value="PublicRadioExchange">Public Radio Exchange</option>\n<option value="testbeneficiary">Test Beneficiary</option>\n\n<option value=""></option>\n</select>\n</form></div><p class="bloobot-text">(You are starting a new session at this merchant, which is the reason for this alert. It should happen no more than once a day per retailer.)</p></div><div id="bb-normal" style="visibility: visible; display: block;"><strong>BENEFICIARY</strong><div id="bloobot-select-bene2"><form id="bloobot-bene" method="get" action="javascript: parent.location.href='http://www.mediaventure.org/books/index.html?beneficiary=' + document.foo ; ">\n<select name="beneficiary" onchange="document.foo = this.value; form.submit();">\n<option selected="selected" value="firedoglake">firedoglake</option>\n<option value="Alternet">Alternet</option>\n<option value="Witness">Witness</option>\n<option value="InTheseTimes">In These Times</option>\n<option value="firedoglake">firedoglake</option>\n<option value="MotherJones">Mother Jones</option>\n\n<option value="PublicRadioExchange">Public Radio Exchange</option>\n<option value="testbeneficiary">Test Beneficiary</option>\n<option value=""></option>\n</select>\n</form></div><div class="bb-toggle-window"><div id="bb-user-closed" style="visibility: visible; display: block;"> <a href="#" onclick="javascript:showDiv('bb-user-open'); hideDiv('bb-user-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>User Info</strong></a></div><div id="bb-user-open" style="display: none; visibility: hidden;"><a href="#" onclick="javascript:showDiv('bb-user-closed'); hideDiv('bb-user-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>User Info</strong></a><div id="bloobot-user-info">Your <strong><a href="http://www.mediaventure.org/bloobot#UniqueID" target="_blank">unique ID</a></strong> is <strong>UNIQUEID</strong>. Get credit for promoting InterraBot by pointing friends to <strong>www.mediaventure.org/bloobot?rid=UNIQUEID</strong>.</div><div id="bloobot-register">Click <a href="http://venturecollective.org/bloobot/#%5B%5Bto%20register%5D%5D"><strong>here to register</strong></a> for additional InterraBot services, including getting credits for helping spread the word.<br>and please <strong>email InterraBot-feedback @ mediaventure dot org</strong> with any comments.</div></div></div> <div class="bb-toggle-window"><div id="bb-merch-closed" style="visibility: visible; display: block;"> <a href="#" onclick="javascript:showDiv('bb-merch-open'); hideDiv('bb-merch-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>Merchant and Product Info</strong></a></div><div id="bb-merch-open" style="display: none; visibility: hidden;"><a href="#" onclick="javascript:showDiv('bb-merch-closed'); hideDiv('bb-merch-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>Merchant and Product Info</strong></a><div id="InterraBot-merchant-info"><strong>MERCHANT INFO</strong>:<br><a href="http://www.buyblue.org/node/66/view/summary" target="_blank" class="bloobot-link">What Buy Blue thinks</a> of Amazon</div><div id="bloobot-product-info"><strong>PRODUCT INFO:</strong><br><p class="bloobot-commission">This purchase would result in a <strong>$4663.10 commission</strong>.</p><a href="http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&amp;SubscriptionId=0S2SJ5E66G1PJC6X8AG2&amp;Operation=ItemLookup&amp;IdType=ASIN&amp;ItemId=B000BR4IP0&amp;ResponseGroup=Medium,OfferFull" target="_blank">Amazon XML</a> for this product</div></div></div> <div class="bb-toggle-window"><div id="bb-alerts-closed" style="visibility: visible; display: block;"> <a href="#" onclick="javascript:showDiv('bb-alerts-open'); hideDiv('bb-alerts-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>Alerts</strong></a></div><div id="bb-alerts-open" style="display: none; visibility: hidden;"><a href="#" onclick="javascript:showDiv('bb-alerts-closed'); hideDiv('bb-alerts-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>Alerts</strong></a><div id="bloobot-alerts"><br><p class="bloobot-alert-text">this is <a class="bloobot-alert-link" href="http://www.mediaventure.org/bloobot/alert.html" target="_blank"> an alert test</a></p><p></p></div></div></div> <div class="bb-toggle-window"><div id="bb-disable-closed" style="visibility: visible; display: block;"> <a href="#" onclick="javascript:showDiv('bb-disable-open'); hideDiv('bb-disable-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>How to disable</strong></a></div><div id="bb-disable-open" style="display: none; visibility: hidden;"><a href="#" onclick="javascript:showDiv('bb-disable-closed'); hideDiv('bb-disable-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>How to disable</strong></a><div id="bloobot-housekeeping"><p class="bloobot-text"><strong>To disable InterraBot, click the monkey</strong> at the bottom right of the browser.</p><p class="bloobot-text"><strong>To re-enable it when shopping, click the monkey</strong> again.</p><p class="bloobot-text">To uninstall it, <strong>use your browser menu Tools-Manage User Scripts</strong>, then uncheck "Enabled" or click "Uninstall"</p><p class="bloobot-text">To uninstall Greasemonkey, <strong>use your browser menu Tools-Extensions</strong>, select Greasemonkey, click "Uninstall"</p></div></div></div> </div> </td></tr></tbody></table></div></div></div></div></div></div>\n\n</div></html>
Click on the little blue guy and the links inside.\n[img[images/amazon-diamond3.gif]]\n \n<html><div style="background: url(images/amazon-diamond3.gif); width: 650px; min-width: 400px; min-height: 300px;" >\n\n<div id="bloobot"> <div id="bloobot-container"><div id="bb-logo-closed" style="visibility: visible; display: block;"> <a href="javascript:showDiv('bb-logo-open'); hideDiv('bb-logo-closed');"><img src="http://www.mediaventure.org/bloobot/images/bloobot2-tiny.jpg" border="0"></a></div><div id="bb-logo-open" style="display: none; visibility: hidden;"><div id="bloobot-open-container"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td align="top" valign="top" style="padding: 0px;"><a href="javascript:showDiv('bb-logo-closed'); hideDiv('bb-logo-open');"><img src="http://www.mediaventure.org/bloobot/images/bloobot2-small.jpg" border="0"><br><br><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"></a></td><td><p class="bloobot-text">Thanks for helping beta-test <a href="http://www.mediaventure.org/bloobot" target="_blank" class="bloobot-link">InterraBot</a>. </p><p class="bloobot-text"><strong>BENEFICIARY</strong></p><div id="bloobot-select-bene"><form id="bloobot-bene" method="get" action="javascript:parent.location.href='http://www.mediaventure.org/books/index.html?beneficiary=' + document.foo ; return false;">\n\n<select name="beneficiary" onchange="document.foo = this.value; form.submit();">\n<option selected="selected" value="MotherJones">MotherJones</option>\n<option value="Alternet">Alternet</option>\n<option value="Witness">Witness</option>\n<option value="InTheseTimes">In These Times</option>\n<option value="firedoglake">firedoglake</option>\n<option value="MotherJones">Mother Jones</option>\n<option value="testbeneficiary">Test Beneficiary</option>\n<option value=""></option>\n</select>\n\n</form></div><div style="border: 1px solid rgb(102, 102, 102); padding: 2px;"><div id="bb-user-closed" style="visibility: visible; display: block;"> <a href="javascript:showDiv('bb-user-open'); hideDiv('bb-user-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>User Info</strong></a></div><div id="bb-user-open" style="display: none; visibility: hidden;"><a href="javascript:showDiv('bb-user-closed'); hideDiv('bb-user-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>User Info</strong></a><div id="bloobot-user-info">Your <strong><a href="http://www.mediaventure.org/bloobot#UniqueID" target="_blank">unique ID</a></strong> is <strong>19</strong>. Get credit for promoting InterraBot by pointing friends to <strong>www.mediaventure.org/bloobot?rid=19</strong>.</div><div id="bloobot-register">Click <a href="http://venturecollective.org/bloobot/#%5B%5Bto%20register%5D%5D"><strong>here to register</strong></a> for additional InterraBot services, including getting credits for helping spread the word.<br>and please <strong>email InterraBot-feedback @ mediaventure dot org</strong> with any comments.</div></div></div> <div style="border: 1px solid rgb(102, 102, 102); padding: 2px;"><div id="bb-merch-closed" style="visibility: visible; display: block;"> <a href="javascript:showDiv('bb-merch-open'); hideDiv('bb-merch-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>Merchant and Product Info</strong></a></div><div id="bb-merch-open" style="display: none; visibility: hidden;"><a href="javascript:showDiv('bb-merch-closed'); hideDiv('bb-merch-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>Merchant and Product Info</strong></a><div id="InterraBot-merchant-info"><strong>MERCHANT INFO</strong>:<br><a href="http://www.buyblue.org/node/66/view/summary" target="_blank" class="bloobot-link">What Buy Blue thinks</a> of Amazon</div><div id="bloobot-product-info"><strong>PRODUCT INFO:</strong><br><p class="bloobot-commission">This purchase would result in a <strong>$4663.10 commission</strong>.</p><a href="http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&amp;SubscriptionId=0S2SJ5E66G1PJC6X8AG2&amp;Operation=ItemLookup&amp;IdType=ASIN&amp;ItemId=B000BR4IP0&amp;ResponseGroup=Medium,OfferFull" target="_blank">Amazon XML</a> for this product</div></div></div> <div style="border: 1px solid rgb(102, 102, 102); padding: 2px;"><div id="bb-alerts-closed" style="visibility: visible; display: block;"> <a href="javascript:showDiv('bb-alerts-open'); hideDiv('bb-alerts-closed');"><img src="http://www.bookswelike.net/style/arrow-down-small.gif" border="0"><strong>Alerts</strong></a></div><div id="bb-alerts-open" style="display: none; visibility: hidden;"><a href="javascript:showDiv('bb-alerts-closed'); hideDiv('bb-alerts-open');"><img src="http://www.bookswelike.net/style/arrow-up-small.gif" border="0"><strong>Alerts</strong></a><div id="bloobot-alerts"><br><p class="bloobot-alert-text">this is <a class="bloobot-alert-link" href="http://www.mediaventure.org/bloobot/alert.html" target="_blank"> an alert test</a></p><p></p></div></div></div> <br><div id="bloobot-housekeeping"><p class="bloobot-text"><strong>To disable InterraBot, click the monkey</strong> at the bottom right of the browser.</p><p class="bloobot-text"><strong>To re-enable it when shopping, click the monkey</strong> again.</p><p class="bloobot-text">To uninstall it, <strong>use your browser menu Tools-Manage User Scripts</strong>, then uncheck "Enabled" or click "Uninstall"</p><p class="bloobot-text">To uninstall Greasemonkey, <strong>use your browser menu Tools-Extensions</strong>, select Greasemonkey, click "Uninstall"</p></div></td></tr></tbody></table></div></div></div></div></div>\n\n</div></html>
InterraBot is a simple addition to your browser (Firefox only currently), that recognizes [[hundreds of online retailers|supported merchant sites]] that give [["affiliate" commissions|http://en.wikipedia.org/wiki/Affiliate_marketing]], , and "handshakes" with them in the background so that any purchases you make will generate revenues for your chosen beneficiary. \n\nWhenever you surf to a merchant it knows about, a little InterraBot logo [img[http://www.mediaventure.org/bloobot/images/bloobot2-tiny.jpg]] [[appears in the upper left|example]], to let you know it's working. Clicking on it opens it up to let you change your beneficiary, get info on the merchant and product, etc. \n\nHere's [[how it looks and feels|example]] currently.\n\nWhen you choose a beneficiary, that determines the appropriate affiliate codes to use, depending on what retailer you're using. \n\nInterraBot automatically appends the code where it's needed so that any purchases you make get credited to your chosen beneficiary.\n\nEach retailer tracks all such purchases and gives the owner of the code a 4-10% (depending on the retailer) commission on each one, distributed quarterly.\n
Here is how sales have been credited to partners so far, as of May 15, 2006.\n\n<html><table ><tr><td width=80>Partner</td><td width = 80># units</td><td width = 80>total volume</td><td>commissions</td></tr><tr class="even"><td><a href="/alternet">Alternet</a></td><td>725 sold </td><td>$10593.71 </td><td> $741.65 </td></tr><tr class="odd"><td><a href="/bookswelike">Books We Like</a></td><td>591 sold </td><td>$8966.01 </td><td> $643.36 </td></tr><tr class="even"><td><a href="/bookswelike">50 Simple Things You Can Do to Fight the Right</a></td><td>29 sold </td><td>$332.02 </td><td> $21.66 </td></tr><tr class="odd"><td><a href="/washingtonmonthly">Washington Monthly</a></td><td>60 sold </td><td>$1177.26 </td><td> $78.80 </td></tr><tr class="even"><td><a href="/bookswelike">Books We Like</a></td><td>24 sold </td><td>$318.19 </td><td> $20.65 </td></tr><tr class="odd"><td><a href="/inthesetimes">In These Times</a></td><td>29 sold </td><td>$358.96 </td><td> $25.14 </td></tr><tr class="even"><td><a href="/witness">Witness</a></td><td>12 sold </td><td>$221.25 </td><td> $17.99 </td></tr><tr class="odd"><td><a href="/freespeechtv">Free Speech TV</a></td><td>17 sold </td><td>$318.46 </td><td> $27.99 </td></tr><tr class="even"><td><a href="/linktv">Link TV</a></td><td>5 sold </td><td>$251.26 </td><td> $19.45 </td></tr><tr class="odd"><td><a href="/bookswelike">Make Them Accountable</a></td><td>1 sold </td><td>$14.70 </td><td> $.96 </td></tr><tr class="even"><td><a href="/ellabakercenter">Ella Baker Center</a></td><td>2 sold </td><td>$30.04 </td><td> $1.80 </td></tr><tr class="odd"><td><a href="/coopamerica">Coopamerica</a></td><td>23 sold </td><td>$328.99 </td><td> $22.93 </td></tr><tr class="even"><td><a href="/greenmuseum">Green Museum</a></td><td>6 sold </td><td>$92.19 </td><td> $6.66 </td></tr><tr class="odd"><td><a href="/chaordic">Chaordic Commons</a></td><td>5 sold </td><td>$60.43 </td><td> $4.07 </td></tr><tr class="even"><td><a href="/bookswelike">National Synagogue</a></td><td>6 sold </td><td>$144.14 </td><td> $9.76 </td></tr><tr class="odd"><td><a href="/greenmap">Green Map System</a></td><td>5 sold </td><td>$234.91 </td><td> $18.94 </td></tr><tr class="even"><td><a href="/publicnewsservice">Public News Service</a></td><td>1 sold </td><td>$14.93 </td><td> $1.27 </td></tr><tr class="odd"><td><a href="/interra">Interra Project</a></td><td>1 sold </td><td>$11.67 </td><td> $.99 </td></tr><tr class="even"><td><a href="/organicconsumers">Organic Consumers Association</a></td><td>28 sold </td><td>$411.2655 </td><td> $25.992 </td></tr><tr class="odd"><td>Other</td><td>159 sold </td><td>$2330.5045 </td><td> $147.288 </td></tr><tr class="even"><td><strong>TOTALS</strong></td><td>1729 sold </td><td>$26210.89 </td><td> $1837.35 </td></tr></table></html>
InterraBot is easy to install, and requires no registration. It will get even easier in upcoming versions. \n\nIn its current prototype form, it runs only on ''Firefox 1.5 and up'', and is built on ''Greasemonkey'' (also from [[Mozilla|http://mozilla.org]]), which needs to be installed first. Both it and InterraBot are easy to install and uninstall.\n\n''Follow these simple instructions'' carefully and you'll have no problem. \n\n''1. First'', assuming your on Firefox 1.5, ''[[install Greasemonkey|http://greasemonkey.mozdev.org/]]''. It's fast and simple. \n\n''2. If it seems like nothing happens'', it's probably because you have pop-ups blocked. You'll need to allow them for the Greasemonkey installation, and re-click the "install Greasemonkey" link above.\n\n''3.'' You then need to ''restart Firefox''. \n\n<script>out = "''4. ";\nif (!document.partner) {\nout += " Choose your default beneficiary''"; \nif (document.new_partner) out += ", currently ''{{{" + document.new_partner + "}}}''. " ; \nelse out += ". "; \nout += "You can change it easily later."; \nout += "<<tiddler DrawBeneSelect>>"; \nout += "\sn5. ";\n}else {\nout= "''4. ''";\nout += " Your default beneficiary'' is ''{{{" + document.partner + "}}}''. ";\nout += "You can change it easily later."; \nout += "\sn\sn5. ";\n}\n\nreturn out;</script> Now ''<<tiddler FormInstallLink>>''. This should show up as Javascript code in your browser. Firefox should prompt you with an ''Install button in the upper right'', but if not, install it using its Tools menu, where there will be a new menu item to "Install User Script". Accept the default configuration and install.\n\n''That's it''. It should work on all the [[supported merchant sites]].\n\n!!!So, ''[[try it out]]'' .
InterraBot
We, like most people, value privacy and security highly. \n\nInterraBot is structured so we don't need to know any personal data about you. You don't need to register, and we thus can't contact you except through the InterraBot button under your control.\n\nNor does InterraBot communicate anything about your behavior to us or anyone. Communication with our server is minimal and almost entirely from us to you. Anyone who wishes to can confirm that because the code is exposed and viewable at <<tiddler FormInstallLink>>. \n\nThere are two infrequent times that your InterraBot sends information to our server:\n# The first time you use it, it sends a notice to our server that a new user is activated, identified by a [[unique ID|UniqueID]]. This allows us to reliably count the number of users (as opposed to just those who view the script), and to [[credit you for helping promote InterraBot|credits for spreading the word]].\n# Each time you initiate a session with a merchant that InterraBot recognizes, it handshakes with our server to know what to do. \nThat's it. \n\n
Here's what's been bought so far, using the partner and tracking system on which InterraBot is based. \n\nAmazon provides the best sales tracking, and highest volume of sales, by far. Powells is next best. \n\nInterraBot is aimed at increasing volume way beyond books, music, and DVDs. ''Note the serious commissions on electronics and lots of other products'' in the <html><a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/amazon-report.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;">Detailed Report</a></html>. \n\nWe will be improving our reporting for all other merchants as soon as possible.\n\n''Amazon''\n''[[Amazon Sales Summary]] | <html><a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/amazon-report-q206.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;">Current Quarter Detail (so far)</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/amazon-report-q106.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;">Q1 '06 Detail</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/amazon-report.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;">All Sales Detail</a></html>''\n\n\n''Powells''\n''<html><a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q206.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;">Powells Report Q2 '06</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q106.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;"> Q1 '06</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q405.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;"> Q4 '05</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q305.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;"> Q3 '05</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q205.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;"> Q2 '05</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q105.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;"> Q1 '05</a> | <a href="" onclick="test3=window.open('http://www.mediaventure.org/bloobot/powells-report-q404.html','test1','toolbar=no,location=no,directories=no,status=yes,menubar=no,titlebar=no,scrollbars=yes,resizable=yes,width=900,height=600'); test3.focus(); return false;"> Q4 '04</a>\n</html>''\n\n''Breakdown by Partner''\n<html><table ><tr><td width=80>Partner</td><td width = 80># units</td><td width = 80>total volume</td><td>commissions</td></tr><tr class="even"><td><a href="/alternet">Alternet</a></td><td>725 sold </td><td>$10593.71 </td><td> $741.65 </td></tr><tr class="odd"><td><a href="/bookswelike">Books We Like</a></td><td>591 sold </td><td>$8966.01 </td><td> $643.36 </td></tr><tr class="even"><td><a href="/bookswelike">50 Simple Things You Can Do to Fight the Right</a></td><td>29 sold </td><td>$332.02 </td><td> $21.66 </td></tr><tr class="odd"><td><a href="/washingtonmonthly">Washington Monthly</a></td><td>60 sold </td><td>$1177.26 </td><td> $78.80 </td></tr><tr class="even"><td><a href="/bookswelike">Books We Like</a></td><td>24 sold </td><td>$318.19 </td><td> $20.65 </td></tr><tr class="odd"><td><a href="/inthesetimes">In These Times</a></td><td>29 sold </td><td>$358.96 </td><td> $25.14 </td></tr><tr class="even"><td><a href="/witness">Witness</a></td><td>12 sold </td><td>$221.25 </td><td> $17.99 </td></tr><tr class="odd"><td><a href="/freespeechtv">Free Speech TV</a></td><td>17 sold </td><td>$318.46 </td><td> $27.99 </td></tr><tr class="even"><td><a href="/linktv">Link TV</a></td><td>5 sold </td><td>$251.26 </td><td> $19.45 </td></tr><tr class="odd"><td><a href="/bookswelike">Make Them Accountable</a></td><td>1 sold </td><td>$14.70 </td><td> $.96 </td></tr><tr class="even"><td><a href="/ellabakercenter">Ella Baker Center</a></td><td>2 sold </td><td>$30.04 </td><td> $1.80 </td></tr><tr class="odd"><td><a href="/coopamerica">Coopamerica</a></td><td>23 sold </td><td>$328.99 </td><td> $22.93 </td></tr><tr class="even"><td><a href="/greenmuseum">Green Museum</a></td><td>6 sold </td><td>$92.19 </td><td> $6.66 </td></tr><tr class="odd"><td><a href="/chaordic">Chaordic Commons</a></td><td>5 sold </td><td>$60.43 </td><td> $4.07 </td></tr><tr class="even"><td><a href="/bookswelike">National Synagogue</a></td><td>6 sold </td><td>$144.14 </td><td> $9.76 </td></tr><tr class="odd"><td><a href="/greenmap">Green Map System</a></td><td>5 sold </td><td>$234.91 </td><td> $18.94 </td></tr><tr class="even"><td><a href="/publicnewsservice">Public News Service</a></td><td>1 sold </td><td>$14.93 </td><td> $1.27 </td></tr><tr class="odd"><td><a href="/interra">Interra Project</a></td><td>1 sold </td><td>$11.67 </td><td> $.99 </td></tr><tr class="even"><td><a href="/organicconsumers">Organic Consumers Association</a></td><td>28 sold </td><td>$411.2655 </td><td> $25.992 </td></tr><tr class="odd"><td>Other</td><td>159 sold </td><td>$2330.5045 </td><td> $147.288 </td></tr><tr class="even"><td><strong>TOTALS</strong></td><td>1729 sold </td><td>$26210.89 </td><td> $1837.35 </td></tr></table></html>
''Currently works best on Amazon and Powells'', where it displays product-related information. \n\nWe have agreements with the following, and will be adding many more. Try it out on the ones with links.\n\nBooks - [[Amazon|http://www.amazon.com/gp/product/B000A3WS8O/sr=1-2/qid=1135549102/ref=pd_bbs_2/002-7197333-3186429?%5Fencoding=UTF8]], [[Powells|http://www.powells.com]], [[Barnes and Noble|http://www.barnesandnoble.com]], Abe Books, Booksense, Alibris and more\nGeneral shopping - Buy.com, Shop.com, Overstock.com\nFlowers - [[1800Flowers.com|http://www.1800flowers.com]]\nOutdoor - [[Eddie Bauer|http://www.eddiebaueroutlet.com]]\nElectronics - [[Sony Style|http://www.sonystyle.com]], Best Buy, [[CompUSA|http://www.compusa.com]]\nAuto - Toshiba, Enterprise Rental
Much has been made about the potential for citizens to ''"vote with their dollars"'', but the Internet has yet to empower that on a truly significant scale. \n\nInterraBot is a lightweight way for [[eco-social]] citizens to get started with their online purchases, and to carry that over to offline purchases through the [[Interra Project]]. \n\nWe want to help ''build serious [[eco-social]] market forces organically'', starting by growing a user base built on the single simple value that InterraBot provides. \n\nThat user base effectively becomes ''a collective'', which can create the ''demand for sustainable production, greater accountability, fair trade, etc.''\n\n''Step 1'' is for users to ''anonymously use a common "bot" to improve on their purchasing'' automatically, without changing their behavior. That's what InterraBot does.\n\n''Step 2'' is ''"analytics" about products and merchants''. Such a common bot can provide information automatically about the products and merchants the user is considering. InterraBot does this on a basic level, by referencing [[Buy Blue|http://www.buyblue.org/node/1673/view/summary]] and other merchant rating services (and eventually product rating)). It can and will get much better.\n\n''Step 3'' is for [[users to register|to register]] and allow the service to better ''customize the analytic information to their values and preferences'', so they can make much ''better-informed purchase decisions''. \n\nA large enough user community built on such simple uses can then become a ''significant force influencing corporate responsibility, advertising, etc.''
''The [[eco-social]] constituency spent hundreds of millions of dollars online'' last year, most of which could have generated commissions of 4-10%, but didn't. \n\nThat's a lot of money.\n\n''Every time you buy something'', you have the opportunity to fertilize your favorite cause automatically.\n\nInterraBot is here to make that easy.\n
We will be adding voluntary registration shortly so that we can provide additional services that require having a way to contact you. \n\nWe will be using [[YADIS|http://yadis.org/wiki/Main_Page]], built on the principles of [[Identity Commons|http://www.idcommons.net]] for that purpose.\n\nUntil then, anyone interested can send email to InterraBot-register at mediaventure.org. \n\nThanks\n
(This assumes you've already [[installed InterraBot|install it]]. If not, see this [[example]]).\n\nGo to any Amazon product page, like ''[[this one|http://www.amazon.com/gp/product/B0007NCMRO/sr=1-20/qid=1153937131/ref=sr_1_20/102-0737958-3454530?ie=UTF8&s=jewelry#]]'' or ''[[this one|http://www.amazon.com/gp/product/B000A3WS8O/sr=1-2/qid=1135549102/ref=pd_bbs_2/002-7197333-3186429?%5Fencoding=UTF8]]'' or browse around ''[[Barnes and Noble|http://www.barnesandnoble.com]]'' or ''[[Sony Style|http://www.sonystyle.com]]''. \n\nA little InterraBot logo [img[http://www.mediaventure.org/bloobot/images/bloobot2-tiny.jpg]] should show up in the upper left. Mouse over to open it up. Click on the links inside to see the approximate commission the current product would yield (Amazon only right now), like in this [[example]]. \n\nThe affiliate "handshaking" is done in the background so you probably won't notice it.
100% of the commission revenues collected using InterraBot go to independent media and [[eco-social]] non-profits.\n*50% goes to the beneficiary chosen by you, the purchaser\n*30% goes to a pool to be distributed by the users based on how they help spread the word (see UniqueID), and\n*20% to [[Media Venture Collective|http://www.mediaventure.org]], instigator of the system, to cover costs and fund other great stuff.\n\nWe try to focus on organizations that further progressive causes, primarily but not exclusively in the media and communications arena.\n\nThese include <html><strong><a href="http://alternet.org">Alternet</a></strong> <strong> | </strong> <strong><a href="http://www.bookswelike.net">Books We Like</a></strong> <strong> | </strong> <strong><a href="http://codepink4peace.org">Code Pink</a></strong> <strong> | </strong> <strong><a href="http://coopamerica.org">Coopamerica</a></strong> <strong> | </strong> <strong><a href="http://firedoglake.com">firedoglake</a></strong> <strong> | </strong> <strong><a href="http://fstv.org">Free Speech TV</a></strong> <strong> | </strong> <strong><a href="http://greenmap.org">Green Map System</a></strong> <strong> | </strong> <strong><a href="http://greenmuseum.org">Green Museum</a></strong> <strong> | </strong> <strong><a href="http://interraproject.org">Interra Project</a></strong> <strong> | </strong> <strong><a href="http://inthesetimes.org">In These Times</a></strong> <strong> | </strong> <strong><a href="http://organicconsumers.org">Organic Consumers Association</a></strong> <strong> | </strong> <strong><a href="http://publicnewsservice.org">Public News Service</a></strong> <strong> | </strong> <strong><a href="http://witness.org">Witness</a></strong> </html>\n\n<<tiddler DisplayCurrentBene>>\n\nWe will be adding more over time.\n\nIf you would like to suggest a beneficiary, send email to InterraBot at mediaventure dot org.