<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//}}}
<script>\nvar out = '<html><div><iframe src="http://www.rovr.org/bloobot/data/amazon-report-base.html" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></div></html>';\nreturn out;</script>
''<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="earningsReportSummary"><tr><td colspan="4" class="header"><div class="reportHeading"><h2 class="f10">Earnings Report Totals</h2><h3 class="f7">January 1, 2005 to February 13, 2007</h3><a class="f1" id="glossaryLink" href="http://affiliate-program.amazon.com/gp/associates/network/help/glossary/002-5599727-6194469" target="associates">Glossary</a></div></td></tr><tr><th class="left-border"/><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>2036</td><td>$33,802.59</td><td>$2,359.77</td></tr><tr><td class="text">Total Third Party Items Shipped</td><td>689</td><td>$7,774.19</td><td>$541.41</td></tr><tr class="bold"><td class="text">Total Items Shipped</td><td>2725</td><td>$41,576.78</td><td>$2,901.18</td></tr><tr class="bold"><td class="text">Total Items Returned</td><td>-16</td><td>-$700.05</td><td>-$44.30</td></tr><tr class="bold"><td class="text">Total Refunds</td><td>-18</td><td>-$172.53</td><td>-$12.01</td></tr><tr class="totals"><td class="text">TOTAL REFERRAL FEES</td><td>2691</td><td>$40,704.20</td><td>$2,844.87</td></tr></table></html>
<script>\nif (!XML_read) out = "<html><span id='bene-displayname'></span></html>" ;\nelse {\nout = "<html>";\nif (bene_in) out += Beneficiaries[bene_in.toLowerCase()].displayname ;\nelse out += Beneficiaries[document.bene.toLowerCase()].displayname;\nout += "</html>"\n}\nreturn out;\n</script>
[[Suggest a beneficiary|mailto:affiliates@interraproject.org?subject="Suggesting a beneficiary"]]<html><a href="beneficiaries@interraproject.org?subject="Suggesting a beneficiary"></html><script>var out = '<html><iframe id="merchants-frame" src="http://www.rovr.org/books/interra-beneficiaries-base.html?'+(new Date().getTime())+'" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></html>';\nreturn out;</script><script>place.lastChild.firstChild.style.height=window.innerHeight-320;</script>
[[Suggest a beneficiary|mailto:affiliates@interraproject.org?subject="Suggesting a beneficiary"]]<html><a href="beneficiaries@interraproject.org?subject="Suggesting a beneficiary"></html><script>\nvar out = '<html><div><iframe id="merchants-frame" src="http://www.rovr.org/books/interra-beneficiaries-base.html" width="99%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></div></html>';\nreturn out;</script>\n
<script>\nvar out = '<html><div><iframe src="interra/cj-report.html" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></div></html>';\nreturn out;</script>
config.options.chkTopOfPageMode = true;\nconfig.options.chkSinglePageMode = true;\nvar XML_read = false;\nvar Groups = ""; //append group names separated by | \nvar GroupFilter = "IndependentMedia";\n\nvar Beneficiaries = new Array();\nvar BeneLogos = new Array;\nvar numBenes = 0;\nvar BenesKounter = 0; //for cycling bene logos\nvar MerchantsKounter = 0; // for merchants\n\nfunction refresh_bene_tiddlers () {\n story.refreshTiddler('DisplayCurrentBene',null,true);\n story.refreshTiddler('install ROVR',null,true); \n story.refreshTiddler('select bene',null,true);\n story.refreshTiddler('Spread the word',null,true);\n story.refreshTiddler('about ROVR',null,true);\n story.refreshTiddler('beneLogos',null,true);\n }\n\nfunction swap_frames(one, two) {\n //\n//alert( "document.getElementById(" + one + " ).innerHTML = document.getElementById(" + two + ").contentDocument.body.innerHTML");\n//alert(document.getElementById("merchants-frame").contentDocument.body.innerHTML);\ndocument.getElementById(one).innerHTML = document.getElementById(two).contentDocument.body.innerHTML;\n//alert(document.getElementById("merchants-frame").contentDocument.body.innerHTML);\n}\n\n\n\nwindow.beneImgs = function (divname, imagefile)\n{\n var thediv = document.getElementById(divname);\n thediv.innerHTML = "<img src='" + imagefile + "'/>";\n var foo = setTimeout('BenesKounter+=1; if (BenesKounter>= numBenes) BenesKounter= 0; beneImgs("blogos",BeneLogos[BenesKounter] );',2000);\n}\n\nwindow.merchantImgs = function (divname, imagefile)\n{\n var thediv = document.getElementById(divname);\n thediv.innerHTML = "<img src='" + imagefile + "'/>";\n var foo = setTimeout('MerchantsKounter+=1; if (MerchantsKounter>= Merchants.length) MerchantsKounter= 0; merchantImgs("mlogos",Merchants[MerchantsKounter].MerchantLogo );',2000);\n}\n\nfunction installRovr(url)\n{\n var params = {\n "Rovr": {\n URL: url,\n toString: function () { return this.URL; }\n }\n };\n InstallTrigger.install(params);\n\n return false;\n}\n\nfunction gup( name ) // gets URL paramater\n{\n name = name.replace(/[\s[]/,"\s\s\s[").replace(/[\s]]/,"\s\s\s]");\n var regexS = "[\s\s?&]"+name+"=([^&#]*)";\n var regex = new RegExp( regexS );\n var results = regex.exec( window.location.href );\n if( results == null )\n return "";\n else\n return results[1];\n}\n\n\n\n\nvar bene_in = gup("bene");\nvar bene_in_nick = bene_in.toLowerCase();\n\nvar bene_chosen = "foo" ;\nvar bene_group_chosen;\n\ndocument.bene = gup("bene");\nif (document.bene == "") document.bene = "witness";\n\n//this stores the values of the bene installer form\n\nfunction walk_form(obj) {\n if (obj.childNodes) {\n for (var i = 0; i < obj.childNodes.length; ++i) {\n var cobj = obj.childNodes[i];\n //alert(cobj.name + " " + cobj.value);\n if (cobj.name == "bene") bene_chosen = cobj.value;\n if (cobj.name == "group") bene_group_chosen = cobj.value;\n }\n }\n}\n\nfunction Beneficiary(nickname, displayname, guidestar, ein, website, logo, groups) \n{ this.nickname = nickname;\n //this.matchstringname = matchstringname;\n //this.domainname = domainname;\n this.displayname = displayname;\n this.guidestar = guidestar;\n this.ein = ein;\n this.website = website;\n this.logo = logo;\n this.groups = groups;\n //alert("new bene: nick = " + nickname);\n}\n\n\nfunction importXML(file)\n{\n if (document.implementation && document.implementation.createDocument)\n {\n xmlDoc = document.implementation.createDocument("", "", null);\n xmlDoc.onload = notify_done;\n \n }\n else if (window.ActiveXObject)\n {\n xmlDoc = new ActiveXObject("Microsoft.XMLDOM");\n //alert(xmlDoc);\n xmlDoc.onreadystatechange = function () {\n if (xmlDoc.readyState == 4) notify_done();\n };\n }\n else\n {\n alert('Your browser can\s't handle this script');\n return;\n }\n //alert("loading" + file);\n xmlDoc.load(file);\n}\n\n\nfunction notify_done() {\n XML_read = true;\n//alert("notify" + XML_read);\n}\n\n//requesting a page from a remote location\nfunction requestDocument(URL) \n{\nvar oXML=new XMLHttpRequest();\noXML.open("GET",URL,false);\noXML.send(null);\n//Returning the document content to the XML parser function\nreturn oXML; \n}\nfunction writeDebug(text) {\n var div = document.getElementById('bb-debug');\n if (div) {\n var cur = div.innerHTML;\n div.innerHTML = cur + text + "<br>";\n }\n}\n\nfunction getAccountField (obj, fieldname) {\n value = obj.getElementsByTagName(fieldname);\n if (!value) return false;\n if (value[0]) {\n cntnts = value[0].textContent; // Firefox\n if (!cntnts) cntnts = value[0].text; // IE\n value = cntnts;\n }\n else value=" ";\n if (!value || value.length <1 || value == "<none>") value=" ";\n return value;\n}\n\nfunction Salesforce_Acct(obj) { \n fls = "Account_Name|Tax_ID|Guidestar|BuyBlue|MerchantCategory|ROVR_Beneficiary_Groups|Website|MerchantLogo|Logo|MerchantLink|";\n fld_array = fls.split("|");\n for (var m=0; m<fld_array.length; m++) {\n var foo = fld_array[m];\n //alert(foo);\n this[foo] = getAccountField(obj, foo);\n }\n //alert(this.Account_Name);\n this.Nickname = this.Account_Name.toLowerCase().replace(/ /g, "");\n \n this.Type = "merchant";\n \n if (this.ROVR_Beneficiary_Groups) {\n this.ROVR_Beneficiary_Groups = this.ROVR_Beneficiary_Groups.replace(/ /g, "");\n this.Type = "beneficiary";\n var install_buttons = "";\n var gps = this.ROVR_Beneficiary_Groups.split(";");\n if (gps.length <= 0) {\n } else {\n for (var j=0; j<gps.length; j++) {\n if (gps[j].replace("none","").length >2 ) {\n var maker = 'http://www.rovr.org/installer/rovr/install.php?bene=' + this.Nickname + '&group=' + gps[j] ;\n var installer = '<a href="#" onclick="return installRovr(\s'http://www.rovr.org/installer/rovr/INSTALL/' + this.Nickname + "_" + gps[j] + '.xpi\s');">INSTALL ' + this.Nickname + ' ' + gps[j] + '</a><br>';\n\n install_buttons += '<a href="' + maker + '">MAKE INSTALLER ' + this.Nickname + ' ' + gps[j] + '</a><br>' +installer;\n }\n }\n this.InstallButtons = install_buttons;\n \n }\n }\n\n \n if (this.Website) {\n var value = this.Website.replace(/http:\s/\s//,"");\n value = value.replace(/www./, "");\n //stored minus "http://www."\n this.Website = "http://www." + value;\n }\n\n if (!this.Logo) this.Logo = this.MerchantLogo;\n\n if (this.MerchantLink) {\n //Merchants have special link that creates a commission session. Use it for the linked name, and extract the URL from it as the Website\n this.LinkedName = this.MerchantLink; // link with name and affiliate code embedded\n \n //extract the url from the link string, for later use\n\n //var regexp=/(https:\s/\s/|http:\s/\s/|ftp:\s/\s/|www.)([^"]*)/gi ;\n //if (this_url && this_url[0]) this.Website = this_url[0];\n var this_url = this.MerchantLink.match( /href="([^"]+)"/ );\n if (!this_url && this.MerchantLink.indexOf("http://") == 0) this.Website = this.MerchantLink;\n else if (this_url) {\n this.Website = this_url[1];\n //determine which aggregator\n this_url = this.Website;\n if (this_url.indexOf("linksynergy") >= 0) this.Aggregator = "Linkshare"; \n // append beneficiary if Commission Junction\n else if (this_url.indexOf("click-2371852") >= 0 || this_url.indexOf("click-1560332") >= 0) this.Aggregator = "Commission Junction";\n // Performics\n else if (this_url.indexOf("clickserve") >= 0 ) this.Aggregator = "Performics"; \n else if (this_url.indexOf("powells.com") >= 0 ) this.Aggregator = "Powells"; \n else if (this_url.indexOf("amazon.com") >= 0 ) this.Aggregator = "Amazon"; \n }\n //alert("interra-merchants-min: which = " + which + " | " + Merchants[which].Nickname + " | " + this_url);\n\n \n var linkimg = this.MerchantLink.match( /src="([^"]+)"/ );\n //if (domainname.indexOf("800") >=0) alert("fetch: " + linkimg[1] );\n if (linkimg && linkimg[1] && linkimg[1].length > 0) this.LinkImg = linkimg[1]; \n \n\n }\n \n this.LinkedName = '<a href="' + this.Website + '" target="_blank">' + this.Account_Name + '</a>';\n this.LinkedLogo = '<div style="visibility: hidden; display: none;">' + this.Account_Name + '</div><a href="' + this.Website + '" target="_blank"><img src="' + this.MerchantLogo + '" border=0/></a>';\n \n if (this.Tax_ID) this.Tax_ID = '<a href="http://www.guidestar.org/pqShowGsReport.do?partner=networkforgood&ein=' + this.Tax_ID + '" target="_blank">' + this.Tax_ID +'</a>';\n\n this.BuyBlue = '<a href="http://www.buyblue.org/node/' + this.BuyBlue + '/view/summary" target="_blank">' + this.BuyBlue +'</a>';\n\n\n \n}\n\nvar numMerchants ;\nvar Merchants = new Array;\n\nfunction cycleMerchants() {\n//alert("cycleMerchants " + XML_read);\nif (XML_read) { // file has been loaded\n clearInterval(waiting2);\n var merchs = xmlDoc.getElementsByTagName('row');\n var out2 = "";\n //get the basic stuff\n numMerchants =merchs.length;\n for (i=0; i<numMerchants; i++) {\n Merchants[i] = new Salesforce_Acct(merchs[i]);\n }\n //alert("cycleMerchants " + numMerchants);\n merchantImgs("mlogos",Merchants[0].MerchantLogo );\n }\n}\n\n\nvar Benes = new Array;\n\nfunction mainBody(container) {\n\n if (XML_read) { // file has been loaded\n clearInterval(waiting_for_XML);\n var benes_in = xmlDoc.getElementsByTagName('row');\n var out2 = "";\n //get the basic stuff\n numBenes=benes_in.length;\n\n for (i=0; i<numBenes; i++) {\n obj = benes_in[i];\n Benes[i] = new Salesforce_Acct(obj);\n var displayname = Benes[i].Account_Name;\n var nickname = Benes[i].Nickname;\n var guidestar = Benes[i].Guidestar;\n var ein = Benes[i].EIN;\n var website = Benes[i].Website;\n var logo = Benes[i].MerchantLogo;\n BeneLogos[i] = logo;\n var groups = Benes[i].ROVR_Beneficiary_Groups;\n Beneficiaries[nickname] = new Beneficiary(nickname, displayname, guidestar, ein, website, logo, groups) ;\n var gps = groups.split(";");\n if (gps.length <= 0) {\n } else {\n for (var j=0; j<gps.length; j++) {\n var thisn = gps[j];\n thisn = thisn.replace(/ /g, "");\n if (thisn != "none" ) {\n var maker = 'http://www.rovr.org/installer/rovr/install.php?bene=' + nickname +'&group=' + thisn; \n if (Groups.indexOf(thisn+"|") < 0) { Groups += thisn+"|"; }\n }\n }\n \n }\n\n }\n\n if ( bene_in && !Beneficiaries[bene_in] ) {\n bene_in = "";\n if (!Beneficiaries[document.bene] ) document.bene = "witness";\n refresh_bene_tiddlers();\n }\n \n\n\n if (bene_in) document.getElementById("bene-displayname").innerHTML = Beneficiaries[bene_in.toLowerCase()].displayname;\n\n\n beneImgs("blogos",BeneLogos[0] );\n refresh_bene_tiddlers();\n\n\n clearInterval(waiting_for_XML);\n //read the Merchants XML file\n XML_read= false;\n importXML("interra/salesforce-merchants.xml?"+ (new Date().getTime())); \n //process it when it's read and stuff it in the merchants table.\n waiting2 =setInterval("cycleMerchants()", 500);\n\n }\n}\n\n//read the XML file\nimportXML("interra/all-benes.xml?"+ (new Date().getTime())); \n//process it when it's read and stuff it in the merchants table.\nvar waiting_for_XML =setInterval("mainBody('fillme')", 100);\n\nvar waiting2 ; // for second read
[[ROVR is ...]]
<script>\nvar pard = document.partner;\nif (document.bene) pard = document.bene;\nif (pard && Beneficiaries[pard]) return "\sn\snThe current default beneficiary is ''{{{" + Beneficiaries[pard].displayname +"}}}''.";\n</script>
<html><form>\n<select name="beneficiary" onchange="document.bene = this.value; story.refreshTiddler('install ROVR',null,true);story.refreshTiddler('DisplayCurrentBene',null,true);story.refreshTiddler('where the $ goes',null,true); story.refreshTiddler('about ROVR',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>
''Select the following text and paste it into your email signature.''\nIn Outlook, you do that under Tools - Options - Signatures<script>\nout = "";\nout+= '\sn{{{\sn'\nout+= "Unleash ROVR to fetch for ";\n\nif (bene_in) out += Beneficiaries[bene_in.toLowerCase()].displayname ;\nelse out += Beneficiaries[document.bene.toLowerCase()].displayname;\n\nout+= ", ";\nout+= ' http://www.rovr.org/?bene=' + document.bene ;\nout+= '\sn}}}\sn';\n\n\nreturn out;\n</script>\nback to [[Spread the word]]\n\n\n
<<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 all </a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n changes </a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n opened </a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n filter </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 – </a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n + </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 ROVR|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 all </a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n added </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 changes </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 differences </a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n filter </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 – </a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n + </a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n = </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 \s\n<input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags \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
ROVR is easy to install, and requires no registration. \n\nCurrently, it runs only on ''Firefox 1.5 and up''. The IE version will be coming soon.\n\n\n\n''Click "Adopt ROVR" below'' and follow the instructions, then ''Restart Firefox''.\n\nFrom then on, ROVR will appear in the upper left whenever you visit one of the [[merchants|http://www.rovr.org/books/interra-merchants.html]] we support.\n\n''You may get a warning the first time you click'' the button, at the top of the browser. \n''Click ALLOW'' when prompted, then ''re-click the Adopt! button''.\n\n<html>\n <form method="get" action="http://www.rovr.org/v0/rovr.xpi">\n <input type="button" onclick="return installRovr('http://www.rovr.org/v0/rovr-free.xpi')" \nvalue="Adopt ROVR for Freecycle" /><br> \n </form>\n</html>\n''Don't forget to restart your browser.''
''[[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
<script>\nvar foo = new Date();\nvar r = new Date(2000, 1, 1);\nvar bar = r.getTime();\nfoo.setTime(bar);\n//alert (foo);\n\nalert(window.innerHeight);\n</script>\n
<script>\nvar out = '<html><div><iframe src="interra/linkshare-report.html" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></div></html>';\nreturn out;</script>
''Copy the code below the logo over your choice, and put it anywhere you like.''\n<script>if (!bene_in) out= "The links are specific to the beneficiary you have chosen."; return out; </script>\nback to [[Spread the word]]\n\n<script>\nout = "";\nout += '<html><a class="image" href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank"><img src="http://www.rovr.org/images/rovr-trans-90b.png" border=0/></a></html> ';\nout+= "\sn{{{\sn";\nout+= '<a href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank">\sn';\nout+= '<img src="http://www.rovr.org/images/rovr-trans-90b.png" border=0/></a>\sn';\nout+= "}}}\sn";\n\n\nout += '<html><a class="image" href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank"><img src="http://rovr.org/images/rovr-ball-40.jpg" border=0/></a> </html>';\n\n\nout+= "\sn{{{\sn";\nout+= '<a href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank">\sn';\nout+= '<img src="http://rovr.org/images/rovr-ball-40.jpg" border=0/></a>\sn';\nout+= "}}}\sn";\n\n\nout += '<html><a class="image" href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank"><img src="http://rovr.org/images/rovr-scriptek-48.png" border=0/></a> </html>';\n\n\nout+= "\sn{{{\sn";\nout+= '<a href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank">\sn';\nout+= '<img src="http://rovr.org/images/rovr-scriptek-48.png" border=0/></a>\sn';\nout+= "}}}\sn";\n\n\n\nout += '<html><a class="image" href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank"><img src="http://rovr.org/images/rovr-scriptek-36.png" border=0/></a> </html>';\n\n\nout+= "\sn{{{\sn";\nout+= '<a href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank">\sn';\nout+= '<img src="http://rovr.org/images/rovr-scriptek-36.png" border=0/></a>\sn';\nout+= "}}}\sn";\n\n\n\nout += '<html><a class="image" href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank"><img src="http://rovr.org/images/rovr-scriptek-24.png" border=0/></a> </html>';\n\n\nout+= "\sn{{{\sn";\nout+= '<a href="http://www.rovr.org/?bene=' + document.bene + '" target = "_blank">\sn';\nout+= '<img src="http://rovr.org/images/rovr-scriptek-24.png" border=0/></a>\sn';\nout+= "}}}\sn";\n\nreturn out;\n</script>\nback to [[Spread the word]]\n
[[about ROVR|ROVR is ...]] [[Install it|install ROVR]] [[Example|example]] [[Merchants]] [[Beneficiaries]] [[Sales|sales so far]] [[Spread the word]] [[Our Partners|http://www.interraproject.org/about-us/partners/]] [[Privacy|privacy]] [[Interra Project]] \n\n\n<html><a class="image" href="http://www.interraproject.org" target="_blank" style="text-decoration: none;"><img src="http://interraproject.org/images/interra-logo-new-small.jpg" border=0/></html>\n\n~~website powered by [[TiddlyWiki|http://www.tiddlywiki.com]]~~
More being added all the time. [[Suggest one|mailto:affiliates@interraproject.org?subject=Suggesting a merchant&body=Send us the URL of any merchant you'd like us to add.]]<script>var out = '<html><iframe id="merchants-frame" src="http://www.rovr.org/books/interra-merchants-base.html?'+(new Date().getTime())+'" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></html>';\nreturn out;</script><script>place.lastChild.firstChild.style.height=window.innerHeight-320;</script>
\n!![[Merchants|http://rovr.org/books/interra-merchants.html]]\n\n!![[Beneficiaries|http://rovr.org/books/interra-beneficiaries.html]]
More being added all the time. [[Suggest one|mailto:affiliates@interraproject.org?subject=Suggesting a merchant&body=Send us the URL of any merchant you'd like us to add.]]<script>\nvar out = '<html><div><iframe id="merchants-frame" src="books/interra-merchants-base.html" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></div></html>';\nreturn out;</script>
<<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>>\n
replace "current" with "new" in this doc in a text editor\ncopy current.css to new.css\nchange download-current-script.php to download-new-script.php in tiddler Install ROVR\ncopy current.user.js to new.user.js\nedit download-new-script.php to reference new.user.js\ncopy fill-current-button.php to fill-new-button.php\nmake mediaventure.org/new and copy index.html from /current \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\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n\n<div id='sidebar'>\n<div id='ml2' refresh='content' tiddler='merchantLogos'></div>\n<div id='bl2' refresh='content' tiddler='beneLogos'></div>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n</div>
<script>\nvar out = '<html><div><iframe src="interra/powells-report-base.html" width="95%" height=' + (window.innerHeight -230) + ' frameborder=0></iframe></div></html>';\nreturn out;</script>
[[about ROVR]]
!!frequent buyer dollars for your favorite non-profits.\n\n\n''ROVR is very simple''. ''Every $100 you spend online at [[ROVR-recognized merchants|Merchants]], yields $4-10'' for your chosen [[beneficiary non-profit|Beneficiaries]], with ''no registration or extra cost or change in your behavior required.'' \n\nWe call it ''checkout activism'', and ROVR is here to make it easy. \n!!![[Install it now!|install ROVR]]\n\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 4-10% of that could be going to great causes.'' That's a lot of money.\n\nHere's [[how it works]], and '' [[how it looks|example]]''.\n\n!!!Merchants\n ''[[Let us know|mailto:affiliates@interraproject.org?subject=Suggesting a merchant&body=Send us the URL of any merchant you'd like us to add.]] if you'd like to be added.''\n\n!!!Beneficiaries\n ''[[Let us know |mailto:affiliates@interraproject.org?subject="Suggesting a beneficiary"]] if you'd like to be eligible.''\n\n!!!Citizens\n'' <script>\n//alert(Beneficiaries[bene_in.toLowerCase()].displayname);\nif (bene_in) out = "Buy less, buy local, but online, support <<tiddler BeneDisplayName>> with every purchase, ";\nelse out = "Buy less, buy local, but online, make every purchase count, ";\nout += "by [[installing ROVR!|install ROVR]]";\nreturn out;\n//" + Beneficiaries[bene_in.toLowerCase()].displayname + "\n </script>''\n\n\nSo what are you waiting for? \n\n!![[Install ROVR!|install ROVR]]\n\n\nROVR is an initiative of the ''[[Interra Project]]'', and ''100% of revenues'' go to non-profits (80% controlled by you, 20% to Interra). <<tiddler DisplayCurrentBene>>\n\n\n\n
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}\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[images/rovr-trans-90b.png]] \n ''Buy less, buy local. But online, make every purchase count''
[img[http://www.rovr.org/images/unleash-rockwell-36.png]] [img[http://www.rovr.org/images/rovr-scriptek-48.png]]
\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"> </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 = ' ↑';\n newRows.reverse();\n span.setAttribute('sortdir','up');\n } else {\n ARROW = ' ↓';\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 = ' ';\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
Use these tools to help get lots of ROVRs out there fetching for <script>\nif (bene_in) out = "''<<tiddler BeneDisplayName>> ''";\nelse out = "your favorite cause";\nout += "."\nif (bene_in) out += "\snC";\nelse out += " \sn\snChoose which beneficiary you want as the default, then c";\nout += "opy the code supplied to put a ROVR link on your webpage or in your email.";\n\nif (!bene_in) {\n out += "\sn\snChoose category: <<tiddler [[select group]]>>"; \n out += "Choose beneficiary ''<<tiddler [[select bene]]>>";\n}\nreturn out;\n</script>\n!![[Logos]][img[images/rovr-trans-90b.png][Logos]][img[images/rovr-ball-40.jpg][Logos]][img[images/rovr-scriptek-48.png][Logos]][img[images/rovr-scriptek-36.png][Logos]][img[images/rovr-scriptek-24.png][Logos]]\n\n\n\n!![[Email Signatures]]\n\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 {font-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;\nmargin-right: 165px;\nmargin-right: 10px;\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\n\n#tiddlerDisplay {width: 500px;float: left; clear: all;}\n#sidebar {float: left; margin-left: 10px;}\n#displayArea {width: 1000px; font-family:arial;}\n\n\n\n\n.header {background: #AFBD51 url(images/green-grad.gif) repeat-x; color: green;}\n\n#mainMenu a.externalLink {text-decoration: none}\n\n[[StylesheetInterraBot]]\n#bb-example {\nbackground: url(images/amazon-diamond3.gif);\nbackground-repeat: no-repeat;\nwidth: 650px; \nmin-width: 400px; \nmin-height: 300px; \n}\n.viewer table {border: 0px}\n[[StylesheetROVR]]\nh2 a.tiddlyLink {color: #0678b4; color: #76016D; color:#0044BB}\nh2 a.tiddlyLink:hover {background: #eee; text-decoration: underline;}\nh1, h2, h3 {background: #dadada; font-family: 'trebuchet ms'; padding-right: 5px;}\n\n#mainMenu { width: 11.5em; }\n#displayArea {margin-left: 145px; margin-top: 0px;}\n#tiddlerDisplay {padding-top: 0px; margin-top: 0px; width: 570px;}\n\n.siteSubtitle {font-family:arial, verdana, 'trebuchet ms'; font-size: 17px;}\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\n\n/*}}}*/
/***\n!Sections in this Tiddler:\n*Generic rules\n**Links styles\n**Link Exceptions\n*Header\n*Main menu\n*Sidebar\n**Sidebar options\n**Sidebar tabs\n*Message area\n*Popup\n*Tabs\n*Tiddler display\n**Viewer\n**Editor\n*Misc. rules\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n position: relative;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n/*}}}*/\n/***\n''General Link Styles'' /%-----------------------------------------------------------------------------%/\n***/\n/*{{{*/\n.externalLink {\n text-decoration: underline;\n}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n/*}}}*/\n/***\n''Exceptions to common link styles'' /%------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n/*}}}*/\n/***\n!Main menu /%==================================================%/\n***/\n/*{{{*/\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n/*}}}*/\n/***\n!Sidebar rules /%==================================================%/\n***/\n/*{{{*/\n#sidebar {\n /* position: absolute;\n right: 3px; */\n width: 16em;\n font-size: .9em;\n}\n/*}}}*/\n/***\n''Sidebar options'' /%----------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n/*}}}*/\n/***\n''Sidebar tabs'' /%-------------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n/*}}}*/\n/***\n!Message area /%==================================================%/\n***/\n/*{{{*/\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n/*}}}*/\n/***\n!Popup /%==================================================%/\n***/\n/*{{{*/\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n/*}}}*/\n/***\n!Tabs /%==================================================%/\n***/\n/*{{{*/\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n/*}}}*/\n/***\n!Tiddler display rules /%==================================================%/\n***/\n/*{{{*/\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n/* I'm not a fan of how button looks in tiddlers... */\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n/*}}}*/\n/***\n!Misc rules /%==================================================%/\n***/\n/*{{{*/\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
#bloobot {\nposition: absolute;\nbackground: #AFBD51 url(images/green-grad.gif) repeat-x; /* #E3F275 #C7D762 */\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: 0px; \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;\nfont-size: 13px; font-weight: medium;\n}\n\n#bloobot a.bloobot-link {\nfont-size: 11px; color: #049;\nfont-size: 14px ; font-family: 'Trebuchet MS' ;\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\nh2 a.tiddlyLink {color: #009900; }\nh2 {display: inline; background: #E2F175; border: 1px solid grey; line-height: 30px; }\nh2 .externalLink {text-decoration: none; color: #009900; }\nh2 a.tiddlyLink {color: #0678b4;}\n\nh3 {display: inline; line-height:30px;}\n\na.image:hover , #mainMenu a.image:hover {background: none; border: }
/***\nPlace your custom CSS here\n***/\n/*{{{*/\n\n#bloobot {\nposition: absolute;\nz-index: 1000;\nfont-family: verdana, arial, sans-serif;\nfont-size: 1px;\ntext-align: left;\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#bb-logo-open {\n background: #8FB347 url(/images/green-grad.gif) repeat-x; /* #E3F275 #C7D762 #AFBD51*/\n}\n\n#bloobot-open-container table , #bloobot-open-container tr, #bloobot-open-container td {\nmargin: 0px;\npadding: 0px;\nborder: 0px;\nfont-size: 11px;\nbackground: none;\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 , .bloobot-white-box p {\nmargin: 2px 0 1px 0;\ncolor: #333; \nfont-size: 11px;\nfont-size: 11.5px; font-weight: medium;\npadding: 4px;\n}\n.bloobot-white-box a { font-size: 13px; font-weight: medium; }\n\n#bloobot a.bloobot-link {\nfont-size: 11px; color: #049;\nfont-size: 14px ; font-family: 'Trebuchet MS' ;\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, .bloobot-white-box{\nbackground: #f8f8f8;;\nborder: 1px solid grey;\nmargin: 10px;\npadding: 3px;\n}\n\n\n\n.bb-toggle-window {\nbackground : white;\n/*margin: 5px;\npadding: 3px;\nborder: 1px solid #666;*/\nfloat: left;\nwidth: 100%;\n}\n\n#bb-tabs li {list-style-type: none; display: inline; background: #EAEAEA; padding: 5px; border: 1px solid grey; margin-left: 5px;}\n\n#bb-tab-row a { padding: 5px; background: #E6F786; color: #045C8C ; margin-left: 5px; border: 0px solid grey; padding-bottom: 0px;}\n\n#bb-tab-row a:focus { outline: none;}\n#bb-tab-row a:hover {background: white !important; color: #513601;}\n\n#bb-tabs { margin-left: 10px; margin-right: 10px; }\n#bb-tab1 { margin-left: 40px !important; }\n\n#bb-tabs {margin-top: 10px; margin-bottom: 5px;}\n#bb-footer {margin: 10px; }\n\n#bb-handshake { \nvisibility: visible; display: block;width: 1px; height: 1px; border: 0px;}\nbody {\nfont-family: arial, verdana, sans-serif;\nfont-size: 11px;\n}\n\nh3 { font-size: 13px; }\nh2 { font-size: 14px; }\n\n.account-table, .sortable {\nmin-width: 300px;\nmargin: 10px;\nbackground: #888;\nwidth: auto;\n}\n\n#totals, #totals td { font-size: 12px; }\n\n.account-table td , .sortable td{\n/* background: white; */\nborder-top: 1px solid grey;\nfont-family: arial;\nfont-size:12px;\npadding: 8px;\n}\n.account-table th , .general-table th, .sortable th, #results-list th{\ncolor: #770033;\nbackground: #B7CE6B; /* #CDD655; */\nfont-size: 14px;\n}\n\na { text-decoration: none;} /* color: #000055 ; */\na:hover {color: #009900;}\n th a {color: #333; text-decoration: none; }\n\n/* search-results */\n/* search results list */\n#results-list { background: #ffe;\nborder: 1px solid grey;\nfont-size: 13px;\n}\n#results-list li {\ndisplay: block;\npadding: 2px;\nmargin: 0px;\nfont-size: 13px;\n}\n#results-list a {\ntext-decoration: none;\nborder: none;\npadding: 0px;\ncolor: #550022;\n}\n#results-list a:hover {\nbackground: #FCB134;\n}\n#results-list a:visited { color: #8D3A25 ; }\n\n\n.general-table td, .general-table td a {\nfont-size: 11px;\n}\n\ntr.evenrow{ background:#EDECE0; padding-left: 5px;}\ntr.oddrow { background: #fff; padding-left: 5px;}\n\n\ntable.borderless td , table.borderless tbody, table.borderless tr { border: 0px ;}\n/*}}}*/
http://www.internetretailer.com/top300/top300sheet.htm\nhttp://www.foreseeresults.com/Form_Top100Retail_May07.html\nhttp://blogs.zdnet.com/ITFacts/?p=12243\n[[top 100 corp citizens|http://www.thecro.com/files/100BestGatefold.pdf]]\n[[from Seventh Generation|http://www.seventhgen.com/our_products/find_store.php]]\n[[Human Rights Campaign corporate ratings|http://www.hrc.org/cei_press/scores_by_name.pdf]]\n[[CorpKnowPedia|http://corpknowpedia.org/wiki/index.php/List_of_companies_traded_at_NASDAQ]]\n[[Knowmore|http://knowmore.org]]\n[[Consumerium|http://consumerium.org/]]\n\n\n<html><table>\n<tbody><tr>\n<td style="color: rgb(255, 255, 255); background-color: rgb(0, 128, 0);" colspan="5">Online retailer customer satisfaction over holiday season</td>\n</tr>\n<tr>\n<td style="color: rgb(255, 255, 255); background-color: rgb(0, 0, 128);">Retailer</td>\n<td style="color: rgb(255, 255, 255); background-color: rgb(0, 0, 128);">2006</td>\n<td style="color: rgb(255, 255, 255); background-color: rgb(0, 0, 128);">2005</td>\n<td style="color: rgb(255, 255, 255); background-color: rgb(0, 0, 128);">Growth</td>\n<td style="color: rgb(255, 255, 255); background-color: rgb(0, 0, 128);">Sales Rank</td>\n</tr>\n\n<tr>\n<td>Netflix.com </td>\n<td>86</td>\n<td>84</td>\n<td>2.4%</td>\n<td>19</td>\n</tr>\n<tr>\n<td>Amazon.com </td>\n<td>84</td>\n\n<td>82</td>\n<td>2.4%</td>\n<td>1</td>\n</tr>\n<tr>\n<td>LLBean.com </td>\n<td>80</td>\n<td>80</td>\n<td>0.0%</td>\n<td>21</td>\n\n</tr>\n<tr>\n<td>QVC.com </td>\n<td>80</td>\n<td>80</td>\n<td>0.0%</td>\n<td>15</td>\n</tr>\n<tr>\n<td>Apple.com </td>\n<td>79</td>\n\n<td>76</td>\n<td>3.9%</td>\n<td>13</td>\n</tr>\n<tr>\n<td>OldNavy.com </td>\n<td>79</td>\n<td>74</td>\n<td>6.8%</td>\n<td>See Gap</td>\n\n</tr>\n<tr>\n<td>Quixtar.com </td>\n<td>79</td>\n<td>76</td>\n<td>3.9%</td>\n<td>18</td>\n</tr>\n<tr>\n<td>HPShopping.com </td>\n<td>78</td>\n\n<td>74</td>\n<td>5.4%</td>\n<td>5</td>\n</tr>\n<tr>\n<td>Newegg.com </td>\n<td>78</td>\n<td>79</td>\n<td>-1.3%</td>\n<td>9</td>\n\n</tr>\n<tr>\n<td>BN.com </td>\n<td>77</td>\n<td>77</td>\n<td>0.0%</td>\n<td>28</td>\n</tr>\n<tr>\n<td>Dell.com </td>\n<td>77</td>\n\n<td>74</td>\n<td>4.1%</td>\n<td>4</td>\n</tr>\n<tr>\n<td>Williams-Sonoma.com </td>\n<td>77</td>\n<td>77</td>\n<td>0.0%</td>\n<td>20</td>\n\n</tr>\n<tr>\n<td>Avon.com </td>\n<td>76</td>\n<td>75</td>\n<td>1.3%</td>\n<td>24</td>\n</tr>\n<tr>\n<td>Chadwicks.com </td>\n<td>76</td>\n\n<td>73</td>\n<td>4.1%</td>\n<td>26</td>\n</tr>\n<tr>\n<td>JCPenney.com </td>\n<td>76</td>\n<td>71</td>\n<td>7.0%</td>\n<td>12</td>\n\n</tr>\n<tr>\n<td>TigerDirect.com </td>\n<td>76</td>\n<td>77</td>\n<td>-1.3%</td>\n<td>31</td>\n</tr>\n<tr>\n<td>HSN.com </td>\n<td>75</td>\n\n<td>75</td>\n<td>0.0%</td>\n<td>22</td>\n</tr>\n<tr>\n<td>Zappos.com</td>\n<td>75</td>\n<td>N/A</td>\n<td>N/A</td>\n<td>32</td>\n\n</tr>\n<tr>\n<td>1800Flowers.com </td>\n<td>74</td>\n<td>75</td>\n<td>-1.3%</td>\n<td>34</td>\n</tr>\n<tr>\n<td>CircuitCity.com </td>\n<td>74</td>\n\n<td>71</td>\n<td>4.2%</td>\n<td>16</td>\n</tr>\n<tr>\n<td>Gap.com </td>\n<td>74</td>\n<td>73</td>\n<td>1.4%</td>\n<td>23</td>\n\n</tr>\n<tr>\n<td>Nordstrom.com</td>\n<td>74</td>\n<td>N/A</td>\n<td>N/A</td>\n<td>40</td>\n</tr>\n<tr>\n<td>Target.com </td>\n<td>74</td>\n\n<td>70</td>\n<td>5.7%</td>\n<td>14</td>\n</tr>\n<tr>\n<td>BananaRepublic.com </td>\n<td>73</td>\n<td>73</td>\n<td>0.0%</td>\n<td> </td>\n\n</tr>\n<tr>\n<td>BestBuy.com </td>\n<td>73</td>\n<td>72</td>\n<td>1.4%</td>\n<td>10</td>\n</tr>\n<tr>\n<td>Drugstore.com </td>\n<td>73</td>\n\n<td>76</td>\n<td>-3.9%</td>\n<td>30</td>\n</tr>\n<tr>\n<td>NeimanMarcus.com </td>\n<td>73</td>\n<td>72</td>\n<td>1.4%</td>\n<td>37</td>\n\n</tr>\n<tr>\n<td>OfficeDepot.com </td>\n<td>73</td>\n<td>72</td>\n<td>1.4%</td>\n<td>2</td>\n</tr>\n<tr>\n<td>PotteryBarn.com </td>\n<td>73</td>\n\n<td>76</td>\n<td>-3.9%</td>\n<td> </td>\n</tr>\n<tr>\n<td>Sears.com </td>\n<td>73</td>\n<td>68</td>\n<td>7.4%</td>\n<td>6</td>\n\n</tr>\n<tr>\n<td>SonyStyle.com </td>\n<td>73</td>\n<td>69</td>\n<td>5.8%</td>\n<td>8</td>\n</tr>\n<tr>\n<td>Staples.com </td>\n<td>73</td>\n\n<td>71</td>\n<td>2.8%</td>\n<td>3</td>\n</tr>\n<tr>\n<td>Walmart.com </td>\n<td>73</td>\n<td>73</td>\n<td>0.0%</td>\n<td>11</td>\n\n</tr>\n<tr>\n<td>Buy.com </td>\n<td>72</td>\n<td>72</td>\n<td>0.0%</td>\n<td>35</td>\n</tr>\n<tr>\n<td>Gateway.com </td>\n<td>72</td>\n\n<td>71</td>\n<td>1.4%</td>\n<td>38</td>\n</tr>\n<tr>\n<td>Macys.com</td>\n<td>71</td>\n<td>N/A</td>\n<td>N/A</td>\n<td>29</td>\n\n</tr>\n<tr>\n<td>Overstock.com </td>\n<td>71</td>\n<td>71</td>\n<td>0.0%</td>\n<td>17</td>\n</tr>\n<tr>\n<td>PCConnection.com</td>\n<td>71</td>\n\n<td>N/A</td>\n<td>N/A</td>\n<td>N/A</td>\n</tr>\n<tr>\n<td>ToysRUs.com </td>\n<td>71</td>\n<td>69</td>\n<td>2.9%</td>\n<td>27</td>\n\n</tr>\n<tr>\n<td>CompUSA.com </td>\n<td>69</td>\n<td>67</td>\n<td>3.0%</td>\n<td>39</td>\n</tr>\n<tr>\n<td>Costco.com </td>\n<td>69</td>\n\n<td>69</td>\n<td>0.0%</td>\n<td>25</td>\n</tr>\n<tr>\n<td>CDW.com </td>\n<td>68</td>\n<td>69</td>\n<td>-1.4%</td>\n<td>N/A</td>\n\n</tr>\n<tr>\n<td colspan="5">Source: <a href="http://www.foreseeresults.com/Press_HolidayTop40_Dec06.html">Foresee Results</a></td>\n</tr>\n</tbody>\n</table>\n\n\n</html>
Each installation of ROVR is given a ''UniqueID'' the first time it is used. It is displayed in the ROVR window when you click on the logo and then "User Info".\n\nThe primary use of the UniqueID is to allow you to confirm that your purchases had the intended effect. Each session at any merchant is tagged with an identifier for which beneficiary to credit, and the UniqueID of the user. Since you are the only one who knows your UniqueID, this is only useful to you.
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\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n<div id='sidebar'>\n<div id='ml2' refresh='content' tiddler='merchantLogos'></div>\n<div id='bl2' refresh='content' tiddler='beneLogos'></div>\n</div>\n</div>\n
<<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 '></div>\n<div class='title' macro='view title'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n<!--}}}-->
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]]
!![[Beneficiaries]]\n<html><div id='blogos'>beneficiaries</div></html>
see UniqueID\n
<script>document.write(Beneficiaries[document.bene].displayname);</script>
The default beneficiary is ''<script>document.write(Beneficiaries[document.bene].displayname);</script>''.
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 dog and click the links inside.'' \n**Firefox only, or at least NOT Internet Explorer**\n\nHere's a little more detail on [[how it works]].\n\n \n<html><div id="bb-example" >\n\n<div id="bloobot"> <div id="bloobot-container">\n<div onmouseover="javascript:showDiv('bb-logo-open2'); hideDiv('bb-logo-closed2');" onmouseout="javascript:showDiv('bb-logo-closed2'); hideDiv('bb-logo-open2');">\n<div id="bb-logo-closed2" style="visibility: visible; display: block;" > <img src="images/rovr-ball-40.jpg" border=0></div>\n<div id="bb-logo-open2" style="display: none; visibility: hidden;" >\n<div id="bloobot-open-container" ><table border="0" cellspacing="0" cellpadding="0"><tr><td valign="top" align="top" style="padding: 0px;">\n<table border="0" cellspacing="0" cellpadding="0"><tr><td valign="top" align="top" style="padding: 0px;">\n<img src="images/rovr-trans-90b.png" border=0></td> \n<td >\n<p class="bloobot-text">Thanks for using <a href="http://www.rovr.org" target="_blank" class="bloobot-link"><strong>ROVR</strong></a>, currently fetching for </p>\n\n<div id="bloobot-select-bene2"><form id="bloobot-bene" method="get" action="javascript: alert('Your new ROVR beneficiary is ' + document.foo); ">\n<select name="beneficiary" onchange="document.foo = this.value; form.submit();">\n<option value="Worldchanging">Worldchanging</option>\n<option value="Alternet">Alternet</option>\n<option selected="selected" value="Witness">Witness</option>\n<option value="InTheseTimes">In These Times</option>\n<option value="GreenWorldCampaign">Green World Campaign</option>\n<option value="MotherJones">Mother Jones</option>\n\n<option value="PublicRadioExchange">Public Radio Exchange</option>\n<option value="OrganicConsumers">Organic Consumers Assn.</option>\n<option value=""></option>\n</select>\n</form></div>\n\n \n\n\n<div id="bb-normal" style="visibility: visible; display: block;">\n\n<div id="bloobot-select-bene2"></div>\n<p class="bloobot-text">Commissions on your purchases will go to them.</p><br><br>\n</td></tr></table></td></tr><tr><td>\n<!--\n<div class="bb-toggle-window">\n<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></div>\n<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>\n<div id="bloobot-user-info">user info</a></div>\n<div id="bloobot-register">Click <a href="http://venturecollective.org/bloobot/#%5B%5Bto%20register%5D%5D"><strong>here to register</strong></a> for additional Terrabot services, including getting credits for helping spread the word.\n<br>and please <strong>email bloobot-feedback @ mediaventure dot org</strong> with any comments.</div>\n</div></div> \n-->\n\n<div class="bb-toggle-window">\n<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>\n<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>\n<div id="bloobot-merchant-info">merchant info</div>\n<div id="bloobot-product-info">product info - currently available for Amazon only</div>\n</div></div> \n\n \n\n<div class="bb-toggle-window">\n<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>\n<div id="bb-disable-open" style="display: none; visibility: hidden;">\n<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>\n<div id="bloobot-housekeeping">\n<p class="bloobot-text"><strong>To disable ROVR, use your browser menu Tools-Exclusions</strong>, right-click over the ROVR extension, then click "Disable". You can re-enable it later by clicking "Enable".</p><br>\n<p class="bloobot-text"><strong>To uninstall it, click "Uninstall" instead. You will have to re-install it if you want to re-enable it, however.</strong></p>\n</div>\n</div></div> \n\n</div> \n</td></tr></table>\n<div style="text-align: center;"><a href="http://www.interraproject.org" target="_blank" style="border:0px"><img src="/images/interra-trans-70.png" border="0"></a></div>\n</div>\n</div>\n</div>\n</div>\n\n</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="/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="/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">ROVR</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="#UniqueID" target="_blank">unique ID</a></strong> is <strong>19</strong>. Get credit for promoting ROVR 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 ROVR services, including getting credits for helping spread the word.<br>and please <strong>email ROVR-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&SubscriptionId=0S2SJ5E66G1PJC6X8AG2&Operation=ItemLookup&IdType=ASIN&ItemId=B000BR4IP0&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 ROVR, 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>
asldkfj;asldjkf
ROVR is a ''browser extension (Firefox only right now)'' that automatically collects commissions on your online purchases through existing [[affiliate programs]] at [[many major retailers|Merchants]], and credits them to the beneficiary you currently have chosen. \n\nWhenever you surf to a merchant it knows about, a little ROVR logo [img[/images/rovr-ball-40.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\nROVR 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>
<<tiddler [[install ROVR]]>>
<script>if (!bene_in) { out = "Choose your initial beneficiary here. You can change it at any time.\sn\snChoose a ''category'': <<tiddler [[select group]]>>"; \nout += "and from that a ''default beneficiary'': <<tiddler [[select bene]]>>";\nreturn out; }\n\n</script>\n''ROVR is easy to install, and requires no registration. ''\n\nCurrently, it runs only on ''Firefox 1.5 and up''. The IE version will be coming soon.\n\n''Click the Adopt ROVR button'' below, and follow the instructions, then ''Restart Firefox''.\n\nFrom then on, ROVR will appear in the upper left whenever you visit one of the [[merchants|Merchants]] we support.\n\n''You may get a warning the first time you click'' the button, at the top of the browser. \n''Click ALLOW'' when prompted, then ''re-click the Adopt ROVR! button''.\n\n<script>\n\ndocument.write('<form method="get" action="http://www.rovr.org/v0/rovr.xpi">');\n\ndocument.write('<input type="button" onclick="return installRovr(\s'http://www.rovr.org/installer/rovr/INSTALL/rovr-'\n+ document.bene + '.xpi\s')" value="Adopt ROVR!" /> ');\n</script> <<tiddler [[display default beneficiary]]>>\n<script>\ndocument.write('<br>');\n\ndocument.write('</form>');\n\n</script>\n''Don't forget to restart your browser.''
\n\n\n<html>\n<form id="rovr-bene-form" onSubmit="var b = document.getElementById ('bene-chosen'); bene_chosen = b.value;\n var c = document.getElementById ('bene-group-chosen'); bene_group_chosen = c.value;\n alert( bene_chosen + ' ' + bene_group_chosen);\n story.refreshTiddler('show bene and group',null,true); story.refreshTiddler('installer maker',null,true);return false; ">\n<select id="bene-chosen" name="bene">\n<option value="alternet">Alternet</option>\n<option value="bgi">BGI</option>\n</select>\n<select id="bene-group-chosen" name="group">\n<option value="salmonnation">Salmon Nation</option>\n<option value="independentmedia">Indy Media</option>\n</select>\n<input type=submit value="submit">\n</form>\n</html>\n\n\n\n<<tiddler [[show bene and group]]>>\n
!![[Merchants]]\n<html><div id='mlogos' style='height: 85px;'>merchants</div></html>
<<tiddler [[select bene]]>>
ROVR
We, like most people, value privacy and security highly. \n\nROVR 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 ROVR button under your control.\n\nNor does ROVR communicate anything about your behavior to us or anyone. Communication with our server is minimal and almost entirely from us to you.\n\nThere are two infrequent times that your ROVR sends information to our server:\n# The first time you use it, it sends a notice to our server to assign you 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 allow you to track your own purchases. We have no idea what user any UniquID corresponds to.\n# Each time you initiate a session with a merchant that ROVR recognizes, it handshakes with our server to establish the commission relationship. \n\nEach session at any merchant is tagged with an identifier for which beneficiary to credit, and the UniqueID of the user. This allows you to confirm that your purchases had the intended effect. Since you are the only one who knows your UniqueID, this is only useful to you.\n\n\n
!!Help us beta test. [[Tell us|mailto:rovr-feedback@interraproject.org?subject="What I bought (or other feedback)"&body=Please let us know what you bought, where, and when, so we can test our tracking. Thanks]] what you bought, when, and where.\n\n[[Amazon|Amazon Sales Reports]] provides the best sales tracking, and highest volume of sales, by far. Powells is next best. \nWe will be improving our reporting for all other merchants as soon as possible.\n\nThe other merchants are served by affiliate aggregators such as ''Linkshare'', ''Commission Junction'', and ''Performics''. See the [[Merchant list|Merchants]] to see which aggregator a particular merchant is served by.\n\nROVR is aimed at increasing volume way beyond books, music, and DVDs. ''Note the serious commissions on electronics and lots of other products'' by clicking on the column headings in the Amazon report. \n\n''[[Amazon Sales Reports]]''\n\n''[[Powells Sales Reports]]''\n\n''[[Linkshare Sales Report]]'' \n\n''[[Commission Junction Sales Report]]''
[[Don't install just yet|http://www.mediaventure.org/rovr/v0/rovrInstall.html]]
<script>\nif (bene_in) out = "<html>" + Beneficiaries[bene_in.toLowerCase()].displayname + "</html>";\nelse {\nout="<html><form><select name='bene' onchange='document.bene=this.value;refresh_bene_tiddlers();return false;>";\n\nfor (var q in Beneficiaries) {\n var ben = Beneficiaries[q]; \n if (ben.nickname && ben.nickname != "undefined" ) {\n if (ben.nickname == document.bene || !GroupFilter || GroupFilter == "all" || ben.groups.indexOf\n(GroupFilter) >= 0) {\n out+='<option value="' + ben.nickname +'"';\n if (ben.nickname == document.bene) out += ' selected ';\n out += '">' + ben.displayname + "</option>";\n }\n }\n}\nout += "</select>";\n\n\nout += "</form></html>";\n\n}\nreturn out;\n</script>
<script>\nif (bene_in) out = "<html>" + Beneficiaries[bene_in.toLowerCase()].groups+ "</html>";\nelse {\n\nvar out = '<html><form><select onchange="javascript: GroupFilter=this.value;refresh_bene_tiddlers();">'; \n//var grups = "SalmonNation|IndependentMedia|Freecycle|Hillel|All";\nvar groops = Groups.split("|");\n\nfor (var i=0; i<groops.length; i++) {\n if (groops[i].replace(/ /g, "").length > 0) {\n out += '<option value="' + groops[i] + '" ' ;\n if (GroupFilter.toLowerCase() == groops[i].toLowerCase()) out += ' selected ' ;\n out += '>' + groops[i] + '</option>';\n }\n}\nout += "</select></form></html>";\n}\nreturn out;\n</script>
<script> document.write("Beneficiary is " + bene_chosen + " and group is " + bene_group_chosen);</script>
We're adding new merchants and beneficiaries all the time. As soon as a new merchant is added, ROVR will show up in the upper left when you visit them.\n\nHere's our up-to-date list of [[Merchants |http://www.rovr.org/books/interra-merchants.html]] and [[Beneficiaries |http://www.rovr.org/books/interra-beneficiaries.html]]
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\nROVR 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 ROVR 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 ROVR 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. ROVR 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\nROVR 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 ROVR-register at mediaventure.org. \n\nThanks\n
(This assumes you've already [[installed ROVR|install ROVR]]. 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 ROVR logo [img[/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 ROVR's commission revenues go to [[eco-social]] non-profits, 80% to the beneficiary chosen by you, the purchaser, and the remainder to the [[Interra Project]], to cover costs and fund other great stuff.\n\nHere's ourup-to-date list of [[Merchants|http://www.rovr.org/books/interra-merchants.html]] and [[Beneficiaries|http://www.rovr.org/books/interra-beneficiaries.html]]\n\nWe will be adding more over time.\n\nIf you would like to suggest a beneficiary, send email to ROVR at mediaventure dot org.